Linux Черевики

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

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

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

Існує докладне обговорення ядра в цій книзі, з якої ця стаття взята. У даній статті розглядаються етап ініціалізації ядра, етап, коли ядро ​​друкує купу повідомлень про апаратне забезпечення, яке присутнє на system. Ядро запускається init відразу після того, як відображається повідомлення про те, що ядро ​​встановило кореневий файлsystem:

VFS: Опора root (файли ext2system) лише для читання.

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

ПРИМІТКА На Red Hat Linux, примітка ініціалізації особливо очевидна, оскільки вона «вітає» вас у Red Hat Linux.» У всіх наступних повідомленнях праворуч на екрані в квадратних дужках відображається успішне або невдале виконання.

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

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

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

Рівні

У будь-який момент часу на a Linux system, працює певний базовий набір процесів. Цей стан machine називається рівнем пробігу, і він позначається числом від 0 до 6. The system проводить більшу частину свого часу на одному рівні. Однак, коли ви закриєте machine down, init перемикається на інший рівень запуску, щоб завершити system послуги в упорядкованому порядку та наказати ядру зупинитися. Ще один рівень запуску призначений для одного користувача mode, обговорювалося пізніше.

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

id: 5: initdefault:

Цей рядок означає, що default рівень запуску на system дорівнює 5. Усі рядки у файлі inittab мають цю форму з чотирма полями, розділеними двокрапками, у такому порядку:
# Унікальний ідентифікатор (короткий рядок, такі, як ідентифікатор в попередньому прикладі)
# Застосовується рівень запуску номер (а)
# Дія, яку повинен виконати init (у попередньому прикладі дія полягає у встановленні default рівень пробігу до 5)
# Команда для виконання (опціонально)

Немає команди для виконання в попередньому ініціїdefault Наприклад, команда не має сенсу в контексті встановлення default рівень пробігу. Подивіться трохи нижче в inittab, поки не побачите такий рядок:

l5: 5: чекати :/ і т.д. / rc.d / RC 5

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

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

респаун

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

1: 2345: респаун :/ Sbin / mingetty tty1

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

ctrlв іншому місці

Команда ctrlaltdel дія контролює те, що system робиться, коли ви натискаєте CONTROL-ALT-DELETE на віртуальній консолі. На більшості systems, це якась команда перезавантаження з використанням команди shutdown.

SYSINIT

Дія sysinit - це найперше, що слід виконувати init, коли він запускається, раніше enterв будь-яких рівнях.

Як процеси в рівнях виконання почати

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

l5: 5: чекати :/ і т.д. / rc.d / RC 5

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

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

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

RC 5 команда запускає програми в цієї теки відповідного рівня, запустивши GMT команд:

S10sysklogd додому
S12kerneld додому
S15netstd_init додому
S18netbase додому
...
S99sshd додому

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

RC *. D команди, як правило, сценаріями оболонки, які починаються програми в / Sbin або / USR / Sbin. Як правило, ви можете з'ясувати, що одна з команд насправді, дивлячись на сценарій з меншим чи іншої програми на пейджер.

Ви можете запустити одну з цих послуг вручну. Наприклад, якщо ви хочете запустити програму веб-сервера httpd вручну, запустіть S99httpd start. Подібним чином, якщо вам коли-небудь потрібно буде вбити одну із служб, коли machine увімкнено, ви можете запустити команду в каталозі rc * .d з аргументом stop (наприклад, S99httpd stop).

Деякі каталоги rc*.d містять команди, які починаються з K (для «kill» або stop mode). У цьому випадку rc виконує команду з аргументом stop замість start. Ви, швидше за все, зустрінете команди K на рівнях виконання, які закривають system вниз

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

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

lrwxrwxrwx. . . S10sysklogd -> .. / 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 дистрибутиви містять ці посилання, щоб вони могли використовувати ті самі сценарії запуску для всіх рівнів запуску. Ця домовленість у жодному разі не є обов’язковою, але часто вона трохи полегшує організацію.

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

мв S99httpd _S99httpd

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

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

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

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

РАДА: Один з найпоширеніших Linux installПроблема полягає в неправильно налаштованому сервері XFree86, який запускається та вимикається, роблячи system непридатний для використання на консолях. Щоб зупинити цю поведінку, завантажтеся в однокористувацьку систему mode і змініть свій рівень запуску або служби рівня запуску. Знайдіть щось, що містить xdm, gdm або kdm, у ваших каталогах rc*.d або у вашому /etc/inittab.

Управління ініціалізації

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

Ви можете управляти ініціалізації з telinit. Наприклад, якщо ви хочете переключитися на рівень виконання 3, використовуйте наступну команду:

telinit 3

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

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

telinit д

Ви також можете використовувати telinit s, щоб переключитися на однокористувацький режим mode.

Вимкнення

init також контролює, як system вимикається та перезавантажується. Правильний спосіб shut down a Linux machine - використовувати команду вимкнення.

Існує два основних способи використання вимкнення. Якщо ви зупините system, це закриває macHine вниз і тримає його вниз. Щоб зробити machine зупинити негайно, використовуйте цю команду:

вимикання-ч зараз

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

Процес вимкнення займає кілька секунд. Ніколи не слід скидати або вимикати живлення a machine на цьому етапі.

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

Зробити system перезавантажтесь через 10 хвилин, виконайте цю команду:

вимикання-г + 10

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

Коли system час завершення роботи, нарешті, настає, зупинка повідомляє init перейти на рівень запуску 0 для зупинки та рівень запуску 6 для перезавантаження. Коли ініціює enters runlevel 0 або 6, відбувається все наступне, що ви можете перевірити, переглянувши сценарії всередині rc0.d та rc6.d:

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

# Початкові команди rc0.d / rc6.d запускаються, блокуються system файли на місце та інші приготування до завершення роботи.
# Наступні команди rc0.d/rc6.d демонтують усі файлиsystems, крім кореня.
# Подальші команди rc0.d/rc6.d перемонтують кореневий файлsystem лише для читання.
# Ще більше команд rc0.d/rc6.d записують усі буферизовані дані у файлsystem за допомогою програми синхронізації.
# Остаточні команди rc0.d / rc6.d сказати ядру команду на перезавантаження або зупинити за перезавантаження, зупинки або POWEROFF програми.

Програми перезавантаження та зупинки поводяться по-різному для кожного рівня запуску, що потенційно може спричинити плутанину. Автор default, ці програми викликають завершення роботи за допомогою -r або -h options, але якщо system вже на рівні зупинки або перезавантаження, програми говорять ядру негайно вимкнутись. Якщо ви дійсно хочете закрити свій macпоспішайте (не враховуючи будь-який можливий збиток від безладного відключення), використовуйте опцію -f

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

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