FreeBSDでZFS

いろいろ行き詰まったので現実逃避にZFSを試してみる。

参考: SUNのZFS管理ガイド

0. 注意

  • 512MB以上のメモリがないとkernel panicを起こす可能性が高い
  • 7currentを使っていることに注意。つまり、明日にはzfsが壊れている可能性もあるということ

1. 7-Currrentを入れる

  • / に2G、swapに1G、/usr に2G割り当てる。/が多いのは/varも含めるため
  • 残り10Gは未割り当て
  • 今回は2007年07月23日のスナップショットで試してみた。

2. 準備

/etc/rc.confに

  zfs_enable="YES"

を付け加え、

  # /etc/rc.d/zfs start

とする。kldstatをして、zfs.koが読み込まれていることを確認。次のbootからは特にいらないでしょう。

2.1 (optional) disklabelを切る

本来は別のディスクを用意するんだろうが、今回はテストのため、別パーティションを切ってそこを利用する。今回は10G分のパーティションを作成した。これを /dev/ad0s2eとする。

3. ストレージプールを作成

単純なストレージプールの作成

今回は、zpool_loという名前のストレージプールをさっき作った/dev/ad0s2eに作ってみる。他にもmirrorとかできるけど今回はパス。

 # zpool create -m /zpool/zpol_lo zpool_lo /dev/ad0s2e
  • mはmount pointを指す。df -hしてみるとこんな感じ。
  Filesystem     Size    Used   Avail Capacity  Mounted on
  /dev/ad0s2a    1.9G    168M    1.6G     9%    /
  devfs          1.0K    1.0K      0B   100%    /dev
  /dev/ad0s2d    1.9G    831M    989M    46%    /usr
  zpool_lo       9.6G      0B    9.6G     0%    /zpool/zpool_lo
ドライラン
  • n をつけることで、実際の動作をせずに結果を確かめることができる。
  # zpool create -n zpool_lo mirror /dev/ad0s2e

4. ストレージプールからディスクを割り当てる

さっき作ったzpool_loというストレージプールから、home分を割り当てる。zpool_lo/homeというのは、zpool_loの中のhomeという名前、という意味。

 # zfs create -o mountpoint=/home zpool_lo/home

ちなみに、/usr/localを作ろうとして、いきなり

 # zfs create -o mountpoint=/usr/local zpool_lo/usr/local

してもだめ。/usrがzfs管理になってないから。ま、usr全部をzfsにする必要もないので、

 # zfs create -o mountpoint=/usr/local zpool_lo/local

してみた。

割り当てた分を見てみる
 # zfs list

としてみると、こんな感じ。

  NAME             USED  AVAIL  REFER  MOUNTPOINT
  zpool_lo         182K  9.60G    18K  /zpool/zpool_lo
  zpool_lo/home     18K  9.60G    18K  /home
  zpool_lo/local    18K  9.60G    18K  /usr/local/

df -hの結果は

  Filesystem        Size    Used   Avail Capacity  Mounted on
  /dev/ad0s2a       1.9G    169M    1.6G     9%    /
  devfs             1.0K    1.0K      0B   100%    /dev
  /dev/ad0s2d       1.9G    831M    989M    46%    /usr
  zpool_lo          9.6G      0B    9.6G     0%    /zpool/zpool_lo
  zpool_lo/home     9.6G      0B    9.6G     0%    /home
  zpool_lo/local    9.6G      0B    9.6G     0%    /usr/local/
割り当てた分のmount

zfs createをするとすぐにmountしてくれるが、自分でやりたい場合は

  # zfs mount -a

で全部mountしてくれる。

5. ストレージプールの管理

現在のストレージプールを見る
 # zpool list

こうなるはず。

  NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
  zpool_lo               9.75G    111K   9.75G     0%  ONLINE     -
ストレージプールの消去
  # zpool destroy zpool_lo

問答無用で消されるので注意。

消去したストレージプールを回復する
  # zpool import -D

をすることで、回復できる、かもしれない(詳細不明。また今度。)

ストレージプールにディスクを追加する
  # zpool add zpool_lo

追加ディスクがないので今回はパス。動的に追加できるデバイスを使う場合は、zpool onlineなどを叩いて追加されたことを知らせてやらないといけないらしい。

6. スナップショット

スナップショットを取る
  # zfs snapshot zpool_lo/home@monday

@以下は下線(_)、ハイフン(-)、コロン(:)、ピリオド(.)も使える。

取ったらzfs list -t snapshot で確認できる。

  # zfs list -t snapshot
  NAME                       USED  AVAIL  REFER  MOUNTPOINT
  zpool_lo/home@monday          0      -    18K  -

もちろん、zfs listにも現れる。

  NAME                       USED  AVAIL  REFER  MOUNTPOINT
  zpool_lo                   184K  9.60G    18K  /zpool/zpool_lo
  zpool_lo/home               18K  9.60G    18K  /home
  zpool_lo/home@monday          0      -    18K  -
  zpool_lo/local              18K  9.60G    18K  /usr/local/
下の階層のスナップショットも全部取る
  • r オプションで下の階層のスナップショットも全部取れる
  # zfs snapshot -r zpool_lo@monday

zfs list -t snapshot で確認してみよう。

  NAME                        USED  AVAIL  REFER  MOUNTPOINT
  zpool_lo@monday                0      -    18K  -
  zpool_lo/home@monday           0      -    18K  -
  zpool_lo/local@monday          0      -    18K  -

zpool_lo、zpool_lo/home、zpool_lo/localの全部取れていることが分かる。

スナップショットの復元

復元にはrollbackを使う。

  # zfs rollback zpool_lo/home@monday

注意してほしいのは、復元したスナップショット以降に取ったスナップショット、例えばここでは火曜日や水曜日に取ったスナップショットは月曜のスナップショットを復元した時点で破棄されてしまう。

スナップショットの破棄
  # zfs destroy zpool_lo/home@test

ちゃんと@以下をつけてスナップショットを指定しないと丸ごと破棄しちゃうので注意。
どうもユーザが取ったものでも破棄にはroot権限が必要らしい。

取ったスナップショットを送る
  # zfs send zpool_lo/home@monday > snapshot-monday

snapshot-mondayというファイルにスナップショットが吐き出される。ちなみに、標準出力を経由しているので、当然sshで送ることもできる

  # zfs send zpool_lo/home@monday | ssh backup.example.jp "cat > /zfssnapshot/snapshot-monday"
増分スナップショット

増分スナップショットを取るには sendに-iをつけ、スナップショットを二つ指定する。二つ目の引数は必ず一つ目の引数より後のものでなければならない。

  # zfs send -i zpool_lo/home@monday zpool_lo/home@2007-07-24 > backup-today
送ったスナップショットを受け取る

スナップショットを受け取れる。zfs recvでも同じ。受け取ったスナップショットはあとでrollbackで復元できる。

  # zfs receive zpool_lo/home@monday < snapshot-monday

なお、増分スナップショットを受け取る場合には、最初に最新のスナップショットにrollbackしておく必要がある。

リモートに同じファイルシステムを構築

sendとrecvを使うと、リモートに同じファイルシステムを構築できる。

 # zfs send zpool_lo/home@today | ssh newmachine zfs receive tank/zfshome@today

とか。


今日はここまで。続きはまた今度。