能書き
私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。
前回Ubuntu24.04LTSをインストールしてZFSで使うように設定したのですが、そのHDDの内の1台がお亡くなりになってしまいました。というわけでHDDを交換します。今回はその作業の記録になります。
ぐぐってみると、LinuxでRAID-Z2のHDD交換記事はあまり見当たりませんな。皆さんFreeBSDのようで。
作業準備
電源を入れてimport
HDDの1台がお亡くなりになった事が分かった日に、念のため電源を切ってしまっていました。そのため電源を入れる所からの作業になります。
- 電源を入れる
- 普段使いのマシンから
ssh
接続
$ sudo zpool import
pool: tank
id: 2891006712653798077
state: ONLINE
status: Some supported features are not enabled on the pool.
(Note that they may be intentionally disabled if the
'compatibility' property is set.)
action: The pool can be imported using its name or numeric identifier, though
some features will not be available without an explicit 'zpool upgrade'.
config:
tank ONLINE
raidz2-0 ONLINE
sdb ONLINE
sdc ONLINE
sdd ONLINE
sda ONLINE
sde ONLINE
インポートします。マウント先は/mnt/tank
にします。
sudo zpool import -R /mnt -f tank
結果確認。
$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 2.26T 1.32T 960G - 8G 37% 58% 1.00x ONLINE /mnt
$ zpool status
pool: tank
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace'.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-9P
scan: resilvered 1.52M in 00:00:05 with 0 errors on Sat Nov 16 16:19:56 2024
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sda ONLINE 0 0 0
sde ONLINE 1 0 0
errors: No known data errors
バックアップ
バックアップ大事。超大事。
前回作業時にバックアップをとっていますが、念の為に、今回作業直前に取り直します。
まずは事前に、USB接続ストレージを確認。
$ ls -l /dev/disk/by-id | grep usb
lrwxrwxrwx 1 root root 9 Nov 16 16:13 usb-Verbatim_STORE_N_GO_0710584F1A3C7F51-0:0 -> ../../sdf
lrwxrwxrwx 1 root root 10 Nov 16 16:13 usb-Verbatim_STORE_N_GO_0710584F1A3C7F51-0:0-part1 -> ../../sdf1
lrwxrwxrwx 1 root root 10 Nov 16 16:13 usb-Verbatim_STORE_N_GO_0710584F1A3C7F51-0:0-part2 -> ../../sdf2
lrwxrwxrwx 1 root root 10 Nov 16 16:13 usb-Verbatim_STORE_N_GO_0710584F1A3C7F51-0:0-part3 -> ../../sdf3
これは起動用のUSBメモリ?ですね。
ここで外付け4TBのHDDをUSB接続して、再度確認します。
$ ls -l /dev/disk/by-id | grep usb
lrwxrwxrwx 1 root root 9 Nov 16 16:42 usb-Logitec_LGB_USB_Device_2B3100000000033E-0:0 -> ../../sdg
lrwxrwxrwx 1 root root 10 Nov 16 16:42 usb-Logitec_LGB_USB_Device_2B3100000000033E-0:0-part1 -> ../../sdg1
lrwxrwxrwx 1 root root 10 Nov 16 16:42 usb-Logitec_LGB_USB_Device_2B3100000000033E-0:0-part2 -> ../../sdg2
lrwxrwxrwx 1 root root 9 Nov 16 16:13 usb-Verbatim_STORE_N_GO_0710584F1A3C7F51-0:0 -> ../../sdf
lrwxrwxrwx 1 root root 10 Nov 16 16:13 usb-Verbatim_STORE_N_GO_0710584F1A3C7F51-0:0-part1 -> ../../sdf1
lrwxrwxrwx 1 root root 10 Nov 16 16:13 usb-Verbatim_STORE_N_GO_0710584F1A3C7F51-0:0-part2 -> ../../sdf2
lrwxrwxrwx 1 root root 10 Nov 16 16:13 usb-Verbatim_STORE_N_GO_0710584F1A3C7F51-0:0-part3 -> ../../sdf3
増えたのはsdg
のようですな。これをマウントします。まずはマウントポイントを作成。
$ sudo mkdir /mnt/backup
マウント。
$ sudo mount /dev/sdg /mnt/backup
mount: /mnt/backup: wrong fs type, bad option, bad superblock on /dev/sdg, missing codepage or helper program, or other error.
dmesg(1) may have more information after failed mount system call.
$ sudo mount /dev/sdg1 /mnt/backup
mount: /mnt/backup: wrong fs type, bad option, bad superblock on /dev/sdg1, missing codepage or helper program, or other error.
dmesg(1) may have more information after failed mount system call.
あれあれ…?
そうか、zfsフォーマットしたのかも知れません。
$ sudo zpool import
pool: extra1
id: 10279878555798217878
state: ONLINE
status: Some supported features are not enabled on the pool.
(Note that they may be intentionally disabled if the
'compatibility' property is set.)
action: The pool can be imported using its name or numeric identifier, though
some features will not be available without an explicit 'zpool upgrade'.
config:
extra1 ONLINE
sdg ONLINE
pool: tank
id: 18233389827505880159
state: DEGRADED
status: One or more devices contains corrupted data.
action: The pool can be imported despite missing or damaged devices. The
fault tolerance of the pool may be compromised if imported.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
config:
tank DEGRADED
mirror-0 DEGRADED
ata-Hitachi_HTS723232A7A364_E3834263EDYUAD UNAVAIL
zd0 ONLINE
pool: tank
が良く分かりませんが、とりあえず放置。pool: extra1
をimportします。
先に、さっき作ってしまったマウントポイントを削除しましょう。
sudo rmdir /mnt/backup
それからimport。
sudo zpool import -R /mnt extra1
確認。
$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
extra1 3.62T 1.83T 1.80T - - 27% 50% 1.00x ONLINE /mnt
tank 2.26T 1.32T 960G - 8G 37% 58% 1.00x ONLINE /mnt
前回のバックアップ場所は、多分、下記です。
$ ls -dl /mnt/extra1/bak_tank
drwxr-xr-x 6 root root 6 Jun 6 19:10 /mnt/extra1/bak_tank
空き容量は何とかなりそうなので、tank
の1.32TB(?)をextra1
にcp -R -p
します。
$ sudo cp -R -p /mnt/tank /mnt/extra1/bak_tank2 &
[1] 2883
$ ps -ax | grep tank
2883 pts/0 S 0:00 sudo cp -R -p /mnt/tank /mnt/extra1/bak_tank2
2884 pts/1 Ss+ 0:00 sudo cp -R -p /mnt/tank /mnt/extra1/bak_tank2
2885 pts/1 D 0:07 cp -R -p /mnt/tank /mnt/extra1/bak_tank2
2891 pts/0 S+ 0:00 grep --color=auto tank
後はcp
コマンドが完了するまで待ちます。外付けUSB接続ストレージが止まったのを見計らって確認。
$ ps -ax | grep tank
19681 pts/0 S+ 0:00 grep --color=auto tank
cp -R -p
プロセスが無くなったので、完了したようです。バックアップ完了を確認できたので、外付けUSB接続ストレージをexportします。
sudo zpool export extra1
一応確認。
$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 2.26T 1.32T 960G - 8G 37% 58% 1.00x DEGRADED /mnt
無事にexportできたようです。そうしたらバックアップ用の外付けUSB接続ストレージを物理的に取り外します。
交換用新ディスクの準備
交換用新ディスクを外付けUSB接続ストレージとして繋ぎます。そして確認。
$ ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Nov 19 15:31 /dev/sda
brw-rw---- 1 root disk 8, 1 Nov 19 15:31 /dev/sda1
brw-rw---- 1 root disk 8, 2 Nov 19 15:34 /dev/sda2
brw-rw---- 1 root disk 8, 16 Nov 19 15:31 /dev/sdb
brw-rw---- 1 root disk 8, 17 Nov 19 15:31 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Nov 19 15:34 /dev/sdb2
brw-rw---- 1 root disk 8, 32 Nov 19 15:31 /dev/sdc
brw-rw---- 1 root disk 8, 33 Nov 19 15:31 /dev/sdc1
brw-rw---- 1 root disk 8, 34 Nov 19 15:34 /dev/sdc2
brw-rw---- 1 root disk 8, 48 Nov 19 15:31 /dev/sdd
brw-rw---- 1 root disk 8, 49 Nov 19 15:31 /dev/sdd1
brw-rw---- 1 root disk 8, 50 Nov 19 15:34 /dev/sdd2
brw-rw---- 1 root disk 8, 64 Nov 19 15:31 /dev/sde
brw-rw---- 1 root disk 8, 65 Nov 19 15:31 /dev/sde1
brw-rw---- 1 root disk 8, 66 Nov 19 15:34 /dev/sde2
brw-rw---- 1 root disk 8, 80 Nov 19 15:31 /dev/sdf
brw-rw---- 1 root disk 8, 81 Nov 19 15:31 /dev/sdf1
brw-rw---- 1 root disk 8, 82 Nov 19 15:31 /dev/sdf2
brw-rw---- 1 root disk 8, 83 Nov 19 15:31 /dev/sdf3
brw-rw---- 1 root disk 8, 96 Nov 19 15:36 /dev/sdg
新ディスクは/dev/sdg
ですね。これをbadblocks
します。HDD上のデータが消えるので注意。時間も掛かります。
cd
sudo badblocks -w -o badblocks_sdg.txt /dev/sdg &
コマンドの終了は、例によってps
コマンドで確認します。
$ ps -ax | grep badblocks
1913 pts/0 S 0:00 sudo badblocks -w -o badblocks_sdg.txt /dev/sdg
1914 pts/1 Ss+ 0:00 sudo badblocks -w -o badblocks_sdg.txt /dev/sdg
1915 pts/1 D 0:02 badblocks -w -o badblocks_sdg.txt /dev/sdg
1917 pts/0 S+ 0:00 grep --color=auto badblocks
数日掛かって完了しました。
$ ps -ax | grep badblocks
20720 pts/0 S+ 0:00 grep --color=auto badblocks
バッドブロックの記録は無しです。新品のHDDなので明らかではあります。badblocks
コマンド、要らなかったかも。
$ ls -l badblocks_sdg.txt
-rw-r--r-- 1 root root 0 Nov 19 15:42 badblocks_sdg.txt
マウントしてないデバイスなので、このまま取り外します。大丈夫だよね…
HDD交換
状況確認
現状を確認します。
$ zpool status
pool: tank
state: ONLINE
status: Some supported and requested features are not enabled on the pool.
The pool can still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
the pool may no longer be accessible by software that does not support
the features. See zpool-features(7) for details.
scan: resilvered 1.26M in 00:00:05 with 0 errors on Tue Nov 19 15:34:13 2024
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sda ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
sde
が逝ってしまったはずなんですが、エラーが表示されません。念の為にscrubして確認します。
$ sudo zpool scrub tank
$ zpool status
pool: tank
state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
repaired.
scan: scrub repaired 4.86M in 01:54:45 with 0 errors on Sat Nov 23 17:49:39 2024
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sda ONLINE 0 0 0
sde FAULTED 121 0 0 too many errors
errors: No known data errors
間違いありませんね、sde
がお亡くなりです。上記で準備した1TBのHDDと交換します。
そうなんです、1TBです。コスパ(バイト単価)は2TBの方が上なのは承知してますが、小遣いの都合でして… 号泣。
因みにこのscrubは2時間近くで完了しました。
該当HDDをオフラインにする
前節でFAULTEDになっていたsde
をオフラインにします。が、うまくいきません。
$ sudo zpool offline tank sde
cannot offline sde: no such device in pool
デバイスのGUIDを指定する必要があるようです。
$ zpool status -g
pool: tank
state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
repaired.
scan: scrub repaired 4.86M in 01:54:45 with 0 errors on Sat Nov 23 17:49:39 2024
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
5887850977561855789 DEGRADED 0 0 0
15916779478375754287 ONLINE 0 0 0
1891343347815713878 ONLINE 0 0 0
17447701145463039710 ONLINE 0 0 0
17420523610300470783 ONLINE 0 0 0
4054386367982837609 FAULTED 121 0 0 too many errors
errors: No known data errors
$ sudo zpool offline tank 4054386367982837609
確認。
$ zpool status
pool: tank
state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
repaired.
scan: scrub repaired 4.86M in 01:54:45 with 0 errors on Sat Nov 23 17:49:39 2024
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sda ONLINE 0 0 0
sde FAULTED 121 0 0 too many errors
errors: No known data errors
あれ、FAULTEDのままですね。良いのかな…いいや、放置して次の作業へ進みましょう。
該当HDDの特定
1台づつ抜いて状況確認して当たりを探す、のが通常手順でしょうか。調べたらhdparm
というコマンドを発見しました。型番やシリアルナンバーなども表示されるようです。
$ sudo hdparm -i /dev/sde
/dev/sde:
Model=Hitachi HDS721010CLA332, FwRev=JP4OA3MA, SerialNo=JP9960HZ1Y9RGU
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=56
BuffType=DualPortCache, BuffSize=29999kB, MaxMultSect=16, MultSect=off
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=1953525168
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
AdvancedPM=yes: disabled (255) WriteCache=disabled
Drive conforms to: unknown: ATA/ATAPI-2,3,4,5,6,7
* signifies the current active mode
HDD交換
型番とシリアルナンバーをメモして電源を落とします。
sudo shutdown -h now
電源が切れたら、1台づつHDDを抜いて型番とシリアルナンバーを確認します。型番は一致するデバイスがあったのですが、S/Nは一致しなかったですね… 正確には、hdparm
コマンドで表示されたSerialNoの後半だけが、HDDに貼付されているシールに印刷されていました(S/N:HZ1Y9RGU)
ついでにマシンの中を掃除。
該当のHDDを抜いて、ここで一旦電源を入れて様子を見てみます。
$ sudo zpool import
pool: tank
id: 2891006712653798077
state: DEGRADED
status: One or more devices are offlined.
action: The pool can be imported despite missing or damaged devices. The
fault tolerance of the pool may be compromised if imported.
config:
tank DEGRADED
raidz2-0 DEGRADED
sdb ONLINE
sdc ONLINE
sdd ONLINE
sda ONLINE
sde OFFLINE
お、sde
ドライブがOFFLINEになりました!そうです、これを確認したかったんです。確認できて満足したので、もう一度シャットダウン。
sudo shutdown -h now
新しいHDDを入れて電源を入れます。そしてzpool import
コマンドで状況を確認。
$ sudo zpool import
pool: tank
id: 2891006712653798077
state: DEGRADED
status: One or more devices are offlined.
action: The pool can be imported despite missing or damaged devices. The
fault tolerance of the pool may be compromised if imported.
config:
tank DEGRADED
raidz2-0 DEGRADED
sdb ONLINE
sdc ONLINE
sdd ONLINE
sda ONLINE
sde OFFLINE
新しいデバイスを入れてもsde
はOFFLINEのままですな。
まずはzpool import tank
します。
$ sudo zpool import -R /mnt -f tank
$ sudo zpool import
pool: tank
id: 18233389827505880159
state: DEGRADED
status: One or more devices contains corrupted data.
action: The pool can be imported despite missing or damaged devices. The
fault tolerance of the pool may be compromised if imported.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
config:
tank DEGRADED
mirror-0 DEGRADED
ata-Hitachi_HTS723232A7A364_E3834263EDYUAD UNAVAIL
zd0 ONLINE
$ zpool status
pool: tank
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: scrub repaired 4.86M in 01:54:45 with 0 errors on Sat Nov 23 17:49:39 2024
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sda ONLINE 0 0 0
sde OFFLINE 0 0 0
errors: No known data errors
デバイスの置換の為にzpool replace
コマンドを実行…の前に、念のため、/dev/sde
が新しいデバイスである事を確認してみましょう。
$ sudo hdparm -i /dev/sde
/dev/sde:
Model=ST1000VN008-3CW10C, FwRev=SC60, SerialNo=WWD1E4QZ
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=1953525168
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
AdvancedPM=no WriteCache=disabled
Drive conforms to: unknown: ATA/ATAPI-5,6,7
* signifies the current active mode
今度はModel、SerialNoともに、HDD(に貼付のシール)に印刷してあるものと一致しました。
ではお待ちかねのzpool replace
を。
$ zpool status -g
pool: tank
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: scrub repaired 4.86M in 01:54:45 with 0 errors on Sat Nov 23 17:49:39 2024
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
5887850977561855789 DEGRADED 0 0 0
15916779478375754287 ONLINE 0 0 0
1891343347815713878 ONLINE 0 0 0
17447701145463039710 ONLINE 0 0 0
17420523610300470783 ONLINE 0 0 0
4054386367982837609 OFFLINE 0 0 0
errors: No known data errors
$ sudo zpool replace tank 4054386367982837609 /dev/sde
さて確認。
$ zpool status
pool: tank
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 Sun Nov 24 16:44:56 2024
387G / 1.32T scanned at 1.83G/s, 1.23G / 1.32T issued at 5.98M/s
235M resilvered, 0.09% done, no estimated completion time
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sda ONLINE 0 0 0
replacing-4 DEGRADED 0 0 0
sde OFFLINE 0 0 0
sde ONLINE 0 0 0 (resilvering)
errors: No known data errors
おお、順調にresilverしています。そしておよそ数時間で終了しました。
$ zpool status
pool: tank
state: ONLINE
status: Some supported and requested features are not enabled on the pool.
The pool can still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
the pool may no longer be accessible by software that does not support
the features. See zpool-features(7) for details.
scan: resilvered 267G in 08:26:09 with 0 errors on Mon Nov 25 01:11:05 2024
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sda ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
これにてHDD交換完了です!
仕舞い
Ubuntu 24.04 LTS 上の zfs RAID-Z2 を構成するHDDを1台、実際に交換しました。その手順は以上になります。