// どうでもいいけど自宅サーバーって響きが既に年季を感じる時代になってしまいました。
宅サバのZpool (ZFS) にあるHDDからずっと異音がしてるのでリプレースすることにした。 何度かやってるけど、そのたびに調べ直すことになって結構面倒なので、その時のメモを残す。
(以下はzpoolのPool1にある、DiskId11をDiskId22に交換する場合のコマンド例)
ディスク除去まで
今回は交換先ドライブがまだないので、まずディスクをoffline。
(既に手元にあって、マシンに接続されている場合はスキップしてbadblock後いきなりreplaceでok)
# zpool offline Pool1 DiskId11
状態確認
# zpool status
pool: Pool1
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scan: resilvered NNNK in N days NN:NN:NN with 0 errors on NN NN:NN:NN NNNN
config:
NAME STATE READ WRITE CKSUM
Pool1 DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
ata-XXXXXXXXXXX-XXXXXX_DiskIdAA ONLINE 0 0 0
ata-XXXXXXXXXXX-XXXXXX_DiskId11 OFFLINE 0 0 0
ata-XXXXXXXXXXX-XXXXXX_DiskIdCC ONLINE 0 0 0
ata-XXXXXXXXXXX-XXXXXX_DiskIdDD ONLINE 0 0 0
logs
nvme-XXXXXXXXXX-XXXXXX_XXXXXXXXXXXX-part5 ONLINE 0 0 0
cache
nvme-XXXXXXXXXX-XXXXXX_XXXXXXXXXXXX-part6 ONLINE 0 0 0
必要であればIDからデバイスファイル名を確認
# ls -lah /dev/disk/by-id/*DiskId11*
デバイスの停止
# echo 1 > /sys/block/sdX/device/delete
ディスク停止の確認
# dmesg
[日 5月 23 08:59:09 2021] sd X:X:0:0: [sdX] Synchronizing SCSI cache
[日 5月 23 08:59:09 2021] sd X:X:0:0: [sdX] Stopping disk
[日 5月 23 08:59:10 2021] ataX.XX: disabled
RMA
SeagateのディスクだったのでSeagateのサイトからRMA申請。(微妙に分かりづらい場所に申請フォームがあったりするのは嫌がらせだろうか)
「Seagate ST3000DM001 の RMA 制度でクロネコヤマトの「宅急便コンパクト」で送ってみた - What I Know ~ワッタイナ」あたりを参考にさせていただいて、ヤマトの宅配便コンパクトで送った。
ディスク追加
今回はマシンをoffにしてHDD追加作業したけど、onのまま刺したりしても認識されたと思う。(M/Bとかによるはず)
作業後マシン起動して、追加されたディスクの確認。
一応smartctlやhdparmなどでシリアル番号を見て、追加したディスクのラベルと一致するデバイスを探して確認。
# smartctl -a /dev/sdY
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.4.109-gentoo-x86_64] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family: Seagate IronWolf
Device Model: XXXXXXXXXXX-XXXXXX
Serial Number: DiskId22
...
念の為、パーティションテーブルが空っぽいことを確認 (ディスクによってはWindows用にフォーマット済みのpartが一つあったりするかも)
# gdisk -l /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
GPT fdisk (gdisk) version 1.0.6.1
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries in memory.
Disk /dev/disk/by-id/ata-XXXXXXXX-XXXXXX_DiskId22: NNNNNNNN sectors, N.N TiB
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is NNNNNNNN
Partitions will be aligned on 2048-sector boundaries
Total free space is NNNNNNNN sectors (N.N TiB)
Number Start (sector) End (sector) Size Code Name
ディスク検査
注意: 以下実行するとディスクにかかれていたデータは消えます
とりあえず毎回badblocksフルで実施している (時間かかるのでscreenやtmux上で)。 大容量ディスクの場合そのままやると以下のようなエラーが出る
# badblocks -wsv /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
badblocks: Value too large for defined data type invalid end block (NNNNNNNN): must be 32-bit value
なので、ブロックサイズを確認・指定して実行する。
ブロックサイズ確認
# blockdev --getbsz /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
4096
ブロックサイズ指定してbadblocks。
badblocks -wsv -b 4096 /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
(ここでかなり時間かかる。1TBごとに半日ぐらいかな)
Zpoolのディスクreplace
badblocks完了後、zpoolに追加するまえに一応再確認。
# gdisk -l /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
GPT fdisk (gdisk) version 1.0.6.1
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries in memory.
Disk /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22: NNNNNNNN sectors, N.N TiB
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 64A78E1B-26D3-4E32-940C-2693C69A9A10
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is NNNNNNNN
Partitions will be aligned on 2048-sector boundaries
Total free space is NNNNNNNN sectors (N.N TiB)
Number Start (sector) End (sector) Size Code Name
zpool replaceを実行してresilver開始。
# zpool replace Pool1 ata-XXXXXXXX-XXXXXXXX_DiskId11 /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
# zpool status Pool1
pool: Pool1
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since NN NN:NN:NN NNNN
NN.NG scanned at N.NNG/s, NNNM issued at NN.NM/s, N.NT total
0B resilvered, 0.00% done, N days NN:NN:NN to go
config:
NAME STATE READ WRITE CKSUM
Pool1 DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskIdAA ONLINE 0 0 0
replacing-1 DEGRADED 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskId11 OFFLINE 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskId22 ONLINE 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskIdCC ONLINE 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskIdDD ONLINE 0 0 0
logs
nvme-WDS100T2X0C-XXXXXXXX_XXXXXXXX-part5 ONLINE 0 0 0
cache
nvme-WDS100T2X0C-XXXXXXXX_XXXXXXXX-part6 ONLINE 0 0 0
errors: No known data errors
しばらくしてresilverが完了したことを確認してDone。
# zpool status Pool1
pool: Pool1
state: ONLINE
scan: resilvered N.NNT in N days NN:NN:NN with 0 errors on NN NN:NN:NN NNNN
config:
NAME STATE READ WRITE CKSUM
Pool1 ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskIdAA ONLINE 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskId22 ONLINE 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskIdCC ONLINE 0 0 0
ata-XXXXXXXXX-XXXXXXXX_DiskIdDD ONLINE 0 0 0
logs
nvme-WDS100T2X0C-XXXXXXXX_XXXXXXXX-part5 ONLINE 0 0 0
cache
nvme-WDS100T2X0C-XXXXXXXX_XXXXXXXX-part6 ONLINE 0 0 0
errors: No known data errors
昔にこういうのでデータ飛ばしたことは数え切れないほどあるので、この手の作業は毎回ヒヤヒヤする。
とはいえZFSは全体的に安全に使えるように考慮されている感じがあって、安心感はある。