跳转到内容

Linux 控制台

来自 Arch Linux 中文维基

根据维基百科

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

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

实现

[编辑 | 编辑源代码]

与大多数直接与用户交互的服务不同,控制台是在内核中实现的。这与终端仿真软件形成鲜明对比,如 Xterm,它是一个在用户空间实现的普通的应用程序。控制台一直是发布的 Linux 内核的一部分,但在其历史上经历了一些变化,最明显的是过渡到使用 framebuffer 以及对 Unicode 的支持。

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

此外,图形终端仿真器可以拥有比 Linux 控制台更多的功能,包括更丰富的可用字体集、多标签页/窗口、分屏视图、回滚缓冲区/滑块、背景颜色/图像(可选透明)等。其中一些功能可以通过终端多路复用器(如 TmuxGNU Screen)在 Linux 控制台中使用,或通过依赖 ncurses 等库的文本用户界面程序(TUI)实现,例如 VimnanoEmacs。这些功能也可在图形终端仿真器中使用。

虚拟控制台

[编辑 | 编辑源代码]

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

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

文本模式

[编辑 | 编辑源代码]

由于 Linux 最初是适用于 PC 硬件的内核,所以控制台是使用标准 IBM CGA/EGA/VGA图形开发的,当时所有 PC 都支持这种图形。图形在 VGA 文本模式下运行,它提供了一个简单的 16 色 80x25 字符显示。这种传统模式类似于专用文本终端的功能,例如 DEC VT100 系列。如果系统硬件支持的话,仍可以通过内核参数(vga=0 nomodeset)以文本模式启动,但几乎所有的现代发行版(包括 Arch Linux)都使用 framebuffer 控制台来代替。

Framebuffer 控制台

[编辑 | 编辑源代码]

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

键盘快捷键

[编辑 | 编辑源代码]
键盘快捷键 描述
Ctrl+Alt+Del 重新启动系统(由符号链接 /usr/lib/systemd/system/ctrl-alt-del.target 指定)
Alt+F1F2F3…… 切换到第 n 个虚拟控制台(不同于 Xorg 和 Wayland 中使用的 Ctrl+Alt+Fn
Alt+左箭头 切换到上一个虚拟控制台
Alt+右箭头 切换到下一个虚拟控制台
Scroll Lock 当 Scroll Lock 被激活时,输入/输出被锁定
Ctrl+c 杀死当前任务
Ctrl+d 插入 EOF
Ctrl+z 暂停当前任务

参见 console_codes(4)

字体

[编辑 | 编辑源代码]

Linux 控制台默认使用 UTF-8 编码,但由于使用的是标准的兼容 VGA 的 framebuffer,终端字体限定为 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/ 的子目录中,详情请参阅 /Keyboard configuration

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

预览和测试

[编辑 | 编辑源代码]
提示:这里有一个整理过的预览影像数据库:Linux 控制台字体截图
$ showconsolefont

显示字体可用字形与字符的列表。

如果指定(/usr/share/kbd/consolefonts/ 中的)字体名称,setfont 将暂时改变字体:

$ setfont lat2-16 -m 8859-2

字体名称区分大小写。如果不加参数,setfont 会将控制台字体重设为默认字体。

因此,要使用一个小的 8x8 字体,在安装字体后,使用类似如下所示的命令:

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

如果要使用更大的字体,Terminus 字体 (terminus-font) 有多种尺寸可供选择,例如 ter-132b 就很大。

你也可以添加 -d 选项来使用双倍大小。这将使用 64x64 字体:

$ 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)。可以在 zhwp:ISO/IEC 8859#各种ISO 8859字符集查询 8859 规范定义的区域。

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

更改 /etc/vconsole.conf 后,你可能还需要重启 systemd-vconsole-setup.service

如果启动时字体没有变化,或只暂时变化,则最可能是因为初始化图形驱动时字体被复位,然后控制台切换到 framebuffer。默认情况下,所有树内内核驱动程序都会提前加载。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 — Control Functions for Coded Character Sets

相同的配置可通过内核参数永久应用:

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#Linux 控制台

声音提示

[编辑 | 编辑源代码]

参见 PC 扬声器#beep

参见

[编辑 | 编辑源代码]