李守中
该站已迁往根域名 https://lishouzhong.com
需要注意,迁移后的文章的 url 可能会发生变化。
域名 https://note.lishouzhong.com 下的内容将不再更新,但已有内容会永久保留。

Linux 内核参数相关

Table of Contents

1. 修改内核启动参数

1.1. 备份 grub 配置

对于 MBR ( 基于 BIOS ) 的系统:

cp /etc/default/grub /etc/default/grub.backup
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.backup

对于 RedHat 系使用 GPT ( 基于 UEFI ) 的系统:

cp /etc/default/grub /etc/default/grub.backup
cp /boot/efi/EFI/redhat/grub.cfg /boot/efi/EFI/redhat/grub.cfg.backup

对于 Debian 系使用 GPT ( 基于 UEFI ) 的系统:

cp /etc/default/grub /etc/default/grub.backup
cp /boot/efi/EFI/debian/grub.cfg /boot/efi/EFI/debian/grub.cfg.backup

1.2. 更改 grub 配置

编辑 /etc/default/grub 文件。这个文件里有许多的 grub2 配置。

内核启动参数在 GRUB_CMDLINE_LINUX 字段中配置,内容像这样:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"

GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

改好之后,保存文件,退出。

1.3. 重新生成 grub.cfg 配置文件

1.3.1. RedHat 系

对于 MBR ( 基于 BIOS ) 的系统: grub2-mkconfig -o /boot/grub2/grub.cfg

对于 GPT ( 基于 UEFI ) 的系统: grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

然后重启系统即可使新的配置生效。

1.3.2. Debian 系

执行 sudo update-grub 即可。

然后重启系统即可使新的配置生效。

1.4. 确认新配置生效

在系统启动之后,执行 cat /proc/cmdline 可以查看本次启动所用的内核参数,输出类似于这样:

BOOT_IMAGE=(hd1,gpt2)/vmlinuz-4.18.0-348.7.1.el8_5.x86_64 root=UUID=da00319f-e023-464f-82bf-dd44807e1d2d ro crashkernel=auto rhgb quiet nosgx

2. ACPI 相关

2.1. GPE 引发的报错

GPE (General Purpose Events) 是 ACPI 表中没有预定义的 ACPI 事件。 ls /sys/firmware/acpi/interrupts 可以查看操作系统认到的 GPE。

但修复 GPE 需要改动内核或者更新 BIOS,这都不是普通用户可以完成的。所以,普通用户能做的只有屏蔽这个 GPE。

比如,要解决 L09 这个报错,其含义是水平触发的 (L),在 09 寄存器上的 GPE:

root@r220:~# journalctl | grep _L09
Sep 20 20:08:55 r220 kernel: ACPI BIOS Error (bug): Could not resolve symbol [\_GPE._L09.D1F0], AE_NOT_FOUND (20221020/psargs-330)
Sep 20 20:08:55 r220 kernel: No Local Variables are initialized for Method [_L09]
Sep 20 20:08:55 r220 kernel: No Arguments are initialized for method [_L09]
Sep 20 20:08:55 r220 kernel: ACPI Error: Aborting method \_GPE._L09 due to previous error (AE_NOT_FOUND) (20221020/psparse-529)
Sep 20 20:08:55 r220 kernel: ACPI Error: AE_NOT_FOUND, while evaluating GPE method [_L09] (20221020/evgpe-511)

确认操作系统认到了这个 09 寄存器上的 GPE 事件:

# ls -alh /sys/firmware/acpi/interrupts
...
-rw-r--r-- 1 root root 4.0K Sep 24 10:28 gpe09
...

在内核的启动参数中屏蔽这个 GPE 事件:

acpi_mask_gpe=0x09

3. TCP 拥塞控制算法 BBR

linux kernel 4.9 版本加入了 BBR 算法,可以直接通过参数开启:

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

确认当前是否启用:

$ sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic bbr
$ lsmod | grep bbr
tcp_bbr                20480  1

4. 禁用 Predictable Network Interface Names

原先,Linux 在驱动检测到网卡之后,将检测到的网卡按顺序命名为 eth0, eth1... 。但由于驱动的加载顺序无法预测,所以当系统中存在多块网卡时,物理网卡很可能在下次系统启动时被分配一个与之前不同的名称。

为了让网卡的名称变得可以被预测,就引入了 Predictable Network Interface Names 这个功能。它自 systemd v197 被引入,可以根据网卡在硬件总线上的位置来给网卡分配一个固定的名称,比如 eno1, ens192, enp2s0f1 这样的名称。

但是,有些设备上,网卡在设备总线上的位置比 PCIe 插槽的位置更靠后。这就导致,如果用户为 PCIe 插槽添加了一个设备,那么下次系统启动之后,网卡的名称会变得和之前不同。因为在设备总线上,网卡之前多出了一个 PCIe 设备,即,网卡设备的排位向后移动了一位。

这种现象并不少见,搜索引擎上可以找到很多案例。用户为设备添加了一块 PCIe 插槽的 NVMe 硬盘,然后启动系统,接着发现 Linux 内核报告找不到对应名字的网卡,用户用 ip address 一查,发现网卡名称变了。

针对这一种情况,Debian 官方给出了一种 使用 systemd.link 根据网卡 mac 地址为网卡命名 的方法。

但如果用户可以接受原先的,按照网卡被检测到的顺序命名的方法的话,最简单的思路是,直接在内核的启动参数中加入 net.ifnames=0 biosdevname=0 来禁用 Predictable Network Interface Names:

# /etc/default/grub
GRUB_CMDLINE_LINUX="... net.ifnames=0 biosdevname=0"


Last Update: 2023-10-09 Mon 19:57

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: lsz.sino@outlook.com

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议