Настройка консоли

Георгий Курячий

Виртуальная консоль 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 таблица.sfm. Для того, чтобы загрузить только изображения из формата RAW и получить полноценный PSF-шрифт с внедрённой таблицей 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 (сообразно архитектуре и типу клавиатуры).