Barco barco es un proyecto en el que trabajé para aprender más sobre los contenedores de Linux y el kernel de Linux, basado en otras guías en Internet. Los contenedores de Linux están formados por un conjunto de características del kernel de Linux:
namespaces : se utilizan para agrupar objetos de núcleo en diferentes conjuntos a los que se puede acceder mediante árboles de proceso específicos. Existen diferentes tipos de namespaces , por ejemplo, el espacio de nombres PID se usa para aislar el árbol de proceso, mientras que el espacio de nombres network se usa para aislar la pila de red.seccomp : se utiliza para limitar las llamadas del sistema que puede realizar un proceso (manejado a través de syscalls)capabilities : se utilizan para establecer límites en lo que puede hacer UID 0 (raíz) (manejado a través de syscalls)cgroups : se utilizan para limitar los recursos (por ejemplo, memoria, E/S de disco, CPU-TME) que puede usar un proceso (manejado a través de CGROUPFS) barco se puede usar para ejecutar bin/sh . Desde el directorio / directorio como root (-u 0) con el siguiente comando (opcional -v para salida verbosa):
$ sudo ./bin/barco -u 0 -m / -c /bin/sh -a . [-v]
22:08:41 INFO ./src/barco.c:96: initializing socket pair...
22:08:41 INFO ./src/barco.c:103: setting socket flags...
22:08:41 INFO ./src/barco.c:112: initializing container stack...
22:08:41 INFO ./src/barco.c:120: initializing container...
22:08:41 INFO ./src/barco.c:131: initializing cgroups...
22:08:41 INFO ./src/cgroups.c:73: setting memory.max to 1G...
22:08:41 INFO ./src/cgroups.c:73: setting cpu.weight to 256...
22:08:41 INFO ./src/cgroups.c:73: setting pids.max to 64...
22:08:41 INFO ./src/cgroups.c:73: setting cgroup.procs to 1458...
22:08:41 INFO ./src/barco.c:139: configuring user namespace...
22:08:41 INFO ./src/barco.c:147: waiting for container to exit...
22:08:41 INFO ./src/container.c:43: # ## BARCONTAINER STARTING - type 'exit' to quit ###
# ls
bin home lib32 media root sys vmlinuz
boot initrd.img lib64 mnt run tmp vmlinuz.old
dev initrd.img.old libx32 opt sbin usr
etc lib lost+found proc srv var
# echo "i am a container"
i am a container
# exit
22:08:55 INFO ./src/barco.c:153: freeing resources...
22:08:55 INFO ./src/barco.c:168: so long and thanks for all the fish barco requiere que se instalen una serie de herramientas y bibliotecas para construir el proyecto y para el desarrollo.
# Install all required tooling and dependencies
$ sudo apt install -y make
$ make setup barco depende de las siguientes bibliotecas "no estándar":
libseccomp : se usa para configurar filtros SECCompslibcap : se usa para establecer capacidades de contenedorlibcuni1 : utilizado para probar con cunit barco utiliza una serie de herramientas basadas en LLVM-18 para el desarrollo, pelusa, formato, depuración y valgrind para verificar si hay fugas de memoria.
El Makefile incluido proporciona algunos objetivos para construir barco . La variable debug=1 se puede establecer para ejecutar cualquiera de los objetivos en modo "Depurar", que construye el proyecto con símbolos de depuración y sin optimizaciones (especialmente útil para el depurador y Valgrind).
# Build barco (executable is in bin/)
# The default target also runs, "make lint" and "make format" to lint and format the code
$ make
# Build barco with debug flags
$ make debug=1 barco se desarrolla utilizando el código de Visual Studio y los espacios de códigos GitHub. El repositorio contiene todos los archivos de configuración necesarios para usar estas herramientas de manera efectiva. barco se basa en funciones de Linux de bajo nivel, por lo que debe ejecutarse en un sistema Linux. GitHub CodeSpaces actúa raro a veces cuando ajustando la configuración de contenedores de bajo nivel: encontré que getutm.app funcionó bien con Debian en mi Mac cuando tiene dudas.
El Makefile incluido proporciona algunos objetivos útiles para el desarrollo:
# Run tests
$ make test
# Run linter
$ make lint
# Run formatter
$ make format
# Run valgrind
$ make check
# Clean the build
$ make clean Además, el proyecto incluye una configuración de código de Visual Studio en .vscode/ que se puede usar para ejecutar el depurador incorporado (en este momento está "deshabilitado" ya que barco debe ejecutarse como root y CodellDB no tiene esa opción).
El proyecto está estructurado de la siguiente manera:
├── .devcontainer configuration for GitHub Codespaces
├── .github configuration GitHub Actions and other GitHub features
├── .vscode configuration for Visual Studio Code
├── bin the executable (created by make)
├── build intermediate build files e.g. * .o (created by make)
├── docs documentation
├── include header files
├── lib third-party libraries
├── scripts scripts for setup and other tasks
├── src C source files
│ ├── barco.c (main) Entry point for the CLI
│ └── * .c
├── tests contains tests
├── .clang-format configuration for the formatter
├── .clang-tidy configuration for the linter
├── .gitignore
├── LICENSE
├── Makefile
└── README.mdEn este momento, el proyecto no contiene ninguna prueba o herramienta automatizada para documentar el código. En el futuro, se pueden agregar herramientas adecuadas para pruebas y documentación automatizadas.
barco ha sido probado en Debian 12, ejecutando el kernel de Linux en la versión 6.1.0, con espacios de nombres de usuarios y CGROUPSV2 habilitado.
barco no maneja los espacios de nombres de la red, por lo que el contenedor no puede acceder a la red. Las redes se pueden configurar aproximadamente de la siguiente manera:
En C, esto generalmente se hace a través de la interfaz rtnetlink . Además, el uso de la red puede limitarse con el controlador net_prio CGroup.
cgroups.c , mount.c , sec.c , user.c son específicas de barco y deben hacerse más genéricas Algunos de los recursos que se han utilizado para desarrollar barco son: