Barco barco é um projeto em que trabalhei para aprender mais sobre os contêineres Linux e o kernel Linux, com base em outros guias na Internet. Os contêineres Linux são compostos por um conjunto de recursos do kernel Linux:
namespaces : são usados para agrupar objetos do kernel em diferentes conjuntos que podem ser acessados por árvores de processo específicas. Existem diferentes tipos de namespaces , por exemplo, o espaço para nome PID é usado para isolar a árvore de processos, enquanto o espaço para nome network é usado para isolar a pilha de rede.seccomp : é usado para limitar as chamadas do sistema que um processo pode fazer (tratado via syscalls)capabilities : são usados para definir limites para o que o UID 0 (raiz) pode fazer (tratado via syscalls)cgroups : são usados para limitar os recursos (por exemplo, memória, E/S de disco, CPU-TME) que um processo pode usar (tratado via CGROUPFS) barco pode ser usado para executar bin/sh . Do / diretório como root (-u 0) com o seguinte comando (opcional -v para saída detalhada):
$ 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 exige que várias ferramentas e bibliotecas sejam instaladas para construir o projeto e o desenvolvimento.
# Install all required tooling and dependencies
$ sudo apt install -y make
$ make setup barco depende das seguintes bibliotecas "fora do padrão":
libseccomp : Usado para configurar os filtros Seccomplibcap : usado para definir recursos de contêinerlibcuni1 : usado para testar com CUNIT barco usa várias ferramentas baseadas em LLVM-18 para desenvolvimento, linha, formatação, depuração e Valgrind para verificar se há vazamentos de memória.
O Makefile incluído fornece alguns alvos para construir barco . A variável debug=1 pode ser definida para executar qualquer um dos alvos no modo "Debug", que constrói o projeto com símbolos de depuração e sem otimizações (especialmente úteis para o depurador e 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 é desenvolvido usando o Código do Visual Studio e o Codespaces do Github. O repositório contém todos os arquivos de configuração necessários para usar essas ferramentas de maneira eficaz. barco conta com recursos de linux de baixo nível, para que ele seja executado em um sistema Linux. O Github Codespaces age estranho às vezes quando ajustar as configurações de contêiner de baixo nível: achei o getUtm.App funcionar bem com Debian no meu Mac em dúvida.
O Makefile incluído fornece alguns alvos úteis para o desenvolvimento:
# Run tests
$ make test
# Run linter
$ make lint
# Run formatter
$ make format
# Run valgrind
$ make check
# Clean the build
$ make clean Além disso, o projeto inclui uma configuração de código do Visual Studio no .vscode/ que pode ser usado para executar o depurador interno (neste momento, ele está "desativado", pois barco deve ser executado como root e Codelldb não tem essa opção).
O projeto está estruturado da seguinte maneira:
├── .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.mdNo momento, o projeto não contém testes ou ferramentas automatizadas para documentar o código. No futuro, ferramentas adequadas para testes e documentação automatizadas podem ser adicionadas.
barco foi testado no Debian 12, executando o kernel Linux na versão 6.1.0, com namespaces de usuário e CGROUPSV2 ativado.
barco não lida com namespaces de rede, portanto o contêiner não pode acessar a rede. A rede pode ser configurada como se segue:
Em C, isso geralmente é feito através da interface rtnetlink . Além disso, o uso da rede pode ser limitado com o controlador net_prio CGROUP.
cgroups.c , mount.c , sec.c , user.c são específicas para barco e devem ser tornadas mais genéricas Alguns dos recursos que foram usados para desenvolver barco são: