筆者について
FreeBSDを通じてOSSにささかな貢献を。
- 日本xrdpユーザ会発起人
- xrdp developer
- FreeBSD developer
OSS活動をご支援いただける方を募集しています
2012-10-13 ZFS! ZFS!
■ ZFS シングルドライブ構成からミラーを経てプールを拡張する
新しいハードディスクを買ったので環境を引越します。
一昔前ならシングルユーザモードで起動してスライスごとに、
# dump -0b 512 -f 0 / | (cd /mnt ; restore -rb 512 -f -) # dump -0b 512 -f 0 /usr | (cd /mnt/usr ; restore -rb 512 -f -) # dump -0b 512 -f 0 /var | (cd /mnt/var ; restore -rb 512 -f -)
なんてやってたのが ZFS なら楽々です。電源を落とすのは新しいハードディスクを取り付ける1回だけ。古いハードディスクはデタッチするだけで取り付けたままにしておいても別に困らないので。ホットスワップ対応なら電源を落とす必要すらない!素敵!
新しいハードディスクは smartmontools で確認してみたら 4K Sectors と出ているので4Kセクタの製品らしい。 出力を見た感じローレベルフォーマットではセクタサイズ4KBなのに、ソフトウェア的には512バイトのように振る舞うちょっと厄介な製品。
# smartctl -i /dev/ada1 === START OF INFORMATION SECTION === Model Family: Seagate Barracuda (SATA 3Gb/s, 4K Sectors) Sector Sizes: 512 bytes logical, 4096 bytes physical
既存のディスクはこんな GPT パーティション構成になってます。
$ gpart show ada0 => 34 976773101 ada0 GPT (465G) 34 128 1 freebsd-boot (64k) 162 16777216 2 freebsd-swap (8.0G) 16777378 959995757 3 freebsd-zfs (457G)
新しいディスク単独で動作させる予定なので1台目のドライブと同じ様に ada1 に GPT パーティションを切りますが、4Kセクタに境界を合わせるため、-a 4k オプションをつけます。
# gpart create -s gpt /dev/ada1 ada1 created # gpart add -a 4k -s 64k -t freebsd-boot ada1 ada1p1 added # gpart add -a 4k -s 8G -t freebsd-swap -l swap1 ada1 ada1p2 added # gpart add -t freebsd-zfs -l disk1 ada1 ada1p3 added
最終的にこういう構成になる。構成は必ずしも全く同じである必要はなく freebsd-boot と freebsd-zfs の2つがあればなんとかなると思います。
$ gpart show => 34 976773101 ada0 GPT (465G) 34 128 1 freebsd-boot (64k) 162 16777216 2 freebsd-swap (8.0G) 16777378 959995757 3 freebsd-zfs (457G) => 34 3907029101 ada1 GPT (1.8T) 34 6 - free - (3.0k) 40 128 1 freebsd-boot (64k) 168 16777216 2 freebsd-swap (8.0G) 16777384 3890251744 3 freebsd-zfs (1.8T) 3907029128 7 - free - (3.5k)
新しいドライブにブート用のコードをインストールする。
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1 bootcode written to ada1
いよいよ ZFS でミラーリング。ミラーする前はこんな状態です。 後からミラープールを作成するにはOracleのミラー化ルートプールを作成する方法 (インストール後)を参照。
$ zpool status zroot pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 ada0p3 ONLINE 0 0 0 errors: No known data errors
新しいドライブの3つ目のパーティションをアタッチ。
# zpool attach zroot ada0p3 ada1p3 Make sure to wait until resilver is done before rebooting. If you boot from pool 'zroot', you may need to update boot code on newly attached disk 'ada1p3'. Assuming you use GPT partitioning and 'da0' is your new boot disk you may use the following command: gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
ブートコードを新しいディスクにも入れろ的なことを言ってくるけどさっきやったのでスルー。
新しいディスクをアタッチした後にステータスを見るとこんな感じ。ZFS ではミラーを作ることを silver というみたい。ちょっとカッコいい。
$ zpool status zroot pool: zroot 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. scan: resilver in progress since Sat Oct 13 23:01:46 2012 1.11G scanned out of 84.9G at 2.43M/s, 9h49m to go 1.11G resilvered, 1.30% done config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ada0p3 ONLINE 0 0 0 ada1p3 ONLINE 0 0 0 (resilvering) errors: No known data errors
ミラーリングの途中経過を表示させておくには sysutils/topless を使って
$ topless "zpool status zroot"
とするのがおすすめです。
ミラーが完了したら古いドライブをデタッチする。
# zpool detach zroot ada0p3
プールの状態を確認してみると、あれ…サイズが大きくなってない。
$ zpool list zroot NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT zroot 456G 85.3G 371G 18% 1.00x ONLINE -
zpool のマニュアルを見ると、-e オプションをつければ容量の拡大ができると書いてあったのでやってみる。
zpool online [-e] pool device... Brings the specified physical device online. This command is not applicable to spares or cache devices. -e Expand the device to use all available space. If the device is part of a mirror or raidz then all devices must be expanded before the new space will become available to the pool.
で、実際にやってみると無事に容量が拡大されました。めでたしめでたし。
# zpool online -e zroot ada1p3 $ zpool list zroot NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT zroot 1.81T 85.5G 1.73T 4% 1.00x ONLINE -
参考にしたページ