Текст книги "Linux"
Автор книги: Алексей Стахнов
Жанр: ОС и Сети, Компьютеры
сообщить о неприемлемом содержимом
Текущая страница: 12 (всего у книги 60 страниц) [доступный отрывок для чтения: 20 страниц]
Как всякая программа, после старта init сразу считывает свой конфигурационный файл /etc/inittab. Это обычный текстовый файл, состоящий из отдельных строк. Если строка начинается со знака # (стандартный признак комментария в конфигурационных файлах и скриптах) или пуста, она игнорируется. Все остальные строки состоят из 4 разделенных двоеточиями полей, имеющих вид:
id: runlevels: action: process
где:
• id – идентификатор строки. Выбирается произвольно, но в файле не может быть двух строк с одинаковыми идентификаторами. Если конфигурационный файл модифицируется достаточно часто, имеет смысл использовать неписаное правило нумерации строк в BASIC – номера строкам назначать кратно пяти или десяти;
• runieveis – уровни выполнения, на которых эта строка будет задействована. Уровни задаются цифрами (без разделителей);
• process – команда, которая должна быть запущена;
• action – действие. В этом поле стоит ключевое слово, которое определяет, что должен делать процесс init, пока выполняется (или после выполнения) команда, заданная полем process:
– wait – ожидать завершения процесса. Соответственно, пока не закончится данный процесс, init не запускает никаких других процессов. Как правило, такого типа процессы используются для разнообразных проверочных действий (проверка и восстановление файловых систем), а так же для запуска различных служб (демонов);
– once – выполнять процесс только один раз;
– respawn – перезапустить процесс в случае его «смерти». Актуально для некоторых служб, которые должны постоянно присутствовать в системе;
– off – игнорировать данный элемент. Можно использовать при отладке конфигурационного файла;
– boot – процесс должен быть выполнен при загрузке операционной системы, поле runieveis (уровни выполнения) при этом игнорируется;
– bootwait – то же, что и предыдущая опция, но init должен ожидать окончания работы процесса;
– initdefauit – указывает init, в какой уровень выполнения необходимо перейти системе после загрузки;
– sysinit – процесс должен быть выполнен во время загрузки операционной системы до выполнения любой строки с boot или bootwait;
– powerwait – позволяет процессу init остановить систему при пропадании электроэнергии. Применение этого ключевого слова предполагает, что используется источник бесперебойного питания (UPS), имеющий специальный интерфейс, с помощью которого источник бесперебойного питания может посылать в компьютер и принимать из него различные управляющие сигналы (например "нет питания", "выключить источник бесперебойного питания", "аккумуляторы разряжены" и т. п.), а также программное обеспечение, которое отслеживает состояние источника бесперебойного питания и информирует init о том, что питание отключилось;
– ctriaitdei – разрешает init перезагрузить систему, когда пользователь нажимает комбинацию <Ctrl>+<Alt>+<Del> на клавиатуре. Однако системный администратор может определить действия по <Ctrl>+<Alt>+<Del>, например, игнорировать нажатие этой комбинации.
Этот список не является исчерпывающим. Подробную информацию о файле inittab можно узнать из тап-страниц init, inittab.
В качестве примера приведем файл inittab, который находится в только что установленной системе Red Hat 7.1.
# inittab Этот файл описывает как процесс INIT должен настроить
# операционную систему в соответствующем уровне выполнения
#
# Author: Miquel van Smoorenburg, <[email protected]>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runieveis used by RHS are:
# 0 – halt (Do NOT set initdefault to this)
# 1 – Single user mode
# 2 – Multiuser, without NFS (The same as 3, if you do not have
# networking)
# 3 – Full multiuser mode
# 4 – unused
# 5 – X11
# 6 – reboot (Do NOT set initdefault to this)
id:3:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
13:3:wait:/etc/rc.d/rc 3
14:4:wait:/etc/rc.d/rc 4
15:5:wait:/etc/rc.d/rc 5
16:6:wait:/etc/rcd/rc. 6
# Things to run in every runlevel.
ud::once:/sbin/update
# Trap CTRL-ALT-DELETE
са::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few
# minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runieveis
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon
Сразу после запуска процесс init считывает свой конфигурационный файл /etc/inittab и производит его разбор. Сначала он определяет, какой уровень по умолчанию установлен в системе. Как видно из приведенного конфигурационного файла id:3rinitdefault уровень выполнения, в котором будет функционировать операционная система после загрузки, равен трем (то есть предполагается многопользовательский режим с поддержкой сетевых функций). Дистрибутив Red Hat по умолчанию предлагает установить вход в систему в графическом режиме – пятый уровень выполнения.
Затем процесс init принимает к сведению строки, содержащие специальные команды, такие как:
са::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -с "Power Restored; Shutdown Cancelled"
После этого процесс init инициирует команду, которую необходимо запустить при старте системы, но перед тем как перейти к какому-нибудь уровню выполнения. Эта команда содержится в строке с ключевым словом sysinit.
si::sysinit:/etc/rc.d/rc.sysinit
После этого процесс init запускает скрипты, которые должны действовать в любом уровне выполнения:
ud::once:/sbin/update
а затем команды, соответствующие уровню, заданному по умолчанию:
13:3:wait:/etc/rc.d/rc 3
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
Как можно заметить, есть несколько строк, запускающих скрипт гс, которые отличаются только уровнем выполнения и аргументом командной строки, передаваемой в скрипт гс. Функции, выполняемые скриптами rc.sysinit и гс, будут рассмотрены в разд. «Основные конфигурационные файлы».
После запуска скрипта гс процесс init выполняет запуск шести виртуальных консолей (процессов mingetty или, в более старом варианте, – gettty), что дает пользователям возможность регистрироваться в системе с терминалов (или виртуальных консолей, поскольку терминал вы вряд ли где-нибудь встретите). Для переключения между виртуальными консолями необходимо нажимать комбинацию одной из русифицированных клавиш верхнего ряда клавиатуры: клавиши <Alt> с номером, соответствующим номеру виртуальной консоли. После инициализации виртуальных консолей можно считать, что система полностью перешла в соответствующий уровень выполнения, загрузка завершилась, операционная система ожидает регистрации пользователя.
После окончания загрузки init продолжает функционировать в фоновом режиме. Поэтому, с помощью команды telinit, которая взаимодействует с процессом init, можно произвести перевод системы с одного уровня выполнения на другой или указать init перечитать свой конфигурационный файл.
Когда пользователь останавливает систему (командой shutdown, halt, poweroff или reboot), процесс init завершает все исполняющиеся процессы, размонтирует все файловые системы и останавливает процессор или производит перезагрузку системы.
Таким образом, в итоге рассмотрения предыдущего раздела мы установили, что процесс init выполняет три основных действия:
• запускает скрипт rc.sysinit из каталога /etc/rc.d;
• запускает скрипт гс из того же каталога /etc/rc.d с опцией, равной уровню выполнения (обычно третий или пятый уровни выполнения);
• запускает процессы getty.
Как следует из материала гл. 5, в каталоге /etc находится каталог rc.d, содержимое которого непосредственно касается процесса загрузки системы. Вот оно:
/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).
Рис. 6.1. Программа ntsysv
Рис. 6.2. Программа Control-panel
Можно сконфигурировать набор доступных сервисов и вручную. Для запрета старта какого-либо сервиса достаточно просто удалить соответствующую ссылку (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.
Правообладателям!
Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.Читателям!
Оплатили, но не знаете что делать дальше?