容器运行时环境¶
Incus 尝试为其运行的所有容器提供一致的环境。
确切的环境将根据内核特性和用户配置略有不同,但在其他方面,所有容器的环境都是相同的。
文件系统¶
Incus 假设其用于创建新容器的任何镜像都至少具有以下根级目录
/dev(空)/proc(空)/sbin/init(可执行文件)/sys(空)
设备¶
Incus 容器具有基于 tmpfs 文件系统的最小且短暂的 /dev。由于这是一个 tmpfs 而不是 devtmpfs 文件系统,因此只有在手动创建时才会出现设备节点。
以下标准设备节点集会自动设置
/dev/console/dev/fd/dev/full/dev/log/dev/null/dev/ptmx/dev/random/dev/stdin/dev/stderr/dev/stdout/dev/tty/dev/urandom/dev/zero
除了标准设备集之外,以下设备也为了方便而设置
/dev/fuse/dev/net/tun/dev/mqueue
网络¶
Incus 容器可以连接任意数量的网络设备。除非用户覆盖,否则这些设备的命名为 ethX,其中 X 是一个递增的数字。
容器到主机通信¶
Incus 在 /dev/incus/sock 处设置了一个套接字,容器中的 root 用户可以使用它与主机上的 Incus 通信。
有关 API 文档,请参阅 实例与主机之间的通信。
挂载点¶
默认情况下会设置以下挂载点
/proc(proc )/sys(sysfs)/sys/fs/cgroup/*(cgroupfs) (仅在缺少 cgroup 命名空间支持的内核上)
如果它们存在于主机上,以下路径也会自动挂载
/proc/sys/fs/binfmt_misc/sys/firmware/efi/efivars/sys/fs/fuse/connections/sys/fs/pstore/sys/kernel/debug/sys/kernel/security
传递所有这些路径的原因是,旧版 init 系统需要在容器内挂载或可挂载它们。
大多数这些路径在非特权容器内部将不可写(甚至不可读)。在特权容器中,它们将被 AppArmor 策略阻止。
LXCFS¶
如果主机上存在 LXCFS,则会自动为容器设置它。
这通常会导致通过绑定挂载覆盖许多 /proc 文件。在较旧的内核上,LXCFS 也可能会设置 /sys/fs/cgroup 的虚拟版本。
PID1¶
Incus 将位于 /sbin/init 处的任何内容作为容器的初始进程(PID 1)生成。此二进制文件应充当正确的 init 系统,包括处理重新父化的进程。
Incus 与容器中 PID1 的通信仅限于两个信号
SIGINT用于触发容器的重启SIGPWR(或可选的SIGRTMIN+3)用于触发容器的干净关闭
PID1 的初始环境为空,除了 container=lxc,init 系统可以使用它来检测运行时。
在生成 PID1 之前,所有高于默认三个的文件描述符都已关闭。