内核参数
有三种方法可以将选项传递给内核,从而控制其行为
- 构建内核时——在内核的
config文件中。参见 Kernel#Compilation 了解详情。 - 启动内核时——使用命令行参数(通常通过引导加载程序,或者也在统一内核镜像中)。
- 在运行时——通过
/proc/sys/(参见 sysctl) 和/sys/中的文件。
/etc/modprobe.d/ 中的 .conf 文件设置。参见 Kernel module#Using modprobe.d。在这三种方法中,可配置的选项在可用性、名称和指定方法上有所不同。本页仅解释第二种方法(内核命令行参数),并展示 Arch Linux 中最常用的内核参数列表。
大多数参数都与子系统相关联,并且仅在内核配置了这些内置子系统时才起作用。它们还取决于与其关联的硬件是否存在。
内核命令行参数的格式可以是 parameter,或 parameter=value,或 module.parameter=value。
- 您可以通过运行
cat /proc/cmdline来检查系统启动时使用的参数,并查看是否包含您的更改。 - 所有内核参数都区分大小写。
引导加载程序配置
内核参数可以临时设置,方法是在引导加载程序启动选择菜单中编辑启动项;也可以永久设置,方法是修改引导加载程序配置文件。
以下示例将 quiet 和 splash 参数添加到 GRUB、GRUB Legacy、LILO、Limine、rEFInd、Syslinux 和 systemd-boot 引导加载程序。
GRUB
- 当菜单出现时,按
e键,并在linux行中添加参数
linux /boot/vmlinuz-linux root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
- 按
Ctrl+x使用这些参数启动。
- 要使更改在重启后永久生效,您可以手动编辑 /boot/grub/grub.cfg,使用与上面完全相同的行,或者如果使用 grub-mkconfig
- 编辑
/etc/default/grub,并在GRUB_CMDLINE_LINUX_DEFAULT行的引号之间追加您的内核选项
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
- 然后使用以下命令自动重新生成
grub.cfg文件
# grub-mkconfig -o /boot/grub/grub.cfg
GRUB Legacy
- 当菜单出现时,按
e键,并在kernel行中添加参数
kernel /boot/vmlinuz-linux root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
- 按
b使用这些参数启动。
- 要使更改在重启后永久生效,请编辑
/boot/grub/menu.lst并将参数添加到kernel行,就像上面一样。
LILO
- 使用
append或addappend将参数添加到/etc/lilo.conf
image=/boot/vmlinuz-linux ... append="quiet splash"
Limine
- 要临时添加内核参数,请在启动项选择屏幕出现时按
e键,并修改kernel_cmdline行
kernel_cmdline: root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
- 要永久应用更改,请编辑位于
esp/limine.conf的 Limine 配置文件中的kernel_cmdline行
/+Arch Linux ... kernel_cmdline: root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
rEFInd
- 在所需的菜单项上按
Insert、F2、Tab或+键,然后在子菜单项上再次按下。在字符串末尾添加内核参数
root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw initrd=\boot\initramfs-linux.img quiet splash
- 按
Enter使用这些参数启动。
- 要使更改在重启后永久生效,请编辑
/boot/refind_linux.conf,并在所有必需行的引号之间追加参数,例如
"Boot using default options" "root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash"
- 如果您在 rEFInd 中禁用了操作系统的自动检测,而是在
esp/EFI/refind/refind.conf中定义操作系统节来加载操作系统,则可以像这样编辑它
menuentry "Arch Linux" { ... options "root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash" ... }
Syslinux
- 当菜单出现时,按
Tab键,并在字符串末尾添加参数
linux /boot/vmlinuz-linux root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw initrd=/boot/initramfs-linux.img quiet splash
- 按
Enter使用这些参数启动。
- 要使更改在重启后永久生效,请编辑
/boot/syslinux/syslinux.cfg,并将参数添加到APPEND行
APPEND root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
systemd-boot
- 当菜单出现时,按
e键,并在字符串末尾添加参数
initrd=\initramfs-linux.img root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
- 按
Enter使用这些参数启动。
- 如果您没有为菜单超时设置值,则需要在启动时按住
Space键,systemd-boot 菜单才会出现。 - 如果您无法从启动菜单编辑参数,您可能需要编辑
/boot/loader/loader.conf并添加editor 1以启用编辑。
- 要使更改在重启后永久生效,请编辑
/boot/loader/entries/arch.conf(假设您设置了您的 EFI 系统分区),并将参数添加到options行
options root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
dracut
dracut 能够将内核参数嵌入到 initramfs 中,从而允许从引导加载程序配置中省略它们。参见 dracut#Kernel command line options。
EFI 启动存根
参见 EFI boot stub#Using UEFI directly。
劫持 cmdline
即使没有访问引导加载程序的权限,也可以更改内核参数以启用调试(如果您具有 root 权限)。这可以通过覆盖存储内核参数的 /proc/cmdline 来实现。但是,即使以 root 身份,/proc/cmdline 也是不可写的,因此此技巧是通过使用绑定挂载来屏蔽路径来完成的。
首先创建一个包含所需内核参数的文件
/root/cmdline
root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 ro console=tty1 logo.nologo debug
然后使用绑定挂载来覆盖参数
# mount -n --bind -o ro /root/cmdline /proc/cmdline
-n 选项跳过将挂载添加到 /etc/mtab,因此即使 root 以只读方式挂载也可以工作。您可以 cat /proc/cmdline 来确认您的更改是否成功。
参数列表
此列表并非详尽无遗。有关所有选项的完整列表,请参阅 内核的命令行参数。
| 参数 | 描述 |
|---|---|
| init | 运行指定的二进制文件而不是 /sbin/init 作为 init 进程。systemd-sysvcompat 软件包将 /sbin/init 符号链接到 /usr/lib/systemd/systemd 以使用 systemd。将其设置为 /bin/sh 以启动到 shell。 |
| initrd | 指定初始 ramdisk 的位置。对于 UEFI 启动管理器和 EFI 启动存根,路径必须使用反斜杠 (\) 作为路径分隔符指定。 |
| cryptdevice | 指定 dm-crypt 加密分区的位置以及 device mapper 名称。 |
| debug | 启用内核调试(事件日志级别)。 |
| lsm | 设置 Linux 安全模块的初始化顺序,用于启用 AppArmor、SELinux 或 TOMOYO。 |
| maxcpus | SMP 内核在启动期间将启动的最大处理器数。 |
| mem | 强制使用特定数量的内存。 |
| netdev | 网络设备参数。 |
| nomodeset | 禁用 内核模式设置。 |
| panic | 内核 panic 时自动重启前的时间。 |
| resume | 指定从休眠唤醒时要使用的交换设备。 |
| ro | 在启动时以只读方式挂载根设备。这是 mkinitcpio 的默认设置1。 |
| root | 根文件系统。有关内核支持的设备名称格式,请参见 init/do_mounts.c。请注意,带有 udev 的 initramfs 支持更多名称格式。与 systemd#GPT 分区自动挂载 兼容的设置允许完全省略此参数,或者选择使用 root=gpt-auto。 |
| rootflags | 根文件系统挂载选项。对于设置无法通过重新挂载应用(即通过 systemd-remount-fs.service(8))的选项很有用。例如,XFS 根卷的 discard 选项或 当使用子卷作为根目录时 Btrfs 的 subvol= 选项。 |
| rw | 在启动时以读写方式挂载根设备。这是内核的默认设置1。 |
| systemd.unit | 启动到指定目标。 |
| video | 覆盖帧缓冲视频默认值。 |
- 1 如果内核命令行上未显式设置
ro或rw,则内核使用rw(参见 bootparam(7) § General non-device-specific boot arguments)。但是,mkinitcpio 使用ro作为默认值,覆盖了内核的默认值(参见 mkinitcpio(8) § EARLY INIT ENVIRONMENT)。引导加载程序也可能具有其自身配置的默认值,例如,grub-mkconfig 使用rw(参见 FS#36275 作为参考)。