Виртуальная консоль Linux
организована на основе текстовых
возможностей графического контроллера (как правило, совместимого
со стандартом VESA или, по крайней мере. EGA/VGA). VGA
поддерживает загрузку однобайтовых шрифтов (256 изображений
размера 8x16, 8x14 или 8x8 пикселей) в специальный раздел
видеопамяти. Это означает, что полноценная поддержка языка,
содержащего большее количество символов (например, маньчжурского)
в такой консоли невозможна. К счастью, в русском языке букв
гораздо меньше.
К сожалению, существует более чем одна договорённость о том, как именно располагаются русские буквы в шрифте (т. н. кодировка, или codepage). Для кириллических шрифтов VGA принята кодировка cp866 (т. н. “ДОСовская”). Дело в том, что в некоторых текстовых режимах VGA одно знакоместо занимает не 8, а 9 пикселей. Поскольку изображение, тем не менее, используется восьмиточечное, девятая точка всегда рисуется цветом фона. Исключение делается для символов шрифта с порядковым номером от 192 до 223 включительно, соответствующих в стандартной кодировке псевдографике с горизонтальными линиями. При выводе такого символа на экран девятая точка каждой линии в его изображении рисуется так же, как восьмая. В результате горизонтальные линии получаются непрерывными.
Загрузкой шрифта занимается утилита consolechars. Ей можно
подать на вход шрифт в двоичном (raw) формате. Двоичный формат
содержит изображения всех символов шрифта и имеет, например,
размер 256 символов * 16 точек в высоту * 8 точек в ширину =
32768 бит (4096 байт). Можно использовать шрифты, оставшиеся от
русификаторов DOS, вроде RK или VGACYR! Стандартный для
consolechars формат PSF дополнительно содержит информацию о
том, каким символам в кодировке Unicode (двухбайтовой)
соответствует каждое изображение в шрифте. Эту информацию (т. н.
таблицу соответствия шрифта, Screen Font Map), можно подгружать
и отдельно, с помощью ключа -u
. Для того, чтобы
загрузить только изображения из формата RAW и получить
полноценный PSF-шрифт с внедрённой таблицей SFM, можно
воспользоваться командами
таблица.sfm
$ consolechars -f VGACYR.RAW $ consolechars -F VGACYR_with_SFM.psf
Система позволяет установить любую из имеющихся кодировок
при выводе данных на виртуальную консоль. Поскольку данные о
соответствии шрифта и Unicode добываются из SFM или PSF-файла,
остаётся только сообщить, как в ту же Unicode преобразуется
выбранная кодировка вывода. Для этого используется т. н.
рабочая таблица кодировки (Allpication Charset Map, называемая
также screenmap). Вывод на консоль выглядит так, как если бы
данные сначала преобразовывались в Unicode на основании
загруженной ACM-таблицы, а затем превращались в восьмибитное
представление с помощью загруженной таблицы ACM. Загрузкой
ACM-таблицы занимается та же утилита: consolechars -a
таблица.acm
.
Наконец, для локализации ввода с консольной клавиатуры необходимо сообщить системе используемую раскладку (keymap). Клавиатура IBM-совместимого компьютера — довольно сложное устройство, передающее в различных случаях разное количество информации. Задача виртуальной консоли — преобразовать эту информацию в поток символов, как если бы он приходил с настоящего терминала. Консоль может находиться в нескольких состояниях; от того, в каком состоянии находится консоль, зависит то, что будет происходить при нажатии на конкретную клавишу. Раскладка — это карта соответствия клавиш на клавиатуре действиям, выполняемым в разном состоянии консоли.
Раскладка обычно использует не менее двух состояния: Shift
и
Control
. Первое состояние используется для того, чтобы посылать
одной и той же клавишей прописной или строчный вариант буквы,
цифру или специальный символ и т. п. Второе используется, чтобы
посылать с клавиатуры символы с ascii-кодом, меньшим 0x20 (32),
т. н. непечатные. Если, допустим, клавиша A
посылает символ с
кодом 0x41
(65), то в состоянии Control
эта клавиша посылает
символ с кодом 0x1
, то есть от кода символа в двоичном
представлении отрезаются все биты, кроме первых пяти. Ещё одно
состояние — AltGr
— используется в локализованных раскладках для
того, чтобы возвращать буквы национального алфавита. Таких
состояний определено восемь (см. руководство keymaps(5)). В
раскладке им соответствует 256 (!) вариантов поведения консоли для
каждой клавиши — по одному варианту на любое сочетание состояний.
Клавиши, переводящие консоль в новое состояние, называются модификаторами состояний: Shift, Alt и Ctrl. В раскладке им будет соответствовать функция перевода консоли в соответствующее состояние — на время, пока клавиша нажата. Если клавиша переводит консоль в определённое состояние до другого нажатия на эту клавишу, это — залипающий модификатор. Такими модификаторами являются, например, Caps Lock или выбираемый при установке по умолчанию переключатель на русский язык — сочетание Ctrl+Shift.
Загрузкой раскладки в консоль занимается утилита
loadkeys. Ей на вход подаётся файл раскладки,
в котором описано поведение каждой клавиши. Формат этого файла
похож на тот, что используется в системе X11 утилитой
xmodmap. Если в этом файле опущены строки,
описывающее поведение некоторых клавиш, то при его загрузке оно
не меняется. Поэтому если вам необходимо только
изменить уже загруженную раскладку,
достаточно создать kmap-файл, описывающий эти изменения и
загрузить его. Например, такой файл может отменять установленные
по умолчанию функции переключения виртуальных консолей при
нажатии на клавиши Menu и
Windows 105-клавишной клавиатуры (они находятся
между Ctrl и Alt, и по ним часто попадаешь случайно).
Кроме того, может заставить клавишу Backspace в состоянии
Shift
возвращать не
Delete
, а именно BackSpace
и присвоить клавише Menu функцию
переключения на локальную раскладку и обратно.
$ cat mnu_bs.kmap keycode 14 = Delete BackSpace Delete BackSpace keycode 125 = CapsShift keycode 126 = AltGr keycode 127 = AltGr_Lock $ loadkeys mnu_bs.kmap
Систему можно настроить так, чтобы ещё при начальной загрузке
устанавливались определённые шрифты и раскладки. Файл
/etc/sysconfig/i18n
описывает язык по умолчанию, шрифт (поле
SYSFONT
) и ACM-таблицу (поле SYSFONTACM
). Соответствующий
шрифт, ACM и, если надо, SFM-таблицу система берёт из каталогов
/etc/sysconfig/console/consolefonts
и
/etc/sysconfig/console/consoletrans
. Все возможные консольные
шрифты хранятся в /usr/lib/kbd/consolefonts
, а таблицы — в
каталоге /usr/lib/kbd/consoletrans
. Раскладка определяется
содержимым файла /etc/sysconfig/keyboard
(поле KEYTABLE
),
всевозможные консольные раскладки лежат в подкаталогах
/usr/lib/kbd/keymaps
(сообразно архитектуре и типу клавиатуры).