Ubuntu Weekly Recipe

第597回 UbuntuのルートファイルシステムをZFSにしてみる

この記事を読むのに必要な時間:およそ 13 分

バックアップとリストア

一般ユーザーにおけるZFSのもうひとつの利点が,バックアップとリストアが簡単なことです。まずはzfs sendコマンドでホームディレクトリのデータセットのバックアップを取ってみましょう。なお,zfs sendの対象はスナップショットかマウントされていないデータセットとなりますので,とりあえず現在のスナップショットを作成してからバックアップします。

$ echo "backuped data" > ~/backup.dat
$ zfs snapshot rpool/USERDATA/shibata_e8xd45@backup1
$ sudo zfs send rpool/USERDATA/shibata_e8xd45@backup1 > /var/tmp/home_backup.bin
$ ls -lh /var/tmp/home_backup.bin
-rw-rw-r-- 1 shibata shibata 13M 12月  1 23:21 /var/tmp/home_backup.bin

zfs sendはバイナリストリームを出力しますので,任意のファイルにリダイレクトできます。たとえばパイプを使って| gzip -c > backup.gzのように圧縮することも可能です。

バックアップデータができたので,今度はそれをzfs recvコマンドでリストアしましょう。今回は単純に「別の名前」でリストアします。

$ sudo zfs recv rpool/USERDATA/shibata_backup1 < /var/tmp/home_backup.bin
$ zfs list rpool/USERDATA/shibata_backup1
NAME                             USED  AVAIL     REFER  MOUNTPOINT
rpool/USERDATA/shibata_backup1  3.59M  11.1G     3.52M  /shibata_backup1
$ cat /shibata_backup1/backup.dat
backuped data
$ sudo zfs destroy -r rpool/USERDATA/shibata_backup1

リストアしたデータセットは自動的にセットされたマウントポイントにマウントされます。ここから先は個々のバックアップポリシーに依存しますが,たとえば今回の場合だと単にファイルのコピーで完了ですね。リストアしたデータセットはzfs destroyで削除できます。ただし,今回の例だとデータセットの中にスナップショットも含まれるので,-rオプションも付けておかないと削除できません。

zfs recvは標準入力からバイナリストリームを受け取ってそれをリストアしています※10⁠。つまりパイプを駆使すれば,バックアップとリストアをひとつのコマンド列で実行できるということです。

※10
zfs recvzfs receiveのエイリアスとなっています。ただしsendと文字数が同じほうが打ちやすいですし,そもそも「receive」だったか「recieve」だったか思い出すのに時間がかかる人にもrecvを使うことをおすすめします。

よくあるのは,別のZFSが使われているマシンにSSH越しにリストアする例です。

$ sudo zfs send rpool/USERDATA/shibata_e8xd45@backup1 | \
  ssh foo.local sudo zfs recv rpool/USERDATA/shibata_backup

自動化するならスナップショット・リストアする際のオプションをある程度決めないと失敗するかもしれません。詳細はzfsのmanページを参照してください。

たとえばあらかじめ次のようなコマンドで,ホームディレクトリのクォータを設定しておけば,リモートマシン側であふれることも防げるでしょう。

$ sudo zfs set quota=20G prpool/USERDATA/shibata_e8xd45

前項でも取り上げたzsnapdパッケージとして提供されているzfs-snap-managerには定期的なバックアップとレプリケーション機能も備わっているようです。

ZFSのメモリの使用量

ZFSを使う上で気になるのがメモリの使用量です。ZFSはprocfsやsysfs経由で数多くの情報を提供し,設定をカスタマイズ可能です。ただあまりに多すぎて把握するのが大変でもあります。

そこでざっくりと情報を把握するのに便利なのがarc_summaryコマンドです。早速使ってみましょう。zfsutils-linuxパッケージに含まれているので,Ubuntuなら最初からインストールされているはずです。

$ arc_summary -g

    ARC: 922.5 MiB (46.9 %)  MFU: 415.3 MiB  MRU: 453.8 MiB  META: 133.6 MiB (1.4 GiB) DNODE 20.0 MiB (147.5 MiB)
    +----------------------------------------------------------+
    |FFFFFFFFFFFFRRRRRRRRRRRRRO                                |
    +----------------------------------------------------------+

ARC(Adaptive Replacement Cache)はメモリ上に配置しているZFS用のディスクキャッシュです。つまりZFSのキャッシュだけで1GiB程度使っているということです。

ARCの最大サイズは環境にも依存しますが,たとえばarc_maxはメモリの半分が初期値のようです。他にも高速なストレージデバイス上にキャッシュを構築するL2ARCもありますが,これはさらにメモリを使用するとのこと。Ubuntuでは,初期状態では設定されていません。

$ arc_summary | grep L2ARC
L2ARC not detected, skipping section

なんらかの理由でARCの最大サイズを変更したい場合は,次のようにモジュールパラメーターをセットした上で,initramfsを再構築し,システムを再起動してください。

$ echo 'options zfs zfs_arc_max=1073741824' | sudo tee /etc/modprobe.d/zfs.conf
$ sudo update-initramfs -u -k all

この方法は他のモジュールパラメーターにも有効です。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。