跳转到内容

内核参数

来自 Arch Linux 中文维基

共有三种办法向内核传递参数以控制其行为:

  1. 在编译内核时:在内核的 config 文件中。详见内核#编译。
  2. 在内核启动时:通过命令行参数(通常通过启动管理器设置,或在统一内核镜像中设置)。
  3. 在运行时:通过 /proc/sys/(参见 sysctl)和 /sys/ 中的文件。
提示:可加载模块的选项可通过 /etc/modprobe.d/ 中的 .conf 文件设置。参见 内核模块#使用_/etc/modprobe.d/中的文件。

不同的方式有不同的命令名称、是否可见以及设置方式。本文仅说明第二种方式(内核命令行),并记录适用 Arch linux 内核的常用参数。

大部分参数和某个子系统相关,需要在编译或加载时加入子系统,而且相关硬件需要存在。

内核命令行参数的格式为 parameter 或 parameter=value,或 module.parameter=value。

注意:
  • 通过 cat /proc/cmdline 可以查看当前使用的命令行参数,验证修改是否生效。
  • 所有内核参数均区分大小写。

启动管理器配置

注意:Arch Linux 安装镜像 在 UEFI 系统上使用 systemd-boot,在 BIOS 系统上使用 Syslinux。

内核参数可以在启动时临时修改,也可以永久性写到启动管理器的配置文件中,永远起作用。

下面示例:把参数quiet 和 splash 加到启动管理器 Clover、GRUB、GRUB Legacy、LILO、Limine、rEFInd、Syslinux 和 systemd-boot 中。

Clover

  • 将以下内容添加到 esp/EFI/CLOVER/config.plist:
<string>initrd=\initramfs-linux.img root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash</string>

GRUB

  • 在菜单出现后按 e 然后将它们添加至 linux 行:
linux /boot/vmlinuz-linux root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
按 Ctrl+x 以便用这些参数启动。
  • 要使改变在重启后仍生效,您可以手动编辑 /boot/grub/grub.cfg 中的如上内容。对于初学者,建议:
编辑 /etc/default/grub 并将您的内核选项添加至 GRUB_CMDLINE_LINUX_DEFAULT 行:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
然后重新生成 grub.cfg 文件:
# grub-mkconfig -o /boot/grub/grub.cfg

有关配置GRUB的更多信息,请参阅 GRUB 。

GRUB Legacy

  • 在菜单出现后按 e 然后将它们添加至 kernel 行:
kernel /boot/vmlinuz-linux root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
按 b 以便用这些参数启动。
  • 要使改变在重启后仍生效,编辑 /boot/grub/menu.lst 并将它们添加至 kernel 行,如上所示。

有关配置GRUB Legacy的更多信息,请参阅 GRUB Legacy 。

LILO

  • 将它们添加到 /etc/lilo.conf 中,使用 append 或 addappend:
image=/boot/vmlinuz-linux
        ...
        append="quiet splash"

有关配置LILO的更多信息,请参阅 LILO 。

Limine

  • 要临时添加内核参数,在启动条目选择屏幕出现时按 e 并修改 cmdline 行:
cmdline: root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
  • 要使更改永久生效,编辑 Limine 配置文件中的 kernel_cmdline 行:
/+Arch Linux
    ...
    kernel_cmdline: root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash

kernel_cmdline 是 cmdline 的别名

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"
    ...
}

有关配置 rEFInd 的更多信息,请参阅 rEFInd 。

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

更多详情请见Syslinux 。

systemd-boot

  • 当启动菜单出现时 按 e进入编辑界面:
initrd=\initramfs-linux.img root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash
按 Enter 即可按照输入的参数启动。
注意:
  • 如果没有设置显示启动菜单, 你需要按住Space启动电脑来进入启动菜单 。
  • 如果不能够从启动菜单上进行编辑,修改 /boot/loader/loader.conf 加入 editor 1 来开启编辑功能。
  • 如果想永久加入参数,编辑 /boot/loader/entries/arch.conf (假设你已经设置好了 EFI system partition) 的options 行:
options root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet splash

更多信息请参见 systemd-boot .

dracut

dracut 可以将内核参数嵌入 initramfs,并跳过启动加载器的配置,参考:dracut#内核命令行参数。注意这种方式只对 dracut 所能接受的参数生效,例如 root= 和 rd.*,这些参数并不会变成真正的内核参数。

EFI 启动存根

参阅 EFISTUB#直接使用 UEFI.

劫持 cmdline

即使没有访问启动加载器的权限,也可以通过更改内核参数来启用调试(如果您有 root 权限)。这可以通过覆盖存储内核参数的 /proc/cmdline 来实现。然而,/proc/cmdline 即使作为 root 也不可写,因此这个技巧通过使用绑定挂载来掩盖路径。

注意:这种技巧仅劫持读取 /proc/cmdline 的用户空间进程,无法作用于被内核读取的参数。例如,通过这种方式添加 debug 不会使内核进入调试模式。

首先创建一个包含所需内核参数的文件:

/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,因此即使根文件系统以只读方式挂载也能工作。您可以通过 cat /proc/cmdline 确认更改是否成功。

参数列表

本表并不完整。除了内核,其他程序也能从 /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 加密分区的位置以及 设备映射器 名称。
debug 启用内核调试(事件日志级别)。
lsm 设置 Linux 安全模块的初始化顺序,用于启用 AppArmor, SELinux 或 TOMOYO。
maxcpus SMP 内核在启动期间将启动的最大处理器数量。
mem 强制使用特定数量的内存。
netdev 网络设备参数。
nomodeset 禁用 Kernel mode setting。
panic 内核崩溃后自动重启的时间。
resume 指定从 休眠 唤醒时使用的交换设备。
ro 在启动时以只读方式挂载根设备。这是 mkinitcpio 的默认值1。
root 根文件系统。参见 init/do_mounts.c 了解内核支持的设备名称格式。请注意,带有 udev 的 initramfs 支持 更多名称格式。与 systemd#GPT 分区自动挂载 兼容的设置允许完全省略该参数,或者使用 root=dissect。
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 作为参考)。
    注意:当使用 mkinitcpio 的 fsck 钩子(参见 [1])或 使用 F2FS 作为根文件系统 时,需要 rw。

参见