barco barco est un projet sur lequel j'ai travaillé pour en savoir plus sur les conteneurs Linux et le noyau Linux, basé sur d'autres guides sur Internet. Les conteneurs Linux sont constitués par un ensemble de caractéristiques du noyau Linux:
namespaces : sont utilisés pour regrouper les objets du noyau dans différents ensembles qui peuvent être accessibles par des arbres de processus spécifiques. Il existe différents types d' namespaces , par exemple, l'espace de noms PID est utilisé pour isoler l'arborescence de processus, tandis que l'espace de noms network est utilisé pour isoler la pile de réseau.seccomp : est utilisé pour limiter les appels système qu'un processus peut effectuer (géré via des systèmes)capabilities : sont utilisées pour fixer des limites à ce que UID 0 (racine) peut faire (manipulé via des systèmes)cgroups : sont utilisés pour limiter les ressources (par exemple la mémoire, les E / S de disque, CPU-TME) qu'un processus peut utiliser (géré via CGroupFS) barco peut être utilisé pour exécuter bin/sh . à partir / répertoire en tant que root (-u 0) avec la commande suivante ( -v optionnel pour la sortie verbeux):
$ 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 nécessite un certain nombre d'outils et de bibliothèques à installer pour construire le projet et pour le développement.
# Install all required tooling and dependencies
$ sudo apt install -y make
$ make setup barco dépend des bibliothèques "non standard" suivantes:
libseccomp : Utilisé pour configurer les filtres SecComplibcap : utilisé pour définir des capacités de conteneurlibcuni1 : utilisé pour tester avec CUNIT barco utilise un certain nombre d'outils basés sur LLVM-18 pour le développement, la libellés, le formatage, le débogage et le valgrind pour vérifier les fuites de mémoire.
Le Makefile inclus fournit quelques cibles pour construire barco . La variable debug=1 peut être définie pour exécuter l'une des cibles en mode "Debug", qui construit le projet avec des symboles de débogage et sans optimisations (particulièrement utiles pour le débogueur et 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 est développé à l'aide du code Visual Studio et de GitHub Codespaces. Le référentiel contient tous les fichiers de configuration nécessaires pour utiliser ces outils efficacement. barco s'appuie sur les fonctionnalités Linux de bas niveau, il doit donc être exécuté sur un système Linux. GitHub Codespaces agit parfois bizarre lors de la peaufinage des paramètres de conteneurs de bas niveau: j'ai trouvé que Getutm.App fonctionne bien avec Debian sur mon Mac en cas de doute.
Le Makefile inclus fournit quelques objectifs utiles pour le développement:
# Run tests
$ make test
# Run linter
$ make lint
# Run formatter
$ make format
# Run valgrind
$ make check
# Clean the build
$ make clean De plus, le projet comprend une configuration de code Visual Studio dans .vscode/ qui peut être utilisée pour exécuter le débogueur intégré (en ce moment, il est "désactivé" car barco doit être exécuté car root et CodellDB n'ont pas cette option).
Le projet est structuré comme suit:
├── .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.mdPour le moment, le projet ne contient aucun test ou outils automatisé pour documenter le code. À l'avenir, des outils appropriés pour les tests automatisés et la documentation pourraient être ajoutés.
barco a été testé sur Debian 12, exécutant le noyau Linux à la version 6.1.0, avec des espaces de noms d'utilisateurs et CGROUPSV2 activés.
barco ne gère pas les espaces de noms de réseau, donc le conteneur ne peut pas accéder au réseau. Le réseautage peut être configuré à peu près comme suit:
En C, cela se fait généralement via l'interface rtnetlink . De plus, l'utilisation du réseau peut être limitée avec le contrôleur net_prio CGroup.
cgroups.c , mount.c , sec.c , user.c sont spécifiques à barco et doivent être rendues plus génériques Certaines des ressources qui ont été utilisées pour développer barco sont: