Заметки о Linux-консоли
2. Что же такое консоль

Алексей Федорчук
[email protected]

Как уже было сказано, в случае настольной машины консоль - это сочетание экрана монитора и клавиатуры (мышь пока оставим в покое). То есть некая физическая реалия, правда? Правда, чистая правда, но - не вся правда.

Потому что одно из первых открытий, которое совершал ранее начинаюший линуксоид, - так называемые виртуальные консоли. Помнится, меня на первой фазе знакомства с Linux'ом они просто привели в восторг (каковой не ослабевает и по сей день). Нынче - не то: пользователь ну очень дружественного к нему дистрибутива, где по умолчанию устанавливается графический вход в систему, имеет шанс просто не узнать о них...

Виртуальные консоли - это (почти) самостоятельные системы (правда, работающие за счет одних и тех же ресурсов), в каждой из которых может быть открыт отдельный сеанс работы пользователя (или пользователей - а даже в самой-рассамой персональной Linux-системе их как минимум двое, включая root'а) и запущен совершенно независимый круг задач (включая оконную истсему X), со своими собственными настройками, наиболее для этого круга подходящими.

По умолчанию в большинстве дистрибутивов Linux активизировано шесть витруальных консолей (во FreeBSD, например, - восемь). Переключение между ними традиционно осуществляется комбинацией клавиш Alt+(F1-F6), клавиша PrtScr перемещает в следующую, после текущей, виртуальную консоль. Кроме того, т.н. Win-клавиши, без которых не обходится ни одна современная "доска", по умолчанию также служат для навигации по виртуальным консолям, позволяя перейти, скажем, к последней использвовшейся, и т.д. - точно не помню, потому что всегда переопределяю их назначение.

Раз уж зашла речь о переопределении - сделаю два маленьких замечания. Во-первых, комбинация Alt+F# для перехода между консолями не являет собой нечто предопределенное божественным промыслом. Ибо зависит исключительно от текущей раскладки клавиатуры, о чем подробнее будет говориться в одной из следующих заметок. Другое дело, что во всех известных мне штатных раскладках для Linux (и FreeBSD) именно эта комбинация задействована под навигацию по консолям (тогда как в раскладках OpenBSD, например, используется комбинация Alt+Control+F#). Но при желании такое положение дел можно изменить (и об этом также речь пойдет впереди) - другой вопрос, нужно ли это делать.

Во-вторых, на некоторых мультимедийных клавиатурах и клавиатурах ноутбучного типа, с которыми мне приходилось сталкиваться, дополнительные win-клавиши категорически отказывались выполнять свои навигационные функции. И вообще, следует помнить, что во всех Unix-системах, вследствие их кросс-платформенности, гарантированно однозначно ведут себя только основные алфавитно-цифровые клавиши, прочие же (стрелки управления курсором, клавиши на цифровом блоке, даже Delete и Backspace) в общем случае отнюдь не обязаны выполнять привычные пользователям связки PC-Windows обязанности.

К слову сказать - именно в этом одна из причин неувядающей популярности текстового редактора vi (и его клонов) среди системных администраторов: в какой бы системе своего подшефного зоопарка он ни оказался, его не оставит чувство уверенности в том, что привычные клавиши командного режима (под которые задействована только основная часть "доски") будут всегда вести себя совершенно однозначно.

Однако я отвлекся, вернемся к нашим консолям. Я уже говорил, что каждая виртуальная консоль может рассматриваться как самостоятельная, индивидуально настроенная, система. С оговоркой - "почти". Потому что в том, что касается пользовательских настроек программного уровня, это верно безусловно: авторизовавшись на второй консоли от лица другого пользователя, мы получаем рабочую среду, свойства которой описаны в его пользовательских конфигурационных файлах. Однако что касается собственно свойств консоли - тут существуют многочисленные ограничения.

Одни из свойств консоли (такие, как цвет шрифта и фона) действительно могут быть настроены независимо для каждой виртуальной консоли. Однако самые важные для пользователя характеристики - шрифт и раскладка клавиатуры, - загружаются для всех консолей сразу. Также на все консоли распространяется и карта соответствия (так называемая mapscreen) кодировки ввода (то есть раскладки клавиатуры) и кодировке вывода (то есть экранного шрифта), о чем подробнее будет говориться в заметке о русификации. Хотя (и это важно) карта соответствия не активизуется одновременно с активизацией произвольной виртуальной консоли. Тем не менее, настроить одну консоль на вывод русских текстов в кодировке KOI8-R, другую - в Windows-кодировке, а третью - так вообще в Unicode, без дополнительных ухищрений (о которых я скажу в свое время) не удастся.

Равноценны ли виртуальные консоли? Чтобы ответить на этот вопрос, придется обратиться к истории. Во времена былинные, до рождества PC, существовали так называемые большие машины, которые жили своей самостоятельной жизнью в специально отведенных заповедниках, куда пользователям путь был заказан. И общались с ними пользователи посредством так назваемых терминалов - локальных мониторов и клавиатур, не имевших собственных вычислительных ресурсов - все они были сосредоточны в главной машине, предоставлявший их терминалам через последовательные линии связи (но нынешнему, COM-порты). Власть пользователей была ограничена, каждый управлял только своими данными, и не имел (теоретически) никакой возможности повлиять на систему в целом.

Однако имелся среди пользователей один умник, который всех напаривал (пардон, всем управлял). Он назывался root-оператором (или просто root'ом), обладал всевластием в масштабе данной системы и реализовывал это всевластие с собственного, всевластного, терминала. Вот этот-то терминал всевластия и назывался консолью в предначальном смысле этого слова.

Казалось бы, консоль - точно такой же терминал, что и любой пользовательский. Однако root, обладая тайным знанием - своим собственным паролем, от которого его всевластие и зависело, мог засадить в систему все хитрости свои, все меры защиты, и все такое. В частности - запрещение авторизоваться root'ом с любого другого терминала, кроме консоли. А для напаривания (опять пардон, управления) пользователями он делал так, чтобы на консоль выводились все системные сообщения (в том числе сообщения об ошибках и информация об авторизации пользователей), почему консоль root'а и получила название системной.

Однако PC уравняла пользователей в правах не хуже дивайса полковника Кольта. И хотя даже на персоналке в любой Unix-системе по прежнему имеется всевластный root, в роли его обычно выступает сам пользователь настольной машины, И в его праве предоставить самому себе возможность авторизоваться root'ом или обычным пользователем с любой из виртуальных консолей (случай ущемления прав в домашних многопользовательских системах не рассматриваем, это - дело семейное). Можно организовать даже автоматический беспарольный вход в систему на любой из активизируемых при загрузке консолей.

Другое дело, что и тут можно зарезервировать для целей управления какую-либо одну консоль (запретив с остальных авторизацию root'ом). А также отвести отдельную консоль для вывода системных сообщений и сообщений об ошибках. Однако от рождения все виртуальные консоли равноправны. Несколько "равнее" других только текущая (в данный момент) консоль - именно на нее по умолчанию выводятся системные сообщения (если вообще вывод их не подавлен, как часто делается на настольных машинах). Разумеется, она же служит и для отображения ввода, если не используются специальные приемы перенаправления (но это - тема разговора о командных оболочках).

Еще одно отличие текущей консоли от всех прочих проявляется при запуске с нее какой-либо программы графического режима, например, Иксов (а при этом в первую очередь запускается вполне конкретная программа - X-сервер) или приложений, основанных на библиотеке SVGAlib (последних, правда, немного, кроме знаменитого Doom'а это, пожалуй, только графический вьювер zgv). В этом случае текущая консоль просто блокируется вплоть до выхода из Иксов (или из SVGAlib-программы). А для запушенной с нее программы активизируется новая виртуальная консоль (об активизации новых консолей - в следующем разделе), перехватывающая на себя и ввод, и вывод, то есть становящаяся текущей. Блокируется при этом и традиционная клавишная комбинация перехода - Alt+F#. Чтобы вернуться в какую-либо из виртуальных консолей, свободную от Иксов, требуется уже три пальца - Alt+Control+F# (не ради ли единообразия в OpenBSD она же используется для навигации по виртуальным консолям вообще?).

Забегая вперед, отметим, что использующая графику программа, запущенная из консоли с поддержкой графического режима через frame buffer (кучеряво получилось, впредь для этого попробую использовать термин фрейм-консоль), занимает только консоль текущую. Правда, программ таких (пока?) очень мало...

Уравнение в правах консоли и терминалов привело к тому, что ныне термины (виртуальная) консоль и (виртуальный) терминал часто выступают в качестве синонимов. И это, товарищи, почти правильно - хотя только для настольных персоналок. И то, следует помнить, что если терминал на PC - всегда виртуален, то консоль имеет и физическое вполощение - монитор и клавиатуру, физически прикрученные к данному системному блоку. Можно сказать, что файл устройства консоли (/dev/console) выступает в качестве реинкарнации активного в данный момент виртуального терминала.

Кроме того, слово терминал служит для обозначения программ эмуляции текстовой консоли с ее командной оболочкой (а в следующем разделе будет показано, что консоль в большинстве случаев тесно сопряжена с шеллом) в графическом режиме оконной системы X. Однако такие программы правильнее так и называть - эмуляторами терминала (или терминальными окнами). И вообще, к Linux-консоли они отношения не имеют, да и к Linux'у вообще - лишь косвенное, так как являют собой обычное Иксовое приложение. Речи о них в этих заметках не будет.

В заключение - несколько номенклатурных замечаний. Как известно, все, что существует в Unix-системе статически - суть файлы, в том числе физические или виртуальные устройства. И консоли тут - не исключение, каждой из них соответствует свой файл в каталоге /dev. Выше упоминалось, что физической консоли соответствует файл /dev/console, имеющий идентификатор группы устройств, так называемый старший (major) номер устройства, равный 5, и идентификатор конкретного устройства, младший (minor) номер, равный 1.

Виртуальные консоли в Linux'е ранее ставились в соответствие файлам вида /dev/tty??, где ?? соответствовал порядковому номеру устройства и мог изменяться в пределах от 0 до 63 (почему - будет подробно рассказано в следующей заметке), хотя в реальности их могло быть меньше. Старший номер всех их был равен 4, младший - был идентичен номеру устройства.

В большинстве современных Linux-дистрибутивов используется так называемая файловая система устройств (devfs), вносящая существенные коррективы в номенклатуру последних. Согласно ей, файлы устройств виртуальных консолей сгруппированы в каталоге /dev/vc/ (в некоторых системах имя каталога, в который монтируется devfs, может быть иным). И именуются они просто своими номерами - /dev/vc/1, dev/vc/2 и так далее, каковые и выступаю заодно в качестве младших номеров устройств (старший номер остается прежним - 4).

Во всех известных мне дистрибутивах, задействующих devfs, используется также демон devfsd, обеспечивающий обратную совместимость с файлами устройств в старой номенклатуре (собственно, дело не только в поддержке старой номенклатуры, но это выходит за рамки сегодняшней темы). И потому в каталоге /dev можно обнаружить и файлы устройств виртуальных консолей типа /dev/tty??. Однако это - лишь символические ссылки на файлы реальных устройств, в чем легко убедиться командой

$ ls -l /dev/tty*

которая выведет список вида

lr-xr-xr-x	1 root	root		4 Июн  8  2003 /dev/tty0 -> vc/0
lr-xr-xr-x	1 root	root		4 Июн  8  2003 /dev/tty1 -> vc/1
lr-xr-xr-x	1 root	root 	5 Июн  8  2003 /dev/tty10 -> vc/10
lr-xr-xr-x	1 root	root 	5 Июн  8  2003 /dev/tty11 -> vc/11

и так далее.

Однако теоретически при использовании devfs наличие файлов устройств старого образца отнюдь не обязательно и зависит от настроек демона devfsd в файле /etc/devfsd.conf. А, например, в моей самостройной системе я вообще отказался от обратной совместимости, и никаких tty?? в ней нету. От чего, к слову, никаких неудобств я не испытываю. И во всех остальных заметках молчаливо подразумечается использование файловой системы устройств.

Вот и все общие слова, которые я хотел сказать о консолях. В следующей заметке разговор пойдет о том, сколько же их, консолей, бывает в Linux-системе.