靜默啟動 - Arch Linux 中文维基

跳至內容

# 靜默啟動

出自 Arch Linux 中文维基

相關文章

- Plymouth

翻譯狀態：

- 本文（或部分內容）譯自 Silent boot，最近一次同步於 2023-7-2，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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

## 內核參數

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

    quiet

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

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

    quiet loglevel=3

請注意，只有同時使用 `quiet` 和 `loglevel=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.service` 和 `systemd-fsck@.service` 並配置 `StandardOutput` 和 `StandardError` 類似於這樣：

    [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=0` 和 `GRUB_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=3` 或 `rd.udev.log_level=3`。請注意，如果您經常在內核日誌中收到 `Core temperature above threshold, cpu clock throttled` 消息，則需要使用日誌級別2在啟動時使這些消息靜音。或者，如果您編譯自己的內核，請調整 `arch/x86/kernel/cpu/mcheck/therm_throt.c` 中消息的日誌級別。

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

延伸閱讀：

- Phoronix: Linux 4.19 Adds Deferred Console Takeover Support For FBDEV - Cleaner Boot Process
- Hans de Goede: Adding deferred fbcon console takeover to the Fedora kernels

### 禁用延遲接管（deferred takeover）

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

分類：​

- 啟動過程

靜默啟動
新增話題