Программная реализация системы инициализации в Linux: SystemV и BSD стили. Структура, стартовые сценарии, настройки

В статье показано, как в системах Linux реализована инициализация системных служб и что при этом происходит «за кулисами», а также чем отличаются стили SystemV и BSD. В конце рассмотрены методы восстановления утраченного пароля root, базирующиеся на изложенном материале.

Александр Деревянко, ведущий консультант-эксперт, начальник отдела

В сфере IT работает с 1990 года. Занимал должности от инженера 1 категории до начальника отдела IT. В настоящий момент работает начальником отдела дистанционного обслуживания в банке "Первомайский".



20.04.2010

Введение

Исторически сложилось так, что традиционно в среде UNIX существуют две системы инициализации – SystemV и BSD. Система инициализации представляет собой набор скриптов (сценариев), которые выполняются при старте системы. Отличие между ними состоит в принципах построения – названии, расположении в файловой системе, назначении и методах конфигурирования. В Linux традиционно получила большее распространение система инициализации SystemV, и она же реализована в большинстве его самых распространенных дистрибутивов.

При старте PC-совместимого компьютера происходит такая последовательность действий. Сначала выполняется программа BIOS компьютера, затем запускается на выполнение системный загрузчик – grub, lilo или любой другой. После этого загружается ядро Linux и запускается на выполнение первый и основной системный процесс init, прародитель всех процессов. Это общее описание того, что происходит в системе при ее старте, а детальный порядок выполнения тех или иных действий во многом зависит от самой системы и конфигурации программы init.

После старта ядро линукс монтирует корневую файловую систему (как правило, в режиме «только для чтения») и именно поэтому программа init может прочитать свой конфигурационный файл и приступить к работе. Ее конфигурационный файл находится в файле /etc/inittab. В связи с необходимостью получения доступа к конфигурационному файлу программы init и стартовым скриптам в самом начале запуска системы, каталог /etc никогда не выполняется в виде отдельного раздела, а располагается на корневом, который первым и монтируется.

Рассмотрим систему инициализации SystemV.


Система инициализации SystemV

Идеология SystemV пронизана понятием уровней исполнения, которых в численном измерении бывает от 0 до 6. Считается, что система в каждый конкретный момент времени может находиться на каком-то определенном уровне исполнения. Поэтому процесс init начинает свою работу, считывая заданный уровень и выстраивая свою дальнейшую последовательность действий в соответствии с ним.

Системный администратор может самостоятельно, при помощи программы init, изменять уровень исполнения, задав его в качестве параметра процессу init. Соответствие между уровнем исполнения и состоянием системы следующее:

  • 0 – выключение системы (halt);
  • 1 или S – однопользовательский режим; служит для решения системных задач администратором;
  • 2 – почти полный аналог третьему уровню, но без поддержки NFS;
  • 3 – многопользовательский режим. Является обычным режимом при работе системы в режиме сервера;
  • 4 – не используется;
  • 5 – система стартует с поддержкой графического режима. Является штатным режимом для рабочих станций;
  • 6 – инициализирует перезагрузку системы (reboot).

Используя init, системный инженер может остановить систему, переведя ее на нулевой уровень, введя init 0 в консоли или перегрузить систему, введя init 6.


Структура файла /etc/inittab

Структура конфигурационного файла inittab в общем виде такова:

id:run_level:action:process

где:

  • id – идентификатор, представленный одним или двумя символами;
  • run_level – список уровней исполнения, на которых возможно исполнение программы (может быть пустым);
  • action – определяет нюансы исполнения программы (допускается использование только определенных служебных слов);
  • process – программа, которая будет выполняться.

Некоторые служебные слова, используемые в поле action:

  • Initdefault – определяет уровень исполнения по умолчанию. Будет использоваться именно этот уровень при загрузке системы.
  • Wait – процесс будет запущен один раз. Init будет ожидать завершения этого процесса, а затем начнет выполнение следующих программ по списку.
  • Sysinit – процесс будет выполняться самым первым при запуске системы, и init будет ожидать его завершения, прежде чем начнет выполнение других программ по списку.
  • Once – программа запускается один раз и init не ждет ее завершения.
  • Ctrlaltdel – комбинация нажатых клавиш, определяющая программу, которая будет запущена при нажатии этой комбинации (если эту позицию в файле закомментировать, то эта комбинация вообще работать не будет, и систему нельзя будет перезагрузить таким образом).
  • Powerfail – определяет процесс, который будет запущен при обнаружении процессом init сигнала восстановления питания после его сбоя.
  • Respawn – запускает процесс. Init не ожидает его завершения и обрабатывает следующие по списку строки. Если процесс завершится самостоятельно, то init запустит его вновь.

Рассмотрим отдельные строки из конфигурационного файла /etc/inittab.

id:3:initdefault: говорит о том, что уровень выполнения по умолчанию будет третий, т.е. система стартует в многопользовательском режиме без поддержки графического интерфейса и самое главное, – после чтения этой строки init будет читать и исполнять только те строки, в поле runlevel которых находится цифра 3, а все остальные строки будут игнорироваться.

si::sysinit:/etc/rc.d/rc.sysinit: процесс init запустит программу /etc/rc.d/rc.sysinit потому что в поле runlevel стоит ключевое слово sysinit. Init будет ожидать завершения выполнения этой программы.

Строка 10:0:wait:/etc/rc.d/rc 0 будет игнорироваться, потому что в поле, отвечающем за runlevel, нет цифры 3 (уровня запуска по умолчанию).

13:3:wait:/etc/rc.d/rc 3 будет запущена, потому что в поле runlevel есть цифра 3, и процесс init при этом будет ожидать ее завершения.

ca::ctrlaltdel:/sbin/shudown –t3 –r now: эта строка будет проигнорирована, но после ее прочтения init будет знать, что при получении сигнала от нажатых клавиш altctrldel необходимо будет перезагрузить компьютер.

pf::powerfail:/sbin/shutdown –f –h +2 “Power Failure; System Shutting Down”: эта строка тоже будет проигнорирована, но даст понять процессу init, что в случае сбоя питания необходимо выключить систему.

pr:12345:powerkwait:/sbin/shutdown –c “Power Restored; Shutdown Cancelled”: строка не исполняется процессом init, но дает ему знать о необходимости отменить выключение системы в случае восстановления сбоя питания.

Строки:

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

запускают программу /sbin/mingetty, которая в свою очередь инициализирует консоль терминалов tty1-tty6. Процесс init запускает эти программы и не ждет их окончания, переходя к чтению других частей конфигурационного файла.

x:5:respawn:/etc/x11/prefdm –nodaemon:

в этом случае строка игнорируется, так как в поле runlevel нет цифры 3.

Проанализировав конфигурационный файл, становится ясно, что система стартует на третьем уровне исполнения, и при этом процесс init запускает следующие файлы на выполнение:

/etc/rc.d/rc.sysinit
/etc/rc.d/rc 3
/sbin/mingetty – для каждой виртуальной консоли.

При этом первые два файла являются shell script программами.


Начало загрузки системы

Как отмечалось, процесс rc.sysinit стартует первым независимо от уровня выполнения системы. Эта программа написана на shell script, и системный инженер может сам контролировать ее, внося свои изменения в ее содержимое. Программа выполняет следующие действия, которые и составляют первоначальную загрузку системы и ее инициализацию:

  • при использовании технологии initrd отключается каталог, используемый initrd, и освобождается память, отводимая изначально под RAM-диск (в оперативной памяти);
  • выводится на исполнение программа sysctl, которая конфигурирует некоторые свойства ядра системы;
  • выставляется системное время;
  • выставляется имя хоста;
  • загружаются модули для поддержки USB- и IEEE-устройств;
  • проверяются файловые системы;
  • проверенные файловые системы подключаются для использования;
  • если были назначены квоты, то они применяются;
  • подсоединяется swap;
  • если имеется, то включается программный RAID;
  • запускается программа hdparm, служащая для конфигурирования IDE-устройств.

После rc.sysinit происходит выполнение конфигурационных файлов каталога /etc/sysconfig, при этом файлы подключаются к основному скрипту при помощи оператора ‘.‘(точка, заключенная в кавычки). В каталоге хранятся конфигурационные файлы системы инициализации и конфигурационные файлы стартовых скриптов. В этих файлах определяются различные переменные, а сами файлы можно подключать к скриптам с помощью оператора “.”. Важно не путать конфигурационные файлы программ и конфигурационные файлы стартовых скриптов этих программ. Например, для Web-сервера Apache конфигурационный файл находится в /etc/httpd/httpd.conf, а файл, отвечающий за опциональный запуск самого Web-сервера, находится в /etc/rc.d/init.d/httpd и служит для передачи специальных параметров запуска демону httpd. Существующая документация, описывающая файлы в системном каталоге /etc/sysconfig, должна находиться в каталоге /usr/share/doc/initscripts-version. В файле sysconfig.txt описаны переменные и их значения.

Имя машины, например, берется из файла /etc/sysconfig/network и определяется через переменную HOSTNAME. Подключение файла network имеет следующий вид:

if [ -f  /etc/sysconfig/network ]; then
. /etc/sysconfig/network
else
NETWORKING=no
fi

причем сначала проверяется, имеется ли вообще этот файл в системе, и только если он существует, он подключается. После его подключения в скрипте можно использовать переменные, находящиеся в network. Имя хоста определяется путем вызова функции:

action $”Setting hostname ${HOSTNAME}:  “hostname ${HOSTNAME}

причем все функции, которые могут использоваться в стартовых скриптах, находятся в файле /etc/rc.d/init.d/functions. Файл для hostname подключается так же, как и предыдущий, – путем указания строки

. /etc/init.d/functions

В самих скриптах наличие /etc/rc.d/init.d/functions не проверяется, он должен быть там по определению.

После выполнения первоначальной работы rc.sysinit по загрузке системы, в зависимости от уровня исполнения, запускается программа rc, которой в качестве параметра передается номер уровня исполнения. Ее основная функция – запуск и останов тех служб, которые должны быть запущены или остановлены исходя из требуемого уровня.

