Ідея написання цієї статті виникла практично одночасно з моїм здивованим поглядом на екран монітора і невпевненим мимренням: «А де ж / etc / inittab?». Не пам'ятаю вже точно навіщо, мені знадобилося з'ясувати, на якому рівні вантажиться моя Ubuntu 7.10 - the Gutsy Gibbon. Не знайшовши традиційного / etc / inittab я деякий час перебував в ступорі. Вже потім, Поколупавши google, знайшов відповідь на мій, як виявилося, просте запитання.
традиційний init
Взагалі, якщо спробувати описати процес завантаження Linux в двох словах, то це буде звучати приблизно так. Після включення комп'ютера, завантаження ядра в пам'ять, монтування кореневої файлової системи, опитування і ініціалізації обладнання передача управління щодо подальшої завантаженні ОС передається спеціальному демону, званому init. Завдання init - це запуск всіх інших процесів, потрібних для коректного функціонування ОС. В принципі, за допомогою параметра ядра init можна вказати ядру запускати все, що нам заманеться (що в деяких специфічних дистрибутивах Linux і зроблено), проте практично у всіх традиційних дистрибутивах запускається саме демон init. Ідея насправді дуже проста і класна. Навіщо ядру морочитися над запуском хреново хмари додатків, якщо достатньо подбати лише про запуск одного процесу, який і буде розрулювати подальшу завантаження / роботу / зупинку системи.
Традиційний демон init визначає 7 так званих «рівнів виконання». Для кожного такого рівня повинен бути визначений цілком певний набір системних служб, що запускаються під час завантаження, які отримують команди під час роботи і зупиняється під час перезавантаження системи або вимкнення живлення:
- 0 - система повністю припинила роботу
- 1 або S - однокористувальницький режим
- 2. 5 - розраховані на багато користувачів режими
- 6 - перезавантаження системи
Слід зазначити, що перерахований вище список - це всього лише традиція. Тобто, ніхто не заважає вам для кожного рівня визначити свій набір служб і користуватися собі на втіху.
Після запуску, демон init читає конфігурацію з файлу / etc / inittab і на підставі цієї конфігурації починає вже, так би мовити, безпосередню діяльність. Грубо кажучи, в файлі / etc / inittab містяться вказівки про те, що повинен робити демон init на кожному з рівнів.
У якийсь момент формат файлу / etc / inittab виявився занадто застарілим і перестав забезпечувати необхідну розробниками функціональність, після чого в Linux з'явився каталог /etc/init.d, що містить в собі файл /etc/init.d/rc
shell-сценарії запускають все необхідне, а файл / etc / initttab став виконувати функцію сховища номера рівня за замовчуванням і виклику файлу /etc/init.d/rc при зміні рівнів роботи системи.
В каталозі /etc/init.d знаходяться сценарії запуску / перезапуску / зупинки системних служб. Всі ці сценарії можуть викликатися з різноманітними параметрами, обов'язковими з яких є параметри start і stop. Потрібно вам, наприклад, запустити сервер sshd - ви просто даєте команду /etc/init.d/sshd start і shell-сценарій робить все необхідне для запуску сервісу. Потрібно зупинити? Будь ласка: /etc/init.d/sshd stop. Сам демон init працює не безпосередньо зі сценаріями, а в такий спосіб.
Існує кілька каталогів /etc/rcX.d, де X - це номер рівня роботи системи. У кожному з цих каталогів знаходяться символічні посилання на сценарії з каталогу /etc/init.d. Досить зручно, оскільки якщо потрібно буде внести зміни в скрипт, то тільки в одному місці.
Для перемикання між різними рівнями роботи системи існує утиліта telinit, яка вміє повідомляти демона init, на який рівень потрібно перейти.
Таким ось, в принципі, нескладним чином і живе ОС Linux від запуску до зупинки. Заздалегідь прошу вибачення за мій місцями кривої стиль викладу матеріалу. Всіх зацікавлених більш детально темою роботи демона init відправляю до man-сторінок init (8), inittab (5), telinit (8), runlevel (8).
Що таке Upstart і чим він краще
Перш ніж продовжувати далі, хочеться відзначити, що в термінології Upstart існує два поняття: служба (service) і завдання (task). Головне повтікають служби від завдання полягає в тому, що служба перезапускается в разі раптового її завершення, а завдання - немає. Короткий перелік основних можливостей Upstart, взятий на сайті проекту:
- завдання та служби запускаються і зупиняються за допомогою подій
- в момент запуску / зупинки служби або завдання генерується подія
- події можуть бути отримані від будь-якого процесу в системі
- при падіннях служби можуть автоматично перезапускати
- двонаправлений обмін даними з демоном init з цілю опитування станів запущених служб, з'ясування причин їх зупинки тощо.
З функціоналу, який тільки планується в майбутніх версіях Upstart на сайті відзначили наступні моменти:
- генерація подій через певний інтервал часу або з використанням планувальника
- генерація подій у відповідь на зміну вмісту файлів / каталогів
- спостереження і перезапуск демонів процеси яких відділені від батьківських
- можливість непривілейованих користувачам створювати свої власні служби та керувати ними
- зв'язок з демоном init засобами DBUS
установка UpStart
Насамперед, перевіряємо, чи відповідає наша система вимогам:
Конфігуріруем вихідний код для компіляції:
опис завдань
Після успішної установки Upstart, необхідно створити визначення завдань для того, щоб система змогла завантажитися. Іншими словами, завдання якраз є, що чим оперує Upstart в своїй роботі. Щоб швидше зрозуміти, як це все робиться і, так би мовити, побачити своїми очима, можна скачати архів прикладів завдань. Можливо, вам доведеться їх трохи видозмінити для коректної роботи з вашою системою, проте все необхідне для початкової конфігурації системи і успішного першого запуску в архіві прикладів є. Всі приклади необхідно розпакувати в каталог /etc/event.d. Саме з нього Upstart бере все необхідне для роботи (про / etc / inittab все дружно забули). За винятком моментів описаних в розділі «Upstart on Other Distributions» всі скрипти в каталогах /etc/rcX.d можна залишити без змін. все повинно запрацювати.
Останній штрих і перезавантаження
Коли все готово, можна спробувати перевантажити Linux і подивитися, що у вас вийшло. Перед перезавантаженням не забудьте перевірити значення параметра init, переданого ядру вашим загрузчиком, в разі, якщо Upstart встановив виконуваний файл init в відмінний від / sbin каталог. Взагалі, в принципі, настійно рекомендується для початку не замінювати стандартний sysvinit на init Upstart, а встановити його в якийсь інший каталог і за допомогою параметра ядра init спершу все ретельно протестувати.
пишемо завдання
Тим, кому необхідно розширити стандартний набір завдань або просто цікаво знати, як все це вигадується і працює.
Відразу зверну вашу увагу на те, що на сьогоднішній день формат файлу завдання в Upstart вважається ще сирим і може в майбутньому зазнаватиме змін, про що й на сайті. Так що, будьте готові, в разі чого, зануритися в читання документації до нових версій і приведення у відповідність написаних вами раніше завдань.
Всі завдання поміщаються в файли, розташовані в каталозі /etc/event.d. Імена файлів повинні відповідати іменам завдань і самі файли не повинні бути виконуваними.
exec і script
Кожне завдання повинно мати запис script або exec. Ця запис визначає спосіб запуску завдання. exec використовується в разі, коли ви запускаєте якусь програму з вашої файлової системи з можливістю передачі додаткових параметрів викликається програмою.