返回新闻概览

LXC 2.1 版本发布公告

2017年9月5日
LXC 团队自豪地宣布发布 LXC 2.1。
此版本包含自 LXC 2.0 发布以来引入的许多新功能。

请注意,这不是 LTS 版本,因此我们只会支持 LXC 2.1 一年。
需要长期支持的生产环境应保留在 LXC 2.0 上,该版本支持到 2021 年 6 月。

新功能

资源限制支持

类似于请求特定的 cgroup 限制,用户可以为内核感知的任何资源指定任何限制。
通过在限制名称前加上“lxc.prlimit.”来实现。
在容器的配置文件中。例如,要请求对进程数量的限制
和一个特定的 nice 值,容器的配置文件应包含以下条目

lxc.prlimit.nproc = unlimited
lxc.prlimit.nice = 4

支持非特权 Open vSwitch 网络

现在可以将 Open vSwitch 网络定义为非特权用户。

lxc.net.0.type = veth
lxc.net.0.link = ovsbr0
lxc.net.0.flags = up
lxc.net.0.name = eth0

LXC 2.1 将在关闭时正确地从
Open vSwitch 数据库中删除主机端的 veth 设备。

新的 lxc.cgroup.dir

lxc.cgroup.dir 键允许用户指定容器的 cgroup 将在其下创建的父 cgroup 的名称。
设置 lxc.cgroup.dir
覆盖 lxc.cgroup.pattern 的系统范围设置。

例如,为 lxc.uts.name = c1 的容器设置 lxc.cgroup.dir = mycontainers
将导致 LXC 为 cgroup 层次结构中的所有控制器创建 mycontainers/c1 cgroup。

支持混合 cgroup 布局

自从 cgroup v2 出现以来,一些 init 系统已决定允许使用混合模式,其中
可以同时使用每个控制器的 cgroup v1 层次结构和一个空的 cgroup v2 层次结构。
使用此混合模式的系统通常具有类似于以下的 cgroup 布局

  /sys/fs/cgroup/blkio
  /sys/fs/cgroup/devices
  /sys/fs/cgroup/memory
  /sys/fs/cgroup/unified

其中挂载点 /sys/fs/cgroup/unified 通常表示 cgroup v2 层次结构的存在。
可以通过测试 findmnt | grep cgroup2 是否返回匹配行来确认这一点。
LXC 2.1 支持此混合模式。

限制容器可以分配的 pty 数量

设置 lxc.pty.max 将导致 LXC 使用请求的限制挂载容器的 devpts
在可用 pty 的数量上。例如,设置 lxc.pty.max = 10 将只允许
容器分配 10 个 pty。默认设置为 1024

bool lxc_config_item_is_supported(const char *key) API 扩展

此函数允许用户查询 liblxc 此库是否支持特定的配置项。
这对于运行 liblxc 版本的嵌入式用户特别有用,这些版本附带的配置选项
比标准 liblxc 库少得多,或者已向后移植新配置项的 liblxc。

新的日志 API 扩展

struct lxc_log {
    const char *name;
    const char *lxcpath;
    const char *file;
    const char *level;
    const char *prefix;
    bool quiet;
};

/*!
 *\brief Initialize the log
 *
 *\param log lxc log configuration.
 */
int lxc_log_init(struct lxc_log *log);

/*!
 * \brief Close log file.
 */
void lxc_log_close(void);

这些类型和函数允许用户初始化 LXC 日志记录。这对于直接使用 liblxc API 的用户很有用。

弃用 lxc-monitord

从 LXC 2.1 开始,lxc-monitord 二进制文件被标记为已弃用。
不再需要启动守护进程容器。相反,LXC 2.1 切换到使用
抽象的 Unix 域套接字对的实现。这具有在容器启动时减少一个进程的优势,这对于
LXD 这样的高线程用户来说非常重要。

此外,在繁重工作负载上测试新实现表明,此解决方案在各方面都更加健壮和可靠。

lxc-copytmpfs 上创建快照

