LXCFS est un petit système de fichiers de fusible écrit avec l'intention de faire en sorte que les conteneurs Linux se sentent plus comme une machine virtuelle. Il a commencé comme un projet latéral de LXC mais est utilisable par tout temps d'exécution.
LXCFS s'occupera que les informations fournies par les fichiers cruciaux dans procfs tels que:
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime
/proc/slabinfo
/sys/devices/system/cpu/online
Les conteneurs sont conscients de telle sorte que les valeurs affichées (par exemple dans /proc/uptime ) reflètent vraiment la durée du conteneur et non la durée de l'hôte.
Avant la mise en œuvre des espaces de noms CGROUP par Serge Hallyn LXCFS a également fourni une arborescence cgroupfs à jour. Il a pris soin que le conteneur n'avait accès qu'aux CGROUPS sous ses propres CGROUP et assurait ainsi une sécurité supplémentaire. Pour les systèmes sans prise en charge des espaces de noms CGROUP, LXCFS fournira toujours cette fonctionnalité, mais il est principalement considéré comme obsolète.
LXCFS sans redémarrage LXCFS est divisé en bibliothèque partagée (un module Libtool, pour être précis) liblxcfs et un simple lxcfs binaire. Lors de la mise à niveau vers une version plus récente de LXCFS , le binaire lxcfs ne sera pas redémarré. Au lieu de cela, il détectera qu'une nouvelle version de la bibliothèque partagée est disponible et la rechargera à l'aide de dlclose(3) et dlopen(3) . Cette conception a été choisie de sorte que la boucle principale de fusible que LXCFS utilise ne devra pas être redémarrée. S'il s'agissait, tous les conteneurs utilisant LXCFS devraient être redémarrés car ils seraient autrement laissés avec des supports de fusible cassés.
Pour forcer un rechargement de la bibliothèque partagée à la prochaine instance possible, envoyez simplement SIGUSR1 au PID du processus LXCFS en cours. Cela peut être aussi simple que de faire:
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
Pour obtenir des mises à niveau lisses via des rechargements de bibliothèque partagés, LXCFS s'appuie également sur le fait que lorsque dlclose(3) abandonne la dernière référence aux destructeurs de bibliothèque partagés exécutés et que dlopen(3) est appelé constructeurs est exécuté. Bien que cela soit vrai pour glibc ce n'est pas vrai pour musl (voir la section Déchargement des bibliothèques.). Les utilisateurs de LXCFS sur musl sont donc invités à redémarrer complètement LXCFS et tous les conteneurs en l'utilisant.
Afin de construire LXCFS installer le fusible et les en-têtes de développement de fusibles en fonction de votre distribution. LXCFS préfère fuse3 mais fonctionne avec des versions fuse2 suffisamment nouvelles:
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/
Pour construire avec des désinfectants, vous devez spécifier -Db_sanitize=... Option à meson setup . Par exemple, pour activer Asan et Ubsan:
meson setup -Dinit-script=systemd --prefix=/usr build/ -Db_sanitize=address,undefined
meson compile -C build/
La commande recommandée pour exécuter LXCFS est:
sudo mkdir -p /var/lib/lxcfs
sudo lxcfs /var/lib/lxcfs
Un runtime de conteneur souhaitant utiliser LXCFS doit ensuite lier le montage des fichiers approbés dans les endroits corrects sur le démarrage du conteneur.
Afin d'utiliser LXCFS avec des conteneurs basés sur Systemd, vous pouvez soit utiliser LXC 1.1, auquel cas il devrait fonctionner automatiquement, soit autrement, ou autrement, copier le lxc.mount.hook et lxc.reboot.hook Files (une fois construit) à partir de cette arborescence vers votre /usr/share/lxcfs de contenant:
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
Dans un système avec swap activé, le paramètre "-u" peut être utilisé pour définir toutes les valeurs dans "meminfo" qui se réfèrent au swap à 0.
sudo lxcfs -u / var / lib / lxcfs
Si vous avez remarqué que LXCFS ne montrait aucun échange dans votre conteneur malgré un échange sur votre système, veuillez lire attentivement cette section et rechercher des instructions sur la façon d'activer la comptabilité d'échange pour votre distribution.
La manipulation du CGROUP SWAP sur Linux est très déroutante et il n'y a tout simplement pas un moyen idéal pour LXCFS de le gérer.
Terminologie utilisée ci-dessous:
memory.usage_in_bytes et memory.limit_in_bytesmemory.memsw.usage_in_bytes et memory.memsw.limit_in_bytesLes principaux problèmes sont:
La comptabilité d'échange est souvent opt-in et nécessite une option de temps de démarrage de noyau spécial ( swapaccount=1 ) et / ou des options de construction de noyau spéciales ( CONFIG_MEMCG_SWAP ).
Une limite de RAM et une limite de RAM + Swap peuvent être définies. Le delta n'est cependant pas l'espace d'échange disponible car le noyau est toujours libre d'échanger autant de RAM qu'il ressemble. Cela rend impossible de rendre une taille de périphérique d'échange car en utilisant le delta entre RAM et RAM + Swap pour cela ne explique pas pour l'échange de noyau plus de pages, conduisant à une utilisation de l'échange dépassant le total du swap.
Il est impossible de désactiver l'échange dans un conteneur donné. Le plus proche qui peut être fait consiste à faire passer la baisse à 0, ce qui limite gravement le risque d'échange de pages mais ne l'élimine pas.
En conséquence, LXCFS a dû faire des compromis qui suivent:
Lorsque la comptabilité d'échange n'est pas activée, aucun espace d'échange n'est signalé. C'est simplement parce qu'il n'y a aucun moyen de connaître la consommation d'échange. Le conteneur peut être très utilisé un échange, il n'y a tout simplement aucun moyen de savoir à quelle part et afficher un dispositif d'échange nécessiterait une utilisation de l'échange à signaler. Affichage de la valeur de l'hôte serait complètement erronée, afficher une valeur 0 serait d'assurance.
Étant donné que l'utilisation de l'échange contre un conteneur donné peut dépasser le delta entre RAM et RAM + Swap, la taille de l'échange est toujours signalée comme étant la plus petite de la limite de Swap RAM + ou le dispositif d'échange hôte lui-même. Cela garantit qu'à aucun moment, l'utilisation de l'échange ne sera autorisée à dépasser la taille de l'échange.
Si le swappacité est réglé sur 0 et qu'il n'y a pas d'utilisation d'échange, aucun échange n'est signalé. Cependant, s'il y a une utilisation d'échange, un dispositif d'échange de la taille de l'utilisation (100% plein) est signalé. Cela fournit des rapports adéquats de la consommation de mémoire tout en empêchant les applications de supposer que plus de swap est disponible.
En cas de crash LXCFS, il peut être extrêmement utile pour nous d'avoir un vidage central de la mémoire de processus LXCFS.
/var/crash et coredumpctl list juste au cas où vous avez déjà un fichier de vidage LXCFS CoreSur la machine où vous exécutez LXCFS, exécutez comme racine:
# 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