Gentoo Linux сборник статей


init выполняет все сценарии, на которые есть символьные ссылки из /etc/runlevels/boot



Pdf просмотр
страница25/79
Дата14.11.2016
Размер5.55 Mb.
Просмотров11478
Скачиваний1
1   ...   21   22   23   24   25   26   27   28   ...   79
init выполняет все сценарии, на которые есть символьные ссылки из
/etc/runlevels/boot. Это определяется следующей строкой:
Листинг 2: Инициализация системы, продолжение rc::bootwait:/sbin/rc boot
И снова все необходимые действия выполняются сценарием rc. Заметьте, что параметр, переданный rc (boot), совпадает с названием используемого подкаталога в /etc/runlevels.
Теперь init проверяет свой конфигурационный файл, чтобы определить, какой уровень запуска использовать. Для этого из /etc/inittab считывается строка:
Листинг 3: Строка initdefault id:3:initdefault:
В приведенном примере (который подходит для подавляющего большинства пользователей Gentoo) номер уровня запуска — 3. Пользуясь этой информацией,
init проверяет, что нужно выполнить для запуска уровня запуска 3:
Листинг 4: Определение уровней запуска l0:0:wait:/sbin/rc shutdown l1:S1:wait:/sbin/rc single l2:2:wait:/sbin/rc nonetwork l3:3:wait:/sbin/rc default l4:4:wait:/sbin/rc default l5:5:wait:/sbin/rc default l6:6:wait:/sbin/rc reboot
257

Настольная книга Gentoo Linux x86
В строке, определяющей уровень 3, для запуска служб снова используется сценарий rc (на этот раз с аргументом default). Опять-таки, обратите внимание, что аргумент, передаваемый сценарию rc, совпадает с названием подкаталога из
/etc/runlevels.
По окончании работы rc, init принимает решение о том, какие виртуальные консоли включить и какие команды выполнить в каждой из них:
Листинг 5: Определение виртуальных консолей 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
Что такое уровень запуска?
Как вы заметили, init применяет нумерацию для определения уровня запуска, который надо использовать. Уровень запуска — это то состояние, в котором запускается ваша система, он содержит набор сценариев (сценариев уровня запуска или сценариев инициализации [initscript]), которые следует выполнять, при входе и выходе из определенного уровня запуска.
В Gentoo определено семь уровней запуска: три служебных и четыре определяемых пользователем. Служебные называются sysinit, shutdown и
reboot. Действия, совершаемые ими, в точности соответствуют их названиям: инициализация системы, выключение системы и ее перезагрузка.
Определяемые пользователем уровни — это те, которым соответствуют подкаталоги в /etc/runlevels: boot, default, nonetwork и single. Уровень boot
запускает все службы, необходимые системе и используемые всеми остальными уровнями. Остальные уровни отличаются друг от друга запускаемыми службами:
default используется для повседневной работы, nonetwork — для тех случаев, когда не требуется сеть, а single — при необходимости восстановления системы.
Работа со сценариями инициализации
Сценарии, запускаемые процессом rc, называются сценариями инициализации.
Каждый сценарий из /etc/init.d может запускаться с аргументами start, stop,
restart, pause, zap, status, ineed, iuse, needsme, usesme и broken.
Для запуска, остановки или перезапуска службы (и всех, зависящих от нее) следует использовать start, stop и restart:
Листинг 6: Запуск postfix
# /etc/init.d/postfix start
258

