中古で購入した HP Z840 Workstation を組み立てていきます。
調達編でも記載しましたが、この PC は CPU やメモリが抜かれているので、中古で部品を集めて組み立てていきます。
「テック」カテゴリーアーカイブ
HP Z840 Workstation を「組み立てる」- (1) 調達編
諸般の事情で、2 CPU、メモリマシマシの PC (というよりサーバー) が必要になったため、準備することにしました。
ただし、新品でマザーボードを準備したり、中古のマシンをそのまま使用するわけではなく、コストを抑えるために部品が抜かれたマシンをベースにつぎはぎして作っていきます。
ベースに選んだのは HP Z840 Workstation です。理由はシンプルで、2 CPU 搭載できること、メモリ単価の安い DDR4 メモリが使用できること。
ヤフオクや eBay 等で部品を集めましたが、その価格を紹介します。$1 = 114円換算です。
物品 | 価格 | 入手元 | 備考 |
---|---|---|---|
HP Z840 本体のみ | 45,000円 | ヤフオク | ケース、電源、マザーボードのみ |
Intel Xeon E5-2670V3 (2つ) | 11,581円 | AliExpress | |
DDR4 32GB PC4-17000(8枚) 中古 | 84,360円 ($740.28) | ebay | 本体だけなら $639.92 (1枚$80) 送料と通関で約$100 |
HP 2.5 to 3.5 SSD Hard Drive Tray (668261-001) 4 つ | 9,060円 ($79.52) | ebay | 2.5インチ SAS HDD 用 |
HP Z Turbo G2 PCIe Adapter Kit w Heatsink (822947-002) | 7,000円 ($61.31) | ebay | 本体価格 $35.00 M.2 SSDをブートドライブにするためのボード |
Lenovo Nvidia Quadro NVS 510 2GB GDDR3 PCI-e x16 Graphics Card (00FC861) | 6,900円 ($60.49) | ebay | 本体価格 $39.99 |
ainex JP-DX1 [ナノダイヤモンドグリス 3g] | 1,320円 | ヨドバシカメラ | |
ainex ACP-HC18A [15A対応AC電源ケーブル 1.8m] | 1,680円 | ヨドバシカメラ | 電源が 1100W なので 15A 対応 |
HDD はありませんが、一般家庭に転がっている SAS 2.5インチ 1TB×4 や M.2 SSD を流用します。
合計17万円程度で、2 CPU (12c24t ×2)、RAM 256GB のワークステーション、サーバーが準備できました。
ただし、物は中古品なので、掃除や検品の上で組み立てが必要です。
> 組み立て編へ続く
Linux software RAIDを拡張する
Linuxでファイルサーバ、またはストレージを構築している場合、software RAIDを使用している人も多いと思われますが、
「mdadmを使用して、1TB HDD×4台のRAID5を3TB HDD×4台に移行したい」という場合、データロストなしでどうやるのかを検証した。
前提
検証作業は、VMware ESXi 5.5上の仮想マシンで実施。
Debian 9.0(stretch)
$ sudo mdadm --version mdadm - v3.4 - 28th January 2016
16GBの仮想ディスク4台を32GB 4台の構成へ移行するシナリオで実施する。
なお、RAID上にはデータのみであり、OSが入ったディスクは別途存在するものとする。
準備
検証環境の準備作業として、仮想マシン用に16GBのディスクを4台準備し、RAID 5を構成する。
実機であれば、SATAポート数の制約などで拡張時に入れ替えを実施すると思われるが、仮想マシンのためポートはたくさんある。
そこで、最初から16GBと32GBのディスク 4台ずつ、合計8台分を準備、接続しておく。
デバイスの割当ては下記の様になる。
16GB: sdb-sde
32GB: sdf-sdi
まず、ESXi上でvmdkを作成する。
# vmkfstools -d thin -c 16G ./disk-1a.vmdk # vmkfstools -d thin -c 16G ./disk-2a.vmdk # vmkfstools -d thin -c 16G ./disk-3a.vmdk # vmkfstools -d thin -c 16G ./disk-4a.vmdk # vmkfstools -d thin -c 32G ./disk-1b.vmdk # vmkfstools -d thin -c 32G ./disk-2b.vmdk # vmkfstools -d thin -c 32G ./disk-3b.vmdk # vmkfstools -d thin -c 32G ./disk-4b.vmdk
vmxファイルを編集して、ディスクを割り当てる。
vmxファイルをリロードさせるために、getallvmsでVMの番号を取得する。
取得した番号をreloadで指定すると、vi等で書き換えた内容が反映される(ここは20番だった)。
vim-cmd vmsvc/getallvms vim-cmd vmsvc/reload 20
続いて、Linux上でRAIDを作成する。
めんどくさがりなので、下記の様にデバイス名を変数化してpartedで各ディスクを初期化する。
DEV=/dev/sdb sudo parted -s -a optimal ${DEV} mklabel gpt sudo parted -s -a optimal ${DEV} mkpart primary ext2 0% 100% sudo parted -s -a optimal ${DEV} set 1 raid on sudo parted -s -a optimal ${DEV} print
結果、各ドライブにLinux RAID用のパーティションが1つづつ作成される。
$ sudo parted -s -a optimal ${DEV} print Model: VMware Virtual disk (scsi) Disk /dev/sdb: 17.2GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 17.2GB 17.2GB primary raid $
次に、mdadmコマンドでRAID 5を作成し、ext4で初期化する。
sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=4 /dev/sd[b-e]1 sudo sh -c "mdadm -Ds >> /etc/mdadm/mdadm.conf" sudo mkfs.ext4 /dev/md0
同期完了まで待つ
$ cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid5 sde1[4] sdd1[2] sdc1[1] sdb1[0] 50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_] [>....................] recovery = 3.6% (619004/16766976) finish=93.8min speed=2867K/sec unused devices: <none> $
↓
$ cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid5 sde1[4] sdd1[2] sdc1[1] sdb1[0] 50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] unused devices: <none> $
これで検証準備が整った。
RAIDの拡張
いよいよディスクを入れ替えて、RAIDを拡張していく。
ディスクの入れ替え
RAID5のディスクを1台ずつ、別のディスクに入れ替えていく
最初にMDから1台のディスクを切り離す
まず、取り外し対象となるディスクの確認をする。物理ディスクの場合シリアル番号などを確認の上で、物理的な取り外し対象を確認すること。
sudo smartctl -a /dev/sdb
つづいて、RAID上から入れ替えの対象デバイスに故障フラグを立てて、取り外すする。
sudo mdadm /dev/md0 --fail /dev/sdb1 sudo mdadm /dev/md0 --remove /dev/sdb1
続いて、新しいディスクをRAIDに組み込む。実機であれば、ここで停止→ディスク入れ替え→ディスク初期化が行われているはずである。
sudo mdadm --add /dev/md0 /dev/sdb1
ディスクをADDするとすぐに同期が開始される
$ cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] md0 : active raid5 sdf1[5] sde1[4] sdd1[2] sdc1[1] 50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU] [>....................] recovery = 0.1% (30204/16766976) finish=46.1min speed=6040K/sec unused devices: <none> $
あとは、新しいディスクでの同期完了まで待ち。
新しいディスクでの同期が完了したら、別のディスクを入れ替えて繰り返す。
mdデバイスの拡張
一通りディスクを入れ替えたら、いよいよMDデバイス自体を拡張する。
拡張前のArray Sizeは17GBx(4-1)の51GB
Used Dev SizeはRAID5の場合、パリティ+ユーザーデータのため1パーティション分の約17GB程度が使用されている
shogo@debian:~$ sudo mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Fri Mar 9 22:41:54 2018 Raid Level : raid5 Array Size : 50300928 (47.97 GiB 51.51 GB) Used Dev Size : 16766976 (15.99 GiB 17.17 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Sat Mar 10 07:51:59 2018 State : clean, degraded, recovering Active Devices : 3 Working Devices : 4 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Rebuild Status : 2% complete Name : debian:0 (local to host debian) UUID : 0a0f4244:db70abac:863ee0fe:41be0dd8 Events : 26 Number Major Minor RaidDevice State 5 8 81 0 spare rebuilding /dev/sdf1 1 8 33 1 active sync /dev/sdc1 2 8 49 2 active sync /dev/sdd1 4 8 65 3 active sync /dev/sde1 shogo@debian:~$
mdデバイスを拡張
sudo mdadm --grow /dev/md0 --bitmap none sudo mdadm --grow /dev/md0 --size=max
shogo@debian:~$ sudo mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Fri Mar 9 22:41:54 2018 Raid Level : raid5 Array Size : 100632576 (95.97 GiB 103.05 GB) Used Dev Size : 33544192 (31.99 GiB 34.35 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Sat Mar 10 21:09:10 2018 State : clean, resyncing Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 512K Resync Status : 54% complete Name : debian:0 (local to host debian) UUID : 0a0f4244:db70abac:863ee0fe:41be0dd8 Events : 110 Number Major Minor RaidDevice State 5 8 81 0 active sync /dev/sdf1 6 8 97 1 active sync /dev/sdg1 8 8 129 2 active sync /dev/sdi1 7 8 113 3 active sync /dev/sdh1 shogo@debian:~$ 同期(拡張の反映?)が実行される shogo@debian:~$ cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] md0 : active raid5 sdi1[8] sdh1[7] sdg1[6] sdf1[5] 100632576 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] [=================>...] resync = 89.9% (30186296/33544192) finish=0.2min speed=199303K/sec unused devices: shogo@debian:~$
以上でMDデバイスの拡張が完了した。
md上のパーティション、ファイルシステムの拡張
最後に、MDデバイス上のパーティションやファイルシステムを拡張する。
一般的なファイルシステム拡張と同様に実施すれば良い。
まず、mdデバイスをアンマウントして、ファイルシステムチェックを実行
sudo fsck -f /dev/md0
パーティション拡張前
shogo@debian:~$ sudo parted -s /dev/md0 print Model: Linux Software RAID Array (md) Disk /dev/md0: 51.5GB Sector size (logical/physical): 512B/512B Partition Table: loop Disk Flags: Number Start End Size File system Flags 1 0.00B 51.5GB 51.5GB ext4 shogo@debian:~$
パーティション拡張(resize2fs)後
shogo@debian:~$ sudo parted -s /dev/md0 print Model: Linux Software RAID Array (md) Disk /dev/md0: 103GB Sector size (logical/physical): 512B/512B Partition Table: loop Disk Flags: Number Start End Size File system Flags 1 0.00B 103GB 103GB ext4 shogo@debian:~$
以上の操作で、Linux Software RAIDは拡張が可能になっている。
SeleniumによるEvernoteの自動クリップ
インフラエンジニアなのでSeleniumなどのフロントエンド系は触ることはないのですが、「連載記事をまとめてEvernoteのWebクリッパーでクリップしたい」と考えて自動化する手段を調べた結果、Seleniumによるバッチ処理という答えにたどり着きました。
やっていることはシンプルで、SeleniumからGeckoドライバーでFirefoxを起動したあと、URLを開く、ショートカットキーを押下する、次のURLを開く…を続けるだけ。
PythonでSeleniumやGeckoドライバの配置についてはググっていただき、「listをfor文で回すな」等のツッコミはご容赦下さい…
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def loader_url(filepath):
urllist = list()
with open(filepath, "r") as f:
line = f.readline()
while line:
line_trim = line.strip()
# 空行はスキップする
if len(line_trim) == 0:
line = f.readline()
continue
# 処理の開始
urllist.append(line_trim)
line = f.readline()
return urllist
def evernote_webclip(url, driver=None):
# キー操作
WEBCLIPPER_KICK = "`"
WEBCLIPPER_SIMPLE = "C"
# 待ち時間
LOAD_PAGE = 5 # ページ読取り待ち
SEND_WEBCLIP = 5 # Webクリップ起動まで
LOAD_NEXT_PAGE = 10 # 簡易版の次のページ読み込みを待つ
STORE_WAIT = 10 # ページ保存
if driver == None:
driver = webdriver.Firefox()
driver.get(url)
# 読取り待ち
time.sleep(LOAD_PAGE)
element = driver.find_element_by_tag_name("html")
# Webクリッパーを起動
element.send_keys(WEBCLIPPER_KICK);
# Webクリッパーの起動待ち
time.sleep(SEND_WEBCLIP)
# 簡易版記事の保存
element.send_keys(WEBCLIPPER_SIMPLE);
time.sleep(LOAD_NEXT_PAGE)
element.send_keys(Keys.ENTER);
# Webクリッパーの起動待ち
time.sleep(STORE_WAIT)
if __name__ == '__main__':
firefox_profile = r'C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\123abcde.default'
url_file = r'C:\Users\user\Documents\selenium_urls.txt'
url_list = loader_url(url_file)
driver = webdriver.Firefox(firefox_profile)
for url in url_list:
evernote_webclip(url, driver=driver)
変数定義などが多いため、実際の処理部分はそんなに多くありませんので詳細はコードを見ていただきたいですが、下記の様な実装になっています。
- loader_url()関数は、渡されたテキストファイルに書かれている1行ごとのURLをリストに格納します
- evernote_webclip()関数は、URLとドライバーを元にEvernote WebClipを使って保存します
- Selenium内でショートカットキーを発行するには、何か要素をつかむ必要があるようなので、適当にhtmlタグをつかませています
- evernote_webclip()関数内で発行しているWebCliperのショートカットキーは「`」でWebCliper起動、「C」で簡易版の記事の保存です