500行Linux容器运行时学习与避坑
500行Linux容器 [避坑]
参考链接:
测试均基于Ubuntu 22.04
内核版本为6.2.0。
问题1:版本检查错误 expected 6.x
按照参考链接1,在Ubuntu 22.04(内核版本6.2.0-37-generic)测试busybox,报如下错误:
user@zh-ubuntu:~/Work/busybox-1.36$ sudo ./a.out -u 0 -m ~/Work/busybox-1.36/rootfs/ -c /bin/sh
=> validating Linux version...expected 6.x: 6.2.0-37-generic
打开ctn-d.c源码可以发现,会检查是否为6.0或6.1,而Ubuntu内核版本为6.2,所以报错。注释该检查代码即可。
注:链接1的作者是用6.1内核版本的Ubuntu测试的, 我的Ubuntu 22.04是6.2的版本,但兼容,所以无需检查。CentOS 7的内核版本是3.10.0,CentOS 8的内核是4.18.0,均不满足要求,所以没有测试CentOS。另外Debian 12.4的内核是6.1.0,但测试没有成功,下面还会提到。
问题2:未找到cgroup/memory位置 No such file or directory
user@zh-ubuntu:~/Work/busybox-1.36$ sudo ./a.out -u 0 -m ~/Work/busybox-1.36/rootfs/ -c /bin/sh
=> validating Linux version...6.2.0-37-generic on x86_64.
=> generating hostname for container ... 00585c-five-of-wands done
=> setting cgroups...memory...mkdir /sys/fs/cgroup/memory/00585c-five-of-wands failed: No such file or directory
=> cleaning cgroups...opening /sys/fs/cgroup/memory/tasks failed: No such file or directory
解决方法(参考链接):
sudo sh -c 'echo "GRUB_CMDLINE_LINUX=systemd.unified_cgroup_hierarchy=false" > /etc/default/grub.d/cgroup.cfg'
问题3:go文件编译问题
编译之前,先安装go编译包:sudo apt install golang-go
之后报错:
user@zh-ubuntu:~/Work/busybox-1.36/rootfs/home$ go build hello-world.go
no required module provides package hello-world.go: go.mod file not found in current directory or any parent directory; see 'go help modules'
解决方法:go env -w GO111MODULE=off
Debian系统下的一系列问题
问题1:Docker 安装
直接输入apt install docker会装不能用的wmdocker。
解决方法:Debian下的docker需要按参考链接3来安装。
问题2:Debian的cgroup.cfg路径
据说Debian系统默认关闭cgroup memory子系统(参考链接4),需要先打开。这个过程中,执行update-grub会提示“未找到命令”,需要先执行sudo chmod +x /usr/sbin/update-grub,之后重启。但这之后,cgroup.cfg文件不在/etc/default/grub.d/cgroup.cfg路径下,所以无法按照Ubuntu问题2的方法解决(找到这个cgroup.cfg文件应该就行)。
提示:Debian输入“reboot”提示未找到命令,输入
export PATH=$PATH:/sbin/导入环境变量可以暂时解决(重启失效)。感觉Debian还是不够完善...应该很少人用,我测试了Debian,单纯是因为发现12.4内核版本刚好是6.1.0,和参考链接1作者的内核版本相同。

浙公网安备 33010602011771号