第 5 章 对外部内核参数的重要更改
本章为系统管理员提供了与 Red Hat Enterprise Linux 9.5 一起分发的内核中的显著变化的总结。这些更改可能包括,例如,添加或更新的 proc
条目、sysctl
和 sysfs
默认值、引导参数、内核配置选项或任何明显的行为更改。
新内核参数
numa_cma=<node>:nn[MG][,<node>:nn[MG]]
[KNL,CMA]
为连续内存分配设置内核 numa 内存区域的大小。它将为指定的节点保留 CMA 区域。
启用 numa CMA 后,节点 nid 上的 DMA 用户将首先尝试从位于节点 nid 的 numa 区域分配缓冲区,如果分配失败,它们将回退到全局默认内存区域。
reg_file_data_sampling=
[x86]
控制寄存器文件数据采样(RFDS)漏洞的缓解。RFDS 是一个 CPU 漏洞,它可能会允许用户空间推断之前存储在浮点寄存器、向量寄存器或整数寄存器中的内核数据值。RFDS 仅影响 Intel Atom 处理器。
值:
-
on
:: 打开缓解 -
off
:: 关闭缓解
此参数覆盖 CONFIG_MITIGATION_RFDS 默认设定的编译时间。当启用了其他基于 VERW 的缓解方案(如 MDS)时,无法禁用缓解方案。要禁用 RFDS 缓解所有基于 VERW 的缓解方案需要禁用。
详情请查看:Documentation/admin-guide/hw-vuln/reg-file-data-sampling.rst
locktorture.acq_writer_lim=
[KNL]
为锁获取设置时间限制(以 jiffies 为单位)。完成后,超出此限制的获取将导致失败。
locktorture.bind_readers=
[KNL]
指定读卡器要绑定到的 CPU 的列表。
locktorture.bind_writers=
[KNL]
指定写卡器要绑定到的 CPU 的列表。
locktorture.call_rcu_chains=
[KNL]
指定要设置的自传播 call_rcu()
链的数量。它们用于确保在任意给定时间都有很高的出现 RCU 宽限期的概率。默认为 0,它会禁用这些 call_rcu()
链。
locktorture.long_hold=
[KNL]
指定偶尔长时间锁定保持时间的持续时间(以毫秒为单位)。默认值为 100 毫秒。选择 0
来禁用。
locktorture.nested_locks=
[KNL]
指定锁定 torture 要进行的最大锁嵌套深度,最多为 8
(MAX_NESTED_LOCKS)。指定 zero
来禁用。请注意,此参数对不支持嵌套获取的锁类型无效。
workqueue.default_affinity_scope=
选择用于未绑定工作队列的默认关联性范围。可以是 "cpu", "smt", "cache", "numa" 和 "system" 之一。默认为 "cache"。如需更多信息,请参阅 Documentation/core-api/workqueue.rst
中的 Affinity Scopes 部分。
这可以在启动后通过写入匹配的 /sys/module/workqueue/parameters
文件来进行更改。具有 "default" 关联性范围的所有工作队列都会相应地更新。
locktorture.rt_boost=
[KNL]
进行实时锁优先级的定期测试。选择 0
来禁用,1
来仅提升 rt_mutex,2
来无条件提升。默认值为 2
,它似乎是一个奇数选择,但因为禁用了抢占功能,其对于非实时启动锁应该无害。请注意,非实时互斥锁禁用提升。
locktorture.writer_fifo=
[KNL]
以 sched_set_fifo()
实时优先级运行写侧 locktorture kthreads。
locktorture.rt_boost_factor=
[KNL]
执行优先级提升的频率和时长的数字。这根据写卡器的数量而缩减,以便每单元时间的提升数量随着写卡器数量的增加而大致保持不变。但是,每次的持续时间会随着写入者的数量而增加。
microcode.force_minrev=
[X86]
格式: <bool>
为运行时微代码加载程序启用或禁用微代码最小修订强制。
module.async_probe=<bool>
[KNL]
当设置为 true 时,模块默认将使用异步探测。要为特定模块启用或禁用 async probing,请使用 <module> .async_probe 下的模块
特定控制。当同时指定了 module.async_probe
和 <module>.async_probe
时,<module>.async_probe
优先于特定的模块。
module.enable_dups_trace
[KNL]
当设置了 CONFIG_MODULE_DEBUG_AUTOLOAD_DUPS
时,这意味着重复的 request_module()
调用将触发 WARN_ON()
而不是 pr_warn()
。请注意,如果设置了 MODULE_DEBUG_AUTOLOAD_DUPS_TRACE
,则始终将发出 WARN_ON()
,这个选项不执行任何操作。
nfs.delay_retrans=
[NFS]
指定 NFSv4 客户端在服务器回复 NFS4ERR_DELAY 后,在返回 EAGAIN 错误之前重试请求的次数。仅在启用了 softerr 挂载选项且指定的值是 >= 0
时应用。
rcutree.do_rcu_barrier=
[KNL]
请求调用 rcu_barrier()
。这是受到限制的,因此可以安全地对 sysfs 变量执行用户空间测试(如果他们选择的话)。如果在 RCU grace-period machinery 完全激活之前被触发了,则会出现 EAGAIN 错误。
rcuscale.minruntime=
[KNL]
设置最小测试运行时间(以秒为单位)。这不会影响 data-collection 间隔,而是允许更好地测量 CPU 消耗的事情。
rcuscale.writer_holdoff_jiffies=
[KNL]
宽限期之间额外的写入端延迟,但以 jiffies 为单位。默认值零表示没有延迟。
rcupdate.rcu_cpu_stall_notifiers=
[KNL]
提供 RCU CPU 停滞通知程序,但在 RCU_CPU_STALL_NOTIFIER Kconfig 选项的帮助文本中看到警告。TL;DR :您几乎肯定不需要 rcupdate.rcu_cpu_stall_notifiers。
rcupdate.rcu_task_lazy_lim=
[KNL]
指定 CPU 上的回调次数,将取消该 CPU 上的惰性。使用 -1
禁用惰性的取消,但要注意这样做会因为回调泛滥而增加 OOM 的危险。
rcupdate.rcu_tasks_lazy_ms= ++
[KNL]
对 call_rcu_tasks()
的 RCU 任务异步批处理设置超时(以毫秒为单位)。负值将采用默认值。零值将禁用批处理。对于 synchronize_rcu_tasks()
,始终禁用批处理。
rcupdate.rcu_tasks_rude_lazy_ms=
[KNL]
对 call_rcu_tasks_rude ()
的 RCU 任务 Rude 异步回调批处理设置超时(以毫秒为单位)。负值将采用默认值。零值将禁用批处理。对于 synchronize_rcu_tasks_rude()
,始终禁用批处理。
rcupdate.rcu_tasks_trace_lazy_ms=
[KNL]
对 call_rcu_tasks_trace()的 RCU 任务跟踪异步回调批处理设置超时(以毫秒为单位)。负值将采用默认值。零值将禁用批处理。对于 synchronize_rcu_tasks_trace (),始终禁用批处理。
spectre_bhi=
[X86]
控制 Branch History Injection (BHI)(BHI)漏洞的缓解。此设置会影响 HW BHI 控制和 SW BHB 清除顺序的部署。
值:
on
- (默认)根据需要启用 HW 或 SW 缓解。
off
- 禁用缓解。
unwind_debug
[X86-64]
启用 unwinder 调试输出。这可用于调试某些 unwinder 错误情况,包括损坏的堆栈和坏的/丢失的 unwinder 元数据。
workqueue.cpu_intensive_thresh_us=
为超过这个阈值运行的每个 cpu 工作项目被自动被视为 CPU 密集型,并从并发管理中排除,以防止它们明显延迟其他每个 cpu 工作项目。默认值为 10000
(10ms)。
如果设置了 CONFIG_WQ_CPU_INTENSIVE_REPORT
,内核将报告重复违反此阈值的工作功能。它们可能是使用 WQ_UNBOUND 工作队列的良好候选者。
workqueue.cpu_intensive_warning_thresh=<uint> ,如果设置了 CONFIG_WQ_CPU_INTENSIVE_REPORT
,内核将报告反复违反 intensive_threshold_us
的工作功能。要防止假的警告,只有在工作函数违反了这个阈值的次数后才开始打印。
默认值为 4 次。0
禁用警告。
workqueue.default_affinity_scope=
选择用于未绑定工作队列的默认关联性范围。可以是 "cpu", "smt", "cache", "numa" 和 "system" 之一。默认为 "cache"。如需更多信息,请参阅 Documentation/core-api/workqueue.rst 中的 Affinity Scopes 部分。
这可以在启动后通过写入匹配的 /sys/module/workqueue/parameters
文件来进行更改。具有 "default" 关联性范围的所有工作队列都会相应地更新。
xen_msr_safe=
[X86,XEN]
格式: <bool>
选择在作为 Xen PV 客户机运行时,始终使用非错误(安全)MSR 访问功能。默认值由 CONFIG_XEN_PV_MSR_SAFE
控制。
更新的内核参数
clearcpuid=
X[,X...] [X86]
为内核禁用 CPUID 功能 X。请参阅数字 X。
请注意,特定于 Linux 的位不一定比内核选项稳定,但特定于提供商的位应该比内核选项稳定。X 也可以是出现在标志中的字符串:/proc/cpuinfo
中的行,它没有上述不稳定问题。但是,并非所有功能都在 /proc/cpuinfo
中有名称。请注意,使用这个选项会玷污内核。
另请注意,直接调用 CPUID 或使用该功能而无需检查任何内容的用户程序仍会看到它。这只是防止它被内核使用,或者在 /proc/cpuinfo
中显示。另外请注意,如果您禁用了一些关键位,内核可能会出现故障。
cma_pernuma=nn[MG]
[KNL,CMA]
设置用于连续内存分配的每个内存区域的内核的大小。值 0
完全禁用每个 numa CMA。并且未指定这个选项,则默认值为 0
。启用每个numa CMA 后,节点 nid 上的 DMA 用户首先尝试从节点 nid 中的 pernuma 区域分配缓冲区,如果分配失败,它们将回退到全局默认内存区域。
csdlock_debug=
[KNL]
启用跨 CPU 功能调用处理的调试附加组件。打开时,当检测到 CPU 挂起时,会将额外的调试数据输出到控制台,并且再次 ping CPU 以尝试解决挂起的情况。这个选项的默认值取决于 CSD_LOCK_WAIT_DEBUG_DEFAULT
Kconfig 选项。
<module>.async_probe[=<bool>]
[KNL]
如果没有指定 <bool>
值,或者指定的值不是有效的 <bool>
,请对此模块启用异步探测。否则,根据 < bool> 值表示,在此模块
上启用或禁用异步探测。另请参阅:module.async_probe
earlycon=
[KNL]
输出早期控制台设备和选项。
当与无选项一起使用时,早期控制台是由设备树选择的节点中的 stdout-path 属性或 ACPI SPCR (如果平台支持)决定的。
cdns,<addr>[,options] 在指定地址的 Cadence (xuartps)串行端口上启动一个早期的、轮询模式的控制台。唯一支持的选项是波特率。如果没有指定波特率,则必须已设置和配置了串行端口。
uart[8250],io,<addr>[,options[,uartclk]]uart[8250],mmio,<addr>[,options[,uartclk]]uart[8250],mmio32,<addr>[,options[,uartclk]]uart[8250],mmio32be,<addr>[,options[,uartclk]]uart[8250],0x<addr>[,options]
在位于指定的 I/O 端口或 MMIO 地址的 8250/16550 UART 上启动一个早期的、轮询模式的控制台。MMIO 寄存器间地址步幅是 8 位(mmio)或 32 位(mmio32 或 mmio32be)。如果没有 [io|mmio|mmio32|mmio32be], 假设 <addr>
等同于 'mmio'。'options' 的指定格式与 "console=ttyS<n>" 描述的格式相同;如果未指定,h/w 不会被初始化。"uartclk' 是 uart 时钟频率;如果未指定,它被设置为 'BASE_BAUD' * 16。
earlyprintk=
[X86,SH,ARM,M68k,S390]
earlyprintk=vga earlyprintk=sclp earlyprintk=xen earlyprintk=serial[,ttySn[,baudrate]] earlyprintk=serial[,0x…[,baudrate]] earlyprintk=ttySn[,baudrate] earlyprintk=dbgp[debugController#] earlyprintk=pciserial[,force],bus:device.function[,baudrate] earlyprintk=xdbc[xhciController#]
当内核在正常的控制台被初始化前崩溃时,earprintk 很有用。默认情况下不会启用它,因为它有一些外观问题。
当实际控制台接管时,附加",keep"来不禁用它。
一次只能使用 vga、efi、serial 或 USB 调试端口之一。
目前,名称只能指定 ttyS0 和 ttyS1。通过将 ttySn 替换为 I/O 端口地址,suc as: earlyprintk=serial,0x1008,115200 可以在某些架构上明确指定其他 I/O 端口,115200,您可以在 /proc/tty/driver/serial: 2: uart:ST16650V2 port: 2: uart:ST16650V2 port:00001008 irq:18 中找到给定设备的端口。
与标准串行驱动程序的交互并不好。
VGA 和 EFI 输出最终被实际的控制台覆盖。
xen 选项只能在 Xen 域中使用。
sclp 输出只能在 s390 上使用。
可选的 "force" 到 "pciserial" 允许使用 PCI 设备,即使其类代码不是 UART 类。
iommu.strict=
[ARM64, X86, S390]
配置 TLB 无效行为。
格式:{ "0" | "1" }
0
- lazy 模式- 请求 DMA 取消映射操作使用硬件 TLB 的延迟无效,以减少设备隔离为代价来提高吞吐量。如果相关 IOMMU 驱动程序不支持,将回退到 strict 模式。
1
- Strict 模式- DMA 取消映射操作会同步使 IOMMU 硬件 TLB 无效。
unset
- 使用 CONFIG_IOMMU_DEFAULT_DMA_{LAZY,STRICT} 的值。
在 x86 上,通过传统的特定于驱动程序的一个选项指定的 strict 模式具有优先权。
mem_encrypt=
[x86_64]
AMD 安全内存加密(SME)控制。
有效参数:on、off
默认:off
mem_encrypt=on: Activate SME mem_encrypt=off: 不要激活 SME
mitigations=
[X86,PPC,S390,ARM64]
控制可选的 CPU 漏洞的缓解。这是一组策展的、架构独立的选项,每个选项都是现有的特定架构选项的聚合。
值: off
禁用所有可选的 CPU 缓解。这提高了系统性能,但可能会使用户暴露几个 CPU 漏洞。等同于:如果 nokaslr,则 kpti=0 [ARM64] gather_data_sampling=off [X86] kvm.nx_huge_pages=off [X86] l1tf=off [X86] mds=off [X86] mmio_stale_data=off [X86] no_entry_flush [PPC] no_uaccess_flush [PPC] nobp=0 [S390] nopti [X86,PPC] nospectre_bhb [ARM64] nospectre_v1 [X86,PPC] nospectre_v2 [X86,PPC,S390,ARM64] reg_file_data_sampling=off [X86] retbleed=off [X86] spec_rstack_overflow=off [X86] spec_store_bypass_disable=off [X86,PPC] spectre_bhi=off [X86] spectre_v2_user=off [X86] srbds=off [X86,INTEL] ssbd=force-off [ARM64] tsx_async_abort=off [X86]
nosmap
[PPC]
禁用 SMAP (Supervisor Mode Access Prevention),即使处理器支持它。
nosmep
[PPC64s]
禁用 SMEP (Supervisor Mode Execution Prevention),即使处理器支持它。
nox2apic
[x86_64,APIC]
不要启用 x2APIC 模式。
这个参数将在 IA32_XAPIC_DISABLE_STATUS MSR
中设置了 LEGACY_XAPIC_DISABLED
位的系统上被忽略。
panic_print=
发生 panic 时用于打印系统信息的位掩码。用户可以选择以下位的组合:
- 位 0:打印所有任务信息
- 位 1:打印系统内存信息
- 位 2:打印计时器信息
- 位 3:如果 CONFIG_LOCKDEP 是 on ,则打印锁信息
- 位 4:打印 ftrace 缓冲区
- 位 5:打印缓冲区中的所有 printk 消息
- 位 6:打印所有 CPU 回溯(如果 arch 中有)
这个选项可能会打印 很多 行,因此日志中会丢失旧的消息。仔细使用这个选项,您可以考虑使用 "log_buf_len" 设置更大的日志缓冲。
pcie_aspm=
[PCIE]
强制启用或禁用 PCIe 活动状态电源管理。
值:
off
- 根本不涉及 ASPM 配置。保持固件所完成的任何配置不变。
force
- 即使在声称不支持它的设备上也启用 ASPM。
在 上强制 ASPM 可能会导致系统锁定。
s390_iommu=
[HW,S390]
设置 s390 IOTLB 刷新模式。
值:
strict
- 使用严格的清除每个未映射操作将导致 IOTLB 刷新。
default
- 在重复使用前是惰性刷新,其速度更快。
Deprecated
- equivalent to iommu.strict=1.
spectre_v2=
[x86]
控制 Spectre 变体 2(间接分支推测)漏洞的缓解。默认的操作可以防止内核免受用户空间的攻击。
值:
on
- 无条件启用,意味着 spectre_v2_user=on。
off
- 无条件禁用,意味着 spectre_v2_user=off。
auto
- 内核检测您的 CPU 型号是否存在漏洞。
选择 'on' 将会在运行时根据 CPU、可用的 microcode、 CONFIG_MITIGATION_RETPOLINE
配置选项的设置以及构建内核的编译器选择缓解方法。
usbcore.quirks=
[USB]
添加内置 USB 内核 quirk 列表的 quirk 条目列表。列表条目用逗号分开。每个条目的形式为 VendorID:ProductID:Flags
。ID 是 4 位十六进制数,标记是一组字母。每个字母都会改变内置的 quirk ; 如果当前被清除,则设置它,如果当前是设置的,则清除它。字母的含义如下:
- a = USB_QUIRK_STRING_FETCH_255 (不能使用 255 字节读取获取字符串描述符);
- b = USB_QUIRK_RESET_RESUME (设备无法正确恢复,因此无法重置);
- c = USB_QUIRK_NO_SET_INTF (设备无法处理 Set-Interface 请求);
- d = USB_QUIRK_CONFIG_INTF_STRINGS (设备无法处理其配置或接口字符串);
- e = USB_QUIRK_RESET (device cannot be reset (e.g morph devices), do not use reset);
-
F = USB_QUIRK_HONOR_BNUMINTERFACES (设备具有比
bNumInterfaces
数量更多的接口描述,无法处理与这些接口的通信); - g = USB_QUIRK_DELAY_INIT (在读取设备描述符后,设备在初始化过程中需要暂停);
- H = USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL (对于高速度和超级速度中断端点,USB 2.0 和 USB 3.0 spec 需要微线 = 125 微秒)的间隔计算为间隔 = 2 ^(bInterval-1)。具有此 quirk 的设备会报告其 bInterval 作为结果,而不是计算中使用的 exponent 变量;
- i = USB_QUIRK_DEVICE_QUALIFIER (device cannot handle device_qualifier descriptor requests);
- J = USB_QUIRK_IGNORE_REMOTE_WAKEUP (设备会生成假的 wakeup、忽略远程 wakeup 功能);
- k = USB_QUIRK_NO_LPM (device cannot handle Link Power Management);
- l = USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL (设备将其 bInterval 报告为线性帧而不是 USB 2.0 计算);
- M = USB_QUIRK_DISCONNECT_SUSPEND (在暂停前需要断开连接,以防止假的 wakeup);
- n = USB_QUIRK_DELAY_CTRL_MSG (每个控制消息后设备需要暂停);
- o = USB_QUIRK_HUB_SLOW_RESET (Hub needs extra delay after resetting its port);
- P = USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT (SET_ADDRESS 请求的超时从 5000 ms 到 500 ms);
示例: quirks=0781:5580:bk,0a5c:5834:gij
删除的内核参数
-
[BUGS=X86]
noclflush
:: do not use the CLFLUSH 指令。 -
Workqueue.disable_numa
-
[X86]
noexec
-
[BUGS=X86-32]
nosep
:: Disables x86 SYSENTER/SYSEXIT 支持。 -
[X86]
nordrand
:: 禁用 RDRAND 的内核使用。 -
thermal.nocrt
新的 sysctl 参数
oops_limit
没有设置 panic_on_oops
时内核应该 panic 的内核 oopses 数量。把它设置为 0
可禁用检查计数。把它设置为 1
与设置 panic_on_oops=1
的作用相同。默认值为 10000
。
warn_limit
当未设置 panic_on_warn
时内核警告数量。把它设置为 0
可禁用检查警告计数。把它设置为 1
的效果与设置 panic_on_warn=1
相同。默认值为 0
。
kexec_load_limit_panic
这个参数指定了通过 crash 镜像调用 syscalls kexec_load
和 kexec_file_load
的次数的限制。它只能设置比当前值更严格的值。
值:
-1
- 对 kexec 的无限调用。这是默认设置。
N
- 左侧调用数。
kexec_load_limit_reboot
与 kexec_load_limit_panic
类似,但用于普通镜像。
numa_balancing_promote_rate_limit_MBps
不同内存类型之间过高的提升或降级吞吐量可能会损害应用程序延迟。您可以使用此参数来对提升吞吐量进行速率限制。每节点的最大提升吞吐量(以 MB/s 为单位)被限制为不超过设置值。
将此参数设置为 PMEM 节点写入带宽的 1/10。
更新了 sysctl 参数
kexec_load_disabled
一个切换,表示禁用了 syscalls kexec_load
和 kexec_file_load
。这个值默认为 0
(false: kexec kexecload
enabled),但可以被设置为 1 (
true: kexec observabilityload
disabled)。
为 true 后,kexec 将不再被使用,切换无法设置为 false
。这允许在禁用 syscall 前加载 kexec 镜像,允许系统在不更改的情况下设置(及之后使用)镜像。通常与 'modules_disabled'_ sysctl 一起使用。
panic_print
发生 panic 时用于打印系统信息的位掩码。用户可以选择以下位的组合:
- 位 0 打印所有任务信息
- 位 1 打印系统内存信息
- 位 2 打印计时器信息
-
如果
CONFIG_LOCKDEP
所在的,则位 3 打印锁定信息 - 位 4 打印 ftrace 缓冲
- 位 5 打印缓冲区中的所有 printk 消息
- 位 6 打印所有 CPU 回溯追踪(如果在 arch 中提供)
sched_energy_aware
启用或禁用 Energy Aware Scheduling (EAS)。EAS 在可运行的平台上自动启动(即具有非对称 CPU 拓扑的平台,并且有 Energy Model)。如果您的平台确实符合 EAS 的要求,但您不想使用它,请将此值更改为 0。
在非EAS 平台上,写入操作失败,读取不会返回任何内容。