«前の日記(2012-10-12) 最新 次の日記(2012-12-10)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

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  -

参考にしたページ