我的电脑运行的是 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.conf
update-initramfs -u
keyboard-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