Web更新

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導入コンサルティングサービス

関連記事一覧