静默启动 - 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 引导来直接引导到内核中，从而利用延迟接管（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` 内核参数禁用延迟接管。

分类：​

- 启动过程

隐藏分类：​

- 有蓝链却未移除内部链接助手模板的页面

静默启动
添加话题