Настольная книга Gentoo Linux x86
Примечание: Останавливаются или перезапускаются только те службы, которым необходима данная служба. Остальные зависимые службы (те, которые используют службу, но не нуждаются в ней) эта операция не затрагивает.
Если вы хотите остановить службу, но оставить зависимые от нее работающими, можно использовать аргумент pause:
Листинг 7: Остановка postfix без остановки зависимых служб
# /etc/init.d/postfix pause
Чтобы узнать текущее состояние службы (запущена, остановлена, приостановлена и т.д.), можно использовать аргумент status:
Листинг 8: Информация о состоянии postfix
# /etc/init.d/postfix status
Если указано, что служба работает, но вы знаете, что это не так, можно сбросить состояние на stopped (остановлена), используя аргумент zap:
Листинг 9: Сброс информации о состоянии postfix
# /etc/init.d/postfix zap
Для того, чтобы выяснить зависимости службы, можно использовать аргументы
iuse или ineed. С помощью ineed вы увидите те службы, которые действительно необходимы для правильного функционирования интересующей вас службы. С другой стороны, iuse покажет те службы, которые могут использоваться нашей службой, но не обязательны для ее работы.
Листинг 10: Запрос списка всех необходимых служб, от которых зависит Postfix
# /etc/init.d/postfix ineed
Аналогично вы можете узнать, какие службы нуждаются в данной службе
(needsme) или могут ее использовать (usesme):
Листинг 11: Запрос списка всех служб, которым необходим Postfix
# /etc/init.d/postfix needsme
Наконец, можно просмотреть список служб, требующихся для данной, но отсутствующих в системе:
Листинг 12: Запрос списка служб, необходимых Postfix, но отсутствующих
# /etc/init.d/postfix broken
259

Настольная книга Gentoo Linux x86
4.b. Использование rc-update
Что такое rc-update?
Система инициализации Gentoo использует дерево зависимостей для определения служб, которые запускаются в первую очередь. Т. к. это очень утомительное занятие, и мы не хотели, чтобы пользователь занимался этим вручную, мы разработали инструменты, упрощающие управление уровнями запуска и сценариями инициализации.
Используя rc-update, можно включать и исключать сценарии инициализации из уровней запуска. Из rc-update автоматически запускается сценарий depscan.sh
для перестроения дерева зависимостей.
Добавление и удаление служб
В процессе установки Gentoo вы уже добавляли сценарии инициализации в уровень запуска «default». В тот момент вы, возможно, не имели понятия, что такое «default» и зачем он нужен, но теперь вы все это знаете. Сценарию rc-
update требуется второй аргумент, определяющий действие: add (добавить), del
(удалить) или show (показать).
Для того, чтобы добавить или удалить сценарий, просто введите rc-update с аргументом add или del, затем название сценария и уровня запуска. Например:
Листинг 13: Удаление Postfix из уровня запуска default
# rc-update del postfix default
По команде rc-update show выводится список всех доступных сценариев с указанием соответствующих уровней запуска:
Листинг 14: Получение информации о сценариях инициализации
# rc-update show
4.c. Настройка служб
Почему нужна дополнительная настройка?
Сценарии инициализации могут быть весьма сложны. Поэтому нежелательно допускать непосредственное редактирование сценария пользователями, т.к. это может привнести в систему множество ошибок. Но, с другой стороны, необходимо правильно настроить службу. Например, может понадобиться передать службе дополнительные параметры.
Вторая причина, по которой настройки хранятся отдельно от самого сценария —
260

Настольная книга Gentoo Linux x86
это возможность обновления сценария без опасения, что все ваши настройки будут утеряны.
Каталог /etc/conf.d
В Gentoo предусмотрен очень простой способ настройки служб: для каждого сценария, предполагающего настройку, в каталоге
/etc/conf.d есть конфигурационный файл. Например, у сценария, запускающего apache2 (под названием /etc/init.d/apache2) есть конфигурационный файл /etc/conf.d/apache2, где могут храниться нужные вам параметры, передаваемые серверу Apache 2 при запуске:
Листинг 15: Переменная, определенная в /etc/conf.d/apache2
APACHE2_OPTS="-D PHP4"
Такие файлы настроек содержат одни переменные (наподобие /etc/make.conf), облегчая настройку служб. Это также позволяет нам давать больше информации о переменных (в комментариях).
4.d. Написание сценариев инициализации
Мне тоже придется?..
Нет, написание сценариев инициализации обычно не требуется, т.к. Gentoo содержит готовые сценарии для всех поддерживаемых служб. Однако, вы можете установить какую-либо службу, не используя систему Portage; в таком случае, вероятно, вам придется создавать сценарий инициализации самостоятельно.
Внимание: не используйте сценарий, идущий со службой, если он не написан специально для Gentoo: сценарии инициализации Gentoo не совместимы со сценариями, используемыми в других дистрибутивах!
Структура
Основная структура сценария инициализации показана ниже.
Листинг 16: Основная структура сценария
#!/sbin/runscript depend() {
(информация о зависимостях)
}
start() {
(команды, необходимые для запуска службы)
}
261

