それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

LXC のストレージサイズ変更(拡張・縮小)する。

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