巴科barco是一个我努力的项目,旨在根据Internet上的其他指南了解有关Linux容器和Linux内核的更多信息。 Linux容器由一组Linux内核功能组成:
namespaces :用于将内核对象分为不同的集合,这些集合可以通过特定的过程树访问。有不同类型的namespaces ,例如,使用PID名称空间来隔离过程树,而network名称空间则用于隔离网络堆栈。seccomp :用于限制过程可以进行的系统调用(通过syscalls处理)capabilities :用于设置UID 0(root)可以执行的限制(通过syscalls处理)cgroups :用于限制一个过程可以使用的资源(例如内存,磁盘I/O,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 fishbarco需要安装许多工具和库来构建项目和开发。
# Install all required tooling and dependencies
$ sudo apt install -y make
$ make setupbarco取决于以下“非标准”库:
libseccomp :用于设置seccomp过滤器libcap :用于设置容器功能libcuni1 :用于与cunit进行测试barco使用许多基于LLVM-18的工具来开发,覆盖,格式化,调试和Valgrind来检查内存泄漏。
随附的Makefile提供了一些构建barco的目标。可以将变量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=1barco是使用Visual Studio代码和GitHub代码空间开发的。存储库包含有效使用这些工具的所有必要的配置文件。 barco依赖于低级Linux功能,因此必须在Linux系统上运行。 github代码在调整低级容器设置时有时会表现出奇怪的作用:我发现Getutm.App有疑问时可以在Mac上与Debian一起工作。
随附的Makefile提供了一些对开发有用的目标:
# Run tests
$ make test
# Run linter
$ make lint
# Run formatter
$ make format
# Run valgrind
$ make check
# Clean the build
$ make clean此外,该项目在.vscode/中还包括可用于运行内置调试器的Visual Studio代码配置(此刻,它是“禁用”的,因为barco应作为root和CodellDB没有该选项运行)。
该项目的结构如下:
├── .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上进行了测试,并在6.1.0版中运行Linux内核,并启用了用户名称空间和Cgroupsv2。
barco不处理网络名称空间,因此容器无法访问网络。可以大致设置网络,如下所示:
在C中,这通常是通过rtnetlink接口完成的。此外,网络使用情况可能会受到net_prio CGROUP控制器的限制。
cgroups.c , mount.c , sec.c , user.c中的功能是特定于barco的,应使其更通用用于开发barco一些资源是: