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からは特にいらないでしょう。
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/
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