Linux 控制台

出自 ArchWiki
(重定向自 Console fonts

根据 Wikipedia

Linux 控制台Linux 内核的内部系统控制台。Linux 控制台为内核和其他进程提供了一种向用户发送文本输出和接收用户文本输入的方式。用户通常使用计算机键盘输入文本,并在计算机显示器上读取输出文本。Linux 内核支持虚拟控制台——逻辑上独立的控制台,但它们访问相同的物理键盘和显示器。

本文介绍了 Linux 控制台的基础知识以及如何配置字体显示。/键盘配置 子页面描述了键盘配置。有关提供更多功能(完整的 Unicode 字体、现代图形适配器等)的替代控制台解决方案,请参阅 KMSCON 或类似项目。

实现

与大多数直接与用户交互的服务不同,控制台是在内核中实现的。这与终端仿真软件(如 Xterm)形成对比,后者在用户空间中作为普通应用程序实现。控制台一直是已发布的 Linux 内核的一部分,但在其历史上经历了变化,最显著的是过渡到使用 帧缓冲 和支持 Unicode

尽管控制台进行了许多改进,但其与旧硬件的完全向后兼容性意味着它与图形终端仿真器相比受到限制。Linux 控制台和图形终端仿真器的主要区别在于 Linux 控制台中的 shell 直接附加到 TTY 设备 (/dev/tty*),而图形终端仿真器中的 shell 则附加到伪 TTY (/dev/pty*)。

此外,图形终端仿真器可以比 Linux 控制台具有更多功能,包括更丰富的可用字体集、多个选项卡/窗口、拆分视图、回滚缓冲区/滑块、背景颜色/图像(可选透明度)等。Linux 控制台可以使用终端复用器(如 TmuxGNU Screen)或某些文本用户界面程序 (TUI)(通常依赖于 ncurses 等库,例如 VimnanoEmacs)来使用其中一些功能。如果需要,这些也可以在图形终端仿真器中使用。

虚拟控制台

控制台以一系列 虚拟控制台 的形式呈现给用户。这些虚拟控制台给人一种印象,即多个独立的终端正在同时运行;每个虚拟控制台都可以使用不同的用户登录,运行自己的 shell 并具有自己的字体设置。虚拟控制台各自使用设备 /dev/ttyX,您可以通过按 Alt+Fx(其中 x 等于虚拟控制台号,从 1 开始)在它们之间切换。设备 /dev/console 自动映射到活动的虚拟控制台。

另请参阅 chvt(1)openvt(1)deallocvt(1)

文本模式

由于 Linux 最初是作为 PC 硬件的内核而开始的,因此控制台是使用标准的 IBM CGA/EGA/VGA 图形开发的,所有 PC 当时都支持这些图形。图形在 VGA 文本模式下运行,该模式提供了一个简单的 80x25 字符显示,具有 16 种颜色。这种传统模式类似于专用文本终端(如 DEC VT100 系列)的功能。如果系统硬件支持,仍然可以在文本模式下启动(使用 vga=0 nomodeset),但几乎所有现代发行版(包括 Arch Linux)都使用帧缓冲控制台。

帧缓冲控制台

随着 Linux 被移植到其他非 PC 架构,需要更好的解决方案,因为其他架构不使用 VGA 兼容的图形适配器,并且可能根本不支持文本模式。帧缓冲控制台的实现是为了在所有平台上提供标准控制台,因此无论底层图形硬件如何,都呈现相同的 VGA 风格界面。因此,Linux 控制台不是终端仿真器,而是它自己的终端。它使用终端类型 linux,并且在很大程度上与 VT100 兼容。

键盘快捷键

键盘快捷键 描述
Ctrl+Alt+Del 重启系统(由符号链接 /usr/lib/systemd/system/ctrl-alt-del.target 指定)
Alt+F1F2F3、... 切换到第 n 个虚拟控制台(不要与 Xorg 和 Wayland 中使用的 Ctrl+Alt+Fn 混淆)
Alt+Left 切换到上一个虚拟控制台
Alt+Right 切换到下一个虚拟控制台
Scroll Lock 启用 Scroll Lock 后,输入/输出被锁定
Ctrl+c 终止当前任务
Ctrl+d 插入 EOF
Ctrl+z 暂停当前任务

另请参阅 console_codes(4)

字体

Linux 控制台 默认使用 UTF-8 编码,但由于使用了标准的 VGA 兼容帧缓冲,因此控制台字体被限制为标准 256 或 512 字形。如果字体有超过 256 个字形,则颜色数将从 16 减少到 8。为了为给定的 Unicode 值分配要显示的正确符号,需要一个特殊的转换映射,通常称为 unimap。如今,大多数控制台字体都内置了 unimap;历史上,它必须单独加载。

默认情况下,虚拟控制台 使用内核内置字体,字符集为 CP437[1],但这可以很容易地更改。内核提供了大约 15 种内置字体可供选择,其中 官方支持的内核 提供了两种:VGA 8x16 字体 (CONFIG_FONT_8x16) 和 Terminus 16x32 字体 (CONFIG_FONT_TER16x32)。内核根据其对屏幕分辨率的评估来选择要使用的字体。也可以通过 内核参数 引导参数设置(例如 fbcon=font:TER16x32)来强制使用另一个内置字体。

kbd 软件包提供了覆盖虚拟控制台字体和字体映射的内核决策的工具。可用字体在 /usr/share/kbd/consolefonts/ 目录中提供;那些以 .psfu.psfu.gz 结尾的字体具有内置的 Unicode 转换映射。

键盘映射(按下的键与计算机使用的字符之间的连接)位于 /usr/share/kbd/keymaps/ 的子目录中;有关详细信息,请参见 /键盘配置

注意: 替换字体可能会导致期望标准 VGA 风格字体的程序出现问题,例如那些使用线条绘图图形的程序。
提示: 对于以拉丁/希腊字母书写的欧洲语言,您可以使用 eurlatgr 字体。它包括广泛的拉丁/希腊字母变体以及特殊字符 [2]

预览和临时更改

提示: 有一个有组织的图像库可用于预览:Linux 控制台字体屏幕截图
$ showconsolefont

显示字体的字形或字母表。

如果传递字体名称 (在 /usr/share/kbd/consolefonts/ 中),例如

$ setfont lat2-16 -m 8859-2

字体名称区分大小写。不带参数,setfont 将控制台恢复为默认字体。

因此,要获得 小型 8x8 字体,并在安装了该字体的情况下(如下所示),请使用例如

$ setfont -h8 /usr/share/kbd/consolefonts/drdos8x8.psfu.gz

要获得 更大 的字体,Terminus 字体 (terminus-font) 提供多种尺寸,例如 ter-132b 很大。

您也可以附加 -d 以获得双倍大小。这将使用 64*64 字体

$ setfont -d ter-132n


提示
  • 所有字体更改命令都可以“盲打”输入。
  • Terminus 字体名称 (ter-*) 在 /usr/share/terminus-font/README 中进行了解释。
注意: setfont 仅在当前正在使用的控制台上有效。任何其他控制台(活动的或非活动的)均不受影响。

持久配置

/etc/vconsole.conf 中的 FONT 变量用于在启动时为所有控制台持久设置字体。有关详细信息,请参见 vconsole.conf(5)

对于使用字体 lat2-16.psfu.gz 显示字符(如 Č, ž, đ, šŁ, ę, ą, ś

/etc/vconsole.conf
...
FONT=lat2-16
FONT_MAP=8859-2

这意味着 ISO/IEC 8859 字符的第二部分与大小 16 一起使用。您可以使用其他值更改字体大小(例如 lat2-08)。对于 8859 规范确定的区域,请查看 Wikipedia:ISO/IEC 8859#The parts of ISO/IEC 8859

mkinitcpio v33 起,默认情况下,通过 consolefont 钩子在早期用户空间自动加载 /etc/vconsole.conf 中指定的字体,该钩子将字体添加到 initramfs。有关更多信息,请参见 Mkinitcpio#HOOKS

您可能还需要在更改 /etc/vconsole.conf重启 systemd-vconsole-setup.service

如果在启动时字体似乎没有更改,或者仅暂时更改,则很可能是当图形驱动程序初始化并且控制台切换到帧缓冲时它们被重置了。默认情况下,所有树内内核驱动程序都会提前加载,NVIDIA 用户应查看 NVIDIA#Early loading 以在应用 /etc/vconsole.conf 之前加载其图形驱动程序。

光标外观

这个主题的文档记录不完善。您应该阅读以下文章

光标类型
硬件 软件
形状
(0) 默认
应用 (2) 下划线
(1) 不可见
(2) 下划线
(3) 下三分之一
(4) 下半部分
(5) 三分之二
(6) 完整块
(16) 完整块
形状无法更改,但如果背景色和前景色相同,则光标实际上可以不可见
闪烁
闪烁
驱动程序相关
背景色的最高位可以解释为“明亮”或“闪烁”
颜色
与控制台文本颜色相同(通常为白色/灰色)
无法独立设置
可以由用户设置

控制台光标可以使用设备属性 (DA) 控制功能进行调整。参数序列必须以单个问号开头(尽管 console_codes(4) 上说与之相反)。

这是一个使用黑色符号的完整块状非闪烁绿色光标的示例

$ printf "\x1b\x5b?16;$((8+4+2+1));$((32+0+8+4+2+1))\x63"

同样可以使用八进制和字符而不是十六进制代码来表示

$ printf '\033[?16;15;47c'
注意: 关于控制功能(转义序列)的综合指南是标准 ECMA-48 — 编码字符集的控制功能

同样的配置可以作为永久配置通过 内核参数 应用

vt.cur_default=0x2f0f10
注意: 转义序列参数 (16, 15, 47) 在内核参数中以十六进制 (10, 0f, 2f) 反向顺序书写。

光标大小

第一个参数,尽管其名为光标大小,数字为 16(内核参数的最右边两位十六进制数字是 10)意味着“使用软件光标”。

注意: 您可能需要使用 48 (32+16)、80 (64+16) 或 112 (64+32+16) 而不是 16

如果您想更改硬件光标形状 - 请使用相应的数字(从 06,请参阅上表)。

注意: 光标大小 是唯一适用于硬件光标的参数。

切换掩码

第二个参数,称为切换掩码,翻转颜色的相应位。

字符属性位
背景

(光标块)

前景

(光标下方的符号)

(高亮)

或闪烁

红色 绿色 蓝色 (高亮)

或闪烁

红色 绿色 蓝色
十进制 128 64 32 16 8 4 2 1
十六进制 80 40 20 10 8 4 2 1

在我们的例子中,第二个参数是 15(内核参数的中间十六进制数字是 0f),因此所有四个前景(符号)位都将被翻转。最重要的规则是:切换(第二个参数)在设置(第三个参数)之后应用。

注意: 如果一个位由第三个参数设置并且被第二个参数切换 - 它实际上会被清除。

设置掩码

第三个参数称为设置掩码。它设置相应的字符属性位。在我们的示例中,我们使用 47(内核参数的最左边十六进制数字是 2f),这意味着两件事

  • (32)为光标块使用纯绿色
  • (8+4+2+1)设置所有四个前景(符号颜色)位。这些位将由第二个参数切换,因此光标下方符号的颜色将为黑色(0000)。

HiDPI

参见 HiDPI#Linux 控制台 (tty)

声音提示

参见 PC speaker#Beep

另请参阅