关闭Arch Linux时,消息显示不稳定

关闭Arch Linux时,消息显示不稳定

我在 Arch Linux 上安装了 KDE Plasma 和 LightDM。然后,当关闭时,消息显示被中断。显然,这种情况发生在使用 Systemd 的 Linux 发行版中。

我该如何解决这个现象?

关机时的图像

答案1

当 systemd 打印其输出时,它会根据当前屏幕分辨率调整行。

当 lightdm 关闭时,屏幕分辨率将恢复为默认值。 systemd 已经打印了前面的行,因此它不会向后并尝试清除屏幕,然后在每次分辨率更改时以新分辨率重新打印内容,这是有道理的。

为了解决这个问题,你可以弄清楚,你需要设置默认 TTY 分辨率以匹配您的 X(或 wayland)服务器的分辨率。

我还要指出,花精力改善关闭文本的外观是相当迂腐的。这些消息不会在屏幕上显示太长时间,如果服务关闭挂起,它将以您当前的分辨率打印,这意味着任何重要的内容都应该可读。如果您的日志是持久的(存储在启动之间/var/并且在启动之间不会被删除),那么您会放心地知道日志的存储方式与显示时的方式不同。如果您已将日志配置为持久性,则可以journalctl -b 1查看上次启动时正确对齐的消息。如果您认为有必要阅读这些消息并认为它们不可读,那么这对您可能很重要。

答案2

免责声明:该解决方案适用于运行 systemd 和 LightDM 的用户。如果您的设置不同,您可能需要修改以下说明以适合您的系统。如果您不想阅读有关未对齐的关闭消息的所有背景信息,请跳至解决方案部分。


概述:我花了很长时间试图解决这个问题,直到几天前才解决。它很可能与您的屏幕分辨率无关,而是由您的应用程序之一(可能是 LightDM)错误地格式化您的终端/tty 引起的。在启动/关闭期间的某个时刻,某些内容会更改您的 tty,以便新行 (NL) 不会像通常那样收到自动回车符 (CR)。在英语中,这意味着如果您按下Enter键盘,文本光标将向下移动一行,但不会将其自身重新对齐到终端窗口的左侧(您可以在您提供的图片中看到这一点,https://i.stack.imgur.com/oARSo.jpg)。这被称为“阶梯效应”,据我所知,这是 Linux 上相当常见的问题。解决上述问题的核心代码是stty opost onlcr,但如果您不知道到底将其放在 systemd 中的何处,那么使用它可能会很痛苦。如果太早或太晚应用该命令,您将只是格式化已经正确显示的文本。一种解决方案是创建一个自定义系统服务来正确调整 tty 输出。您可以偶尔让服务自行重新启动,这样您就不必确定stty opost onlcr应该去的确切位置。


解决方案:

#找出您的桌面环境(例如 Gnome、KDE ​​Plasma 等)正在运行的 tty 实例。通常它是 tty1,但由于您使用的是 LightDM,所以它实际上应该是 tty7。在步骤 2 中创建 systemd 服务时,您需要此信息。

  1. 在您的终端中运行who。它应该产生如下输出:

用户名 tty7 2021-02-08 12:11 (:0)


#以 root 身份在/etc/systemd/system/.在该ExecStart=部分下,包含您在步骤 1 中找到的 tty 信息。将服务命名为您想要的任何名称,例如staircase-effect.service

  1. 在您的终端中运行sudo nano /etc/systemd/system/staircase-effect.service。这是一个可以尝试的示例单元,后面会解释重要的选项。

[Unit]
Description=修复 tty 楼梯效果
DefaultDependencies=no
Before=halt.target shutdown.target restart.target
[电子邮件受保护]
StartLimitBurst=5
StartLimitIntervalSec=0

[服务]
Type=simple
ExecStart=/bin/stty -F /dev/tty7 opost onlcr
Restart=always
RestartSec=30

[安装]
WantedBy=多用户.target

StartLimitIntervalSec=0- 将此选项设置为“0”可以让 systemd 无限次重新启动您的服务而不返回任何错误。

Type=simple- 对于此服务,最好使用“简单”而不是“一次性”,因为它在永无休止的循环中运行。 AFAIK,“oneshot”会阻止其他服务同时运行,在这种情况下这是不希望的。

ExecStart=/bin/stty -F /dev/tty7 opost onlcr- 这条线实际上解决了楼梯消息。确保输入从who步骤 1 中的命令获得的正确 tty 号码。

Restart=always- 您希望此服务重复出现,除非您确切知道将其放置在启动/关闭过程中的位置。stty如果在文本已正确显示的情况下运行该命令,则该命令是无效的。

RestartSec=30- 从技术上讲,此选项取决于个人喜好。您将希望您的服务足够频繁地自行重新启动以解决问题,但又不能太频繁,以免问题本身变得麻烦。


#以 root 身份启用您的新服务systemctl

  1. 在您的终端中运行sudo systemctl enable staircase-effect.service。然后reboot看看修复是否有效。

可选的 LIGHTDM 调整:

#默认的LightDM服务/usr/lib/systemd/system/lightdm.service[email protected]不必要的冲突(https://bugs.archlinux.org/task/49527?opened=22169&status%5B0%5D=)。我不确定这是否与楼梯消息有关,但从[email protected]单元文件中删除该行可能不会有什么坏处。

  1. 在您的终端中运行sudo systemctl edit --full lightdm.service。然后删除或注释掉该[email protected]行以阻止 LightDM 干扰您的标准 getty 服务。reboot看看变化。

替代解决方案:

https://www.reddit.com/r/linux/comments/iwnm9w/shutdown_staircase_output_fix/
替代解决方案 1(这是我获得主stty命令的地方)

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=617249
替代解决方案 2(适用于运行 System V 和 Debian 的用户)

相关内容