Вы находитесь на странице: 1из 25

Модуль 2.

Загрузка ОС и уровни запуска


Изучив данный модуль, вы научитесь:
• описывать общий процесс загрузки ОС Linux и понимать его работу
• настраивать универсальный загрузчик GRUB
• описывать уровни запуска (runlevels)
• управлять автоматическим запуском сервисов ОС
Навыки RHCSA:
o выполнять вход в систему под разными пользователями и на разных уровнях запуска (runlevels)
o загружать, перезагружать и завершать сеанс работы с системой штатным образом
o загружать систему на требуемый уровень запуска
o использовать режим загрузки «одного пользователя» для восстановления доступа к ОС
o запускать, останавливать и проверять статус сетевых сервисов
o настраивать загрузку ОС на требуемый уровень запуска автоматически
o настраивать автоматический запуск сетевых сервисов в процессе загрузки ОС
o изменять параметры загрузчика ОС

2.1. Процесс загрузки ОС


Обеспечить корректность загрузки ОС и поддерживать ее со временем одна из типовых задач
системного администратора. Данный навык требует общего понимания принципа загрузки ОС
и его основных этапов. Кроме того, это является необходимым требованием для решения
задач, связанных с исправлением процесса загрузки ОС при прохождении экзамена RHCSA.

Рисунок 2. Общий процесс загрузки ОС Linux


После включения компьютера происходит выполнение специального кода начальной загрузки.
На персональных компьютерах данной код представлен в виде базовой подсистемы
ввода/вывода - BIOS (Basic Input/Output System). Коду BIOS известно почти все об
устройствах, расположенных на материнской плате: о контроллере жестких дисков, плате
сетевого адаптера, контроллере клавиатуры и других устройствах. В настройках BIOS можно
выбирать, с какого устройства следует начинать загрузку ОС. После того как подсистема BIOS
определила, с какого устройства ей следует загружать ОС, считываются первые 512 байт
данного устройства. Эта часть диска называется загрузочной записью (MBR - Master Boot
Record). В данной записи хранится программа первичной загрузки (stage1), которая сообщает
компьютеру о том, в каком разделе диска расположена программа вторичной загрузки
(stage2 - непосредственный загрузчик ОС). В данном курсе в качестве такого загрузчика
рассматривается GRUB (GRand Unified Boot Loader). Помимо программы вторичной загрузки
существует еще дополнительная программа (stage1.5 1), помогающая загрузчику ОС
определить некоторые параметры файловой системы. Это дополнительная программа
используется в том случае, если загрузчик GRUB не был установлен непосредственно в
загрузочную запись MBR.
После того, как управление передастся программе вторичной загрузки ОС (stage2), загрузчик
GRUB отображает список доступных версий ядра ОС Linux и дополнительных ОС (например,
Windows), если они доступны. В противном случае система передает ручное управление в
командную строку GRUB.
После выбора требуемой версии ядра ОС Linux, GRUB приступает к своей основной
обязанности - загрузке ядра ОС. По умолчанию, загрузчик GRUB настроен на авто загрузку
ядра Linux, заданного по умолчанию, с задержкой 5 секунд. Если среди опций загрузки ядра
отсутствует параметр quiet, то в процессе загрузки система будет отображать служебную
информацию на экран. Данную служебную информацию можно просмотреть не только в
процессе загрузки ОС, но и используя команду dmesg или файл журнала загрузки
/var/log/dmesg.
Вывод служебной информации существенно зависит от оборудования, на котором установлена
ОС Linux. В данной информации можно выделить следующие основные показатели:
• версия ядра ОС;
• количество распознанной оперативной памяти;
• количество процессоров (CPU0, CPU1 и т.д.) и их характеристики;
• статус режима работы механизма SELinux 2;
• параметры загрузки ядра ОС и его модулей;
• количество свободной памяти отданной под начальный диск памяти (initramfs);
• жесткие диски и соответствующие им разделы (например, /dev/sda);
• сетевые адаптеры (например, eth0);
• смонтированные файловые системы (например, ext4);
• разделы подкачки и их размер.
Анализ данной информации может помочь в случае возникновения проблем загрузки ОС
Linux.
После того, как ядро было загружено загрузчиком GRUB, оно выполняет базовую настройку
необходимых устройств, в том числе загрузку начального диска оперативной памяти initrd,
позволяющего загрузить все необходимые драйверы обнаруженных устройств, а также

1 В версии загрузчика GRUB 2 данная программа отсутствует ввиду наличия собственного режима восстановления
(rescue mode).
2 Механизм SELinux используется для контроля доступа приложения к ресурсам ОС.
подсистемы LVM и RAID для работы с устройствами данных типов. После этого ядро
монтирует необходимые разделы файловой системы: корневой раздел «/» и «/usr» и передает
управление процессу init. Затем при помощи процесса init специальная программа upstart
выполняет автоматическую загрузку всех системных сервисов. Начиная с этого момента,
загрузка сервисов ОС Red Hat Enterprise Linux 6 отличается от традиционного процесса
загрузки сервисов (SysV), используемого в Red Hat Enterprise Linux 5 и позволяет частично
распараллелить запуск сервисов, запуская их по необходимости, а не последовательно. В
последующих версиях Red Hat Enterprise Linux, начиная с версии ядра 3.0, процесс загрузки
ОС еще более оптимизирован при помощи программы systemd 3, использующей полностью
асинхронный режим работы и существенно ускоряющей загрузку ОС. В данном пособии в
целях подготовки к экзамену EX-200 рассматривается использовании программы upstart, как
основного средства управления сервисами и процессом их загрузки.
Передав управление процессу init, ядро ОС Linux переходит в «спящий» режим и принимает
обращения всех процессов операционной системы для обработки типовых задач, таких как
запуск программ, чтение данных с устройств и т.д. Все общение между процессами ОС и
ядром выполняется через универсальный интерфейс системных вызовов:

3Технология systemd уже реализована в дистрибутиве Fedora, начиная с 15-ой версии. Её особенности описаны на
сайте: http://fedoraproject.org/wiki/Systemd. Различия всех трёх подходов в управлении процессом загрузки описаны
на сайте: http://0pointer.de/blog/projects/why.html
Рисунок 3. Взаимодействие приложений с ядром ОС Linux

2.1.1. Универсальный загрузчик GRUB


Одним из вариантов загрузчика ОС Linux является программа GRUB, работа которой
организована в несколько этапов: stage1, stage 1.5 (опциональный этап) и stage2. На этапе
stage1 загрузчик определяет расположение загрузочной записи MBR на активном разделе
жесткого диска. После того как файлы ядра будут найдены и программа, хранящаяся в
загрузочной записи, сообщит компьютеру, что загрузчик ОС (stage2) находится в разделе
/boot, управление передается данному загрузчику и на экран выводится список доступных
операционных систем.
Рисунок 4. Основное меню загрузчика GRUB

