第521回から紹介しているLXD 3.
LXDコンテナのバックアップとリストア
LXDはシステムコンテナです。つまりDockerコンテナのように不変
今そこにあるLXDコンテナが、
ただし実験目的でちょっと作ったコンテナにそこまで手間をかけていられないかもしれません。また
そこでLXDでは、
- 停止中のコンテナを他のホストへ移動するマイグレーション機能
- 停止中のコンテナを他のホストへ複製するコピー機能
- 稼働中のコンテナをステートレスに保存するスナップショット機能
- 稼働中のコンテナをステートフルに保存するスナップショット機能
- スナップショットされたコンテナをリストアする機能
- スナップショットをベースイメージとしてエクスポートする機能
- ベースイメージをインポートする機能
- クラスタとして構成されたLXDホスト間でイメージを同期する機能
- 稼働中のコンテナを他のホストへ移動するライブマイグレーション機能
(実験的な機能)
今回はこのスナップショットを利用したバックアップとリストア、
今回もUbuntu 18.
LXDのスナップショット機能
コンテナのスナップショットを取る方法は至極簡単です。まずは適当なコンテナを作っておきます。
$ lxc launch ubuntu:18.04 kasumi Creating kasumi Starting kasumi $ lxc info kasumi Name: kasumi Remote: unix:// (中略) Resources: (中略) lo: Bytes received: 1.02kB Bytes sent: 1.02kB Packets received: 12 Packets sent: 12
lxc info
はスナップショット作成後との比較のために表示しています。
さて、lxc snapshot コンテナ名 スナップショット名
」
$ lxc snapshot kasumi arisa $ lxc info kasumi (中略) Snapshots: arisa (taken at 2019/06/16 08:24 UTC) (stateless)
コンテナの情報にスナップショットが追記されていることがわかりますね。
さっそく作ったスナップショットをリストアしてみましょう。リストアされたことがわかるよう、
$ lxc exec kasumi touch /home/ubuntu/snap0 $ lxc exec kasumi ls /home/ubuntu/ snap0 $ lxc exec kasumi uptime 09:02:37 up 2:49, 1 user, load average: 0.07, 0.04, 0.00
最後のuptimeは、
実はLXDの普通のリストアは、
一時的であれコンテナが停止すると困る場合は、--stateful
」
リストアはlxc restore コンテナ名 スナップショット名
」
$ lxc restore kasumi arisa $ lxc exec kasumi ls /home/ubuntu/ $ lxc exec kasumi uptime 09:11:56 up 0 min, 0 users, load average: 1.19, 0.30, 0.09
先ほど作成したsnap0が、
LXDコンテナはシステムコンテナとは言え、
スナップショットの削除はコンテナの削除と同様にlxc delete
」
$ lxc delete kasumi/arisa
ちなみにLXD 3.
コンテナのバックアップ
スナップショット機能はコンテナのバックアップにも利用できます。
具体的にはコンテナのルートファイルシステムをアーカイブしたい場合、
まずは先ほどと同様にkasumiコンテナベースで、
$ lxc exec kasumi touch /home/ubuntu/snap1 $ lxc exec kasumi ls /home/ubuntu/ snap1 $ lxc snapshot kasumi rimi
次にスナップショットをコンテナイメージに変換します。コンテナイメージはインスタンスを作る際のベースイメージです。ベースイメージは別のコンテナインスタンスを作る際にも利用できます。たとえばLXDホストで初めてコンテナを作る際は、
$ lxc publish kasumi/rimi --alias rimi Container published with fingerprint: a859c8bb8d9e88f542dc1eb94757498745deffbaa0fdea8e2a0cbfa3cc1e0f89
コンテナイメージの作成にはlxc pulbish コンテナ名
」
また--alias
」
実際に作成されたイメージを確認しましょう。
$ lxc image list +-------+--------------+--------+---------------------------------------------+--------+----------+-------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +-------+--------------+--------+---------------------------------------------+--------+----------+-------------------------------+ | rimi | a859c8bb8d9e | no | | x86_64 | 223.23MB | Jun 16, 2019 at 11:09am (UTC) | +-------+--------------+--------+---------------------------------------------+--------+----------+-------------------------------+ | | c234ecee3baa | no | ubuntu 18.04 LTS amd64 (release) (20190604) | x86_64 | 177.97MB | Jun 15, 2019 at 12:06pm (UTC) | +-------+--------------+--------+---------------------------------------------+--------+----------+-------------------------------+
「c234ecee3baa」
もちろん新しく作ったコンテナイメージをベースに新しいコンテナを作ることも可能です。
$ lxc launch rimi tae Creating tae Starting tae $ lxc exec tae ls /home/ubuntu/ snap1
taeコンテナには最初からsnap1ファイルが作られていますね。このようにコンテナ・
次は先ほど作ったコンテナをアーカイブにしてしまいましょう。
$ lxc image export rimi rimi_archive Image exported successfully!
アーカイブ化のコマンドはlxc image export イメージ名 アーカイブ名
」
$ ls -lh rimi_archive.tar.gz -rw-rw-r-- 1 shibata shibata 224M 6月 16 20:28 rimi_archive.tar.gz
内容はルートファイルシステムをただtar.
systemd-nspawnで使用する
たとえば第491回で紹介しているような、
$ mkdir rimi $ sudo tar xvf rimi_archive.tar.gz -C rimi/ $ ls rimi metadata.yaml rootfs templates $ sudo apt install systemd-container $ sudo systemd-nspawn -b --network-bridge=lxdbr0 -D rimi/rootfs/ Spawning container rootfs on /home/shibata/rimi/rootfs. Press ^] three times within 1s to kill container. (中略) Ubuntu 18.04.2 LTS kasumi console kasumi login:
「--network-bridge=lxdbr0
」
さて、
方法はいくつかあるのですが、
$ ssh-import-id -o rimi/rootfs/home/ubuntu/.ssh/authorized_keys gh:m-shibata
「gh:m-shibata」-o
」/etc/
」
起動したコンテナのIPアドレスはmachinectlコマンドで確認できます。
$ sudo machinectl MACHINE CLASS SERVICE OS VERSION ADDRESSES rootfs container systemd-nspawn ubuntu 18.04 10.174.119.197… 1 machines listed.
あとはubuntu@10.
」
もしログインしていない環境からシャットダウンしたいなら、
$ sudo machinectl poweroff rootfs
他のLXDインスタンスで利用する
アーカイブ化したコンテナイメージは、
$ lxc image import rimi_archive.tar.gz Image imported with fingerprint: a859c8bb8d9e88f542dc1eb94757498745deffbaa0fdea8e2a0cbfa3cc1e0f89 $ lxc image list +-------+--------------+--------+------------------------------------+--------+----------+------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +-------+--------------+--------+------------------------------------+--------+----------+------------------------------+ | | a859c8bb8d9e | no | Ubuntu 18.04 LTS server (20190604) | x86_64 | 223.23MB | Jun 16, 2019 at 2:00pm (UTC) | +-------+--------------+--------+------------------------------------+--------+----------+------------------------------+
これだけですね。もちろんpublishのときと同じように--alias
」
ちなみにイメージをアーカイブしたLXDインスタンスでは、
LXDコンテナのマイグレーション
単純にあるLXDホストで動いているコンテナを、
まず対象のホストのうちいずれか1台のLXDコンテナのリモートアクセスを有効化します。今回のようなマイグレーションの場合は、
remote$ lxc config set core.https_address "[::]" remote$ lxc config set core.trust_password NANIKA_PASSWORD remote$ lxc info | grep certificate_fingerprint certificate_fingerprint: 35dd575685cb4cd6474527e3b3b146edb36ba58c15552498cf99acb992b1934e
「core.
」[::]
」:443
」
「core.
」
最後に表示しているのはリモートホストの証明書のフィンガープリントです。クライアント側から接続する際に正しいリモートに接続しようとしているかを確認する際に使用します。
クライアント側は、lxc remote add
」
client$ lxc remote add saya saya.example.com Certificate fingerprint: 35dd575685cb4cd6474527e3b3b146edb36ba58c15552498cf99acb992b1934e ok (y/n)? y Admin password for saya: Client certificate stored at server: saya
「Certificate fingerprint」
リモートLXDは
client$ lxc info saya: config: core.https_address: '[::]' core.trust_password: true (中略) storage_version: "4.4" server_clustered: false server_name: ubuntu-nuc project: ""
さっそくリモートのコンテナをコピーしてみましょう。今回はコールドマイグレーションなので、
リモート側のkasumiコンテナの停止 client$ lxc stop saya:kasumi client$ lxc list saya: +--------+---------+-----------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +--------+---------+-----------------------+----------------------------------------------+------------+-----------+ | kasumi | STOPPED | | | PERSISTENT | 1 | +--------+---------+-----------------------+----------------------------------------------+------------+-----------+ | tae | RUNNING | 10.174.119.235 (eth0) | fd42:d66a:76d:c9a8:216:3eff:fe49:3b67 (eth0) | PERSISTENT | 0 | +--------+---------+-----------------------+----------------------------------------------+------------+-----------+ リモートからローカルへkasumiコンテナをコピー client$ lxc copy saya:kasumi kasumi client$ lxc info kasumi (中略) Snapshots: rimi (taken at 2019/06/16 11:07 UTC) (stateless)
スナップショットごと移動されていることがわかりますね。copyコマンドはさまざまなオプションを渡すことで、lxc copy -h
」
copyコマンドはコピー元にコンテナを残します。もしコピー元からコンテナを残したくない場合は、
LXDのライブマイグレーション
第459回の最後でも紹介したように、
ライブマイグレーション機能を有効化するには、
$ sudo apt install criu
snapパッケージ版のLXDを利用している場合は、
$ sudo snap set lxd criu.enable=true $ sudo snap restart lxd
上記はローカルとリモート両方で設定しておいてください。
また、lxc network show lxdbr0
」lxc network edit lxdbr0
」
実際にsayaで動いているtaeコンテナをローカルにマイグレーションしてみましょう。
client$ lxc list saya:tae +------+---------+-----------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+---------+-----------------------+----------------------------------------------+------------+-----------+ | tae | RUNNING | 10.174.119.235 (eth0) | fd42:d66a:76d:c9a8:216:3eff:fe49:3b67 (eth0) | PERSISTENT | 0 | +------+---------+-----------------------+----------------------------------------------+------------+-----------+ client$ lxc move saya:tae tae
これで本来はマイグレーション完了なはずです。はずではあるのですが、
ライブマイグレーションを実施するには、
なお、