静默启动

来自 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 内核参数禁用延迟接管。