将使用 -e 标志启动的短暂容器放置在 tmpfs 上。
限制是您不能请求在将容器放置在 tmpfs 上时保留数据,
必须使用覆盖或 aufs 后备存储,并且原始
容器的存储后端必须是目录。

对于由覆盖或 aufs 文件系统支持的短暂快照,如果用户请求,则会在容器目录上挂载一个新的 tmpfs。
这应该是最简单的选项。其他任何操作都需要我们更改当前
覆盖和 aufs 快照的挂载布局。标准的覆盖或 aufs 快照克隆当前具有以下布局

        /var/lib/lxc/CLONE_SNAPSHOT/delta0      <-- upperdir
        /var/lib/lxc/CLONE_SNAPSHOT/rootfs
        /var/lib/lxc/CLONE_SNAPSHOT/olwork
        /var/lib/lxc/CLONE_SNAPSHOT/olwork/work <-- workdir

with the lowerdir being

        /var/lib/lxc/CLONE_PARENT/rootfs

upperdir 和 workdir 未放置在容器目录下的公共子文件夹中
这意味着我们不能简单地在 upperdir 和 workdir 下挂载一个新的 tmpfs
因为覆盖需要它们位于同一个文件系统上。

因为我们在容器的目录上挂载了一个新的 tmpfs,所以在克隆期间创建的更新的 /etc/hostname 文件
位于 upperdir 中(当前默认为“delta0”)将被隐藏。

因此,如果用户请求不为克隆保留旧名称,我们将在 tmpfs 上重新创建此文件。
这应该是恢复我们使用普通克隆获得的精确行为所需的一切。
注意:如果容器重新引导,对其进行的所有更改都会丢失。由于每次重新引导都会重新挂载 rootfs,因此这不容易防止。

配置更改

许多配置键已重命名,以使配置容器的体验更加一致。
LXC 2.1 确保所有具有子键的键都通过“.”语法正确地命名空间。

网络配置

所有网络配置键都已赋予新的前缀。其中一些也已重命名。
从 LXC 2.1 开始,使用“lxc.network”前缀的网络配置键被认为已弃用。
它们被使用新“lxc.net”前缀的网络配置键替换。
此外,定义没有索引的网络被标记为已弃用。
考虑以下旧版网络配置

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.name = wlp2s0

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.name = eno1

将定义两个不同的网络。从 LXC 2.1 开始,这应该替换为

lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = lxcbr0
lxc.net.0.name = wlp2s0

lxc.net.1.type = veth
lxc.net.1.flags = up
lxc.net.1.link = lxcbr0
lxc.net.1.name = eno1

仅以这种方式定义网络的优点在于一致且与顺序无关。
这意味着这两个网络的等效配置将是

lxc.net.1.link = lxcbr0
lxc.net.0.name = wlp2s0
lxc.net.0.type = veth

lxc.net.1.type = veth
lxc.net.1.flags = up
lxc.net.0.flags = up
lxc.net.0.link = lxcbr0
lxc.net.1.name = eno1

请注意,当使用具有相同索引的相同键的多个定义时,只有最后一个
将被 LXC 考虑。这与之前的 LXC 版本一致。例如

lxc.net.2.link = lxcbr0
lxc.net.2.link = lxdbr0
lxc.net.2.link = br0
lxc.net.2.link = virbr0

将导致 LXC 将网络与 virbr0 关联,因为它是在配置中的最后一个键。

已更改配置键的表

下表左侧列出了旧版配置键,右侧列出了其对应的新的键。已完全删除的键在“新键”列中将具有“-”作为条目,并在“注释”表中具有“已删除”的注释。

