前回のお遊びでは確認できなかったので、ちょっと余ってるドライブを掘り出してきて調査してみました。
長くなるので結果から書いておくと、zfs replace というそのものズバリのコマンドでハードディスクを交換してプールを増量することができました。attachしてからdetachでも同じだと思いますが、前者では一回のコマンド実行で作業が済むので簡単です。
[実験環境]
転送元: USBハードディスク /dev/da0s1c (40GB)
転送先: 内蔵ATAハードディスク /dev/ad0s1d (80GB-ルートパーティション)
Dimension4600C# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT tank2 37.2G 2.08G 35.2G 5% ONLINE -
当初のZFSプールの容量は37.2GBです。
Dimension4600C# zpool status pool: tank2 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: http://www.sun.com/msg/ZFS-8000-9P scrub: none requested config: NAME STATE READ WRITE CKSUM tank2 ONLINE 20 0 0 da0s1c ONLINE 20 0 0 errors: No known data errors
ステータスはこんな感じ。エラーが出てるのはUSB-ATAインタフェイスがヘンテコだったり使用したハードディスクが故障で交換したゴミドライブなのが原因だと思います。
てことでリプレースを実行
Dimension4600C# zpool replace tank2 da0s1c ad0s1d
割とすんなりコマンド返ってきてコマンドプロンプトが表示されます。が、アクセスランプを見るとリプレースが実行されているようです。
Dimension4600C# zpool status pool: tank2 state: ONLINE 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. scrub: resilver in progress, 66.12% done, 0h1m to go config: NAME STATE READ WRITE CKSUM tank2 ONLINE 0 0 0 replacing ONLINE 0 0 0 da0s1c ONLINE 65 0 0 ad0s1d ONLINE 0 0 39 errors: No known data errors
上記は66%終了した状態。
Dimension4600C# zpool status pool: tank2 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: http://www.sun.com/msg/ZFS-8000-9P scrub: resilver completed with 0 errors on Thu Jan 31 20:05:42 2008 config: NAME STATE READ WRITE CKSUM tank2 ONLINE 0 0 39 ad0s1d ONLINE 0 0 39 errors: No known data errors
リプレース完了。ディスクアクセスが終ってしばらくすると転送元のデバイスは自動的に見えなくなりました。RAID1と違ってミラーリングが高水準なところで行われるようで、ZFSのディスク使用領域だけがミラー対象となるみたいです。ミラーリングが早く終るのでこれはこれでありがたいのですが、これは将来 ZFS Bootが実現してもMBRとかはミラーされないことを意味するのでなんだか微妙な心境です。
Dimension4600C# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT tank2 72G 2.08G 69.9G 2% ONLINE -
で、これが実行結果。始めのコマンドと比較すればわかると思いますが、ZFSプールを37.2GBから72GBに増量できました。明示的に umount とか dump/restore とかせずにディスクを入れ替え増量できるってなんか面白いですな。しかも、ホットスワップに対応したハードウェア構成であれば、システムを停止することなくディスクの交換ができてしまいます。あぅ~これイイよ~。使いたいよ~。でももう少し、少なくともFreeBSD7.0がリリースされるまではがまんです。
ちなみに、上記の後で小さいディスクに replace しようとすると、
cannot replace ad0s1d with da0s1c: device is too smallと怒られました(笑)。大きくするのは簡単ですが逆はダメなんですな。
□ 関連記事