바코 barco 인터넷의 다른 가이드를 기반으로 Linux 컨테이너 및 Linux 커널에 대해 더 많이 배우기 위해 노력한 프로젝트입니다. Linux 컨테이너는 Linux 커널 기능 세트로 구성됩니다.
namespaces : 커널 객체를 특정 프로세스 트리에서 액세스 할 수있는 다른 세트로 커널 객체를 그룹화하는 데 사용됩니다. 예를 들어, PID 네임 namespaces 는 network 트리를 분리하는 데 사용되는 다음 네트워크 스택을 분리하는 데 사용됩니다.seccomp : 프로세스가 만들 수있는 시스템 호출을 제한하는 데 사용됩니다 (Syscalls를 통해 처리)capabilities : UID 0 (루트)가 할 수있는 일 (SYSCALLS를 통해 처리)에 대한 제한을 설정하는 데 사용됩니다.cgroups : 프로세스가 사용할 수있는 리소스 (예 : 메모리, 디스크 I/O, CPU-TME)를 제한하는 데 사용됩니다 (CGroupfs를 통해 처리) barco bin/sh . / 디렉토리에서 root (-u 0)로부터 다음 명령 (옵션 -v 이 있습니다 (Verbose Output의 경우 옵션) :
$ 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 : SecComp 필터를 설정하는 데 사용됩니다libcap : 컨테이너 기능을 설정하는 데 사용됩니다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 Code 및 Github Codespaces를 사용하여 개발되었습니다. 이 저장소에는 이러한 도구를 효과적으로 사용하는 데 필요한 모든 구성 파일이 포함되어 있습니다. barco 저수준 Linux 기능에 의존하므로 Linux 시스템에서 실행해야합니다. github codespaces는 저수준 컨테이너 설정을 조정할 때 때때로 이상한 행동을합니다.
포함 된 Makefile 개발에 유용한 몇 가지 대상을 제공합니다.
# Run tests
$ make test
# Run linter
$ make lint
# Run formatter
$ make format
# Run valgrind
$ make check
# Clean the build
$ make clean 또한이 프로젝트에는 .vscode/ 의 Visual Studio Code 구성이 포함되어 있으며 내장 디버거를 실행하는 데 사용할 수 있습니다 (현재 barco root 로 실행되기 때문에 "비활성화 된"상태입니다.
프로젝트는 다음과 같이 구성됩니다.
├── .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에서 테스트되었으며 사용자 네임 스페이스 및 CGroupSV2가 활성화 된 버전 6.1.0에서 Linux 커널을 실행했습니다.
barco 네트워크 네임 스페이스를 처리하지 않으므로 컨테이너는 네트워크에 액세스 할 수 없습니다. 네트워킹은 다음과 같이 대략 설정할 수 있습니다.
C에서는 일반적으로 rtnetlink 인터페이스를 통해 수행됩니다. 또한 net_prio CGROUP 컨트롤러로 네트워크 사용량이 제한 될 수 있습니다.
cgroups.c , mount.c , sec.c , user.c 의 기능은 barco 에만 국내적이며보다 일반적인 것으로 만들어야합니다. barco 개발하는 데 사용 된 일부 리소스는 다음과 같습니다.