باركو barco هو مشروع عملت عليه لمعرفة المزيد حول حاويات Linux و Linux kernel ، استنادًا إلى أدلة أخرى على الإنترنت. تتكون حاويات Linux بواسطة مجموعة من ميزات Kernel Linux:
namespaces : تستخدم لتجميع كائنات kernel في مجموعات مختلفة يمكن الوصول إليها بواسطة أشجار عملية محددة. هناك أنواع مختلفة من namespaces ، على سبيل المثال ، يتم استخدام مساحة اسم PID لعزل شجرة العملية ، بينما يتم استخدام مساحة اسم network لعزل مكدس الشبكة.seccomp : يستخدم للحد من مكالمات النظام التي يمكن أن تقوم بها العملية (معالجة عبر syscalls)capabilities : يتم استخدامها لوضع حدود على ما يمكن أن يفعله UID 0 (الجذر) (يتم التعامل معه عبر syscalls)cgroups : يتم استخدامها للحد من الموارد (مثل الذاكرة ، القرص I/O ، CPU-TME) التي يمكن أن تستخدمها العملية (معالجة عبر CGOUPF) يمكن استخدام 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 fish يتطلب barco تثبيت عدد من الأدوات والمكتبات لإنشاء المشروع والتطوير.
# Install all required tooling and dependencies
$ sudo apt install -y make
$ make setup يعتمد barco على المكتبات التالية "غير القياسية":
libseccomp : يستخدم لإعداد مرشحات SecComplibcap : تستخدم لضبط قدرات الحاويةlibcuni1 : يستخدم للاختبار مع Cunit يستخدم barco عددًا من الأدوات المستندة إلى LLVM-18 للتطوير ، والتصحيح ، والتنسيق ، والتصحيح ، و Valgrind للتحقق من تسرب الذاكرة.
يوفر Makefile المضمّن بعض الأهداف لبناء barco . يمكن تعيين debug=1 لتشغيل أي من الأهداف في وضع "Debug" ، والذي يبني المشروع برموز التصحيح وبدون تحسينات (مفيدة بشكل خاص لتصحيح الأخطاء و 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 باستخدام رمز Visual Studio ومساحات Github. يحتوي المستودع على جميع ملفات التكوين اللازمة لاستخدام هذه الأدوات بشكل فعال. يعتمد barco على ميزات Linux ذات المستوى المنخفض ، لذلك يجب تشغيلها على نظام Linux. يعمل GitHub CodeSpaces غريبًا في بعض الأحيان عندما يقوم التغيير بالتعديل في إعدادات الحاويات منخفضة المستوى: لقد وجدت getutm.app للعمل بشكل جيد مع Debian على جهاز Mac الخاص بي عندما تكون في شك.
يوفر Makefile المضمّن بعض الأهداف المفيدة للتطوير:
# Run tests
$ make test
# Run linter
$ make lint
# Run formatter
$ make format
# Run valgrind
$ make check
# Clean the build
$ make clean علاوة على ذلك ، يتضمن المشروع تكوين رمز Visual Studio في .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 ، حيث تشغيل Kernel Linux في الإصدار 6.1.0 ، مع تمكين مساحات أسماء المستخدم وتمكين Cgroupsv2.
لا يتعامل barco مع مساحات أسماء الشبكة ، وبالتالي لا يمكن للحاوية الوصول إلى الشبكة. يمكن إعداد الشبكات تقريبًا على النحو التالي:
في C يتم ذلك عادة عبر واجهة rtnetlink . علاوة على ذلك ، يمكن أن يكون استخدام الشبكة محدودًا مع وحدة تحكم net_prio Cgroup.
cgroups.c ، mount.c ، sec.c ، user.c محددة لـ barco ويجب أن تكون أكثر عاما بعض الموارد التي تم استخدامها لتطوير barco هي: