Послідовність завантаження linux

Послідовність завантаження Linux системи складається з наступних етапів:

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

Як правило це:

  • Привід CD-ROM
  • Жорсткий диск
  • Дисковод (використовуються все рідше)

Список залежить від можливостей конкретного BIOS'а, а також вашого обладнання.

Пріоритет завантаження може бути змінений в BIOS'е. Увійти в меню настройки BIOS'а, як правило, можна натиснувши Del, F1, F2 або F10 під час завантаження комп'ютера.

Перший сектор завантажується пристрої зберігання даних зарезервований під головний завантажувальний запис. Коли відбувається завантаження з пристрою, BIOS завантажує і виконує завантажувач операційної системи (boot loader), що знаходиться в MBR.

Зокрема, stage2 завантажувача GRUB зчитує дані з файлу /boot/grub/grub.conf (або /boot/grub/menu.lst, в залежності від версії), який містить список всіх доступних операційних систем і їх параметри завантаження. Після цього на екран виводиться список операційних систем з якого користувач вибирає ОС для завантаження.

У деяких випадках stage1 завантажувача GRUB (GRand Unified Bootloader) виробляє завантаження stage1.5 код якого знаходиться в перших тридцяти кілобайтах пристрої зберігання даних наступних відразу за MBR, і вже stage1.5 робить завантаження stage2.

Коли stage2 отримує управління, на екран виводиться (псевдо) графічне меню для вибору користувачем ОС для завантаження. Варто відзначити, що параметри завантаження можуть бути змінені з цього ж меню, що дозволяє відновити систему після того як menu.lst або grub.conf були випадково зіпсовані.

Як тільки параметри завантаження були обрані, GRUB завантажує вбрання ядро ​​в пам'ять і передає управління ядру, яке вже само продовжує завантаження системи. Також GRUB може передати управління не ядру, а іншому завантажувачу, використовуючи так звану ланцюгову завантаження (chain loading), наприклад завантажувачу ОС не підтримує стандарт Multiboot.

У свою чергу, ядро ​​перевіряє конфігурацію обладнання, инициализирует пристрою і запускає initrd (опціонально), після чого монтує з пристрій вказане в параметрах завантаження як "root" як кореневу файлову систему.

Файлові системи пристроїв визначається автоматично. Якщо з якихось причин монтування не вдається, система видає kernel panic і завантаження зупиняється.

Після успішного монтування файлової системи, ядро ​​запускає демон init, яка отримує ідентифікатор процесу дорівнює одиниці і запускає решту системи.

init - це останній крок в послідовності завантаження системи. init є батьком (або ж більш далеким предком) для всіх процесів виконуваних в системі. Цей процес запускається першим в системі і його запуск проводиться безпосередньо ядром. Він же запускає всі системні процеси так як це зазначено в / etc / inittab.

Поки система працює, init НЕ буде завершений. Варто зазначити що init - призначений для користувача процес, а не системний, не дивлячись на те що він запущений від root'а.

Кожен запис в / etc / inittab містить так званий "рівень запуску" для процесу, тобто інформацію про те на якому рівні запуску системи даний процес повинен бути запущений.

У Linux системах існує сім можливих значень для рівня запуску: від 0 до 6 включно:

  1. зупинка системи
  2. однокористувацький режим
  3. Визначається користувачем, як правило це розрахований на багато користувачів режим без підтримки мережі і графічної оболонки
  4. Розрахований на багато користувачів режим без графічної оболонки
  5. Визначається користувачем, як правило, не використовується
  6. Розрахований на багато користувачів режим з графічною оболонкою
  7. перезавантаження

Грунтуючись на поточному рівні запуску, init запускає скрипти знаходяться в піддиректоріях /etc/rc.d/, для кожного рівня запуску існує своя піддиректорія, від /etc/rc.d/rc0.d до /etc/rc.d/rc6.d .

Насправді ж запуск скриптів кожного рівня запуску виконується скриптом / etc / rc який викликається на кожному рівні запуску з параметром рівним поточному рівню. Виклик ж / etc / rc параметром прописаний в / etc / inittab, для кожного з можливих рівнів запуску.

Рівень запуску за замовчуванням визначається записом в / etc / inittab:

Поточний рівень запуску може бути змінений шляхом виклику:

Де # - бажаний рівень запуску. Тобто виклик "/ sbin / telinit 6" призведе до перезавантаження системи.

Схожі статті