Русификация загрузки Slackware Linux 9.1

Загрузка ...

 

Русификация загрузки Slackware Linux 9.1

Автор: K48

Если вы установили Slackware 9.x, то наверняка уже русифицировали эту замечательную операционную систему по известной статье "Русификация Slackware Linux 9.0". Всё хорошо, везде русский язык... Только вот при загрузке системы появляются сообщения на английском. Сейчас мы ими и займёмся.

В первую очередь скажу, что в этой статье я не буду описывать русификацию сообщений ядра (типа 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.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 (_("

Здарова! Как тебя звать-то? "), 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=такой-то). Разумеется, так можно переводить только программы, со скриптами это не пройдет.

Статья взята с сайта OpenNet.

Автор [K48 (a-i@bk.ru)]