В системе инициализации BSD могут присутствовать подобные rc.sysinit скрипты, но аналога файла rc там нет. Файл rc, организация каталогов стартовых скриптов и особенности их написания для запуска и останова служб определяют стиль инициализации SystemV и отличают его от BSD-стиля.

В каталоге /etc/rc.d находятся файлы и другие каталоги, влияющие на порядок запуска тех или иных служб. Задача программы rc заключается в переходе в каталог rc с соответствующим уровнем исполнения и запуске всех файлов, начинающихся на K (с передачей им параметра “stop”). Затем происходит запуск всех файлов, начинающихся на S с передачей им параметра “start”.

Все файлы, которые находятся в каталоге /etc/rc.d/init.d, являются стартовыми скриптами определенных программ. Эти программы должны поддерживать как минимум два параметра – start и stop, которые определяют их старт и останов.

Администратор может самостоятельно менять программы, предназначенные для старта или останова путем добавления или удаления из каталога этого уровня исполнения ссылок на стартовые скрипты программ.


Применение стартовых скриптов в администрировании системы

Для применения стартового скрипта вручную необходимо в консоли дать команду на запуск этого скрипта и указать полный путь к нему. В этом случае в качестве параметра передаются аргументы start или stop или какие либо другие, определенные в самом скрипте. Например, для запуска поддержки сети необходимо дать на исполнение следующую команду:

/etc/rc.d/init.d/network start

а для ее останова команду:

/etc/rc.d/init.d/network stop

При этом перезапуск сети осуществится командой:

/etc/rc.d/init.d/network restart

Рассмотрим применение изложенного материала на практике. При работе иногда может быть утрачен (или забыт) пароль суперпользователя. В старых системах его было легко восстановить – достаточно было перейти в однопользовательский режим (уровень исполнения 1 или S), и система уже предоставляла консоль с правами root без запроса пароля. В современных дистрибутивах, как правило, при загрузке в однопользовательский режим сначала требуется ввести пароль суперпользователя, а уж затем предоставляется консоль со всеми правами. Поэтому используются другие подходы для решения этой задачи. Основная задача при смене пароля в современных системах с SystemV – получить возможность выполнять программы с привилегиями суперпользователя. Первый способ получить такую возможность – это загрузиться с внешнего носителя и, подключив файловую систему, в которой находится каталог /etc, удалить вручную файл shadow. После этого, при обычной загрузке, система не будет спрашивать пароль при входе под root (если система изначально не настроена на запрет входа пользователей без паролей).

Второй способ подразумевает использование опций ядра системы. Суть состоит в замене стандартной программы init на любую другую для быстрого старта интерпретатора bash. При этом механизмы, отвечающие за аутентификацию пользователя, включаться не будут, и можно будет сразу получить командную строку с привилегиями root.

Для изменения стартовой программы ядру надо передать нужную опцию в виде: init = /полный маршрут/к нужной программе/. Тогда, после старта, будет смонтирован только корневой каталог (поскольку не выполнялись скрипты инициализации) в режиме «только для чтения». Перемонтировав их в режим «чтения-записи» и вызвав программу passwd на исполнение, можно сменить пароль root.

Для этого в строке загрузчика, соответствующей ядру Linux, нужно добавить опцию:

init = /bin/bas

После загрузки системы запустится интерпретатор bash c правами суперпользователя. Перемонтировав корневую файловую систему в режиме rw, нужно ввести команду passwd, т.е.:

mount –o rw,remount /
passwd

затем сбросить буферы файловой системы на диск для синхронизации внесенных изменений командой sync и перезапустить компьютер командой reboot. После этого пароль для суперпользователя будет изменен.


Выводы

В статье изложены общие принципы систем инициализации SystemV и BSD. В Linux наибольшее распространение получила система SystemV.

BSD отличается от SystemV принципом построения стартовых скриптов, их названием, местоположением в файловой системе, назначением и способом конфигурирования.

Изложен порядок запуска PC-совместимого компьютера – от старта BIOS до запуска процесса init.

Описан процесс назначения и конфигурирования процесса init, его конфигурационного файла /etc/inittab, подробно описаны опции настройки.

Рассмотрена последовательность загрузки стартовых скриптов. Описана структура каталогов их хранения, конфигурационные файлы, способы подключения в основной скрипт, порядок загрузки системных служб.

Рассмотрены методы ручного управления стартовыми скриптами при решении задач администрирования системы.

Основываясь на изложенном материале, рассмотрены способы восстановления пароля суперпользователя системы в случае его утраты.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


  • Bluemix

    Узнайте больше информации о платформе IBM Bluemix, создавайте приложения, используя готовые решения!

  • Библиотека документов

    Более трех тысяч статей, обзоров, руководств и других полезных материалов.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=484250
ArticleTitle=Программная реализация системы инициализации в Linux: SystemV и BSD стили. Структура, стартовые сценарии, настройки
publish-date=04202010