Черевики Linux

Як виявляється, в процесі завантаження не так багато:

1. Завантажувач знаходить зображення ядра на диску, завантажує його в пам'ять і запускає його.
2. Ядро ініціалізує пристрої та його драйвери.
3. Ядро встановлює кореневу файлову систему.
4. Ядро запускає програму під назвою init.
5. INIT встановлює решту процесів у русі.
6. Останні процеси, які INIT запускаються як частина послідовності завантаження, дозволяють вам увійти.

Визначення кожного етапу процесу завантаження є неоціненним у виправленні проблем завантаження та розумінні системи в цілому. Для запуску нуль на завантажувальному завантажувачі, який є початковим екраном або підказкою, який ви отримуєте після того, як комп'ютер здійснює свій самотест, запитуючи, яка операційна система запускається. Після того, як ви зробите вибір, завантажувальний навантажувач запускає ядро Linux, передаючи ядро управління системою.

Існує детальне обговорення ядра в інших місцях цієї книги, з якої ця стаття витягнута. Ця стаття охоплює етап ініціалізації ядра, етап, коли ядро друкує купу повідомлень про апаратне забезпечення, присутнє в системі. Ядро запускає init одразу після того Коренева файлова система:

VFS: встановлений root (ext2 filesystem) Readonly.

Незабаром ви побачите повідомлення про запуску INIT, а потім повідомлення про запуску системних служб, і, нарешті, отримаєте якийсь запит на вхід.

Примітка : На Red Hat Linux, Примітка init особливо очевидна, тому що це “вітає” ти “Red Hat Linux.” Всі повідомлення після цього демонструють успіх або невдачу в дужках в правій частині екрана.

Більшість цієї глави стосується INIT, оскільки це частина послідовності завантаження, де у вас найбільше контролю.
ініціатив

У INIT немає нічого особливого. Це програма, як і будь -яка інша в системі Linux, і ви знайдете її в /SBIN разом з іншими системними бінарами. Основна мета INIT - запустити та припинити інші програми в певній послідовності. Все, що ви повинні знати, - як працює ця послідовність.

Існує кілька різних варіантів, але більшість дистрибутивів Linux використовують тут стиль системи V. Деякі розподіли використовують простішу версію, яка нагадує BSD INIT, але ви навряд чи з цим зіткнетесь.

Runlevels

У будь -який момент часу в системі Linux працює певний базовий набір процесів. Цей стан машини називається її RunLevel, і він позначається числом від 0 до 6. Система проводить більшу частину свого часу за один Runlevel. Однак, коли ви вимикаєте машину вниз, INIT перемикається на інший RunLevel, щоб впорядковано припинити системні послуги та сказати ядру зупинитися. Ще один RunLevel-для режиму одноповерху, який обговорюється пізніше.

Найпростіший спосіб отримати ручку на Runlevels - це вивчити файл конфігурації init, /etc /inittab. Шукайте таку лінію, як наступне:

Id: 5: initdefault:

Цей рядок означає, що за замовчуванням RunLevel в системі дорівнює 5. Усі рядки у файлі Inittab приймають цю форму, з чотирма полями, розділеними колонами, що відбуваються в наступному порядку:
# Унікальний ідентифікатор (короткий рядок, такий як ID у попередньому прикладі)
# Застосовувані номери runlevel
# Дія, яку повинен вжити Init (у попередньому прикладі, дія полягає в тому, щоб встановити RunLevel за замовчуванням на 5)
# Команда для виконання (необов’язково)

У попередньому прикладі InitDefault немає команди, оскільки команда не має сенсу в контексті встановлення за замовчуванням Runlevel. Подивіться трохи далі внизу в Inittab, поки ви не побачите подібну лінію:

L5: 5: Зачекайте: /etc/rc.d/rc 5

Цей рядок викликає більшість системних конфігурацій та служб через каталоги RC*.D та Init.D. Ви можете бачити, що INIT встановлено для виконання команди під назвою /etc/rc.d/rc 5, коли в Runlevel 5. Дія очікування розповідає, коли і як init запускає команду: запустіть RC 5 один раз, коли вводить Runlevel 5, а потім зачекайте, коли ця команда закінчить, перш ніж робити щось інше.

На додаток до initdefault є кілька різних дій та чекати, особливо що стосується управління живленням, і сторінка посібника inittab (5) розповідає про них про них. Ті, з якими ви, швидше за все, зіткнетесь, пояснюються в наступних розділах.

відновити

Дія Respawn змушує INIT виконувати команду, що випливає, і якщо команда закінчує виконання, знову її запускає. Ви, швидше за все, побачите щось подібне до цього рядка у вашому файлі Inittab:

1: 2345: respawn:/sbin/mingetty tty1

Програми Getty надають підказки для входу. Попередній рядок призначений для першої віртуальної консолі (/dev/tty1), та, яку ви бачите, коли натискаєте на Alt-F1 або Control-Alt-F1. Дія RESENT повертає підказку входу назад після виходу.

ctrlaltel

