LXCFS ist ein kleines Sicherungs -Dateisystem, das geschrieben wurde, mit der Absicht, Linux -Container eher wie eine virtuelle Maschine zu fühlen. Es begann als Nebenprojekt von LXC , ist jedoch von jeder Laufzeit verwendet.
LXCFs achten darauf, dass die Informationen, die von wichtigen Dateien in procfs bereitgestellt werden, wie:
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime
/proc/slabinfo
/sys/devices/system/cpu/online
Sind Container so bewusst, dass die angezeigten Werte (z. B. in /proc/uptime ) wirklich widerspiegeln, wie lange der Container ausgeführt wird und nicht wie lange der Host läuft.
Vor der Implementierung von CGroup -Namespaces von Serge Hallyn LXCFS bot auch einen Container cgroupfs -Baum. Es wurde darauf geachtet, dass der Container nur Zugang zu CGroups unter seinen eigenen CGroups hatte und somit zusätzliche Sicherheit bietet. Für Systeme ohne Unterstützung für CGroup -Namespaces liefert LXCFS diese Funktion weiterhin, wird jedoch hauptsächlich als veraltet angesehen.
LXCFS ohne Neustart LXCFS wird in eine gemeinsame Bibliothek (ein LIBTOOL -Modul, genauer gesagt) liblxcfs und ein einfaches binäres lxcfs aufgeteilt. Beim Upgrade auf eine neuere Version von LXCFS wird die lxcfs -Binärdatei nicht neu gestartet. Stattdessen wird festgestellt, dass eine neue Version der freigegebenen Bibliothek verfügbar ist und sie mit dlclose(3) und dlopen(3) neu lädt. Dieses Design wurde so ausgewählt, dass die Sicherungs -Hauptschleife, die LXCFS verwendet, nicht neu gestartet werden muss. Wenn dies der Fall wäre, müssten alle Behälter mit LXCFS neu gestartet werden, da sie sonst mit gebrochenen Sicherungshalterungen übrig bleiben würden.
Um ein Nachladen der gemeinsam genutzten Bibliothek nach dem nächsten möglichen Instanz zu erzwingen, senden Sie SIGUSR1 einfach an den PID des laufenden LXCFS -Prozesss. Dies kann so einfach sein wie:
rm /usr/lib64/lxcfs/liblxcfs.so # MUST to delete the old library file first
cp liblxcfs.so /usr/lib64/lxcfs/liblxcfs.so # to place new library file
kill -s USR1 $(pidof lxcfs) # reload
Um reibungslose Upgrades durch gemeinsame Bibliotheks neu zu laden, beruht LXCFS auch darauf, dass, wenn dlclose(3) den letzten Hinweis auf die gemeinsam genutzten Bibliothekszerstörer abfällt und wenn dlopen(3) als Konstruktoren bezeichnet wird, ausgeführt wird. Dies gilt zwar für glibc , gilt zwar nicht für musl (siehe Abschnitt Entladen Bibliotheken). Daher werden Benutzern von LXCFS auf musl empfohlen, LXCFS vollständig neu zu starten und alle Container zu verwenden.
Um LXCFs zu erstellen, installieren Sie die Sicherungsfuse und die Sicherungsentwicklungsheader nach Ihrer Distribution. LXCFS bevorzugt fuse3 , funktioniert jedoch mit neuen fuse2 -Versionen:
git clone git://github.com/lxc/lxcfs
cd lxcfs
meson setup -Dinit-script=systemd --prefix=/usr build/
meson compile -C build/
sudo meson install -C build/
Um mit Desinfektionsmittel zu bauen, müssen Sie -Db_sanitize=... Option zum meson setup angeben. Zum Beispiel, um Asan und Ubsan zu ermöglichen:
meson setup -Dinit-script=systemd --prefix=/usr build/ -Db_sanitize=address,undefined
meson compile -C build/
Der empfohlene Befehl zum Ausführen von LXCFS lautet:
sudo mkdir -p /var/lib/lxcfs
sudo lxcfs /var/lib/lxcfs
Eine Container -Laufzeit, die LXCFS verwenden möchte, sollte dann die Aufladungsdateien an die richtigen Stellen beim Container -Start binden.
Um LXCFs mit systemd-basierten Containern zu verwenden, können Sie entweder LXC 1.1 verwenden. In diesem Fall sollte es automatisch funktionieren, oder anderweitig kopieren Sie die lxc.mount.hook und lxc.reboot.hook -Dateien (nach dem Erstellen) von diesem Baum zu /usr/share/lxcfs : addieren Sie die folgenden Zeilen zu Ihrer entsprechenden Konfiguration: addieren Sie die folgenden Zeilen zu Ihrer entsprechenden Konfiguration: addieren Sie die folgenden Zeilen zu Ihrer entsprechenden Konfiguration: addieren Sie zu Ihrer entsprechenden Konfiguration.
lxc.mount.auto = cgroup:mixed
lxc.autodev = 1
lxc.kmsg = 0
lxc.include = /usr/share/lxc/config/common.conf.d/00-lxcfs.conf
docker run -it -m 256m --memory-swap 256m
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw
-v /var/lib/lxcfs/proc/slabinfo:/proc/slabinfo:rw
-v /var/lib/lxcfs/sys/devices/system/cpu:/sys/devices/system/cpu:rw
ubuntu:18.04 /bin/bash
In einem System mit aktiviertem SWAP kann der Parameter "-U" verwendet werden, um alle Werte in "meminfo" einzustellen, die sich auf den Swap auf 0 beziehen.
sudo lxcfs -u/var/lib/lxcfs
Wenn Sie festgestellt haben, dass LXCFs trotz des Swaps in Ihrem System keinen Swap in Ihrem Container angezeigt, lesen Sie diesen Abschnitt sorgfältig und suchen Sie nach Anweisungen zum Swap -Bilanzierung Ihrer Verteilung.
Das Handling mit CGGroup auf Linux ist sehr verwirrend und es gibt einfach keine perfekte Möglichkeit für LXCFs, damit umzugehen.
Die unten verwendete Terminologie:
memory.limit_in_bytes memory.usage_in_bytesmemory.memsw.usage_in_bytes memory.memsw.limit_in_bytesDie Hauptprobleme sind:
Die Swap-Accounting wird häufig angelegt und eine spezielle Option für Kernel-Startzeit ( swapaccount=1 ) und/oder spezielle Kernel-Build-Optionen ( CONFIG_MEMCG_SWAP ) erforderlich.
Sowohl ein RAM -Limit als auch ein RAM+Swap -Limit können festgelegt werden. Das Delta ist jedoch nicht der verfügbare Austauschraum, da der Kernel immer noch frei von dem RAM tauscht, wie er sich anfühlt. Dies macht es unmöglich, eine Swap -Gerätegröße zu rendern, da das Delta zwischen RAM und RAM+Swap dafür verwendet wird, dass der Kernel -Austausch nicht berücksichtigt wird, was zu einer Swap -Nutzung führt, die den Swap -Gesamtbetrag überschreitet.
Es ist unmöglich, den Swap in einem bestimmten Behälter zu deaktivieren. Das Nahen, was getan werden kann, ist, den Swappiness auf 0 zu setzen, wodurch das Risiko, Seiten auszutauschen, aber nicht beseitigt, es aber nicht beseitigt.
Infolgedessen mussten LXCFs Kompromisse eingehen, die wie folgt gehen:
Wenn die Swap -Buchhaltung nicht aktiviert ist, wird überhaupt kein Swap -Platz gemeldet. Dies liegt einfach daran, dass es keine Möglichkeit gibt, den Tauschverbrauch zu kennen. Der Container kann jedoch sehr viel Tausch verwenden. Es gibt nur keine Möglichkeit, zu wissen, wie viel davon und das Anzeigen eines Tauschgeräts eine Art Tauschverbrauch erfordern, um gemeldet zu werden. Das Anzeigen des Host -Werts wäre völlig falsch und es wäre gleich falsch, einen 0 -Wert zu zeigen.
Da die Swap -Verwendung für einen bestimmten Behälter das Delta zwischen RAM und RAM+Swap überschreiten kann, wird immer berichtet, dass die Swap -Größe das kleinere RAM+-Swap -Limit oder das Host -Swap -Gerät selbst ist. Dies stellt sicher, dass die Nutzung der Swape zu keinem Zeitpunkt die Swap -Größe überschreiten darf.
Wenn der Swappiness auf 0 gesetzt ist und es keine Tauschverwendung gibt, wird kein Tausch gemeldet. Wenn jedoch die Swap -Nutzung vorliegt, wird ein Swap -Gerät der Größe der Verwendung (100% voll) gemeldet. Dies liefert eine angemessene Berichterstattung über den Speicherverbrauch und verhindern, dass Anwendungen davon ausgehen, dass mehr Swap verfügbar ist.
Im Falle eines LXCFS -Absturzes kann es für uns äußerst nützlich sein, einen Kernpolster des LXCFS -Prozessspeichers zu haben.
/var/crash und coredumpctl list für den Fall, wenn Sie bereits eine LXCFS -Core -Dump -Datei habenFühren Sie auf der Maschine, auf der Sie LXCFs ausführen, als Root aus:
# save an old core_pattern setting value:
cat /proc/sys/kernel/core_pattern > /root/core_pattern.old_value.bak
# set a new one to collect all core dumps:
echo '|/bin/sh -c $@ -- eval exec gzip --fast > /var/crash/core-%e.%p.gz' > /proc/sys/kernel/core_pattern
# wait for the next LXCFS crash and check
ls -lah /var/crash
# there should be a file with a name like "core-lxcfs.80581.gz". Please, upload it somewhere and share with us.
# restore the old "core_pattern" value:
cat /root/core_pattern.old_value.bak > /proc/sys/kernel/core_pattern