UbuntuでZFSを使ってみよう 第15回 スナップショットでバックアップしてみよう
前回は、スナップショットのよく使う機能について説明しました。今回は、スナップショットを使用したバックアップ/リストア方法について説明します。
スナップショットを使用したバックアップ
ZFSでは、特定スナップショットの内容をファイルストリームとして出力し、ファイルをバックアップできます。 バックアップはzfs send
コマンドを使用し、標準出力にファイルストリームとして出力します。
$ zfs list -rt all rpool/USERDATA/user1
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user1 480K 796G 104K /home/user1
rpool/USERDATA/user1@aaa 64K - 104K -
rpool/USERDATA/user1@ccc 64K - 104K -
rpool/USERDATA/user1@zfs-auto-snap_daily-2020-12-20-2239 0B - 104K -
(中略)
rpool/USERDATA/user1@zfs-auto-snap_hourly-2021-01-17-1017 0B - 104K -
rpool/USERDATA/user1@ddd 0B - 104K -
# スナップショット aaa をファイルに格納
$ sudo zfs send rpool/USERDATA/user1@aaa > /tmp/user1_aaa
# スナップショット bbb をbzip2で圧縮してファイルに格納
$ sudo zfs send rpool/USERDATA/user1@ccc | bzip2 --compress --stdout > /tmp/user1_ccc.bz2
# ファイルの確認
$ ls /tmp/user1_*
/tmp/user1_aaa /tmp/user1_ccc.bz2
$ file /tmp/user1_aaa
/tmp/user1_aaa: ZFS shapshot (little-endian machine), version 33554449, type: ZFS, destination GUID: C5 5C 3D 34 90 07 9B 12, name: 'rpool/USERDATA/user1@aaa'
$ file /tmp/user1_ccc.bz2
/tmp/user1_ccc.bz2: bzip2 compressed data, block size = 900k
# ファイルシステム自体もバックアップ可能
## ただしファイルシステムをマウントした状態ではバックアップできない
$ sudo zfs send rpool/USERDATA/user1 > /tmp/user1_fs
warning: cannot send 'rpool/USERDATA/user1': target is busy; if a filesystem, it must not be mounted
## 一度umount してから バックアップする
$ sudo zfs umount rpool/USERDATA/user1
$ sudo zfs send rpool/USERDATA/user1 > /tmp/user1_fs
$ sudo zfs mount rpool/USERDATA/user1
$ file /tmp/user1_fs
/tmp/user1_fs: ZFS shapshot (little-endian machine), version 33554449, type: ZFS, destination GUID: E2 AB 70 8E 4C 43 2A 9E, name: 'rpool/USERDATA/user1@--head--'
ZFSでは、スナップショット間の差分もバックアップ可能です。スナップショット間の差分だけをバックアップすると、重複したファイルブロックが無くなるため、バックアップサイズが少なくなります。
$ zfs list -rt all rpool/USERDATA/user1 | grep '@[a-z][a-z][a-z] '
rpool/USERDATA/user1@aaa 64K - 104K -
rpool/USERDATA/user1@ccc 64K - 104K -
rpool/USERDATA/user1@ddd 0B - 104K -
# スナップショットaaaとcccの差分
$ sudo zfs send -i rpool/USERDATA/user1@aaa rpool/USERDATA/user1@ccc > /tmp/user1_aaa_ccc
# スナップショットcccとdddの差分
$ sudo zfs send -i rpool/USERDATA/user1@ccc rpool/USERDATA/user1@ddd > /tmp/user1_ccc_ddd
$ file /tmp/user1_aaa_ccc /tmp/user1_ccc_ddd
/tmp/user1_aaa_ccc: ZFS shapshot (little-endian machine), version 33554449, type: ZFS, destination GUID: 41 B4 54 BB F8 8C 82 63, source GUID: C5 5C 3D 34 90 07 9B 12, name: 'rpool/USERDATA/user1@ccc'
/tmp/user1_ccc_ddd: ZFS shapshot (little-endian machine), version 33554449, type: ZFS, destination GUID: AD D6 0D 4F D3 99 83 CA, source GUID: 41 B4 54 BB F8 8C 82 63, name: 'rpool/USERDATA/user1@ddd'
# ファイルサイズの確認
$ bunzip2 /tmp/user1_ccc.bz2
$ ls -l /tmp/user1_*
-rw-rw-r-- 1 s-miyaza s-miyaza 50384 Jan 17 19:45 /tmp/user1_aaa
-rw-rw-r-- 1 s-miyaza s-miyaza 11536 Jan 17 20:23 /tmp/user1_aaa_ccc
-rw-rw-r-- 1 s-miyaza s-miyaza 52008 Jan 17 19:46 /tmp/user1_ccc
-rw-rw-r-- 1 s-miyaza s-miyaza 15608 Jan 17 20:23 /tmp/user1_ccc_ddd
-rw-rw-r-- 1 s-miyaza s-miyaza 53320 Jan 17 20:14 /tmp/user1_fs
スナップショットをリストア
zfs send
で出力されたストリームはzfs recieve
でリストアできます。スナップショット差分からもリストアできますが、スナップショットの順番を守る必要があります。
# rpool/USERDATA/user1@aaa を rpool/USERDATA/user2 としてリストア
$ cat /tmp/user1_aaa | sudo zfs receive rpool/USERDATA/user2
$ zfs list -r rpool/USERDATA
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA 62.9G 796G 96K /
rpool/USERDATA/root_z0ox2d 179M 796G 175M /root
rpool/USERDATA/s-miyaza_z0ox2d 62.7G 796G 36.9G /home/s-miyaza
rpool/USERDATA/user1 480K 796G 104K /home/user1
rpool/USERDATA/user2 104K 796G 104K /user2
$ zfs list -rt all rpool/USERDATA/user2
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user2 160K 796G 104K /user2
rpool/USERDATA/user2@aaa 0B - 104K -
$ ls /user2
aaa bbb
# スナップショットaaaとcccの差分をリストア(zfs recieve -F)
$ cat /tmp/user1_aaa_ccc | sudo zfs receive -F rpool/USERDATA/user2
$ zfs list -rt all rpool/USERDATA/user2
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user2 168K 796G 104K /user2
rpool/USERDATA/user2@aaa 64K - 104K -
rpool/USERDATA/user2@ccc 0B - 104K -
# スナップショットaaaにrollback
$ sudo zfs rollback -r rpool/USERDATA/user2@aaa
$ zfs list -rt all rpool/USERDATA/user2
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user2 104K 796G 104K /user2
rpool/USERDATA/user2@aaa 0B - 104K -
# スナップショットcccがない状態で、スナップショットcccとdddの差分をリストアすると、エラーになる
$ cat /tmp/user1_ccc_ddd | sudo zfs receive -F rpool/USERDATA/user2
cannot receive incremental stream: most recent snapshot of rpool/USERDATA/user2 does not
match incremental source
# 正しい順番で差分リストアする
$ cat /tmp/user1_aaa_ccc | sudo zfs receive -F rpool/USERDATA/user2
$ cat /tmp/user1_ccc_ddd | sudo zfs receive -F rpool/USERDATA/user2
$ zfs list -rt all rpool/USERDATA/user2
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user2 240K 796G 104K /user2
rpool/USERDATA/user2@aaa 64K - 104K -
rpool/USERDATA/user2@ccc 64K - 104K -
rpool/USERDATA/user2@ddd 0B - 104K -
終わりに
今回は、スナップショットを使用したバックアップ/リストア方法について説明しました。次回はバックアップ・リストアについて、もう少し詳しく説明します。次回をお楽しみに。
さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス