Маленькие хитрости большой системы.
Автор : Роман RTG ЕПИШЕВ
Сервисный центр
Как-то раз решил поставить я Apache. Поставил, принял конфигурацию по умолчанию, запустил сервер httpd, но ожидаемого эффекта не было — http://localhost не был найден ни одним из установленных браузеров. Игрушка Maelstrom запускалась-запускалась, а потом взяла, да и перестала работать — не появлялся кораблик на звездном фоне.
Не думал, что эти проблемы могут быть хоть как-нибудь связаны... Оказалось, все произошло из-за отключения мною сервиса network, и поэтому вся система жила без внутренней сети. "Хорошо, с Apache сравнительно понятно, но что случилось с Maelstrom?" — спросите вы. Как выяснилось, некоторые программы (а особенно игры) соединяются сами с собой через эту внутреннюю сеть компьютера. Не имея возможности такого соединения, они либо зависают, либо загружаются не полностью. Поэтому очень советую, если вы точно не знаете, нужен ли вам какой-нибудь сервис или нет, не выключайте его, ведь это может быть что-то важное. Хотя... если у вас стабильный состав оборудования, kudzu нет смысла при каждой загрузке это проверять, а если у вас не ноутбук, то сервису apmd незачем отнимать системные ресурсы.
Для конфигурирования сервисов в вашем дистрибутиве уже должна быть установлена какая-нибудь программа (попробуйте запустить serviceconf), позволяющая в удобном интерфейсе их включать и выключать. Но представим ненадолго, что вы вырубили, например, сервер шрифтов (xfs), и теперь никакие иксы не хотят грузиться, а для текстового режима конфигуратора нет... Как в таком случае указать, какие сервисы нужны, или хотя бы запустить требуемый?
Начнем издалека :-). В Linux существует понятие runlevel (дословно — уровень запуска). Каждому состоянию компьютера и системы присвоен свой runlevel. При переходе из одного уровня в другой (например, из третьего в нулевой) выполняются скрипты из /etc/rc.d/rc[уровень_запуска_в_который_переходим].d (на самом деле, в этих папках — только ссылки на скрипты в /etc/rc.d/init.d/). Если посмотреть на имена ссылок, то нельзя не заметить одну особенность. Возьмем, к примеру, тот же network. Ссылка на него в нормальном, пятом уровне выглядела у меня так:
"Ссылка есть, но почему network не работает?" — опять спросит кто-нибудь. Разберем сначала имя: K — означает, что этот сервис будет "убит" (KILL) при переходе в данный runlevel, цифра 90 позволяет запустить сервисы в определенном порядке, иначе они бы выполнялись в алфавитном, наконец, network — это название сервиса. А чтобы заставить сервис запускаться, нужно всего лишь переименовать ссылку и сделать из буквы K букву S (что означает START):
Для того чтобы выключить сервис, букву S меняем на K (так уж исторически сложилось).
Вот и все, при следующем изменении runlevel'а network будет запущен. Если вы знаете имя сервиса и хотите его запустить из консоли, то наберите
Например, чтобы заставить работать ранее уже упоминавшийся xfs:
Для того чтобы перемещаться между уровнями, можно использовать команду
(она требует прав суперпользователя). Удобно использовать halt (для выключения питания ATX-систем нужно добавить ключ -p) и reboot.
Установка Другой Операционной Системы.
Вот вроде бы и работает Linux, вам он уже начинает нравиться. Но у всех "переходящих" пользователей обязательно на другом разделе еще живет какая-нибудь Windows. В один прекрасный день она дает сбой, и вы принимаетесь переустанавливать ее. Установили, настроили, перезагружаете компьютер, а входа-то в Linux уже и нету — Windows преспокойно затерла загрузочный сектор. Для восстановления загрузчика Linux вам потребуется загрузочная дискета, содержащая ту же версию ядра (если версии не будут совпадать, фокус с дискетой не получится), что и в вашей системе. Бросайте ее в дисковод и с нее загружайтесь, на запрос boot: нажмите Enter, и компьютер должен загрузиться в Linux (разумеется, запускается та система, которая уже у вас установлена, поэтому нет смысла использовать загрузочную дискету на компьютере без Linux). Теперь нужно стать суперпользователем (root) и установить загрузчик:
если у вас (был) установлен grub, то в консоли наберите
где <диск> — физический жесткий диск, откуда грузился прежний grub (обычно тот же диск, на котором установлен Linux);
если же lilo, то достаточно просто набрать
Теперь, если не выдано сообщений об ошибках, система готова к дальнейшей работе.
Бывает так, что загрузочной дискеты нет, но есть компакт-диски с Linux. В RedHat-подобных дистрибутивах можно с этих дисков войти в Rescue Mode, в котором в свою очередь можно "спасти" вашу установленную систему.
Загружайтесь с первого компакт-диска. Далее наберите:
Инсталляционная программа проверит ваши жесткие диски на наличие Linux'а и, если таковой найдется, примонтирует вашу файловую систему куда-то в /mnt/sysimage (об этом будет сказано в специальном сообщении). Теперь вам нужно /mnt/sysimage сделать вашим корневым каталогом:
А сейчас устанавливайте загрузчик — так, как об этом написано выше.
Для того чтобы создать загрузочную дискету, вам нужно выполнить команду
Чтобы узнать вашу версию ядра, наберите
(Будьте внимательны, версия ядра в Rescue-режиме может отличаться от установленной на вашей системе!)
Среда переменных
Как и в DOS/Win, в Линуксе существуют свои системные переменные, и некоторые из них могут быть нам интересны:
$HOME — указывает на домашний каталог пользователя;
$PATH — список каталога запуска;
$LANG — текущая локаль (язык и региональные настройки);
$PWD — текущая рабочая директория;
$USER — текущий пользователь;
$DISPLAY — (если указана — адрес/номер X-сервера, который в данный момент используется).
Итак, что они нам дают? Во-первых, мы всегда сможем узнать имя в системе (echo $USER или команда whoami ('кто я такой')), во-вторых — папку, где находимся (echo $PWD, также команда cwd (current working directory)). Переменная $PATH уже обсуждалась ранее на страницах газеты, разберем подробнее $LANG и $DISPLAY. Когда система только загружается, устанавливается переменная $LANG, ее значение берется из файла /etc/sysconfig/i18n. Когда нужно сменить локаль с русской, например, на английскую, то достаточно выполнить
и все программы, запущенные из данной консоли, будут использовать уже другую локаль, если она установлена в системе.
Также можно прописать в файл ~/.bashrc строчку
а в /etc/sysconfig/i18n —
и вы получите систему, в которой обычный пользователь будет иметь русскую локаль, а root и все системные сервисы — английскую (кодировка для en_US не указывается) Лично я прибегнул к этому затем, чтобы в журналах системы не фигурировали локализированные даты.
Но бывает и так, что менять локаль или любую другую переменную приходится только ради какой-то одной программы — для таких случаев процедура изменения и последующего восстановления значения излишне громоздка. Специально для этого служит еще одна из встроенных Bash-команд — env:
А вот таким образом вы можете запустить Midnight Commander с английской локалью, при этом все программы, запущенные из mc, будут все равно использовать русскую:
Что касается DISPLAY... Вы запускали когда-нибудь приложение, требующее X-сервер, из "голой" консоли? Помните сообщение о невозможности присоединиться к X-серверу, хотя тот у вас уже час как запущен? Правильно, это потому что программа не знает, куда подключаться. Вот эта информация и указывается в переменной $DISPLAY. Для приложений из среды KDE и оконных менеджеров достаточно при запуске указать -display :0 или --display :0, а вот приложения на базе Gtk и проч. могут не иметь такой опции. Но у нас есть env, так что можем запустить:
Теперь перейдите в консоль с X-сервером, и вы увидите, что там открылось окно плейера XMMS. Команда
запустит текстовый редактор kwrite с английским интерфейсом на первом X-сервере.
Скачал с сети и установил как-то раз я оконный менеджер fluxbox и долго не мог понять, как в него войти. Потом вспомнил, как запускаются другие оконные менеджеры, добавил в /etc/X11/xdm/Xsession после строчек, отвечающих за запуск KDE
затем изменил в этой же папке kdmrc, добавив в строчку
еще и fluxbox. Только после этого в kdm появился соответствующий рабочий пункт меню.
Немного закручено, не правда ли? А если менеджер только попробовать хочется?
В таком случае все просто — запускаете
или
и оконный менеджер загрузится в новые иксы.
Икс vs. Консоль
Вот была такая проблема: при инсталляции системы я не выбрал запуск X-сервера при загрузке, наивно полагая, что уже порядком поднаторел работать в консоли. Через час я опять устанавливал Linux, уже с загрузкой X-сервера по умолчанию. А оказалось вот что.
В файле /etc/inittab указывается, каким образом процесс init должен настраивать систему в определенных runlevel'ах, В частности, вы можете указать уровень runlevel по умолчанию (НЕ СТАВЬТЕ 0!), разрешить/запретить использование клавиш Ctrl+Alt+Del во время загрузки системы. Где-то в конце файла Вы найдете строчку
Параметры в inittab существуют в таком виде:
id — уникальное имя для процесса — от 1 до 4 букв/цифр;
runlevel — соответственно, runlevel(ы), при которых процесс будет запущен;
действие — что должен делать init с процессом (см. man inittab; рrespawn — запускать заново, если процесс будет уничтожен);
процесс — какая-нибудь программа (напр. /etc/X11/prefdm).
Вы заметили, что в /etc/init.d нет ничего типа S84Xserver? Правильно — запуск xdm/kdm/gdm происходит из inittab, а те уже в свою очередь запускают Иксы. Для того чтобы отказаться от автоматической загрузки Xserver, вы можете просто в начале файла вместо
написать
заказав runlevel по умолчанию. Так можно сделать, если вы уже достаточно хорошо ориентируетесь в командах и в чисто текстовом режиме чувствуете себя как рыба в воде. Зачем загружать X, если большую часть времени проводишь в консолях?
Все, отключили иксы при загрузке. Но тут вдруг срочно понадобилось запустить, например, grip, а он требует Xserver. У нас три выхода: изменить runlevel на 5 (если вы — root) и загрузить ваш gnome/kde/windowmaker/fluxbox; запустить вручную сервер (прав обычного пользователя для этого достаточно), а там и программу (но окно будет без управления — не запущен оконный менеджер); или же запустить X-сервер, потом GNOME, а в нем уже grip.
Первый вариант будет выглядеть так:
Второй вариант:
А третий:
(X:0 & в круглых скобках потому, что только так мы можем указать более одной команды — bash не понимает конструкцию &;)
Единственный недостаток второго и третьего методов — даже если указать ключи --quiet и перенаправление > dev/null 2>&1, некоторая отладочная информация редко, но все-таки может вылезать на экран. Если вы все же захотите использовать именно эту виртуальную консоль, добавьте еще и знак & в конец последней команды, иначе оболочка будет полностью захвачена работающим процессом.
С помощью таких действий можно, например, запустить mplayer вообще на отдельном сервере и без оконного менеджера (кнопка f переключает в полноэкранный режим):
или The GIMP, но с оконным менеджером Metacity без запуска самого GNOME:
Мы получаем меньшую загруженность системы, следовательно, большую производительность. А переключаться по X-серверам будем кнопками Ctrl+Alt+F7, Ctrl+Alt+F8 и так до F12.