跳至內容

內核參數

出自 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。

參見