バルコbarco 、インターネット上の他のガイドに基づいて、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)としての/ディレクトリから(verbose出力のオプション-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 、開発、糸くず、フォーマット、デバッグ、Valgrindのために多くのLLVM-18ベースのツールを使用して、メモリリークをチェックします。
付属の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 CodeSpacesは、低レベルのコンテナ設定を微調整するときに奇妙に動作します。私は、疑わしいときに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/のビジュアルスタジオコード構成が含まれています。これは、組み込みデバッガーの実行に使用できます(現時点では、 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開発に使用されたリソースの一部は次のとおりです。