UbuntuでZFSを使ってみよう 第17回 zfs cloneを使ってみよう
前回は、ZFSを遠隔地へバックアップ・リストアする方法を説明しました。今回は、ZFSクローンを使用したリカバリ方法について説明します。
ZFS クローン
ZFSクローンは、snapshotから作成された書込み可能なファイルシステムを作成する機能です。
ZFSクローンを作成するには、以下のようにコマンド実行します。
$ zfs list -t snapshot rpool/USERDATA/user2
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user2@aaa 64K - 104K -
rpool/USERDATA/user2@ccc 64K - 104K -
rpool/USERDATA/user2@ddd 0B - 104K -
# snapshot ddd から user2_cloneという名前でcloneします
# mount pointをuser2と同じで、マウントできないようにします。
$ ssudo zfs clone -o canmount=noauto -o mountpoint=/user2 rpool/USERDATA/user2@ddd rpool/USERDATA/user2_clone
# user2_clone という名前でファイルシステムが作成されました。
$ zfs list -r -t all rpool/USERDATA | grep user2
rpool/USERDATA/user2 240K 105G 104K /user2
rpool/USERDATA/user2@aaa 64K - 104K -
rpool/USERDATA/user2@ccc 64K - 104K -
rpool/USERDATA/user2@ddd 0B - 104K -
rpool/USERDATA/user2_clone 0B 105G 104K /user2
# zfs のプロパティorigin は、どこから作成されたのか表示します
# ファイルシステムとsnap ショットは、VALUE に - と表示されます
$ zfs get origin rpool/USERDATA/user2 rpool/USERDATA/user2@ddd
NAME PROPERTY VALUE SOURCE
rpool/USERDATA/user2 origin - -
rpool/USERDATA/user2@ddd origin - -
# cloneでは、元になったsnapshot名がVALUEに表示されます
$ zfs get origin rpool/USERDATA/user2_clone
NAME PROPERTY VALUE SOURCE
rpool/USERDATA/user2_clone origin rpool/USERDATA/user2@ddd -
上記で作成iしたuser2_clone
は、読み書き可能なファイルシステムとして、/user2_clone
にマウントされています。
ZFS promote
zfs promote は、cloneとcloneされた元のファイルシステムと置き換えるコマンドです。promoteコマンドは、origin元のファイルシステムにしか変更できません。
# user2_clone を promoteします。promote先はoriginのファイルシステムになります。
$ sudo zfs promote rpool/USERDATA/user2_clone
# zfs listをみると、snapshotが user2_clone になっていることが分かります。
$ zfs list -r -t all rpool/USERDATA| grep user2
rpool/USERDATA/user2 0B 105G 104K /user2
rpool/USERDATA/user2_clone 240K 105G 104K /user2
rpool/USERDATA/user2_clone@aaa 64K - 104K -
rpool/USERDATA/user2_clone@ccc 64K - 104K -
rpool/USERDATA/user2_clone@ddd 0B - 104K -
# user2とuser2_cloneのプロパティを見ると、user2_cloneがマウントされています。
$ zfs get canmount,mountpoint rpool/USERDATA/user2 rpool/USERDATA/user2_clone
NAME PROPERTY VALUE SOURCE
rpool/USERDATA/user2 canmount on default
rpool/USERDATA/user2 mountpoint /user2 inherited from rpool/USERDATA
rpool/USERDATA/user2_clone canmount noauto local
rpool/USERDATA/user2_clone mountpoint /user2 local
$ ls /user2/
aaa ccc ddd eee
一度promoteしたクローンを元のファイルシステムに戻すことも、別のクローンに切り替えることも可能です。
# 別のsnapshotからcloneを作成し、promoteする
$ sudo zfs clone -o canmount=noauto -o mountpoint=/user2 rpool/USERDATA/user2@ccc rpool/USERDATA/user2_clone2
$ sudo zfs promote rpool/USERDATA/user2_clone2
$ zfs list -r -t all rpool/USERDATA| grep user2
rpool/USERDATA/user2 128K 105G 104K /user2
rpool/USERDATA/user2@ddd 56K - 104K -
rpool/USERDATA/user2_clone 0B 105G 104K /user2
rpool/USERDATA/user2_clone2 168K 105G 104K /user2
rpool/USERDATA/user2_clone2@aaa 64K - 104K -
rpool/USERDATA/user2_clone2@ccc 0B - 104K -
# originalにpromoteする
$ sudo zfs promote rpool/USERDATA/user2
$ zfs list -r -t all rpool/USERDATA| grep user2
rpool/USERDATA/user2 296K 105G 104K /user2
rpool/USERDATA/user2@aaa 64K - 104K -
rpool/USERDATA/user2@ccc 64K - 104K -
rpool/USERDATA/user2@ddd 56K - 104K -
rpool/USERDATA/user2_clone 0B 105G 104K /user2
rpool/USERDATA/user2_clone2 0B 105G 104K /user2
$ zfs get canmount,mountpoint rpool/USERDATA/user2 rpool/USERDATA/user2_clone rpool/USERDATA/user2_clone2
NAME PROPERTY VALUE SOURCE
rpool/USERDATA/user2 canmount on default
rpool/USERDATA/user2 mountpoint /user2 inherited from rpool/USERDATA
rpool/USERDATA/user2_clone canmount noauto local
rpool/USERDATA/user2_clone mountpoint /user2 local
rpool/USERDATA/user2_clone2 canmount noauto local
rpool/USERDATA/user2_clone2 mountpoint /user2 local
grub2 におけるブートイメージのclone使用
Ubuntu20.04では、aptによるパッケージの追加が発生したとき、自動的にスナップショットを作成します。カーネルバージョンアップのときには /bootもスナップショットを取ります。
$ zfs list -r -t all rpool/ROOT/ubuntu_gytpxh | grep -v -e 'var' -e usr -e srv
NAME USED AVAIL REFER MOUNTPOINT
rpool/ROOT/ubuntu_gytpxh 12.3G 105G 3.43G /
rpool/ROOT/ubuntu_gytpxh@autozsys_m43y9p 573M - 3.42G -
rpool/ROOT/ubuntu_gytpxh@autozsys_2d1snk 75.0M - 2.94G -
rpool/ROOT/ubuntu_gytpxh@autozsys_gi17jr 72.0M - 2.93G -
rpool/ROOT/ubuntu_gytpxh@autozsys_473ebm 128M - 2.99G -
rpool/ROOT/ubuntu_gytpxh@autozsys_tjvqj7 65.3M - 2.93G -
rpool/ROOT/ubuntu_gytpxh@autozsys_uwohyx 191M - 3.07G -
rpool/ROOT/ubuntu_gytpxh@autozsys_dph7x7 57.2M - 3.16G -
rpool/ROOT/ubuntu_gytpxh@autozsys_56z8sw 149M - 3.01G -
rpool/ROOT/ubuntu_gytpxh@autozsys_fvsv6z 165M - 3.23G -
rpool/ROOT/ubuntu_gytpxh@autozsys_44zuvc 71.8M - 3.38G -
rpool/ROOT/ubuntu_gytpxh@autozsys_5n1b5k 132M - 2.99G -
rpool/ROOT/ubuntu_gytpxh@autozsys_d8liap 445M - 3.21G -
rpool/ROOT/ubuntu_gytpxh@autozsys_3m2v81 267M - 3.32G -
rpool/ROOT/ubuntu_gytpxh@autozsys_hiebiz 71.9M - 3.26G -
rpool/ROOT/ubuntu_gytpxh@autozsys_y9ptfq 80.7M - 3.27G -
rpool/ROOT/ubuntu_gytpxh@autozsys_r49x5h 70.3M - 3.27G -
rpool/ROOT/ubuntu_gytpxh@autozsys_ie5ufj 143M - 3.35G -
rpool/ROOT/ubuntu_gytpxh@autozsys_a4o8kn 57.7M - 3.49G -
rpool/ROOT/ubuntu_gytpxh@autozsys_cim4dj 477M - 3.67G -
ZFS bootでのgrub2選択画面、以下のようになっています。
通常通り、カーネルバージョンを選択してブートこともできます。
zfs bootの場合、grub2のメニューに「History for Ubuntu20.04.02 LTS」という項目が増えています。これを選択すると以下のように日付が表示されています。これは、自動的に作成したsnapshotを指します。
ここで、ひとつ下のスナップショットを選択します。
すると、systemのみを戻すか、user dataも戻すかを選択します。今回は、systemのみを選択します。
通常通りブートしすると、zfs listは以下のようになります。
通常ブート時と差分を取ると、bpool/BOOT/ubuntu_gytpxh
以下のスナップショットが、bpool/BOOT/ubuntu_wda9kl
に移っています。つまり、指定したsnapshotからcloneが自動生成し、promoteした状態でブートします。
clone (ubuntu_wda9kl )とorigin (ubuntu_wda9kl)の違いは以下のようになります。
なお、grubでスナップショットを指定した場合、次の再起動後もこのcloneを使い続けます。元に戻したいときは、以下のようにgrun2から元のスナップショットを選択してください。
終わりに
今回は、ZFSクローンを使用したリカバリ方法について説明しました。ZFSクローンとそのpromoteは、アプリケーション更新したときに問題が発生した場合に、簡単に前のバージョンに戻すことが可能になります。次回はZFSのshare機能について説明します。次回をお楽しみに。
さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス