容器运行时环境¶
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 之前,所有高于默认三个的文件描述符都已关闭。