Процес завантаження linux 1

Загальний огляд процесу

Основні етапи завантаження:

  1. Системна прошивка комп'ютера виконує первинну перевірку і ініціалізацію апаратного забезпечення.
  2. У разі BIOS прошивка завантажує в оперативну пам'ять і виконує завантажувальний код з одного з розділів заданого завантажувального пристрою, який містить фазу 1 завантажувача Linux. Фаза 1 завантажує фазу 2 (значний за розміром код завантажувача). Деякі завантажувачі можуть використовувати для цього проміжний етап (під назвою фаза 1,5), оскільки сучасні диски великого обсягу можуть некоректно зчитуватися без подальшого коду. У разі UEFI запускається завантажувач завантажений зі службового розділу (EFS), який вибирається відповідно до налаштування пріоритету завантаження певного в незалежній пам'яті комп'ютера. При цьому можлива завантаження не тільки спеціалізованого завантажувача, але можна завантажити і безпосередньо ядро ​​Linux (для цього ядро ​​має бути зібрано з опцією EFI_STUB).
  3. Завантажувач часто пропонує користувачеві меню з доступними варіантами завантаження. Після вибору або після заданого тайм-ауту завантажувач завантажує ядро.
  4. Завантажене ядро ​​розпаковується в пам'яті, налаштовує системні функції, такі як робота необхідного обладнання та управління сторінками пам'яті, після чого робить виклик start_kernel ().
  5. Після цього start_kernel () виконує основну настройку системи (переривання, інші функції управління пам'яттю, ініціалізацію пристроїв, драйверів і т. Д.), А потім породжує процес бездіяльності. диспетчер і окремо від них - процес init (виконується в просторі користувача).
  6. Планувальник починає більш ефективно управляти системою, в той час як ядро ​​переходить до бездіяльності.
  7. Процес init виконує необхідні сценарії, які налаштовують всі служби і структури, які не відносяться до рівня ядра, в результаті чого буде створено для користувача оточення, і користувачеві буде надано екран входу в систему.

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

При завантаження через BIOS: Фази завантажувача розрізняються залежно від платформи. Оскільки ранні етапи завантаження не залежить від операційної системи, процес завантаження зазвичай починається в такий спосіб:

  • Для x86 або x86-64. код з завантажувального сектора розділу диска виконується в реальному режимі і завантажує першу фазу завантажувача (як правило - частина LILO або GRUB).

З цього моменту завантаження триває. Перша фаза завантажує решті код завантажувача, який зазвичай запитує, яку операційну систему (або вид її сесії) користувач хоче запустити. Код завантажувача створюється на основі конфігураційного файлу /etc/lilo.conf (для LILO). в якому визначені доступні системи. Цей файл містить, зокрема, інформацію про завантажувальному розділі і розташуванні ядра для кожної з таких систем, а також додаткові параметри завантаження, якщо вони задані. В результаті вибору відповідне ядро ​​завантажується в ОЗУ. мінімальна початкова файлова система налаштовується з файлу-образу (initrd), а потім, разом з відповідними параметрами управління передається нової ОС.

LILO і GRUB мають певні відмінності: [1]

  • LILO НЕ розпізнає файлові системи, тому він використовує безпосередні (raw) зміщення на диску і відомості з BIOS для завантаження даних. Він завантажує код меню, а потім, в залежності від вибору, завантажує або 512-байтниє сектори диска для системи, що грунтується на MBR (наприклад, Microsoft Windows), або образ ядра для Linux. [1]
  • GRUB, навпаки, розпізнає поширені файлові системи (наприклад, ext2 і ext3). [2] Так як GRUB зберігає свої дані у файлі конфігурації, а не в завантажувального запису, і має інтерфейс командного рядка, то найчастіше параметри GRUB легше поправити або змінити, якщо вони налаштовані неправильно або пошкоджені. [3]

При завантаженні через UEFI: В UEFI завантажувач відразу запускається в захищеному режимі (32- або 64-бітному) і фактично завантажується одразу все фази завантажувача (з урахуванням завантаження зі службового розділу для завантажувача немає необхідності бити себе на окремі фази і розміщувати їх в різних місцях ). В іншому процес завантаження і ініціалізації ядра не відрізняється від варіанту з BIOS.

Ще один спосіб завантажити Linux - з DOS або Windows 9x. де ядро ​​Linux повністю замінить виконувати копію операційної системи. Це може бути доцільно, якщо апаратне забезпечення має включатися програмно, а відповідні програми існують тільки для DOS, а не для Linux, будучи пропрієтарним ПО виробника і об'єктом комерційної таємниці. Цей метод завантаження не особливо актуальне, оскільки в Linux є драйвери для безлічі апаратних пристроїв, хоча в минулому він був вельми корисний.
Інший приклад: коли Linux знаходиться на пристрої зберігання даних, яке не призначене для завантаження з BIOS: DOS або Windows можуть завантажити відповідні драйвери, щоб обійти таке обмеження BIOS, а потім завантажити звідти Linux.

Ядро Linux управляє головними функціями, такими як управління пам'яттю. диспетчер завдань. ввід вивід. межпроцессное взаємодія і загальне управління системою. Завантаження проходить в два етапи: на першому ядро ​​(у вигляді стислого файлу-образу) завантажується в оперативну пам'ять і розпаковується, далі налаштовуються такі базові функції як Головне управління пам'яттю. Потім управління в останній раз передається основного процесу запуску ядра. Як тільки ядро ​​стає повністю працездатним (т. Е. Завантаженим і виконав свій код), воно знаходить і запускає процес init, який самостійно налаштовує призначене для користувача простір і процеси, необхідні для функціонування користувальницького оточення і підсумкового входу в систему. Саме ядро ​​переходить в режим бездіяльності і готовності до викликів з боку інших процесів.

Етап завантаження ядра

Ядро при завантаженні зазвичай має вигляд файлу-образу, стисненого в формат zImage або bzImage за допомогою zlib. У ньому міститься головний програма, яка проводить мінімальну налаштування обладнання, розпаковує образ цілком в верхню пам'ять і монтує RAM-диск. якщо він передбачений. [5] Після цього вона виконує запуск ядра за допомогою ./arch/x86/boot/head і процесу startup_32 () (для процесорів сімейства x86).

Етап запуску ядра

Функція запуску ядра (також звана Своппер або процес 0) організовує управління пам'яттю (таблиці сторінок і сторінкову організацію пам'яті), визначає тип процесора і додаткові можливості (наприклад, наявність математичного співпроцесора), а потім перемикається до архітектурно-незалежного функціоналу ядра Linux шляхом виклику start_kernel ().

