[ZFS] 自宅サーバーのRAID-Zのハードディスクリプレースのメモ

// どうでもいいけど自宅サーバーって響きが既に年季を感じる時代になってしまいました。

宅サバの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は全体的に安全に使えるように考慮されている感じがあって、安心感はある。