在我的 CentOS 系统上,Ctrl+Alt+F1
显示名为 的 X Windows 会话:0
,但在其他系统上Ctrl+Alt+F7
可能会执行相同的操作。是什么决定了 Fn 键如何映射到 X 会话和 TTY?
答案1
键盘映射和应用程序本身
从您引用的问答中应该清楚地看出,实际键和弦的识别取决于编程到键盘映射中的内容。此外,还有两个不同的涉及的键盘映射,事实证明有两个不同的和弦组。
- X11 服务器有自己的键盘映射,可以转换来自键盘设备的输入事件。这会将⎈ Control+ ⎇ Alt+形式的和弦转换为更改活动内核虚拟终端的请求(由 X11 服务器发出)。Fn
- 内核的内置终端仿真器有自己的键盘映射,可以转换来自键盘设备的输入事件。这会将⎇ Alt+形式的和弦转换为更改活动内核虚拟终端的请求。请注意,此映射不需要,尽管 和弦通常映射到相同的动作。Fn⎈ Control⎈ Control
至少在许多Linux操作系统上,后者的键盘映射是通过配置机制从前者派生的,并且系统管理员仅在单个位置配置一个映射。但有两张真实的地图。
哪个生效取决于哪个内核虚拟终端处于活动状态。这是因为 X11 服务器使用一种协议,通过该协议它可以有效地“拥有”一个内核虚拟终端。
- 当切换到该终端时,X11 服务器将 KVT 子系统切换到内核自己的内置终端仿真器与键盘输入设备完全断开连接的模式,或者将虚拟终端切换到原始键码模式,以便内核构建- 在终端模拟器中不执行映射,
- 当该终端被切换离开时,X11 服务器将撤消此操作。
这样X11服务器就可以与内核内置的终端仿真器共享各种I/O设备。 (如果它使用的 I/O 设备根本没有附加内核的内置终端仿真器,则不需要此共享协议。)当它负责 I/O 设备时,它的键盘映射适用;当内核的内置终端仿真器负责时,将应用其键盘映射。
这让我们了解 X11 服务器如何决定它首先“拥有”哪个内核虚拟终端,因为这个决定取决于它。有以下三种方法:
- 它分配第一个可用的内核虚拟终端。在此模式下,用于切换到 X11 会话的⎇ Alt+键盘和弦在运行时可能会有所不同,具体取决于系统启动的其他内容以及服务启动的顺序。
Fn
- 如果在(例如)内核虚拟终端 1 到 4 上有固定的 TUI 登录服务(正在运行
getty
或类似),则 X11 服务器会发现 KVT 编号 5 作为下一个可用的虚拟终端,因此⎇ Alt+F5是键盘和弦。 - 如果(比如说)系统正在按需启动 TUI 登录服务(当用户切换到 KVT 时)并且尚未启动任何服务,则 X11 服务器会发现 KVT 编号 1 作为下一个可用的虚拟终端,并且⎇ Alt+F1因此是键盘和弦。
- 如果在(例如)内核虚拟终端 1 到 4 上有固定的 TUI 登录服务(正在运行
- 它分配在命令行上被告知的(表面上保留给它的)内核虚拟终端。服务器程序的命令行参数之一是要使用的内核虚拟终端的编号。因此,如果(比如说)在这里给出参数
vt7
,那么⎇ Alt+F7就是键盘和弦。 - 它使用当前的内核虚拟终端。这是针对登录到 KVT 上的 TUI 登录会话,然后从该登录会话启动 X11 服务器的情况(现在更不寻常)的情况。
几十年前,一般惯例是将 X11 服务器分配给 KVT 编号 7。但此后,这种情况在多个操作系统上发生了变化。这甚至不是原来的至少在 Linux 操作系统领域是通用的惯例。 (当然,多内核虚拟终端的想法早于 Linux,并且实际的 Unices 还有其他约定。)
它在十多年前在 Fedora 系列操作系统上发生了变化,因为人们希望系统从操作系统引导的早期一直显示启动屏幕,直到 X11 服务器准备接管,没有屏幕清除+重绘或者在 X11 服务器在另一个 KVT 上启动并强制切换到它之前(正如它所做的那样),由于内核的内置终端仿真器在 KVT 号 1 上启动而导致闪烁进入和退出另一个显示模式。所做的更改只是为了不在 KVT 编号 1 上启动内核的内置终端模拟器,它已被启动屏幕禁用,并且使那X11 服务器随后使用的 KVT,实现了从初始屏幕到 GUI 登录屏幕的无缝过渡。
(人们错误地将这一变化归因于 systemd。事实上,它比 systemd 早了很多年,并且发生在 Fedora 使用 upstart 的时期。事实上,考虑到人们的错误归因,有点讽刺的是,几年后 systemd 首次推出时systemd 的人不知道这个变化,也没有让 systemd 复制 upstart 所做的事情,导致 TUI 登录会话和 X11 服务器之间的 KVT 1 号冲突。)
因此,您会发现,在某些操作系统上,X11 服务器使用 KVT 编号 7,而在其他操作系统上,它使用 KVT 编号 1。
在其他系统上,例如 Debian 9,分配 KVT 编号 1 的东西现在是一个不同的图形子系统,而不是 X11 服务器,用于主 GUI 登录界面;并且有一个辅助 X11 服务器,已分配其他KVT,用于每个 GUI 登录会话。 ( ⎈ Control+) ⎇ Alt+F1切换到主 GUI 登录界面,( ⎈ Control+) ⎇ Alt+F2切换到(第一个这样的,如果有的话)GUI 登录会话。
进一步阅读
- https://unix.stackexchange.com/a/479720/5132
- https://unix.stackexchange.com/a/178807/5132
- https://unix.stackexchange.com/a/333922/5132
- https://unix.stackexchange.com/a/194218/5132
- 马修·加勒特 (2008-10-29)。Rawhide/F10 中 tty1 上的 X。 Fedora 开发人员的邮件列表。
- 马修·米勒 (2008-10-30)。突发新闻:老派与 X 无关。 Fedora 开发人员的邮件列表。
- 布鲁诺·沃尔夫 3 (2008-10-03)。vt1未正确启动。红帽错误#465547。
- 亚当·威廉姆森 (2010-07-30)。使用 systemd 启动后,X.org 的 CPU 使用率达到 100%。红帽错误#619889。
答案2
没有什么可以决定“Fn 键如何映射到 X 会话和 TTY”
Ctrl+Alt+F1 始终映射到控制台终端 1 (tty1)
Ctrl+Alt+F2 始终映射到控制台终端 2 (tty2)
等等。
现在是什么改变了它运行在那些控制台上。这很大程度上取决于操作系统、配置以及启动方式。
例如,在 CentOS6 上,该/etc/init/start-ttys.conf
文件具有:
env ACTIVE_CONSOLES=/dev/tty[1-6]
env X_TTY=/dev/tty1
task
script
. /etc/sysconfig/init
for tty in $(echo $ACTIVE_CONSOLES) ; do
[ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
initctl start tty TTY=$tty
done
end script
所以这意味着,如果您处于“运行级别 5”,那么它假定 tty1 上有一个 X 服务器(Ctrl+Alt+F1),并且它将在 tty 的 2->6 上启动一个文本控制台。但在任何其他运行级别,它将在所有 6 个 tty 上启动文本控制台。
因此,在同一个系统上,X 服务器可能会出现在不同的终端上;如果机器以运行级别 5 启动,那么它将在 tty1 上(Ctrl+Alt+F1),但如果它以运行级别 3 启动并且用户键入,startx
那么它将在 tty7 上(Ctrl+Alt+F7)。
这意味着它取决于操作系统的配置方式、您所处的运行级别以及 X 服务器的启动方式。