前回までで、
LVMを使ったコンテナに対するlxc-snapshotコマンドの実行
loopを紹介する前に、lxc-snapshot
コマンドの実行について補足しておきます。
lxc-snapshot
は第9回で説明したように、
実は、lxc-snapshot
コマンドは実行できません。実行すると以下のようにエラーとなります。
$ sudo lxc-create -n lvm01 -t download -B lvm --fstype ext4 -- -d ubuntu -a amd64 -r trusty (LVMを使ったコンテナの作成) :(略) You just created an Ubuntu container (release=trusty, arch=amd64, variant=default) :(略) $ sudo lxc-snapshot -n lvm01 ( lxc_container: lxccontainer.c: lxcapi_snapshot: 2888 lvm01's backing store cannot be backed up. lxc_container: lxccontainer.c: lxcapi_snapshot: 2889 Your container must use another backing store type. lxc_container: lxc_snapshot.c: do_snapshot: 55 Error creating a snapshot
これは、lxc-snapshot
の実行が無効化されているのが理由です。以前、lxc-snapshot
コマンドが正常に動作しない問題が発見されたためです。修正が行われた後に再度有効にされる予定ですが、lxc-snapshot
コマンドを活用してコンテナを運用する場合は注意しましょう。
LVMをストレージバックエンドとして使って、lxc-clone
を使うなど、
loopストレージバックエンドを使ったコンテナの作成
さて、
loopは文字通りループバックデバイスのことで、
現時点ではloopを使う場合も、
$ dpkg-query -s lxc | grep Version Version: 1.0.7+stable~20150225-0206-0ubuntu1~trusty
loopを使った場合にクローンが失敗する問題は、
まずはloopストレージバックエンドで使えるオプションを見てみましょう。
オプション | オプションの説明 | デフォルト値 |
---|---|---|
--fstype | ファイル内に作成するファイルシステム名 | ext3 |
--fssize | 作成するファイルのサイズ | 1G |
実は1.
筆者が送ったパッチがマージされたので1.
それではlxc-create
コマンドで-B loop
を指定してコンテナを作成してみましょう。
$ sudo lxc-create -n loop1 -B loop -t download -- -d ubuntu -r trusty -a amd64 :(略) You just created an Ubuntu container (release=trusty, arch=amd64, variant=default) :(略) $ sudo lxc-ls loop1
作成できました。まずは設定ファイルを見ておきましょう。
$ sudo cat /var/lib/lxc/loop1/config | grep -v '^#' lxc.include = /usr/share/lxc/config/ubuntu.common.conf lxc.arch = x86_64 lxc.rootfs = loop:/var/lib/lxc/loop1/rootdev lxc.utsname = loop1 lxc.network.type = veth lxc.network.flags = up lxc.network.link = lxcbr0 lxc.network.hwaddr = 00:16:3e:8d:1c:3c
loopを使う場合は、lxc.
に"loop:"に続けてファイルのフルパスを記述します。上記の例でもlxc.
がloop:/var/
となっていますね。それ以外は普通のコンテナと変わりありません。
$ sudo ls -l /var/lib/lxc/loop1/rootdev -rw------- 1 root root 1073741825 Mar 10 17:53 /var/lib/lxc/loop1/rootdev
/var/
を見ると、
$ sudo mount -o loop /var/lib/lxc/loop1/rootdev /mnt (ループバックデバイスとしてマウント) $ cat /proc/mounts | grep /mnt (マウント情報をチェック) /dev/loop0 /mnt ext3 rw,relatime,data=ordered 0 0 $ ls /mnt bin dev home lib64 media opt root sbin sys usr boot etc lib lost+found mnt proc run srv tmp var
ファイル内部はext3になっていますね。マウントしたディレクトリを見てみると、
アンマウントしてからコンテナを起動します。
$ sudo umount /mnt $ sudo lxc-start -n loop1 -d $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ------------------------------------------ loop1 RUNNING 10.0.3.87 - NO
起動しました。さっそくコンテナ内でマウントの様子を見てみましょう。
$ sudo lxc-attach -n loop1 -- cat /proc/mounts :(略) /dev/loop7 / ext3 rw,relatime,data=ordered 0 0 :(略) $ sudo lxc-attach -n loop1 -- df -h Filesystem Size Used Avail Use% Mounted on /dev/loop7 976M 384M 541M 42% / :(略)
/dev/
が/
次にオプションを指定してコンテナを作成してみましょう。ファイルシステムはbtrfs、
$ sudo lxc-create -n loop2 -t download -B loop --fstype=btrfs --fssize=2G \ > -- -d ubuntu -r trusty -a amd64 (オプションを指定してコンテナの作成) :(略) You just created an Ubuntu container (release=trusty, arch=amd64, variant=default) :(略) $ sudo ls -l /var/lib/lxc/loop2/rootdev (ファイルサイズの確認) -rw------- 1 root root 2147483649 Mar 10 18:13 /var/lib/lxc/loop2/rootdev $ sudo lxc-start -n loop2 -d (コンテナの起動) $ sudo lxc-ls -f (コンテナの起動を確認) NAME STATE IPV4 IPV6 AUTOSTART ------------------------------------------- loop1 STOPPED - - NO loop2 RUNNING 10.0.3.139 - NO $ sudo lxc-attach -n loop2 -- cat /proc/mounts | grep loop (コンテナ内のマウントの確認) /dev/loop7 / btrfs rw,relatime,space_cache 0 0 $ sudo lxc-attach -n loop2 -- df -h | grep loop (コンテナ内のマウントとサイズの確認) /dev/loop7 2.0G 385M 1.5G 21% /
2GBでファイルが作られ、
なお、-B loop
を指定してlxc-create
でコンテナを作成した場合に作成されるファイルの名前はrootdev
で固定のようです。
loopストレージバックエンドを使ったコンテナのクローンとスナップショット
loopストレージバックエンドを使った場合、
$ sudo lxc-clone -o loop1 -n loop2 Created container loop2 as copy of loop1
ファイルをコピーしますので少し時間がかかります。
$ sudo ls -lF /var/lib/lxc/loop2 total 445452 -rw-r--r-- 1 root root 1475 Mar 16 16:35 config -rw------- 1 root root 1073741825 Mar 16 16:35 rootdev drwxr-xr-x 2 root root 4096 Mar 16 16:34 rootfs/
以上のようにコンテナイメージ用のファイルがコピーされ、rootfs
ディレクトリ、
クローンしたコンテナの設定ファイルはinclude
を使わない形で作成されます。設定内容はlxc.
が新しいコンテナ用に変わっているだけです。
$ sudo grep rootfs /var/lib/lxc/loop2/config lxc.rootfs = loop:/var/lib/lxc/loop2/rootdev
lxc-snapshot
を使ったコンテナのバックアップについてもクローンと同様にコピーを使います。実行するたびにコンテナイメージ用のファイルがコピーされ、
$ sudo lxc-snapshot -n loop2 (スナップショットを取得) $ sudo lxc-snapshot -n loop2 -L (スナップショットの一覧を表示) snap0 (/var/lib/lxcsnaps/loop2) 2015:03:17 17:32:36 (取得できている) $ sudo ls -lF /var/lib/lxcsnaps/loop2/snap0/ (スナップショットのディレクトリの表示) total 445448 -rw-r--r-- 1 root root 1486 Mar 17 17:32 config -rw------- 1 root root 1073741825 Mar 17 17:32 rootdev drwxr-xr-x 2 root root 4096 Mar 17 17:32 rootfs/ -rw-r--r-- 1 root root 19 Mar 17 17:32 ts
まとめ
今回はストレージバックエンドとしてloopを使った場合のコンテナの作成、
紹介した通り非常にシンプルなストレージバックエンドです。lxc-create
でloopを指定してコンテナを作成するより、
LXC 1.1.1
今回の記事を執筆中にLXC 1.
バグフィックスが中心で、
ここしばらく、