Настольная книга Gentoo Linux x86
stop() {
(команды, необходимые для остановки службы)
}
restart() {
(команды, необходимые для перезапуска службы)
}
В любом сценарии должна быть определена функция start(). Все остальные разделы необязательны.
Зависимости
Можно определять два типа зависимостей: use (использую) и need (нуждаюсь).
Как упоминалось ранее, need-зависимость более строга, чем use-зависимость.
Вслед за типом зависимости указывается название службы, от которой существует зависимость, или ссылка на виртуальную (virtual) зависимость.
Виртуальная зависимость — это зависимость от функций, предоставляемых службой, но не какой-то единственной службой. Сценарий может зависеть от службы системного журнала, но таких достаточно много (metalogd, syslog-ng, и и т.п.). Поскольку нельзя нуждаться в каждой из них (ни в одной вразумительной системе они не запущены все сразу), мы обеспечили предоставление виртуальной зависимости всеми этими службами.
Давайте взглянем на информацию о зависимостях postfix.
Листинг 17: Информация о зависимостях Postfix depend() {
need net use logger dns provide mta
}
Как можно увидеть, postfix:

требует сеть (net): виртуальная зависимость, удовлетворяемая, например, /
etc/init.d/net.eth0;

использует журнал (logger): виртуальная зависимость, удовлетворяемая, например, /etc/init.d/syslog-ng;

использует службу имен (dns): виртуальная зависимость, удовлетворяемая, например, /etc/init.d/named);

предоставляет почтовый агент (mta): виртуальная зависимость, общая для всех программ — почтовых серверов.
Порядок запуска
Иногда вам нужна не сама служба, а запуск вашей службы до (или после) другой службы, если та присутствует в системе (обратите внимание на условие: это уже не зависимость) и запускается на том же уровне запуска (отметьте условие: это относится только к службам из одинакового уровня запуска). Такую очередность
262

Настольная книга Gentoo Linux x86
можно указать, используя значения before (до) или after (после).
Например, рассмотрим значения для службы Portmap:
Листинг 18: Функция depend() службы Portmap depend() {
need net before inetd before xinetd
}
Также можно использовать знак «*», чтобы охватить все службы данного уровня запуска, хотя это не рекомендуется.
Листинг 19: Запуск сценария первым на уровне запуска depend() {
before *
}
Стандартные функции
Следом за разделом depend() вам потребуется определить функцию start(). В ней содержатся все команды, необходимые для запуска вашей службы.
Рекомендуется применять функции ebegin и eend для сообщений пользователю о том, что происходит:
Листинг 20: Пример функции start()
start() {
ebegin "Запуск - моя_служба"
start-stop-daemon --start --quiet --exec /path/to/my_service eend $?
}
Если вам нужны дополнительные примеры функции start(), пожалуйста, прочитайте исходные коды сценариев инициализации, находящихся в каталоге
/etc/init.d. Что касается команды start-stop-daemon, то на случай, если вам нужны дополнительные сведения, есть превосходная страница справки:
Листинг 21: Вызов страницы справки по start-stop-daemon
# man start-stop-daemon
Другими функциями, которые можно определить — stop() и restart(). От вас не требуется определение этих функций! Система инициализации, применяемая нами, достаточно развита и в состоянии самостоятельно заполнить эти функции, если вы используете start-stop-daemon.
Синтаксис сценариев инициализации, применяемых в Gentoo, основан на оболочке Борна (Bourne Again Shell — bash), поэтому вы можете свободно использовать внутри своих сценариев bash-совместимые конструкции.
263

Настольная книга Gentoo Linux x86
Добавление дополнительных параметров
Если вы хотите ввести в сценарий дополнительные параметры, кроме упоминавшихся, нужно добавить к переменной opts название параметра и создать функцию с названием, соответствующим параметру. Например, для поддержки параметра restartdelay:
Листинг 22: Создание дополнительной функции restartdelay opts="${opts} restartdelay"
restartdelay() {
stop sleep 3 # пауза в 3 секунды перед повторным запуском start
}
Переменные для настройки служб
Для поддержки конфигурационного файла в каталоге /etc/conf.d ничего дополнительно делать не нужно: при запуске вашего сценария инициализации автоматически включаются следующие файлы (т.е., переменные из них становятся доступны):
/etc/conf.d/<ваш сценарий инициализации>
/etc/conf.d/basic
/etc/rc.conf
Если ваш инициализационный сценарий предоставляет виртуальную зависимость
(например, net), то также включается файл, соответствующий этой зависимости
(например, /etc/conf.d/net).
4.e. Изменение поведения уровней запуска
Кто от этого выиграет?
Большинству пользователей ноутбуков знакома ситуация: дома вам нужен запуск net.eth0, и наоборот, в дороге запуск net.eth0 не нужен (так как сеть недоступна). В Gentoo можно изменять поведение уровней запуска по своему усмотрению.
Например вы можете создать второй загружаемый уровень запуска «по умолчанию», в котором будут другие сценарии. Затем при загрузке вы сможете выбрать, какой из уровней по умолчанию следует использовать.
Использование программного уровня (softlevel)
Прежде всего, создайте каталог для своего второго уровня запуска «по умолчанию». Например, создадим уровень запуска offline:
264

Настольная книга Gentoo Linux x86
Листинг 23: Создание каталога уровня запуска
# mkdir /etc/runlevels/offline
Добавьте необходимые сценарии инициализации в только что созданный уровень запуска. Например, чтобы получить точную копию уровня default, за исключением
net.eth0:
Листинг 24: Добавление нужных сценариев инициализации
(копирование всех служб с уровня default в уровень offline)
# cd /etc/runlevels/default
# for service in *; do rc-update add $service offline; done
(удаление ненужных сценариев с уровня offline)
# rc-update del net.eth0 offline
(просмотр сценариев, запускаемых на уровне offline)
# rc-update show offline
(часть выведенного списка)
acpid | offline domainname | offline local | offline net.eth0 |
Теперь необходимо отредактировать конфигурацию загрузчика, добавив запись об уровне offline. Например, в файле /boot/grub/grub.conf:
Листинг 25: Добавление записи об уровне offline title Автономное использование Gentoo Linux root (hd0,0)
kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline
Вуаля, все готово. Теперь, если при загрузке вы выберете вновь созданную запись, то вместо default будет использоваться уровень offline.
Использование загрузочного уровня (bootlevel)
Использование загрузочного уровня полностью аналогично использованию программного уровня. Единственная разница состоит в том, что вы определяете второй уровень «boot» вместо «default».
5. Переменные среды
5.a. Переменные среды
Что это такое?
265

Настольная книга Gentoo Linux x86
Переменная среды — это именованный объект, который содержит информацию, используемую одним или несколькими приложениями.
Многие пользователи (особенно новички в Linux) находят этот подход несколько странным или неуправляемым. Но это впечатление ошибочно: используя переменные среды, можно очень легко изменить настройку разнообразных программ.
Важные примеры
В следующей таблице описывается ряд переменных, используемых в системе
Linux. Примеры их значений приведены далее.
Таблица 1. Переменные среды Linux
Переменная
Описание
PATH
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых система ищет исполняемые файлы. Если вы вводите имя исполняемого файла например, ls, rc-update или
emerge), который не находится ни в одной из перечисленных здесь каталогов, этот файл не запустится (если, конечно, вы не указали полный путь, например, /bin/ls).
ROOTPATH
У этой переменной такое же значение, что и у PATH, но в ней перечисляются только те каталоги, которые нужно просматривать при вводе команды пользователем с правами root.
LDPATH
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых динамический компоновщик ищет библиотеки.
MANPATH
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых команда man
ищет страницы справки.
INFODIR
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых команда info
ищет info-страницы.
PAGER
В этой переменной содержится путь к программе, позволяющей постранично просматривать содержимое файлов, например less или more.
EDITOR
В этой переменной содержится путь к программе, используемой для изменения файлов, например vi
или nano.
KDEDIRS
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых находятся ресурсы KDE.
266

