Web更新

Ununtuで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選択画面、以下のようになっています。

grub2-01

通常通り、カーネルバージョンを選択してブートこともできます。

grub2-02

zfs bootの場合、grub2のメニューに「History for Ubuntu20.04.02 LTS」という項目が増えています。これを選択すると以下のように日付が表示されています。これは、自動的に作成したsnapshotを指します。

grub2-03

ここで、ひとつ下のスナップショットを選択します。

grub2-04

すると、systemのみを戻すか、user dataも戻すかを選択します。今回は、systemのみを選択します。

grub2-05

通常通りブートしすると、zfs listは以下のようになります。

zfs_list_02

通常ブート時と差分を取ると、bpool/BOOT/ubuntu_gytpxh以下のスナップショットが、bpool/BOOT/ubuntu_wda9klに移っています。つまり、指定したsnapshotからcloneが自動生成し、promoteした状態でブートします。

clone (ubuntu_wda9kl )とorigin (ubuntu_wda9kl)の違いは以下のようになります。

zfs_list_01

なお、grubでスナップショットを指定した場合、次の再起動後もこのcloneを使い続けます。元に戻したいときは、以下のようにgrun2から元のスナップショットを選択してください。

grub2-06

終わりに

今回は、ZFSクローンを使用したリカバリ方法について説明しました。ZFSクローンとそのpromoteは、アプリケーション更新したときに問題が発生した場合に、簡単に前のバージョンに戻すことが可能になります。次回はZFSのshare機能について説明します。次回をお楽しみに。

さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス

関連記事一覧