LXC のストレージサイズが足りない。
LXC のストレージのりサイズをなんとかしたいです。容量不足になって困らないようにしたい。調べました。
lxdのリサイズはストレージのフォーマットに従う。
バックエンドのストレージにbtrfs を使っていたら btrfs の手法。LVMならLVMを使う。
今回は、btrfs をリサイズして、縮小(shrink)と拡張(expand)を試す。
lxd のbtrfsを拡大する場合
全体の流れはこんな感じになります。
lxc storage list lxc storage info bt01 truncate -s +10G /var/snap/lxd/common/lxd/disks/bt01.img losetup -c /dev/loop6 mount /dev/loop6 /mnt btrfs filesystem resize max /mnt btrfs filesystem show lxc storage list lxc storage info bt01
lxd のストレージ一覧
ストレージ一覧から、拡大したいストレージを調べます。
takuya@lxd-host:~$ lxc storage list +---------+-------------+--------+--------------------------------------------+---------+ | NAME | DESCRIPTION | DRIVER | SOURCE | USED BY | +---------+-------------+--------+--------------------------------------------+---------+ | bt01 | | btrfs | /var/snap/lxd/common/lxd/disks/bt01.img | 3 | +---------+-------------+--------+--------------------------------------------+---------+ | bt02 | | btrfs | /var/snap/lxd/common/lxd/disks/bt02.img | 0 | +---------+-------------+--------+--------------------------------------------+---------+ | default | | zfs | /var/snap/lxd/common/lxd/disks/default.img | 13 | +---------+-------------+--------+--------------------------------------------+---------+
このコマンドで、ストレージのファイル名とフォーマットが確認できる。
今回は、btrfs のbt01 が容量が足りないので、容量を割り当てる。
念の為に、増加前の容量を確認しておく。
lxc storage info bt01
bt01 / btrfs 増加させる。
bt01 は btrfs で作成しているので、btrfs のやり方に従う。
ファイルを増量させる
割当ファイルのサイズをtruncate で増加させる。
takuya@lxd-host:~$ truncate -s +70G /var/snap/lxd/common/lxd/disks/bt01.img
loop デバイスを確認
takuya@lxd-host:~$ losetup | grep bt /dev/loop6 0 0 1 0 /var/snap/lxd/common/lxd/disks/bt01.img 0 512 /dev/loop7 0 0 1 0 /var/snap/lxd/common/lxd/disks/bt02.img 0 512
lxd のストレージはループデバイスにブロックデバイス接続されているので、ループデバイスのファイル名(番号)を確認。
loopデバイスにファイルの増量を検知させる。
losetup -c で loop デバイスを更新し、ファイルの容量を反映する。
takuya@lxd-host:~$ losetup -c /dev/loop6
(2022-05-14) 追記
追加容量反映はlxc stop でコンテナ停止が必要。ストレージを利用しているコンテナが起動していると容量反映がうまくいかないことがある。停止なし容量追加でうまくいくこともあるのだが・・・
マウント
takuya@lxd-host:~$ mount /dev/loop6 /mnt
btrfs の resize が、マウントポイントへ行われるらしいのでマウントする。
btrfs を容量変更(最大に)
btrfs filesystem コマンドを使ってデバイス空き容量の最大値までファイルシステムを拡張する。
takuya@lxd-host:~$ btrfs filesystem resize max /mnt Resize 'mnt' of 'max'
もしマウントしてなかったら
マウントをせずに、直接ブロックデバイスへ操作しようとしてもエラーになった。ちょっと不思議。マウントが必要な理由はよくわからない。
losetup で デバイスファイルをloop デバイスから確認して、そのデバイスを mount して、いったん /mnt に持ってくる。 その上でないと、 btrfs の filesystem resize が動かない。
takuya@lxd-host:~$ btrfs filesystem resize max /dev/loop6 ERROR: resize works on mounted filesystems and accepts only directories as argument. Passing file containing a btrfs image would resize the underlying filesystem instead of the image.
リサイズ(拡張)結果を確認する。
btrfsのファイルシステムが拡張されたことを確認する。
takuya@lxd-host:~$ btrfs filesystem show Label: 'bt01' uuid: 6d9a8707-3766-4561-99c5 Total devices 1 FS bytes used 59.97GiB devid 1 size 170.00GiB used 95.13GiB path /dev/loop6 Label: 'bt02' uuid: 7c4aca0a-e942-4fa5-abef Total devices 1 FS bytes used 384.00KiB devid 1 size 50.00GiB used 2.02GiB path /dev/loop7
LXD/lxc で認識されたことを確認する。
lxc storgate info を使って、btrfsのファイルシステム拡張がlxd側で確認できる。
takuya@lxd-host:~$ lxc storage info bt01 info: description: "" driver: btrfs name: bt01 space used: 65.24GB total space: 171.80GB used by: images: - afcfbe9e40d27eb91cfbabf240823186d instances: - lxd-guest - vps
lxd の仮想マシン内部から確認する。
lxdのコンテナから、容量が増えていることを確認する。
root@lxd-guest:/var/www/virtualhosts# df -h Filesystem Size Used Avail Use% Mounted on /dev/loop6 170G 66G 103G 40% /
縮小するときは
縮小はほぼ同じ。truncate で負数指定が変わるくらい。
truncate -10G /path/to/storgage
(2022-05-14) 拡張は、truncate -> btrfs resize の順、縮小はbtrfs resize -> truncate の順。
Snap版とapt版の違い
snap 版は /var/snap/lxd/common/lxd/disks
apt 版は /var/lib/lxd/disks/
とファイルの格納場所が異なる。
まとめ
lxd でのストレージはbtrfs では、手軽にサイズ変更できる。
ゲスト(コンテナ)の終了しなくても良かった。強い。
truncate コマンド便利。
参考資料
https://linuxcontainers.org/lxd/docs/master/storage#btrfs
https://discuss.linuxcontainers.org/t/snap-lxd-resize-default-btrfs-storage-pool/2587