====== Diskの交換と容量拡張 ======
===== 環境 =====
* Dell PERC6(LSI)につながれているディスクを交換します
* ZFS raidz1で構成されています
* GPTでパーティションが切られています
* zfs rootで作成されています
===== やったこと =====
==== ディスクの確認 ====
zpoolからの見え方
# zpool status
pool: zroot
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
mfid0p3 ONLINE 0 0 0
mfid1p3 ONLINE 0 0 0
mfid2p3 ONLINE 0 0 0
mfid3p3 ONLINE 0 0 0
errors: No known data errors
GPTパーティション
# gpart show mfid1
=> 40 284950448 mfid1 GPT (136G)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 280752128 3 freebsd-zfs (134G)
284948480 2008 - free - (1.0M)
LSIのコントローラにつながれているため、一般に良く挙げられているコマンドは使えません
glabel status
dmesg | grep -B1 'Serial Number'
camcontrol devlist
geom disk list
mfiutlを使います
# mfiutil show drives
mfi0 Physical Drives:
0 ( 136G) ONLINE SAS E1:S0
1 ( 136G) ONLINE SAS E1:S1
2 ( 136G) ONLINE SAS E1:S2
3 ( 136G) ONLINE SAS E1:S3
SMARTでも取得できますが、インストールが必要です
# smartctl -a /dev/mfi0 -d megaraid,1
=== START OF INFORMATION SECTION ===
Vendor: FUJITSU
Product: MBE2147RC
Revision: 2903
Serial number: D00ABCDEFG01
==== 物理ディスクの確認 ====
mfiutlでLEDを光らせることが可能です
# mfiutil locate 1 on
消すときは
# mfiutil locate 1 off
==== ディスクの停止 ====
見てきたように、コントローラ配下で管理されていることから、OSでの認識番号とコントローラ上の番号は一致していると思われます。
では、3番を停止します
# zpool offline zroot mfid3p3
==== 交換 ====
HotSwapに対応しているのでそのまま交換しました(( mfiutil fail した方が良いかも))
==== Onlineにする ====
見ると、「UNCONFIGURED」になっています
# mfiutil show drives
3 ( 838G) UNCONFIGURED GOOD SCSI-6 E1:S3
ONLINEにします
mfiutil create raid0 3
または
mfiutil create jbod e1:s3
上手くいけば**ONLINE**に変わるはず
# mfiutil show drives
3 ( 838G) ONLINE SCSI-6 E1:S3
ここで、/var/log/messageなどで新しく作成したvolumeのdevice名を確認
Aug 14 14:22:19 kernel: mfi0: 80245 (745305162s/0x0002/info) - State change on PD 14(e0xf5/s4) from UNCONFIGURED_GOOD(0) to ONLINE(18)
Aug 14 14:22:31 kernel: mfi0: 80246 (745305162s/0x0001/info) - VD 04/c is now OPTIMAL
Aug 14 14:22:31 kernel: mfi0: 80247 (745305162s/0x0041/info) - Created VD 04/c
Aug 14 14:22:31 kernel: mfid4 on mfi0
# mfiutil name mfid4 "slot4"
=== ここでエラーが出る場合 ===
以下のようなエラーが出る場合
mfiutil: Command failed: Status: 0x54
mfiutil: Failed to add volume: Input/output error
アダプタのキャッシュが悪さしてるので**MegaCli**コマンドでいじる((以下の手順で動いた))
# MegaCli -CfgForeign -Clear -a0
There is no foreign configuration on controller 0.
Exit Code: 0x00
root@ambrosia:~ # MegaCli -GetPreservedCacheList -a0
Adapter #0
Virtual Drive(Target ID 33): Missing.
Exit Code: 0x00
# MegaCli -DiscardPreservedCache -Lall -a0
Adapter #0
Virtual Drive(Target ID 04): Preserved Cache Data Cleared.
Exit Code: 0x00
==== GPTパーティション ====
=== zfsがrootでない場合 ===
まずは、GPTスキーマでディスクを登録
# gpart create -s gpt mfid#
mfid3 created
gpart add -t freebsd-zfs -l slot# mfid#
これでDiskとしてFreeBSDから使えるようになる
=== zfs root用 ===
GPTパーティションが切られていましたので同様にパーティションを作成します
まずは、GPTスキーマでディスクを登録
# gpart create -s gpt mfid#
mfid# created
最初のステージのブートストラップを保護する MBR をインストールします((GPTを理解しないBIOSなどから保護するらしい))
# gpart bootcode -b /boot/pmbr mfid#
FreeBSD カーネルとモジュールをロードする 2 番目のステージのブートローダパーティションを追加して、ブートコードを書き込む((zfs root用でufsの時は違うので注意))
# gpart add -t freebsd-boot -b 40 -s 1024 mfid#
# gpart bootcode -p /boot/gptzfsboot -i 1 mfid#
ブートコードを1度に書くこともできる模様
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 mfid#
swapとzfs用パーティションを追加
# gpart add -t freebsd-swap -b 2048 -s 4194304 mfid#
# gpart add -t freebsd-zfs -b 4196352 -s 1752691712 mfid#
# gpart show mfid#
=> 40 1756889008 mfid3 GPT (838G)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 1752691712 3 freebsd-zfs (836G)
1756888064 984 - free - (492K)
== パーティション削除の例 ==
# gpart delete -i 3 mfid#
# gpart delete -i 2 mfid#
# gpart delete -i 1 mfid#
# gpart destroy mfid#
==== zpoolコマンドで置き換え ====
=== 状態確認 ===
# zpool status
pool: Zhdd
state: DEGRADED
......
gpt/slot3 ONLINE 0 0 0
10913389982825355046 OFFLINE 0 0 0 was /dev/gpt/slot4
gpt/slot5 ONLINE 0 0 0
=== rebuild ===
# zpool replace zroot mfid3p3
または
# zpool replace Zhdd 10913389982825355046 /dev/gpt/slot4
rebuildが開始されます
# zpool status
pool: zroot
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 Thu Jul 14 00:33:08 2022
1.47G scanned at 503M/s, 1.13G issued at 387M/s, 1.47G total
283M resilvered, 76.97% done, 00:00:00 to go
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
mfid0p3 ONLINE 0 0 0
mfid1p3 ONLINE 0 0 0
mfid2p3 ONLINE 0 0 0
replacing-3 DEGRADED 0 0 0
mfid3p3/old OFFLINE 0 0 0
mfid3p3 ONLINE 0 0 0 (resilvering)
errors: No known data errors
==== 容量の拡張 ====
以前は、Diskをすべて交換すればpoolも自動的に大きくなったが現在はそうならない((13.1で確認))((先にautoexpandをonにしてからDisk交換すれば自動で大きくなるはず))
# zpool get autoexpand
NAME PROPERTY VALUE SOURCE
zroot autoexpand off default
zpool listでsizeを確認する
# zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 532G 1.47G 531G - 2.74T 0% 0% 1.00x ONLINE -
raidz1-0 532G 1.47G 531G - 2.74T 0% 0.27% - ONLINE
mfid3p3 - - - - - - - - ONLINE
mfid2p3 - - - - - - - - ONLINE
mfid1p3 - - - - - - - - ONLINE
mfid0p3 - - - - - - - - ONLINE
2.74T拡張可能の模様
実際に拡張する((デバイスは1つ指定すれば良い模様))
zpool online -e zroot mfid3p3
# zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 3.26T 1.47G 3.26T - - 0% 0% 1.00x ONLINE -
raidz1-0 3.26T 1.47G 3.26T - - 0% 0.04% - ONLINE
mfid3p3 - - - - - - - - ONLINE
mfid2p3 - - - - - - - - ONLINE
mfid1p3 - - - - - - - - ONLINE
mfid0p3 - - - - - - - - ONLINE
===== 参考 =====
* [[https://stevendouglas.me/posts/freebsd-replace-a-root-disk-from-bsdinstall-connected-to-a-raid-controller/|FreeBSD replace a root disk from bsdinstall connected to a RAID controller]]
* [[https://github-wiki-see.page/m/shawfdong/hyades/wiki/Replacing-Hard-Drive-In-Ambrosia|Replacing Hard Drive In Ambrosia - shawfdong/hyades GitHub Wiki]]