start_kernel () виконує безліч завдань ініціалізації. Вона налаштовує обробники переривань (IRQ), потім налаштовує пам'ять, запускає процес init (перший процес користувацького режиму), а потім запускає завдання бездіяльності викликом cpu_idle (). Слід зауважити, що процес запуску ядра також монтує ініціює RAM-диск ( «initrd»), який раніше був завантажений в ролі тимчасової кореневої файлової системи в фазі завантаження. Це дозволяє завантажувати модулі драйверів, не спираючись на інші фізичні пристрої та драйвери, і підтримувати невеликий розмір ядра. Коренева файлова система згодом підміняється за допомогою виклику pivot_root (). який размонтіруйте тимчасову і замінює її справжньою кореневої ФС, як тільки остання стане доступна. Використана тимчасової системою пам'ять потім звільняється.

Таким чином, ядро ​​инициализирует пристрої, монтує зазначену загрузчиком файлову систему в режимі "тільки читання» і запускає процес init (/ sbin / init), який позначається як перший процес, запущений системою (з ідентифікатором процесу PID = 1). [1] Відповідні повідомлення виводить ядро ​​(при монтуванні файлової системи) і init (при запуску однойменного процесу). Ядро також може виконати initrd для обробки налаштувань і ініціалізації пристроїв до монтування кореневої файлової системи. [1]

