Linux
Шрифт:
/init.d
/rc0.d
/rc1.d
/rc2.d
/rc3.d
/rc4.d
/rc5.d
/rc6.d
rc
rc.local
rc.sysinitОпираясь на предыдущую информацию, нетрудно заметить, что существует семь каталогов для каждого уровня выполнения, какой-то каталог /init.d и три исполняемых файла, два из которых нам уже знакомы – гс и rc.sysinit. Третий файл – rc.local – вызывается по окончании исполнения файла гс и предназначен для команд, добавляемых администратором для запуска в процессе начальной загрузки. Редактировать файл гс не возбраняется, однако вероятность ошибки в файле, содержащем сотню-другую строк, очень велика, поэтому настоятельно рекомендуется использовать только файл rc.local. rc.sysinit
Вернемся к процессу загрузки. Файл rc.sysinit предназначен для выполнения начальных действий, необходимых для корректного функционирования операционной системы. Ниже приведен список действий, выполняемых скриптом rc.sysinit. Конечно, он зависит от дистрибутива и от конфигурации системы, но в большей части он неизменен.
Действия скрипта:
• установка путей;
• установка имени хоста;
• чтение конфигурационных данных из /etc/sysconfig/network;
• вывод баннера;
• монтирование файловой системы /proc;
• конфигурирование параметров ядра системы, используя файл /etc/sysctl.conf;
• установка системных часов, используя конфигурацию из /etc/sysconfig/clock;
• установка параметров клавиатуры консоли программой loadkeys в соответствии с файлами /etc/sysconfig/console/default.kmap или /etc/sysconfig/keyboard;
• загрузка системного шрифта из /etc/sysconfig/i18n и файлов с расширением pcf.gz или gz из каталогов /etc/sysconfig/console, /usr/lib/kbd/consolefonts или /lib/kbd/consolefonts;
• активация
• инициализация USB-контроллера;
• запуск программы fsck для корневой системы, при обнаружении серьезных проблем выполняется немедленная перезагрузка;
• старт PNP-устройств в соответствии с /etc/isapnp.conf;
• перемонтирование корневой файловой системы в режим чтения/записи;
• перенастройка таблицы монтирования /etc/mtab;
• проверка квот для корневой файловой системы;
• проверка необходимости загрузки модулей, нахождение зависимостей, загрузка и конфигурирование модулей;
• подключение RAID-устройств;
• запуск fsck для других систем;
• монтирование локальных файловых систем;
• включение механизма квот;
• удаление тригерных файлов загрузки;
• очистка каталогов /var/lock и /var/run;
• очистка файлов /var/run/utmp и /var/run/utmpx;
• удаление файлов-защелок из /tmp;
• включение подкачки;
• инициализация последовательных устройств, используя скрипт /etc/rc.d/rc.serial;
• загрузка модулей для SCSI-стримера;
• генерация файла заголовка для определения загружаемого ядра командой /sbin/mkkerneldoth;
• установка ссылки /boot/System.map;
• проверка использования интерактивного режима загрузки и, в случае необходимости, создание файла /var/run/confirm.
Запуск проверки файловой системы командой fsck может быть принудительно отключен при наличии файла /fastboot, а также включен при наличии /forcefsck. Создать эти файлы можно выполнением команды shutdown с соответствующими ключами. Однако не рекомендуется злоупотреблять этими возможностями.
Sysctl позволяет зафиксировать ряд параметров и обеспечить (через /etc/sysctl.conf) их установку после перезагрузки. Вот как выглядит /etc/sysctl.conf сразу после инсталяции системы:# Disables packet forwarding
net.ipv4.ip_forward = 0
# Enables source route verification
net.ipv4.conf.all.rp_filter = 1
# Disables the magic-sysrq key
kernel.sysrq = 0
rcПрежде чем приступить к разбору скрипта гс, необходимо упомянуть о каталогах /rcX.d и /init.d. Уточним еще раз – иерархия /rcX.d характерна для дистрибутивов Red Hat и базирующихся на нем, в других дистрибутивах и в UNIX-системах их может и не быть. Эти каталоги играют исключительную роль в процессе загрузки, поскольку они содержит основные скрипты, необходимые для организации процесса загрузки.
Подкаталог /init.d содержит по одному скрипту для каждой из служб, установленных в системе (sendmail, HTTP, Samba, FTP и т. п.). Этот скрипт отвечает за запуск, остановку или перезагрузку соответствующей службы. В каталоге /rcX.d находятся ссылки на файлы скриптов, как правило расположенные в каталоге /etc/rc.d/init.d. Названия этих ссылок имеют имена, начинающиеся либо с буквы К, либо с буквы S, после которой вдет двухзначное число и имя соответствующей службы. Буквы S и К – первые буквы слов start и kill соответственно. Из этого следует, что файл, начинающийся с буквы S, отвечает за старт соответствующего процесса, а файл, начинающийся с буквы К, отвечает за остановку соответствующего процесса. Цифры, идущие после S или К в именах ссылок, задают порядок запуска скриптов.
Заглянем в файл гс. Первым делом скрипт пытается определить текущий уровень выполнения и уровень выполнения, в который необходимо перевести систему. После этого он проверяет, нажимал ли пользователь букву I для перехода в режим пошаговой загрузки процессов. Затем скрипт останавливает запущенные на предыдущем уровне выполнения процессы, отсутствующие на новом уровне выполнения, а потом запускает необходимые службы для нового уровня выполнения. Как правило, одна и та же служба нужна на нескольких уровнях. Поэтому не имеет смысла эту службу при переходе с одного уровня выполнения на другой останавливать и тут же запускать. В Linux для этой цели используются специальные флаги.
В качестве флагов служат файлы в каталоге /var/lock/subsys/${subsys} или /var/lock/subsys/${subsys}.init, где subsys – имя соответствующей службы. Если файлов нет, то данный процесс считается незапущенным (запуск S-файла имеет смысл), а если есть – запущенным (запуск К-файла имеет смысл). Так же для программы linuxconf создается специальный флаг /var/run/rimlevel.dir, из которого можно узнать текущий уровень выполнения системы.
Для управления набором доступных служб в текущем уровне выполнения можно использовать программу конфигурирования linuxconf, программу ntsysv (рис. 6.1), /usr/sbin/setup или графическую программу Control-panel (рис. 6.2).
Можно сконфигурировать набор доступных сервисов и вручную. Для запрета старта какого-либо сервиса достаточно просто удалить соответствующую ссылку (SXXlalala) из необходимого каталога /rcX.d, а для разрешения – создать соответствующую ссылку в нужном каталоге /rcX.d. Однако не следует забывать помимо стартовой ссылки создавать стоповую, иначе возможны проблемы, когда система некорректно завершит функционирование сервиса, для которого забыли создать стоповую ссылку. А как же корректно установить порядковый номер у соответствующей ссылки? Конечно, можно чисто эмпирически подобрать номер, исходя из функций, выполняемых сервисом. Но давайте заглянем в любой файл в каталоге /etc/rc.d/init.d/, к примеру, в файл anacron:
#!/bin/sh
# Startup script for anacron
# chkconfig: 2345 95 05
# description: Run cron jobs that were left out due to downtime# Source function library.
. /etc/rc.d/init.d/functions
[-f /usr/sbin/anacron] || exit 0
prog="anaсron"
start {
echo -n $"Starting $prog: "
daemon anacron
RETVAL=$?
[$RETVAL – eq 0] && touch /var/lock/subsys/anacron
echo
return $RETVAL
}
stop {
if test "x" pidof anacron""!= x; then
echo -n $"Stopping $prog:»
killproc anacron
echo
fi
RETVAL=$?
[$RETVAL – eq 0] && rm -f /var/lock/subsys/anacron
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status anacron
;;
restart)
stop
start
;;
condrestart)
if test "x" pidof anacron""!= x; then
stop
start
fi
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
exit 0
###################################################################Обратите внимание на часть заголовка файла:
#!/bin/sh
# Startup script for anacron
# chkconfig: 2345 95 05
# description: Run cron jobs that were left out due to downtimeПомимо указания, какой командной оболочкой необходимо воспользоваться, там есть строчка
# chkconfig: 2345 95 05
Из которой следует, что этот скрипт может использоваться во втором, третьем, четвертом и пятом уровнях выполнения, а цифры 95 и 05 – порядковый номер для стартового (95) и стопового (05) скриптов. Обратите внимание – в сумме эти две цифры составляют 100. Таким образом, достаточно просто добиться того, чтобы порядок останова сервисов был в точности обратный стартовому. Description в данном файле – комментарий, который linuxconf выдает на экран для объяснения роли данного сервиса.
Если внимательно посмотреть скрипт, то сразу видно, что опций у него больше, чем стандартные start и stop. Имеются еще restart, condrestart и status. Старт, останов и проверка состояния демона выполняются рядом функций типа daemon, killproc, status. Процедуры daemon, killproc, status – определяются в файле /etc/rc.d/init.d/functions (а тот пользуется определениями из /etc/sysconfig/init). Они предназначены для старта, останова и проверки статуса демона (сервиса).
Функция daemon обеспечивает старт сервиса. При этом можно учесть особенности поведения демона. Перед стартом сервиса всегда делается проверка наличия его в системе. Так как появление дампа (дамп – моментальный снимок памяти, используемой зависшей программой на момент ее краха) памяти сервиса может привести к проблемам с безопасностью, то все демоны запускаются в режиме без создания дампа памяти.
Останов сервиса выполняется процедурой killproc. Данная функция предполагает один аргумент в виде имени демона и, при необходимости, еще один для указания сигнала, который будет послан сервису. Сигнал sigkill часто может быть нежелателен для останова сервиса, поэтому, если сигнал назначен, то используется только он, в противном случае сперва посылается sigterm и, если данный сигнал не произвел на процесс впечатления, то посылается сигнал sigkill. В последнюю очередь скрипт подчищает различные блокировочные файлы.
Функция status позволяет проверить текущее состояние сервиса. Если сервис нормально функционирует, то просто сообщается об этом факте. В противном случае осуществляется проверка на наличие флаговых файлов (/var/run/noflCHCTeMa.pid и /var/lock/subsys/подсистема), которые должны блокировать повторный запуск сервиса. Таким образом, несложно самому создать скрипт для управления сервисом.
rc.localФайл /etc/rc.d/rc.local выполняется после скрипта rc. В исто рекомендуется помещать дополнительные сервисы или персональные настройки. Однако обычный пользователь редко использует эту возможность.
Другие файлы, влияющие на процесс загрузки
Все файлы конфигурации, задействованные при загрузке системы, находятся
в каталоге /etc:
• /etc/fstab – содержит информацию об автоматически монтируемых при старте файловых системах;
• /etc/skel – образцы файлов конфигурации, используются при создании учетных записей новых пользователей;
• /etc/bashrc – общесистемный файл для командной оболочки;
• /etc/initscript – файл, позволяющий задать специфические действия для каждой команды из файла /etc/inittab (подробную информацию следует искать в справочной системе).
Второстепенные файлы конфигурации:
• /etc/issue – сообщение, выдаваемое системой до приглашения "login: ";
• /etc/motd – сообщение, выдаваемое системой после регистрации пользователя.
Процессы, происходящие при регистрации пользователя
Последовательность событий при регистрации пользователя:
1. Пользователь вводит свое регистрационное имя (login) по приглашению "login: " процесса getty;
2. Процесс getty выполняет программу login, передавая программе login в качестве аргумента регистрационное имя пользователя;
3. Программа login запрашивает пароль и сверяет регистрационное имя и пароль пользователя с записанными в файле /etc/passwd (login) и /etc/shadow (пароль). При этом введенный пароль пользователя шифруется по специальному алгоритму (в последнее время чаще всего используется алгоритм MD5), и полученный результат сравнивается с зашифрованным паролем, хранящимся в /etc/shadow;
4. В случае, если регистрационное имя пользователя или пароль не совпали с хранящимся в системе, то после паузы (около 3 секувд, задержка настраивается) выводится сообщение Password incorrect. Программа login завершает свою работу, а процесс getty снова выводит приглашение "login: ";
5. Если проверка регистрационного имени и пароля пользователя прошла успешно, login выводит на экран из файла /etc/motd так называемое "сообщение дня";
6. После этого login запускает командную оболочку (shell), указанную в бюджете пользователя, и устанавливает переменную среды TERM;
7. Оболочка shell выполняет файлы, исполняемые при регистрации пользователя в системе, сперва общесистемные, а затем пользовательские (если это Bourne-shell, выполняется файл. profile, если C-shell —.login и. cshrc, если Korn-shell —.profile и. kshrc). В этих файлах можно указать специфические настройки пользователя, переменные окружения, запустить какие-то приложения. После этого shell выводит на экран приглашение и ожидает ввода информации.
Основные файлы, участвующие в регистрации пользователяВ регистрации пользователя участвуют следующие файлы:
• /etc/profile – общесистемный профильный файл, устанавливает пути и другие важнейшие переменные;
• /etc/passwd – различная регистрационная информация, такая как имя пользователя, группа пользователя, домашний каталог и командный интерпретатор;
• /etc/shadow – в определенной мере дублирует файл passwd, но его основное назначение – хранить пароли пользователей;
• /etc/bashrc – общесистемный файл конфигурации bash;
• /домашний каталог/.* – пользовательские файлы конфигурации.
Если требуется, чтобы при регистрации пользователя выполнялся какой-то скрипт или устанавливались переменные окружения, то для этого надо вызов данного скрипта поместить в ""/.profile или в. bash_profile.
Если необходимо, чтобы пользователь не мог отменить выполнение какого-то скрипта или команды при его регистрации в системе, то для этого следует вписать в./etc/profile следующее:if test $USER = petya; then
echo Hello Petya!
#здесь запускается ваш скрипт
fiЭти команды будут исполняться только при регистрации в системе пользователя petya.
Загрузка в однопользовательском режиме
Помимо стандартной загрузки, описанной ранее, можно заставить процесс init загрузить систему на уровне выполнения, отличном от загружаемого по умолчанию. Эта возможность крайне необходима в случае, когда у операционной системы есть проблемы. Это могут быть чьи-то неудачные эксперименты с файлом inittab или неправильно сконфигурированный процесс (например, если сеть нормально не настроена, sendmail пытается найти хост, которого нет. Это может привести к задержке при старте системы в 10 минут и более). При возникновении такой ситуации необходимо перевести систему в однопользовательский режим и решить проблему. Для этого в строку приглашения LILO (boot:) надо ввести аргументы single или emergency. Это позволит загрузить систему в однопользовательском режиме (уровень выполнения 1), при котором в системе работает только суперпользователь (root) и запускается очень небольшое число самых необходимых системных служб, включая login. Другим способом перевода системы в однопользовательский режим является применение команды teiinit, которая, собственно, является символической ссылкой на сам init. Команда teiinit, помимо перевода системы с одного уровня выполнения в другой, может заставить процесс init перечитать файл inittab без перезагрузки операционной системы.
Однопользовательский режим необходим для выполнения административных задач, таких как проверка и восстановление файловой системы. К примеру, запуск fsck в разделе /usr. Обычно необходимость перехода в однопользовательский режим возникает тогда, когда fsck не может автоматически восстановить файловую систему при загрузке. Такое случается редко, обычно при пропадании электроэнергии во время работы компьютера или выходе из строя жесткого диска.
Однако бывают случаи, когда в однопользовательском режиме загрузиться с жесткого диска невозможно. В этом случае можно загрузиться в однопользовательском режиме с дискеты или с CD-ROM. Такое может произойти в случае серьезного краха системы (что иногда бывает смертельно для информации на жестком диске) или когда, к примеру, при установке Windows переписывает MBR, и в результате уничтожается загрузчик LILO (разделы Linux и система жизнеспособны, только загрузить ее нечем). Более подробную информацию см. в гл. 40.
Из соображений безопасности правильно сконфигурированная система при загрузке в однопользовательском режиме запросит пароль пользователя root.
Существует еще один способ вмешаться в процесс загрузки. В процессе загрузки системы выдается сообщение Press «I» to enter interactive startup. Если вы нажмете клавишу <1>, система перейдет в режим пошагового выполнения загрузки сервисов (подобно нажатию клавиши <F8> в Windows и выбора режима загрузки step by step).
Это позволит отказаться от загрузки подозрительных (с вашей точки зрения) процессов и определить, при запуске какого процесса возникают неприятности.
Утилиты
Подводя итог, перечислим утилиты, участвующие в процессе загрузки системы:
• init – программа, управляющая загрузкой операционной системы;
• teiinit – утилита для управления процессом init;
• runlevel – выводит текущий уровень выполнения;
• linuxconf – утилита конфигурации операционной системы Linux. В том числе позволяет редактировать список сервисов, запускаемых в текущем уровне выполнения;
• ntsysv – консольная утилита для редактирования списка сервисов, запускаемых в текущем уровне выполнения;
• /usr/sbin/setup – консольная утилита для конфигурирования операционной системы;
• control-panel – графическая утилита для конфигурирования операционной системы.
Ссылки
• www.osp.ru/os/2001/02/073.htm – и. Облаков. Восход солнца вручную.
• /usr/src/Linux-2.4.3/Documentation/ – много информации, так или иначе связанной с ядром операционной системы, драйверами, файловыми системами и т. п.
• Справочные страницы man – init, inittab, teiinit, initscript.
• Соответствующие HOWTO (см. гл. 13):