Системная консоль
Автор : Иван Паскаль
Драйвер "системной консоли" - syscons.
Как любой Юникс, FreeBSD дает возможность пользователю общаться с компьютером через различные типы терминалов. Это может быть и "железный" терминал, подключенный, например, через COM-порт и другой компьютер, соединяющийся по сети (программой telnet). Но основным терминалом конечно же является дисплей и клавиатура той "писишки", на которой и запущена FreeBSD.
Естественно, работа программ (их ввод и вывод) не должны существенно отличаться как при работе с "железным" терминалом, так и при работе с "родными" дисплеем и клавиатурой. Поэтому, даже при вводе/выводе на терминал компьютера программа никогда не обращается к соответствующему "железу" (видео-контроллер и контроллер клавиатуры) напрямую.
Конечно, и в других операционных системах (даже таких простых, как MS DOS) обычная программа не "лезет в железо", а пользуется библиотечными функциями (getchar, print и т.п.) или функциями BIOS. Но, в данном случае, речь идет о том, что даже между самой системой FreeBSD (системными библиотеками) и "железными" устройствами, стоят соответствующие "драйверы терминалов", которые и обеспечивают "однообразие" при работе с очень разными терминалами.
Так вот, syscons - как раз такая программа, которая с одной стороны общается непосредственно с регистрами контроллеров (видео и клавиатуры) вашей "писишки", а с другой стороны изображает для операционной системы некоторое законченное устройство, наподобие внешнего терминала.
Надо заметить, что в FreeBSD есть еще один "альтернативный" драйвер консоли - pcvt. Для того, чтобы заменит на него syscons надо персобрать ядро системы с соответствующими опциями.
Но, поскольку, в "стандартной поставке" FreeBSD "встроен" именно syscons, он же и используется в большинстве случаев.
Поэтому я ограничусь только описанием syscons (тем более, что pcvt я практически не знаю :-)
Основные возможности syscons
Итак, syscons с одной стороны работает непосредственно с "железом" (видео-контроллером и контроллером клавиатуры), а для ОС выглядит как некий аппарат, который и является терминалом.
Прежде всего надо отметить, что syscons изображает из себя несколько "виртуальных терминалов" или "виртуальных консолей". Естественно, пользователь может переключаться из одного такого терминала в другой, с помощью соответствующих клавиш (подробнее смотри "Переключатели виртуальных терминалов.") или выводя на терминал специальные esc-последовательности.
Каждый такой виртуальный терминал является как бы независимым устройством. То есть, вывод на один из виртуальных терминалов никак не влияет на другие, некоторые атрибуты экрана (например цвета символов) могут быть установлены на одном конкретном терминале и не отражаться на других, "модификаторы клавиатуры" (CapsLock, NumLock и т.п.) могут находится в разных положениях на различных терминалах и т.п. Естественно, если пользователь переключится в другой виртуальный терминал, а потом вернется обратно, syscons восстановит и изображение на экране, и аттрибуты, и состояние модификаторов.
Однако, надо сразу оговориться, что некоторые настройки syscons (шрифты, "раскладка клавиатуры" и некоторые другие) действуют сразу на все виртуальные терминалы, независимо от того, в каком из них вы находились в момент изменения этих настроек.
Обычно с каждым виртуальным терминалом связана своя сессия и своя задача, выполняющаяся в этой сессии. Однако, задача, запущенная на первом (например) виртуальном терминале может работать и с другими терминалами (например, выводить часть своих сообщений на экран другого виртуального терминала).
Обычно syscons поддерживает 16 виртуальных терминалов. Это число определяется при сборке ядра системы и может быть изменено при перегенерации ядра (option MAXCONS). Правда, для того, чтобы можно было их все задействовать, в директории /dev должно быть создано соответствующее количество "точек входа" ("устройства" ttyv0 - ttyv9, ttyva-ttyvf). Дело в том, что в "свеже-инсталлированной" системе таких устройств только 4 (ttyv0-ttyv3).
Для того, чтобы "доделать" остальные надо выполнить команду
/dev/MAKEDEV vty*
где * означает количество устройств, которое вам нужно (для чисел больше 9 используются буквы a-f, как для шестнадцатеричных цифр).
Кроме того, чтобы реально переключиться на какой-нибудь из виртуальных терминалов, он должен быть активным. То есть на нем должна быть запущена хоть какая-нибудь задача. Для того, чтобы при старте системы каждый терминал получил свою задачу, на каждом из них запускается программка getty, которая дает возможность открыть сессию на этом терминале. Это задание (запустить getty на каждом терминале) записывается в файле /etc/ttys. Опять же, в "свеже-поставленной" системе в этом файле "охвачены" только три терминала. Поэтому, если вы хотите пользоваться и остальными, то в этом файле придется добавить "задания" для всех виртуальных терминалов. Только, если вы собираетесь запускать систему X-Window, не забудьте оставить для нее хотя бы один свободный терминал.
Каждый виртуальный терминал имеет буфер экрана, больший, чем размер физического экрана. Обычно физический размер экрана 25 строчек, хотя, при желании, вы можете переключить syscons в режим при котором на экране отображаются 43, 50 или 60 строчек, если, конечно, видеокарта поддерживает такие режимы (подробнее об этом в "Режим отображения")
Так вот, каждый виртуальный терминал помнит последние 100 строчек вывода из которых только последние отображаются на физическом экране.
Эти 100 строчек хранятся в буфере экрана и вы можете их "пролистать", переключив syscons в специальный режим - "просмотра буфера" (подробнее в "Специальные клавиши: slock").
Кроме того, надо отметить, что 100 строк - это размер "по умолчанию". При желании его можно увеличить иди уменьшить (подробнее в "Изменение размера буфера терминала"). Причем, каждый из виртуальных терминалов может иметь свой размер буфера.
Драйвер syscons эмулирует "интеллектуальный" терминал, который кроме обычного вывода "символ за символом" понимает ряд команд в виде esc-последовательностей (цепочка из нескольких символов, начинающаяся с кода Esc - 27). С помощью таких последовательностей программа может менять положение курсора на экране, очищать часть текущей строки или часть экрана, менять атрибуты символов (яркость, цвет, подчеркивание, мерцание и т.п.).
Список этих команд можно посмотреть в "Приложение 1. Команды (esc-последовательности) syscons"(он в основном соответствует командам стандартного "ANSI-терминала").
Но хочу напомнить, что программа, если она претендует на то, чтобы работать на разных типах терминалов, и не должна знать команды конкретного дисплея. Для обеспечения такой независимости от типа терминала, в любом Юниксе существуют стандартные механизмы - "базы данных свойств терминалов" (termcap и terminfo) и библиотеки ввода/вывода (ncurses, slang и т.п.), которые сами адаптируются к "системе команд" конкретного типа терминала.
Для изменения настроек syscons в системе существуют две утилиты - vidcontrol и kbdcontrol. Как понятно из их названий, первая меняет параметры, относящиеся к изображению на дисплее, а вторая - настройки клавиатуры.
Описание этих утилит можно найти в соответствующих man'уалах. Я только кратко опишу их основные возможности (в разделах "Программа vidcontrol" и "Программа kbdcontrol").
Надо заметить, что обычно основные настройки syscons (русификация, тип курсора, "скринсейвер" и т.п.) делаются во время загрузки системы в соответствующем "стартовом скрипте" (/etc/rc.i386), а параметры, которые им требуются, прописываются в /etc/rc.conf.
Поэтому, вы можете поэкспериментировать с настройками, запуская эти утилиты вручную, но "глобальные" изменения лучше делать редактированием соответствующих строчек в /etc/rc.conf.
К сожалению, на эту часть мне не хватило сил и времени. В свое оправдание скажу только, что
- во-первых, это вопрос выходит за рамки собственно драйвера syscons (надо рассказать про драйвер "мыши", правильную настройку X-Window, взаимодействие с другими программами)
- во-вторых, эта часть syscons появилась сравнительно недавно, все еще совершенствуется, и, поэтому, ее описание может существенно отличаться для разных версий FreeBSD.
Надеюсь, что со временем я восполню этот пробел. Пока могу лишь посоветовать почитать на эту тему man moused и man sysmouse.
Дисплей
Рассмотрим немного подробнее ту часть syscons, которая отвечает за вывод символов на экран дисплея.
Вообще-то, программа syscons при выводе каждого символа просто отправляет его код в "железку" - видео-контроллер, а тот уже отображает символ на дисплее теми шрифтами, которые у него имеются. Однако, современные видеокарты кроме "зашитых" шрифтов позволяют загружать и другие наборы символов. Это, в частности, позволяет видеокартам изображать символы кириллицы и дополнительные "экзотические" значки, отсутствующие в стандартном шрифте видеокарты.
Драйвер syscons поддерживает это свойство видеокарт, то есть предоставляет пользователю возможность загружать шрифты из файла. Точнее, роль самого syscons в этом процессе очень скромная, он просто копирует те данные, которые ему подсунет соответствующая программа, в видео-контроллер. А пользователь может использовать программу vidcontrol, которая считывает нужный файл со шрифтами и отправляет их в syscons (немного подробнее об этом в главе "Программа vidcontrol").
Готовые файлы шрифтов находятся в системе в директории /usr/share/syscons/fonts. Там же есть и файл с кратким описанием шрифтов.
Обратите внимание, что для каждого набора символов существует по крайней мере три разных файла, с разными размерами (в пикселах) символов - 8x8, 8x14, 8x16.
Дело в том, что видеокарта имеет несколько режимов отображения, отличающихся "плотностью" знаков (об этом немного ниже). Если в стандартном режиме, на экране изображается 25 строчек по 80 знаков каждая, то в других режимах на экране может быть 30, 43, 50 или даже 60 строк (естественно, это зависит от модели видеокарты). В одних режимах размер одиночного знака складывается из матрицы 8x16 точек, в других - 8x14 или 8x8. Соответственно, syscons может помнить три разных шрифта, отличающихся размером матрицы, и в нужный момент (при изменении режима отображения) загрузить в видеокарту подходящий шрифт.
В стандартном режиме (80x25) используются шрифты 8x16, но на всякий случай рекомендуется загружать все три типа шрифтов. Замечу, что обычно шрифты загружаются при старте системы, а какие именно - записано в соответствующих строчках /etc/rc.conf. Поэтому "рекомендуется загружать" означает, просто подправить нужные строчки в rc.conf, а если вы уже выполнили все необходимые действия по русификации системы, то у вас и так уже загружается "все, что нужно". (Подробности о русификации в главе "Русификация syscons")
Заканчивая разговор о шрифтах, надо заметить, что syscons хранит только один набор из трех шрифтов для всех виртуальных терминалов, поэтому перезагрузка шрифтов действует сразу на все терминалы. Другими словами, syscons не предоставляет пользователю возможности иметь разный набор шрифтов для разных "виртуальных терминалов".
Выше я сказал, что при выводе символа, syscons просто отправляет его код в видео-контроллер. Это не совсем верно.
Перед этим syscons "прогоняет" символ через внутреннюю таблицу перекодировки. Эта "таблица перекодировки" (screenmap) представляет из себя просто табличку из 256 байт, то есть каждый выводимый код символа может быть заменен на код какого-нибудь другого символа. Понятно, что если вам ничего заменять не нужно, эта таблица заполняется такими значениями, которые не меняют исходный код.
Конечно, если учесть, что видео-контроллер позволяет загружать любые шрифты, эта дополнительная услуга syscons вроде бы и не нужна. Достаточно загрузить подходящий шрифт, где все символы уже находятся на нужных местах.
Но, с другой стороны, если у вас нет под рукой нужного шрифта (например, русские буквы в кодировке cp1251), то составить таблицу перекодировки очень легко с помощью подходящей программы-"перекодировщика". А нарисовать новый шрифт, или хотя бы "перекроить" один из существующих - более трудоемкая задача. Кроме того, "таблица перекодировки" помогает решать и некоторые другие проблемы (например, смотри "Русификация: Зачем так сложно?").
Как и шрифты, screenmap можно заменить с помощью программы vidcontrol (подробности в описании vidcontrol).
Учтите, что "таблица перекодировки" в syscons одна на все виртуальные терминалы (хотя это и не очень приятно). Поэтому ее изменение на одном из виртуальных терминалов отразится и на всех остальных. Правда, в отличии от перезагрузки шрифтов, которая сразу же перерисует символы на всех других терминалах, смена screenmap подействует только на следующий выводимый текст.
Как я уже упоминал выше, видео-контроллер может строить изображение на экране с разной "плотностью символов". В стандартном режиме изображение состоит и 25 строк по 80 знаков в каждой. Такой режим называется (в тех терминах, которые понимает vidcontrol) VGA_80x25. В зависимости от типа видеокарты, вы можете получить также режимы - 40x25, 80x30, 80x43, 80x50 и 80x60.
Для переключения режимов можно воспользоваться опять же программой vidcontrol.
Важно отметить, что хотя режим отображения обеспечивается не столько программой syscons, сколько "железкой" - видео-контроллером, syscons позволяет иметь разный "режим отображения" на разных "виртуальных терминалах".
То есть, изменение режима влияет только на текущий терминал, а когда вы будете переключаться между разными "виртуальными терминалами", syscons будет каждый раз перепрограммировать видео-контроллер, чтобы восстановить на каждом терминале тот режим, который вы ему задали.
И еще надо заметить, что если вы переключите терминал в режим с большим количеством строк (например) это еще не означает, что все программы (редакторы, "коммандеры" и т.п.) будут использовать эту возможность. Для того, чтобы все программы "осознали", что появилось дополнительное пространство на экране, необходимо правильно установить значение "переменной окружения" TERM (тип терминала).
Если для стандартного режима тип терминала должен быть cons25 или cons25r (r - русифицированный, он же pc3r), то для других режимов надо выбрать - cons30 (cons30r), cons43 (cons43r) и т.п.
Некоторые программы (например, Midnight Commander) сами могут определять размер экрана (и то, только при старте), но если правильно выставить переменную TERM, это гарантирует вам, что все программы вас правильно поймут.
Надеюсь, все знают - что это такое. Ну, эта та программа, которая рисует какие-нибудь картинки (напрмер - "звездное небо") на экране, если дисплей долго "простаивает", то есть достаточно долгое время ничего на выводится на экран и не вводится с клавиатуры.
Собственно, эта программа не является частью syscons.
Каждый такая программа (а их в FreeBSD предлагается несколько на выбор) представляет собой "загружаемый модуль ядра" (loadabe kernel module) и может быть загружена во время работы системы с помощью стандартной утилиты для загрузки всех подобных модулей - modload.
При загрузке screen saver сам сообщает syscons - как его запустить.
Естественно, вы можете регулировать "время простоя", после истечении которого syscons должен запустить screen saver.
Так же как и другие настройки syscons, загрузка screen saver'а обычно выполняется при старте системы. Параметры - тип saver'а и "время простоя" указываются в /etc/rc.conf. Только хочу еще раз обратить внимание на то, что "время простоя" (как и другие параметры syscons) устанавливается с помощью утилиты vidcontrol, а вот "тип saver'а" выбирается просто загрузкой соответствующего модуля командой modload.
Кстати, если вас интересует полный список saver'ов, которые вы можете использовать, не доверяйте тому перечню, который дан в комментариях в файле rc.conf, он может быть неполным. Просто загляните в директорию /lkm. Файлы, которые имеют в названии слово "saver" и есть то, что вас интересует.
Клавиатура
Теперь рассмотрим ту часть syscons, которая работает с клавиатурой.
Начнем с самого "низа" - "железного" контроллера клавиатуры. При нажатии на любую клавишу он выдает ее скан-код - некий номер кнопки на клавиатуре. Сразу замечу, что этот скан-код не имеет ничего общего с ASCII-кодами тех символов, которые "нарисованы на кнопках".
Более того, для каждой кнопки контроллер выдает по крайней мере два разных кода - один, когда вы нажимаете кнопку, другой - когда отпускаете ее. Эти коды всегда отличаются на величину 128 (старший бит в байте кода), хотя в данном случае это не так уж и важно. Кроме этого, при нажимании некоторых кнопок (и отпускании) контроллер генерирует скан-коды состоящие из двух байт - "префикса" (обычно это E0) и собственно кода кнопки. Обычно такие скан-коды называют "расширенными".
Основная задача syscons - преобразовать эти скан-коды в соответствующие коды символов. Причем, он делает это в два этапа.
Сначала "сырые" скан-коды (которые считываются из контроллера) преобразуются во внутренние коды syscons. В основном это касается "расширенных" кодов. Для обычных клавиш в качестве внутреннего кода берется просто скан-код, а вот "расширенные" коды заменяются на однобайтные коды (естественно, те, которые не заняты обычными клавишами). Кстати, в документации они обычно тоже называются скан-кодами, но учтите, что это "немного не те" скан-коды.
На втором этапе уже внутренние коды по специальной таблице "раскладки клавиатуры" (keyboard map) преобразуются в обычные ASCII коды символов. Надо заметить, что при этом используется только скан-код "нажатия клавиши".
Наконец, для некоторых клавиш существует еще и третий этап. На этом этапе коды, уже преобразованные через таблицу раскладки, превращаются в последовательность из нескольких кодов (такие клавиши называются "функциональными", но об этом чуть позже).
То есть, при нажатии таких клавиш, получаются опять как бы "расширенные" коды. Естественно, это уже не те "расширенные" скан-коды, которые выдает контроллер клавиатуры (да и клавиши другие).
Надо отметить, что первый этап (преобразование "сырых" скан-кодов во "внутренние") жестко "зашит" в программе syscons. То есть, изменить соответствие между каким-нибудь "расширенным" скан-кодом и внутренним кодом, в который его превратит syscons, нельзя.
А вот преобразованием в ASCII-коды, напротив, можно управлять. Таблица раскладки клавиатуры может быть загружена в syscons с помощью соответствующей утилиты (kbdcontrol). Естественно, если вы не будете загружать никакую таблицу, это не значит, что syscons не сможет перевести скан-коды в символы ASCII. В нем есть "встроенная" таблица раскладки "по умолчанию". Но, как я уже сказал, в любой момент можно поменять все соответствия кодов.
Также можно менять и последовательности, которые "навешиваются" на "функциональные" клавиши на третьем этапе.
Прежде чем перейти к более подробному рассмотрению "раскладки клавиатуры", надо отметить, что syscons можно переключить в режим, когда он будет отдавать в систему просто "сырые" скан-коды (RAW) или в режим выдачи "внутренних" скан-кодов (CODE). (В "нормальном" режиме выдаются "транслированные" (XLATE) коды.)
Если вам захочется посмотреть скан-коды вашей клавиатуры, можете воспользоваться моими программками ("Приложение 4. Несколько мелких полезных программок.), которые используют эти режимы. Только хочу еще раз подчеркнуть, что наиболее интересными являются не "сырые" (RAW) скан-коды, а "внутренние" коды syscons (CODE), поскольку в таблице раскладки клавиатуры указываются именно они (причем, только "код нажатия").
Итак, что собой представляет таблица раскладки клавиатуры (keyboard map)?
Во-первых, напомню, что есть несколько вспомогательных клавиш - "модификаторов" (Shift, Ctrl и Alt), которые меняют код выдаваемый другими клавишами.
Поэтому, каждая строчка в "таблице раскладки" состоит из скан-кода клавиши ("внутреннего", не "сырого") и нескольких значений для этой клавиши. (В зависимости от комбинации "модификаторов" syscons выберет одно из них.)
Все возможные значения для клавиш можно разделить на несколько групп
- модификаторы - клавиши, которые изменяют значения для других клавиш
- обычные "знаковые" клавиши
- "функциональные" клавиши
- переключатели виртуальных терминалов
- специальные клавиши (рестарт компьютера, переход в отладчик и т.п.)
Это клавиши, которые меняют значения выдаваемые другими клавишами.
Рассмотрим подробнее - какие модификаторы использует syscons и каким образом они влияют на коды других клавиш.
В таблице раскладки клавиатуры (keyboard map) каждому скан-коду соответствует восемь значений. Как я уже сказал, какое из этих значений будет выбрано при нажатии клавиши, определяется "состоянием модификаторов".
Так вот, это "состояние" задается тремя модификаторами - shift, ctrl и alt.
Состояние модификаторов (номер кода в таблице) syscons вычисляет по формуле:
1 (если shift) + 2 (если ctrl) + 4 (если alt)
В общем-то, если вы заглянете в какой-нибудь файл "раскладки клавиатуры", то увидите, что все колонки значений сверху подписаны - какая колонка, при какой комбинации модификаторов выбирается. Так что, высчитывать номер колонки по приведенной формуле вам не придется. Однако, эту формулу полезно знать, чтобы правильно понимать действие двух других модификаторов (CapsLock и NumLock) о которых речь пойдет ниже.
Говоря о модификаторах shift, ctrl и alt надо отметить, что ...
- Строго говоря, поскольку на современных клавиатурах каждая такая клавиша присутствует в двух экземплярах (слева и справа основной клавиатуры), и значений тоже не три, а шесть - lshift, rshift, lctrl, rctrl, lalt, ralt. Буквы l и r в названиях означают левый (left) и правый (right) соответственно. Но для выбора одного из восьми состояний syscons не делает различий для левой и правой клавиши. То есть, в любом случае - нажмете ли вы клавишу, которой "прикреплено" значение lalt или клавишу со значением ralt или обе вместе, syscons будет считать, что активен модификатор alt.
- Все эти три (или шесть) модификаторов "не фиксирующиеся". То есть, они действуют только пока вы держите соответствующие клавиши нажатыми (впрочем, об этом и так все знают).
- По умолчанию, все эти шесть значений "навешены" на привычные клавиши - lshift на левую кнопку [Shift], rshift - на правую кнопку [Shift] и т.д. Однако, еще раз замечу, что речь идет о не о физических кнопках на клавиатуре, а о значениях, которые драйвер им присваивает. То есть, при желании, можно клавишу [Alt] заставить действовать как Shift, например, хотя в этом ничего полезного нет. Более полезным может оказаться одну из парных клавиш [Shift], [Ctrl] или [Alt] (например, левую) использовать по ее прямому назначению, а на правую "повесить" какую-нибудь другую функцию.
Следующие два модификатора - clock (CapsLock) и nlock (NumLock). Их влияние на другие клавиши по сути одинаково. Отличаются они только "областью действия". Как вы можете заметить, в файлах "раскладки клавиатуры", кроме восьми колонок с кодами, есть еще одна колонка, озаглавленная "lock state". Она и определяет - подвержена ли соответствующая кнопка действию clock или nlock.
- Если в этой колонке стоит буква "O", то клавиша никак не реагирует ни на нажатие clock, ни на nlock. Обычно, это клавиши с цифрами на основной клавиатуре, функциональные клавиши и сами клавиши модификаторов.
- Если в "lock state" стоит "C", значит выбор значения зависит от состояния модификатора clock. Обычно, это клавиши с буквами.
- Буква "N" помечает клавиши, зависимые от состояния nlock. Традиционно - это клавиши на дополнительной цифровой клавиатуре.
- Наконец, в последней колонке может стоять буква "B" (от слова both - оба). Это должно означать, что клавиша реагирует и на clock и на nlock. Однако, ни в одной "раскладке клавиатуры" из дистрибутива FreeBSD такие клавиши не предусмотрены.
Действие же этих модификаторов заключается в том, что при нажатии соответствующего lock, значение модификатора shift инвертируется. То есть, если shift не нажат (но действует соответствующий lock), то выбирается такое значение для клавиши, которое соответствует "активному состоянию" модификатора shift. И наоборот - при нажатом shift выбирается значение соответствующее "не нажатому" shift'у.
То есть, в таблице раскладки меняются местами колонки "с shift'ом" и "без shift'а". Обратите внимание, что в соответствии с формулой, определяющей номер колонки, меняются местами не только первые две, но и все четные с нечетными (то есть, "просто ctrl" и "ctrl+shift", "просто alt" и "alt+shift" и т.д.).
Обе клавиши - clock и nlock, являются "фиксирующимися". То есть, после нажатия и отпускания clock (например) клавиатура переходит в состояние clock. А при повторном нажатии/отпускании возвращается в исходное состояние (что тоже всем известно).
По умолчанию, значение nlock "навешено" на клавишу [Num Lock]. А вот с clock все немного сложнее. Вообще-то, оно изначально соответствует клавише [Caps Lock], но если у вас загружена раскладка для русской клавиатуры (что бывает чаще всего), то на эту клавишу "навешивается" еще и другой модификатор - alock (Alt Group Lock), который служит для переключения на русский алфавит (о нем поговорим немного позднее). Для того, чтобы получить именно clock вам придется нажимать клавишу [Caps Lock] вместе с одним из основных модификаторов (не важно - shift, ctrl или alt).
Следующие два модификатора - alock (Alt Group Lock) и ashift (Alt Group Shift). Они действуют на другие клавиши одинаково, причем, на все клавиши. Разница только в том, что alock "фиксирующаяся" (как clock и nlock), а ashift - "не фиксирующаяся" (как и обычный shift).
Действие же этих модификаторов заключается в том, что в состоянии AltGroup syscons к скан-коду каждой клавиши добавляет постоянное смещение (а именно - 128), а только после этого подбирает подходящее значение из таблицы "раскладки клавиатуры".
То есть каждая клавиша имеет как бы два разных скан-кода, один в обычном состоянии и другой скан-код (на 128 больше) в состоянии AltGroup. Таким образом получается для того же набора физических кнопок еще одна раскладка - "альтернативная".
Обычно альтернативная раскладка используется, чтобы на "буквенные" клавиши "навесить" буквы (точнее, коды букв) какого-нибудь национального языка, алфавит которого отличается от английского. По крайней мере, именно эта "альтернативная раскладка" используется для русификации клавиатуры.
Таким образом, руссифицированная раскладка отличается от обычной тем, что в нее дописывается еще столько же строчек (сколько в обычной) с номерами скан-кодов больше на 128. При этом, для "небуквенных" клавиш все значения обычно такие же, как и в первой части таблицы, а для "буквенных" подставляются соответствующие коды русских букв. (Надо отметить, что в дистрибутиве FreeBSD есть раскладки для кодировок koi8 и cp866. Если вам захочется иметь раскладку для cp1251 ее можно изготовить самостоятельно).
Естественно, что по умолчанию эти два модификатора не назначены ни на какие клавиши. Но если загружается одна из русских раскладок, то alock присвоена клавише [Caps Lock], но только в первой колонке. То есть в таком качестве [Caps Lock] выступает только тогда, когда не нажат ни один из основных модификаторов (shift, ctrl или alt). Если вас это не устраивает и вы хотели бы, чтобы [Caps Lock] была именно CapsLock'ом, можно "подвесить" alock на любую другую клавишу или комбинацию клавиш (например "два Shift'а" или "Ctrl+Shift"). Подробнее можете посмотреть в "Несколько примеров изменения назначения клавиш"..
Значение ashift в стандартных раскладках отсутствует (даже в русских). Если она вам нужна, выберите подходящую для нее клавишу и отредактируйте соответствующий файл "раскладки клавиатуры".
Наконец, последняя клавиша, которую можно отнести к модификаторам - клавиша meta.
Клавиша эта не фиксируется, то есть она активна только пока вы ее удерживаете в нажатом состоянии.
Когда она активна, syscons при выдаче кода другой нажатой клавиши, сначала вставляет код Esc (27). То есть обычные клавиши (алфавитноцифровые) начинают выдавать последовательность из двух кодов (например, клавиша [A] - EscA). Дело в том, что некоторые программы (Midnight Comander, emacs и т.д) широко используют такие комбинации в качестве "горячих клавиш". Без модификатора meta их можно получать, последовательно нажимая [Esc] и нужную клавишу.
По умолчанию эта клавиша на клавиатуре отсутствует. Если вы считаете, что с ней вам будет удобнее, можно назначить ее на одну из парных кнопок модификаторов (Shift, Ctrl или Alt), а вторую оставить для ее "прямого назначения". Если же у вас имеется клавиатура "от Microsoft", с дополнительными кнопками (два "окошка" - слева и справа и "меню") то под meta можно задействовать одну из этих кнопок (или даже все три :-).
Подробнее можете посмотреть в "Несколько примеров изменения назначения клавиш"..
Это клавиши, при нажатии которых выдается просто одиночный код (в отличии от "функциональных" клавиш). Кроме обычных символов (буквы, цифры, знаки препинания и т.п.) к ним относятся "управляющие" коды, которые генерируют клавиши [Esc], [Enter], [Tab] и [Backspace].
Кроме того, в зависимости от состояния модификаторов (обычно, модификатора ctrl), "символьные" клавиши тоже могут выдавать "управляющие" коды (CtrlA - 1, CtrlB - 2 и т.д.).
В таблице раскладки клавиатуры, коды таких обычных клавиш можно указывать просто числом или соответствующим символов в "одиночных кавычках" - 'a', 'b' и т.п. Для управляющих кодов существуют специальные названия (хотя их тоже можно указать просто числом). Полный список этих кодов можно посмотреть в "Приложение 2. Управляющие ("контроловые") символы".
Кроме того, в таблице раскладки клавиатуры можно встретить код nop.
Строго говоря, это не код, а просто указание syscons, что при нажатии на соответствующую клавишу никакого кода вообще выдавать не надо.
Обычно этим словом помечаются не клавиши, а только некоторые "состояния" клавиш (например, клавиша [&] при нажатом [Ctrl]). А также, скан-коды, которые не соответствуют никаким физическим кнопкам на клавиатуре.
Эти клавиши отличаются от "нормальных" знаковых клавиш тем, что при нажатии выдают не просто одиночный код, а последовательность кодов (обычно это последовательности типа Esc [ 'буква'). Причем эти последовательности при желании можно "перепрограммировать" с помощью, например, утилиты kbdcontrol.
Вообще-то, правильнее сказать "могут выдавать последовательности", поскольку, по умолчанию, некоторые из этих "последовательностей" состоят из одного знака или вообще пустые. Важно только то, что при желании вы можете их "удлинить", в то время как для обычных знаковых клавиш это сделать невозможно. Максиммальная длина последовательности - 16 байт.
Называются эти клавиши в таблицах "раскладки клавиатуры" fkey01 - fkey96. Так много их потому, что к таким клавишам (порождающим целую "пачку" кодов) относятся не только клавиши F1 - F12, но и "стрелки", Home, End, Delete и т.п. Кроме того, несколько fkey оставлено "про запас", для будущих возможных кнопок.
На всякий случай я привожу список соответствий - какие fkey'и каким физическим клавишам соответствуют. Естественно, речь идет о значениях "по умолчанию". При желании их можно "перевесить" на другие кнопки. Первые 48 fkey распределены между клавишами [F1] - [F12]. Из них первые двенадцать (fkey01 - fkey12) получаются просто при нажатии соответствующих физических клавиш ([F1] - [F12]), следующие двенадцать (fkey13 - fkey24) при нажатии тех же клавиш с модификатором Shift (то есть, по умолчанию - [F1]+[Shift] - [F12]+[Shift]), следующая "пачка" (fkey25 - fkey36) - то же самое, но с модификатором Ctrl, и, наконец, последние (fkey37 - fkey48) получатся когда будут активны оба модификатора - и Shift, и Ctrl. Следующие fkey'и "достались" физическим клавишам
fkey49 - [Home]
fkey50 - [стрелка вверх]
fkey51 - [Page Up]
fkey53 - [стрелка влево]
fkey55 - [стрелка вправо]
fkey57 - [End]
fkey58 - [стрелка вниз]
fkey59 - [Page Down]
fkey60 - [Insert]
fkey61 - [Delete]
Эти же значения (кроме fkey61 - [Delete]) могут выдавать клавиши дополнительной цифровой клавиатуры (keypad), когда она находится не в "режиме цифр" (неактивный Num Lock).
А несколько fkey (пропущенных выше) можно получить только с кнопок этой дополнительной клавиатуры (опять же в "нецифровом режиме")
fkey52 - [-]
fkey54 - [5]
fkey56 - [+]
И, наконец, "микрософтовская" клавиатура имеет еще три дополнительные кнопки, на которые по умолчанию тоже назначены fkey'и
fkey62 - ["окошко" слева]
fkey63 - ["окошко" справа]
fkey64 - ["меню"]
Остальные fkey'и fkey65 - fkey96 зарезервированы для дальнейших расширений клавиатуры. То есть, они не назначены ни на какие клавиши, и не генерируют никаких последовательностей.
Можно отметить, что существует еще одна клавиша, которая выдает последовательность кодов, и которую можно также отнести к "функциональным".
Обозначается она btab (back tab) и назначена по умолчанию на [Tab]+[Shift]. Однако, в отличии от fkey он всегда выдает цепочку "Esc[Z", которую изменить нельзя (разве что, подправив "исходники").
Ну и, наконец, сами последовательности, которые по умолчанию соответствуют fkey'ям, можно посмотреть в "Приложение 3. Функциональные клавиши".
Эти клавиши вызывают немедленное переключение на другой "виртуальный терминал".
В таблице "раскладки клавиатуры" они называются scr01, scr02 ... scr16 (от слова screen). Понятно, что цифры в конце названия обозначают номер "виртуального терминала".
Кроме того существует еще одна клавиша - nscr (next screen) которая переключает syscons просто на следующий терминал.
По умолчанию, переключатели scr01 - scr10 назначены на комбинации клавиш [F1]+[Alt] - [F10]+[Alt], а оставшиеся scr11 - scr16 на комбинации [F1]+[Alt]+[Shift] - [F6]+[Alt]+[Shift]. Точнее, на клавиши [F1]-[F10] "при активном модификаторе alt" и "активном модификаторе shift", поскольку модификаторы alt и shift только "по умолчанию" находятся на одноименных клавишах и могут быть "переназначены" на любые другие.
Надо также отметить, что для того, чтобы реально переключиться на другой "виртуальный терминал", надо, чтобы он действительно существовал (как это описано в "Виртуальные терминалы") и был активным, то есть, чтобы на нем была запущена хоть какая-нибудь задача (getty, шелл, X-сервер и т.п.)
Клавиша nscr по умолчанию находится на физической клавише [Print Screen].
Это клавиши, которые не выдают никакие коды, а вызывают немедленно какое-нибудь действие, типа "рестарт компьютера", "запуск встроенного отладчика" и т.п.
Прежде всего, клавиша, которая имеет смысл только для самого syscons. Это slock (scroll lock). Она переводит syscons в особый режим - просмотра буфера "истории" (history buffer). Как уже говорилось (в "Основные возможности syscons: Буфер экрана (history buffer)") каждый "виртуальный терминал" имеет буфер экрана, который больше чем физический экран (по умолчанию - 100 строчек или 4 обычных 25-строчных экрана). То есть, он помнит 100 строчек (если, конечно, вы не меняли этот размер) из которых мы видим только последние 25. В режиме просмотра буфера вы можете посмотреть остальные предыдущие строчки.
В этом режиме работают только клавиши [стрелка вниз], [стрелка вверх], [Page up], [Page Down], [Home] и [End]. Естественно, при этом ваш экран как бы "отсоединяется" от машины, то есть, если какая-то программа в это время что-нибудь выводит, весь ее вывод копится внутри системы и не попадает на экран.
А вот клавиши (кроме перечисленных выше) обрабатываются в обычном порядке.
Эта клавиша "фиксирующаяся" (как и другие Lock'и), то есть, чтобы попасть обратно в нормальный режим, надо нажать ее повторно.
По умолчанию находится на физической клавише [Scroll Lock].
Клавиша boot вызывает немедленную перезагрузку системы (как при вводе команды reboot).
Изначально находится на комбинации - [Ctrl]+[Alt]+[Delete].
Клавиша debug включает "ядерный" отладчик (встроенный в ядро). Естественно, для того, чтобы он включился у вас должно быть ядро с встроенным отладчиком (то ядро, которое ставится при инсталляции, отладчика в себе не имеет), иначе вы просто получите сообщение на самом первом "виртуальном терминале" - "No debugger in kernel".
По умолчанию эта команда "повешена" на две комбинации - [Ctrl]+[Alt]+[Esc] и [Ctrl]+[Print Screen].
Клавиша susp имеет значения только для "лаптопов". Она дает команду устройству apm (Advanced Power Management) "пригасить" компьютер.
Поскольку, это довольно "экзотическая" команда, по умолчанию, она не присвоена никакой физической клавише.
И, наконец, надо сказать о клавише Compose. С ее помощью можно получить любой код, набрав его цифрами на клавиатуре. Для этого нужно прижать ее (как shift или ctrl) и набрать на дополнительной цифровой клавиатуре нужное число. После отпускания Compose syscons выдаст соответствующий код.
Особенность этой клавиши в том, что это именно физическая клавиша (со скан-кодом 56 - левый [Alt]) и она не может быть "переприсвоена" через таблицу раскладки. Кстати, и цифры с "дополнительной цифровой клавиатуры" "снимаются" на уровне скан-кодов. То есть, если вы даже поменяете их значения в таблице раскладки, для Compose они останутся обычными цифрами, причем независимо от состояния каких-либо модификаторов.
Несколько примеров изменения назначения клавиш.
Как я уже говорил, при загруженной (или встроенной) русской раскладке клавиатуры клавиша [CapsLock] начинает работать как "переключатель языка" - русский/латинский.
Если вам это не нравится, можно изменить раскладку так, чтобы [CapsLock] всегда оставалась CapsLock'ом. А "переключатель языка" присвоить какой-нибудь другой клавише или комбинации клавиш.
Первым делом вернем CapsLock на место. Для этого надо в файле раскладки найти строчки, в которых содержится значение alock.
058 alock clock clock clock clock clock clock clock O
084 alock alock alock alock alock alock alock alock O
186 alock clock clock clock clock clock clock clock O
212 alock alock alock alock alock alock alock alock O
Строчки со скан-кодами 84 и 212 нас мало интересуют. (Честно говоря, я не знаю - что это за клавиша.) А вот строчки 58 и 186 - это как раз клавиша [CapsLock] в "нормальной" и "альтернативной" (русской) клавиатурах.
Как видите, без модификаторов (shift, ctrl или alt) она действует как alock (alt group), а с любым из модификаторов - как clock (caps lock).
Просто исправьте alock на clock.
058 clock clock clock clock clock clock clock clock O
186 clock clock clock clock clock clock clock clock O
Теперь надо придумать - чем мы будем переключаться на русскую клавиатуру и обратно.
Если у вас есть незадействованные клавиши, например, "окошки" на "микрософтовской" клавиатуре, то можно занять одну из них. Это достаточно просто и я не буду подробно рассматривать этот случай. Можете посмотреть пример с клавишей Meta - это делается практически так же.
Если же свободных клавиш нет, то можно переключатель alock "подвесить" на какую-нибудь комбинацию клавиш. Например - "два шифта". То есть, каждая кнопка [Shift] должна работать как shift, а если их нажать одновременно, должен получится alock.
Для начала, найдем строчки в которых есть слово shift
042 lshift lshift lshift lshift lshift lshift lshift lshift O
054 rshift rshift rshift rshift rshift rshift rshift rshift O
170 lshift lshift lshift lshift lshift lshift lshift lshift O
182 rshift rshift rshift rshift rshift rshift rshift rshift O
Учтем, что даже при "одновременном" нажатии этих кнопок, все равно одна из них будет нажата чуть-чуть раньше. Поэтому, та кнопка которая будет нажата раньше, переведет клавиатуру в состояние shift, при котором выбирается вторая колонка значений (точнее, все четные), а уже вторая - должна выполнить нужное нам действие.
Если мы хотим, чтобы последовательность нажатия была не важна, нам надо исправить значение и для клавиши lshift во второй колонке (считаем, что правый shift мы нажали чуть раньше) и для клавиши rshift (на тот случай, если первым будет нажат левый shift).
042 lshift alock lshift lshift lshift lshift lshift lshift O
054 rshift alock rshift rshift rshift rshift rshift rshift O
170 lshift alock lshift lshift lshift lshift lshift lshift O
182 rshift alock rshift rshift rshift rshift rshift rshift O
Дело сделано.
Модификатор meta в раскладке клавиатуры отсутствует. Если вам кажется, что он будет вам очень полезен, надо найти подходящую клавишу и присвоить ей значение meta.
Если у вас "микрософтовская" клавиатура, то под met'у можно задействовать одну из кнопок с "окошками", напрмер - левую. Если вы не знаете ее скан-код (вообще-то, это 105), можно найти ее по значению - "по умолчанию" она имеет значение fkey62
105 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 O
Просто замените значения во всех колонках на meta
105 meta meta meta meta meta meta meta meta O
Если у вас русская раскладка клавиатуры, то не забудьте ту же операцию проделать для той же кнопки в "альтернативной" части раскладки
233 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 O
Если же "микрософтовских" кнопок у вас нет, то можно под met'у выделить одну из "парных" кнопок ([Shift], [Ctrl] или [Alt]). Поскольку, для syscons нет разницы - какую из них вы нажмете для получения нужного эффекта, можно, напрмер, в качестве alt оставить только левую кнопку (та строчка, где значения - lalt), а правую кнопку (значения - ralt) изменить на meta.
Если вам не нравится, что ваш компьютер можно перегрузить в любой момент, нажав "магическую комбинацию" Ctrl+Alt+Del, найдите в раскладке все строчки со словом boot (учтите, что клавиш Del две - одна над стрелками, а другая на "дополнительной цифровой клавиатуре").
083 del '.' '.' '.' 174 174 boot boot N
103 fkey61 fkey61 fkey61 fkey61 fkey61 fkey61 boot fkey61 O
211 del '.' '.' '.' 174 174 boot boot N
231 fkey61 fkey61 fkey61 fkey61 fkey61 fkey61 boot fkey61 O
Просто замените слово boot на что-нибудь другое - nop ("пустая" клавиша) или bel ("писк").
Кстати, если вы боитесь, что враги могут восстановить эту клавишу и все-таки "отправить в перезагрузку" вашу машину, в последних версиях syscons появилось более радикальное средство.
Надо пересобрать ядро с "option SC_DISABLE_REBOOT", и куда бы вы (или злоумышленники) ни назначили значение boot, оно просто не окажет никакого действия на машину.
Программа vidcontrol
Программа vidcontrol служит для управления параметрами syscons, которые относятся к отображению на дисплее выводимой информации.
Полное ее описание можно посмотреть в соответствующем man'уале (man vidcontrol), а "краткую сводку" команд вы получите, если запустите ее без каких-либо аргументов.
Я только опишу ее основные функции.
Все поддерживаемые режимы отображения имеют свои условные названия, типа VGA_80x25, VGA_80x30 и т.д. (как вы догадываетесь, первая цифра - количество знаков в строке, вторая - количество строк). Полный список их есть в "краткой сводке".
Для смены режима надо просто выполнить команду
vidcontrol "название режима"
например
vidcontrol VGA_80x30
Для загрузки шрифтов используется ключ -f (от слова font). Поскольку, видеокарта может использовать три разных типа шрифтов (необходимых для разных "режимов отображения"), то ключ -f требует два аргумента
vidcontrol -f "тип шрифта" "имя файла со шрифтом"
Тип шрифта может быть 8x8, 8x14 и 8x16.
Файл со шрифтом может быть просто двоичным файлом, или содержать в себе те же данные но в формате uuencode. Если вы не укажете полный путь для имени файла, а просто короткое имя (напрмер - myfont), то vidcontrol будет искать
- файл myfont в текущей директории
- файл myfont.fnt в текущей директории
- файл myfont в директории /usr/share/syscons/fonts
- файл myfont.fnt в директории /usr/share/syscons/fonts
естественно, загрузит первый, который найдет.
Для загрузки screenmap используется ключ -l (от слова load ?).
vidcontrol -l "имя файла с таблицей"
Как и для шрифтов, файл screenmap может быть просто двоичной таблицей (из 256 байт) или содержать в себе те же данные но в формате uuencode. Если вы не укажете полный путь для имени файла, а просто короткое имя (напрмер - mymap), то vidcontrol будет искать
- файл mymap в текущей директории
- файл mymap.scm в текущей директории
- файл mymap в директории /usr/share/syscons/scrnmaps
- файл mymap.scm в директории /usr/share/syscons/scrnmaps
естественно, загрузит первый, который найдет.
Если вам не нужна никакая перекодировка, используйте ключ -L
vidcontrol -L
по этой команде, vidcontrol сам сделает таблицу, которая ничего не меняет.
Во-первых, надо заметить, что syscons позволяет задавать две пары цветов (символ/фон) - для символов с "нормальными" атрибутами и для символов с атрибутом "реверс" (светлый фон, темный символ).
Для установки цветов "нормального" режима никаких ключей не нужно. Команда выглядит просто
vidcontrol "цвет символа" "цвет фона"
например
vidcontrol white black
Для цветов "реверсного" атрибута используется ключ -r (от слова reverse), например
vidcontrol -r black white
Вы можете также поменять цвет "бордюра" (полоски по краям экрана), с помощью ключа -b (border), например
vidcontrol -b gray
Список названий цветов можно посмотреть с помощью команды vidcontrol show
Однако, хочу заметить, что если вы используете какие-нибудь "коммандеры" (Deco, Midnight Commander и т.п.), то установки цветов, скорее всего работать не будут. Эти программы любят перекрашивать экран по своему усмотрению и при первой же "перерисовке" своих панелей "собьют" все ваши цвета.
С помощью vidcontrol можно поменять "тип курсора". Для этого служит ключ -c (cursor)
vidcontrol -c "тип курсора"
Тип курсора может быть только - normal, blink и destructive.
Замечу, что esc-последовательности (см Команды syscons) предоставляют несколько более гибкие возможности по изменению курсора.
Также vidcontrol поможет вам изменить "время простоя", по истечению которого syscons запустит screen saver. Для этого служит ключ -t (timeout)
vidcontrol -t "время в секундах"
Кстати, если поставить время - 0, то saver вообще не будет запускаться.
Напомню, что поменять тип screen saver'а программа vidcontrol, не может. Если вы хотите поменять screen saver, вам придется
- сначала "выгрузить" текущий модуль screen saver'а командой modunload
- Если вы не знаете - как называется модуль, который вам надо выгрузить, воспользуйтесь командой modstat.
- загрузить новый модуль из тех, которые имеются в директории /lkm, командой modload.
Установки шрифтов, таблицы перекодировки, типа курсора и "время простоя" действуют на все "виртуальные терминалы". Поэтому, совершенно не важно - с какого из этих терминалов вы их будете менять.
А "режим отображения" и цвета могут быть разными на разных терминалах. Поэтому, изменение этих режимов действуют только на текущий "виртуальный терминал".
( В старых версиях syscons есть "глюк" с цветом "бордюра". Он устанавливается индивидуально для каждого виртуального терминала, но syscons "забывает" его менять при переключении между терминалами. Выглядит это так, как будто эта установка действует на все виртуальные терминалы.)
Однако, если вы хотите поменять эти параметры для другого терминала или, например, написать "скрипт" который выполнит нужные установки для всех доступных "виртуальных терминалов", могу дать небольшую подсказку.
Установку "режима отображения" vidcontrol выполняет для того терминала, который является для него stdin ("входной поток"). А вот цвета меняются с помощью вывода соответствующих команд в stderr ("выходной поток для сообщений об ошибках").
В обычном случае и stdin'ом, и stderr'ом является текущий терминал. Но и тот и другой "поток" можно перенаправить.
Например, для изменения "режима отображения" на терминале /dev/ttyv0 (если вы находитесь в другом терминале), можно выполнить команду
vidcontrol VGA_80x30 < /dev/ttyv0
а для изменения цветов на том же терминале
vidcontrol green red > /dev/ttyv0 2>&1
Естественно, если вам надо поменять свойства для нескольких терминалов, придется выполнить соответствующую команду несколько раз, меняя номер терминала.
Русификация syscons
Рассмотрим подробнее в чем заключается процесс русификации syscons. Еще раз напомню, что все основные настройки syscons делаются автоматически при старте системы. Вам необходимо только правильно указать параметры в файле /etc/rc.conf.
Итак, инструкция (FreeBSD Handbook) предлагает добавить в rc.conf строчки:
keymap=ru.koi8-r
keychange="61 ^[[K"
scrnmap=koi8-r2cp866
font8x16=cp866b-8x16
font8x14=cp866-8x14
font8x8=cp866-8x8
Начнем с последних строчек:
font8x16=cp866b-8x16
font8x14=cp866-8x14
font8x8=cp866-8x8
Они определяют аргументы для утилиты vidcontrol, которая должна будет загрузить в видео-контроллер новый набор шрифтов (подробнее в описании vidcontrol). Почему рекомендуют шрифты cp866, хотя русификация FreeBSD подразумевает кодировку koi8-r, немного позднее.
Напомню, что для стандартного режима "режима отображения" (25 строк) необходим только шрифт с матрицей 8x16. Остальные два понадобятся только в том случае, если вы будете использовать другие режимы (30, 43, 50 строк).
Кстати, если вы заглянете в /usr/share/syscons/fonts, то обнаружите, что шрифты в кодировке cp866 для матрицы 8x16 имеют три варианта - cp866, cp866b и cp866c (такой же набор имеется и для кодировки koi8-r). Причем, cp866 и cp866c немного отличается набором символов - в cp866c часть символов "псевдографики" заменена "экзотическими" буквами. А вот cp866b сильно отличается внешним видом символов, причем и программа инсталляции и большинство руководств по русификации усиленно навязывают именно его. (Мне, например, он не нравится, но это дело вкуса).
Строчка - "scrnmap=koi8-r2cp866" опять же задает аргумент для vidcontrol, но уже не для установки шрифтов, а для загрузки в syscons таблицы перекодировки (screenmap). Поскольку, шрифты рекомендуется поставить для кодировки cp866, то для того, чтобы тексты в кодировке koi8-r отображались правильно, необходима эта таблица - "из koi8-r в cp866".
Возникает вопрос - почему нельзя поставить шрифты сразу для кодов koi8-r и обойтись без какой-либо screenmap?
На самом деле - можно. Можно поставить шрифты для koi8-r, тем более, что в наборе шрифтов они есть и для всех трех матриц (а для 8x16, даже в нескольких вариантах - koi8-r, koi8-rb, koi8-rc).
Тогда соответствующие строчки в rc.conf будут выглядеть
scrnmap="NO"
font8x16=koi8-r-8x16
font8x14=koi8-r-8x14
font8x8=koi8-r-8x8
Однако, не торопитесь это делать. Дело в том, что шрифты cp866 лучше подходят для видеокарты "писишки".
Каждый символ на экране рисуется в матрице шириной в 9 точек, при этом "перерисовать" (загружая шрифты) можно только 8 из них. Девятая колонка служит для того, чтобы символы, если они даже полностью занимают все восемь "программируемых" колонок, все-таки не сливались между собой. С другой стороны есть такие символы псевдографики, которые предназначены для рисования рамочек и просто горизонтальных линий. Для них, наоборот, желательно, чтобы они сливались, иначе горизонтальные линии будут выглядеть пунктирными.
Видео-контроллер, учитывает это и отрисовывает девятую колонку по-разному. Для обычных символов эта колонка остается пустой (независимо от содержимого остальных восьми колонок), а для псевдографических - девятая колонка точек просто повторяет восьмую.
Проблема в том, что видео-контроллер имеет свое мнение о том, какие символы являются псевдографическими (и, следовательно, должны сливаться в сплошную линию), а какие - нет. Псевдографическими он считает символы с кодами в диапазоне C0 - DF.
Так вот, в шрифтах cp866 "псевдографика" действительно попадает в этот диапазон (и горизонтальные линии рисуются слитно), а в koi8-r - нет (и те же линии рисуются пунктиром).
Другая проблема при использовании шрифтов koi8-r может возникнуть, если вы захотите включить поддержку "мыши" в syscons.
Дело в том, что для отрисовки графического курсора syscons перепрограммирует шрифты для четырех символов (коды D0 - D3). В шрифтах cp866 эти коды попадают на псевдографические символы (причем, редко используемые), а в koi8-r - на буквы "п я р с". Естественно, если вы используете шрифты koi8-r, при "мышевождении" эти буквы на экране портятся.
Правда, эта проблема имеет и другое решение. В последних версиях syscons, коды, используемые под "мышиный" курсор, можно изменить, пересобрав ядро системы.
Поэтому, тот же "FreeBSD Handbook" советует для русификации первым делом пересобрать ядро, добавив в файл конфигурации
option "SC_MOUSE_CHAR=0x03"
Хороший совет, если не обращать внимание на то, что сама по себе пересборка ядра - задача более сложная (и требует значительно больше времени), чем правка пары строк в rc.conf. (Кстати, и 0x03 - не очень удачная замена).
Вот эти причины и делают более предпочтительными шрифты cp866, хотя эффект от них чисто косметический.
Первая строчка - "keymap=ru.koi8-r" служит аргументом для утилиты kbdcontrol, которая при старте системы загрузит в syscons "раскладку клавиатуры" ru.koi8-r.
Это раскладка с "альтернативной клавиатурой", в которой "буквенные" клавиши генерируют коды русских букв в соответствии с кодировкой koi8-r.
Естественно, в этой раскладке предусмотрен модификатор для переключения между основной и "альтернативной" клавиатурами. Он "подвешивается" на клавишу [CapsLock]. Если вам это не нравится, вы можете подправить сам файл "раскладки клавиатуры" (смотри пример Переключатель "альтернативной клавиатуры" (Рус/Лат).).
Кстати, если пересобрать ядро с "option RUKEYMAP", то эта раскладка будет "встроена" в syscons "по умолчанию". В этом случае, ее можно не загружать при старте системы.
А вот следующая строчка
keychange="61 ^[[K"
имеет к русификации косвенное отношение.
Дело в том, что загружая новые шрифты, мы меняем свойства терминала. По крайней мере, символы псевдографики перемещаются другой диапазон кодов. Следовательно, описание терминала cons25 в termcap уже не будет полностью соответствовать реальным свойствам syscons. Поэтому, для русифицированного syscons в том же termcap предусмотрено другое описание и, соответственно, другой тип терминала - cons25r. Именно поэтому, те же инструкции по русификации рекомендуют подправить файл /etc/ttys (исправить все cons25 на cons25r) чтобы на каждом виртуальном терминале при старте очередной сессии переменная окружения TERM (которая и сообщает программам тип терминала) по умолчанию получала значение cons25r.
Но описание терминала cons25r отличается от cons25 не только символами псевдографики. Согласно этому описанию, клавиша fkey61 (кнопка [Delete]) должна при нажатии выдавать последовательность кодов "Esc [ K", а не код 177, как это делает syscons (и как указано в описании терминала cons25).
Поэтому, нам рекомендуется "подрегулировать" сам syscons, чтобы его поведение соответствовало описанию в termcap. (Почему нельзя исправить termcap и оставить syscons в покое, я не знаю).
Итак, эта строчка служит только для "подгонки" syscons к его новому описанию в termcap. Она представляет из себя аргумент для программы kbdcontrol, которая заменит для клавиши fkey61 ([Delete]) выдаваемый код.
Рассмотренные рекомендации подразумевают, что вы будете использовать русскую кодировку koi8-r.
Как вы наверное знаете, существует по крайней мере еще две не менее популярные кодировки для русских букв cp866 и cp1251.
Можно ли заставить syscons (и дисплей, и клавиатуру) правильно работать с такими кодировками? Конечно, можно.
Как вы уже поняли, для дисплея необходимо загрузить соответствующие шрифты или screenmap, а для клавиатуры - таблицу "раскладки клавиатуры".
Кстати, для cp866 в системе уже есть все необходимое. То, что есть шрифты cp866 вы уже знаете (только надо убрать дополнительную перекодировку через screenmap), подходящая "раскладка клавиатуры" - ru.cp866, также имеется в /usr/share/syscons/keymaps.
А вот если вы хотите cp1251, то кое-что придется изготовить самостоятельно (или попросить у тех, кто уже сделал). Надо составить "раскладку клавиатуры" (назвать ее, например - ru.cp1251), а для дисплея проще всего делать не новые шрифты, а screenmap. Если у вас используются шрифты cp866, то надо просто изготовить табличку из 256 байт, которая будет транслировать коды из cp1251 в cp866 (пусть она называется - cp1251-cp866) и "подсунуть" ее syscons.
Если вы хотите во время работы переключаться между различными кодировками, надо сделать три командных файла и запускать их в нужный момент.
Например, если не трогать шрифты (пусть это будут шрифты для cp866) и "перенастройку" дисплея делать с помощью screenmap, то эти файлы могут выглядеть так:
- для cp866
kbdcontrol -l ru.cp866
vidcontrol -L
- для koi8-r
kbdcontrol -l ru.koi8-r
vidcontrol -l koi8-r2cp866
- для cp1251
kbdcontrol -l ru.cp1251
vidcontrol -l cp1251-cp866
Напомню только, что и шрифты, и "таблица перекодировки", и "раскладка клавиатуры" действуют на все виртуальные терминалы. Поэтому установить для разных терминалов разные "типы русификации" не получится.
И, наконец, надо заметить, что русификация драйвера терминала, хотя и важная часть русификации всей системы, но не единственная.
Если вы хотите, чтобы все программы нормально понимали русский язык в кодировках отличных от koi8-r, вам придется еще менять переменную окружения LANG (а возможно и некоторые другие). А для cp1251 еще и изготовить "locale" (набор таблиц, описывающих особенности национального языка). Кроме того, некоторые программы (например, чтения/писания почты) возможно придется "отконфигурировать" индивидуально.
Но, для того, чтобы "по быстрому" просмотреть или подправить какой-нибудь документ в "нестандартной" кодировке, скорее всего "сойдет" и описанное решение.
Как достигается "взаимопонимание" программ с терминалом (termcap, terminfo и переменная TERM).
Если в операционной системе Юникс для ввода/вывода можно использовать множество различных терминалов, отличающихся и размером экрана (количество строк и символов в строке), и командами управления экраном, и кодами, которые генерируют клавиши и т.п., то как же одна и та же программа может работать со всем этим "зоопарком"?
Вообще-то, этот вопрос выходит за рамки описания драйвера syscons. Но, поскольку некоторые настройки syscons превращают его в "немного другой" терминал (меняют количество строк на экране, коды, выдаваемые "функциональными" клавишами, и набор символов), то рассмотрим его хотя бы вкратце.
Конечно, любая программа, если она претендует на то, чтобы работать на терминалах разных типов, и не должна знать - как на конкретном терминале очистить экран или какой код выдает клавиша "стрелка вверх".
Для этого в Юниксе существует специальная "база данных свойств терминалов" - termcap. Каждый тип терминала в этой "базе данных" имеет свое название и перечень его "свойств".
Свойствами терминала могут быть
- общие характеристики терминала, например
-
co#80 - количество колонок (в данном случае - 80)
-
li#25 - количество строк (в данном случае - 25)
-
pt - терминал сам отрабатывает код Tab
- ...
- коды, которые нужно выводить на экран для управления курсором, очистки экрана (или части экрана), смены цветов, атрибутов и т.п., например
-
up=\E[A - как сдвинуть курсор вверх
-
cl=\E[H\E[J - как очистить экран
-
mb=\E[5m - как включить "мерцание"
- ...
- коды, которые выдают "специальные" клавиши терминала, например
-
k1=\E[M - код от клавиши F1
-
kD=\177 - код от клавиши Delete
-
ku=\E[A - код от клавиши "стрелка вверх"
- ...
Естественно, названия "свойств" (co, li, up, cl, k1, kD ...) являются стандартом, а вот их значения как раз зависят от конкретного типа терминала.
Программа должна
- при старте выяснить - как называется терминал, на котором ее запустили,
- считать из базы данных все свойства этого терминала
- и в дальнейшей работе "сверяться" с этими данными.
Если ей, например, нужно очистить экран, она должна найти "свойство" cl и вывести на терминал соответствующую последовательность кодов. А если на ввод от терминала пришла последовательность кодов "Esc[M", она должна найти - какому из "свойств" соответствует эта строчка и, обнаружив, что это - k1, сделать вывод, что пользователь нажал клавишу F1.
Надо сразу заметить, что для выполнения всех этих действий существуют различные библиотеки (ncurses, slang и т.п.). Поэтому, если вы возьметесь писать свою программу (типа редактора), то совсем не обязательно самому делать подробный разбор "свойств" терминала и поиск в них различных клавиш.
Главное, что вам нужно знать - чтобы программы (ваши и чужие) правильно работали с терминалом
- нужно "сообщить" программам - как называется ваш терминал в "базе данных"
- описание "свойств" этого терминала должно точно соответствовать реальным свойствам вашего терминала.
Для "сообщения" программам названия вашего терминала служит "переменная окружения" TERM. Если вы работаете с syscons в стандартном "режиме отображения" (25 строчек), эта переменная должна иметь значение cons25 или cons25r (если syscons русифицирован).
Вообще-то, переменная TERM автоматически устанавливается при входе в систему. FreeBSD берет ее значение из файла /etc/ttys или она явно устанавливается в ваших "стартовых командных файлах" (.login, .profile, .cshrc и т.п.).
Но, если вы в ходе работы измените настройки syscons, которые меняют размер экрана, коды "функциональных" клавиш или набор "псевдографики", то реальные свойства syscons уже не будут соответствовать тому описанию, которое хранится в termcap. В этом случае, скорее всего, придется найти "более подходящее" описание терминала в базе данных и, соответственно, поменять значение переменной TERM.
Напомню, что кроме cons25, в termcap имеются описания для того же syscons, но с большим количеством строк (cons30, cons50, cons60) или с другим набором "псевдографики" (cons25r).
В конце концов, если вы не сможете подобрать подходящий терминал из имеющихся в базе, можно подправить какое-нибудь описание из уже имеющихся или (что, пожалуй, лучше) сочинить новое имя и составить для него описание. При этом учтите, что вам совсем не обязательно делать полное описание всех свойств. Существует специальное "свойство" в termcap - tc="имя терминала". Оно означает - "остальные свойства взять из описания указанного терминала". Поэтому, вам достаточно "до-определить" или "пере-определить" только несколько параметров, а в конце указать - tc=cons25 ("остальное взять из описания cons25"). Естественно, если вы опишете в вашем новом терминале какой-нибудь параметр, который и так уже описан в cons25, то использоваться будет именно ваше определение.
Не могу не сказать несколько слов о проблеме соответствия между реальными свойствами терминалов и их описанием в termcap. К сожалению, расхождения случаются довольно часто. И речь не только о клавише Delete в syscons.
Я сталкивался с несоответствием кодов клавиш у программы xterm и ее описания терминала xterm, а уж всевозможные телнеты из других ОС (MS DOS, MS Windows), хотя и берутся изображать из себя ANSI-терминал или VT100, очень редко делают это полностью в соответствии с termcap.
Что делать в таких случаях? Понятно, что для полного соответствия надо либо исправлять описание в termcap, либо "подправлять" саму программу, эмулирующую терминал. Другой вопрос - что лучше?
Если "поднастроить" программу невозможно, то ответ однозначный - исправить termcap или создать в нем новое описание, специально для конкретной программы- эмулятора.
Другое дело, что большинство таких программ можно "перенастроить" через их файлы конфигурации. В этом случае, обычно, лучше подправить свойства программы.
Ну и, конечно, первым делом надо поискать в termcap наиболее подходящее описание, возможно оно там уже есть.
И, наконец, ответ на вопрос - "что лучше" может отличаться в зависимости от конкретных условий.
Если речь идет о вашем персональном компьютере, куда посторонние не заглядывают, то - "без разницы" как вы добьетесь соответствия.
Если это машина, на которую многие ходят телнетом (или xterm'ом), да еще и с разных платформ, то исправление termcap под одних клиентов может оказаться "багом" для других. Понятно, что в этом случае лучше его не трогать.
А вот если речь идет об организации, в которой всем пользователям ставится одна и та же программа для доступа к Юникс-серверу (да еще и выяснится, что программу уже поставили на многие рабочие станции, а она не "подстроена"), то может оказаться проще все-таки изменить termcap.
Короче, решайте сами :)
Кроме termcap существует еще одна "база данных свойств терминала" terminfo. Ее назначение точно такое же как и у termcap (просто они "зародились" в разных ветвях Юникса). Отличается она только названиями "свойств" и форматом (termcap содержит все описания в одном большом текстовом файле, а terminfo хранит каждый тип терминала в отдельном файлике и в двоичном формате).
В стандартной поставке FreeBSD она отсутствует и, как правило, необходимости в ней нет.
Но, если вам придется работать с другими платформами Юникса или какая-нибудь программа пожелает брать данные именно из terminfo (а не удовлетворится termcap'ом), то воспользуйтесь утилитой tconv (смотри man tconv). Она выполняет "конвертирование" из termcap в terminfo и обратно.
Одно важное замечание: Какое отношение это имеет к X-Window?
Никакого!
Очевидно, что система X Window, которая работает в графическом режиме и сама отрисовывает "в графике" все символы, никак не пользуется шрифтами, загруженными в видеокарту и "таблицей перекодировки" (screen map) драйвера syscons.
Менее очевидно другое - что она, также, не использует и ту часть syscons, которая работает с клавиатурой. Для особенно любознательных, могу сказать, что X-сервер переключает syscons в режим выдачи "сырых" скан-кодов (RAW) и сам переводит их в коды символов по своим правилам.
Поэтому, никакие назначения клавиш, сделанные в таблице раскладки клавиатуры syscons, в X Window не действуют.
Для изменения "раскладки клавиатуры" в X Window пользуйтесь программой xmodmap или модулем xkb.