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 月。
只有错误修复和安全问题会包含在稳定的错误修复版本中,因此始终安全且建议您保持最新状态并运行最新的错误修复版本。
下载¶
- 主发行版 tarball: lxc-4.0.9.tar.gz
- GPG 签名: lxc-4.0.9.tar.gz.asc