经过两个月的开发,Linus Torvalds 发布了内核。 Linux 7.0 版本中最值得注意的变化包括:AI 助手的使用规则、将 Rust 移至核心内核、提高交换性能、默认启用 PREEMPT_LAZY 模式、支持 io_uring 操作的过滤器、新的 Nullfs 文件系统、fserror 框架、XFS 监控工具、支持 Btrfs 中的重映射、默认启用 NFS 4.1、集成后量子 ML-DSA 加密算法、在网络子系统中激活 AccECN 以及对 WiFi 8 的初步支持。
之所以将版本号设为 7.0,是因为 6.x 分支已经积累了足够多的版本,需要更改版本号的第一位数字(6.0 版本最初是在 5.19 版本之后发布的)。此次版本号更改是出于美观考虑,也是为了正式缓解该系列版本数量过多带来的不便。
新版本整合了来自 2477 位开发者的 15624 项修复,补丁大小为 56 MB(更改影响了 18053 个文件,新增 704060 行代码,删除 278132 行代码)。上一版本包含来自 2237 位开发者的 15657 项修复,补丁大小为 52 MB。7.0 版本中约 51% 的更改与设备驱动程序相关,约 11% 的更改与特定硬件架构的代码更新相关,14% 与网络协议栈相关,5% 与文件系统相关,3% 与内核内部子系统相关。
内核 7.0(1、2、3)的主要新功能:
- 磁盘子系统、I/O 和文件系统
- fserror 基础架构已实现,并新增了一个 API,用于在处理文件时检索有关 I/O 错误和元数据损坏的信息。该基础架构通过 fsnotify 机制统一了跨文件系统向用户空间传输错误信息的过程。
- XFS 文件系统新增了从用户空间监控文件系统健康状况的功能。引入了 XFS_IOC_HEALTH_MONITOR ioctl 操作,该操作返回一个文件描述符,可用于获取与元数据损坏或 I/O 错误相关的故障信息,以及监控文件系统状态变化,例如卸载和关闭。此外,还引入了一个由 systemd 管理的后台进程 xfs_healer,该进程处理来自用户空间的文件系统健康事件,并在必要时自动启动恢复程序。
- Btrfs 文件系统新增了对“重映射树”结构的实验性支持,该结构未来或可用作 I/O 操作的中间层。这项新功能本质上是在驱动器上移动数据后,将新旧数据地址存储在一个额外的“重映射树”结构中,而不是更新所有关联的结构。访问数据时,这些地址会被替换。这种新方法被认为更加可靠和灵活,并且还将简化 Btrfs 功能的未来扩展。
- Btrfs 在块大小超过系统内存页大小的情况下实现了对直接 I/O 的支持。
- 新增了一个名为“Nullfs”的文件系统,可用作根文件系统的存根。Nullfs 文件系统始终为空,不包含任何数据,且不支持修改。Nullfs 的目的是作为初始文件系统,简化系统启动过程。其他文件系统会挂载在 Nullfs 之上,并通过 pivot_root() 系统调用来切换根文件系统,而无需清除 initramfs 的内容并使用关联的根文件系统。
- 已实现非阻塞模式下文件修改时间信息的更新。此前,使用 IOCB_NOWAIT 标志调用 file_update_time_flags() 函数会返回“-EAGAIN”错误,导致无法在非阻塞模式下使用直接写入操作。
- 文件系统已将通知租约支持移至单独的选项中。由于某些文件系统最初并非为此设计,因此默认情况下不再启用此机制。例如,9p 和 cephfs 就不支持此机制。
- EROFS(可扩展只读文件系统)专为只读分区设计,默认使用 LZMA 压缩算法。DEFLATE 和 Zstandard 压缩算法(已不再标记为实验性算法)可供选择使用。现在,不同 EROFS 文件系统中的相同文件可以共享页面缓存条目。
- 笔记本电脑模式(laptop_mode)已被移除。该模式通过延迟和合并硬盘写入操作来延长硬盘睡眠时间并减少唤醒次数,从而节省电量。由于现代移动设备中硬盘已被固态硬盘取代,因此该模式已不再适用。
- F2FS 文件系统已迁移到使用大容量内存页。
- 由 Paragon Software 开发的 NTFS3 驱动程序的工作已经重启。该驱动程序新增了对基于 iomap 的文件操作的支持,实现了 llseek 的 SEEK_DATA/SEEK_HOLE 选项,并添加了用于延迟块分配的 delalloc 模式。与此同时,内核开发者邮件列表在二月份批准在未来的内核版本中加入新的 NTFS 实现 ntfsplus,该实现旨在取代 NTFS3。
- 默认情况下,构建过程中会启用 NFS 协议版本 4.1 (CONFIG_NFS_V4_1)。对 pidfs 和 nsfs 等专用伪文件系统的 NFS 导出将被阻止。NFSD 实现了使用 POSIX ACL 的实验性功能,并增加了基于负载动态更改线程池的支持。
- 内存和系统服务
- 关于使用人工智能助手以及在核心代码中包含自动生成内容的官方规则已获批准。提交生成的代码时,必须使用“Assisted-by”标签来标记所使用的人工智能助手。人工智能助手禁止添加“Signed-off-by”标签——提交补丁的人员将被视为其作者,对提交的更改负责,并保证其质量。开发人员必须手动审查人工智能生成的代码,并验证其结果是否符合许可要求。
- Rust 支持已从实验性功能升级为核心内核功能。Rust 支持默认情况下未启用,并且 Rust 不作为内核构建的必要依赖项。
- 交换表机制已集成到核心中,从而提升了交换性能。这一改进是通过减少交换缓存争用、提高缓存查找效率和减少碎片来实现的。交换缓存采用基于交换表的后端,而非 XArray 后端,这使得在使用 BGSAVE 进行 redis-benchmark 测试时,请求处理量提高了 22%。
- 新增了对 Clang 22 中引入的线程安全分析扩展的支持,该扩展可在编译时检测潜在的竞争条件以及由不当的锁获取导致的错误。该扩展提供了一系列属性,例如 GUARDED_BY(…)、REQUIRES(…)、RELEASE(…) 和 ACQUIRE(…),允许您标记被锁覆盖的函数并分离锁的作用域(定义上下文)。编译时,系统会根据关联上下文的活动状态(或非活动状态)来验证同步原语(例如互斥锁)的正确使用。
- 为了简化隔离容器的设置并加快在具有大量挂载点的系统上容器的启动速度,open_tree 系统调用新增了 OPEN_TREE_NAMESPACE 标志。与 OPEN_TREE_CLONE 类似,新标志仅复制指定的挂载树,但它返回的不是本地文件描述符,而是新挂载点命名空间中的文件描述符。在该命名空间中,复制的挂载树会挂载到实际根文件系统的副本之上。OPEN_TREE_NAMESPACE 标志有助于避免在容器创建过程中单独执行 unshare(CLONE_NEWNS) 和 pivot_root() 操作。
- rseq 系统调用新增了时间片扩展机制,允许为关键段的不间断执行分配额外的 CPU 时间。其目的是防止任务调度器在关键段持有锁的情况下中断该操作,否则控制权将被转移到其他正在使用该资源的线程,而锁仍然存在。时间片扩展机制不会增加额外的开销,但也不具备完全优先级控制所提供的严格保证。
- 对于 arm64、loongarch、powerpc、riscv、s390 和 x86 架构,默认调度器抢占模式已从 PREEMPT_NONE 更改为 PREEMPT_LAZY。可选模式的数量已从四种减少到两种:PREEMPT_FULL 和 PREEMPT_LAZY(PREEMPT_NONE 和 PREEMPT_VOLUNTARY 模式仅保留给不支持 PREEMPT_FULL 和 PREEMPT_LAZY 的架构)。PREEMPT_LAZY 模式对实时任务(RR/FIFO/DEADLINE)使用完全抢占模型(PREEMPT_FULL),但会将普通任务(SCHED_NORMAL)的抢占延迟到时钟周期边界。引入的延迟减少了锁持有者驱逐的次数,从而使性能接近使用自愿抢占模型的配置,即 PREEMPT_LAZY 允许为实时任务保留完全抢占能力,但最大限度地减少了常规任务的性能损失。
启用 PREEMPT_LAZY 会导致严重的性能下降,PostgreSQL 在 ARM64 系统上的性能减半。为了解决此性能下降问题,建议 PostgreSQL 开发人员启用 PR_RSEQ_SLICE_EXTENSION 选项,以降低锁持有者被驱逐的可能性。
- 继续从 Rust-for- 分支迁移更改Linux本文探讨了使用 Rust 作为第二语言开发驱动程序和内核模块的相关内容。得益于之前集成的“syn”库(该库简化了复杂宏的编写),我们能够通过简化现有过程宏的定义来减小内核中 Rust 代码的体积。内核、宏和 pin-init 库的功能也得到了扩展。
- io_uring 异步 I/O 系统现在可以选择使用非循环提交队列,在请求完成而系统调用返回的情况下,这种队列可以更有效地进行缓存。
- 在 eBPF 子系统中,BTF(BPF 类型格式)机制使用二分查找来查找调试信息,从而在 BPF 伪代码中提供类型检查信息,提高了 BPF 程序的加载效率。eBPF 现在支持在调用 kfunc(可在 BPF 程序中使用的内核函数)时使用隐式参数,这些参数通过 KF_IMPLICIT_ARGS 标志定义。
- 基于 linuxrc 的初始 RAM 磁盘 (initrd) 支持代码已被移除,该代码早已被弃用。剩余的 initrd 实现计划于 2027 年移除。应使用 initramfs 代替 initrd(区别在于 initrd 将初始启动环境放置在磁盘映像中,而 initramfs 将其放置在文件系统中)。
- 用于内存中压缩交换存储的 zram 块设备改变了处理压缩内存页的逻辑,以便在可用 RAM 已满时选择性地将数据移动到持久存储。以前,内存页在写入物理存储之前会被解压缩,但现在则以压缩形式直接存储,从而降低 CPU 负载并在电池供电时节省电量。
- 用于测量运行任务调度程序时的延迟的 timerlat 实用程序已更新,新增了“--bpf-action”选项,用于在超过指定阈值时启动 BPF 程序。
- ftrace 跟踪系统已更新,新增了“bitmask-list”设置,用于以可读格式(位列表,而非十六进制值)显示位掩码。Tracefs 现在支持审计过滤器和触发器。“perf sched stats”命令已添加,用于收集和显示任务调度程序统计信息。
- 添加了构建选项 LOGO_LINUX_MONO_FILE、LOGO_LINUX_VGA16_FILE 和 LOGO_LINUX_CLUT224_FILE,用于定义一个包含徽标图像的文件,该图像将在内核启动时显示,而不是标准的 Tux 企鹅徽标。
- 虚拟化和安全
- io_uring 异步 I/O 系统现在支持为 BPF 程序附加过滤器,以控制特定 SQE(提交队列入口)操作的功能(类似于 io_uring 中的系统调用)。此新增功能类似于系统调用过滤器。过滤器可以附加到特定任务,并在调用 fork() 后派生其他进程时继承。如果过滤器处于活动状态,则其他过滤器只能附加额外的限制,而不能禁用现有的限制。此功能将允许阻塞方法在依赖于执行 io_uring 提供的类似操作(而非系统调用)的沙箱环境中绕过系统调用过滤。
- 在东南Linux 增加了控制对 BPF 令牌的访问的功能,允许非特权进程对 BPF 执行一些特权操作,例如将 BPF 程序加载到内核中以及创建映射结构。
- 现已新增对 ML-DSA(CRYSTALS-Dilithium)数字签名生成算法的支持。该算法基于格理论,能够抵御量子计算机上的暴力破解攻击。现在可以使用 ML-DSA 对内核模块进行身份验证。
- 使用 SHA-1 算法的数字签名生成方案来认证内核模块的功能已被移除(对加载已签名模块的支持仍然保留)。
- 在 NETFILTER_PKT 审计记录中添加了“sport”和“dport”字段,以便检查网络端口号,而不仅仅是端口号。 IP地址.
- 对于采用 RISC-V 架构的系统,已经实现了对 Zicfiss 和 Zicfilp 扩展的支持,这些扩展提供了应用 CFI(控制流完整性)保护的硬件功能,从而阻止了因修改存储在内存中的函数指针的漏洞利用而导致的指令执行(控制流)正常顺序的破坏。
- 在虚拟机管理程序中 KVM 已实现向客户系统传输处理器对增强型返回地址预测器安全 (ERAPS) 扩展的支持信息的功能。这使得客户系统在将控制权返回给主机时,可以避免一些 CPU 状态重置操作。此外,还增加了向客户系统分配性能监控单元 (PMU) 的支持,与使用模拟 PMU 相比,提高了性能分析的准确性。
- Hyper-V 虚拟机管理程序驱动程序现在支持 debugfs 接口,用于查看虚拟机管理程序统计信息。
- 网络子系统
- 默认启用 AccECN(精确显式拥塞通知)扩展。它实现了 ECN 扩展的改进版本,允许主机在发生拥塞时标记 IP 数据包,而不是丢弃它们。这使得在不丢包的情况下检测通信信道上的拥塞成为可能。原始 ECN 扩展的限制在于,在单个 TCP 往返时间(RTT,即发送请求和接收响应的时间)内,只能发出一个拥塞信号。AccECN 消除了这一限制,允许接收方在 TCP 数据包头部向发送方发送多个拥塞信号。拥塞控制算法可以利用这些信息更准确地响应拥塞,避免在发生轻微拥塞时突然降低数据包速率。
- CAKE网络队列管理算法的实现已得到增强,能够处理多个队列,从而将负载分配到多个CPU核心上。CAKE算法用于减少中间数据包缓冲对边缘网络设备的负面影响,旨在即使在低速通信链路上也能实现最大吞吐量和最小延迟。
- VSOCK 套接字已添加对网络命名空间的支持,用于与虚拟机通信。
- 增加了未来 WiFi 8 标准(802.11bn,超高可靠性 WiFi)的初步实现。
- 增加了优化,在 100 Gbps 网络压力测试中,传入 UDP 数据包的处理性能提高了 12%。
- Оборудование
- AMDGPU 驱动程序实现了对新型 AMD GPU 中使用的 IP 块的支持,例如 SMUIO 15.x、PSP 15.x、IH 6.1.1/7.1、MMHUB 3.4/4.2、GC 11.5.4/12.1、SDMA 6.1.4/7.1/7.11.4 和 JPEG 5.3。
- Nouveau 驱动程序改进了 Tegra 186+ 系统上的频率管理。
- i915 驱动程序现在包含对 Intel Nova Lake-P 处理器中使用的 Xe3p_LPD 显示 IP 的初步支持。
- 基于 Intel Xe 架构的 GPU 的 Xe DRM(直接渲染管理器)驱动程序开发工作仍在继续,该架构应用于 Intel Arc 系列显卡和集成显卡,从 Tiger Lake 处理器开始。新增了多队列模式。新增了用于在 Mesa 中诊断 GPU 挂起所需的组件。新增了对 MERT 机制的支持,该机制用于管理 GPU 内存访问。
- 我们持续为配备 GSP 固件的 NVIDIA GPU 集成 Nova 驱动程序组件,这些 GPU 自 NVIDIA GeForce RTX 2000 系列(基于 Turing 微架构)以来便开始使用。该驱动程序使用 Rust 编写。新版本为支持基于 Turing 微架构的 GPU 做好了准备,并包含多项内部更改。
- 增加了对具有多通道 SPI(串行外设接口)接口的控制器和外围设备的支持,该接口允许以多个并行流传输数据。
- 为基于 Apple Silicon 芯片且结合了 USB3、DP-AltMode 和 Thunderbolt/USB4 接口的设备使用的组合式 Type-C 连接器添加了驱动程序。
- 增加了对 Tegra238、Minisforum V3 SE、iBasso DC04U、Intel Nova Lake、Nova Lake S 和 Focusrite Forte 芯片的声音子系统的支持。
- 新增对以下 ARM 开发板、SoC 和设备的支持:Arduino UnoQ、OrangePi 6 Plus、OrangePi CM5、Anbernic RG-DS、Realtek Kent、Qualcomm Kaanapali、Mediatek Ezurio、Facebook Anacapa、Microchip LAN9668、Khadas VIM1S、QNAP TS133、i.MX952、i.MX93、i.MX94、VHIP4 EvalBoard、TQ-Systems MBLS1028A、Agilex5、Radxa CM3J、Glymur。
- 新增对智能手机和平板电脑的支持:Fairphone Gen 6(SoC Qualcomm Milos/Snapdragon 7s Gen 3)、Pixel 3/3 XL、Microsoft Surface Pro 11。
与此同时,拉丁美洲自由软件基金会创建了一个完全自由的内核 7.0 版本—— Linux-libre 7.0-gnu 版本已清理固件和驱动程序中包含的非自由组件或制造商限制范围的代码段。7.0 版本包含对 iwlwifi 驱动程序的 blob 清理。清理代码已更新,适用于 amdgpu、adreno、TI PRUeth、air_en8811h、ath12k、TI VPE、rtw8852b、rt1320、rt5575 SPI、tas2783 和 Intel catpt 驱动程序。ARM 芯片的设备树 (dts) 文件中的 blob 名称也已清理。
来源: opennet.ru
