返回新闻概览

LXCFS 4.0 LTS 已发布

2020 年 3 月 6 日

简介

LXCFS 团队很高兴地宣布发布 LXCFS 4.0.0!

这是自 LXCFS 3.0.0 发布以来两年工作的成果,也是 LXCFS 项目的第三个 LTS 版本。该版本将支持到 2025 年 6 月。

主要变化

仓库重新组织

LXCFS 仓库已完全重组。在 LXCFS 4.0 之前,所有功能都位于单个文件中。这在很长一段时间内运行良好,因为 LXCFS 包含的功能集非常小。多年来,LXCFS 已经增长了一系列新功能,并且在容器系统虚拟化的各个方面取得了重大改进。这意味着单文件方法不再可行。

在 LXCFS 4.0 中,各种大型虚拟化功能已移至通用源目录下的单独文件中。这也需要对构建系统进行各种更改。虽然我们一直坚持使用 autotools 构建套件,但我们不得不对 LXCFS 的构建方式进行重大更改。最明显的改变是编译后的二进制文件的路径已从源目录下的顶层目录更改。对于打包 LXCFS 的发行版,这可能意味着软件包工具需要了解这一点。

cgroup2:支持新的统一 cgroup 层次结构

LXCFS 的虚拟化能力通常围绕 cgroups,即 cgroups 用于计算容器特定的值,这些值显示在提供对系统资源访问权限的各种文件中。到目前为止,LXCFS 只支持基于传统 cgroup 层次结构的虚拟化。随着越来越多的系统逐渐迁移到统一 cgroup 层次结构,我们扩展了 LXCFS,以便在可能的情况下基于统一 cgroup 层次结构提供相同的虚拟化能力。需要强调“在可能的情况下”。目前,还有各种较小的功能无法基于当前统一 cgroup 层次结构的实现进行虚拟化。随着统一 cgroup 层次结构在 upstream 内核中增长新功能,这种情况可能会随着时间的推移而改变,但我们不能保证它将提供与传统 cgroup 层次结构完全相同的特性,因为内核开发人员没有对此做出任何保证或打算。然而,我们希望在 LXCFS 提供的功能方面实现特性一致性。
在将补丁提交到 upstream 时,我们希望您能尽力确保传统 cgroup 和统一 cgroup 层次结构都支持新功能,并在可能的情况下一次性提供两种实现。

/proc/cpuinfo/proc/stat 中基于 cpu 份额的 cpu 输出

procfscpuinfostat 中提供的 CPU 信息现在可以基于 cpu 份额。这可以提供比我们通常进行的虚拟化更细粒度和更精确的视图,但需要 LXCFS 保留更多状态。为了实现完整的功能,需要在系统上启用传统的 cpucpuacct 控制器。当使用统一层次结构时,只能提供一个非常粗略的近似值,尽管我们预计统一层次结构中的 cpu 控制器将支持传统层次结构中的 cpucpuacct 控制器支持的某些功能。此功能可以通过将 --enable-cfs 标志传递给 LXCFS 来启用。

改进的命令行选项

随着时间的推移,LXCFS 已经增加了对功能的支持,并且这些功能大多放在新的命令行选项之后。有些选项没有长选项或短选项,因此体验可能感觉有点过时。在 LXCFS 4.0 中,我们更新了我们的命令行体验。现在支持以下选项

Usage: lxcfs <directory>

lxcfs set up fuse- and cgroup-based virtualizing filesystem

Options :
  -d, --debug          Run lxcfs with debugging enabled
  --enable-cfs        Enable cpu virtualization via cpu shares
  -f, --foreground     Run lxcfs in the foreground
  -n, --help           Print help
  -l, --enable-loadavg Enable loadavg virtualization
  -o                   Options to pass directly through fuse
  -p, --pidfile=FILE   Path to use for storing lxcfs pid
                       Default pidfile is /run/lxcfs.pid
  -u, --disable-swap   Disable swap virtualization
  -v, --version        Print lxcfs version
  --enable-pidfd       Use pidfd for process tracking

/proc/loadavg 虚拟化

现在 LXCFS 可以虚拟化 loadavg 输出。如果传递 --enable-loadavg,则 LXCFS 将基于 cgroups 提供容器特定的 /proc/loadavg 视图。

pidfd 支持的进程跟踪

LXCFS 需要跟踪每个容器的 init 进程,以便正确地虚拟化各种值。这意味着 LXCFS 需要检测容器的进程何时死亡。检测这一点容易受到通常的 pid 重用竞态条件的影响,这些竞态条件长期困扰着 Linux。更新的内核提供了 pidfd 的概念,它解决了 pid 重用问题。当 LXCFS 以 --enable-pidfd 启动时,如果底层内核支持,它将使用此功能。这将确保可靠的进程跟踪。

基于编译器的加固

长期以来,LXC 一直支持基于编译器的加固,即每当编译器或链接器支持时,都会自动启用一组众所周知的编译器和链接器选项。当前支持的加固标志集是

-Wimplicit-fallthrough=5
-Wcast-align
-Wstrict-prototypes
-fno-strict-aliasing
-fstack-clash-protection
-fstack-protector-strong
--param=ssp-buffer-size=4
-g
--mcet -fcf-protection
-Werror=implicit-function-declaration
-Wlogical-op
-Wmissing-include-dirs
-Wold-style-definition
-Winit-self
-Wunused-but-set-variable
-Wfloat-equal
-Wsuggest-attribute=noreturn
-Werror=return-type
-Werror=incompatible-pointer-types
-Wformat=2
-Wshadow
-Wendif-labels
-Werror=overflow
-fdiagnostics-show-option
-Werror=shift-count-overflow
-Werror=shift-overflow=2
-Wdate-time
-Wnested-externs
-fasynchronous-unwind-tables
-pipe
-fexceptions
-fvisibility=hidden

最小的基于编译器的资源管理

与 LXC 长期以来的情况一样,LXCFS 现在将使用 clanggcc 的清理宏功能来自动清理内存和文件描述符等资源。对于 LXC,这显着减少了资源泄漏的数量,我们预计 LXCFS 也会出现这种情况。

所有支持的架构上都启用了完整的测试套件

在 LXCFS 4.0 版本发布之前,我们终于开始在所有支持的架构上启用我们的测试套件。这将确保今后进行更严格的测试。

支持和升级

LXCFS 4.0.0 将支持到 2025 年 6 月,我们当前的 LTS 版本 LXCFS 3.0 现在将切换到较慢的维护节奏,只接收关键错误修复和安全更新。

我们强烈建议所有 LXCFS 用户计划升级到 4.0 分支。

下载

贡献者

LXCFS 4.0.0 版本由总共 15 位贡献者为您带来。