Меню загрузчика GRUB позволяет настраивать различные варианты загрузки ядра ОС Linux,
выбирать операционную систему, которая должна быть загружена, определять режим загрузки
ОС, а также выполнять операции по восстановлению системы, используя собственный
интерфейс командной строки. Основные команды, которые используются для управления
загрузчиком GRUB, приведены табл. 2.1.
Таблица 2.1. Основные команды работы в меню загрузчика GRUB
Команда Описание
a Используется для изменения параметров загрузки ядра.
b Используется для загрузки ОС (выделенная запись меню GRUB).
c Используется для входа на интерфейс командной строки.
d Используется для удаления текущей записи меню GRUB.
e Используется для редактирования меню GRUB.
o Используется для вставки пустой строки под текущей записью в меню GRUB (режим
редактирования меню GRUB).
O Используется для вставки пустой строки над текущей записью в меню GRUB (режим
редактирования меню GRUB).
Параметры меню загрузчика GRUB записываются в конфигурационный файл grub.conf,
который можно отредактировать после окончания процесса загрузки ОС. После ввода команды
a появляется возможность в качестве одно из аргументов загрузки ядра указать один из
следующих режимов загрузки ОС:
• Режим одного пользователя (Single-User mode) – используется для выполнения задач по
обслуживанию работоспособной ОС, например, когда требуется сбросить пароля
пользователя root. Отметим, что для сброса пароля пользователя root потребуется
отключить SELinux командой setenfroce 0 и задать новый пароль командой passwd.
• Уровни запуска 2 или 3 – используется для частичного запуска системных сервисов ОС
• Аварийный режим (Emergency mode) – используется для выполнения задач в
неработоспособной системе без запуска каких либо системных сервисов, включая init. Для
запуска системы в данном режиме используется аргумент emergency. Типовым примером
проблемы, решаемой в данном режиме, может быть переустановка пакета программы,
файлы которого были повреждены или изменены и корректная загрузка сервиса этой
программы невозможна.
• Режим восстановления (Rescue mode) – используется для восстановления загрузки ОС.
Используется для восстановления данных и решения проблем загрузки ОС. Для запуска
системы в данном режиме используется аргумент rescue. Типовой задачей для перехода в
этот режим является необходимость переустановки загрузчика GRUB, который был
поврежден, удален или заменен другой ОС.
По умолчанию конфигурация загрузчика GRUB хранится в одном файле /boot/grub/grub.conf,
однако существуют две символьных ссылки (ярлыка) /etc/grub.conf и /boot/grub/menu.lst на
данный файл, так что редактирование конфигурации загрузчика возможно путем
редактирования любого из этих трёх файлов.
Загрузчик GRUB является универсальным загрузчиком и позволяет загружать не только ОС
Linux, но и другие ОС, включая Windows, используя вызов сторонних загрузчиков.
Для изменения параметров 4 загрузки ядра используется команда a, присутствующая в меню
GRUB. Например, если в конец строки загрузки ядра добавить параметр single, то система
будет загружена в режим работы одного пользователя (Single-User mode). В случае если ОС
некорректно распознает количество установленной оперативной памяти, необходимо добавить
параметр mem=XM, где X обозначает количество мегабайт оперативной памяти.
В случае возникновения проблем с загрузкой ОС Linux в первую очередь необходимо
проверить конфигурацию загрузчика GRUB, содержащуюся в файле /boot/grub/grub.conf. В
следующем листинге приведено типовое содержание данного конфигурационного файла в ОС
Red Hat Enterprise Linux 6:
# cat /boot/grub/grub.conf –n (команда cat запущена в режиме отображения
номеров строк)
1 # grub.conf generated by anaconda
2 #
3 # Note that you do not have to rerun grub after making changes to
this file
4 # NOTICE: You have a /boot partition. This means that
5 # all kernel and initrd paths are relative to /boot/, eg.
6 # root (hd0,0)
7 # kernel /vmlinuz-version ro root=/dev/mapper/vg_rhel01-
lv_root
8 # initrd /initrd-[generic-]version.img
9 #boot=/dev/sda
10 default=0
11 timeout=5
12 splashimage=(hd0,0)/grub/splash.xpm.gz
13 hiddenmenu
14 title Red Hat Enterprise Linux (2.6.32-358.el6.i686)
15 root (hd0,0)
16 kernel /vmlinuz-2.6.32-358.el6.i686 ro
root=/dev/mapper/vg_rhel01-lv_root rd_LVM_LV=vg_rhel01/lv_root rd_NO_LUKS
LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto

4Полный список параметров ядра ОС Linux доступен по адресу http://www.kernel.org/doc/Documentation/kernel-


parameters.txt или по команде man bootparam
rd_LVM_LV=vg_rhel01/lv_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb
quiet
17 initrd /initramfs-2.6.32-358.el6.i686.img
В первой строке файла сообщается о том, что он был создан программой Anaconda,
являющейся штатной программой-установщиком ОС Linux. В следующей строке содержится
уведомление о том, что для сохранения изменений нет необходимости выполнять команду
grub после внесения изменений в файл grub.conf, поскольку данный файл автоматически
привязан к программе первичной загрузки stage1, расположенной в загрузочной записи MBR.
Строка со словом Notice появляется в том случае, если каталог /boot был сделан отдельным
разделом. Каталог /boot ассоциирован с параметром root, в данном случае root (hd0,0). Однако
на самом деле корневой каталог / находится логическом томе LVM и имеет абсолютный путь
устройства /dev/mapper/vg_rhel01-lv_root. Загрузчик GRUB использует правила именования
физических устройств BIOS, отличающиеся от стандартных соглашений, принятых в ОС
Linux:
(hdn[ ,m])
Где hd – тип устройства (жесткий диск), n – порядковый номер жесткого диска, m – номер
раздела на диске.
Загрузчик не различает устройства типа hd от sd и использует одинаковое название для обоих
типов устройств - hd. Первое числовое значение определяет номер физического диска
(нумерация ведется с нуля), а второе - номер раздела (правила нумерации аналогичны). В
рассматриваемом листинге запись (hd0,0) соответствует первому разделу первого жесткого
диска - /dev/sda1. К данному устройству монтируется каталог /boot, содержащий файл ядра
ОС, образ памяти initrd и конфигурационные файлы загрузчика GRUB. Девятая строка файла
grub.conf сообщает, что загрузочным устройством, содержащим загрузочную запись MBR,
является устройство /dev/sda. Важно понимать этот синтаксис для решения проблем поиска
загрузчиком основного раздела и расположения ядра ОС.
После закомментированных строк записаны непосредственно команды загрузчика GRUB.
Первая команда default, обозначает номер заголовка меню (title), который необходимо
использовать для загрузки ОС по умолчанию. Нумерация заголовков меню начинается с 0. В
листинге присутствует лишь один заголовок title, при выборе которого будет осуществлена
загрузка ОС Red Hat Enterprise Linux (2.6.32-358.el6.i686). Команда timeout обозначает время
задержки в секундах, по истечении которого автоматически будет загружена ОС, указанная в
директиве default. Директива splashimage указывает на файл, содержащий графические
примитивы для отображения меню GRUB. Директива hiddenmenu обозначает, что по
умолчанию меню скрыто от пользователя и вместо него на экране отображается строка вида
Booting Red Hat Enterprise Linux Server (2.6.32-358.el6.i686) in 5 seconds... Далее следуют
команды описания расположения корневого раздела /, в данном случае это (hd0,0),
расположения файла ядра ОС Linux vmlinuz-2.6.32-358.el6.i686, с указанием всех необходимых
параметров загрузки ядра, расположения файла образа начального диска оперативной памяти
initrd-2.6.18-53.el5.img. Начальный диск оперативной памяти (Initial RAM disk) в процессе
загрузки ОС создает временную файловую систему, содержащую модули ядра и программы,
необходимые для монтирования файловых систем и запуска всех остальных системных
процессов.
Параметры загрузки ядра указываются через пробел, например, ro
root=/dev/mapper/vg_rhel01-lv_root rhgb quiet и представляют собой отдельные аргументы с
конкретным значениями (указывается после символа =) или без значений. По умолчанию
используются следующие параметры:
• ro - сообщает о том, что каталог /boot открывается в режиме чтения: это делается с целью
защиты раздела от случайной записи неверных данных.
• root=/dev/mapper/vg_rhel01-lv_root – обозначает название устройства, которое содержит
корневую файловую систему
• rd_LVM_LV=vg_rhel01/lv_root – определяет название логического тома LVM для корневого
раздела
• rd_NO_LUKS – указывает на то, что модуль зашифрованной файловой системы не будет
загружен
• LANG=en_US.UTF-8 – определяет локализацию терминала
• rd_NO_MD – указывает на то, что модуль MD RAID не будет загружен
• SYSFONT=latarcyrheb-sun16 – определяет используемый шрифт для работы в терминале
• crashkernel=auto – определяет размер оперативной памяти, зарезервированный для утилиты
создания дампов ядра kdump
• rd_LVM_LV=vg_rhel01/lv_swap – определяет название логического тома LVM для корневого
раздела
• KEYBOARDTYPE=pc – определяет тип клавиатуры для работы в терминале
• KEYTABLE=us – определяет раскладку клавиатуры для работы в терминале
• rd_NO_DM – указывает на то, что модуль DM RAID не будет загружен
• rhgb – определяет, следует использовать графическое меню загрузчика GRUB
• quiet – указывает на отображение служебные сообщения в процессе загрузки ОС

