บาร์โก barco เป็นโครงการที่ฉันทำงานเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับคอนเทนเนอร์ Linux และเคอร์เนล Linux โดยอิงตามคำแนะนำอื่น ๆ บนอินเทอร์เน็ต คอนเทนเนอร์ Linux ประกอบด้วยชุดของคุณสมบัติเคอร์เนล Linux:
namespaces : ใช้ในการจัดกลุ่มวัตถุเคอร์เนลเป็นชุดต่าง ๆ ที่สามารถเข้าถึงได้โดยต้นไม้กระบวนการเฉพาะ มี namespaces ประเภทต่าง ๆ เช่นเนมสเปซ PID ใช้เพื่อแยกต้นไม้กระบวนการในขณะที่เนมสเปซ network ใช้เพื่อแยกสแต็กเครือข่ายseccomp : ใช้เพื่อ จำกัด การเรียกระบบที่กระบวนการสามารถทำได้ (จัดการผ่าน SyScalls)capabilities : ใช้เพื่อกำหนดขีด จำกัด ในสิ่งที่ UID 0 (รูท) สามารถทำได้ (จัดการผ่าน syscalls)cgroups : ใช้เพื่อ จำกัด ทรัพยากร (เช่นหน่วยความจำ, ดิสก์ I/O, CPU-TME) ที่กระบวนการสามารถใช้ (จัดการผ่าน CGROUPFS) barco สามารถใช้เรียกใช้ bin/sh . จาก / ไดเรกทอรีเป็น root (-u 0) ด้วยคำสั่งต่อไปนี้ (ไม่บังคับ -v สำหรับเอาต์พุต 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 ต้องการเครื่องมือและห้องสมุดจำนวนมากที่จะติดตั้งเพื่อสร้างโครงการและเพื่อการพัฒนา
# 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 สามารถตั้งค่าให้เรียกใช้เป้าหมายใด ๆ ในโหมด "ดีบัก" ซึ่งสร้างโครงการด้วยสัญลักษณ์ดีบั๊กและไม่มีการปรับให้เหมาะสม (โดยเฉพาะอย่างยิ่งมีประโยชน์สำหรับดีบักเกอร์และ 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 codespaces ที่เก็บมีไฟล์การกำหนดค่าที่จำเป็นทั้งหมดเพื่อใช้เครื่องมือเหล่านี้อย่างมีประสิทธิภาพ 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 โดยใช้เคอร์เนล Linux ที่เวอร์ชัน 6.1.0 พร้อมเนมสเปซผู้ใช้และเปิดใช้งาน CGRoupSV2
barco ไม่จัดการกับเนมสเปซเครือข่ายดังนั้นคอนเทนเนอร์จึงไม่สามารถเข้าถึงเครือข่ายได้ การตั้งค่าเครือข่ายสามารถตั้งค่าได้ดังนี้:
ใน C สิ่งนี้มักจะทำผ่านอินเตอร์เฟส rtnetlink นอกจากนี้การใช้เครือข่ายอาจถูก จำกัด ด้วยคอนโทรลเลอร์ net_prio CGROUP
cgroups.c , mount.c , sec.c , user.c มีความเฉพาะเจาะจงกับ barco และควรทำทั่วไปมากขึ้น ทรัพยากรบางอย่างที่ใช้ในการพัฒนา barco คือ: