Keyboard-setup.service 启动速度很慢。我需要它吗?

Keyboard-setup.service 启动速度很慢。我需要它吗?

我的电脑运行的是 Debian Buster,它的启动时间似乎减慢了keyboard-setup.service.据我所知,这涉及设置在控制台上使用的键盘。的输出systemd-analyze blame如下。我已经检查过很多次了,而且总是相似的。

 5.549s keyboard-setup.service
 5.063s dev-sda2.device
 4.140s udisks2.service
 3.565s accounts-daemon.service
 3.487s console-kit-log-system-start.service

这让我想知道为什么我每次启动时都需要花 5.5 秒设置键盘。键盘设置应该这么慢吗?

如果是,那为什么?它在做什么?禁用它是否安全?

如果不是,那么出了什么问题,我应该如何修复它?

编辑:systemd-analyse critical-chain

graphical.target @17.385s
└─gdm.service @15.588s +1.797s
  └─rc-local.service @15.476s +110ms
    └─network.target @15.475s
      └─networking.service @14.971s +502ms
        └─apparmor.service @8.262s +3.147s
          └─local-fs.target @8.256s
            └─boot-efi.mount @8.000s +255ms
              └─local-fs-pre.target @7.971s
                └─keyboard-setup.service @2.421s +5.549s
                  └─systemd-journald.socket @2.420s
                    └─system.slice @2.417s
                      └─-.slice @2.186s

答案1

通过运行systemctl cat keyboard-setup.service可以看到它的定义:

# /lib/systemd/system/keyboard-setup.service
[Unit]
Description=Set the console keyboard layout
DefaultDependencies=no
Before=local-fs-pre.target
Wants=local-fs-pre.target
ConditionPathExists=/bin/setupcon

[Service]
Type=oneshot
ExecStart=/lib/console-setup/keyboard-setup.sh
RemainAfterExit=yes

[Install]
WantedBy=sysinit.target

所以它会运行/lib/console-setup/keyboard-setup.sh,但前提是/bin/setupcon存在。

/lib/console-setup/keyboard-setup.sh也很简单:

#!/bin/sh

if \
    [ -x /etc/console-setup/cached_setup_keyboard.sh ] \
        && /etc/console-setup/cached_setup_keyboard.sh
then
    :
else
    if [ -f /etc/default/locale ]; then
        # In order to permit auto-detection of the charmap when
        # console-setup-mini operates without configuration file.
        . /etc/default/locale
        export LANG
    fi
    setupcon -k
fi

意义:

  • 如果/etc/console-setup/cached_setup_keyboard.sh存在并且运行没有错误,则该脚本除了运行该脚本之外不执行任何操作。
  • 否则,setupcon -k执行,但如果/etc/default/locale存在,则读取它并首先导出 LANG 变量。

至少在我的系统上,/etc/console-setup/cached_setup_keyboard.sh确实存在并且看起来像这样:

#!/bin/sh

if [ -f /run/console-setup/keymap_loaded ]; then
    rm /run/console-setup/keymap_loaded
    exit 0
fi
kbd_mode '-u' < '/dev/tty1' 
kbd_mode '-u' < '/dev/tty2' 
kbd_mode '-u' < '/dev/tty3' 
kbd_mode '-u' < '/dev/tty4' 
kbd_mode '-u' < '/dev/tty5' 
kbd_mode '-u' < '/dev/tty6' 
loadkeys '/etc/console-setup/cached_UTF-8_del.kmap.gz' > '/dev/null' 

意义:

  • 如果标记文件/run/console-setup/keymap_loaded存在(表明控制台键盘映射已加载到早期启动 initramfs 中),则该文件将被清理,并且脚本不会执行任何其他操作,退出时不会出现错误。
  • 否则,前 6 个虚拟控制台将以 UTF-8 Unicode 模式初始化,并加载键盘映射文件。

基于此,您可以尝试:

  • 检查您的/etc/console-setup/cached_setup_keyboard.sh文件,/etc/default/locale看看它们是否已损坏或包含比平常更耗时的内容
  • 如果/etc/console-setup/cached_setup_keyboard.sh不存在,您可以尝试创建一个类似于我上面的示例的(它可能是由某些 GUI 键盘设置工具创建的,并且使用的命令可能比 更快setupcon -k
  • 如果/etc/console-setup/cached_setup_keyboard.sh存在,您可以尝试暂时使其不可执行,启动系统并测试键盘以查看布局是否可用以及执行路径是否setupcon -k比当前路径快
  • 设置并运行KEYMAP=y,看看通过在 initramfs 中加载键盘映射并导致基本上被绕过,是否可以使事情变得更快/etc/initramfs-tools/initramfs.confupdate-initramfs -ukeyboard-setup.service

答案2

最好的建议是为服务设置超时限制,以控制其启动时消耗的时间。您可以通过两种方法来做到这一点:

SERVICETOFIX="keyboard-setup.service"
sudo mkdir -p "/etc/systemd/system/$SERVICETOFIX.d"
sudo echo -e "[Service]\nTimeoutStartSec=10" | tee "/etc/systemd/system/$SERVICETOFIX.d/reduce-timeout.conf"

方法2:我个人更喜欢这种方法:先运行sudo systemctl edit keyboard-setup.service,然后在编辑器中添加以下内容,然后保存并退出编辑器。

[Service]
TimeoutStartSec=10

相关内容