目录

runc系列-00-基本知识

概述

runc(run container)是一个基于 OCI 标准实现的一个轻量级容器运行工具,用来创建和运行容器。而 Containerd 是用来维持通过 runc 创建的容器的运行状态。 即 runc 用来创建和运行容器,Containerd 作为常驻进程用来管理容器。runc 实际是一个 CLI 工具,用于根据 OCI 规范生成和运行容器。真正调用 Linux 接口去创建网络接口的是 runc 里的代码,这些关于创建网络接口、挂载目录的操作,都是一个个 go 的 library 做的。

https://chinalhr.github.io/post/docker-runc/

当然 runc 是一个比较底层的工具了,虽然说一般不会有人直接用他,不过我们还是尝试一下。

下面是 runc docs 的中文翻译。

cgroup v2

从 v1.0.0-rc93 开始,runc 完全支持 cgroup v2(统一模式)。要使用 cgroup v2,您可能需要更改主机初始化系统的配置。已知以下发行版默认使用 cgroup v2:

  1. Fedora(31 起)
  2. Arch Linux(自 2021 年 4 月起)
  3. openSUSE Tumbleweed(自 2021 年起)
  4. Debian GNU/Linux(从 11 开始)
  5. Ubuntu(自 21.10 起)
  6. RHEL 和类似 RHEL 的发行版(自 9 起)

在其他基于 systemd 的发行版上,可以通过添加 systemd.unified_cgroup_hierarchy=1 到内核 cmdline 来启用 cgroup v2。

查看 /sys/fs/cgroup/cgroup.controllers 确认是否使用 cgroup v2。

主机要求

  1. 推荐版本: 5.2或更高版本
  2. 最低版本: 4.15
  3. 由于缺少freezer,不推荐使用5.2以前的内j

值得注意的是,不得使用早于4.15的内核(除非正在运行具有用户命名空间的容器),因为它缺乏对控制设备权限的支持。

Systemd

在 cgroup v2 主机上,强烈建议使用 systemd cgroup 驱动程序 (runc –systemd-cgroup) 运行 runc,但不是强制性的。

推荐的 systemd 版本为 244 或更高版本。较旧的 systemd 不支持 cpuset 控制器委派。确保您还安装了 dbus-user-session(Debian/Ubuntu) 或 dbus-daemon(CentOS/Fedora) 软件包,并且该软件包 dbus 正在运行。在 Debian 风格的发行版上,可以这样完成:

1
2
sudo apt install -y dbus-user-session
systemctl --user start dbus

Rootless

在 cgroup v2 主机上,rootless runc 可以与 systemd 对话以获取要委派的 cgroup 权限。

1
2
3
runc spec --rootless
jq '.linux.cgroupsPath="user.slice:runc:foo"' config.json | sponge config.json
runc --systemd-cgroup run foo

容器进程在 cgroup 中执行,例如 /user.slice/user-$(id -u).slice/user@$(id -u).service/user.slice/runc-foo.scope.

配置Delegation

通常,默认情况下,只有 memory 和 pids 控制器被委派给非 root 用户。

1
2
cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers
# memory pids

要允许其他控制器的委派,您需要更改 systemd 配置,如下所示:

1
2
3
4
5
6
mkdir -p /etc/systemd/system/user@.service.d
cat > /etc/systemd/system/user@.service.d/delegate.conf << EOF
[Service]
Delegate=cpu cpuset io memory pids
EOF
systemctl daemon-reload

Checkpoint and Restore

有关检查点和恢复容器的基本描述,runc 请参阅 runc-checkpoint(8) 和 runc-restore(8)。

Checkpoint/Restore Annotations

除了像手册页中描述的那样在命令行上指定选项(见上文)外,还可以使用 CRIU 配置文件影响 CRIU 的行为。有关 CRIU 的配置文件支持的详细信息,请参阅CRIU 的 wiki。

除了 CRIU 的默认配置文件 runc 告诉 CRIU 还要评估文件 /etc/criu/runc.conf。然而,使用注释 org.criu.config 可以更改这个附加的 CRIU 配置文件。

如果注释 org.criu.config 设置为空字符串 runc ,则不会将任何其他配置文件传递给 CRIU。因此,使用空字符串可以禁用附加的 CRIU 配置文件。这可用于确保没有其他配置文件意外更改 CRIU 的行为。

如果注释 org.criu.config 设置为非空字符串 runc,则会将该字符串传递给 CRIU 以作为附加配置文件进行评估。如果 CRIU 无法打开此附加配置文件,它将忽略此文件并继续。

禁用附加 CRIU 配置文件的注释示例。

1
2
3
4
5
6
7
8
{
  "ociVersion": "1.0.0",
  "annotations": {
    "org.criu.config": ""
  },
  "process": {
  }
}

用于设置特定 CRIU 配置文件的注释示例。

1
2
3
4
5
6
7
8
{
  "ociVersion": "1.0.0",
  "annotations": {
    "org.criu.config": "/etc/special-runc-criu-options"
  },
  "process": {
  }
}

参考资料

  1. Using runc