Intelligente Lösungen
in neuer Dimension

LXC: Speicherplatz

Ich habe ein paar Linux-Server im Einsatz, die diverse LXC-Container ausführen. Die LXC-Container laufen in einem speziellen Plattenbereich, der mit BTRFS formatiert ist. Leider kann man nur schwer erkennen, wie voll der Plattenbereich ist. Hier beschreibe ich, wie ich das erkenne und wie ich den Plattenbereich vergrößere.

Standard-Plattenbereiche

Grundsätzlich schaue ich mit den Füllstand der Plattenbereiche der Server ja an mit df -h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@sb35 ~ # df -h
Filesystem              Size  Used Avail Use% Mounted on
udev                     16G     0   16G   0% /dev
tmpfs                   3.2G  1.2M  3.2G   1% /run
/dev/mapper/vg0-root     20G  6.9G   12G  38% /
tmpfs                    16G     0   16G   0% /dev/shm
tmpfs                   5.0M     0  5.0M   0% /run/lock
tmpfs                    16G     0   16G   0% /sys/fs/cgroup
/dev/loop0               98M   98M     0 100% /snap/core/10583
/dev/loop1               56M   56M     0 100% /snap/core18/1944
/dev/loop3               56M   56M     0 100% /snap/core18/1932
/dev/loop5               98M   98M     0 100% /snap/core/10577
/dev/loop4               72M   72M     0 100% /snap/lxd/18772
/dev/mapper/vg0-backup  492G   73M  467G   1% /backup
/dev/md0                487M  102M  360M  23% /boot
tmpfs                   1.0M     0  1.0M   0% /var/snap/lxd/common/ns
/dev/loop6               72M   72M     0 100% /snap/lxd/18884
tmpfs                   3.2G     0  3.2G   0% /run/user/0

Leider erkennt man hier icht den Bereich, in dem die LXC-Container abliegen!

LXC-Plattenbereiche

1
2
3
4
5
6
7
8
9
10
11
12
root@sb35 ~ # lxc storage list
+---------+-------------+--------+--------------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |                SOURCE                | USED BY |
+---------+-------------+--------+--------------------------------------+---------+
| default |             | btrfs  | 1307d017-6705-4e1f-af2c-99f8ee25f3cc | 16      |
+---------+-------------+--------+--------------------------------------+---------+

root@sb35 ~ # lxc storage list --format csv|cut -f1 -d,|while read s; do ( echo "$s"; lxc storage info $s|grep -E "^\s*(space|total) "|cut -f2 -d:)|tr "\n" ","|sed -e "s/,$/\n/"; done
default, 31.65GB, 53.69GB

root@sb35 ~ # lxc storage list --format csv|cut -f1,4 -d,|tr "," " "|while read s b; do ( echo "$s,$b"; blkid|grep "$b"|cut -f1 -d:)|tr "\n" ","; done|sed -e "s/,$/\n/"
default,1307d017-6705-4e1f-af2c-99f8ee25f3cc,/dev/mapper/vg0-lxd

Mit diesen Kommandos sehe ich, dass ich:

  • einen Plattenbereich eingebunden habe in LXC: default
  • dieser grob zu zwei Dritteln voll ist: 30 von 50 GB
  • die zugehörige Gerätedatei diese ist: /dev/mapper/vg0-lxd

Vergrößern

Ich möchte den Plattenbereich vergrößern von 50 GB auf 60 GB:

1
2
3
4
5
6
7
8
9
10
11
12
13
root@sb35 ~ # lvextend -L 60G /dev/mapper/vg0-lxd
  Size of logical volume vg0/lxd changed from 50.00 GiB (12800 extents) to 60.00 GiB (15360 extents).
  Logical volume vg0/lxd successfully resized.

root@sb35 ~ # mount /dev/mapper/vg0-lxd /mnt

root@sb35 ~ # btrfs filesystem resize max /mnt
Resize '/mnt' of 'max'

root@sb35 ~ # umount /mnt

root@sb35 ~ # lxc storage list --format csv|cut -f1 -d,|while read s; do ( echo "$s"; lxc storage info $s|grep -E "^\s*(space|total) "|cut -f2 -d:)|tr "\n" ","|sed -e "s/,$/\n/"; done
default, 31.66GB, 64.42GB

Mit diesem Verfahren hat der Ablauf geklappt! Anderswo beschriebene Abläufe wie bspw. nsenter -t $(pgrep daemon.start) -m -- btrfs filesystem resize max /var/snap/lxd/common/lxd/storage-pools/default klappen bei mir nicht, weil in dem dabei aktivierten Namespace das Programm btrfs nicht verfügbar ist.

Skript: lxc-storage.sh

1
2
3
4
5
#!/bin/sh
(
echo "name,source,device,used,total"
lxc storage list --format csv|cut -f1,4 -d,|tr "," " "|while read s b; do ( echo "$s,$b"; blkid|grep "$b"|cut -f1 -d:; lxc storage info $s|grep -E "^\s*(space|total) "|cut -f2 -d:|tr -d " ")|tr "\n" ","; done|sed -e "s/,$/\n/"
)|column -t -s,

Beispielausführung:

1
2
3
root@sb35 ~ # ./lxc-storage.sh
name     source                                device               used     total
default  1307d017-6705-4e1f-af2c-99f8ee25f3cc  /dev/mapper/vg0-lxd  32.08GB  64.42GB

Links und Referenzen

Historie und Anmerkung

  • 2021-01-16: Skript lxc-storage.sh
  • 2021-01-14: Erste Version