Legacy Key                           | New Key                       | Comments
-------------------------------------|-------------------------------|---------
lxc.aa_profile                       | lxc.apparmor.profile          |
lxc.aa_allow_incomplete              | lxc.apparmor.allow_incomplete |
lxc.console                          | lxc.console.path              |
lxc.devttydir                        | lxc.tty.dir                   |
lxc.haltsignal                       | lxc.signal.halt               |
lxc.id_map                           | lxc.idmap                     |
lxc.init_cmd                         | lxc.init.cmd                  |
lxc.init_gid                         | lxc.init.gid                  |
lxc.init_uid                         | lxc.init.uid                  |
lxc.kmsg                             | -                             | removed
lxc.limit                            | lxc.prlimit                   |
lxc.logfile                          | lxc.log.file                  |
lxc.loglevel                         | lxc.log.level                 |
lxc.mount                            | lxc.mount.fstab               |
lxc.network                          | lxc.net                       |
lxc.network.                         | lxc.net.[i].                  |
lxc.network.flags                    | lxc.net.[i].flags             |
lxc.network.hwaddr                   | lxc.net.[i].hwaddr            |
lxc.network.ipv4                     | lxc.net.[i].ipv4.address      |
lxc.network.ipv4.gateway             | lxc.net.[i].ipv4.gateway      |
lxc.network.ipv6                     | lxc.net.[i].ipv6.address      |
lxc.network.ipv6.gateway             | lxc.net.[i].ipv6.gateway      |
lxc.network.link                     | lxc.net.[i].link              |
lxc.network.macvlan.mode             | lxc.net.[i].macvlan.mode      |
lxc.network.mtu                      | lxc.net.[i].mtu               |
lxc.network.name                     | lxc.net.[i].name              |
lxc.network.script.down              | lxc.net.[i].script.down       |
lxc.network.script.up                | lxc.net.[i].script.up         |
lxc.network.type                     | lxc.net.[i].type              |
lxc.network.veth.pair                | lxc.net.[i].veth.pair         |
lxc.network.vlan.id                  | lxc.net.[i].vlan.id           |
lxc.pivotdir                         | -                             | removed
lxc.pts                              | lxc.pty.max                   |
lxc.rebootsignal                     | lxc.signal.reboot             |
lxc.rootfs                           | lxc.rootfs.path               |
lxc.se_context                       | lxc.selinux.context           |
lxc.seccomp                          | lxc.seccomp.profile           |
lxc.stopsignal                       | lxc.signal.stop               |
lxc.syslog                           | lxc.log.syslog                |
lxc.tty                              | lxc.tty.max                   |
lxc.utsname                          | lxc.uts.name                  |

lxc-update-config 脚本

LXC 2.1 附带了一个新的脚本 lxc-update-config,它可以用来升级现有的旧版
LXC 配置到有效的 LXC 2.1 配置,只需传递

lxc-update-config -c /path/to/config

脚本首先会创建旧版配置文件的备份。
备份配置文件的名称将为 <original-config-file-name>.backup
在升级未产生可用的 LXC 2.1 配置文件的情况下,会进行备份。
创建备份后,脚本将用其新的对应项替换所有旧版配置键。

弃用警告

LXC 2.1 旨在与 2.1 之前的配置文件完全向后兼容。
这具体意味着任何弃用键的存在不应阻止容器可用。
但是,LXC 2.1 会警告任何弃用配置键的存在。
在容器启动时,LXC 2.1 将一次发出带有以下消息的警告

The configuration file contains legacy configuration keys.
Please update your configuration file.

建议所有用户使用上述 lxc-update-config 脚本更新其配置文件。
如果容器启用了日志记录,则日志将包含每个检测到的旧版配置键的警告。
这主要对喜欢手动更新配置文件的用户有用。

