容器运行时环境

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 之前,所有高于默认三个的文件描述符都已关闭。