跳至內容

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

參見

[編輯 | 編輯原始碼]