靜默啟動

出自 Arch Linux 中文维基

本頁適用於那些出於美觀或其他原因而傾向於將其系統啟動的記錄嚴格限制在最低限度的人。遵循本指南將刪除啟動過程中的所有文本。演示視頻

內核參數[編輯 | 編輯原始碼]

在你的引導加載程序配置選項中更改內核參數,以包括以下參數:

quiet
注意:vga=current 添加到內核參數可以避免類似 FS#32309 的奇怪行為。請記住,這與KMS相衝突,因此只有當您受到上述錯誤的影響時才應使用此參數。

如果您仍發現消息被打印到控制台,則可能是dmesg向您發送了它認為重要的消息。您可以使用 quiet loglevel=level 來更改打印這些消息的級別,其中 level 是0到7之間的任意數字,其中0代表只有最關鍵的,7代表打印的調試級別(debug levels)。

quiet loglevel=3

請注意,只有同時使用 quietloglevel=level 且 quiet 在前才應當有效。loglevel 參數只會更改打印到控制台的內容,dmesg 本身的級別不會受到影響,並且仍然可以通過日誌(journal)和 dmesg 使用。有關詳細信息,請見內核參數

如果您還想在引導時阻止 systemd 打印其版本號,您還應該將 udev.log_level=3 附加到內核參數中。如果在 initramfs 中使用 systemd,請改為附加 rd.udev.log_level=3 。見 systemd-udevd.service(8) § KERNEL COMMAND LINE 獲取詳細信息。

如果您在 initramfs 中使用 systemd 鈎子,則可能會在 initramfs 初始化期間獲得 systemd 消息。您可以傳遞 systemd.show_status=false 來禁用它們,或者傳遞 systemd.show_status=auto 只阻止成功的消息(因此在出現錯誤時,您仍然可以看到它們)。事實上,當使用 quiet 時,auto 已經被傳遞給了 systemd.show_status=auto,但是出於某些原因,有時 initramfs 中的 systemd 無法獲得它。以下是您需要傳遞給內核的參數,以便在 initramfs 中使用 systemd 進行完全乾淨的啟動:

quiet loglevel=3 systemd.show_status=auto rd.udev.log_level=3

還可以用 touch ~/.hushlogin 刪除最後登錄消息。

移除控制台光標閃爍[編輯 | 編輯原始碼]

如果按照以下説明,啟動時的控制台光標會一直閃爍。這可以通過向內核傳遞 vt.global_cursor_default=0 來解決 [1]

要恢復 TTY 中的光標,請運行:

# setterm -cursor on >> /etc/issue

sysctl[編輯 | 編輯原始碼]

要從控制台隱藏任何內核消息,請根據 [2] 添加或修改 kernel.printk 行:

/etc/sysctl.d/20-quiet-printk.conf
kernel.printk = 3 3 3 3

agetty[編輯 | 編輯原始碼]

要從控制台隱藏 agetty 打印的問題(issue)和「login:」提示行 [3],創建 getty@tty1.service附加片段

/etc/systemd/system/getty@tty1.service.d/skip-prompt.conf
[Service]
ExecStart=
ExecStart=-/usr/bin/agetty --skip-login --nonewline --noissue --autologin username --noclear %I $TERM

startx[編輯 | 編輯原始碼]

要隱藏 startx 消息,您可以在你的 .bash_profile 中重定向它的輸出到 /dev/null,類似於這樣:

注意: 無根(rootless)登錄導致重定向中斷。見 Xorg#重定向Xorg會話日誌
$ [[ $(fgconsole 2>/dev/null) == 1 ]] && exec startx -- vt1 &> /dev/null

fsck[編輯 | 編輯原始碼]

要在引導期間隱藏 fsck 消息,請讓 systemd 檢查根文件系統。為此,請將 udev 鈎子替換為 systemd

HOOKS=( base systemd fsck ) 

/etc/mkinitcpio.conf 中並重新生成 initramfs

現在編輯 systemd-fsck-root.servicesystemd-fsck@.service 並配置 StandardOutputStandardError 類似於這樣:

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/systemd/systemd-fsck
StandardOutput=null
StandardError=journal+console
TimeoutSec=0

systemd-fsck@.service(8) 獲得可以傳遞給 systemd-fsck 的選項的更多信息,您可以更改服務檢查(或不檢查)文件系統的頻率。

使 GRUB 靜默[編輯 | 編輯原始碼]

要隱藏 GRUB 歡迎和引導消息,您可以安裝非官方的 grub-silentAUR 包。

安裝完成後,需要先將 GRUB 重新安裝到必要的分區中。

然後,以 /etc/default/grub.silent 為例,對 /etc/default/grub 進行必要的更改。

以下三行是必要的:

GRUB_DEFAULT=0
GRUB_TIMEOUT=0
GRUB_RECORDFAIL_TIMEOUT=$GRUB_TIMEOUT
注意: 如果設置了 GRUB_TIMEOUT=0GRUB_HIDDEN_TIMEOUT=1(或任何正值),請設置 GRUB_RECORDFAIL_TIMEOUT=$GRUB_HIDDEN_TIMEOUT,而不是 GRUB_RECORDFAIL_TIMEOUT=$GRUB_TIMEOUT。否則,在啟動時按 Esc 以顯示 GRUB 菜單將無法工作。

最後,重新構建 grub.cfg 文件。

保留或禁用 BIOS 中的供應商徽標[編輯 | 編輯原始碼]

現代 UEFI 系統在啟動時顯示供應商標誌,直到將控制權移交給引導加載程序;例如,聯想筆記本電腦上顯示一個鮮紅色的聯想標誌。這個供應商標誌通常被引導加載程序(如果使用標準 GRUB)或內核覆蓋。

為了避免內核覆蓋供應商徽標,Linux 4.19 引入了一個新的配置選項 FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER,該選項將保留幀緩衝區的內容,直到需要在幀緩衝區控制台上打印文本為止。截至2018年11月(Linux 4.19.1),官方的 Arch Linux 內核使用 CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y 編譯。

當與低日誌級別相結合(以防止打印文本)時,可以在系統初始化時保留供應商徽標。請注意,標準配置中的 GRUB 會清空屏幕;考慮使用 EFISTUB英語EFISTUB 引導來直接引導到內核中,從而利用延遲接管(deferred takeover)。

視頻演示

內核命令行應該使用上面提到的 loglevel=3rd.udev.log_level=3。請注意,如果您經常在內核日誌中收到 Core temperature above threshold, cpu clock throttled 消息,則需要使用日誌級別2在啟動時使這些消息靜音。或者,如果您編譯自己的內核,請調整 arch/x86/kernel/cpu/mcheck/therm_throt.c 中消息的日誌級別。

如果你使用 Intel 圖形處理器,另見 Intel 圖形處理器#Fastboot

延伸閱讀:

禁用延遲接管(deferred takeover)[編輯 | 編輯原始碼]

如果新行為導致問題,可以使用 fbcon=nodefer 內核參數禁用延遲接管。