返回新闻概述

LXC 4.0.9 LTS 已发布

2021 年 5 月 6 日

简介

LXC 团队很高兴地宣布发布 LXC 4.0.9!

这是 LXC 4.0 的第九个 bug 修复版本,它将得到支持,直到 2025 年 6 月。

您可能已经注意到从 4.0.6 到 4.0.9 的突然跳跃,这是因为 4.0.7 和 4.0.8 都包含了早期用户报告的回归问题,并且被认为严重到需要发布新版本。

下面的变更日志涵盖了 4.0.6 到 4.0.9。

错误修复

与往常一样,此错误修复版本侧重于稳定性和加固。此版本的一些亮点是

  • 包括来自 oss-fuzz 的修复的测试改进
  • 重新设计连接代码路径
  • cgroup 处理重构

完整的提交列表如下所示

详细变更日志
  • commands: 修复对 seccomp 通知支持的检查
  • configure: 如果 libseccomp 被禁用,则跳过 libseccomp 测试
  • conf: 修复容器保留 CAP_NET_ADMIN 的问题
  • cgroups: 修复 cgroup 挂载
  • lsm: 删除关于构造函数的过时注释
  • lxc_attach: 有条件地包含 rexec
  • tree-wide: 修复一些头文件包含
  • initutils: 修复缺少的包含文件
  • configure: 支持静态二进制文件
  • autotools: 为工具启用静态构建
  • autotools: 为命令启用静态构建
  • tree-wide: 使用 -Wstrict-prototypes -Wold-style-definition 修复编译
  • config: 更新 ax_pthread.m4
  • configure: 添加 AC_SYS_LARGEFILE 检查
  • autotools: 更新构建
  • file_utils: 引入 read_file_at()
  • string_utils: 添加 must_make_path_relative()
  • cgroups: 代码风格修复
  • cgroups: 重构 cg_unified_init()
  • cgroups: 检测并记录 cgroup2 冷冻支持
  • criu: 处理 cgroup2 冷冻
  • 在容器启动时创建 mkdir -p /proc /sys
  • conf: 修复代码风格
  • conf: 代码风格修复
  • conf: 将 proc 和 sys 挂载点创建移动到 lxc_mount_auto_mounts() 中
  • attach: 反转子进程/父进程处理
  • attach: 使用 __do_free 清理宏来清理 cwd
  • attach: 微调日志记录
  • attach: 使用 __do_close 来关闭 labelfd
  • attach: 代码风格修复
  • attach: 使用 free_disarm()
  • attach: s/attach_child_main/do_attach/g
  • attach: 将 do_attach() 标记为 __noreturn
  • attach: 使 do_attach() 成为 void
  • attach: 使用 close_prot_errno_disarm()
  • attach: 向 stdfd 复制添加一些 DEBUG() 日志记录
  • cgroups: 修复 cgroup 挂载
  • 合并拉取请求 #3653 来自 brauner/2021-02-04/lxc-4.0.6-cgroup-mount-fix
  • utils: 修复 mount_at()
  • configure: 使用 clang-12 和 LTO 修复静态构建
  • cgroups: bpf 修复
  • croups: 改进 __do_bpf_program_free
  • cgroups: 代码风格修复
  • cgroups: 不要初始化 NULL 日志
  • cgroups: 确保所有内存都被清零
  • cgroups: 使用 zalloc
  • cgroups: 微调 cgroup 初始化
  • log: 删除无意义的内联
  • log: 添加 lxc_log_get_fd()
  • seccomp: 使用 lxc_log_get_fd()
  • log: 重构 lxc_log_get_level()
  • seccomp: 使用 lxc_log_get_level()
  • cgroups: 在跟踪级别记录时使用 bpf 日志
  • log: 添加 lxc_log_trace() 帮助程序
  • cgroups: 使用 PTR_TO_U64()
  • cgroups: 对齐方法
  • utils: 在记录 stdio 权限修复失败时使用 SYSTRACE()
  • attach: 使用 SYSDEBUG() 将 dup2() 失败记录到日志
  • attach: 修复 stdfd 替换的日志记录
  • attach: 修复 dup2() 的错误检查
  • cgroups: 初始化变量
  • commands_utils: 不要泄漏内存
  • conf: 使用 lxc_log_trace()
  • confile_utils: 使用 lxc_log_trace()
  • rexec: 检查 lseek() 的返回值
  • attach: 代码风格修复
  • attach: 正确排序变量
  • lxc-attach: 启用设置 SELinux 上下文
  • attach: 要求指定 LXC_ATTACH_LSM_LABEL
  • attach: 将 lxc_proc_context_info 移动到文件局部范围
  • attach: s/lxc_proc_context_info/attach_context/g
  • attach: 重命名 attach_context 帮助程序
  • attach: s/calloc/zalloc/g
  • attach: 将 attach_context 拆分为分配和初始化
  • attach: 将 lxc_cmd_get_init_pid() 移动到 get_attach_context() 中
  • attach: 将 get_personality() 移动到 get_attach_context() 中
  • attach: 将配置初始化移动到 get_attach_context() 中
  • attach: 添加 get_attach_context_nsfds()
  • attach: s/lxc_proc_close_ns_fd/close_nsfds/g
  • attach: s/lxc_attach_drop_privs/drop_capabilities/g
  • lsm: s/lsm_init/lsm_init_static/g
  • attach: 修复个性处理
  • attach: 删除过时的命名空间检查
  • attach: 将 getcwd() 移动到更紧凑的范围
  • attach: s/close/close_prot_errno_disarm/g
  • attach: 将 attach_clone_payload 移动到更紧凑的范围
  • attach: 将 attach_clone_payload 重命名为 attach_payload
  • attach: 代码风格修复
  • sync: 导出 sync_wait() 和 sync_wake()
  • sync: 重命名启动同步宏
  • attach: 在适用时使用 sync_wait()/sync_wake()
  • attach: 引入 sync_wait_pid() 和 sync_wake_pid()
  • sync: 使所有同步帮助程序都返回 bool
  • attach: 引入 sync_wait_fd() 和 sync_wake_fd()
  • attach: 使用虚拟宏来简化跟踪同步逻辑
  • attach: 将 new_cwd 移动到更紧凑的范围
  • attach: 使用 STDIN_FILENO 而不是硬编码 0
  • attach: 删除不必要的赋值
  • attach: 重构连接到命名空间文件描述符
  • attach: 移动到仅文件描述符交互
  • attach: 移动到仅文件描述符命名空间交互
  • attach: 将文件描述符初始化为 -EBADF
  • cgroups: 更严格地验证参数
  • cgroups: 使用清理宏以保持一致性
  • attach: 不要无谓地检查 NULL
  • attach: 基于文件描述符的 LSM 处理
  • attach: 通过使用 pidfds 加强安全性
  • lsm/apparmor: 清理 apparmor_process_label_set()
  • file_utils: 添加 fdopenat()
  • attach: 统一 /proc//status 解析
  • attach: 将 init_pid 字段初始化为 -ESRCH
  • attach: 将 uid 和 gid 处理移动到 get_attach_context() 中
  • attach: 简化打开 /proc/self
  • attach: 文档化 attach_context
  • attach: 将主机 uid 和主机 gid 存储在 attach_context 中
  • cgroups: 删除无意义的 NULL 检查
  • file_utils: 添加 open_at()
  • syscall_wrappers: 添加 PROTECT_LOOKUP、PROTECT_OPEN、PROTECT_LOOKUP_WITH_SYMLINKS、PROTECT_OPEN_WITH_TRAILING_SYMLINKS
  • attach: 加强 open 调用
  • tree-wide: 扩展 read_file_at()
  • lsm: 加强 read_file_at()
  • file_utils: 从 open_at() 默认值中删除 O_NOFOLLOW
  • attach: 基于文件描述符的 fdinfo 处理
  • attach: 防止 UAF
  • attach: 使用正确的 put 方法
  • attach: 对 fdopen_at() 调用进行更严格的查找语义
  • attach: 将文件描述符关闭移动到 attach_context_container() 中
  • attach: 将加载 seccomp 推迟到尽可能晚
  • memory_utils: 添加 close_prot_errno_mov()
  • file_utils: 加强 lxc_open_dirfd()
  • file_utils: 加强 lxc_writeat()
  • cgroups: 添加 unified_cgroup_fd() 帮助程序
  • cgroups: 将控制器委派切换到仅文件描述符操作
  • macro: 将 ENOMEDIUM 滥用为 ENOCGROUP2
  • file_utils: 添加 lxc_read_try_buf_at()
  • cgroups: 添加 cgroup_get()
  • lxccontainer: 使用 cgroup_get()
  • cgroups: 重新排序 cgroup_get() 参数
  • cgroups: 添加 croup_set()
  • lxccontainer: 使用正确的变量排序
  • lxccontainer: 使用 cgroup_set()
  • cgroups: 将函数移动到方法之后
  • cgroups: 注释 cgroup_get()/cgroup_set()
  • commands_utils: 添加 lcx_cmd_notify_state_listeners()
  • freezer: 使用 lxc_cmd_notify_state_listeners()
  • cgroups: 添加 cgroup_freeze() 和 cgroup_unfreeze()
  • freezer: 使方法返回 bool
  • lxccontainer: 使用 cgroup_freeze() 和 cgroup_unfreeze()
  • cgroups: 在再次轮询之前回滚() 文件
  • cgroups: 删除未使用的 conf 参数
  • cgroups: 验证参数
  • lxccontainer: 使用正确的错误检查
  • cgroups: 将 cgroup_attach() 向下移动
  • cgroups: 对 cgroup_attach() 进行更严格的参数验证
  • cgroups: 从 cgroup_attach() 返回 ENOCGROUP2
  • attach: 显式检查 ENOCGROUP2
  • cgroups: 切换回返回整数
  • attach: 显式关闭 seccomp 通知程序文件描述符
  • cgpath: 添加日志记录
  • commands: 添加缺失的 lxc_cmd_get_limiting_cgroup2_fd() 实现
  • cgroups: 使用 lxc_cmd_get_limiting_cgroup2_fd()
  • cgroups: 导出 __cgroup_unfreeze() 以供命令使用
  • commands: 直接使用 __cgroup_unfreeze()
  • freezer: 删除 lxc_cmd_freeze() 和 lxc_cmd_unfreeze() 调用
  • test: 向 device_add_remove 添加日志记录
  • tests: 在 cgpath 测试中支持纯统一 cgroup 布局
  • cgroups: 改进参数验证
  • tests: 检查 device_add_remove 中的 NULL
  • syscalls: 添加 close_range()
  • rexec: 尽可能地将所有文件描述符标记为 close-on-exec
  • conf: 删除不必要的系统调用
  • conf: 限制 dev/ 的打开
  • conf: 在 lxc_fill_autodev() 中加强 open
  • conf: 在 lxc_setup_dev_symlinks() 中仅文件描述符操作
  • conf: 限制 lxc_mount_rootfs() 的打开
  • conf: 仅文件描述符枢轴根
  • conf: 仅文件描述符 devtps 设置
  • attach: 通过 pidfds 连接到命名空间
  • conf: 代码风格
  • conf: 使 lxc_create_tmp_proc_mount() 成为静态
  • conf: 限制 lxc_mount_rootfs() 中的 open 调用
  • conf: 重构瞬态 procfs 挂载
  • utils: 加强 __safe_mount_beneath_at()
  • cgroups: 限制仅文件描述符控制器挂载点创建
  • cgroups: 切换到基于文件描述符的 cgroup 挂载
  • attach: 修复连接到 cgroups 时的回退逻辑
  • cgroups: 修复 cgroup_attach() 中的参数验证
  • cgroups: 改进 cgroup_attach_leaf() 中的错误处理和日志记录
  • cgroups: 限制 cgroup_attach_create_leaf() 中的 open 调用
  • utils: 添加 mount_from_at()
  • conf: 修复 lxc_setup_dev_console()
  • conf: 开始在容器设置期间将 dfd 存储到主机的 / 中
  • conf: 限制仅文件描述符 lxc_fill_autodev()
  • syscall_wrappers: 修复 PROTECT_OPEN_W 宏
  • tree-wide: s/dev_mntpt_fd/dfd_dev/g
  • tree-wide: s/mntpt_fd/dfd_mnt/g
  • tree-wide: s/dfd_root_host/dfd_host/g
  • cgroups: 检查 cgroup_attach() 中来自 __cg_unified_attach() 的正确错误
  • attach: 改进日志记录和术语
  • utils: 检查 snprintf() 错误
  • utils: 添加 lxc_drop_groups()
  • tree-wide: 使用 lxc_drop_groups() 而不是 lxc_setgroups(0, NULL)
  • utils: 重构 lxc_setgroups()
  • confile: 添加 lxc.init.groups 以保留额外的组
  • attach: 添加组选项以保留额外的组 ID。
  • attach_options: 初始化 .groups
  • attach_options: 使用标准 C 指针语法
  • attach: 使用方括号括起标志检查
  • attach_options: 使用 size_t 来表示 lxc_groups_t
  • conf: 直接使用 lxc_groups_t
  • confile: 处理追加 init 组
  • mount_utils: 将 mount_at() 和 mount_from_at() 从 utils.{c,h} 中移出
  • mount_utils: 为新的 mount api 添加扩展的帮助程序
  • conf: 将 mount_autodev() 切换到新的 mount api
  • cgroups: 将 tmpfs 挂载切换到新的 mount api
  • cgroups:切换 __cg_mount_direct() 以使用新的挂载 API
  • mount_utils:删除 mount_at()
  • mount_utils:添加对通过新的挂载 API 进行绑定挂载的支持
  • conf:在 lxc_fill_autodev() 中使用 fd_bind_mount()
  • mount_utils:删除 mount_from_at()
  • mount_utils:检测新的挂载 API 支持
  • 全树:在有意义的地方使用 new_mount_api()
  • mount_utils:初始化 fd
  • attach:切换到简单的 mount()
  • mount_utils:删除 mount_filesystem()
  • mount_utils:添加锁定标志助手
  • conf:s/setup_mount()/setup_mount_fstab()/g
  • conf:删除 PATH_MAX 字节
  • conf:不传递 struct lxc_conf
  • conf:删除 PATH_MAX 字节
  • conf:删除 PAT_MAX 字节
  • network:如果找不到 iw,添加错误消息
  • conf:重做 rootfs 固定
  • mount_utils:s/OPEN_TREE_CLONE | OPEN_TREE_CLONE/OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC/g
  • conf:仅限 fd 的 tty 设置
  • tests:在 lxc-test-unpriv 中添加日志记录
  • conf:删除 PATH_MAX 字节
  • conf:删除 PATH_MAX 字节
  • conf:修复内存泄漏
  • criu:将特定于 criu 的 cgroups 方法标记为特定于 criu
  • criu:修改 exec_criu()
  • criu:将日志记录移至 lxc_log_trace() 下
  • criu:使用清理宏
  • criu:在解析挂载数据时使用清理宏
  • criu:重做 init pid 检索
  • criu:警告没有控制器的 cgroup 层次结构
  • criu:lxc_init() 已经初始化了 cgroups
  • criu:处理新的 cgroup 布局
  • cgroups:使用方括号为标志检查提供明确的语义
  • cgroups:进入监控 cgroups 时不要提前返回
  • cgroups:记录监控和瞬态进程进入
  • cgroups:记录容器进程进入
  • string_utils:添加 snprintf() 的包装器
  • cgroups:转换为 strnprintf()
  • attach:转换为 strnprintf()
  • commands_utils:转换为 strnprintf()
  • conf:转换为 strnprintf()
  • confile:转换为 strnprintf()
  • confile_utils:转换为 strnprintf()
  • criu:转换为 strnprintf()
  • file_utils:转换为 strnprintf()
  • log:转换为 strnprintf()
  • lxccontainer:转换为 strnprintf()
  • lxclock:转换为 strnprintf()
  • monitor:转换为 strnprintf()
  • mount_utils:转换为 strnprintf()
  • network:转换为 strnprintf()
  • rexec:转换为 strnprintf()
  • seccomp:转换为 strnprintf()
  • start:转换为 strnprintf()
  • terminal:转换为 strnprintf()
  • string_utils:转换为 strnprintf()
  • utils:转换为 strnprintf()
  • memory_utils:添加 close_move_fd()
  • string_utils:添加 proc_self_fd()
  • string_utils:添加 fdstr()
  • file_utils:添加 same_file_lax()
  • macro:添加 LXC_PROC_SELF_FD_LEN
  • conf:引入 lxc_bind_mount_console()
  • 全树:重做挂载 API 支持检查
  • attach:转换为 strequal()
  • cgroups:转换为 strequal()
  • conf:转换为 strequal()
  • confile:转换为 strequal()
  • confile_utils:转换为 strequal()
  • criu:转换为 strequal()
  • initutils:转换为 strequal()
  • log:转换为 strequal()
  • lsm:转换为 strequal()
  • lxccontainer:转换为 strequal()
  • network:转换为 strequal()
  • seccomp:转换为 strequal()
  • namespace:转换为 strequal()
  • start:转换为 strequal()
  • state:转换为 strequal()
  • string_utils:转换为 strequal()
  • terminal:转换为 strequal()
  • utils:转换为 strequal()
  • attach:转换为 strequal()
  • cgroups:转换为 strequal()
  • conf:转换为 strequal()
  • confile:转换为 strequal()
  • confile_utils:转换为 strequal()
  • file_utils:转换为 strequal()
  • freezer:转换为 strequal()
  • lsm:转换为 strequal()
  • lxccontainer:转换为 strequal()
  • seccomp:转换为 strequal()
  • utils:转换为 strequal()
  • start:重做命名空间保留和钩子的路径创建
  • network:将命名空间 fd 路径公开给网络钩子
  • start:修复错误处理并改进注释
  • start:改进命名空间保留
  • start:改进注释
  • start:改进 lxc_spawn() 中的注释
  • cgroups:将 cgns_supported() 移动到 cgroup 工具
  • conf:不要将 conf 单独传递给 lxc_mount_auto_mounts()
  • cgroups:将处理程序传递给 cgroup mount() 方法
  • cgroups:验证我们是否确实在 cgroup 命名空间中运行
  • cgroups:改进 cgroup 挂载
  • utils:添加开发助手以快速转储目录内容
  • cgroups:明确指出将标志参数传递给 cgroup 挂载函数
  • cgroups:不要剥离 LXC_AUTO_CGROUP_FORCE
  • cgroups:切换到基于标志的检查
  • conf:删除错误注释
  • cgroups:s/cg_mount_in_cgroup_namespace()/cgroupfs_mount()/g
  • cgroups:s/cg_mount_cgroup_full()/cgroupfs_bind_mount()/g
  • cgroups:修复传统挂载路径中的标志检查
  • cgroups:当支持并使用 cgroup 命名空间时,剥离 LXC_AUTO_CGROUP_MIXED 和 LXC_AUTO_CGROUP_FULL_MIXED
  • cgroups:s/__cg_mount_direct()/__cgroupfs_mount()/g
  • cgroups:记录提前返回
  • cgroupfs:重做 cgroup2 挂载
  • confile:对大多数 cgroup 布局修改器使用 set_config_path_item()
  • confile_utils:规范化配置项中的路径
  • confile:禁止对修改 cgroup 布局的 confile 项目向上行走
  • cgroups:s/cg_init()/__cgroup_init()/g
  • cgroups:隐藏主机的 cgroupfs 文件描述符
  • cgroups:更好地记录隐藏的文件描述符
  • cgroups:重做 add_hierarchy()
  • cgroups:重做基本 cgroup 解析
  • confile:禁止在修改 cgroup 布局的配置项中使用绝对路径
  • cgroups:当找不到 cgroup 层次结构时失败
  • cgroups:隐藏控制器挂载点和基本 cgroup 路径的 fd
  • cgroups:仅限 fd 的 cgroup 创建
  • cgroups:重做传统的 cpuset 处理
  • cgroups:改进日志记录
  • string_utils:在 must_make_path() 中处理空字符串
  • cgroups:允许 "" 基本 cgroup 路径
  • cgroups:修复 fd 泄漏
  • cgroups:重做添加层次结构的方式
  • namespace:添加缺少的 \0 终止符
  • cgroups:防止双重关闭
  • file_utils:将 dup_cloexec() 移动到头文件
  • cgroups:仅限 fd 的 cgroup 树修剪
  • cgroups:删除过时的 cgroup_tree 处理
  • cgroups:s/openat()/open_at()/g
  • cgroups:检查正确的变量
  • cgroups:重做统一控制器委托
  • start:委托然后移动到目标 cgroup
  • cgroups:重新排列函数参数
  • cgroups:删除过时的检查
  • cgroups:重做创建失败时的 cgroup 树移除
  • cgroups:确保在创建失败时正确修剪叶 cgroup
  • cgroups:重做 cgroup 树创建
  • cgroups:在创建有效负载时更加严格
  • cgroups:不要依赖绝对路径
  • cgroups:不要将枢纽 cgroup 移动到监控器的 cgroup 下
  • cgroups:确保我们不移除我们没有创建的 cgroups
  • cgroups:确保我们修剪限制目录
  • cgroups:简化挂载打开
  • cgroups:防止 NULL 指针解引用
  • cgroups:记录中间清理
  • cgroups:区分 tmpfs 和基于统一的 cgroup 布局文件描述符
  • cgroups:确保在传统代码路径中初始化 cgroup_root
  • cgroups:防止 cgroup 挂载类型被覆盖
  • cgroups:验证只设置了一个 cgroup 挂载类型
  • conf:使用方括号来澄清检查语义
  • cgroups:现在我们切换了所有代码路径,使用非基于标志的检查
  • cgroups:如果缺少控制器目录,则创建它们
  • cgroups:使我们从标志过渡到类型的过程非常明显
  • cgroups:不要覆盖类型
  • cgroups:修复错误值
  • utils:修复 print_r() 调试助手
  • cgroups:释放正确的路径
  • cgroups:删除 monitor_full_path
  • bpf:直接使用 cgroup fd 而不是路径
  • conf:引入 lxc_bpf_devices_rule_t 类型
  • bpf:使用返回宏
  • bpf:对齐结构初始化
  • bpf:启用助手以让调用者替换现有的 bpf 程序
  • cgroups:使设备 cgroups 语义更清晰
  • cgroups:改进 bpf 设备程序处理
  • bpf:添加助手以更好地管理 bpf 设备程序
  • cgroups:改进 bpf 设备程序管理
  • commands:改进 bpf 设备程序管理
  • commands:在更新时替换 bpf 程序
  • macro:添加交换助手
  • bpf:使用 __u32 而不是 uint32_t
  • bpf:不要关闭无效的 fd,只需交换
  • commands:重做 bpf 设备 BPF_F_REPLACE 代码路径
  • bpf:重做 bpf_program_cgroup_detach()
  • bpf:处理缺少的定义
  • bpf:供应商 bpf 标头
  • cgroups:删除编译时 bpf 支持检测
  • bpf:添加并使用 bpf_cgroup_devices_attach() 助手
  • bpf:让 bpf_list_add_device() 直接获取设备列表
  • bpf:修复 bpf_program_cgroup_attach() 中的返回值
  • compiler:修复 fallthrough 属性
  • bpf:重做实时设备 cgroup 更新
  • lxccontainer:修复重启日志记录
  • memory_utils:添加 close_equal() 和 free_equal()
  • cgroups:使用 close_equal() 和 free_equal()
  • bpf:防止双重关闭
  • bpf:使 bpf_program_cgroup_attach() 静态
  • bpf:简化 bpf(设备)程序释放
  • conf:对控制台使用更合理的模式
  • start:修复非守护进程和应用程序容器
  • conf:不要记录垃圾
  • apparmor:清理 apparmor_process_label_get
  • apparmor:优先使用 /proc/.../attr/apparmor/current 而不是传统接口
  • file_utils:允许 fd_to_buf() 确实失败
  • lsm:调整 apparmor_process_label_get()
  • cgroups:确保不返回垃圾
  • cgroups:使设备 cgroup 处理更智能、更简单
  • commands:仅在真正需要时更新 bpf 设备程序
  • bpf:注释 bpf_cgroup_devices_update()
  • bpf:修复拼写错误
  • conf:改进 lxc_clear_cgroups()
  • conf:公开 lxc_clear_cgroup2_devices()
  • cgroups:调整 bpf_device_cgroup_prepare()
  • bpf:更新设备 cgroup 语义
  • doc:添加缺少的 ".[控制器文件] 后缀到 lxc.cgroup{2}。键解释
  • doc:解释基于 eBPF 的设备控制器语义
  • doc:调整 cgroup 标题
  • string_utils:移动 lxc_iterate_parts()
  • cgroups:修复 prune_init_scope()
  • cgroups:避免为单次访问添加额外的变量
  • cgroups:s/must_copy_string()/strdup()/g
  • cgroups:调整 __cgroup_init() 中的 lxc.cgroup.use 处理
  • cgroups:调整返回值
  • cgroups:简化纯统一 cgroup 布局上的当前 cgroup 检索
  • cgroups:s/basecginfo/cgroup_info/g
  • compiler:添加 likely() 和 unlikely() 支持
  • macro:添加指针错误编码支持
  • memory_utils:适应新的指针错误宏
  • cgroups:分离统一 cgroup 助手
  • cgroups:重做 cgroup 初始化
  • cgroups:简化字符串列表处理
  • cgroups:将委托检查拆分为单独的助手
  • cgroups:s/add_hierarchy()/cgroup_hierarchy_add()/g
  • cgroups:删除未使用的助手
  • cgroups:引入 cgroup 层次结构类型
  • cgroups:简化和修复在不支持 cgroup 命名空间的内核上的挂载
  • cgroups:重命名 cgroupfs 挂载 fd
  • cgroups:s/container_base_path/at_base/g
  • cgroups:s/mountpoint/at_mnt/g
  • cgroups:s/cgfd_con/dfd_con/g
  • cgroups:s/cgfd_mon/dfd_mon/g
  • cgroups:s/cgfd_limit/dfd_lim/g
  • cgroups:s/container_full_path/path_con/g
  • cgroups:s/container_limit_path/path_lim/g
  • cgroups:将 cgroup2 参数移动到子结构
  • cgroups:s/cgroup2_chown/delegate/g
  • cgroups:改进实用程序控制器处理
  • file_utils:调整 lxc_write_openat()
  • cgroups:修复 cg_legacy_freeze() 返回类型
  • cgroups:处理 lxc.cgroup.use 全局参数
  • memory_utils:修复 close_equal()
  • cgroups:跳过并警告无效的文件描述符
  • cgroups:开始隐藏所有 fd
  • cgroups:关闭 dfd_mon 但保持 dfd_con 和 dfd_lim 对所有 cgroup 层次结构打开
  • commands:明确枚举编号
  • commands:调整 validate_string_request()
  • af_unix:改进 SCM_RIGHTS 文件描述符检索
  • cgroups:添加 cgroup_fds() 助手
  • state:*绝不* 从 lxc_state2str() 返回 NULL
  • commands:在命令处理期间更加明确
  • commands:引入 lxc_cmd_rsp_send_reap()
  • commands:引入 rsp_one_fd()
  • commands:引入 rsp_many_fds()
  • commands:添加 LXC_CMD_GET_CGROUP_FD
  • cgroups:允许批量检索 cgroup fd
  • macro:添加 min() 宏
  • utils:添加 copy_struct_from_client()
  • log:添加 syswarn_set()
  • utils:添加 copy_struct_to_client()
  • commands:引入 LXC_CMD_GET_CGROUP_CTX
  • cgroups:引入仅限 fd 的 cgroup 附加
  • commands:发送 ENOSYS 响应
  • commands:优雅地处理较旧的客户端
  • commands:lxc_cmd_add_state_client_callback()
  • attach:修复不支持的命名空间
  • af_unix:添加关于强制转换的注释
  • attach:删除额外的换行符
  • commands:优雅地处理较旧的客户端
  • commands:验证发送了预期的文件描述符
  • attach:修复命名空间保留
  • terminal:降低日志记录级别
  • attach:使 fd 发送更统一
  • attach:处理新旧客户端
  • 命令:处理 LXC_CMD_GET_CGROUP_CTX 的旧客户端
  • 命令:只解除引用一次
  • af_unix:防止越界写入
  • cgroups:修复错误检查
  • 命令:移除错误使用 access 属性
  • cgroups:修复控制器列表创建过程中的脑残
  • 附加:对文件描述符保持偏执
  • cgroups:简单的变量重新排序
  • error_utils:将错误辅助函数移至单独的头文件
  • 命令:调整返回值
  • error_utils:复制 Lennart 的 IN_SET()
  • cgroups:使用 ERRNO_IS_NOT_SUPPORTED()
  • cgroups:优雅地处理回退
  • 命令:修复 lxc_cmd_get_cgroup_ctx() 的对齐方式
  • 命令:简化 lxc_cmd_get_cgroup_ctx()
  • 命令:将 s/LIMITING/LIMIT/g 和 s/limiting/limit/g
  • 命令:添加 LXC_CMD_GET_CGROUP_FD 和 LXC_CMD_GET_LIMIT_CGROUP_FD
  • cgroups:将 s/cgroup_layout/layout/g
  • 命令:将 rsp.ret 设置为 lxc_cmd_get_cgroup_ctx_callback() 的 0
  • file_utils:实际打开文件以供读取
  • 命令:扩展 rsp_one_fd() 以处理附加数据
  • 命令:添加 LXC_CMD_GET_CGROUP_FD 和 LXC_CMD_GET_LIMIT_CGROUP_FD
  • 命令:将 s/LXC_CMD_CONSOLE/LXC_CMD_GET_TTY_FD/g
  • 命令:注释数组参数
  • 命令:确保始终传递非 NULL 和 MAX_STATE
  • 命令:在 lxc_cmd() 中使用 IN_SET()
  • 命令:切换到 bool
  • 命令:将 s/lxc_cmd_init()/lxc_server_init()/g
  • 命令:添加 lxc_cmd_init() 和 lxc_cmd_data()
  • 命令:将 lxc_try_cmd() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_init_pid() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_init_pidfd() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_devpts_fd() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_seccomp_notify_fd() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_cgroup_ctx() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_clone_flags() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_cgroup_path_do() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_config_item() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_state() 移植到新的辅助函数
  • 命令:将 lxc_cmd_stop() 移植到新的辅助函数
  • 命令:将 lxc_get_tty_fd() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_name() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_lxcpath() 移植到新的辅助函数
  • 命令:将 lxc_cmd_add_state_client() 移植到新的辅助函数
  • 命令:将 lxc_cmd_add_bpf_device_cgropu() 移植到新的辅助函数
  • 命令:将 lxc_cmd_console_log() 移植到新的辅助函数
  • 命令:将 lxc_cmd_serve_state_clients() 移植到新的辅助函数
  • 命令:将 lxc_cmd_seccomp_notify_add_listener() 移植到新的辅助函数
  • 命令:将 lxc_cmd_freeze() 移植到新的辅助函数
  • 命令:将 lxc_cmd_unfreeze() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_cgroup_fd() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_limit_cgroup_fd() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_cgroup2_fd() 移植到新的辅助函数
  • 命令:将 lxc_cmd_get_limit_cgroup2_fd() 移植到新的辅助函数
  • 命令:让 lxc_cmd() 返回 ssize_t 以指示它不仅在成功时返回 0
  • 宏:添加 hweight*() 辅助函数
  • af_unix:允许调用者和被调用者协商期望值和实际值
  • 命令:重新设计 lxc_cmd_rsp_recv() 以使其更明显
  • 命令:改进 lxc_cmd_get_tty_fd()
  • 测试:在 lxc-test-lxc-attach 中添加日志记录
  • 日志:添加更多日志和返回辅助函数
  • 命令:使用调试日志记录
  • 命令:将命名错误的函数移植到通用风格
  • commands:发送 ENOSYS 响应
  • 命令:将 s/LIMITING/LIMIT/g 和 s/limiting/limit/g
  • 命令:清理错误处理和变量命名
  • 命令:rsp_one_fd_{reap,keep}() 和 rsp_many_fds_reap()
  • 命令:修复缩进
  • 命令:统一 fd 获取命令
  • 全树:将 s/syerrno_set()/syserror_set()/g
  • 全树:开始用 syserror() 替换 syserrno() 的实例
  • 全树:用 syserror_ret() 替换 syserrno() 的剩余实例
  • 日志:标记要使用的日志记录辅助函数
  • 全树:使用新的日志记录辅助函数
  • 全树:替换旧的 systrace 日志记录辅助函数
  • 全树:替换旧式的 sysinfo 日志记录返回辅助函数
  • 网络:使回调命名一致且易懂
  • 网络:修复 lxc_create_network_unpriv_exec() 中的编码风格
  • confile_utils:确保内存已清零
  • 网络:修复语法
  • 网络:添加 lxc_network_info 结构体
  • 网络:处理重命名网络设备时的名称冲突
  • 网络:对网络进行两遍遍历
  • conf:通过携带未使用的结构体来简化回滚
  • 网络:携带一些结构体来简化回滚
  • confile:初始化网络结构体
  • af_unix:检查所有参数
  • cgroup:如果不存在可写的层次结构,不要失败
  • attach_options:显式编号枚举
  • attach_options:修复 LXC_ATTACH_NO_NEW_PRIVS 中的空格错误
  • attach_options:为所有枚举添加显式定义
  • 启动:处理 arm64 上的 CLONE_PIDFD
  • conf:调整关于瞬时 procfs 挂载的注释
  • conf:简化依赖挂载逻辑
  • conf:确保 procfs 和 sysfs 已卸载
  • conf:清理自动挂载
  • conf:简化 lxc_mount_auto_mounts() 中的日志记录
  • conf:在 lxc_mount_auto_mounts() 中添加丢失的换行符
  • cgroups:忽略未使用的控制器
  • 宏:定义 __aligned_u64 以处理不支持该功能的内核
  • 切换到 Github Actions
  • github:修复 Coverity 的无效语法
  • rexec:不要关闭 stderr
  • string_utils:如果不可用,提供 strchrnul() 的版本
  • 包含:修复拼写错误
  • 配置:修复 strchrnul 条件编译
  • strchrnul:忽略增加的必需对齐警告
  • strchrnul:修复复制粘贴脑残
  • confile_utils:不要两次释放 netdev
  • conf:修复内存泄漏
  • ci:打开 CIFuzz
  • confile:修复 set_config_sysctl()
  • conf:在清除 sysctl 列表后重新初始化它
  • confile_utils:从列表中删除 netdev
  • 列表:添加 lxc_list_new() 辅助函数
  • confile:在所有地方使用 lxc_list_new()
  • conf:在所有地方使用 lxc_list_new()
  • oss-fuzz:使构建模糊测试器成为可能,无需 docker
  • 网络:处理将物理接口返回给主机时的名称冲突
  • 模糊测试:在 /tmp 中创建临时文件
  • 自述文件:添加 OSS-Fuzz/CIFuzz 徽章
  • 模糊测试:生成所有配置键并将它们添加到种子语料库
  • 日志:不要为模糊测试构建创建日志文件
  • 日志:不要为模糊测试构建创建目录
  • 日志:处理空日志名称
  • confile:在配置辅助函数中更加严格
  • confile:在覆盖 lxc.rootfs.options 时不要泄漏内存
  • confile_utils:修复实时信号解析
  • conf:防止 lxc_clear_limits() 中的 UAF
  • confile_utils:改进网络解析器
  • string_utils:修复 parse_byte_size_string()
  • 日志:避免针对相对日志路径的回归
  • conf:不要泄漏列表
  • confile:修复设置 prlimits
  • string_utils:始终在 lxc_safe_int64_residual() 中将 buf 设为零
  • conf:重新初始化列表
  • confile_utils:在 lxc_remove_nic_by_idx() 期间释放网络列表项
  • conf:编码风格清理
  • confile:使 get_network_config_ops() 中的字符串计算更加明显
  • confile:使用正确的检查来判断网络列表是否过大
  • confile:改进网络验证
  • confile:修复 set_config_net_hwaddr() 中的内存泄漏
  • confile:防止解析网络时发生递归
  • ci:在 CIFuzz 上打开 ASan
  • confile_utils:在 lxc_remove_nic_by_idx() 期间释放列表
  • confile:添加丢失的前缀验证
  • confile:如果设置了多个 shmount,不要泄漏内存
  • confile_utils:修复有符号整数溢出
  • oss-fuzz.sh:考虑 SANITIZER
  • cifuzz:打开 UBsan
  • string_utils:在 parse_byte_size_string() 中正确处理溢出
  • cifuzz:打开 MSan
  • string_utils:解决 MSan 的误报
  • confile:在 set_config_net_ipv6_gateway() 中安全地清理先前值
  • confile:在 set_config_net_ipv4_gateway() 中安全地清理先前值
  • confile:更积极地验证键
  • confile:在网络类型更改时清除 netdev
  • confile:清理 set_config_net_hwaddr()
  • confile:清理 set_config_net_mtu()
  • confile:清理 set_config_net_script_up()
  • confile:清理 set_config_net_script_down()
  • 测试:修复 parse_config_file() 中的两个误报
  • 测试:添加另一个针对垃圾配置键的测试
  • conf:修复 thread_local 支持检测
  • lxccontainer:确保 bsearch 的第二个参数从不为 NULL
  • 编译器:修复 thread_local 检测
  • oss-fuzz.sh:将 "lxc.net" 键也放在种子语料库中
  • autotools:删除 --enable-{asan,ubsan},改为使用 --enable-sanitizers
  • 自述文件:删除 Travis 并添加 Github Actions 徽章
  • 文档:记录了网络类型字段必须出现在网络设备上其他选项之前的要求
  • ci:停止传递 --enable-ubsan
  • oss-fuzz.sh:摆脱 sed "no-undefined" 临时措施
  • ci:也使用 ASan/UBsan 构建
  • ci:启用 PAM
  • 构建系统:使其与 ASan/UBsan/MSan 兼容
  • oss-fuzz:尽早拒绝巨大的配置
  • confile:不要两次跳转到全局表
  • string_utils:切换到 path_simplify()
  • confile:在 set_config_net_ipv4_address() 中限制为最后一位
  • lxc_user_nic:清理 append_alloted()
  • lxc_user_nic:清理 get_alloted()
  • string_utils:移动到 lxc-copy() 源码
  • string_utils:确保在返回时设置 errno
  • string_utils:为 lxc_safe_int64_residual() 使用 restrict
  • confile:简化 get_network_config_ops()
  • confile:修复 lxc.namespace.share.[identifier]
  • confile:当 LXC 在没有 selinux 支持的情况下构建时发出警告
  • confile:当 LXC 在没有 AppArmor 支持的情况下构建时发出警告
  • conf:修复 /dev 在 LXC 控制范围之外的设置
  • 日志:确保我们始终返回负 errno
  • templates/*.in:修复了带空格的 PATH 处理
  • oss-fuzz:模糊测试 lxc_config_define_add 和 lxc_config_define_load
  • confile:修复 lxc_config_define_add 中的内存泄漏
  • cifuzz:模糊测试时间更长
  • 宏:确保 ret_errno() 始终返回负值
  • 日志:添加 error_ret()
  • confile:强制执行最大子键长度
  • github:尝试修复操作命名
  • confile:使 lxc_get_config() 和 lxc_get_config_net() 始终返回非 NULL
  • conf:简化 idmaptool_on_path_and_privileged()
  • conf:当 idmaptools 缺少所有权限时,不要报告成功
  • 附加:在通过 pidfd 计算命名空间时,不要过早返回
  • 还原 "rexec:如果可能,将所有 fd 标记为 close-on-exec"
  • confile:使 lxc_get_config() 和 lxc_get_config_net() 始终返回非 NULL
  • 测试:修复 cgpath 中的内存泄漏
  • 测试:修复 lxcpath 中的内存泄漏
  • 还原 "confile:使 lxc_get_config() 和 lxc_get_config_net() 始终返回非 NULL"
  • 测试:修复 cgpath 中的内存泄漏
  • 测试:修复 attach 中的内存泄漏
  • lxccontainer:修复容器创建错误路径
  • 测试:在 lxc-test-checkpoint-restore 中切换到 "busybox" 模板
  • 测试:停止在 share_ns 中截断右方括号
  • 测试:将 ASAN/UBSAN 选项传递给几个测试
  • error_utils:添加丢失的 macro.h 包含
  • 配置:修复消毒剂编译
  • process_utils:在返回后释放堆栈
  • 命令:不要无谓地分配
  • apparmor:在调用 strcspn 之前将字节转换为以 null 结尾的字符串
  • ci:尝试在 ASan/UBsan 下运行测试
  • ci:将 lib[au]san 与 init.lxc.static 静态链接
  • ci:从 lxc-ci 存储库切换到 lxc-exercise
  • ci:解决 https://github.com/lxc/lxc/issues/3798
  • ci:解决 https://github.com/lxc/lxc/issues/3788
  • ci:防止 lxc-exercise 无限期运行
  • ci:解决 https://github.com/lxc/lxc/issues/3796
  • ci:打开 strict_string_checks
  • ci:使用 -Wall -Werror 构建
  • 还原 "ci:解决 https://github.com/lxc/lxc/issues/3796"
  • 测试:释放 lxc_cmd_rsp_recv 填充的缓冲区
  • ci:使用 --enable-sanitizers 而不是 CFLAGS
  • autoconf:将 AC_LANG_SOURCE 添加到 CC_CHECK_LDFLAGS
  • 构建系统:停止使用消毒剂构建 init.lxc.static
  • ci:摆脱 -static-libasan 权宜之计
  • autoconf:停止通过 AM_LDFLAGS 传递 -fsanitize=address
  • seccomp:初始化和销毁 notifier.cookie
  • conf:重新设计 lxc 特定挂载选项解析
  • conf:添加对 idmapped 挂载的第一个,简单的支持
  • confile:解析 idmap=rootfs 的挂载选项
  • mount_utils:添加对 mount_setattr() 系统调用的支持
  • 存储:在 lxc_storage 中保留对 lxc_rootfs 的引用
  • mount_utils:添加辅助函数以确定新的挂载 api 是否支持绑定挂载
  • conf:支持 id映射目录
  • mount_utils:添加两个分离的挂载辅助函数
  • 启动:记录 idmapped 挂载
  • conf:验证 rootfs 是否支持 idmapped 挂载
  • 附加:在初始化期间将 pid 与 fd 视觉上分开
  • 附加:使用正确的 lxc_namespace_t 类型
  • apparmor:处理 on-exec
  • conf:调整 parse_lxc_mntopts()
  • conf:目前还不允许使用 idmapped lxc.mount.{entry,fstab}
  • strchrnul: 包含头文件
  • conf: 包含 strchrnul 用于不支持它的平台
  • Makefile: 修复 strchrnul() 包含
  • getsubopt: 使用正确的包含
  • conf: 更好的命名
  • conf: 在 parse_lxc_mntopts() 中不要越界目标缓冲区
  • dir: 修复根文件系统挂载
  • configure: 修复函数检测
  • conf: 将 lxc_storage 存储到 lxc_rootfs 并绑定到它的生命周期
  • conf: 将所有挂载选项移到 struct lxc_mount_options
  • conf: s/lxc_rootfs_prepare/lxc_rootfs_init/g
  • conf: 提高 idmapped 挂载支持
  • build-system: 添加 --enable-fuzzers
  • ci: 切换到 --enable-fuzzers
  • log: 如果在模糊目标之外调用,则在“模糊”模式下创建日志文件
  • tests: 与其他测试一起运行模糊测试器
  • build-system: 在构建模糊测试器时关闭 lto=thin
  • dir: 使用 mnt_opts->data 而不是 mntdata
  • storage/dir: bdev->dest 不能为空
  • storage/dir: 使用清晰的错误消息
  • storage/dir: 稍后检索正确的源路径
  • storage/dir: 使用“source”和“target”作为术语
  • storage/dir: source 不能为空
  • storage/dir: 删除错误处理
  • storage/dir: 清理挂载代码
  • api-extensions: 为 idmapped_mounts 添加条目
  • storage: 修复 dup_cloexec() 调用
  • cgroups: 修复回退附加代码路径
  • oss-fuzz: 在 OSS-Fuzz 上始终关闭日志记录
  • conf: 修复控制台 chmod 错误日志消息
  • github: 在消毒剂测试中运行 apt-get update
  • github: 删除 dh-* 包
  • github: 也将 j 选项传递给 make
  • string_utils: 绕过 GCC-11 误报
  • confile: 使 per_name 结构体静态
  • commands: 在接收文件描述符时以调试而不是信息级别记录
  • syscalls: 如果未定义,则包装 personality 系统调用
  • tree-wide: 使 personality 代码路径无条件
  • conf: 微调 setup_personality()
  • conf: 重做 lxc_config_parse_arch()
  • attach_options: 恢复头文件
  • conf: 添加 personality_t
  • attach: 引入显式个性宏

支持和升级

LXC 4.0 分支支持到 2025 年 6 月。
只有错误修复和安全问题会包含在稳定的错误修复版本中,因此始终安全且建议您保持最新状态并运行最新的错误修复版本。

下载