LXC 2.0.11 已发布¶
2019年3月12日
简介¶
这是 LXC 2.0 的第 11 个错误修复版本。
请注意,LXC 2.0.10 在 2.0.11 发布前几天发布,但发布的 tarball 缺少一些文件,并且无法在 Android 上构建,因此我们最终发布了 2.0.11 来解决此问题。
以下变更日志包含了 2.0.9 到 2.0.11 之间发生的所有更改。
安全修复¶
修复 CVE-2018-6556¶
当 lxc-user-nic
被要求删除网络接口时,它会无条件地打开用户提供的路径。此代码路径可被非特权用户用于检查他们原本无法访问的路径是否存在。它还可能通过导致(只读)打开特殊的内核文件(ptmx、proc、sys)来触发副作用。更多详细信息请参见 此处。
修复 CVE-2019-5736¶
此版本修复了 CVE-2019-5736。这是一个影响所有容器运行时的重大安全问题,在连接到特权容器时可被利用。有关此错误以及如何修复它的更多详细信息,请参见 此处。
主要错误修复¶
允许连接到未定义的容器¶
例如,以下序列现在应该可以工作
lxc-start -n <container-name> -f /path/to/conf \ -s 'lxc.id_map = u 0 100000 65536' \ -s 'lxc.id_map = g 0 100000 65536' \ -s 'lxc.rootfs = /path/to/rootfs' \ -s 'lxc.init_cmd = /path/to/initcmd'
在连接中正确处理命名空间继承¶
lxc_attach
现在将正确区分调用方指定要连接到的特定命名空间和调用方未请求特定命名空间的情况。后者被 lxc_attach
解释为意味着将连接所有命名空间。这还必须包括所有继承的命名空间。
允许创建 testing
和 unstable
Debian 容器¶
能够创建 testing
容器(无论下一个稳定版本的名称是什么)在多种情况下都很有用,包括但不限于测试目的。即,在 buster
发布后,无需显式切换到 bullseye
即可继续跟踪 testing
。既然我们正在讨论,那么也让我们启用 unstable
,它与 sid
完全相同,但没有理由不能启用它。
启用无 CAP_SYS_ADMIN
的容器(cgroup 处理)¶
如果支持 cgroup 命名空间但我们没有 CAP_SYS_ADMIN
,则需要为容器挂载 cgroups。此补丁启用了没有 CAP_SYS_ADMIN
的特权和非特权容器。
改进的 cgroup2
处理¶
由于 cgroup2 变得越来越普遍,LXC 2.0.11 在该领域进行了大量改进。
支持 cgroups 的只读挂载¶
如果容器缺少 CAP_SYS_ADMIN
并且因此无法重新挂载,这将特别有用。
允许通过 SIGTERM
退出控制台¶
这允许在没有控制序列的情况下干净地退出控制台会话。相反,可以将 SIGTERM
发送到受影响的进程,它将导致 LXC 清理终止控制台会话。
在运行应用程序容器时正确计算传递的参数数量¶
在某些情况下,传递给 exec
的参数数量计算错误。此版本确保计算并传递正确数量的参数到 exec
。
从代码库中删除所有不必要的锁定¶
旧版本的 LXC 在多个地方使用互斥锁来确保线程安全。对这些代码路径的仔细重新设计使我们能够从代码库中删除所有互斥锁。这导致了各种操作(例如容器启动和停止)的简化和加速。
修复 cgroup 命名空间保留¶
这消除了竞争条件,并确保缓存的文件描述符引用容器的 cgroup 命名空间而不是宿主的 cgroup 命名空间。
允许应用程序共享宿主的 pid 命名空间¶
以前的 LXC 版本不允许共享宿主的 pid 命名空间。从这个错误修复版本开始,可以正确地做到这一点。
正确处理非常短暂的应用程序容器¶
以前的版本在正确处理极短命的应用程序容器方面存在问题。例如,由于 TOCTU,LXC 可能会错误地报告容器仍在运行(而实际上它已经关闭),并拒绝重新启动它。这会导致不必要的延迟。此外,此类短命容器写入 stdout 的输出可能会丢失或被截断。此版本修复了这两个问题。
正确处理 /proc
已使用 hidepid=1
或 hidepid=2
挂载的容器¶
在以前的版本中,作为非特权用户连接到非特权容器,并且 /proc
以 hidepid=1
或 hidepid=2
挂载,将失败,因为 LXC 无法从 /proc
中检索所需的信息。现在已修复此问题。
即使支持 cgroup 命名空间,也允许强制挂载 cgroups¶
这允许用户指定 lxc.mount.auto = cgroup:mixed:force
或 lxc.mount.auto = cgroup:ro:force
或 lxc.mount.auto = cgroup:rw:force
。
当支持 cgroup 命名空间时,LXC 不会为容器挂载 cgroups,因为它假设 init 系统如果需要,将自行挂载 cgroups。当用户希望运行没有 CAP_SYS_ADMIN 的容器时,此假设已经失效。
例如,基于 systemd 的容器将无法启动,因为 systemd 需要挂载 cgroups(名为 systemd 层次的旧版 cgroups 和名为统一层级的统一 cgroups)来跟踪进程。通过检测容器是否具有 CAP_SYS_ADMIN 来解决此问题。如果没有,我们将为其执行 cgroup 挂载。
但是,在支持 cgroup 命名空间时,还有更多情况下我们应该能够为容器挂载 cgroups
- init 系统本身不挂载 cgroups
不挂载 cgroups 的 init 系统将无法使用 cgroups,尤其是在与自定义 LSM 配置文件结合使用以防止在容器内进行 cgroup {u}mount() 时。 - 应用程序容器
应用程序容器通常不会自行挂载 cgroups。 - 只读 cgroups
能够以只读方式挂载 cgroups 很有用,例如,防止从容器内部更改 cgroup 限制,同时允许应用程序对其自己的 cgroups 进行自检。这再次主要对应用程序容器有用。运行 systemd 的系统容器在以只读方式挂载 cgroups 时通常无法正常工作。
其他所有内容¶
2.0.11 包含了近一年半从当前 LXC 中挑选出来的错误修复,完整的列表如下所示。
完整变更日志
- tools: 允许 lxc-attach 连接到未定义的容器
- utils: 移动 memfd_create() 定义
- utils: 添加 lxc_cloexec()
- utils: 添加 lxc_make_tmpfile()
- utils: 添加 lxc_getpagesize()
- utils: 添加 lxc_safe_long_long()
- utils: parse_byte_size_string()
- utils: 添加 lxc_find_next_power2()
- namespace: 使用 lxc_getpagesize()
- lxc-debian: 允许创建
testing
和unstable
- 再次从 lxc_execute 调用 lxc_config_define_load
- 修复 lxc-net 脚本中的错别字
- 添加缺失的 lxc_container_put
- lxc-debian: 不要将 C.* 区域设置写入 /etc/locale.gen
- attach: 正确处理命名空间继承
- cgfsng: 修复 cgroup2 检测
- cgroups: 启用无 CAP_SYS_ADMIN 的容器
- lxc-start: 删除不必要的检查
- start: 关闭不需要的文件描述符
- handler: 将 name 参数设为 const
- start: 在父进程中关闭数据套接字
- monitor: 不要记录无用的警告
- network: 在所有情况下都回收子进程
- conf: 在所有情况下都回收子进程
- storage: 切换到 ext4 作为默认文件系统
- tools: 修复 lxc-create 的帮助输出
- attach: 处理命名空间继承
- cgroups/cgfsng: 保持挂载点完整
- cgroups/cgfsng: cgfsns_chown() -> cgfsng_chown()
- cgroups/cgfsng: 支持使用 cgroup ns 的 MS_READONLY
- log: 使用 vsnprintf() 检查 I/O 错误
- cgroupfs/cgfsng: 调整日志记录
- cgroups/cgfsng: 删除 is_lxcfs()
- cgroups/cgfsng: 修复 cgroup2 的 get_controllers()
- cgroupfs/cgfsng: 改进 cgroup2 处理
- config: 删除 SIGRTMIN+14 作为 lxc.signal.stop
- commands: 非功能性更改
- console: 非功能性更改
- console: 非功能性更改
- lxc-test-unpriv: 修复 overlayfs 挂载错误
- attach: 允许使用空配置进行连接
- tools/lxc_attach: 删除 API 日志记录
- console: 修复控制台信息消息
- 添加缺失的依赖项 libunistring
- cgroups/cgfsng: 适应新的 cgroup2 委派
- console: 按需报告分离消息
- lxccontainer: 启用守护进程模式的应用程序容器
- console: 使用正确的转义序列检查
- console: 为通用信号处理程序做准备
- console: 在 SIGTERM 上退出主循环
- commands: 非功能性更改
- lxccontainer: 非功能性更改
- commands: 修复状态套接字实现
- lxc_init: 在子会话中设置控制终端
- lxc-test-unpriv: 在删除用户之前检查用户是否存在
- 修复 lxc.spec.in 中的错别字
- conf: 将 CAP_SYS_* 定义移动到 utils.h
- start.c: 始终切换 uid 和 gid
- 使用 AX_PTHREAD 配置脚本检测 pthread api
- utils.h: 避免重复的 sethostname 实现
- tools/lxc_cgroup: 删除内部日志记录
- tools/lxc_autostart: 删除内部日志记录
- tools/lxc_clone: 删除内部日志记录
- tools/lxc_console: 删除内部日志记录
- tools/lxc_create: 删除内部日志记录
- tools/lxc_destroy: 删除内部日志记录
- tools/lxc_device: 删除内部日志记录
- tools/lxc_execute: 删除内部日志记录
- tools/lxc_freeze: 删除内部日志记录
- tools/lxc_info: 删除内部日志记录
- criu: 检测 veth 名称
- lxccontainer: 各种容器创建修复
- storage: 删除未使用的声明
- tools/lxc_ls: 删除内部日志记录
- tools/lxc_copy: 删除内部日志记录
- tools/lxc_monitor: 删除内部日志记录
- tools/lxc_snapshot: 删除内部日志记录
- tools/lxc_start: 删除内部日志记录
- tools/lxc_stop: 删除内部日志记录
- tools/lxc_top: 删除内部日志记录
- tools/lxc_unfreeze: 删除内部日志记录
- tools/lxc_unshare: 删除内部日志记录
- tools/lxc_usernsexec: 删除内部日志记录
- tools/lxc_wait: 删除内部日志记录
- confile: 修复内存泄漏
- utils: 将 sethostname() 声明为静态内联函数
- lxc_unshare: 在创建用户命名空间时添加 uid_mapping
- 更新 gentoo.moresecure.conf。
- 为 Slackware 模板添加新的依赖项
- 为 lxc-create -B 添加 bash 自动补全功能,以列出后端存储类型。后端存储类型是硬编码的(不知道如何以编程方式获取)- 关闭 #1236
- 修复 SETCOLOR_FAILURE 评估
- 在 "is_enabled" 后插入缺失的 "echo"
- conf: 防止空指针解引用
- criu: 初始化状态
- confile: 删除无效的赋值
- criu: 静默静态分析
- attach: 在不存在的命名空间上不失败
- test: 重新启用 Coverity 集成
- lxc_execute: 正确确定所需参数的数量
- arguments: 移动到 tools/ 子目录
- start: 正确设置日志级别
- commands: 不要遍历整个列表
- commands: 不要锁定原子操作
- commands: 不要锁定整个命令
- start: 不要锁定设置状态
- commands: 允许等待所有状态
- test: 添加状态服务器测试
- commands: 微调锁定
- lxccontainer: 恢复非阻塞关闭
- commands: 告知主循环在错误时回收客户端 fd
- commands: 将 -ECONNRESET 返回给调用方
- execute: 将日志文件传递给 lxc-init
- lxccontainer: 正确处理执行容器
- lxc_init: 移至 src/lxc
- init: 重做简单初始化
- lxc_init: 添加自定义参数解析器
- tests: 扩展短生命周期初始化进程的测试
- coverity: #1425734
- coverity: #1425735
- coverity: #1425739
- coverity: #1425929
- coverity: #1425923
- coverity: #1425922
- coverity: #1425921
- coverity: #1425895
- coverity: #1425890
- coverity: #1425889
- coverity: #1425888
- lxc: 区分 pthread_mutex_unlock 错误消息
- travis: 修复构建失败
- coverity: #1425893
- coverity: #1425886
- coverity: #1428855
- coverity: #1425884
- coverity: #1425883
- coverity: #1425879
- tools: 阻止在没有配置文件的情况下使用 lxc-execute
- conf: 避免生成不必要的子 shell
- coverity: #1425874 + 清理
- lxccontainer: 仅在网络设备分离时附加网络命名空间
- lxccontainer: 清理 {attach,detach}_interface()
- coverity: #1425870
- coverity: #1425869
- coverity: #1425867
- coverity: #1425866
- coverity: #1425863
- coverity: #1425862
- coverity: #1425860
- coverity: #1425859
- coverity: #1425858
- coverity: #1425857
- start: 不要无条件地复制 std{in,out,err}
- tools: 当 lxc-execute 成为守护进程时退出成功
- start: 修复控制组命名空间保留
- init: 如果我们不在 PID 命名空间中,不要 kill(-1)
- SHARE_NS 选项应位于 OPT_USAGE 之前
- commands: 修复打开/关闭命令套接字时的竞争条件
- namespace: 添加 lxc_raw_clone()
- utils: 在 run_command() 中使用 lxc_raw_clone()
- lxc_init: 修复控制组解析
- tests: s/lxc.init.cmd/lxc.init_cmd/g
- commands_utils: 添加缺失的互斥锁
- [monitor] break 语句错误
- cgfsng: 添加新的宏来打印错误
- attach: 大大简化
- attach: 使用 lxc_raw_clone()
- attach: 处理具有 hidepid={1,2} 属性的 /proc
- tests: 扩展 lxc_raw_clone() 测试
- namespace: 添加 lxc_raw_getpid()
- tree-wide: s/getpid()/lxc_raw_getpid()/g
- namespace: 注释 lxc_{raw_}clone()
- namespace: 添加 lxc_raw_clone_cb()
- start: 在可能的情况下使用 lxc_raw_clone_cb()
- start: 记录关闭命令套接字和 STOPPED 状态
- start: 使我们可转储
- start: 简化控制组命名空间保留
- start: 修复死亡信号
- start: 更智能地处理设置死亡信号
- mainloop: 添加主循环宏
- mainloop: 捕获短生命周期初始化进程的输出
- lxc_config: 添加 -h 和 --help 标志处理程序
- start: 正确清理主循环
- console: 在 open() 上不允许非伪终端设备
- mainloop: 使用 epoll_create1(EPOLL_CLOEXEC)
- conf: 调整 idmap 帮助程序
- conf: 调整 userns_exec_1()
- conf{ile}: 检测根用户的 ns{g,u}id 映射
- cgfsng: 使用初始化 {g,u}id
- conf: 检测 devpts 是否可以以 gid=5 挂载
- gentoo: 添加对 .xz 压缩包的支持
- configure.ac: 修复静态 libcap 的检查
- conf: 将 "deny" 写入 /proc/[pid]/setgroups
- conf: 非功能性更改
- conf: 重做 userns_exec_1()
- cgfsng: 只建立一次映射
- 修复损坏的缩进
- 在版本字符串中包含 -devel 后缀
- 添加 'lxc_cmd_get_name' 的返回值检查
- 修复 lxc-usernsexec 的退出状态
- 添加一些 idmap 解析错误消息
- confile: 改善日志消息
- console: 将伪终端创建移动到单独的函数
- start: 非功能性更改
- console: 添加一些伪终端帮助程序
- attach: 清理 attach_child_main()
- console: 调整 lxc_console_mainloop_add()
- console: 添加 lxc_pty_map_ids()
- attach: 轻微调整
- tools: 遵守 --console 和 --console-log
- start: 非功能性更改
- console: 在信号 fd 上设置 SFD_CLOEXEC
- lxc-alpine: 允许每个容器保留 sys_ptrace
- utils: 不要依赖于未初始化的变量
- test: 在失败时记录错误
- utils: 检查后缀长度
- lxccontainer: 恢复阻塞 wait()
- freezer: 非功能性更改
- commands: 添加 LXC_CMD_SERVE_STATE_CLIENTS
- start: 不要记录非初始化进程的停止/继续
- 修复 lxc_error_set_and_log 以匹配文档
- lxc.init: 正确使用应用程序的错误代码退出
- 记住初始化进程的退出代码
- start: 当容器的初始化进程以非零值退出时,不要返回 false
- lxc-execute: 实际上使用生成的进程的状态退出
- 在未知的 si_code 情况下将退出状态设置为 1
- console: 清理
- test: 修复控制台测试
- attach_options: 减少差异
- attach: 减少差异
- cgroups: 减少差异
- bla
- 使用错误的提交消息撤消提交 "bla"
- cgfsng: 减少差异
- tools: 修复 android
- 当 rootfs 为 NULL 时创建控制台
- 删除 lxc-init
- coverity: #1427668
- coverity: #1427639
- coverity: #1427638
- coverity: #1427191
- coverity: #1427190
- coverity: #1426734
- coverity: #1426694
- start: 修复主循环清理 goto 语句
- 修改 .gitignore
- 修复注释并在 lxc_poll 中添加检查。
- lsm: 非功能性更改
- lsm: 添加 lsm_process_label_fd_get()
- lsm: 添加 lsm_process_label_set_at()
- apparmor: 不要调用 aa_change_profile()
- autotools: 不要链接到 libapparmor
- network.c: 删除 ip_forward_set 及其调用者
- [cgfsng] 显示错误的 errno
- 更好地检查锁定目录
- 更好的非特权检测
- debian: 使用 iproute2 代替 iproute
- tools: 使 "-n" 可选
- lsm: 不要 #ifdefine
- debian: 我们必须在 wheezy 上使用 iproute
- lxc-init: 在警报超时后使用 SIGKILL
- monitor: 在收到 SIGHUP 时向容器发送 SIGTERM
- lxc.init: 忽略 SIGHUP
- cgroups: 在统一层次结构上获取控制器
- cgroups: cgfsng_create: 处理统一层次结构
- cgroups: cgfsng_attach: 处理统一层次结构
- cgroups: cgfsng_get: 处理统一层次结构
- cgroups: cgfsng_set: 处理统一层次结构
- cgroups: 处理统一层次结构上的限制
- cgroups: 更一致的命名
- attach: 设置容器的环境变量
- attach: 非功能性更改
- cgfsng: 执行 MS_REMOUNT
- cgfsng: 非功能性更改
- templates: CentOS 修复
- cgroups: 添加对 lxc.cgroup.use 的检查
- selinux: 简化对默认标签的检查
- lsm: 修复函数文档中缺少的 @
- cgfsng: 添加所需的重新挂载标志
- 定义 am_guest_unpriv
- 恢复大多数 am_guest_unpriv 的情况
- coverity: #1429139
- coverity: #1426734
- coverity: #1425971
- 修复用户命名空间帮助程序错误处理
- console: 它们真的没有必要
- 修改 .gitignore
- 修复 lxc-console 挂起
- conf: 支持挂载传播
- lxclock: 删除 pthread_atfork_handlers
- cgfsng: 简化和修复
- CONTRIBUTING: 更新
- CODING_STYLE: 添加 CODING_STYLE.md
- cgroups: 使用正确的掩码进行 chmod()
- CODING_STYLE: 添加有关 str{n}cmp() 的部分
- tests: 删除 lxc-test-ubuntu
- utils: 修复 lxc_p{close,open}()
- start: 不要在无效的文件描述符上调用 close
- console: 确保 fd 被标记为 EBADF
- README: 添加 coverity
- confile: 将 "force" 添加到 cgroup:{mixed,ro,rw}
- cgfsng: 调整包含顺序
- cgfsng: 完全记录结构层次结构
- cgfsng: 完全记录结构 cgfsng_handler_data
- cgfsng: 完全记录剩余变量
- cgfsng: free_string_list()
- cgfsng: cg_legacy_must_prefix_named()
- cgfsng: 移动 cg_legacy_must_prefix_named()
- cgfsng: 将我添加到作者
- cgfsng: append_null_to_list()
- cgfsng: string_in_list()
- cgfsng: must_append_controller()
- cgfsng: get_hierarchy()
- cgfsng: lxc_cpumask()
- cgfsng: lxc_cpumask_to_cpulist()
- cgfsng: get_max_cpus()
- cgfsng: cg_legacy_filter_and_set_cpus()
- cgfsng: copy_parent_file()
- cgfsng: cg_legacy_handle_cpuset_hierarchy()
- cgfsng: controller_lists_intersect()
- cgfsng: controller_list_is_dup()
- cgfsng: controller_found()
- cgfsng: all_controllers_found()
- cgfsng: cg_hybrid_get_controllers()
- cgfsng: cg_hybrid_get_mountpoint()
- cgfsng: copy_to_eol()
- cgfsng: controller_in_clist()
- cgfsng: cg_hybrid_get_current_cgroup()
- cgfsng: must_append_string()
- cgfsng: trim()
- cgfsng: lxc_cgfsng_print_hierarchies()
- cgfsng: lxc_cgfsng_print_basecg_debuginfo()
- cgfsng: cg_hybrid_init()
- cgfsng: cg_is_pure_unified()
- cgfsng: cg_unified_get_current_cgroup()
- cgfsng: cgfsng_init()
- cgfsng: recursive_destroy()
- cgfsng: cg_unified_create_cgroup()
- cgfsng: create_path_for_hierarchy()
- cgfsng: remove_path_for_hierarchy()
- cgfsng: cgfsng_create()
- cgfsng: cgfsng_enter()
- cgfsng: cgfsng_chown()
- cgfsng: mount_cgroup_full()
- cgfsng: cgfsng_mount()
- cgfsng: recursive_count_nrtasks()
- cgfsng: recursive_count_nrtasks()
- cgfsng: cgfsng_escape()
- cgfsng: build_full_cgpath_from_monitorpath()
- cgfsng: __cg_unified_attach()
- cgfsng: cgfsng_attach()
- cgfsng: cgfsng_get()
- cgfsng: cgfsng_set()
- cgfsng: convert_devpath()
- cgfsng: cg_legacy_set_data()
- cgfsng: __cg_legacy_setup_limits()
- lxccontainer: 使用 wait_for_pid()
- start: 删除重复的 lxc_monitor_send_state()
- tree-wide: 删除围绕 openpty() 的锁定
- {commands,start}: 首先从列表中删除元素
- start: 使用正确的包含前缀
- start: print_top_failing_dir()
- start: close_ns()
- start: preserve_ns()
- 开始: lxc_check_inherited()
- 开始: signal_handler()
- 开始: lxc_poll()
- 开始: lxc_init_handler()
- 开始: lxc_init()
- 开始: lxc_abort()
- 开始: start()
- 开始: post_start()
- 开始: lxc_destroy_container_on_signal()
- 开始: do_destroy_container()
- cgfsng: 为 "cgroup-full" 启用 "force"
- confile: 网络解析部分的反向移植
- utils: 添加 LXC_PROC_PID_FD_LEN
- CVE 2018-6556: 在 lxc-user-nic 中验证 netns fd
- utils: 包含 linux/types.h
- cgfsng: 修复越界错误
- lxccontainer: do_lxcapi_start()
- lxccontainer: do_lxcapi_create()
- lxccontainer: do_lxcapi_get_interfaces()
- lxccontainer: do_lxcapi_get_ips()
- lxccontainer: do_lxcapi_clone()
- lxccontainer: do_add_remove_node()
- lxccontainer: do_lxcapi_detach_interface()
- lxclock: {un}lock_mutex()
- utils: lxc_popen()
- utils: run_command()
- network: lxc_create_network_unpriv_exec()
- network: lxc_delete_network_unpriv_exec()
- lxccontainer: config_file_exists()
- lxccontainer: ongoing_create()
- lxccontainer: create_partial()
- lxccontainer: create_partial()
- lxccontainer: lxc_container_free()
- lxccontainer: lxc_container_{get,put}()
- lxccontainer: do_lxcapi_is_defined()
- lxccontainer: do_lxcapi_state()
- lxccontainer: is_stopped()
- lxccontainer: do_lxcapi_is_running()
- lxccontainer: do_lxcapi_freeze()
- lxccontainer: do_lxcapi_unfreeze()
- lxccontainer: do_lxcapi_console_getfd()
- lxccontainer: lxcapi_console()
- lxccontainer: load_config_locked()
- lxccontainer: do_lxcapi_load_config()
- lxccontainer: do_lxcapi_want_daemonize()
- lxccontainer: do_lxcapi_want_close_all_fds()
- lxccontainer: do_lxcapi_wait()
- lxccontainer: am_single_threaded()
- lxccontainer: push_arg()
- lxccontainer: split_init_cmd()
- lxccontainer: free_init_cmd()
- lxccontainer: lxcapi_start()
- lxccontainer: lxcapi_startl()
- lxccontainer: do_create_container_dir()
- lxccontainer: create_container_dir()
- criu: criu_version_ok()
- criu: do_restore()
- criu: du_dump()
- cgfsng: 修复统一层次结构中 get_hierarchy()
- 修复 /tmp 作为 tmpfs 或 noexec 的下载模板
- CODING_STYLE: 添加关于 _exit() 的章节
- commands: 从状态客户端列表中移除互斥锁
- lxc-snapshot: 修复段错误
- lxc_init: 不要挂载文件系统
- cgfsng: 非功能性更改
- mainloop: 添加 LXC_MAINLOOP_ERROR
- config: 以完整的权限集开始
- CODING_STYLE: 删除重复的 _exit() 条目
- CODING_STYLE: clang-format
- CODING_STYLE: 结构体数组
- CODING_STYLE: 添加要高亮的语言
- 添加针对旧版 libcap 构建问题的解决方法
- usernsexec: 初始化日志 fd
- cgroups: 如果我们不是真正的 root,则不进行转义
- 回退 "cgroups: 如果我们不是真正的 root,则不进行转义"
- conf: 修复在没有 libcap 的情况下构建时的 clang 警告
- 修复处理程序使用后释放
- 重命名 ifup/down 并删除无用的参数传递
- conf: 简化 lxc_fill_autodev()
- start: 始终使我们可转储
- lxclock: 使用线程安全的 OFD fcntl() 锁
- locktests: 修复测试套件
- 修复 lxc.init 中的信号发送
- lxc init: 删除死代码
- lxc init: 代码风格
- utils: 如果旧版 glibc 缺少,则定义 __NR_setns
- conf: 在错误时重新尝试 devpts 挂载,无需 gid=5
- do_lxcapi_create: 设置 umask
- 修复 cgfsng_attach 中的内存泄漏
- 修复 list_active_containers 中的内存泄漏
- coverity: #1435208
- coverity: #1435207
- coverity: #1435205
- coverity: #1435198
- lxccontainer: 使用线程安全的 OFD 锁
- lxccontainer: 非功能性更改
- lxccontainer: do_lxcapi_is_running()
- lxccontainer: do_lxcapi_freeze()
- lxccontainer: do_lxcapi_unfreeze()
- lxccontainer: 非功能性更改
- lxccontainer: 非功能性更改
- lxccontainer: 非功能性更改
- coverity: #1435263
- 修复执行日志文件的逻辑
- execute: 使用静态缓冲区
- execute: 不要再次检查继承的 fd
- lxc-unshare: 添加缺少的声明
- execute: 考虑 -o path 选项计数
- genl: 删除
- coverity: #1425744
- utils: 考虑终止的 \0 字节
- network: 静默 gcc-8
- network: 遵守 IFNAMSIZ 限制
- autodev: 适应 Linux 4.18 中的更改
- strlcpy: 添加 strlcpy() 实现
- 全树: s/strncpy()/strlcpy()/g
- CODING_STYLE: 添加关于使用 strlcpy() 的章节
- tools: s/strncpy()/strlcpy()/g
- 回退 "tools: s/strncpy()/strlcpy()/g"
- coverity: #1435604
- coverity: #1435603
- coverity: #1425836
- coverity: #1248106
- coverity: #1425844
- config: 允许在用户命名空间中读写 /sys
- capabilities: 提升环境能力
- coverity: #1425802
- lxc-init: 跳过无法捕获的信号
- 全树: s/sigprocmask/pthread_sigmask()/g
- utils: 修复 task_blocking_signal()
- lxccontainer: 修复发送信号时的 fd 泄漏
- confile: 架构排序
- tools: 修复带有全局配置值的 lxc-create
- tools: 修复带有全局配置值的 lxc-create II
- coverity: #1435805
- coverity: #1435803
- utils: 修复 task_blocking_signal()
- network: 修复套接字句柄泄漏
- conf: 没有调用 va_end。
- confile: 改善 strprint()
- start: 修复 waitpid() 阻塞问题
- start: 记录未知的 info.si_code
- 全树: 在某些 read()/write() 中处理 EINTR
- conf: 复制 remount_all_slave() 的 mountinfo
- 支持交叉编译中的 tls
- 修复错别字
- coverity: #1425777
- coverity: #1425779
- coverity: #1425794
- coverity: #1425795
- coverity: #1425841
- coverity: #1425849
- coverity: #1425836
- conf: 仅在必要时使用 newuidmap 和 newgidmap
- arguments: 改善一些操作
- coverity: #1425781
- tools: 恢复 lxc-create 日志行为
- 修复 getpwnam() 线程安全问题
- attach: 修复双重释放
- coverity: #1436916
- 修复 getpwuid() 线程安全问题
- 修复 getgrgid() 线程安全问题
- coverity: #1437017
- coverity: #1425778
- coverity: #1425760
- coverity: #1425766
- coverity: #1425767
- coverity: #1425768
- storage: 资源泄漏
- include: 添加 getgrgid_r()
- coverity: #1425770
- coverity: #1425771
- coverity: #1425789
- coverity: #1425792
- coverity: #1425793
- coverity: #1425799
- coverity: #1425810
- coverity: #1425813
- coverity: #1425818
- coverity: #1425819
- coverity: #1425824
- coverity: #1425825
- coverity: #1425837
- coverity: #1425840
- coverity: #1425846
- coverity: #1425789
- coverity: #1425855
- coverity: #1437027
- 安全编码: strcpy => strlcpy
- 安全编码: network: strcpy => strlcpy
- btrfs: 修复 btrfs_snapshot()
- include: 添加 strlcat() 实现
- btrfs: 修复 get_btrfs_subvol_path()
- 安全编码: #2 strcpy => strlcpy
- 修复 fd 句柄泄漏
- 修复检查空指针后解除引用指针 c
- commands: 简化 lxc_cmd()
- monitor: 在子进程中更改 exit() => _exit() 系统调用
- 移动 lxc.spec.in 中的一些注释
- log: 添加 lxc_log_strerror_r 宏
- log: 考虑 Android 的 Bionic 的 strerror_r()
- CODING_STYLE: 添加关于使用 strlcat() 的章节
- coverity: #1425816
- start: 不要无条件打开("/dev/null")
- log: 线程安全回退
- attach: 简化 lxc_attach_getpwshell()
- coverity: #1437936
- coverity: #1437935
- lxclock: 使用 strerror 更改错误日志为 SYSERROR
- conf: atime 标志在 userns 中被锁定
- coverity: #1438067
- 更改 lxc_ambient_caps_up/down 错误情况的日志宏
- nl: 避免空指针解除引用
- conf: s/pipe()/pipe2()/g
- conf: 始终在 run_userns_fn() 中关闭管道
- criu: s/pipe()/pipe2()/
- lxccontainer: 清理 do_lxcapi_get_interfaces()
- lxccontainer: s/pipe()/pipe2()/g
- cmd: s/pipe()/pipe2()/g
- cmd: s/write()/lxc_write_nointr()/g
- cmd: s/read()/lxc_read_nointr()/g
- criu: s/read()/lxc_read_nointr()/g
- criu: s/write()/lxc_write_nointr()/g
- lxccontainer: s/write()/lxc_write_nointr()/g
- lxccontainer: s/read()/lxc_read_nointr()/g
- network: s/read()/lxc_read_nointr()/g
- network: s/write()/lxc_write_nointr()/g
- sync: s/read()/lxc_read_nointr()/g
- sync: s/write()/lxc_write_nointr()/g
- log: 处理 read() 中的 EINTR
- caps: 处理 read() 中的 EINTR
- coverity: #438136
- READEM: 更新 Serge 的邮件地址
- MAINTAINERS: 添加 Wolfgang Bumiller
- CONTRIBUTING: 更新对内核编码风格的引用
- CONTRIBUTING: 链接到最新的在线内核文档
- CONTRIBUTING: 指导读者阅读 CODING_STYLE.md
- CODING_STYLE: 在引言中提及内核风格
- CONTRIBUTING: 添加“be”以修正语法
- CODING_STLYE: 简化对“extern”用法的解释
- CODING_STLYE: 删除“内核风格”中暗示的部分
- CODING_STYLE: 修复不统一的标题级别
- CODING_STYLE: 更新章节标题格式
- autotools: 添加 --{disable,enable}-thread-safety
- attach: 不要在子进程中关闭 ipc 套接字
- attach: 报告标准 shell 退出代码
- storage: src 无法被截断
- commands: 反向移植健壮的基础设施
- 修复在为 android 编译时的编译错误
- 修复 Android 中的 hooks 功能,其中 'sh' 位于 /system/bin 下
- caps: 检查 uid 和 euid
- CVE-2019-5736 (runC): 将 rexec 调用者作为 memfd
- rexec: 不要包含不存在的头文件
- utils: 添加缺少的密封标志
- include: 为 Android 的 Bionic 添加 fexecve()
- fexecve: 删除不必要的 #ifdef
- fexecve: 使用正确的名称
- rexec: 处理遗留内核
- cve-2019-5736: 添加 rexec 的测试
- 将 configure.ac 中的版本更改为 2.0.10
- autotools: 处理 bionic 上的 getgrgid_r
- autotools: 将 memory_utils.h 添加到 Makefile.am
- 将 configure.ac 中的版本更改为 2.0.11
下载¶
可以在我们的 下载页面 上找到发行版压缩包,我们预计大多数发行版很快就会发布 LXC 2.0.11 的打包版本。
如果您有兴趣了解个别更改或只是查看详细的开发历史,我们的稳定分支位于 Github 上。