Настольная книга Gentoo Linux x86
CLASSPATH
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых находятся классы Java.
CONFIG_PROTECT
В этой переменной содержится список каталогов, защищаемых Portage при обновлении, разделенных пробелами.
CONFIG_PROTECT_MAS
K
В этой переменной содержится список каталогов, исключаемых из защиты Portage при обновлении, разделенных пробелами
Ниже представлен пример определения всех этих переменных:
Листинг 1: Пример определения
PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
MANPATH="/usr/share/man:/usr/local/share/man"
INFODIR="/usr/share/info:/usr/local/share/info"
PAGER="/usr/bin/less"
EDITOR="/usr/bin/vim"
KDEDIRS="/usr"
CLASSPATH="/opt/blackdown-jre-1.4.1/lib/rt.jar:."
CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \
/usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \
/usr/share/texmf/tex/platex/config/ /usr/share/config"
CONFIG_PROTECT_MASK="/etc/gconf"
5.b. Глобальное определение переменных
Каталог /etc/env.d
Для того, чтобы определить эти переменные централизованно, в Gentoo появился каталог /etc/env.d. В нём находится ряд файлов, например, 00basic,
05gcc и так далее, в которых определяются переменные, необходимые программам, указанным в названии файлов.
Например, при установке gcc ebuild создает файл 05gcc, содержащий следующие определения переменных:
Листинг 2: /etc/env.d/05gcc
PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man"
INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info"
CC="gcc"
CXX="g++"
267

Настольная книга Gentoo Linux x86
LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
В других дистрибутивах вам предлагается изменять или добавлять определения переменных среды в /etc/profile или где-нибудь еще. Gentoo, с другой стороны, облегчает вам (и Portage) поддержку и управление переменными среды, избавляя от необходимости уделять внимание многочисленным файлам, содержащим определения переменных.
Например, когда обновляется gcc, также без малейшего участия пользователя обновляется и /etc/env.d/05gcc.
От этого выигрывает не только Portage, но и вы, пользователь. Иногда от вас может потребоваться глобальная установка какой-нибудь переменной. Возьмем, к примеру, переменную http_proxy. Вместо того, чтобы возиться с /etc/profile, теперь можно просто создать файл (/etc/env.d/99local) и добавить нужные определения туда:
Листинг 3: /etc/env.d/99local http_proxy="proxy.server.com:8080"
Используя один и тот же файл для всех своих переменных, вы можете быстро увидеть все определенные вами переменные вместе.
Сценарий env-update
Переменная PATH определяется в нескольких файлах в /etc/env.d. Нет, нет это не ошибка: при запуске env-update различные определения объединяются перед обновлением переменных среды, позволяя пакетам (или пользователям) добавлять собственные значения переменных, не влияя на уже существующие.
Сценарий env-update объединяет значения переменных из файлов, находящихся в /etc/env.d, в алфавитном порядке. Имена файлов должны начинаться с двух десятичных цифр.
Листинг 4: Порядок обновления, используемый env-update
00basic 99kde-env 99local
+-------------+----------------+-------------+
PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"
Внимание: объединение выполняется не всегда, а только для следующих переменных: KDEDIRS, PATH, CLASSPATH, LDPATH, MANPATH, INFODIR,
INFOPATH, ROOTPATH, CONFIG_PROTECT, CONFIG_PROTECT_MASK,
PRELINK_PATH и PRELINK_PATH_MASK. Для всех остальных переменных используется значение, определенное в последнем из файлов (по алфавиту в каталоге /etc/env.d).
При запуске сценария env-update создаются все переменные среды, и помещаются в /etc/profile.env (используемый файлом /etc/profile). Кроме того, на
268

Настольная книга Gentoo Linux x86
основе значения LDPATH создается /etc/ld.so.conf. После этого запускается
ldconfig, чтобы вновь создать файла /etc/ld.so.cache, используемый динамическим компоновщиком.
Если вы хотите, чтобы результаты работы env-update вступили в силу немедлено, для обновления среды выполните следующую команду. Пользователи, самостоятельно устанавливавшие Gentoo, возможно, помнят ее из указаний по установке:
Листинг 5: Обновление среды
# env-update && source /etc/profile



Поделитесь с Вашими друзьями:
1   ...   21   22   23   24   25   26   27   28   ...   79


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал