第 5 章 对外部内核参数的重要更改
本章为系统管理员提供了与 Red Hat Enterprise Linux 9.1 一起发布的内核有显著变化的总结。这些更改包括添加或更新的 proc
条目、sysctl
和 sysfs
默认值、引导参数、内核配置选项或者任何可见的行为更改。
新内核参数
- allow_mismatched_32bit_el0 = [ARM64]
使用这个参数,您可以允许 EL0 级别中不匹配的 32 位支持的系统运行 32 位应用程序。支持 32 位 EL0 的 CPU 集合由
/sys/devices/system/cpu/aarch32_el0
文件表示。另外,您可以限制热拔操作。如需更多信息,请参阅文档
/arm64/asymmetric-32bit.rst
。- arm64.nomte = [ARM64]
- 使用这个参数时,您可以无条件地禁用内存标记 (MTE) 支持。
- i8042.probe_defer = [HW]
-
使用这个参数时,您可以允许对
i8042
探测错误进行延迟。 - idxd.tc_override = [HW]
使用此参数(
<bool>
格式),您可以允许覆盖该设备的默认流量类配置。默认值为
false
(0
)。- kvm.eager_page_split = [KVM,X86]
通过这个参数,您可以控制 KVM 在脏日志记录期间主动分割所有巨页。Eager 页面分割通过消除写保护错误和内存管理单元 (MMU) 锁定争用而减少 vCPU 执行中断,而其他方式需要分割大页面。
很少执行写入或只写入虚拟机内存区域的虚拟机工作负载可从禁用 eager 页面拆分中受益,从而使巨页仍被用于读取。
eager 页面分割行为取决于启用或禁用
KVM_DIRTY_LOG_INITIALLY_SET
选项。-
如果禁用,当脏日志在
memslot
中启用,,memslot
中的所有巨页都会积极分割。 如果启用,在
KVM_CLEAR_DIRTY
ioctl()
系统调用期间执行 eager 页面分割,并且仅针对被清除的页面。Eager 页面分割目前只支持分割由两个维度分页(TDP) MMU 映射的巨页。
默认值为
Y
(on
)。
-
如果禁用,当脏日志在
- kvm.nx_huge_pages_recovery_period_ms = [KVM]
使用这个参数时,您可以控制 KVM zaps 4 KiB 页面回巨页的时间周期。
-
如果值为非零的
N
,KVM 会没每N
毫秒的页面部分。 如果值为
0
,KVM 根据比例选择一个周期,从而使页面平均在 1 小时后显示出来。默认值为
0
。
-
如果值为非零的
- l1d_flush = [X86,INTEL]
使用这个参数,您可以控制基于 L1D 的侦听漏洞的缓解方案。
某些 CPU 可能会容易受到 CPU 内部缓冲区的攻击,在某些情况下可以把信息转发到披露。在存在安全漏洞的处理器中,缓存侧频道攻击可以利用预测的数据转发,访问到应该无法直接访问到的数据。
可用选项是
on
,这表示为缓解措施启用接口
。- mmio_stale_data = [X86,INTEL]
使用这个参数,您可以控制 Processor Memory-mapped I/O (MMIO) Stale 数据漏洞的缓解方案。
处理器 MMIO Stale 数据是一个漏洞,在 MMIO 操作后可以公开数据。公开的数据可能源自或结束与元数据服务器 (MDS) 和异步 Asynchronous Abort (TAA) 影响的相同 CPU 缓冲区。因此,与 MDS 和 TAA 类似,缓解方案是清除受影响的 CPU 缓冲区。
可用的选项有:
-
full
: 在存在安全漏洞的 CPU 上启用缓解方案 -
full,nosmt
: 在存在安全漏洞的 CPU 上启用缓解方案并禁用 SMT。 off
: 无条件禁用缓解方案在 MDS 或 TAA 受影响的机器上,活跃 MDS 或 TAA 缓解方案可以防止
mmio_stale_data=off
,因为这些漏洞会使用相同的机制进行缓解。因此,为了禁用这个缓解方案,您还需要指定mds=off
和tsx_async_abort=off
。不指定这个选项等同于
mmio_stale_data=full
。如需更多信息,请参阅
Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst
。
-
- random.trust_bootloader={on,off} = [KNL]
-
使用这个参数您可以启用或禁用引导装载程序传递的使用(如果可用)的信任,以完全看到内核的 CRNG。默认的行为由
CONFIG_RANDOM_TRUST_BOOTLOADER
选项控制。 - rcupdate.rcu_task_collapse_lim = [KNL]
-
使用此参数,您可以设置在宽限期开始时提供的最大回调数,允许 RCU 任务类别折叠回使用单一回调队列。只有在
rcupdate.rcu_task_enqueue_enqueue_lim
选项被设置为默认值-1
时,才会进行这种切换。 - rcupdate.rcu_task_contend_lim = [KNL]
-
使用这个参数,您可以设置每个 jiffy 所需的最少回调锁定事件数量,从而导致 RCU 任务类型切换到每个 CPU 回调队列。只有在
rcupdate.rcu_task_enqueue_enqueue_lim
选项被设置为默认值-1
时,才会进行这种切换。 - rcupdate.rcu_task_enqueue_lim = [KNL]
使用此参数,您可以设置用于 RCU 类别的 RCU 任务系列的回调队列数量。您可以使用默认值
-1
自动调整回调队列的数量,并动态调整。这个参数用于测试。
- retbleed = [X86]
使用这个参数,您可以使用返回说明(RETBleed)漏洞来控制对 Arbitrary Speculative Code Execution 的缓解方案。可用的选项有:
-
off
: 不实施缓解方案 -
auto
: 自动选择缓解方案 -
auto,nosmt
: 会自动选择一个缓解方案,在完全缓解措施的情况下禁用 SMT (只在 Zen1 和更早的 STIBP 中)。 -
ibpb
:减轻基本块边界上的短规范窗口。安全,对性能有最高的影响。 -
unret
:force enable untrained return thunks, only effective on AMD f15h-f17h based systems。 unret,nosmt
: 与unret
选项一样,当 STIBP 不可用时,将禁用 SMT。选择
auto
选项会根据 CPU,在运行时选择缓解方案。不指定这个选项等同于
retbleed=auto
。
-
- sev=option[,option…] = [X86-64]
-
如需更多信息,请参阅
Documentation/x86/x86_64/boot-options.rst
。
更新的内核参数
- acpi_sleep = [HW,ACPI]
格式为:{ s3_bios, s3_mode, s3_beep, s4_hwsig, s4_nohwsig, old_ordering, nonvs, sci_force_enable, nobl }
-
有关
s3_bios
和s3_mode
的更多信息,请参见Documentation/power/video.rst
。 -
s3_beep
用于调试;当内核的实际模式入口点被调用时,PC 会马上发出滴滴的声音。 -
s4_hwsig
会导致内核在从休眠状态恢复过程中检查 ACPI 硬件签名,并在其更改后安全拒绝恢复。默认行为是允许恢复,只需在签名更改时警告,除非启用了s4_hwsig
选项。 -
s4_nohwsig
可防止在恢复过程中使用 ACPI 硬件签名,甚至警告。old_ordering
会导致_PTS
控制方法的 ACPI 1.0 排序,以防止将设备置于低功耗状态。默认情况下会使用_PTS
的 ACPI 2.0 排序。 -
nonvs
可防止内核在挂起、休眠和恢复过程中保存和恢复 ACPI NVS 内存。 -
sci_force_enable
可使内核直接从 S1/S3 恢复时设置SCI_EN
。虽然此行为与 ACPI 规范相反,但一些损坏的系统无法正常工作。 nobl
不会导致已知系统的内部拒绝列表的行为在某些方面与系统挂起和恢复被忽略时不正确。请谨慎使用这个选项。如需更多信息,请参阅
Documentation/power/video.rst
。
-
有关
- crashkernel=size[KMG],high = [KNL, X86-64, ARM64]
使用这个参数,您可以按如下方式从顶部分配物理内存区域:
- 如果系统安装了 4 GB RAM,物理内存区域可能会超过 4 GB。
如果系统安装的 4 GB RAM 少于 4 GB,那么将在 4 GB 下分配物理内存区域(如果可用)。
如果指定了
crashkernel=X
参数,则忽略此参数。
- crashkernel=size[KMG],low = [KNL, X86-64]
当您使用
crashkernel=X,high
时,内核可以分配超过 4 GB 的物理内存区域。这会导致在需要某种低内存的系统上出现第二个内核崩溃(例如,swiotlb
需要至少 64M+32K 低内存)和足够的低内存,以确保 32 位设备的 DMA 缓冲区不会被耗尽。内核会尝试自动分配比 4 GB 低 256 M。使用此参数,您可以为第二个内核指定 4 GB 的低范围。-
0:
禁用低分配。当crashkernel=X,high
未使用或保留内存低于 4 GB 时,它将会被忽略。
-
- crashkernel=size[KMG],low = [KNL, ARM64]
-
使用此参数,您可以为崩溃转储内核在 DMA 区域中指定低范围。当
crashkernel=X,high
未使用或保留的内存位于 DMA 区域时,它将会被忽略。 - kvm.nx_huge_pages_recovery_ratio = [KVM]
使用这个参数,您可以控制定期将多少 4 KiB 页面处理回巨页:
-
0
禁用恢复 N
KVM 将在每个期间快速切换 4 KiB 页的1/Nth
。默认值为
60
。
-
- kvm-arm.mode = [KVM,ARM]
使用这个参数您可以选择 KVM 操作的模式之一:
-
none
:强制禁用 KVM。 -
nvhe
:基于 nVHE 的标准模式,无需对受保护的客户机提供支持。 protected
:基于nVHE
的模式,支持其状态从主机中私有的客户机。如果内核在 EL2 级别中运行,则无效。根据硬件支持,默认值被设置为
VHE/nVHE
。
-
- mitigations = [X86,PPC,S390,ARM64]
使用这个参数,您可以控制 CPU 漏洞的可选缓解方案。这是一组策展的、架构独立的选项,每个选项都是现有的特定架构选项的聚合:
off
:禁用所有可选 CPU 缓解方案。这会提高系统性能,但可能会使用户暴露一些 CPU 漏洞。-
等同于:
nopti [X86,PPC]
,kpti=0 [ARM64]
,nospectre_v1 [X86,PPC]
,nobp=0 [S390]
,nospectre_v2 [X86,PPC,S390,ARM64]
,spectre_v2_user=off [X86]
,spec_store_bypass_disable=off [X86,PPC]
,ssbd=force-off [ARM64]
,l1tf=off [X86]
,mds=off [X86]
,tsx_async_abort=off [X86]
,kvm.nx_huge_pages=off [X86]
,no_entry_flush [PPC]
,no_uaccess_flush [PPC]
,mmio_stale_data=off [X86]
. -
例外:当指定了
kvm.nx_huge_pages=force
选项时,这不会影响kvm.nx_huge_pages=force
。
-
等同于:
auto
(默认):缓解所有 CPU 漏洞,但仍然启用 SMT,即使它存在安全漏洞。- 等效于:(默认行为)
auto,nosmt
:缓解所有 CPU 漏洞,如果需要,禁用 SMT。-
等同于:
l1tf=flush,nosmt [X86]
,mds=full,nosmt [X86]
,tsx_async_abort=full,nosmt [X86]
,mmio_stale_data=full,nosmt [X86]
-
等同于:
- rcu_nocbs[=cpu-list] = [KNL]
可选参数是一个 CPU 列表。
在使用
CONFIG_RCU_NOCB_CPU=y
构建的内核中,您可以启用 no-callback CPU 模式,这样可防止此类 CPU 回调在 softirq 上下文调用。对这类 CPU 的 RCU callbacks 的调用会使用为这个目的创建的rcuox/N
kthreads
,其中x
是p
(对于 RCU-preempt),s
(对于 RCU-sched),g
(对于kthreads
用于实现 grace 期),以及N
是 CPU 号。这可减少卸载 CPU 上的 OS 存放位置,这对于 HPC 和实时工作负载非常有用。它还可提高非对称多处理器的能源效率。-
如果将
cpulist
作为参数传递,则指定 CPU 列表从引导设置为 no-callback 模式。 -
如果省略
=
符号和cpulist
参数,则不会在启动时将 CPU 设置为 no-callback 模式,但您可以使用cpusets
在运行时切换模式。
-
如果将
- rcutree.kthread_prio = [KNL,BOOT]
使用这个参数,您可以设置每个 CPU
kthreads
(rcuc/N
) 的 RCU 的SCHED_FIFO
优先级。这个值也用于 RCU 的优先级增加线程 (rcub/N
) 和 RCU grace-periodkthreads
(rcu_bh
、rcu_preempt
、rcu_sched
)。-
如果设置了
RCU_BOOST
,则有效值为 1-99,默认值为1
(最低优先级)。 如果没有设置
RCU_BOOST
,则有效值为 0-99,默认值为0
(非实时操作)。当设置了
RCU_NOCB_CPU
时,您应该调整NOCB
回调kthreads
的优先级。
-
如果设置了
- rcutorture.fwd_progress = [KNL]
使用这个参数,您可以指定用于 RCU grace-period forward-progress 测试的
kthreads
数。默认为
1
kthread
。小于零的值或大于 CPU 数量的值会导致要使用的 CPU 的数量。- spectre_v2 = [X86]
通过这个参数,您可以控制 Spectre 变体 2(间接分支推测)漏洞的缓解。默认的操作可以防止内核免受用户空间的攻击。
-
on
: 无条件启用,代表spectre_v2_user=on
-
off
: 无条件禁用,代表spectre_v2_user=off
-
auto
: 内核会检测 CPU 中是否存在安全漏洞 -
选择
on
将会(选择auto
可能会)根据 CPU,可用的 microcode,CONFIG_RETPOLINE
配置选项的设置,以及内核构建的编译器,在运行时选择环境方案。 -
选择
on
还将启用对用户空间任务攻击的缓解方案。 -
选择
off
将禁用内核和用户空间保护。 也可以手动选择特定的缓解方案:
-
retpoline
: 替换间接分支 -
retpoline,generic
: Retpolines -
retpoline,lfence
: LFENCE; 间接分支 -
retpoline,amd
: retpoline,lfence 的别名 -
eibrs
:增强的 IBRS -
eibrs,retpoline
: 增强的 IBRS + Retpolines -
eibrs,lfence
:增强的 IBRS + LFENCE ibrs
: 使用 IBRS 保护内核不指定这个选项等同于
spectre_v2=auto
。
-
-
新 sysctl 参数
- max_rcu_stall_to_panic
-
当您将
panic_on_rcu_stall
设置为1
时,您可以确定 RCU 可在调用panic()
前停止的次数。当您将panic_on_rcu_stall
设置为0
时,这个值不会起作用。 - perf_user_access = [ARM64]
使用此参数,您可以控制用户空间的访问读取
perf
事件计数器。-
当设置为
1
时,用户空间可以读取性能监控计数器寄存器。 默认值为
0
,这表示已禁用访问
。如需更多信息,请参阅文档
/arm64/perf.rst
。
-
当设置为
- gro_normal_batch
-
使用此参数,您可以将片段的最大数量设置为在 GRO 的输出上批处理。当数据包退出 GRO 时,作为 coalesced 超级框架,或者作为原始数据包 (GRO) 决定不冲突,它将放置在每个NAPI 列表中。然后,当片段数量达到
gro_normal_batch
限制时,此列表将传递到堆栈。 - high_order_alloc_disable
使用这个参数您可以选择 order-0 分配。默认情况下,页片段的分配器会尝试使用高顺序页面,即 X86 系统上的 order-3。虽然默认行为返回良好结果,但在某些情况下,在页面分配和释放发生的情况下发生。当高排序页面没有存储在每个 CPU 列表中时,在较旧的内核(版本 5.14 及更高版本)中尤其如此。这个参数现在包括大多数历史的重要性。
默认值为
0
。- page_lock_unfairness
通过指定此参数的值,您可以确定页面锁定在等待者下可以阻止的次数。锁定被盗了在此文件中指定的次数后,会应用
公平锁定
的语义,并且等待者仅在有锁定时才会被忽略。默认值为
5
。
更改了 sysctl 参数
- urandom_min_reseed_secs
-
您可以使用此参数来确定
urandom
池重新处理之间的最少秒数。此文件对于兼容性目的而言是可写的,但对任何 RNG 的行为都没有影响。 - write_wakeup_threshold
-
当熵的 sink 数低于这个阈值时,您可以唤醒等待写入
/dev/random
文件的进程。此文件对于兼容性目的而言是可写的,但对任何 RNG 的行为都没有影响。