Barco barco adalah proyek yang saya kerjakan untuk mempelajari lebih lanjut tentang wadah Linux dan kernel Linux, berdasarkan panduan lain di internet. Wadah Linux dibuat oleh satu set fitur kernel Linux:
namespaces : digunakan untuk mengelompokkan objek kernel ke dalam set berbeda yang dapat diakses oleh pohon proses tertentu. Ada berbagai jenis namespaces , misalnya, namespace PID digunakan untuk mengisolasi pohon proses, sedangkan namespace network digunakan untuk mengisolasi tumpukan jaringan.seccomp : digunakan untuk membatasi panggilan sistem yang dapat dilakukan suatu proses (ditangani melalui syscall)capabilities : digunakan untuk menetapkan batasan pada apa yang dapat dilakukan UID 0 (root) (ditangani melalui syscalls)cgroups : digunakan untuk membatasi sumber daya (misalnya memori, disk I/O, CPU-TME) yang dapat digunakan suatu proses (ditangani melalui Cgroupfs) barco dapat digunakan untuk menjalankan bin/sh . Dari / direktori sebagai root (-u 0) dengan perintah berikut (opsional -v untuk output verbose):
$ 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 membutuhkan sejumlah alat dan perpustakaan untuk diinstal untuk membangun proyek dan untuk pengembangan.
# Install all required tooling and dependencies
$ sudo apt install -y make
$ make setup barco tergantung pada perpustakaan "non-standar" berikut:
libseccomp : Digunakan untuk mengatur filter SECCOMPlibcap : digunakan untuk mengatur kemampuan kontainerlibcuni1 : digunakan untuk pengujian dengan cunit barco menggunakan sejumlah alat berbasis LLVM-18 untuk pengembangan, linting, pemformatan, debugging, dan Valgrind untuk memeriksa kebocoran memori.
Makefile yang disertakan menyediakan beberapa target untuk membangun barco . Variabel debug=1 dapat diatur untuk menjalankan salah satu target dalam mode "Debug", yang membangun proyek dengan simbol debug dan tanpa optimisasi (terutama berguna untuk debugger dan 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 dikembangkan menggunakan kode Visual Studio dan Github Codespaces. Repositori berisi semua file konfigurasi yang diperlukan untuk menggunakan alat -alat ini secara efektif. barco mengandalkan fitur Linux tingkat rendah, sehingga harus dijalankan pada sistem Linux. Github Codespaces bertindak aneh pada saat-saat ketika mengubah pengaturan wadah tingkat rendah: Saya menemukan getutm.app untuk bekerja dengan baik dengan Debian di Mac saya ketika diragukan.
Makefile yang disertakan memberikan beberapa target yang berguna untuk pengembangan:
# Run tests
$ make test
# Run linter
$ make lint
# Run formatter
$ make format
# Run valgrind
$ make check
# Clean the build
$ make clean Selain itu, proyek ini mencakup konfigurasi kode studio visual di .vscode/ yang dapat digunakan untuk menjalankan debugger bawaan (pada saat ini "dinonaktifkan" karena barco harus dijalankan sebagai root dan codellDB tidak memiliki opsi itu).
Proyek ini disusun sebagai berikut:
├── .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.mdSaat ini, proyek tidak berisi tes atau alat otomatis untuk mendokumentasikan kode. Di masa depan, alat yang cocok untuk pengujian dan dokumentasi otomatis dapat ditambahkan.
barco telah diuji pada Debian 12, menjalankan kernel Linux di versi 6.1.0, dengan namespaces pengguna dan CGROUPSV2 diaktifkan.
barco tidak menangani ruang nama jaringan, sehingga wadah tidak dapat mengakses jaringan. Jaringan dapat secara kasar diatur sebagai berikut:
Dalam C ini biasanya dilakukan melalui antarmuka rtnetlink . Selain itu, penggunaan jaringan dapat dibatasi dengan pengontrol net_prio cgroup.
cgroups.c , mount.c , sec.c , user.c khusus untuk barco dan harus dibuat lebih umum Beberapa sumber daya yang telah digunakan untuk mengembangkan barco adalah: