Послідовність завантаження 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 включно:
- зупинка системи
- однокористувацький режим
- Визначається користувачем, як правило це розрахований на багато користувачів режим без підтримки мережі і графічної оболонки
- Розрахований на багато користувачів режим без графічної оболонки
- Визначається користувачем, як правило, не використовується
- Розрахований на багато користувачів режим з графічною оболонкою
- перезавантаження
Грунтуючись на поточному рівні запуску, 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" призведе до перезавантаження системи.