Барко barco - это проект, над которым я работал, чтобы узнать больше о контейнерах Linux и ядра Linux, основанном на других гидах в Интернете. Контейнеры Linux состоит из набора функций ядра Linux:
namespaces : используются для группировки объектов ядра в различные наборы, к которым можно получить доступ к конкретным деревьям процесса. Например, существуют различные типы namespaces , то пространство имен PID используется для выделения дерева процессов, в то время как пространство имен network используется для изоляции стека сети.seccomp : используется для ограничения системных вызовов, которые может сделать процесс (обрабатывается через Syscalls)capabilities : используются для установки пределов на то, что может делать UID 0 (корень) (обрабатывается через Syscalls)cgroups : используются для ограничения ресурсов (например, память, диск ввода/вывода, CPU-TME), которые может использовать процесс (обрабатывается через CGROUPFS) barco может быть использован для запуска bin/sh . из каталога / root (-u 0) со следующей командой (необязательно -v для вывода словесного индекса):
$ 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 требует установки ряда инструментов и библиотек для создания проекта и для разработки.
# Install all required tooling and dependencies
$ sudo apt install -y make
$ make setup barco зависит от следующих «нестандартных» библиотек:
libseccomp : используется для настройки фильтров Seccomplibcap : используется для установки возможностей контейнераlibcuni1 : используется для тестирования с CUNIT barco использует ряд инструментов на основе LLVM-18 для разработки, личинга, форматирования, отладки и Valgrind для проверки утечек памяти.
Включенный Makefile предоставляет несколько целей для построения barco . Variable debug=1 может быть установлен для запуска любой из целей в режиме «отладки», который создает проект с символами отладки и без оптимизации (особенно полезно для отладчика и 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 разработан с использованием кода Visual Studio и Github Codespaces. Репозиторий содержит все необходимые файлы конфигурации для эффективного использования этих инструментов. barco полагается на низкоуровневые функции Linux, поэтому он должен быть запущен в системе Linux. Github Codepaceces действует странно, когда настраивая настройки контейнеров низкого уровня: я обнаружил, что Getutm.App хорошо работает с Debian на моем Mac, когда сомневается.
Включенный Makefile предоставляет несколько целей, полезных для разработки:
# Run tests
$ make test
# Run linter
$ make lint
# Run formatter
$ make format
# Run valgrind
$ make check
# Clean the build
$ make clean Кроме того, barco включает в root конфигурацию кода Visual Studio в .vscode/
Проект структурирован следующим образом:
├── .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.mdНа данный момент проект не содержит никаких автоматических тестов или инструментов для документирования кода. В будущем могут быть добавлены подходящие инструменты для автоматического тестирования и документации.
barco была протестирована на Debian 12, запустив ядро Linux в версии 6.1.0, с пространствами имен пользователей и CGROUPSV2.
barco не обрабатывает пространства имен сети, поэтому контейнер не может получить доступ к сети. Сеть может быть примерно настройка следующим образом:
В C это обычно делается через интерфейс rtnetlink . Кроме того, использование сети может быть ограничено контроллером CGROUP net_prio .
cgroups.c , mount.c , sec.c , user.c специфичны для barco и должны быть более общими Некоторые из ресурсов, которые использовались для разработки barco :