跳转至内容

Linux控制台

来自 ArchWiki

根据 Wikipedia

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

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

实现

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

尽管控制台在很多方面都有改进,但其对旧硬件的完全向后兼容性意味着它相对于图形终端模拟器存在局限性。Linux 控制台和图形终端模拟器之间的主要区别在于,Linux 控制台中的 shell 直接连接到 TTY 设备(/dev/tty*),而图形终端模拟器中的 shell 连接到伪 TTY(/dev/pty*)。

此外,图形终端模拟器可以比 Linux 控制台拥有更多功能,包括更丰富的可用字体集、多个标签/窗口、分屏视图、滚动回溯缓冲区/滑块、背景颜色/图像(可选透明度)等。其中一些功能可以通过终端多路复用器(如 TmuxGNU Screen)在 Linux 控制台中实现,或者在某些文本用户界面程序(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+F1, F2, F3, ... 切换到第 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

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

setfont 命令通过传递字体名称(位于 /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 hook,/etc/vconsole.conf 中指定的字体会在早期用户空间自动加载,该 hook 会将字体添加到 initramfs。有关更多信息,请参阅 Mkinitcpio#HOOKS

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

如果字体在启动时似乎没有改变,或者只改变了临时改变,那么很可能是因为在初始化图形驱动程序并将控制台切换到帧缓冲时被重置了。默认情况下,所有内置内核驱动程序都会提前加载,NVIDIA 用户应参阅 NVIDIA#Early loading 在应用 /etc/vconsole.conf 之前加载他们的图形驱动程序。

光标外观

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因:与其直接链接到之前的阅读内容,不如理想情况下将它们作为参考文献或“更多信息请参阅”在一些阐述/总结之后集成。(在 Talk:Linux console 中讨论)

本文档记录不佳。您应该阅读以下文章

光标类型
硬件 软件
形状
(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

另请参阅 HiDPI#Linux 控制台 (tty)

声音提示

另请参阅 PC speaker#beep

参见