LXCFS es un pequeño sistema de archivos de fusibles escrito con la intención de hacer que los contenedores de Linux se sientan más como una máquina virtual. Comenzó como un proyecto lateral de LXC , pero es utilizable por cualquier tiempo de ejecución.
LXCFS tendrá cuidado de que la información proporcionada por archivos cruciales en procfs tales como:
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime
/proc/slabinfo
/sys/devices/system/cpu/online
son conscientes del contenedor de tal manera que los valores que se muestran (por ejemplo, en /proc/uptime ) realmente reflejan cuánto tiempo se está ejecutando el contenedor y no cuánto tiempo se está ejecutando el host.
Antes de la implementación de los espacios de nombres CGROUP por Serge Hallyn LXCFS también proporcionó un árbol cgroupfs consciente de contenedor. Se ocupó de que el contenedor solo tuviera acceso a CGROUPS debajo de sus propios CGROUPS y, por lo tanto, proporcionara seguridad adicional. Para sistemas sin soporte para los espacios de nombres de CGROUP, LXCFS aún proporcionará esta característica, pero se considera en su mayoría en desuso.
LXCFS sin reiniciar LXCFS se divide en una biblioteca compartida (un módulo LibTool, para ser precisos) liblxcfs y un lxcfs binario simple. Al actualizar a una versión más nueva de LXCFS el binario lxcfs no se reiniciará. En su lugar, detectará que una nueva versión de la biblioteca compartida está disponible y la recargará usando dlclose(3) y dlopen(3) . Este diseño se eligió para que el bucle principal del fusible que usa LXCFS no necesitará reiniciarse. Si fuera, entonces todos los contenedores que usan LXCFS necesitarían reiniciarse, ya que de otro modo se quedarían con soportes de fusibles rotos.
Para forzar una recarga de la biblioteca compartida en la siguiente instancia posible, simplemente envíe SIGUSR1 al PID del proceso LXCFS en ejecución. Esto puede ser tan simple como hacer:
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
Para lograr actualizaciones sin problemas a través de las recargas de la biblioteca compartida, LXCFS también se basa en el hecho de que cuando dlclose(3) deja caer la última referencia a los destructores de la biblioteca compartida y cuando se ejecutan dlopen(3) se llaman constructores. Si bien esto es cierto para glibc , no es cierto para musl (consulte la sección Descargar bibliotecas). Por lo tanto, se recomienda a los usuarios de LXCFS en musl que reinicie LXCFS por completo y todos los contenedores que lo utilizan.
Para construir LXCFS instalar Fuse y los encabezados de desarrollo de fusibles de acuerdo con su distribución. LXCFS prefiere fuse3 pero funciona con versiones fuse2 lo suficientemente nuevas:
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/
Para construir con desinfectantes, debe especificar -Db_sanitize=... opción para meson setup . Por ejemplo, para habilitar Asan y Ubsan:
meson setup -Dinit-script=systemd --prefix=/usr build/ -Db_sanitize=address,undefined
meson compile -C build/
El comando recomendado para ejecutar LXCFS es:
sudo mkdir -p /var/lib/lxcfs
sudo lxcfs /var/lib/lxcfs
Un tiempo de ejecución de contenedores que desee usar LXCFS debe unir montar los archivos de aprobación en los lugares correctos en el inicio del contenedor.
Para usar LXCFS con contenedores basados en Systemd, puede usar LXC 1.1 en cuyo caso debe funcionar automáticamente, o de otra manera, copiar los archivos lxc.mount.hook y lxc.reboot.hook (una vez construido) desde este árbol a /usr/share/lxcfs , asegúrese de que sea ejecutable, luego agregue las siguientes líneas a la configuración de su contenedor:
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
En un sistema con swap habilitado, el parámetro "-u" se puede usar para establecer todos los valores en "MemInfo" que se refieren al intercambio a 0.
sudo lxcfs -u/var/lib/lxcfs
Si notó que los LXCF no muestran ningún intercambio en su contenedor a pesar de tener un intercambio en su sistema, lea esta sección cuidadosamente y busque instrucciones sobre cómo habilitar el intercambio de contabilidad para su distribución.
Swap CGROUP El manejo en Linux es muy confuso y simplemente no hay una manera perfecta para que los LXCF lo maneje.
Terminología utilizada a continuación:
memory.usage_in_bytes y memory.limit_in_bytesmemory.memsw.usage_in_bytes y memory.memsw.limit_in_bytesLos principales problemas son:
La contabilidad de intercambio a menudo se opta y, que requiere una opción especial de tiempo de arranque del núcleo ( swapaccount=1 ) y/o opciones especiales de compilación del núcleo ( CONFIG_MEMCG_SWAP ).
Se pueden establecer un límite de RAM y un límite de intercambio RAM+. Sin embargo, el Delta no es el espacio de intercambio disponible, ya que el núcleo todavía es libre de intercambiar la mayor parte del RAM como se siente. Esto hace que sea imposible renderizar un tamaño de dispositivo de intercambio, ya que el uso del delta entre RAM y RAM+Swap, para que no explicaría el núcleo de intercambio de más páginas, lo que lleva a un uso de intercambio que excede el total de intercambio.
Es imposible deshabilitar el intercambio en un contenedor determinado. Lo más cercano que se puede hacer es establecer un intercambio a 0, lo que limita severamente el riesgo de intercambiar páginas pero no la elimina.
Como resultado, LXCFS tuvo que hacer algún compromiso que fuera de la siguiente manera:
Cuando la contabilidad de intercambio no está habilitada, no se informa espacio de intercambio. Esto es simplemente porque no hay forma de conocer el consumo de intercambio. Sin embargo, el contenedor puede estar usando mucho intercambio, simplemente no hay forma de saber cuánto y mostrar un dispositivo de intercambio requeriría algún tipo de uso de intercambio. Mostrar el valor del host estaría completamente incorrecto, mostrar un valor 0 sería equivalente.
Debido a que el uso de intercambio para un contenedor dado puede exceder el delta entre RAM y RAM+Swap, siempre se informa que el tamaño de intercambio es el más pequeño del límite de swap RAM+o el dispositivo de intercambio del host. Esto asegura que en ningún momento el uso de intercambio pueda exceder el tamaño de intercambio.
Si el intercambio se establece en 0 y no hay uso de intercambio, no se informa un intercambio. Sin embargo, si hay un uso de intercambio, entonces se informa un dispositivo de intercambio del tamaño del uso (100% lleno). Esto proporciona informes adecuados del consumo de memoria al tiempo que evita que las aplicaciones asuman que hay más intercambio disponible.
En el caso del bloqueo LXCFS, puede ser extremadamente útil para nosotros tener un volcado central de la memoria del proceso LXCFS.
/var/crash y coredumpctl list solo en caso de que ya tenga un archivo de volcado Core LXCFSEn la máquina donde ejecuta LXCFS, ejecute como root:
# 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