Дія Ctrlaltdel контролює те, що робить система, коли ви натискаєте управління-альт-делікт на віртуальній консолі. У більшості систем це якась команда перезавантаження за допомогою команди відключення.

сийн

Дія Sysinit - це найперше, що Init повинно запустити, коли вона запускається, перш ніж вводити будь -які Runlevels.

Як починаються процеси в Runlevels

Тепер ви готові дізнатися, як INIT запускає системні послуги, безпосередньо перед тим, як він дозволяє вам увійти. Згадайте цю лінію Inittab з раніше:

L5: 5: Зачекайте: /etc/rc.d/rc 5

Ця невелика лінія викликає багато інших програм. RC розшифровується як команди Run, і ви почуєте, як люди називають команди як сценарії, програми чи послуги. Отже, де ці команди все -таки?

Для Runlevel 5, у цьому прикладі команди, ймовірно, є або в /etc/rc.d/rc5.d або /etc/rc5.d. Runlevel 1 використовує RC1.D, Runlevel 2 використовує RC2.D тощо. Ви можете знайти такі елементи в каталозі RC5.D:

S10SYSKLOGD S20PPP S99GPM
S12KERNELD S25NETSTD_NFS S99HTTPD
S15NETSTD_INIT S30NETSTD_MISC S99RMNOLOLIN
S18NETBASE S45PCMCIA S99SSHD
S20ACCT S89ATD
S20LOGOUTD S89CRON

Команда RC 5 запускає програми в цьому каталозі Runlevel, запустивши наступні команди:

S10SYSKLOGD запуск
S12Kerneld Start
S15NETSTD_INIT Start
S18netBase Start

S99SSHD Start

Зверніть увагу на аргумент старту в кожній команді. S S у назві команди означає, що команда повинна працювати в режимі старту, а число (00 - 99) визначає, де в послідовності RC запускає команду.

Команди RC*.d, як правило, є сценаріями оболонки, які запускають програми в /sbin або /usr /sbin. Зазвичай ви можете розібратися, що насправді робить одна з команд, переглядаючи сценарій з меншою чи іншою програмою Pager.

Ви можете запустити одну з цих послуг вручну. Наприклад, якщо ви хочете запустити програму веб -сервера HTTPD вручну, запустіть S99HTTPD запуску. Аналогічно, якщо вам коли -небудь потрібно вбити одну з послуг, коли машина увімкнена, ви можете запустити команду в каталозі RC*.d з аргументом зупинки (наприклад, S99HTTPD STOP).

Деякі каталоги RC*.d містять команди, які починаються з k (для “Вбити,” або режим зупинки). У цьому випадку RC запускає команду з аргументом зупинки замість початку. Ви, швидше за все, зіткнетесь з командами K у Runlevels, які закривають систему.

Додавання та видалення послуг

Якщо ви хочете додати, видалити або змінити послуги в каталогах RC*.d, вам потрібно детальніше ознайомитись із файлами всередині. Довгий список виявляє таку структуру:

LRWXRWXRWX. . . S10SYSOGD -> ../init.d/sysklogd
LRWXRWXRWX. . . S12Kerneld -> ../init.d/kerneld
LRWXRWXRWX. . . S15netstd_init -> ../init.d/netstd_init
LRWXRWXRWX. . . S18netBase -> ../init.d/netbase

Команди в каталозі RC*.d - це фактично символічні посилання на файли в каталозі init.d, як правило, в /etc. або /etc/rc.d. Розподіли Linux містять ці посилання, щоб вони могли використовувати однакові сценарії запуску для всіх Runlevels. Ця конвенція аж ніяк не є вимогою, але вона часто полегшує організацію.

Щоб запобігти одній із команд у каталозі init.d працювати в певному Runlevel, ви можете подумати про видалення символічного посилання у відповідному каталозі RC*.d. Це працює, але якщо ви помилитесь і коли -небудь вам потрібно поставити посилання на місце, у вас можуть виникнути проблеми з запам'ятовуванням точної назви посилання. Тому ви не повинні видаляти посилання в каталогах rc*.d, а скоріше, додати підкреслення (_) до початку імені посилання:

MV S99HTTPD _S99HTTPD

У час завантаження RC ігнорує _S99HTTPD, оскільки він не починається з S або K. Крім того, оригінальна назва все ще очевидна, і ви маєте швидкий доступ до команди, якщо ви в щітці і вам потрібно запустити її вручну.

Щоб додати послугу, ви повинні створити сценарій, як інші в каталозі init.d, а потім зробити символічне посилання у правильному каталозі RC*.d. Найпростіший спосіб написати сценарій - це вивчити сценарії, які вже є в Init.D, зробити копію того, який ви розумієте, та змінюють копію.

Додаючи послугу, переконайтеся, що ви вибрали відповідне місце в послідовності завантаження, щоб запустити послугу. Якщо послуга починається занадто рано, це може не спрацювати, через залежність від якоїсь іншої послуги. Для несуттєвих послуг більшість системних адміністраторів віддають перевагу чисел у 90-х роках, після більшості послуг, що надходять із системою.