2.1.2. Работа с командами загрузчика GRUB


Загрузчик GRUB имеет собственный набор команд, предназначенный для его настройки.
Запустить интерфейс для ввода данных команд можно из меню загрузчика, выполнив команду
с, или непосредственно из командного интерпретатора, выполнив команду grub. Для
просмотра всех возможных команд загрузчика GRUB используется клавиша <TAB> или
команда help. Командный интерфейс загрузчика GRUB имеет базовые возможности,
присутствующие в командном интерпретаторе bash; в частности, можно использовать
автодополнение ввода и историю введенных команд (действует только в режиме запуска
оболочки GRUB по команде с до загрузки системы)
В следующем листинге приведены примеры использования команд загрузчика GRUB.
grub> find /grub/stage1
(hd0,0)
grub> root (hd0,<TAB>
Possible partitions are:
Partition num: 0, Filesystem type is ext2fs, partition type
0x83
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> root
root
(hd0,0): Filesystem type is ext2fs, partition type 0x83
grub> cat (hd0,0)/grub/device.map
cat (hd0,0)/grub/device.map
# this device map was generated by anaconda
(hd0) /dev/sda
В первой строке листинга используется команда find для поиска устройства, содержащего
программу первичной загрузки starge1. При помощи команды root осуществляется поиск
корневого раздела / (команда root (hd0,<TAB>), его ассоциация с физическим устройством
(команда root (hd0,0)) и вывода типа его файловой системы 5 (команда root). В последней
команде осуществляется вывод содержимого файла device.map, в котором содержится
соответствие между устройствами BIOS и ядра ОС. Если данный файл имеет некорректную
конфигурацию, GRUB не сможет корректно распознать загрузочный диск.
В процессе решения проблем загрузки ОС иногда необходимо убедиться в том, что часть
загрузчика GRUB stage1 присутствует в области MBR, для этого можно воспользоваться
встроенным HEX-редактором xxd, выполнив просмотр области MBR загрузочного диска
следующим образом:
# xxd -l 512 /dev/sda
0000000: eb48 9010 8ed0 bc00 b0b8 0000 8ed8 8ec0 .H..............
0000010: fbbe 007c bf00 06b9 0002 f3a4 ea21 0600 ...|.........!..
0000020: 00be be07 3804 750b 83c6 1081 fefe 0775 ....8.u........u
0000030: f3eb 16b4 02b0 01bb 007c b280 8a74 0302 .........|...t..
0000040: 8000 0080 e849 0800 0008 fa90 90f6 c280 .....I..........
0000050: 7502 b280 ea59 7c00 0031 c08e d88e d0bc u....Y|..1......
0000060: 0020 fba0 407c 3cff 7402 88c2 52f6 c280 . ..@|<.t...R...
0000070: 7454 b441 bbaa 55cd 135a 5272 4981 fb55 tT.A..U..ZRrI..U
0000080: aa75 43a0 417c 84c0 7505 83e1 0174 3766 .uC.A|..u....t7f
0000090: 8b4c 10be 057c c644 ff01 668b 1e44 7cc7 .L...|.D..f..D|.
00000a0: 0410 00c7 4402 0100 6689 5c08 c744 0600 ....D...f.\..D..
00000b0: 7066 31c0 8944 0466 8944 0cb4 42cd 1372 pf1..D.f.D..B..r
00000c0: 05bb 0070 eb7d b408 cd13 730a f6c2 800f ...p.}....s.....
00000d0: 84f0 00e9 8d00 be05 7cc6 44ff 0066 31c0 ........|.D..f1.
00000e0: 88f0 4066 8944 0431 d288 cac1 e202 88e8 ..@f.D.1........
00000f0: 88f4 4089 4408 31c0 88d0 c0e8 0266 8904 ..@.D.1......f..
0000100: 66a1 447c 6631 d266 f734 8854 0a66 31d2 f.D|f1.f.4.T.f1.
0000110: 66f7 7404 8854 0b89 440c 3b44 087d 3c8a f.t..T..D.;D.}<.
0000120: 540d c0e2 068a 4c0a fec1 08d1 8a6c 0c5a T.....L......l.Z
0000130: 8a74 0bbb 0070 8ec3 31db b801 02cd 1372 .t...p..1......r
0000140: 2a8c c38e 0648 7c60 1eb9 0001 8edb 31f6 *....H|`......1.
0000150: 31ff fcf3 a51f 61ff 2642 7cbe 7f7d e840 1.....a.&B|..}.@
0000160: 00eb 0ebe 847d e838 00eb 06be 8e7d e830 .....}.8.....}.0
0000170: 00be 937d e82a 00eb fe47 5255 4220 0047 ...}.*...GRUB .G
0000180: 656f 6d00 4861 7264 2044 6973 6b00 5265 eom.Hard Disk.Re
0000190: 6164 0020 4572 726f 7200 bb01 00b4 0ecd ad. Error.......
00001a0: 10ac 3c00 75f4 c300 0000 0000 0000 0000 ..<.u...........

5Большинство типов файловых систем, записанных в шестнадцатеричном формате, можно посмотреть при помощи
команды fdisk.
00001b0: 0000 0000 0000 0000 2173 0300 0000 8020 ........!s.....
00001c0: 2100 83dd 1e3f 0008 0000 00a0 0f00 00dd !....?..........
00001d0: 1f3f 8efe ffff 00a8 0f00 0058 f000 0000 .?.........X....
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
Наличие записей для разделов с файловой системой ext2 (0x83) и LVM (0x8e) в строках 1с и 1d
означает, что в данной MBR записи содержится загрузчик GRUB.
Описанные выше особенности отчасти применимы к новой версии загрузчика GRUB –
GRUB2, имеющей модульную архитектуру и обладающей большей переносимостью.
Загрузчик GRUB2 в настоящее время находится в активной разработке (в версии Red Hat
Enterprise Linux 7 является загрузчиком по умолчанию) и имеет следующие особенности:
• Поддержка скриптов (циклы, переменные, функции)
• Динамическая загрузка модулей с жесткого диска при необходимости (RAID, LVM)
• Расширенная локализация (отображение не ASCII–символов)
• Собственный командный режим восстановления
• Графический интерфейс
Наиболее важные отличия GRUB2 от предыдущей версии (GRUB legacy, она же GRUB
version 0.97) следующие:
• Настройка меню загрузчика выполняется через файл grub.cfg
• Нумерация разделов начинается с 1 ((hd0,1) – соответствует первому разделу на жестком
диске)
• Добавлены дополнительные команды 6 и изменены названия некоторых стандартных
команд предыдущей версии
Загрузчик GRUB2 имеет следующие конфигурационные файлы и каталоги:
− /etc/default/grub 7 – позволяет устанавливать глобальные параметры загрузчика (например,
при указании параметра GRUB_CMDLINE_LINUX=acpi=off, ко всем командам «linux» в
файле grub.cfg будет добавлен параметр acpi=off).
− /etc/grub.d – содержит набор сценариев командной оболочки, необходимых для генерации
файла grub.cfg. Здесь присутствуют сценарии, помогающие определить имеющиеся
операционные системы(30_os-probber), а также добавить собственные сценарии
пользователя (40_custom) в меню загрузчика. Порядок представления результатов
сценариев в меню загрузчика определяется первыми числовыми символами в имени файла
сценария (например, результат выполнения сценария 00_header, будет присутствовать в
меню первым).
− /boot/grub/grub.cfg – основной конфигурационный файл, содержащий информацию о
загружаемых системах.
Конфигурационный файл загрузчика GRUB2 не подлежит прямому редактированию в отличие
от загрузчика GRUB legacy. Для создания конфигурационного файла grub.cfg используется
команда grub-mkconfig:
# grub-mkconfig -o /boot/grub/grub.cfg

6 Сравнение команд загрузчиков GRUB2 и GRUB Legacy представлено здесь:


http://www.gnu.org/software/grub/manual/grub.html
7 Дополнительные параметры файла /etc/default/grub описаны в приложении 1
В результате выполнения данной команды в каталоге /boot/grub будет создан файл grub.cfg
примерно следующего содержания:
### BEGIN /etc/grub.d/00_header ###
set default=0
set timeout=5
set root=(hd0,3)
search --fs-uuid --set a1ae9df0-b8d3-4fe2-ad81-75a3c2f03c5d
if font /usr/share/grub/ascii.pff ; then
set gfxmode=640x480
insmod gfxterm
insmod vbe
terminal gfxterm
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_hurd ###
### END /etc/grub.d/10_hurd ###
### BEGIN /etc/grub.d/10_linux ###
menuentry "Debian GNU/Linux, linux 2.6.26-2-686" {
set root=(hd0,2)
search --fs-uuid --set dc47f706-7cee-4b03-8bd0-
5efbf1996d9f
linux /vmlinuz-2.6.26-2-686 root=UUID=a1ae9df0-b8d3-
4fe2-ad81-75a3c2f03c5d ro
initrd /initrd.img-2.6.26-2-686
}
menuentry "Debian GNU/Linux, linux 2.6.26-2-686 (single-user
mode)" {
set root=(hd0,2)
search --fs-uuid --set dc47f706-7cee-4b03-8bd0-
5efbf1996d9f
linux /vmlinuz-2.6.26-2-686 root=UUID=a1ae9df0-b8d3-
4fe2-ad81-75a3c2f03c5d ro single
initrd /initrd.img-2.6.26-2-686
}
### END /etc/grub.d/10_linux ###
Как видно из листинга, формат записи изменился существенно: для задания параметров меню
и указания загрузочного раздела (root), содержащего образ ядра и модули GRUB, используется
команда set. Для поиска файловой системы, содержащей образ ядра, используется команда
search (взамен команды find). Для загрузки ядра ОС в оперативную память используются
команды linux или multiboot (замена команды root). Нетрудно заметить, что в
конфигурационном файле присутствует оператор if, содержащий набор команд, загружающий
встроенный терминал загрузчика GRUB2 – gfxterm. Параметр --fs-uuid определяет
уникальный идентификатор UUID 8 загрузочного раздела.
В случае изменения конфигурационных файлов в каталоге /etc/grub.d или в файле
/etc/default/grub, следует выполнить команду update-grub2 для обновления файла меню
загрузчика. Данная команда на самом деле вызывает команду grub-mkconfig -o
/boot/grub/grub.cfg, которая выполняет несколько специальных сценариев и формирует файл
/boot/grub/grub.cfg.
Основная особенность загрузчика GRUB2 – его модульная архитектура. Для загрузки
необходимых модулей используется команда insmod <название_модуля>. Например, если
раздел /boot расположен поверх LVM тома, то в описании пункта меню в файле grub.cfg
необходимо добавить команду загрузки модуля lvm:
insmod lvm
и указать загрузочный раздел, используя следующую нотацию:
set root=(lvm_группа-lvm_том)
Важной особенностью загрузчика GRUB2 является наличие собственного режима
восстановления rescue mode, использующегося в случае возникновения проблем загрузки
основной части загрузчика – программы stage2. Если загрузчик не сможет считать параметры
меню из файла grub.cfg, но сможет определить системные диски, пользователь попадает в
нормальный командный режим, отличающийся следующим приглашением :
sh:grub>
Если в системе присутствуют более серьёзные проблемы, то загружается режим
восстановления со следующим приглашением:
grub rescue>
Режим rescue mode является, по сути, усеченным нормальным режимом с ограниченным
набором команд. Прежде чем пытаться что-то восстанавливать стоит попробовать загрузить
нормальный режим, используя соответствующий модуль и переменную prefix, хранящуюся в
MBR и содержащую расположение основной программы stage2 и модулей:
grub rescue> set prefix=(hdX,Y)/grub
grub rescue> insmod (hdX,Y)/grub/normal.mod
rescue:grub> normal
В данном листинге X – соответствует номеру устройства, а Y – соответствует номеру раздела.
Для расширения возможностей консоли необходимо загрузить модуль linux.mod:
grub rescue> insmod (hdX,Y)/grub/linux.mod
После этого станет доступна стандартная консоль GRUB2, в которой следует выполнить
дальнейшую загрузку ОС:
set root=(hdX,Y)
linux /boot/vmlinuz-2.6.18-53.el5 ro root=LABEL=/

8 Universally Unique Identifier (UUID) используется для уникальной идентификации различной информации.
Например, в случае использования UUID для устройств, перенос данных на другое устройство или смена номера
устройства (LUN) не повлияет на корректную идентификацию загрузочного раздела в процессе загрузки ОС.
initrd /initrd-2.6.18-53.1.21.el5.img
boot
Данная последовательность команд стандартная в большинстве случаев: сначала определяется
загрузочный раздел, содержащий образы ядра и начального диска оперативной памяти initrd,
затем выполняется последовательная загрузка данных образов в память с указанием необходимых
параметров и, наконец, дальнейшее управление процессом загрузки передается ядру при помощи
команды boot.

2.1.3 Базовые операции с системой


После загрузки в текстовую консоль отображается приглашение системы на ввод
аутентификационных данных следующего вида:
Red Hat Enterpirse Linux Server release 6.4 (Santiago)
Kernel 2.6.32-358.el6.i686 on an i686
srv login:
Первые две строки, не содержащие приглашение программы login, содержат краткую
информацию о системе. Информация, присутствующая в данных строках, может изменяться в
целях повышения информативности системы и определяется в файле /etc/issue.
Здесь необходимо ввести имя пользователя, а затем, когда будет выдано соответствующее
приглашение его пароль (Password:). После успешной регистрации в системе можно приступать к
работе.
После регистрации отобразится приглашение вида #, если вход в систему был выполнен от
административного пользователя root 9, или приглашение вида $ для всех других случаев.
Типичное приглашение для пользователя root имеет следующий вид:
[root@srv ~]#
Запись, находящаяся в квадратных скобках может содержать полезную информацию, такую как
имя пользователя, который в настоящий момент работает в данной консоли, имя компьютера и
рабочий каталог.
Для завершения текущего сеанса работы используется команда logout или комбинация клавиш
<Ctrl+D>.
Для завершения работы с системой используется команда shutdown или halt. В первом случае
можно задавать время завершения работы системы, определять запуск утилиты проверки
файловой системы после очередной загрузки, а также отменять ранее введенную команду
завершения работы. Например, для запланированного завершения работы системы необходимо
ввести следующую команду:
# shutdown -h 20:00 &
Для перезапуска системы без выключения питания используется команда reboot, которая является
ссылкой10 на команду halt.
Часто при работе с системой под разными пользователями на разных графических и текстовых
терминалах необходимо определить группы, членом которых является данный пользователь, и его
идентификатор, уникально идентифицирующий пользователя в системе. Для этого в ОС Linux
существует команда id, вывод которой имеет следующий вид:

9
Учетная запись пользователя root имеет почти неограниченные права на доступ к файлам системы и запуск
программ. В целях недопущения ошибки в процессе работы с ОС Linux рекомендуется использовать любую другую
учетную запись, а программы, которые доступны только для пользователя root, запускать при помощи программы
sudo.
10 Ссылка – ярлык на объект файловой системы, при обращении к которой происходит обращение к объекту ссылки.
# id
uid=0(root) gid=0(root)
groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
В данном случае пользователь имеет нулевой идентификатор, что соответствует пользователю
root, основная группа пользователя имеет также нулевой идентификатор. В последней строке
через запятую перечислены дополнительные группы, членом которых является данный
пользователь.
Для задания пароля пользователя используется команда passwd. Для смены своего пароля
пользователь должен ввести свой текущий пароль и два раза новый, при этом будет выполнена
проверка соответствия пароля принятым правилам безопасности паролей11:
$ passwd
Changing password for user1
(current) UNIX password:
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
Для определения параметров пользователя, таких как его домашний каталог, командный
интерпретатор, а также информацию о последних активных сеансах работы пользователя с
системой используется команда finger, вывод которой представлен ниже.
# finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Wed Aug 19 22:47 (MSD) on tty1 1 hour 28 minutes idle
On since Wed Aug 19 23:46 (MSD) on tty2 2 days 22 hours idle
On since Sat Aug 22 20:23 (MSD) on pts/2 from :0.0
1 hour 28 minutes idle
On since Sat Aug 22 20:48 (MSD) on pts/3 from :0.0
Mail last read Fri Aug 14 21:07 2009 (MSD)
No Plan.
Иногда, необходимо определить не только параметры конкретного пользователя, но и понять кто в
настоящий момент работает с системой. Данная информация содержится в следующих файлах:
• /var/log/wtmp – содержит информацию о времени регистрации пользователя в системе
• /var/run/utmp – содержит список текущих зарегистрированных пользователей
• /var/log/faillog – содержит список пользователей неудачно аутентифицировавшихся в
системе
• /var/log/lastlog – содержит информацию о наиболее последних регистрациях
Непосредственно данные файлы просмотреть нельзя. Для этого используются специальные
утилиты, такие как w (определение зарегистрированных пользователей на данный момент в
системе), ac (получение данных о длительности сеансов пользователей), lastlog, faillog, last, lastb.
В частности, команда last позволяет определить, когда были выполнены перезагрузки системы
(записи псевдо-пользователь reboot).

11Для просмотра доступных правил безопасности паролей можно просмотреть справку по модулю pam_cracklib,
используя команду man pam_cracklib.
2.2. Уровни запуска
На следующем рисунке представлена схема загрузки ОС Linux, начиная с момента загрузки ядром
всех необходимых драйверов устройств и запуска процесса upstart (/sbin/init), который выполняет
запуск всех остальных сервисов системы.

Рисунок 5. Схема запуска сервисов

После того, как ядро Linux было загружено загрузчиком GRUB и выполнено монтирование
корневой файловой системы в режиме чтения-записи, управление передается программе upstart,
реализованной в виде системного процесса /sbin/init. Технология upstart использует событийную
модель запуска необходимых сервисов, что существенно сокращает время полной загрузки ОС, в
отличие от традиционной последовательной загрузки сервисов. Данный процесс запускает набор
скриптов, расположенных в каталоге /etc/init, основными из которых являются скрипты rcS.conf и
rc.conf.
Перед тем как выполнить запуск сервисов на уровне запуска по умолчанию, upstart запускает
скрипт /etc/init/rcS.conf, который выполняет начальную подготовку системы. Запущенный при
этом скрипт /etc/rc.d/rc.sysinit, осуществляет загрузку дополнительных модулей ядра (например,
драйвера поддержки программных RAID-массивов), проверку файловой системы корневого
раздела и монтирование корневого раздела в режиме чтения-записи. Затем определяется уровень
запуска по умолчанию заданный в директиве id:5:initdefault: файла /etc/inittab:
# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR
SYSTEM.
# System initialization is started by /etc/init/rcS.conf
# Individual runlevels are started by /etc/init/rc.conf
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
# Terminal gettys are handled by /etc/init/tty.conf and
/etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
# Default runlevel. The runlevels used 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:5:initdefault:
Уровни запуска (runlevels) в ОС Linux определяют возможные состояния системы, на каждом из
которых происходит запуск или остановка определенных служб (демонов). Всего в системе
определено 6 уровней запуска, для каждого из которых существует отдельный каталог
/etc/rc.d/rcN.d (где N – порядковый номер уровня запуска), в котором содержатся символьные
ссылки на непосредственные скрипты запуска сервисов (init-скрипты), расположенных в каталоге
/etc/init.d:
# ls -l /etc/init.d/
total 400
-rwxr-xr-x. 1 root root 1288 Jan 23 2013 abrt-ccpp
-rwxr-xr-x. 1 root root 1628 Jan 23 2013 abrtd
-rwxr-xr-x. 1 root root 1642 Jan 23 2013 abrt-oops
-rwxr-xr-x. 1 root root 1725 Dec 3 2009 acpid
-rwxr-xr-x. 1 root root 2062 Jan 19 2012 atd
-rwxr-xr-x. 1 root root 3378 Mar 14 2012 auditd
-rwxr-xr-x. 1 root root 4043 Jan 11 2013 autofs
-r-xr-xr-x. 1 root root 1340 Jan 23 2013 blk-availability

Непосредственно скрипты запуска сервисов не содержат в себе параметров конфигурации сервиса,
все конфигурационные параметры считываются в процессе запуска скрипта из каталогов
/etc/sysconfig и/или /etc. Обычно параметры сервиса, определенные в файле каталога /etc/sysconfig
содержат минимально необходимые параметры для начала запуска сервиса, основная же
конфигурация, определяющая поведение сервиса, содержится в файлах каталога /etc. Сам сервис
представляет собой один или несколько процессов (обычно их название оканчивается на d),
запущенных и непрерывно работающих в фоновом режиме. Запуск таких процессов – основная
задача скрипта запуска сервиса, который запускает непосредственно бинарный код файлов
сервиса.
Описание уровней запуска ОС Linux приведено в таблице 2.2.
Таблица 2.2. Уровни запуска ОС Linux
Уровень Значение
0 Остановка системы.
1 Запуск ОС в режиме одного пользователя (single-user mode) без поддержки сетевых
сервисов. Загрузка ОС и последующая работа производятся в режиме командной
строки.
2 Запуск ОС в многопользовательском режиме без поддержки сетевых сервисов.
Загрузка ОС и последующая работа производятся в режиме командной строки.
3 Запуск ОС в многопользовательском режиме с поддержкой сетевых сервисов. Загрузка
ОС и последующая работа производятся в режиме командной строки.
4 Не используется.
5 Запуск ОС в многопользовательском режиме с поддержкой сетевых сервисов. Загрузка
ОС и последующая работа производятся в графическом режиме.
6 Перезапуск системы.
Смена уровней выполнения скриптом /etc/init/rc.conf, который запускает все остальные
системные процессы, посредством обращения к символьным ссылкам init-скриптов,
содержащихся в каталогах /etc/rc.d/rcN.d. В следующем листинге приведен примерный список
символьных ссылок для третьего уровня запуска:
# ls /etc/rc.d/rc3.d/
K01numad K30spice-vdagentd K76ypbind S01sysstat S11portreserve
S19rpcgssd S26udev-post S82abrt-ccpp K01smartd K50netconsole
K86cgred S02lvm2-monitor S12rsyslog S20kdump S28autofs S82abrtd
K02oddjobd K60nfs K87restorecond S03vmware-tools S13cpuspeed
S22messagebus S30vboxadd-x11 S90crond K05wdaemon K69rpcsvcgssd
K88sssd S04dkms_autoinstaller S13irqbalance S25blk-availability
S35vboxadd-service S95atd K10psacct K73winbind K89rdisc S08ip6tables
S13rpcbind S25cups S50bluetooth S97rhnsd K10saslauthd K74ntpd
K95cgconfig S08iptables S14nfslock S25netfs S55sshd S97rhsmcertd
K15htcacheclean K75ntpdate K95firstboot S10network S15mdmonitor
S26acpid S57vmware-tools-thinprint S99certmonger K15httpd
K75quota_nld K99rngd S11auditd S18rpcidmapd S26haldaemon S80postfix
S99local
Имена ссылок начинаются с префикса S или K, за которым следует порядковый номер и имя
процесса-демона, управляемого данным init-скриптом (например, S55sshd). При переходе на
заданный уровень запуска, скрипт /etc/rc.d/rc выполняет все скрипты с префиксом S в порядке
возрастания порядковых номеров, причем выполнение скриптов осуществляется с параметром
start. При выходе с текущего уровня запуска все скрипты с префиксом K в порядке возрастания
порядковых номеров, причем выполнение скриптов осуществляется с параметром stop. Например,
при переходе с 3-го на 5-й уровень выполняются все скрипты каталога /etc/rc.d/rc5.d с префиксом
K, а затем выполняются все скрипты с префиксом S того же каталога.
После выполнения всех необходимых скриптов на выбранном уровне запуска, система выполняет
запуск еще нескольких скриптов, включая /etc/init/start-ttys, который подготавливает все
доступные виртуальные терминалы для работы, а также скрипт prefdm.conf, который запускает
графический интерфейс пользователя, если он определен для данного уровня запуска.
Виртуальный терминал - это сеанс командной строки, в котором выполняется основная работа с
системой. По умолчанию, в ОС Linux определено шесть виртуальных терминалов, однако это
количество может быть увеличено до 12. Поскольку ОС Linux является многопользовательской
системой, несколько разных пользователей могут одновременно работать из нескольких
терминалов, включая графическую оболочку.
Переключение между терминалами осуществляется при помощи клавиш <ALT+Fn>, где n
обозначает номер виртуального терминала (от 1 до 12). Например, для переключения на третий
виртуальный терминал необходимо нажать <ALT+F3>.
Управление уровнями запуска является очень важным аспектом администрирования ОС Linux. Вы
должны уметь настраивать уровень запуска, используемый системой по умолчанию, а также
определять, какие из системных процессов должны запускаться автоматически на данном уровне.
В ОС Linux существует набор команд, предназначенных для работы с уровнями запуска, включая:
• init – смена текущего уровня запуска на другой
• chkconfig – определяет какие сервисы должны быть запущены автоматически на каждом из
уровней запуска
• runlevel – отображает текущий и предыдущий уровни запуска
• ntsysv- выполняет функции аналогичные chkconfig, но в псевдо-графическом интерфейсе
По умолчанию, если при инсталляции была установлена графическая оболочка, ОС Linux
загружается на 5-й уровень запуска, о чем свидетельствует запись id:5:initdefault:файла
/etc/inittab. Для изменения уровня по умолчанию необходимо изменить второе поле данной
записи. Сделанные изменения вступят в силу только после перезагрузки системы. Для того чтобы
изменить текущий уровень выполнения без перезагрузки системы необходимо запустить
следующую команду от пользователя root:
# init <уровень>
Параметр уровень задается числом от 0 до 6.
После выполнения данной команды системы перейдет на указанный уровень, в чем можно
убедиться, выполнив команды runlevel или who -r, отображающие текущий уровень запуска:
# runlevel
N 3
# who –r
run-level 5 2013-08-21 23:16
Команда chkconfig может использоваться как для просмотра текущей конфигурации сервисов на
каждом из возможных уровней запуска, так и для их настройки и предоставляет наиболее простой
механизм осуществления следующих действий:
• просмотр текущих настроек сервисов
• изменение текущих настроек сервисов
• добавление/удаление сервисов из структуры каталогов /etc/rc.d
• включение/отключение автоматического запуска сервисов
Команда chkconfig имеет следующий синтаксис:
chkconfig --list [имя сервиса]
chkconfig --add <имя сервиса>
chkconfig --del <имя сервиса>
chkconfig [--level <уровни>] <имя сервиса> <on|off|reset>
Необязательный параметр имя сервиса обозначает название системного процесса или сервиса,
скрипт которого присутствует в каталоге /etc/rc.d/init.d, причем имя сервиса должно совпадать с
названием соответствующего скрипта.
Опция --list используется для просмотра текущих настроек сервиса.
Опции --add и --del используются для добавления и удаления символьных ссылок сервисов в
структуру каталогов /etc/rc.d.
Опция --level определяет, для каких уровней выполнения необходимо выполнить указанные
далее действия.
Параметры on , off , reset используются для изменения статуса запуска сервиса.
При указании параметра off сервис исключается из автозапуска в процессе загрузки ОС. При
указании параметра on сервис запускается в процессе загрузки ОС. При указании параметра reset
статус запуска сервиса устанавливается согласно изначальной конфигурации, указанной в файле
скрипта.
В следующем листинге приведены примеры использования команды chkconfig для управления
сервисами.
# chkconfig --list|grep sendmail
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# chkconfig --level 245 sendmail off
# chkconfig --list|grep sendmail
sendmail 0:off 1:off 2:off 3:on 4:off 5:off 6:off
# chkconfig sendmail reset
# chkconfig --list|grep sendmail
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
В первой строке осуществляется вывод текущих настроек запуска сервиса sendmail, из которых
видно, что данный сервис запускается на уровнях 2, 3, 4 и 5. Во второй строке осуществляется
отключение автозапуска сервиса sendmail на уровнях 2, 4 и 5. Далее при помощи параметра reset
осуществляется возврат первоначальных настроек автозапуска сервиса sendmail согласно записи
(# chkconfig: 2345 80 30), указанной в файле сценария /etc/rc.d/init.d/sendmail.
Для добавления нового сервиса в структуру каталогов /etc/rc.d необходимо, чтобы фай init-
скрипта сервиса имел как минимум две обязательные записи:
1. # chkconfig: 2345 80 30
Числовое значение, следующее за символом «:», говорит о том, что в каталогах /etc/rc.d/rc2.d,
/etc/rc.d/rc3.d, /etc/rc.d/rc4.d и /etc/rc.d/rc5.d (уровнях 2, 3, 4 и 5) необходимо создать
символьные ссылки на данный сценарий, причем, ссылкам с префиксом S будет присвоен
порядковый номер 80, а ссылкам с префиксом K - порядковый номер 30.
2. # description: <текст>
В данной записи дается формальное описание сервиса.
Например, для сервиса sendmail записи, считываемые утилитой chkconfig, имеют следующий
вид:
# chkconfig: 2345 80 30
# description: Sendmail is a Mail Transport Agent, which is the
program \
# that moves mail from one machine to another.
После создания файла сценария сервиса, содержащего записи chkconfig, его необходимо
скопировать в каталог /etc/init.d и сделать исполняемым, выполнив команду chmod +x
/etc/init.d/<файл init-скрипта>. Затем, используя команду chkconfig –add <название init-
скрипта>, создать символьные ссылки в соответствующих каталогах /etc/rc.d/rc*.d.
Для управления автозапуском сервисов в интерактивном режиме используется команда ntsysv,
имеющая следующий синтаксис:
ntsysv [--back] [--level <уровни>]
Для указания уровней выполнения, на которых необходимо настроить автозапуск сервисов,
используется необязательная опция --level. В случае запуска данной команды без параметров
на терминале будет отображено окно настройки сервисов для текущего уровня запуска.

Рисунок 6. Настройка автозапуска сервисов в программе ntsysv

Помимо включения или отключения автозапуска сервиса на каком-либо уровне запуска


существует команда service, выполняющая непосредственный запуск или остановку сервиса, а
также позволяющая определить его текущий статус в системе. Команда имеет следующий
синтаксис:
service < option > | --status-all | [ service_name [ command | --full-
restart ] ]
Где:
• service-name – название сервиса (например, sshd)
• command – действие, которое необходимо выполнить
• --status-all – выводит статус всех запущенных сервисов
Для проверки того, что сервис запущен в данный момент, используется команда service с
параметром status:
# service sshd status
openssh-daemon (pid 2629) is running...
Для остановки сервиса используется команда service с параметром stop
# service sshd stop
Stopping sshd: [ OK ]
В результате работы команды отобразится статус ее выполнения – успешно (OK) или
неуспешно (FAIL).

2.2.1. Технология UPSTART


С переходом на технологию upstart, часть сервисов ОС Linux была мигрирована из формата
SysV в формат upstart. Примером такой миграции является сервис журналирования событий
syslog. Основное отличие upstart от традиционного формата SysV заключается в том, что
запуск сервисов происходит не последовательно (например, S10sysklogd, затем S11klogd,
затем S12… и т.д.), а по возникновению какого-либо события в системе. Для запуска сервисов
upstart использует задачи (jobs) и событий (events). Задачи размещены в каталоге /etc/init, а
события в каталоге /etc/event.d. Задачи могут включать в себя события, которые инициируют
выполнение других задач или скриптов. Название задачи соответствует название ее
конфигурационного файла без расширения .conf. Конфигурационные файлы задачи это
текстовые неисполняемые файлы. В следующем листинге приведена задача обработки
комбинации клавиш <Ctrl+Alt+Del>:
# cat /etc/init/control-alt-delete.conf
# control-alt-delete - emergency keypress handling
#
# This task is run whenever the Control-Alt-Delete key combination is
# pressed. Usually used to shut down the machine.
start on control-alt-delete
exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
В данном примере при наступлении события нажатия клавиш Control-Alt-Delete выполняется
команда перезагрузки системы.
В конфигурационном файле задачи обязательно должны присутствовать директивы exec или
script, которые определяют, какой процесс запускать. Директива exec используется для
запуска бинарных исполняемых файлов, расположенных на файловой системе:
exec /bin/foo --opt -xyz foo bar
Директива script в отличие от exec используется для выполнения сценариев командного
интерпретатора /bin/sh:
script
# do some stuff
if [ ... ]; then
...
fi
end script
В дополнении к данным директивам возможно указать команды, которые будут выполнены до
выполнения команд в директивах exeс или script, а также после их выполнения. Для этого
используются директивы pre-start script и post-start script соответственно:
pre-start script
# prepare environment
mkdir -p /var/run/foo
end script
exec /bin/foo --opt -xyz foo bar
post-stop script
# clean up
rm -rf /var/run/foo
end script
Для того чтобы указать системе upstart когда следует запустить какую-либо задачу
используются события start on <событие> и stop on <событие>. В качестве основных событий
используются события начального запуска ОС – startup, событие runlevel [уровни запуска],
которое определяет на каком уровне запуска следует запускать или останавливать сервис,
событие остановки другой задачи stopped <задача> или запуска другой задачи started
<задача>:
start on startup
start on runlevel [23]
stop on runlevel [06]
start on stopped rcS
start on started tty1
По сути, событие может быть произвольным, т.к. любой процесс может посылать события
процессу init. В общем случае события могут представлять собой следующе:
• Файловая система / доступна для чтения-записи
• Блочное устройство добавлено в систему
• Монтирование файловой системы
• Повторяющийся временной период или наступление какого-то времени
• Файл на диске был изменен
• Обнаружено сетевое устройство
• Добавлен маршрут по умолчанию
Для подготовки окружения к запуску задач upstart можно использовать дополнительные
параметры, такие как:
• respawn – автоматический перезапуск сервисного процесса в случае некорректного
завершения его работы
• expect fork – указывает на то, что сервисный процесс должен работать в фоновом режиме и
порождать новые процессы при необходимости.
• kill timeout [секунды] – задержка, в течение которой процесс будет еще работать, если ему
была послана команда принудительного завершения работы (kill)
• console – определяет куда откуда брать входные данные для процесса и куда выводить
результат его работы. Возможные варианты:
o output – все данные берутся и выводятся на устройство ч/dev/console)
o owner – аналогичен предыдущему, за исключением того, что некоторые управляющие
сигналы отправляются непосредственно процессу
o none
• task – используется для полного выполнения задачи, включая секцию post-stop script
В следующем листинге приведен пример события, которое добавляет в журнал запись об
успешном запуске системы, после того как появится событие успешного завершения задачи
rcS:
# cat /etc/event.d/ck-log-system-start
# Upstart event
# ck-log-system-start - write system start to log
#
start on stopped rcS
console output
exec /usr/sbin/ck-log-system-start
Команда /usr/sbin/ck-log-system-start в данном случае добавляет запись об успешном старте
системы в журнал. По аналогии с командой service для управления задачами upstart
используется команда initctl следующего синтаксиса:
initctl команда
со следующими опциями:
start – запуск задачи
stop – остановка выполнения задачи
restart – перезапуск задачи
reload – отправка сигнала HUP задаче, что может быть использовано для повторного
считывания конфигурационного файла процесса0демона, запускаемого данной задачей
status – просмотр статуса задачи
list – просмотр списка запущенных задач
emit – генерация событий
В следующем примере приводится вывод статуса всех задач, работающих в системе:
# initctl list
rc stop/waiting
tty (/dev/tty3) start/running, process 2880
tty (/dev/tty2) start/running, process 2878
tty (/dev/tty6) start/running, process 2901
tty (/dev/tty5) start/running, process 2888
tty (/dev/tty4) start/running, process 2885
tty (/dev/tty8) start/running, process 5857
plymouth-shutdown stop/waiting
control-alt-delete stop/waiting
rcS-emergency stop/waiting
readahead-collector stop/waiting
kexec-disable stop/waiting
quit-plymouth stop/waiting
rcS stop/waiting
prefdm stop/waiting
init-system-dbus stop/waiting
readahead stop/waiting
splash-manager stop/waiting
start-ttys stop/waiting
readahead-disable-services stop/waiting
rcS-sulogin stop/waiting
serial stop/waiting
Статус каждой задачи соответствует следующему синтаксису:
<задача> (<экземпляр>)]<цель>/<статус>[, process <PID>][<секция>process
<PID>]
Где:
• задача – название задачи
• экземпляр – экземпляр выполнения задачи, используется в случае наличия нескольких
экземпляров одной и той же задачи
• цель – цель задачи. Каждая задача имеет своей конечной целью запуск (start) или
остановку (stop)
• статус – текущее состояние задачи
• PID – идентификатор процесса задачи
• секция – может принимать значения script или exec в зависимости от способа запуска
задачи
В таблице 2.3 приведены возможные состояния задач и допустимые переходы между ними.
Таблица 2.3. Состояния задач upstart
Текущее Цель
состояние задачи start stop
waiting starting не применимо
starting pre-start stopping
pre-start spawned stopping
spawned post-start stopping
post-start running stopping
running stopping pre-stop или stopping
pre-stop running stopping
stopping killed killed
killed post-stop post-stop
post-stop starting waiting
Состояния имеют следующие смысловые значения:
• waiting – начальное состояние
• starting – задача запускается
• pre-start – выполняется секция pre-start
• spawned – будет выполнена секция script или exec
• post-start – выполняется секция post-start
• running – промежуточное состояние устанавливается после выполнения секции post-start
(идентификатор процесса PID в этом случае может отсутствовать)
• pre-stop – выполняется секция pre-stop
• stopping – промежуточное состояния устанавливается после выполнения секции pre-stop
• killed – задача завершена
• post-stop – выполняется секция post-stop
Например, если текущее состояние задачи соответствует starting и цель задачи соответствует
start, то задача перейдет в состояние pre-start. Различают кратковременные (task jobs),
системные задачи (service jobs) и абстрактные задачи (abstract jobs). Кратковременные
задачи могут выполняться много времени, но они всегда имеют заданное время жизни и
конченое состояние. Примером кратковременной задачи может быть удаление большого
файла, задача запускается, удаляет файл и завершается, однако само удаление файла может
занять длительное время. Системные задачи это процессы-демоны, которые работают
постоянно, примерами таких задач может быть база данных, WEB или FTP сервер.
Абстрактные задачи не имеют директивы exec или script и, будучи запущенными, работают
постоянно, пока администратор их не остановит или не будет выполнено завершения работы
процесса init. Когда запускается кратковременная задача, ее цель устанавливается в значение
start, после того как задача выполнится, ее цель устанавливается в значение stop. Когда
запускается системная задача, ее цель устанавливается в значение start и остается таким до тех
пор, пока администратор не остановит эту задачу вручную или не наступит событие, заданное
в директиве stop on.
Смена состояний задач происходит достаточно быстро и увидеть каждое из возможных
состояний достаточно трудно, однако это можно проследить в системном журнале
/var/log/messages, если повысить приоритет событий, отображаемых в процессе работы с
задачами. Для этого необходимо выполнить команду:
initctl log-priority debug
и запустить произвольную задачу. Несмотря на то, что технология upstart не используется в
качестве экзаменационных вопросов на экзамене EX-200, понимать ее особенности важно,
если администратор хочет полностью освоить и понять процесс управления сервисами в ОС
Linux. Более подробную информацию о данной технологии можно получить на сайте
http://upstart.ubuntu.com/cookbook/upstart_cookbook.pdf.

Вам также может понравиться