Русификация загрузки Slackware Linux 9.1
Автор: K48 <a-i (at) bk dot ru>
Если вы установили Slackware 9.x, то наверняка уже русифицировали эту замечательную операционную систему по известной статье "
В первую очередь скажу, что в этой статье я не буду описывать русификацию сообщений ядра (типа BIOS data check succesful). Поэтому давайте просто отключим их.
Кстати, для выполнения большинства операций в этой статье вам потребуются привилегии суперпользователя (root). Поэтому либо настройте должным образом /etc/sudoers (вставьте в него строку %users ALL=(ALL) NOPASSWD: ALL ) и запускайте все команды через sudo, либо войдите в систему под именем root.
Итак, откройте файл настроек загрузчика LILO:
vi /etc/lilo.conf
Найдите строку append (для этого в Vim нужно ввести /append) и добавьте к ней слово quiet, после чего она должна выглядеть примерно так:
append="hdc=ide-scsi quiet"
(mini-vim-howto: чтобы вставлять текст, нажмите i, обратно в режим команд - ESC, сохранить файл и выйти - :x, выйти не сохраняя - :q!) Строка append определяет параметры, передаваемые ядру системы при загрузке. Параметр quiet отключает сообщения, выводимые ядром (они вам нужны?). После каждого изменения в файле /etc/lilo.conf выполняйте команду:
lilo
Иначе изменения не вступят в силу. Теперь перейдите в каталог /etc/rc.d:
cd /etc/rc.d/ ls
Здесь хранятся скрипты, отвечающие за загрузку системы. Если у вас включено выделение файлов цветом, то в списке файлов, выдаваемом командой ls, вы увидите, что некоторые файлы выделены зелёным, а некоторые -- серым. Что это означает? Вы, наверное, знаете, что у каждого файла есть атрибуты, определяющие права доступа к этому файлу. Одним из таких атрибутов является атрибут, позволяющий выполнение файлов. Если у какого-то файла нет атрибута выполнения, то он не может быть запущен даже пользователем root. Поэтому самый простой способ управления загрузкой -- установка или снятие атрибута выполнения с этих скриптов при помощи команды chmod. Например, в каталоге /etc/rc.d есть файл rc.pcmcia. Если у вас нет устройств PCMCIA, то зачем тогда его запускать? Выполните команду:
chmod -x rc.pcmcia
Только пожалуйста, не убирайте атрибут выполнения у файлов rc.M, rc.S, rc.6. Они важны для вашей системы. Зачем нужны они и другие файлы, вы узнаете из следующей таблицы:
- rc.0 - Выполняется при выключении компьютера. На самом деле, это символическая ссылка на файл rc.6.
- rc.4 - Запускает графический интерфейс -- систему X Window.
- rc.6 - Выполняется при перезагрузке системы. Если этот файл запускается через символическую ссылку с rc.0, то это автоматически определяется и система не перезагружается, а останавливается.
- rc.acpid - Запускает службу ACPI, отвечающую за управление питанием компьютера.
- rc.alsa - Запускает звуковую систему ALSA
- rc.atalk - Запускает службу AppleTalk
- rc.bind - Запускает службу DNS
- rc.cups - Запускает систему печати CUPS
- rc.font - Загружает национальный шрифт и раскладку клавиатуры
- rc.font.sample - Пример файла rc.font. При загрузке он не выполняется.
- rc.gpm - Запускает службу GPM, позволяющую использовать мышь в консоли
- rc.hotplug - Запускает систему горячего подключения/отключения устройств
- rc.inet1 - Поднимает различные сетевые интерфейсы
- rc.inet2 - Загружает сетевую подсистему
- rc.inetd - Запускает службу inetd. Если у вас не сервер, то можно отключить.
- rc.ip_forward - Активирует перенаправление сетевых пакетов
- rc.K - Выполняется при переходе в runlevel 1, т.е. однопользовательский режим (при помощи команды init 1)
- rc.local - Сюда вы можете добавить свои собственные команды, которые должны выполняться при загрузке системы
- rc.lprng - Запуск LPD, службы печати
- rc.M - Содержит команды, выполняемые при переходе в многопользовательский режим (runlevel 2, 3, 4, 5)
- rc.modules - Загружает модули ядра (т.е. драйверы) для вашего оборудования
- rc.mysqld - Запускает MySQL
- rc.nfsd - Запускает службу NFS (сетевая файловая система)
- rc.pcmcia - Подключает устройства PCMCIA
- rc.S - Самый первый скрипт, выполняемый из этого каталога при загрузке
- rc.samba - Служба, обеспечивающая доступ к файлам и принтерам для компьютеров с Windows
- rc.sendmail - Запускает почтовую службу Sendmail
- rc.serial - Инициализирует последовательный порт
- rc.sshd - Запускает SSH, обеспечивающий удаленный доступ к системе
- rc.syslog - Запускает службу ведения системных журналов
- rc.sysvinit - Обеспечивает совместимость с загрузкой в стиле System V
Во время загрузки скрипт rc.font выполняется одним из последних. Нам же нужно, чтобы русские символы могли отображаться как можно раньше. Сначала закомментируйте строку запуска rc.font в файле rc.M. Затем откройте в редакторе vim файл rc.S, выполняющийся самым первым из всех скриптов в /etc/rc.d/. Вот первые несколько команд в моем файле rc.S:
PATH=/sbin:/usr/sbin:/bin:/usr/bin mount /usr if [ -x /etc/rc.d/rc.font ]; then /etc/rc.d/rc.font fi
Первая команда устанавливает переменную PATH. Для запуска программ, находящихся в этих папках, не нужно указывать полный путь, т.е. можно написать setleds вместо /usr/bin/setleds. Вторая команда заранее монтирует раздел с файлами каталога /usr (если у вас каталог /usr не выделен в отдельный раздел, то эта команда и не нужна, все остальные разделы будут смонтированы позднее), так как нам потребуются программы из каталога /usr/bin. В общем, убедитесь, что он доступен на ранней стадии загрузки.
Далее идет проверка условия, при выполнении которого запускается /etc/rc.d/rc.font. -x обозначает, что rc.font будет запущен, только если он является исполняемым (см. выше). В принципе, проверку этого условия можно исключить, оставив только строку запуска rc.font, но тогда при попытке его запуска будет показываться сообщение "permission denied".
Откройте файл /etc/rc.d/rc.font. Он должен выглядеть примерно так:
#!/bin/sh setfont Cyr_a8x16 >/dev/null mapscrn koi2alt >/dev/null for n in 1 2 3 4 5 6 do echo -ne "\033(K" > /dev/tty$n done loadkeys ru-ms 2>/dev/null echo Загружаются русские символы и раскладка клавиатуры...
setfont -- устанавливает русский шрифт
mapscrn -- загружает таблицу символов (в принципе, можно использовать для этого setfont с параметром -m)
for do done -- цикл; определяет, что команда echo ... должна повторяться столько раз, сколько элементов указано после ключевого слова in (6 раз)
echo ... > /dev/tty$n -- посылает "магическую" последовательность виртуальным консолям. Как вы знаете, все устройства представлены в виде файлов;
/dev/tty1-/dev/tty6 -- это виртуальные консоли, по которым вы переключаетесь при помощи клавиш Alt+F1..Alt+F6. Вместо $n подставляется одно из значений, указанных после ключевого слова in.
loadkeys -- загружает раскладку клавиатуры
>/dev/null -- перенаправляет сообщения, выдаваемые программами, в никуда. То есть на экран они не выводятся.
2>/dev/null -- дело в том, что для вывода сообщений есть несколько "каналов". Обычно программы выводят сообщения в "канал" stdout -- стандартный вывод. Этот-то стандартный вывод и перенаправляется при помощи символа >. Но программа loadkeys для вывода сообщений использует stderr, перенаправление которого осуществляется при помощи 2>.
Что ж, теперь можно приступать непосредственно к переводу сообщений из скриптов на русский. Думаю, вы сами с этим справитесь, в крайнем случае, при помощи словаря. Ищите команду echo, но учтите, что она не всегда использется только для вывода на экран сообщений. Слова типа $RELEASE переводить не нужно, это имена переменных. В общем, экспериментируйте, но не забудьте сначала выполнить
cp /etc/rc.d /etc/rc.d.BACKUP
Думаю, с переводом вы легко справитесь -- тут ничего сложного. Выполните команду reboot или нажмите Ctrl+Alt+Delete. Ну как? Есть русские сообщения? Если какие-то сообщения остались на английском, смотрите таблицу выше, пытайтесь определить, из какого файла они выдаются. Например, появилось сообщение: "Loading ALSA kernel modules; Loading ALSA mixer settings". Перейдите в /etc/rc.d и выполните команду:
grep -l "Loading ALSA" *
В ответ вы получите:
rc.alsa
Опция -l указывает, что нужно выводить только имя файла. Теперь открывайте файл rc.alsa и переводите сообщения.
Хорошо, с этим вы справились. Но после описания процесса загрузки на русском языке, вылезает приглашение ввести имя пользователя и пароль. Опять же, на английском. Ладно, русифицируем и их. Откройте файл /etc/inittab. Там вы увидите такие строки:
c1:12345:respawn:/sbin/agetty 38400 tty1 linux c2:12345:respawn:/sbin/agetty 38400 tty2 linux c3:12345:respawn:/sbin/agetty 38400 tty3 linux c4:12345:respawn:/sbin/agetty 38400 tty4 linux c5:12345:respawn:/sbin/agetty 38400 tty5 linux c6:12345:respawn:/sbin/agetty 38400 tty6 linux
Они определяют, что во всех runlevel'ах с первого по пятый должна быть запущена команда /sbin/agetty с указанными параметрами. Она и предоставляет вам виртуальные консоли, и выводит приглашение имя_хоста login:. Давайте узнаем, из какого пакета была установлена программа agetty:
grep -l sbin/agetty /var/adm/packages/*
Обратите внимание, что перед sbin/agetty нет слэша, обозначающего корневой каталог, т.к. при установке пакетов все имена каталогов указываются относительно корневого. Итак, в ответ на эту команду вы получите:
/var/adm/packages/util-linux-2.12-i486-1
Теперь вставьте и смонтируйте диск с исходниками Slackware. Перейдите в каталог этого диска и выполните команду:
find . -name util-linux*
Скопируйте util-linux-2.12.tar.bz2 в какой-нибудь каталог, например, /usr/src, и распакуйте его:
tar xjf util<нажмите tab> cd util<нажмите tab>/login-utils ls
В этом каталоге находятся исходники agetty. Откройте agetty.c. В первую очередь закомментируйте строку #959:
write(1, hn, strlen(hn)); ,
т.е. поставьте перед ней два символа "/". Чтобы перейти на строку 959 в vim, просто введите :959. "Закомментировать строку" обозначает, что она превращается в строку-комментарий, игнорируемую компилятором. В этом случае мы отключили вывод имени компьютера перед словом "login:". Теперь изменим саму строку "login:". Перейдите на строку 75. Она должна выглядеть так:
#define LOGIN " login: " /* login prompt */
Замените ее на что-нибудь типа:
#define LOGIN "Здарова! Как тебя звать-то? " /* login prompt */
Сохраняйте файл и выходите из vi. Перейдите на один каталог выше (cd ..) и выполните:
./configure #настройка cd login-utils #нам нужно скомпилировать только agetty, поэтому
переходим в этот каталог
make #компилируем... make install #...и устанавливаем
Теперь нажимайте Ctrl+D, чтобы закончить сеанс, и тут-то вы и должны увидеть новое приглашение. Отлично! Вводим имя пользователя, Enter, и видим: "Password:". Непорядок. Строка, приглашающая ввести пароль, задается в файле /etc/login.defs. Найдите строку "LOGIN_STRING". Она должна выглядеть примерно так:
LOGIN_STRING "%s! Стоять! Говори пароль: "
Как вы уже догадались, %s будет заменено на только что введенное имя пользователя. Теперь, казалось бы, все работает. Но попробуйте ввести неправильное имя или пароль -- и вы опять получите этот "linuxbox login:". В чем же дело? Войдите в систему и выполните команду:
ps -A | grep agetty
Вы увидите, что на тех консолях, в которых вы уже ввели имя пользователя (появилась хотя бы строка ввода пароля или где вы уже ввели и пароль), agetty уже не запущен. Здесь уже вступает в дело /bin/login.
Итак, повторяем те же действия. Выясняем, что bin/login находится в пакете shadow-4.0.3, распаковываем исходники и заходим в каталог shadow-4.0.3/src/. Открываем login.c. Строка 852-853 (имя пользователя):
login_prompt (_("\nЗдарова! Как тебя звать-то? "), username, sizeof username);
Строка 1071 (строка, выводимая если имя пользователя или пароль неверны):
puts (_("Ты, в натуре, гонишь! Ни фига не правильный пароль."));
Как компилировать и устанавливать программу, вы уже знаете.
Вот и все. Для разнообразия можете попробовать поработать с po/pot-файлами. Они находятся в каталоге po/ исходников программ. Открывать их можно с помощью kbabel (из пакета kdesdk). Компилируются они при помощи msgfmt, и полученный файл *.mo должен быть в каталоге /usr/share/locale/ru/LC_MESSAGES/ (не забудьте корректно настроить локаль до запуска agetty/login, т.е. в одном из файлов в /etc/rc.d/ нужно выполнить команду export LANG=такой-то LC_ALL=такой-то). Разумеется, так можно переводить только программы, со скриптами это не пройдет.