systemd v258 changelog
1. summary | 摘要
此版本最引人注目的变化是彻底移除了对 cgroup v1 的支持,全面转向 cgroup v2 统一层次结构。同时,传统的 System V 式系统状态控制(如 runlevel、initctl)也被完全移除,进一步巩固了 systemd 作为现代 Linux 系统核心的地位。
安全方面,此版本引入了多项强化措施,包括收紧 TTY 设备的默认权限、限制 udev 规则中对非系统用户的设备所有权分配,以及改进了对加密凭据的处理,使其能更好地与沙箱机制(如 PrivateDevices=)协同工作。
在启动流程和容器化方面,v258 取得了显著进展。对统一内核镜像(UKI)的支持得到增强,引入了在 UKI 中嵌入 UEFI 固件、通过网络引导 UKI 等高级功能。此外,通过 systemd-nsresourced 和 systemd-mountfsd 提供的新 API,显著改善了对无特权容器的支持,包括动态分配网络 TAP 设备。
最后,此版本宣布了未来将移除 System V 服务脚本支持(v259)和旧版 iptables 支持(v259)等重要计划,敦促开发者和管理员尽快迁移到原生的 systemd 单元文件和 nftables 后端。总体而言,systemd v258 是一个专注于清理历史遗留、提升安全性和拥抱云原生与容器化趋势的里程碑式版本。
1.2. 不兼容变更与旧功能移除
systemd v258 引入了大量不兼容变更,旨在淘汰过时技术并提升系统一致性。管理员和开发者需特别关注以下几点以确保平稳过渡。
- cgroup v1 支持移除: 完全移除了对 cgroup v1(‘legacy’ 和 ‘hybrid’ 层次结构)的支持。系统现在将始终在启动时挂载 cgroup v2(‘unified’ 层次结构)。
- 内核版本基线提升: 最低内核版本要求提升至 v5.4(2019 年发布),推荐版本为 v5.7。
- System V 式系统状态控制移除:
- 移除了 /dev/initctl 设备节点。
- 移除了 initctl、runlevel 和 telinit 命令。
- 移除了通过 init 命令控制系统状态的支持(例如 init 3)。
- 移除了 runlevel[0-6].target 单元,并废除了运行级别的概念。
- 默认 TTY 权限变更: 出于安全考虑,tty/pts 设备节点的默认访问模式从 0620 更改为 0600。这相当于默认执行 mesg n 而不是 mesg y。
- TPM2 策略变更: systemd-cryptenroll 等工具不再默认将 TPM2 注册锁定到 PCR 7(SecureBoot 策略),以适应通过 fwupd 进行的频繁策略更新。新的默认 PCR 掩码为空。
- 加密后端统一: OpenSSL 成为 systemd-resolved 和 systemd-importd 唯一支持的加密后端,移除了对 gnutls 和 gcrypt 的支持。
- 传统文件控制机制移除:
- 移除了通过 /forcefsck 和 /fastboot 文件控制 fsck 模式的功能,应改用 fsck.mode= 内核参数或凭据。
- 移除了通过 /forcequotacheck 文件控制 quotacheck 模式的功能,应改用 quotacheck.mode= 内核参数或凭据。
- udev 规则限制: systemd-udevd 现在会忽略 udev 规则文件中为非系统用户/组指定的 OWNER=/GROUP= 设置,以防止设备节点被非系统用户拥有。
- 键盘映射调整: 移除了 udev 中将麦克风静音和触摸板开关等按键映射到 F20-F23 的变通方法。为了保持兼容性,用户需要更新 X11 键盘驱动(xf86-input-evdev >= 2.11.0 和 xf86-input-libinput >= 1.5.0)。
1.2. 未来功能移除计划
该版本明确预告了后续版本中将被移除的功能,为社区提供了明确的迁移时间表。
- System V 服务脚本 (v259): 对 System V 服务脚本的支持已被弃用,并将在 v259 版本中移除。强烈建议立即将软件更新为使用原生的 systemd 单元文件。
- 旧版 /run/lock/ 目录 (v259): 对该目录的支持将被移除。服务应使用 RuntimeDirectory=,用户软件应使用 $XDG_RUNTIME_DIR。
- 旧版 iptables 支持 (v259): 通过 libiptc 的旧版 iptables 支持将被移除。自 v259 起,systemd-networkd 和 systemd-nspawn 将仅支持 nftables 后端。
- FactoryReset EFI 变量 (v260): systemd-repart 的 FactoryReset EFI 变量支持将被移除,应改用更通用的 FactoryResetRequest 变量。
- 组件最低版本提升 (下一版本): 计划在下一个版本中提升对多个核心组件的最低版本要求,包括:
- Linux kernel >= 5.10
- glibc >= 2.34
- libxcrypt >= 4.4.0
- util-linux >= 2.37
- openssl >= 3.0.0
1.3. 核心安全增强
v258 在单元沙箱、资源隔离和加密方面引入了多项安全改进。
- 增强的单元沙箱:
- PrivateUsers= 新增 "full" 选项,可映射完整的 32 位 UID 范围。
- ProtectHostname= 新增 "private" 选项,允许单元在私有命名空间内修改主机名而不影响全局。
- 新增 PrivateBPF=yes 选项,为单元进程挂载一个私有的 bpffs 实例。
- 加密凭据改进:
- 用户服务的加密凭据现已可用,包括锁定到 TPM 的情况。
- 对于启用了 PrivateDevices= 的系统服务,加密凭据的解密将通过 systemd-creds.socket Varlink 服务进行,避免了服务进程直接访问 TPM 设备,从而增强了隔离性。
- 资源配额与隔离:
- 默认在 /dev/shm/ 和 /tmp/(当由 tmpfs 支持时)启用用户配额。
- 新增 StateDirectoryQuota=, CacheDirectoryQuota=, LogsDirectoryQuota= 等设置,允许通过项目配额(project quota)对服务的各个目录进行精细化的大小限制。
- systemd-homed 和用户记录新增了对 /tmp/ 和 /dev/shm/ 的配额限制字段。
- 文件系统验证: 新增 [email protected] 服务,可通过检查文件系统根目录上的扩展属性来验证其使用方式(如挂载路径、GPT 类型 UUID 等),防止元数据篡改。
1.4. 统一内核镜像 (UKI) 与启动流程改进
此版本大力推进了基于 UKI 的现代化、可验证的启动流程。
- UKI 功能扩展:
- 支持在 UKI 中嵌入 UEFI 固件镜像(.efifw PE 段),用于机密计算场景。
- systemd-stub 在通过网络引导启动时,会将源 URL 写入 LoaderDeviceURL EFI 变量,供用户空间使用。
- systemd-boot 新增 uki 和 uki-url 启动项类型,支持从远程 HTTP/HTTPS 服务器加载 UKI。
- ukify 工具得到增强,支持对多配置文件 UKI 进行签名以及离线签署 TPM PCR 策略。
- DDI 镜像解剖与发现:
- systemd-gpt-auto-generator 现支持 root=dissect 和 mount.usr=dissect 内核参数,以使用完整的 DDI 解剖器来发现根和 /usr/ 文件系统,包括自动 Verity 验证。
- DDI 解剖逻辑引入分区“过滤”概念,允许通过 systemd.image_filter= 内核参数支持在同一磁盘上并行安装多个操作系统。
- 工厂重置 (Factory Reset):
- 新增 systemd-factory-reset 工具和 Varlink API,用于请求或取消下一次重启时的工厂重置。
- 新增 factory-reset-now.target 单元以立即执行工厂重置。
- 新增 systemd.factory_reset= 内核参数。
1.5. 容器化与命名空间功能扩展
v258 在无特权容器和命名空间管理方面取得了突破性进展。
- 无特权容器支持:
- systemd-nspawn 新增对存储在普通目录中的容器镜像的无特权调用支持,利用了 systemd-mountfsd 提供的新 API。
- systemd-nsresourced 提供了新的 API,允许无特权客户端(如 VMM)分配网络 TAP 设备,并由 systemd-networkd 自动配置 IP 路由和伪装。
- 新的单元与设置:
- 新增 DelegateNamespaces= 单元设置,用于控制哪些类型的 Linux 命名空间应委托给单元进程。
- 为用户管理器新增了 [email protected] 和 [email protected] 服务模板。
- systemd-vmspawn 现支持无特权网络,并新增了 --slice 和 --property= 等与 systemd-nspawn 对齐的设置。
- run0/systemd-run 增强:
- run0 新增 --lightweight= 开关,控制是否为目标会话启动一个服务管理器。
- run0 新增 --area= 开关,可直接进入用户的特定 home "area"。
- --chdir= 开关现在接受 ~ 作为特殊值,强制切换到目标用户的主目录。
1.6. 主要新增功能与 API
此版本在 systemd 的各个组件中引入了大量新功能和 API。
1.6.1. 服务管理器 (PID1)
- 并发控制: Slice 单元新增 ConcurrencySoftMax= 和 ConcurrencyHardMax= 设置,可用于控制 slice 内同时活动和排队的单元数量,实现了强大的分层作业池管理。
- 定时器增强: .timer 单元新增 RandomizedOffsetSec= 设置,可配置一个随机但稳定的时间偏移。
- 条件检查: 新增 ConditionKernelModuleLoaded= 条件,用于检查特定内核模块是否已加载。
- Varlink API: 服务管理器实现了一个基础的 Varlink API,可用于查询其当前状态并列出单元。
- 命令行执行: ExecStart= 等行现在支持 | 前缀,以通过 shell 调用命令。
1.6.2. 网络管理 (networkd & resolved)
- DNS 委托区域: systemd-resolved 引入了新的 "delegate zone" 概念,允许将特定域名的 DNS 请求路由到指定的服务器。
- BOOTP 支持: systemd-networkd 中的 DHCPv4 客户端现在支持 BOOTP 协议。
- HSR/SRP 支持: .netdev 文件现在可以配置 HSR/SRP(高可用性无缝冗余/流预留协议)网络设备。
- 在线等待增强: systemd-networkd-wait-online 新增 --dns 开关,确保在继续前 systemd-resolved 中已建立 DNS 配置。
1.6.3. 用户与家目录管理 (userdbd & homed)
- 用户别名与领域: 用户记录现在支持 "aliases" 字段,允许一个用户记录有多个名称。同时支持通过 username@realm 格式引用用户。
- Home "Areas": 用户记录支持 "areas" 概念,即主目录下的子目录,用户可以登录到特定区域以使用不同的环境。可通过 username%area 格式登录。
- 简化的家目录迁移: homectl 新增 adopt、register、unregister 等动词,并增强了签名密钥管理功能,使得在不同系统间迁移家目录变得非常容易。
1.6.4. 开发者与调试工具
- systemd-analyze 新动词:
- chid: 显示本地系统的“计算机硬件 ID”。
- unit-shell: 在指定单元的命名空间内启动一个交互式 shell,用于调试沙箱。
- unit-gdb: 将调试器附加到单元。
- 启动断点: 新增 systemd.break= 和 rd.systemd.break= 内核参数,可在启动过程的多个关键点插入交互式 shell 断点,以简化调试。
- TTY 上下文跟踪: systemd 工具在进入或离开 TTY 上下文时会发出新的 OSC 序列,包含主机名、单元信息等元数据,可被终端模拟器用于可视化。