За заявою компанії «Red Hat», деталі процесу завантаження на цьому етапі можна підсумувати так: [2]

Коли завантажується ядро, воно відразу ж инициализирует і конфигурирует пам'ять комп'ютера і налаштовує різне підключений до системи обладнання, включаючи всі процесори, підсистеми введення-виведення і пристрої зберігання даних. Потім воно шукає стислий образ initrd в заздалегідь певній ділянці пам'яті, розпаковує його, монтує і завантажує всі необхідні драйвери. Потім воно ініціалізує віртуальні пристрої, пов'язані з файлової системою, наприклад LVM або програмні RAID -массіви, перш ніж демонтувати образ диска initrd і звільнити всю пам'ять, раніше займану чином. Потім ядро ​​створює кореневе пристрій, монтує кореневий розділ тільки для читання і звільняє всю невикористану пам'ять. До цього часу ядро ​​завантажене в пам'ять і працездатний. Проте, оскільки немає призначених для користувача програм для здійснення осмисленого введення даних в систему, з нею мало що можна робити.

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

Процес init (тільки типу UNIX System V)

Init є батьком всіх процесів. Його головне завдання - створювати процеси за сценарієм з файлу / etc / inittab. У цьому файлі зазвичай містяться записи, які вказують init породити getty для кожної лінії, по якій користувачі можуть входити в систему. Він також контролює автономні процеси, необхідні будь-якій системі. Рівень виконання - програмна конфігурація системи, яка дозволяє існувати тільки вибраної групи процесів. Процеси, що породжуються init на кожному з таких рівнів виконання. визначаються у файлі / etc / inittab. [6]

По суті init організовує і підтримує все призначене для користувача простір. що включає в себе також перевірку і монтування файлових систем, запуск потрібних для користувача служб і, перемикання в призначену для користувача середу, коли запуск системи завершиться. Він схожий на процеси init в Unix і BSD. від яких стався, але в деяких випадках він змінений або перероблений. У звичайній системі Linux init має параметр, відомий як рівень виконання. приймає значення від 1 до 6 і визначає, які підсистеми слід включити. Для кожного рівня виконання є власні сценарії, які регламентують різні процеси, які беруть участь у встановленні або зняття даного рівня, і саме ці сценарії вважаються необхідними для процесу завантаження. Сценарії init зазвичай зберігаються в каталогах з іменами виду / etc / rc .... Головний файл конфігурації рівнів для init - / etc / inittab. [7]

Під час завантаження системи він перевіряє, описаний чи рівень за замовчуванням в / etc / inittab. а якщо ж ні - запитує його через системну консоль. Потім він продовжує виконувати всі відповідні сценарії завантаження для цього рівня, включаючи завантаження модулів, перевірку цілісності файлової системи (яка монтувалася тільки для читання), перемонтування її для читання-запису і настройку мережі. [1]

Зокрема, за повідомленням Red Hat. процес init слід такою схемою: [2]

  1. Він переглядає сценарій sysinit. який "встановлює шлях до середовища, запускає swap. перевіряє файлові системи і робить все, що необхідно для ініціалізації системи. Це, зокрема, системні і апаратні годинник, спеціальні процеси для послідовного порту і т. п.
  2. Потім init переглядає конфігурацію, зазначену для заданого рівня виконання.
  3. Після цього init встановлює вихідну бібліотеку функцій для системи. Це визначає, як слід запустити або зняти програму і як визначити її PID.
  4. Потім він запускає всі передбачені процеси і створює сесію входу користувача в систему.

Після того, як він породив всі задані процеси, init переходить в режим очікування і чекає одного з трьох подій:

  1. Нормального або аварійного завершення породжених процесів.
  2. Сигналу аварії харчування.
  3. Запиту від / sbin / telinit на зміну рівня виконання. [6]

Це відноситься до програми init в стилі UNIX System V. Інші програми init можуть вести себе інакше.

Схожі статті