Алексей Федорчук
2004.11.24
Установщик DFBSD через свое меню конфигурирования позволяет настроить многие параметры системы, но - далеко не все. И среди отсутствующих настроек могут оказаться важные для пользователя. Коему, таким образом, придется прибегнуть к ручному их определению. Должен сразу предупредить - пользователи FreeBSD найдут здесь мало для себя нового. Заметка рассчитана в основном на тех, кто дела с BSD-системами не имел.
Для ручной настройки любой системы требуется представление об общей схеме
ее загрузки. В DFBSD, как это и положено представителю BSD-семейства,
принята загрузка в BSD-стиле. Он характеризуется наличием главного
стартового сценария - /etc/rc, запускающего сервисы (иначе
именуемые демонами),
определяемые собственными скриптами из подкаталога /etc/rc.d.
А какие именно сервисы запускаются - описывается в главном
конфигурационном файле - /etc/rc.conf.
При этом стартовые скрипты отдельных сервисов могут иметь (и, как правило, имеют) еще и собственные конфиги. Однако нам они пока не понадобятся - все, что описано в этой заметке, достигается редактированием конфига главного.
При установке DFBSD в каталог /etc на диске записывается
некий умолчальный /etc/rc.conf, строки которого запускают
лишь минимально необходимое для работы системы количество демонов,
позволяющих получить клиентский доступ к сетевой файловой системе NFS и
запускать SSH - защищенный шелл для удаленного доступа. Практически все
остальные сервисы запрещены - или явным образом, или по умолчаниям. При
настройке же через меню конфигурирования installer'а в
/etc/rc.conf, в дополнение к умолчальным, дописываются
отдельные строки (отмеченные явным образом соответствующими
комментариями), разрешающие запуск некоторых дополнительных сервисов, или
уточняющие параметры, например, системной консоли (шрифт и раскладка
клавиатуры, если таковые определялись через installer.
Откуда берутся стартовые умолчания? А берутся они из файла
/etc/defaults/rc.conf, в котором описаны всевозможные (и все
возможные) стартовые сервисы и их параметры. Файл этот не предназначен для
прямого редактирования (хотя оно и не запрещено атрибутами его доступа).
Вместо этого полагается отыскать в нем строки, относящиеся к нужным
сервисам, перенести их в /etc/rc.conf и разрешить их запуск
(или, напротив, запретить, если оный разрешен по умолчанию, но в данном
случае не нужен). Уточняющие опции сервисов также берутся из
/etc/defaults/rc.conf, переносятся в /etc/rc.conf
и им приписываются нужные значения.
В общем виде это делается, например, так: в одной виртуальной консоли (на
которой нужно зарегистрироваться как root или получить его права командой
su) в текстовом редакторе (в DFBSD для этого предназначен
ee, но можно воспользоваться и классическим vi
открывается файл /etc/rc.conf, в другой (на ней можно
авторизоваться и обычным пользователем) дается команда
$ less /etc/defaults/rc.conf
И нужные строки из последнего просто переносятся в первый, где и
модифицируются должным образом. Не вредно при этом задействовать и третью
пользовательскую консоль - для чтения man (5) rc.conf. А как
все это выглядит на практике - мы сейчас увидим.
Перетаскивать текстовые фрагменты из консоли в консоль удобнее всего с
помощью мыши (собственно, для этого она и предназначена в текстовом режиме
любого Unix'а). Однако BSD Installer в современном своем виде (в отличие
от sysinstall FreeBSD) не предусматривает включения службы
консольной мыши, и по умолчаниям из /etc/defaults/rc.conf
таковая запрещена. Так что с настройки мыши мы и начнем.
За работу мыши в консоли DFBSD (как и во FreeBSD) отвечает специальный
"мышиный" демон - программа /usr/sbin/moused. Отыскиваем в
/etc/defaults/rc.conf строки, к нему относящиеся - в данном
случае удобно воспользоваться командой типа
$ grep mouse defaults/rc.conf
и смотрим на вывод результата поиска:
moused_enable="NO" # Run the mouse daemon.
moused_type="auto" # See man page for rc.conf(5) for available settings.
moused_port="/dev/psm0" # Set to your mouse port.
moused_flags="" # Any additional flags to moused.
mousechar_start="NO" # if 0xd0-0xd3 default range is occupied in your
# start like mousechar_start=3, see vidcontrol(1)
Из коего, собственно, и становятся очевидными дальнейшие действия. Для
начала следует разрешить запуск мышиного демона - для чего в
/etc/rc.conf вносится строка
moused_enable="YES"
Команда /usr/sbin/moused (а включить поддержку мыши можно и
из командной строки, но только в данном сеансе работы - об этом будет
сказано чуть позже) в общем случае требует двух опций - указания протокола
(это то, что описывается строкой moused_type) и порта
подключения (сериального, PS/2, USB - шинные мыши,, скорее всего, из
употребления уже вышли). При описании протокола строка
moused_type="auto"
подойдет для всех, насколько мне известно, современных грызунов с
разъемами PS/2 или USB. Причем для последних значение auto -
единственно допустимое, тогда как для первых можно указать точно -
ps/2. А вот для сериальных (и тем более шинных) мышей
протокол следует задать в явном виде. Каком - смотрим в
man (5) rc.conf или man (8) moused (я, грешным
делом, об этих существах уже забыл).
Явное указание порта также необходимо только для сериальных и шинных мышей ("Вы знаете тетю Маню? - Я знаю тетю Маню. - Вы верите тете Мане? - Я верю тете Мане. - Так вот, у нее и спрашивайте..."). Хотя если указать
moused_port="/dev/psm0"
для PS-пополамной животины, или
moused_port="/dev/ums0"
для ее USB-родственницы, вреда не будет ни малейшего.
В строке
moused_flags=""
можно задать разнообразные опции, предусмотренные для команды
/usr/sbin/moused, как то: эмуляцию средней кнопки для
двухклавишных моделях (на скроллирующих мышах колесико работает аналогично
средней кнопке), скорость реакции, акселерацию при перемещении курсора и
так далее. За подробностями - опять же к Мане, к Мане, к Мане...
Ну а о строке
mousechar_start="NO"
поговорим, когда речь зайдет о русификации системы.
Подредактировав /etc/rc.conf вышеописанным образом, после
перезагрузки мы получаем работающую консольную мышь. А что делать, если
указательных устройств - два, как это было в моем случае? Потому как
устанавливал я DFBSD на ноутбук, снабженный штатным тачпадом (которым
практически не пользуюсь, но чтобы он не работал - так ведь западло) и
внешней USB-мышью.
Со встроенным тачпадом все очень просто - с точки зрения протокола это,
скорее всего, обычная PS-пополамная мышь, такая же, что подключается в
качестве внешнего устройства. И чтобы его задействовать, нужно выполнить
аналогичные действия, а именно: вписать в /etc/rc.conf строки
moused_enable="YES" moused_type="auto"
А с USB-мышью - еще проще. Ее активизация, строго говоря, не требует даже
указания порта - более того, при наличии двух указательных устройств оно
ничего не даст. А всего-то и нужно - активизировать при старте системы
демон USB-устройств (usbd). Для чего отыскиваем в
/etc/rc.conf строку
usbd_enable="NO"
и умолчальное значение заменяем на YES. И теперь после
перезагрузки можно пользоваться любым из наличных указательных устройств
на выбор.
Все это прекрасно - скажете вы мне. Но не лениво ли вбивать руками
указанные строки в наш /etc/rc.conf? Что я могу ответить на
это? Конечно же лениво, гораздо проще было бы перетащить их мышью из
/etc/defaults/rc.conf. Но ведь мышь-то еще не настроена? Не
беда, включить поддержку мыши в текущем сеансе также труда не составит.
Для этого перво-наперво нужно активизировать мышиный курсор. Делается это
командой vidcontrol, управляющей в системной консоли DFBSD
(как и во FreeBSD) выводом на экран:
$ vidcontrol -m on
Это - интерактивный эквивалент строки
usbd_enable="YES"
из главного конфигурационного файла. А теперь из командной строки
запускаем программу /usr/sbin/moused, задавая в качестве ее
параметров протокол (тип) и порт. Для мыши PS/2 (и того же встроенного
тачпада) это будет выглядеть так:
$ moused -t auto -p /dev/pms0
А для грызуна с USB-разъемом команда примет такой вид:
$ moused -t auto -p /dev/ums0
Разумеется, дается она от лица root'а - обычный пользователь не имеет требуемых прав доступа к файлам соответствующих устройств.
В предыдущей заметке я уже говорил, что установщик DFBSD позволяет настроить экранный вывод для воспроизводства кириллицы и клавиатурную раскладку - для ее ввода. Однако корректно он делает это для одного-единственного варианта - ввода в кодировке KOI8-R и вывода в кодировке CP866. Это - традиционная схема русификации большинства свободных Unix-подобных системе (Linux, FreeBSD), но не единственно возможная: ничто не запрещает в принципе использовать KOI8-R и для ввода, и для вывода. И даже DOS- и Windows-кодировки не принадлежат к числу запретных.
Далее, идущие в комплекте с DFBSD экранные шрифты с символами кириллицы (унаследованные от FreeBSD), мягко говоря, не являют собой верх эстетического совершенства. А штатных раскладок для кодировки KOI8-R - две. Одна соответствует клавиатурам с DOS-маркировкой клавиш, ныне почти не встречающимся в продаже, а вторая вообще странна: в ней знаки препинания расположены на нижнем регистре цифрового ряда. Что теоретически удобно - вот только клавиатур в такой маркировкой я в природе не наблюдал...
И последнее. Для корректной работы с кириллицей требуется установка
локально-зависимых переменных, определяющих язык, страну, набор символов,
формат десятичных дробей, даты, времени и так далее - все то, что
определяется понятием локали (locale). А это в BSD
Installer'е также не предусмотрено.
Таким образом, для полноценной русификации DFBSD требуется некоторая ручная доводка. Коей мы сейчас и займемся.
Начнем со шрифтов - ибо на штатные я лично не могу смотреть без слез
(в том числе и в прямом смысле). Загрузка шрифтов, отличных от "умолчального"
default (разумеется, не содержащего кириллицы),
предписывается во все том же файле /etc/rc.conf. При
установке шрифта через BSD Installer в него дописывается соответствующая
строка, имеющая вид вроде такого:
font8x16="/usr/share/syscons/fonts/cp866-8x16.fnt"
Это - пример для шрифта в DOS-кодировке с матрицей 8 на 16 пикселей, обычный размер для стандартной плотности знаков (80 символов на 25 строк). Выглядит он вполне скверно, но прочие кириллические (для любых кодировок) - ничуть не лучше. То есть для начала нам нужно разжиться качественными экранными шрифтами.
Тут есть два пути: 1) взять пакет console-tools-cyrillic для
Linux, вытащить из него шрифты (а среди них есть очень даже приличные) и
преобразовать их в формат, используемый в BSD-консолях (т.н. raw-формат);
2) воспользоваться пакетом terminus-fonts, позволяющих
сгенерировать шрифты для BSD-консоли очень хорошего качества. Оба варианта
были подробно описаны в соответствующем материале и здесь я повторяться не
буду. Тем более, что готовый к употреблению набор, содержащий все известные
мне кириллические шрифты, можно взять здесь. Остается только
развернуть полученный тарбалл в должном месте (в каталоге
/usr/share/syscons/fonts, с помощью команды
$ vidcontrol -f /usr/share/syscons/fonts/font_name.fnt
выбрать подходящий и вписать его имя в соответствующую строку файла
/etc/rc.confвместо проставленного BSD Installero'ом.
Например, у меня это выглядит так:
font8x16="/usr/share/syscons/fonts/ter-k16b.fnt"
Это - шрифт из пакета terminus-fonts для кодировки KOI8-R
полужирного начертания, что представляется мне наиболее простым и
визуально комфортным. И, к слову сказать, - даже программы, использующие
псевдографику (например, deco - одна из сирот
командира Нортона), выглядят при этом очень даже нормально. При условии изменения типа терминала, конечно (о чем - чуть ниже).
Теперь - о клавиатурных раскладках. Таковые содержатся в каталоге
/usr/share/syscons/keymaps. Для ввода кириллицы предназначены
те, что описаны в файлах с перфиксом ru в имени:
$ ls /usr/share/syscons/keymaps/ru* /usr/share/syscons/keymaps/ru.cp1251.kbd /usr/share/syscons/keymaps/ru.cp866.kbd /usr/share/syscons/keymaps/ru.iso5.kbd /usr/share/syscons/keymaps/ru.koi8-r.kbd /usr/share/syscons/keymaps/ru.koi8-r.shift.kbd
Если для ввода, как и для вывода, остановиться на кодировке KOI8-R, то
любую из двух последних легко преобразовать к виду, соответствующему
клавиатурам с Windows-маркировкой. Однако это уже проделано - результаты
можно получить здесь. Так что просто компируем файл такой
раскладки ru.koi8-r.win.kbd куда положено, и должным образом
изменяем соответствующую строку в файле /etc/rc.conf:
keymap="/usr/share/syscons/keymaps/ru.koi8-r.win.kbd"
Поскольку и для ввода, и для вывода используется одна и та же кодировка,
необходимость в загрузке карты соответствия (т.н. screenmap) отпадает. И
если при установке таковая была подключена, то соответствующую строку в
/etc/rc.conf нужно удалить или закомментировать:
#scrnmap="/usr/share/syscons/scrnmaps/koi8-r2cp866.scm"
Использование KOI8-R для экранного вывода имеет два не очень приятных следствия. Первое - возможно, непривычный вид некоторых консольных программ, использующих псевдографику. Впрочем, при любой кодировке вывода они приобретут облик просто отвратительный. Для ликвидации чего следует изменить тип терминала. Тип этот описывается в файле /etc/ttys, по умолчанию - cons25. Однако, загрузив кириллический шрифт, свойства терминала мы изменили, и он перестал отвечать своему описанию в файле /etc/termcap. Для исправления чего достаточно в /etc/ttys в поисании виртуальных консолей заменить все вхождения cons25 на cons25r. После этого явные безобразия в псевдографике будут ликвидированы.
Второе следствие вывода в KOI8-R связано с мышью. В DFBSD (как и во FreeBSD) по умолчанию используется так называемый графический (точнее говоря, псевдографический) ее курсор - что удобно для отличия от собственно текстового курсора консоли. Но опять же по умолчанию коды его совпадают с кодами некоторых кириллических символов из таблицы KOI8. Что приводит к тому, что буквы эти просто пропадают с экрана при перемещении мыши. Чтобы избежать этого, вспомним о параметре mousechar_start, поминавшемся в предыдущем разделе.
Так вот, соответствующей строке нужно придать вид
mousechar_start="3"
после чего все придет в норму.
Раз уж речь зашла о курсоре... Лично я проделываю еще и такую операцию:
вношу в /etc/rc.conf строку
cursor="destructive"
В результате текстовый курсор (тот, что управляется стрелками клавиатуры или клавишными последовательностями) приобретает вид, отличный от выделения мышью единичного символа. По-моему, удобно.
И последнее, касающееся клавиатуры. Мне представляется не лишним задание ее скорости в виде
keyrate="fast"
Потому что при умолчальном значении normal она кажется мне
раздражающе медлительной.
Завершающий штрих русской локализации - установка собственно локали: без
этого невозможен ни ввод символов кириллицы в командной строке (что нужно
не так уж и часто), ни просмотр русских текстов командами типа
less (а вот это нужно всегда). В Linux локализация
осуществляется приданием соответствующим переменным окружения (обычно
достаточно LANG нужного значения (например,
ru_RU.KOI8-R, что фиксируется в пользовательском или
общесистемном профильном файле для того шелла, который применяется данным
пользователем в качестве главного (login shell) - обычно это что-нибудь
вроде /etc/profile или $HOME/bash_profile. В
некоторых случаях это может быть неудобным - например, если разные
пользователи используют в качестве login shell каждый свою программу,
установка локали потребует отдельной редакции соответствующих конфигов.
Конечно, скажем, zsh можно собрать так, чтобы он брал
переменные окружения из общесистемного конфига типа
/etc/profile, но по умолчанию это не делается.
Удобнее, по моему мнению, локализация выполняется во FreeBSD. Конечно, и
там можно просто прописать переменную LANG в профильном файле
login shell любого пользователя. Однако штатный способ установки локали -
через специальный атрибут учетной записи, называемый class.
Атрибут этот, описываемый в файле /etc/login.conf, может
включать практически любые, в том числе и локально-зависимые, переменные
окружения для данного пользователя, не зависимые от его login shell и
сохраняющиеся неизменными при смене оного.
DFBSD унаследовала от своей прародительницы понятие класса. В частности, в
ней предусмотрен класс russian, отличающийся от умолчального
(default) только локально-зависимыми переменными:
russian|Russian Users Accounts:\
:charset=KOI8-R:\
:lang=ru_RU.KOI8-R:\
:tc=default:
обеспечивающими локализацию в кодировке KOI8-R (tc=default
означает, что все прочие переменные окружения пользователей этого класса
берутся из описания класса default). Если же требуется
использование какого-либо иного набора символов - легко создать
собственный класс, вписав в /etc/login.conf соответствующие
строки.
В DFBSD теоретически доступны все локали, имеющие отношение к русскому
языку, России и символам кириллицы. Как ни странно, в этой ОС нет штатной
команды locale, которая позволила бы просмотреть весь их
список. Однако сделать это можно непосредственно - командой
$ ls /usr/share/locale | grep ru 11:13 ttyv2 ru_RU.CP1251/ ru_RU.CP866/ ru_RU.ISO8859-5/ ru_RU.ISO_8859-5@ ru_RU.KOI8-R/ ru_RU.UTF-8/ ru_SU.CP866@ ru_SU.ISO8859-5@ ru_SU.ISO_8859-5@ ru_SU.KOI8-R@
Как видите, даже локаль SU имеет место быть как памятник
эпохи. Наряду со светлым будущим всего человечества - локалью
ru_RU.UTF-8. Впрочем, с нею у меня ничего не вышло. Видимо,
потому, что консольные приложения, на которых я пытался
экспериментировать, были собраны без ее поддержки.
В общем, для установки локали достаточно создать учетную запись обычного
пользователя (на стадии установки мы ведь этот шаг пропустили) и отнести
ее к классу - russian, если требуется кодировка KOI8-R, или
какому-либо новообразованному - при необходимости другой кодировки.
Сделать это проще всего утилитой adduser: она потребует
вполне очевидных ответов на серию вопросов, среди которых будет и вопрос о
классе.
Впрочем, если пользовательский аккаунт был создан посредством BSD
Installer'а, атрибута class определить не позволяющего, это
легко поправить в дальнейшем - с помощью универсальной утилиты для
управления учетными записями pw:
$ pw usermod username -L russian
где опция usermod предписывает модернизировать существующий
аккаунт (с пользовательским именем username), а опция -L
собственно и определяет его класс.
И еще один момент при создании аккаунтов, не имеющий отношения к
локализации, но важный сам по себе: в DFBSD, как и в большинстве
BSD-систем, получить права администратора могут только пользователи,
входящие в группу wheel. При использовании утилиты
adduser вопрос о членстве в иных группах будет задан явно.
Если же аккаунт создавался при установке, и на этот момент внимание не
акцентировалось, то добавить пользователя в группу wheel (как
и в любую другую) можно и потом - все той же командой pw:
$ pw usermod username -G wheel
Вот и все, что касается русификации. Да и вообще настроек - по крайней мере, пока - к различным аспектам конфигурирования DragonFlyBSD я еще надеюсь возвращаться, и не раз.