能書き
おうちサーバー構築報告:予告の流れとは違う、我が家のラズパイNASです。
以前ちょっと触れた通り、2TBのHDDを5台いただきました。現状のHDDは500GBなので、これを戴き物に置き換えます。ZFSのデバイス交換の機能を使います。5台全部となると時間と手間が掛かりますが。
これをやりたいが為に前回バックアップを取ったとも言えますな。
目標
- デバイスすべてを2TBの3.5インチHDDに置き換える
- ZFSのデバイス交換の機能を利用し、1台ずつ5回置き換える
参考文献
- 私的サーバー構築日誌:ZFS HDD交換・Ubuntu 24.04 LTS in MicroServer N54L - Qiita
- ZFS活用シリーズ - scrubで直らない問題の修正(zdb - 修復編) - gihyo.jp
交換用デバイスの準備
まずは現状のデバイスを確認します。
lsblk
こんな表示になりました。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 44.3M 1 loop /snap/snapd/24724
loop1 7:1 0 44.2M 1 loop /snap/snapd/25205
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 2G 0 part
└─sda2 8:2 0 463.8G 0 part
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 931.5G 0 part
└─sdb9 8:25 0 8M 0 part
sdc 8:32 0 465.8G 0 disk
├─sdc1 8:33 0 2G 0 part
└─sdc2 8:34 0 463.8G 0 part
sdd 8:48 0 465.8G 0 disk
├─sdd1 8:49 0 2G 0 part
└─sdd2 8:50 0 463.8G 0 part
sde 8:64 0 465.8G 0 disk
├─sde1 8:65 0 2G 0 part
└─sde2 8:66 0 463.8G 0 part
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 28.4G 0 part /
zd0 230:0 0 2T 0 disk
├─zd0p1 230:1 0 2T 0 part
└─zd0p9 230:9 0 8M 0 part
sda~sdeの5台は、現在の外付けUSBデバイスですね。zfsを構成しているストレージデバイスです。
mmcblk0はラズパイの起動用SDカードです。
zd0はZFSの事らしいです。
現状を確認出来たら交換用デバイスを物理的に接続し、それからlsblkを再確認します。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 44.3M 1 loop /snap/snapd/24724
loop1 7:1 0 44.2M 1 loop /snap/snapd/25205
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 2G 0 part
└─sda2 8:2 0 463.8G 0 part
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 931.5G 0 part
└─sdb9 8:25 0 8M 0 part
sdc 8:32 0 465.8G 0 disk
├─sdc1 8:33 0 2G 0 part
└─sdc2 8:34 0 463.8G 0 part
sdd 8:48 0 465.8G 0 disk
├─sdd1 8:49 0 2G 0 part
└─sdd2 8:50 0 463.8G 0 part
sde 8:64 0 465.8G 0 disk
├─sde1 8:65 0 2G 0 part
└─sde2 8:66 0 463.8G 0 part
sdf 8:80 0 1.8T 0 disk
└─sdf1 8:81 0 1.8T 0 part
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 28.4G 0 part /
zd0 230:0 0 2T 0 disk
├─zd0p1 230:1 0 2T 0 part
└─zd0p9 230:9 0 8M 0 part
増えたのはsdfですね、これが新しい交換用デバイスでしょう。
これをbadblocksします。badblocksするとHDD上のデータが全部消えるので注意。時間も掛かります。
cd
sudo badblocks -w -o badblocks_sdf.txt /dev/sdf &
コマンドの終了は、交換用デバイスのアクセスランプが落ち着いたのを見計らって、psコマンドで確認します。
ps -ax | grep badblocks
badblocksが動いていると、こんな感じの出力になります。
$ ps -ax | grep badblocks
2529 pts/0 S 0:00 sudo badblocks -w -o badblocks_sdf.txt /dev/sdf
2530 pts/1 Ss+ 0:00 sudo badblocks -w -o badblocks_sdf.txt /dev/sdf
2531 pts/1 D 0:00 badblocks -w -o badblocks_sdf.txt /dev/sdf
2533 pts/0 S+ 0:00 grep --color=auto badblocks
badblocksが完了して止まったら、出力されるのはgrepコマンドだけになります。
$ ps -ax | grep badblocks
32479 pts/0 S+ 0:00 grep --color=auto badblocks
時間的にはおおよそ3日半くらいでしたでしょうか。
完了したら、ホームディレクトリに作成されているbadblocks_sdf.txtを確認しましょう。
cd
ls -l badblocks_sdf.txt
ファイルサイズは0バイト。つまり不良セクタが発生していない事になります。綺麗なもんですな。
$ cd
$ ls -l badblocks_sdf.txt
-rw-r--r-- 1 root root 0 Sep 25 15:07 badblocks_sdf.txt
念の為シャットダウンしてから、デバイスを外します。
sudo shutdown -h now
交換用デバイスを外したらまた電源を入れます。
HDD交換
対象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: scrub repaired 0B in 98 days 23:10:49 with 0 errors on Sun Jun 15 23:35:42 2025
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4 ONLINE 0 0 0
usb-WDC_WD50_00AACS-00ZUB0_DD20250313009D-0:3 ONLINE 0 0 0
usb-Hitachi_HDT725050VLA360_DD20250313009D-0:2 ONLINE 0 0 0
usb-Hitachi_HDT725050VLA360_DD20250313009D-0:0 ONLINE 0 0 0
ata-ST1000VN008-3CW10C_WWD1E4QZ ONLINE 0 0 0
errors: No known data errors
どうやら/dev/by-idで見られる名前を出力しているようです。
$ cd /dev/disk/by-id
$ ls -l usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4 usb-WDC_WD50_00AACS-00ZUB0_DD20250313009D-0:3 usb-Hitachi_HDT725050VLA360_DD20250313009D-0:2 usb-Hitachi_HDT725050VLA360_DD20250313009D-0:0 ata-ST1000VN008-3CW10C_WWD1E4QZ
lrwxrwxrwx 1 root root 9 Sep 30 13:47 ata-ST1000VN008-3CW10C_WWD1E4QZ -> ../../sdb
lrwxrwxrwx 1 root root 9 Sep 30 13:47 usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4 -> ../../sde
lrwxrwxrwx 1 root root 9 Sep 30 13:47 usb-Hitachi_HDT725050VLA360_DD20250313009D-0:0 -> ../../sda
lrwxrwxrwx 1 root root 9 Sep 30 13:47 usb-Hitachi_HDT725050VLA360_DD20250313009D-0:2 -> ../../sdc
lrwxrwxrwx 1 root root 9 Sep 30 13:47 usb-WDC_WD50_00AACS-00ZUB0_DD20250313009D-0:3 -> ../../sdd
どれから交換してもいいんですが、zpool status表示の上から順にやっていきますか。
まずはusb-Hitachi_HDP725050GLA360_DD20250313009D-0:4です。
対象HDDを特定
hdparm -Iコマンドでモデルとシリアル番号を確認し、メモしておきます。
以前はhdparmに-iオプションを付けたのですが、SATAだと-Iオプションを付けないといけないらしいですな。Copilotありがとう。
$ sudo hdparm -I /dev/disk/by-id/usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4 | head
SG_IO: bad/missing sense data, sb[]: 70 00 0b 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
/dev/disk/by-id/usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4:
ATA device, with non-removable media
Model Number: Hitachi HDP725050GLA360
Serial Number: GEC534RF2GGNEE
Firmware Revision: 0969
Standards:
Supported: 7 6 5 4
Likely used: 7
対象HDDをオフラインにする
対象HDDをオフラインにします。
$ sudo zpool offline tank usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4
cannot offline usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4: no such device in pool
$ sudo zpool offline tank /dev/disk/by-id/usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4
cannot offline /dev/disk/by-id/usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4: no such device in pool
そういえばGUIDを指定しないといけないのでした。
$ sudo zpool status -g
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: scrub repaired 0B in 98 days 23:10:49 with 0 errors on Sun Jun 15 23:35:42 2025
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
5887850977561855789 ONLINE 0 0 0
15916779478375754287 ONLINE 0 0 0
1891343347815713878 ONLINE 0 0 0
17447701145463039710 ONLINE 0 0 0
17420523610300470783 ONLINE 0 0 0
7633794097079579966 ONLINE 0 0 0
errors: No known data errors
しまった。どれがどれやらわからんちん。Copilotによるとzdbというコマンドで対応がわかるらしいですが、これはかなり危険なコマンドのようですな。
$ zdb
tank:
version: 5000
name: 'tank'
state: 0
txg: 39718843
pool_guid: 2891006712653798077
errata: 0
hostid: 1895377482
hostname: '~~~'
com.delphix:has_per_vdev_zaps
vdev_children: 1
vdev_tree:
type: 'root'
id: 0
guid: 2891006712653798077
create_txg: 4
children[0]:
type: 'raidz'
id: 0
guid: 5887850977561855789
nparity: 2
metaslab_array: 35
metaslab_shift: 33
ashift: 12
asize: 2489776865280
is_log: 0
create_txg: 4
com.delphix:vdev_zap_top: 504
children[0]:
type: 'disk'
id: 0
guid: 15916779478375754287
path: '/dev/disk/by-id/usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4-part2'
whole_disk: 1
DTL: 559
create_txg: 4
com.delphix:vdev_zap_leaf: 505
children[1]:
type: 'disk'
id: 1
guid: 1891343347815713878
path: '/dev/disk/by-id/usb-WDC_WD50_00AACS-00ZUB0_DD20250313009D-0:3-part2'
whole_disk: 1
DTL: 558
create_txg: 4
com.delphix:vdev_zap_leaf: 506
children[2]:
type: 'disk'
id: 2
guid: 17447701145463039710
path: '/dev/disk/by-id/usb-Hitachi_HDT725050VLA360_DD20250313009D-0:2-part2'
whole_disk: 1
DTL: 557
create_txg: 4
com.delphix:vdev_zap_leaf: 507
children[3]:
type: 'disk'
id: 3
guid: 17420523610300470783
path: '/dev/disk/by-id/usb-Hitachi_HDT725050VLA360_DD20250313009D-0:0-part2'
whole_disk: 1
DTL: 556
create_txg: 4
com.delphix:vdev_zap_leaf: 508
children[4]:
type: 'disk'
id: 4
guid: 7633794097079579966
path: '/dev/disk/by-id/ata-ST1000VN008-3CW10C_WWD1E4QZ-part1'
devid: 'ata-ST1000VN008-3CW10C_WWD1E4QZ-part1'
phys_path: 'pci-0000:00:11.0-ata-4.0'
whole_disk: 1
DTL: 446
create_txg: 4
com.delphix:vdev_zap_leaf: 445
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
これによるとusb-Hitachi_HDP725050GLA360_DD20250313009D-0:4のGUIDは15916779478375754287のようです。
これをオフラインにします。
sudo zpool offline tank 15916779478375754287
うむ、usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4がオフラインになりました。
$ 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 0B in 98 days 23:10:49 with 0 errors on Sun Jun 15 23:35:42 2025
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4 OFFLINE 0 0 0
usb-WDC_WD50_00AACS-00ZUB0_DD20250313009D-0:3 ONLINE 0 0 0
usb-Hitachi_HDT725050VLA360_DD20250313009D-0:2 ONLINE 0 0 0
usb-Hitachi_HDT725050VLA360_DD20250313009D-0:0 ONLINE 0 0 0
ata-ST1000VN008-3CW10C_WWD1E4QZ ONLINE 0 0 0
errors: No known data errors
HDD交換
交換用HDDの準備が出来ました。
対象HDDをオフラインにしました。
対象HDDのモデルやシリアル番号を取得しました。
これからラズパイNASをシャットダウンして、物理的にHDDを交換します。
sudo shutdown -h now
探してみると型番は一致するデバイスがあったのですが、S/Nは一致しなかったですね。正確には、hdparmコマンドで表示されたシリアル番号の後半だけが、HDDに貼付されているシールに印刷されていました(S/N:RF2GGNEE) これ、日立の特徴なんでしょうか。謎。
ともあれ、新しいHDDと交換して電源を入れます。
まず、新しいHDDを特定します。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 44.3M 1 loop /snap/snapd/24724
loop1 7:1 0 44.2M 1 loop /snap/snapd/25205
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 2G 0 part
└─sda2 8:2 0 463.8G 0 part
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 931.5G 0 part
└─sdb9 8:25 0 8M 0 part
sdc 8:32 0 465.8G 0 disk
├─sdc1 8:33 0 2G 0 part
└─sdc2 8:34 0 463.8G 0 part
sdd 8:48 0 465.8G 0 disk
├─sdd1 8:49 0 2G 0 part
└─sdd2 8:50 0 463.8G 0 part
sde 8:64 0 1.8T 0 disk
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 28.4G 0 part /
zd0 230:0 0 2T 0 disk
├─zd0p1 230:1 0 2T 0 part
└─zd0p9 230:9 0 8M 0 part
この1.8TBの奴ですな。/dev/sde。
念の為hdparm -Iコマンドでシリアル番号を見て照合します。
$ sudo hdparm -I /dev/sde | head
SG_IO: bad/missing sense data, sb[]: 70 00 0b 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
/dev/sde:
ATA device, with non-removable media
Model Number: ST32000542AS
Serial Number: 5XW17B1B
Firmware Revision: 0969
Standards:
Supported: 7 6 5 4
Likely used: 7
照合できたら、この/dev/sdeのIDを求めます。
$ ls -l /dev/disk/by-id | grep sde
lrwxrwxrwx 1 root root 9 Sep 30 15:22 ata-ST32000542AS_5XW17B1B -> ../../sde
lrwxrwxrwx 1 root root 9 Sep 30 15:22 usb-ST320005_42AS_DD20250313009D-0:4 -> ../../sde
このIDを指定してzpool replaceします。
$ zpool status -g
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 Tue Sep 30 15:29:39 2025
1.17T / 1.33T scanned at 1.09G/s, 0B / 169G issued
0B resilvered, 0.00% done, no estimated completion time
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
5887850977561855789 DEGRADED 0 0 0
15916779478375754287 OFFLINE 0 0 0
1891343347815713878 ONLINE 0 0 0
17447701145463039710 ONLINE 0 0 0
17420523610300470783 ONLINE 0 0 0
7633794097079579966 ONLINE 0 0 0
errors: No known data errors
$ sudo zpool replace tank 15916779478375754287 usb-ST320005_42AS_DD20250313009D-0:4
状況を確認しましょう。
$ 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 Tue Sep 30 15:55:27 2025
823G / 1.33T scanned at 9.36G/s, 7.70G / 1.33T issued at 89.6M/s
1.52G resilvered, 0.57% done, 04:17:44 to go
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
replacing-0 DEGRADED 0 0 0
usb-Hitachi_HDP725050GLA360_DD20250313009D-0:4 OFFLINE 0 0 0
usb-ST320005_42AS_DD20250313009D-0:4 ONLINE 0 0 0 (resilvering)
usb-WDC_WD50_00AACS-00ZUB0_DD20250313009D-0:3 ONLINE 0 0 0
usb-Hitachi_HDT725050VLA360_DD20250313009D-0:2 ONLINE 0 0 0
usb-Hitachi_HDT725050VLA360_DD20250313009D-0:0 ONLINE 0 0 0
ata-ST1000VN008-3CW10C_WWD1E4QZ ONLINE 0 0 0
errors: No known data errors
時間的には3時間強といった所です。
繰り返し
以上を繰り返してHDD5台全部を2TBのデバイスに交換します。
全部交換が終わってzpool statusを確認した結果が下記です。
$ 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 268G in 03:29:16 with 0 errors on Sat Jan 17 15:26:46 2026
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
usb-ST320005_42AS_DD20250313009D-0:4 ONLINE 0 0 0
usb-ST320005_42AS_DD20250313009D-0:3 ONLINE 0 0 0
usb-ST320005_42AS_DD20250313009D-0:2 ONLINE 0 0 0
usb-Hitachi_HDS722020ALA330_DD20250313009D-0:0 ONLINE 0 0 0
usb-ST320005_42AS_DD20250313009D-0:1 ONLINE 0 0 0
errors: No known data errors
何やらzpool upgradeしろって指示が見えますが、それは次回にしましょう。
サイズの確認はzpool listで出来ます。
$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 9.09T 1.33T 7.76T - - 9% 14% 1.00x ONLINE -
約9TBのようですね。しまった、交換開始前のzpool listを取ってませんでした。確か、2TBと少しだった気がします。デバイス全部2TBにしたので圧倒的に増えました。
仕舞い
我が家のNASもこれで当分は安泰でしょう。良かった良かった。