lxc storage を btrfs のサブボリュームから
参考資料を見ながら、lxc の storage をbtrfs のサブボリュームで作ることにした。
全体の流れ
- btrfs のストレージを用意する
- ストレージを接続する
- btrfs でフォーマットする。
- btrfs をマウントする
- btrfs でサブボリュームを作る
- サブボリュームをlxc のストレージ保存場所に
mount --bind
する。 - lxc にストレージとして認識させる。
できれば lxd init の実行前にやっておくと無難。
btrfs のストレージを作ってサブボリュームを作る
btrfs で初期化する。
sudo mkfs.btrfs -f /dev/sda1
btrfs をマウントする
sudo btrfs check /dev/sda1 sudo mkdir /mnt/8ce1230a sudo mount /dev/sda1 /mnt/8ce1230a
btrfs のサブボリュームを作る(サブボリュームにはマウントが必須)
sudo btrfs subvolume create /mnt/8ce1230a/LXC-pool0
btrfsのボリュームとサブボリュームを snap/lxd にマウント ( bind )
takuya@ubuntu:/etc/systemd/system$ sudo btrfs subvolume list /mnt/8ce1230a ID 256 gen 12 top level 5 path LXC ID 257 gen 84 top level 5 path LXC-pool0
コマンドからサブボリュームを作成しマウントできた。あとは設定を書いて起動時に行うようにする。
マウント設定を書く。
マウント設定は、fstab でもいいのだけど、lxd が起動する直前のタイミングでマウントをしたいので、今回はsystemdに書いた。
$ cat <<'EOF' | sudo tee /etc/systemd/system/mnt-8ce1230a.mount [Unit] Description=External USB Ssd Storage Before=snap.lxd.daemon.service [Mount] What=/dev/disk/by-uuid/8ce1230a-xxxx-xxxx-xxxx-xxxxxxx Where=/mnt/8ce1230a Type=btrfs [Install] WantedBy=multi-user.target RequiredBy=snap.lxd.daemon.service
マウント設定を有効にしてマウントする
sudo systemctl enable mnt-8ce1230a.mount
systemd のマウント設定は、マウントするPATH名がファイル名になることが必須なので注意。
bind 設定も合わせて書く。
lxd がもともと使っている disks フォルダそのものをマウントしてしまったほうが楽だろうということで。
また、このbindのマウントの前にbind元になる/mnt/ のマウント後実行したい。ので順番を意識してunitsファイルを書く。
$ cat <<'EOF' | sudo tee /etc/systemd/system/var-snap-lxd-common-lxd-disks.mount [Unit] Description=External Storage for LXD After=usb-ssd.mount Before=snap.lxd.daemon.service [Mount] What=/mnt/8ce1230a/LXC Where=/var/snap/lxd/common/lxd/disks Options=bind [Install] WantedBy=multi-user.target [Install] WantedBy=multi-user.target RequiredBy=snap.lxd.daemon.service EOF
有効にしてマウント。
sudo systemctl enable var-snap-lxd-common-lxd-disks.mount
マウントできた
これで、2つのマウントが完成した。
/dev/sda1 on /mnt/8ce1230a type btrfs (rw,relatime,ssd,space_cache,subvolid=5,subvol=/) /dev/sda1 on /var/snap/lxd/common/lxd/disks type btrfs (rw,relatime,ssd,space_cache,subvolid=256,subvol=/LXC)
lxd を初期化する。
lxd を初期化する
lxd init
ここでサブボリュームで指定した lxd のパスを入れてあげればいい。すでに、初期化している場合でも再初期化すればいい。
ストレージ追加で使う場合
ストレージ追加で使う場合は、次の通り
lxc storage create pool0 btrfs source=/mnt/8ce1230a/LXC-pool0
サブボリュームをsourceを指定すればいい。
lxc storage create pool0 btrfs source=/mnt/8ce1230a/LXC-pool0 lxc profile show default lxc profile device set default root pool=pool0
初期化済みの場合、デフォルト・プロファイルの設定がlxd init で定義されたストレージを使うようになっているため、いったんプロファイルを別に作成してdefaultを削除して作り直してもよさそう。
ストレージ作成
lxc storage create pool0 btrfs source=/mnt/8ce1230a/LXC-pool0
takuya@ubuntu:~$ lxc storage list +---------+-------------+--------+--------------------------------------------+---------+ | NAME | DESCRIPTION | DRIVER | SOURCE | USED BY | +---------+-------------+--------+--------------------------------------------+---------+ | default | | btrfs | /var/snap/lxd/common/lxd/disks/default.img | 1 | +---------+-------------+--------+--------------------------------------------+---------+ | pool0 | | btrfs | /mnt/8ce1230a/LXC-pool0 | 0 | +---------+-------------+--------+--------------------------------------------+---------+
ストレージ切り替え
takuya@ubuntu:~$ lxc profile device set default root pool=pool0
結果
takuya@ubuntu:~$ lxc storage list +---------+-------------+--------+--------------------------------------------+---------+ | NAME | DESCRIPTION | DRIVER | SOURCE | USED BY | +---------+-------------+--------+--------------------------------------------+---------+ | default | | btrfs | /var/snap/lxd/common/lxd/disks/default.img | 0 | +---------+-------------+--------+--------------------------------------------+---------+ | pool0 | | btrfs | /mnt/8ce1230a/LXC-pool0 | 1 | +---------+-------------+--------+--------------------------------------------+---------+