更改日志

  • 核心

    • af unix:允许最大套接字名称
    • af_unix:抽象 lxc_abstract_unix_{send,recv}_fd
    • Android:为 32 位添加 prlimit 实现
    • API:公开函数 lxc_log_init
    • API:添加 lxc_config_item_is_supported()
    • 功能:添加 lxc_{proc,file}_cap_is_set()
    • cgroups:处理混合 cgroup 布局
    • 命令:处理 EINTR
    • 命令:添加 lxc_cmd_state_server()
    • 命令:将 api 切换到新的回调系统
    • 配置:实现资源限制
    • 配置:在 new{g,u}idmap 上检查 {filecaps,setuid}
    • 配置:为 /dev/ptmx 使用绑定挂载
    • 配置:将 MS_LAZYTIME 添加到挂载选项
    • 配置:未配置时不发送 ttys
    • 配置:批量发送 ttys(每次 2 个)
    • 配置:记录 lxc-user-nic 输出
    • 配置:重构网络删除
    • 配置:重做核心函数
    • 配置:改进 lxc_map_ids()
    • 配置:使用最小的 {g,u}id 映射
    • 配置:允许使用 euid != 0 写入 uid 映射
    • 配置:取消堆叠 /dev/console 上的所有挂载
    • 配置{,文件}:仅向用户警告一次旧版配置

    • confile: 添加 lxc_get_idmaps() 函数
    • confile: 重构并扩展回调系统
    • confile: 性能调整
    • confile: 添加 "lxc.cgroup.dir" 配置项
    • confile: 列出命名空间键
    • confile: 将 lxc_getconfig() 重命名为 lxc_get_config()
    • confile: 改善 get_network_config_ops() 函数
    • confile: 移动 lxc_list_net() 函数
    • confile: 将 lxc_listconfigs 重命名为 lxc_list_config_items
    • confile: 重构 lxc_list_net() 函数
    • confile: 将 lxc.seccomp 重命名为 lxc.seccomp.profile
    • confile: 将 lxc.pts 重命名为 lxc.pty.max
    • confile: 将 lxc.tty 重命名为 lxc.tty.max
    • confile: 将 lxc.net.ipv6 重命名为 lxc.net.ipv6.address
    • confile: 将 lxc.net.ipv4 重命名为 lxc.net.ipv4.address
    • confile: 将 lxc.mount 重命名为 lxc.mount.fstab
    • confile: 将 lxc.console 重命名为 lxc.console.path
    • confile: 将 lxc.rootfs 重命名为 lxc.rootfs.path
    • confile: 弃用 lxc.rootfs.backend 配置项
    • confile: 将 lxc.utsname 重命名为 lxc.uts.name
    • confile: 将 lxc.devttydir 重命名为 lxc.tty.dir
    • confile: 为 lxc.signal 配置项添加命名空间
    • confile: 为 lxc.log 配置项添加命名空间
    • confile: 为 lxc.init 配置项添加命名空间
    • confile: 将 lxc.limit 重命名为 lxc.prlimit
    • confile: 移除 lxc.pivotdir 配置项
    • confile: 移除 lxc.kmsg 配置项
    • confile: 正确地为安全相关的配置项添加命名空间
    • doc: 适配新的配置项
    • devpts: 使用 max= 选项在挂载时使用选项
    • lsm/AppArmor: 允许容器在 AppArmor 命名空间中启动
    • lxccontainer: 清除整个索引网络
    • lxccontainer: 将 API 切换到新的回调系统
    • lxc-init: 报告 exec*() 函数失败
    • lxc-user-nic: 保留来自其他 {users,links} 的行
    • lxc-user-nic: 修复添加数据库条目
    • lxc-user-nic: 在尝试删除之前检查数据库
    • lxc-user-nic: 测试删除操作时的网络命名空间权限
    • lxc-user-nic: 重构网络设备重命名逻辑
    • lxc-user-nic: 添加新的 {create,delete} 子命令
    • monitor: 简化抽象套接字逻辑
    • network: 不要删除我们没有创建的网络设备
    • network: 从 lxc_mkifname() 函数中移除分配操作
    • network: 移除 netpipe
    • network: 使用正确的网络设备名称
    • network: 停止记录保存的物理网络设备
    • network: 获取正确的名称和 ifindex
    • network: 为网络设备名称使用静态内存
    • network: 获取主机 veth 设备的 ifindex
    • network: 重构网络创建逻辑
    • network: 删除非特权网络的 ovs
    • network: 记录 ifindex
    • network: 为非特权网络发送 ifindex
    • network: 为传统网络返回负索引
    • network: 测试新的网络配置解析器
    • network: 添加新的网络解析器
    • network: 保留向后兼容性
    • network: 为配置项添加测试套件
    • openvswitch: 智能地删除端口
    • README: 在 README 中添加 CII 最佳实践徽章
    • seccomp: 如果可用,设置 SCMP_FLTATR_ATL_TSKIP
    • start: 泛化 lxc_check_inherited() 函数
    • start: 在守护进程启动时使用独立的套接字
    • start: 从 SOCK_DGRAM 切换到 SOCK_STREAM
    • start: 不要让 data_sock 用户关闭文件描述符
    • start: 确保清理 cgroups
    • start: 移除 utmp 监控
    • start: 在 unshare(CLONE_NEWCGROUP) 之后调用 lxc_setup()
    • start: 将 std{in,out,err} 复制到 pty 从设备
    • start: 添加 lxc_init_handler() 函数
    • start: 添加 lxc_free_handler() 函数
    • start: 在特权模式下固定 rootfs
    • storage: 添加 lxc_storage_get_path() 函数
    • storage: 添加 storage_utils.{c.h} 文件
    • storage: 添加 overlay 作为有效的存储后端
    • storage: 重命名文件,将 "bdev" 改为 "storage"
    • storage/aufs: 标记为已弃用
    • storage/btrfs: 重构 btrfs 存储驱动
    • storage/loop: 重构 loop 存储驱动
    • storage/lvm: 重构 lvm 后端
    • storage/overlay: 重构 overlay 存储驱动
    • storage/overlay: 正确地从快照恢复
    • storage/overlay: 正确地处理依赖项跟踪
    • storage/rbd: 重构 rbd 存储驱动
    • storage/zfs: 重构 zfs 存储驱动
    • tests: 为 lxc.cgroup.dir 配置项添加测试
    • test: 添加获取子键的测试
    • tests: 为 idmap 解析器添加单元测试
    • tests: 对配置项的所有方法进行强制执行
    • tree-wide: 将 struct bdev 重命名为 struct lxc_storage
    • utils: 添加 lxc_nic_exists() 函数
    • utils: 切换到 has_fs_type() 函数
    • utils: 添加 has_fs_type() 和 is_fs_type() 函数
    • utils: 重构 lxc_deslashify() 函数
    • utils: 添加 lxc_make_abstract_socket_name() 函数
    • utils: 添加 lxc_safe_ulong() 函数
    • utils: 添加 lxc_unstack_mountpoint() 函数
  • 模板

    • templates/Alpine: 添加对 ppc64le 架构的支持
    • templates/Alpine: 使用 dl-cdn.a.o 作为默认镜像,而不是随机镜像
    • templates/Alpine: 将社区仓库添加到默认仓库
    • templates/CentOS: 为除 i386 和 x86_64 之外的架构使用 altarch 镜像
    • templates/CentOS: 默认使用 CentOS 7
    • templates/debian: 使用 deb.debian.org 作为默认的 Debian 镜像
    • templates/debian: 添加 buster 作为有效的版本
    • templates/opensuse: 支持 leap 42.3
    • templates/opensuse: 修复 Tumbleweed 软件选择
    • templates/opensuse: 添加 Tumbleweed 作为受支持的版本
    • templates/ubuntu: 默认情况下在较新的版本中支持 netplan
    • templates/ubuntu: 有条件地移动 upstart ssh 作业,因为它现在是可选的。
    • userns.conf: 移除过时的绑定挂载
  • 工具

    • lxc-execute: 在失败时打印错误消息
    • lxc-update-config: 处理传统网络
    • tools: 添加额外的 cgroup 检查
    • tools: 添加 lxc-update-config.in 文件
    • tools/lxc-attach: 允许在没有 /dev/tty 的情况下运行
    • tools/lxc-checkconfig: 添加 CONFIG_NETFILTER_XT_MATCH_COMMENT
    • tools/lxc-checkconfig: 验证 new[ug]idmap 是否设置为 root 权限
    • tools/lxc-ls: 默认情况下返回所有容器,新的过滤器 - 仅列出已定义的容器。

下载

发行版压缩包可以在我们的 下载页面 上找到,我们预计大多数发行版
很快就会发布 LXC 2.1 的打包版本。

如果您对单个更改感兴趣,或者只是想查看详细的开发历史,
我们的稳定分支位于 GitHub 上。