Linux console (简体中文)

From ArchWiki
翻译状态:本文是 Linux console翻译。上次翻译日期:2022-07-10。如果英文版本有所更改,则您可以帮助同步翻译。

根据维基百科

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

本文介绍了 Linux 控制台的基础知识以及如何配置字体显示。/Keyboard configuration (简体中文) 子页面中描述了键盘配置。

实现

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

虽然对控制台进行了许多改进,但它对旧硬件完全的向后兼容性意味着与图形终端仿真器相比它是受限的。

虚拟控制台

控制台以一系列虚拟控制台的形式呈现给用户。这些虚拟控制台给人的印象是几个独立的终端在同时运行;每个虚拟控制台可以用不同的用户登录,运行自己的 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 系列。如果系统硬件支持的话,仍可以文本模式启动,但几乎所有的现代发行版(包括 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 个虚拟控制台
Alt+ ← 切换到上一个虚拟控制台
Alt+ → 切换到下一个虚拟控制台
Scroll Lock 当 Scroll Lock 被激活时,输入/输出被锁定
Ctrl+c 杀死当前任务
Ctrl+d 插入 EOF
Ctrl+z 暂停当前任务

参见 console_codes(4)

字体

注意: 这部分是关于 Linux 控制台。有关提供更多功能的替代控制台解决方案(完整的 Unicode 字体、现代图形适配器等),请参阅 KMSCON 或类似项目。

虚拟控制台默认使用内核的内置字体,其包含 CP437 字符集[1],但这个设置很容易改变。

Linux 控制台默认使用 UTF-8 编码, 但是由于使用的是标准的兼容 VGA 的 framebuffer,终端字体限定为 256 或 512 个字形。如果字体超出了 256 个字形, 那么颜色的数量就会从 16 减少到 8。为了为给定的 Unicode 值分配正确的符号来显示,需要一个特殊的翻译映射,通常称为 unimap。现在,大多数控制台字体都内置了 "unimap";在历史上,它必须被单独加载。

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-132n 就很大。

提示: 所有更改字体的命令都可以“盲打”。
注意: 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)。可以在 Wikipedia:zh:ISO/IEC 8859#各种ISO 8859字符集 查询 8859 规范定义的区域。

若要在早期的用户空间中使用指定字体,请在 /etc/mkinitcpio.conf 中使用 consolefont 钩子。详情请参见 Mkinitcpio (简体中文)#钩子(HOOKS)

如果启动时字体没有变化,或只暂时变化,则最可能是因为初始化图形驱动时字体被复位,然后控制台切换到 framebuffer。提早加载图形驱动可避免此问题。若要在应用 /etc/vconsole.conf 前设置 framebuffer,参见 Kernel mode setting (简体中文)#KMS 早启动[3] 或其它方式。

HiDPI

参见 HiDPI (简体中文)#Linux 控制台

Audible tones

参见 PC speaker (简体中文)#Beep

参见