简洁版本
当 LUKS 提示我输入密码时,我如何知道使用的是哪个键盘映射?
长版
我使用三个键盘及其映射(US-Qwerty、FR-Azerty 和 FR-Bepo),并且经常在它们之间交替使用。我用了这个解决方法能够输入相同的密码(我添加的遵循这些建议)无论哪个映射当前处于活动状态以及我正在使用哪个键盘,但都觉得它不是很干净。
各种解决方案(示例1,示例2)建议编辑/etc/vconsole.conf
,但我的安装中不存在此文件,如果可能的话我宁愿不这样做。似乎有办法通过编辑 initramfs.conf但我不确定我是否理解正确,我更愿意首先了解哪个键映射现在处于活动状态。
信息
uname -a
Linux XXX 6.1.0-12-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.52-1 (2023-09-07) x86_64 GNU/Linux
答案1
LUKS 没有键盘映射。它本身并不读取键盘输入——它只是一个通用的控制台程序,可以读取安慰文本输入,将其留给控制台来映射按键。
各种解决方案(示例 1、示例 2)建议编辑 /etc/vconsole.conf,但我的安装中不存在该文件
这通常是正常的。并非所有配置文件都存在于每次安装中。事实上,systemd 整体设计的一个重要部分是不“默认”或“模板”配置应存在于 /etc 中,而所有静态配置都应位于 /usr/lib 中。 (此后许多其他项目都遵循了该约定。)因此,缺少配置文件并不表示系统不会使用该文件,并且如果您知道系统做用它。
(另一方面,正如许多 systemd 一样,它做有一个替代方案:vconsole.keymap=
vconsole.conf 手册页中提到的内核命令行选项(如果您的系统为此使用 systemd-vconsole),您可以将其添加到 GRUB 配置中。)
话虽这么说,我认为 Debian 实际上根本没有使用 systemd-vconsole;甚至对于主(rootfs)启动也不行。 (并且 initramfs 是一个完全独立的世界,拥有自己的配置文件和所有内容。正如评论中提到的,initramfs 构建在发行版之间差异很大 - Debian 使用自己的“initramfs-tools”来执行此操作,而其他发行版可能会使用 Dracut、mkinitcpio、Booster、genkernel 等。)
因此,就您的情况而言,Ubuntu 说明/etc/initramfs-tools/initramfs.conf
也最适合 Debian 的 initramfs。
我想首先了解哪个键盘映射现在处于活动状态。
lsinitramfs
使用或cpio
或解压 initramfs(它是 cpio 存档中的迷你 rootfs)bsdtar
可能会显示其中嵌入了哪些键盘映射文件(如果有)。在构建 initramfs 时启用详细模式,使用update-initramfs -u -v
, 也可能会显示它。
但在 Debian 的情况下,不幸的是,似乎使用了通用文件名 - 它只采用构建 initramfs 时主系统中存在的任何“缓存”键盘映射。它所揭示的只是是否存在是initramfs 中是否存在键盘映射。
因此,如果您刚刚构建了一个新的 initramfs,则可以安全地假设它将使用通过配置的任何控制台键盘映射/etc/default/keyboard
(如果KEYMAP=y
已在 initramfs.conf 中启用该选项),或者通用内置“us”键盘映射(如果尚未启用)。例如,这表明系统键盘映射已被复制到 initramfs 中:
# 更新 initramfs -u -v 调用挂钩键映射 添加二进制 /usr/bin/kbd_mode 添加二进制 /usr/bin/loadkeys # lsinitramfs /boot/initrd.img-6.1.0-12-amd64 | grep kmap 等/控制台设置/cached_UTF-8_del.kmap # bsdtar -tf /boot/initrd.img-6.1.0-12-amd64 | grep kmap 等/控制台设置/cached_UTF-8_del.kmap
最后,使用内核选项中断 initramfs,例如break=premount
应该会在正确的时间点(加载键盘映射之后但在 LUKS 提示之前)为您提供一个 shell,您可以在其中按键并查看键入的内容。