Розподіл Linux зазвичай постачається з командою для включення та відключення послуг у каталогах RC*.d. Наприклад, у Debian команда-це оновлення-RC.D, а в Red Hat Linux команда-chkconfig. Також доступні графічні інтерфейси користувача. Використання цих програм допомагає підтримувати каталоги запуску послідовними та допомагає в оновленні.

Підказка: Однією з найпоширеніших проблем з встановленням Linux є неправильно налаштований сервер Xfree86, який рухається і вимикає, що робить систему непридатною на консолі. Щоб зупинити цю поведінку, завантажте в режим одноразового споживача та змініть ваші послуги Runlevel або Runlevel. Шукайте щось, що містить XDM, GDM або KDM у ваших каталогах RC*.d або ваш /etc /inittab.

Контроль INIT

Іноді вам потрібно трохи побити init, щоб сказати йому перемикати Runlevels, перечитати файл inittab або просто вимкнути систему. Оскільки INIT - це завжди перший процес у системі, його ідентифікатор процесу завжди 1.

Ви можете контролювати init за допомогою Telinit. Наприклад, якщо ви хочете перейти на Runlevel 3, використовуйте цю команду:

Телініт 3

Перемикаючи Runlevels, Init намагається вбити будь -які процеси, які не знаходяться у файлі Inittab для нового Runlevel. Тому ви повинні бути обережними щодо зміни Runlevels.

Коли вам потрібно додати або видалити завдання, що відновлюються, або внести будь-які інші зміни у файл inittab, ви повинні повідомити про зміну і змусити його перечитати файл. Деякі люди використовують Kill -Hup 1, щоб сказати INIT зробити це. Цей традиційний метод працює на більшості версій Unix, якщо ви правильно його введете. Однак ви також можете запустити цю команду Telinit:

Телін Q

Ви також можете використовувати Telinit S для переходу в режим одноразового користувача.

Вимкнення

INIT також контролює, як система вимикається та перезавантажується. Правильним способом вимкнення машини Linux є використання команди вимкнення.

Існує два основні способи використання відключення. Якщо ви зупините систему, вона вимикає машину вниз і тримає її вниз. Щоб негайно зупинити машину, використовуйте цю команду:

вимкнення -h зараз

На більшості сучасних машин з досить останніми версіями Linux, зупинка скорочує живлення машини. Ви також можете перезавантажити машину. Для перезавантаження використовуйте -r замість -h.

Процес відключення займає кілька секунд. Ви ніколи не повинні скинути або живити машину на цьому етапі.

У попередньому прикладі зараз час закрити. Цей аргумент є обов'язковим, але існує багато способів його уточнення. Якщо ви хочете, щоб машина спускалася десь у майбутньому, один спосіб - використовувати +N, де N - кількість хвилин, що припиняється, слід почекати, перш ніж виконувати свою роботу. Для інших варіантів погляньте на сторінку "Закриття" (8).

Щоб система перезавантажився за 10 хвилин, запустіть цю команду:

відключення -r +10

У Linux відключення повідомляє, що кожен увійшов до того, що машина спускається, але це мало реальної роботи. Якщо ви вказуєте інший час, ніж зараз, відключення створює файл, який називається /etc /nologin. Коли цей файл присутній, система забороняє входи нікого, крім SuperUser.

Коли нарешті настає час відключення системи, Shutdown повідомляє INIT перейти на Runlevel 0 для зупинки та Runlevel 6 для перезавантаження. Коли init вводить Runlevel 0 або 6, відбувається все наступне, яке ви можете перевірити, переглянувши сценарії всередині RC0.D та RC6.D:

1. INIT вбиває кожен процес, який він може (як це було б при переході на будь -який інший RunLevel).

# Початкові команди RC0.D/RC6.D запускаються, блокування системних файлів на місце та роблять інші підготовки до відключення.
# Наступні команди RC0.D/RC6.D Untmount всі файлові системи, крім кореня.
# Подальші команди rc0.d/rc6.d переробляють кореневу файлову систему лише для читання.
# Ще більше команд RC0.D/RC6.D Записуйте всі буферизовані дані у файлову систему за допомогою програми Sync.
# Остаточні команди RC0.D/RC6.D повідомляють ядру перезавантажити або зупинитися за допомогою програми перезавантаження, зупинки або Poweroff.

Програми перезавантаження та зупинки поводяться по -різному для кожного RunLevel, що потенційно спричиняє плутанину. За замовчуванням ці програми викликають закриття з параметрами -r або -h, але якщо система вже перебуває на зупинці або перезавантаженні Runlevel, програми говорять ядру негайно відключити себе. Якщо ви дійсно хочете поспішати вимкнути свою машину (нехтуючи будь -якою можливою шкодою від безладного відключення), використовуйте параметр -F.

Пристрасний до технологій, я із задоволенням пишу на Stealthsetts.com, починаючи з 2006 року. У мене багатий досвід роботи в операційних системах: MacOS, Windows та Linux, а також у програмах програмування та платформ ведення блогів (WordPress) та для інтернет -магазинів (WooCommerce, Magento, Presashop).

Залиште коментар