前回はLXCでサポートされているストレージバックエンドのうち,
今回も引き続きLXCがサポートしているストレージバックエンドを使ったLXCの使用方法を紹介していきます。
今回はBtrfsをストレージバックエンドとして使う場合を取り上げましょう。なお,
Btrfsをストレージバックエンドとして使う場合の準備
BtrfsをLXCコンテナのストレージバックエンドとして使う場合には準備が必要です。
当然,
$ sudo apt-get install btrfs-tools (Btrfs用のツールをインストール) $ sudo mkfs -t btrfs /dev/vdc1 (Btrfsファイルシステムの作成)
ここの例ではパーティション/dev/
をBtrfs用に利用しています。
LXC 1. 0系列を使う場合の準備
LXC 1.lxc-snapshot
コマンドを使ってコンテナのスナップショットを作成する場合に必要です。lxc-snapshot
を使わないのであれば特に以下で紹介する操作は不要です。
lxc-snapshot
コマンドは,/var/
の場合は/var/
以下に保存されます。
たとえばコンテナ名がct01
の場合,/var/
以下に保存されます。
Btrfsでその領域のスナップショットを保存するにはスナップショット先も同じボリューム上になくてはいけませんので,/var/
を独立したBtrfsでマウントしているような場合は/var/
へスナップショットを保存できません。
そこで/var/
と/var/
を同じBtrfs配下のサブボリュームとして準備しておく必要があります。
$ sudo mount /dev/vdc1 /mnt (作成したBtrfsを一旦/mntにマウント) $ cd /mnt $ sudo btrfs sub create lxc (lxcという名前でサブボリュームを作成) $ sudo btrfs sub create lxcsnaps (lxcsnapsという名前でサブボリュームを作成) $ sudo mkdir /var/lib/lxcsnaps (lxcsnapsディレクトリの作成) $ sudo mount -o subvol=lxc /dev/vdc1 /var/lib/lxc (サブボリュームlxcを/var/lib/lxcにマウント) $ sudo mount -o subvol=lxcsnaps /dev/vdc1 /var/lib/lxcsnaps (サブボリュームlxcsnapsを/var/lib/lxcsnapsにマウント)
上記の例では/dev/
に作成したファイルシステムを一旦/mnt
にマウントしたあとで,lxc
とlxcsnaps
を作成しています。
そして,/var/
と/var/
が存在しますので,/var/
以下のサブボリュームを/var/
にスナップショットできます。
マウントできることが確認できたら,/etc/
に記述しておきましょう。
$ echo "/dev/vdc1 /var/lib/lxc btrfs subvol=lxc 0 0" \ > | sudo tee -a /etc/fstab /dev/vdc1 /var/lib/lxc btrfs subvol=lxc 0 0 $ echo "/dev/vdc1 /var/lib/lxcsnaps btrfs subvol=lxcsnaps 0 0" \ > | sudo tee -a /etc/fstab /dev/vdc1 /var/lib/lxcsnaps btrfs subvol=lxcsnaps 0 0
これでホストOSをリブートしても/var/
と/var/
がマウントされますね。
$ cat /proc/mounts | grep lxc /dev/vdc1 /var/lib/lxc btrfs rw,relatime,space_cache 0 0 /dev/vdc1 /var/lib/lxcsnaps btrfs rw,relatime,space_cache 0 0
LXC 1. 1系列の場合
上記で説明したLXC 1.lxc-snapshot
を使った場合のスナップショットの保存場所が,
たとえば,/var/
で,ct01
の場合は/var/
以下にスナップショットが保存されるようになりました。
この仕様だと,/var/
がBtrfsであるだけで良いですね。
ただし,/var/
が存在する場合は,
Btrfsを使ったコンテナの作成
準備ができたところでコンテナを作ってみましょう。作成はこの連載のこれまでに何度も出てきた操作と同じでlxc-create
コマンドを使い,-B
オプションにbtrfs
を指定します。
$ sudo lxc-create -t download -n btrfs01 -B btrfs -- -d ubuntu -r trusty -a amd64
このように作成すると,
$ sudo btrfs sub list /var/lib/lxc | grep btrfs01 ID 264 gen 57 top level 259 path btrfs01/rootfs
サブボリュームにコンテナイメージが保存されますので,
このため,
コンテナの設定に特にBtrfsであることがわかる記述はありません。これは少し不便かも知れませんね。
$ sudo grep -v '^#' /var/lib/lxc/btrfs01/config lxc.include = /usr/share/lxc/config/ubuntu.common.conf lxc.arch = x86_64 lxc.rootfs = /var/lib/lxc/btrfs01/rootfs lxc.utsname = btrfs01 lxc.network.type = veth lxc.network.flags = up lxc.network.link = lxcbr0 lxc.network.hwaddr = 00:16:3e:e2:fc:35
コンテナを保存する場所がBtrfsであっても,lxc-create
コマンドで-B btrfs
を指定しないと普通のディレクトリバックエンドとなってしまいますので注意が必要です。
$ sudo lxc-create -t download -n ct01 -- -d ubuntu -r trusty -a amd64 (-B btrfsなしでコンテナを作成) $ sudo btrfs sub list /var/lib/lxc (ct01のrootfsはサブボリュームになっていない) ID 259 gen 69 top level 5 path lxc ID 260 gen 69 top level 5 path lxcsnaps ID 264 gen 66 top level 259 path btrfs01/rootfs
前回の表1で紹介した"best"を-B
オプションに与えるとBtrfs,ZFS,LVM,ディレクトリの順に試してくれますので,-B best
でlxc-create
を実行すると良いかも知れませんね。
$ sudo lxc-create -t download -n ct01 -B best -- -d ubuntu -r trusty -a amd64 (-B bestを指定してコンテナを作成) $ sudo btrfs sub list /var/lib/lxc | grep ct01 ID 266 gen 74 top level 259 path ct01/rootfs (←rootfsがサブボリュームになっている)
以上のように自動的に適切なストレージバックエンドを使ってコンテナを作成してくれます。