06 June 2013

前回、ZFS の RootFileSystem上に FreeBSD をインストールするところまでやりました。

インストールが無事終わったところで、さっそく壊しますか。(笑)

せっかく ZFS にインストールしたのだから、試しに壊して復旧してみたくなりますね。(なりませんか?)

今回は、FreeBSD というよりも、ZFS の話題です。

Linux で ZFS を使おうとすると、

  1. ZFS-FUSE: 機能が限定的
  2. ZFS on LINUX: Kernel を更新するたびに、ZFSモジュールも再ビルドなので面倒

という欠点がありました。 (Linux で ZFS を使ってみた を参照)

その点、FreeBSD では標準的にサポートされているのは良いですね。

1台外してみる

今の構成は、HDD 4台で RAID-Z を構成しています。
ということは、HDD 1台壊れても起動できるはずです。

データが化けたくらいなら、 ZFS が scrub ですぐに直してくれますので、あまり面白くない。
HDDがうんともすんとも動かなくなって、もう取り外すしかないという状況になったという仮定でやってみます。

ernie0.vdi, ernie1.vdi, ernie2.vdi, ernie3.vdi という4台のHDDのうち、 図のように、 1台目の ernie0.vdi を取り外してみます。

Remove a hard drive

そして、起動させてみます。 なーんも問題なく起動しました。

これがうまく理屈としては、こうです。

前回のインストール時に、 4台すべての boot パーティションに、bootcode をインストールしてあります。

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
bootcode written to ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
bootcode written to ada2
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
bootcode written to ada3

なので、ブートローダーは問題なし。

Swap領域については、

# Device Mountpoint FStype Options Dump Pass#
/dev/ada0p2 none  swap sw 0 0
/dev/ada1p2 none  swap sw 0 0
/dev/ada2p2 none  swap sw 0 0

のように、認識された順に 3台だけ、使っています。

インストール時は

  • ada0: ernie0.vdi
  • ada1: ernie1.vdi
  • ada2: ernie2.vdi
  • ada3: ernie3.vdi

のように認識していたわけですが、ernie0.vdi を取り外したので

  • ada0: ernie1.vdi
  • ada1: ernie2.vdi
  • ada2: ernie3.vdi

のように認識するのですが、ドライブ番号で指定しているので、何ら矛盾はない。

で、ルートパーティションは RAID-Z になっていて冗長性が確保されているので、1台失われても問題ない。 (ちなみに ZFS の方は、認識順でドライブ番号が変わっておかしくならないように、ラベルで指定するのでした。)

当然、status を表示させると DEGRADED となっていますが。

DEGRADED

1台追加して復旧する

このままでは、冗長性がなくて、心もとないので、新しいHDDを買ってきて接続したという想定にしましょう。

VirtualBox に新しく ernie4.vdi というディスクを追加しています。

add a new drive

起動させて、他の3台と同じ構造で ernie4 にパーティションを切ります。

# gpart show -l
=>      34  33554365  ada0  GPT  (16G)
        34       122     1  ernie1_boot  (61k)
       156   1048576     2  ernie1_swap  (512M)
   1048732  32505667     3  ernie1_root  (15G)

=>      34  33554365  ada1  GPT  (16G)
        34       122     1  ernie2_boot  (61k)
       156   1048576     2  ernie2_swap  (512M)
   1048732  32505667     3  ernie2_root  (15G)

=>      34  33554365  ada2  GPT  (16G)
        34       122     1  ernie3_boot  (61k)
       156   1048576     2  ernie3_swap  (512M)
   1048732  32505667     3  ernie3_root  (15G)

# gpart create -s gpt ada3
# gpart add -s 122 -t freebsd-boot -l ernie4_boot ada3
ada3p1 added
# gpart add -s 512m -t freebsd-swap -l ernie4_swap ada3
ada3p2 added
# gpart add -t freebsd-zfs -l ernie4_root ada3
ada3p3 added
# gpart show -l
=>      34  33554365  ada0  GPT  (16G)
        34       122     1  ernie1_boot  (61k)
       156   1048576     2  ernie1_swap  (512M)
   1048732  32505667     3  ernie1_root  (15G)

=>      34  33554365  ada1  GPT  (16G)
        34       122     1  ernie2_boot  (61k)
       156   1048576     2  ernie2_swap  (512M)
   1048732  32505667     3  ernie2_root  (15G)

=>      34  33554365  ada2  GPT  (16G)
        34       122     1  ernie3_boot  (61k)
       156   1048576     2  ernie3_swap  (512M)
   1048732  32505667     3  ernie3_root  (15G)

=>      34  33554365  ada3  GPT  (16G)
        34       122     1  ernie4_boot  (61k)
       156   1048576     2  ernie4_swap  (512M)
   1048732  32505667     3  ernie4_root  (15G)

という感じになります。

4台対称にするために、 bootcode もインストールしておきます。

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
bootcode written to ada3

あとは zpool replace します。

# zpool replace rpool /dev/gpt/ernie0_root /dev/gpt/ernie4_root
Make sure to wait until resilver is done before rebooting.

zpool status で resilvered になっていたら OKです。

resilvered

これで冗長性が確保されたので、またどれか1台取り外しても、何の問題なく起動します。

ZFS 素晴らしすぎる。

次回は、まともに使えるようにいろいろとセットアップしていきます。



blog comments powered by Disqus