Ноу Інти, лекція, етапи завантаження системи
Анотація: В лекції розглядаються основні етапи завантаження комп'ютера як до початку роботи ядра Linux (системно-незалежна частина), так і в процесі завантаження системи (власне Linux). Детально розбираються рівні виконання і стартові сценарії. Описано дії, необхідні для зупинки системи.
досистемно завантаження
Програма login. реєструє користувачів в системі, буде працювати тільки тоді, коли сама система вже приведена в повну готовність і працює в звичайному режимі. Відбувається це далеко не відразу після включення комп'ютера: Linux - досить складна система, об'єкти якої потрапляють в оперативну пам'ять не самі собою, а в процесі завантаження. Сама завантаження - процес ступінчастий: поведінка комп'ютера на різних етапах завантаження визначається різними людьми - від розробників апаратної складової до системного адміністратора. Пред'являються до системи вимоги гнучкості, можливості змінювати її налаштування в залежності від апаратної складової, необхідність вирішувати різні завдання за допомогою одного і того ж комп'ютера теж роблять процес завантаження ступінчастим: спочатку визначається профіль майбутньої системи, а потім цей профіль реалізується.
Початковий етап взагалі не залежить від того, яка операційна система встановлена на комп'ютері, для деяких етапів в кожній операційній системі пропонуються свої рішення - здебільшого, взаємозамінні. Цю стадію (початкову) назвемо досистемно завантаженням. Починаючи з певного етапу, завантаження комп'ютера вже управляється самої Linux, використовуються утиліти, сценарії і т.п. Цю стадію (завершальну) назвемо системної завантаженням.
Завантажувач в ПЗУ
Відразу після включення оперативна пам'ять комп'ютера класичної архітектури невинно чиста. Для того щоб почати працювати, процесору необхідна хоч якась програма. Ця програма автоматично завантажується в пам'ять з постійного пам'яті. ПЗУ (або ROM, read-only memory), в яке вона вписана раз і назавжди в незмінному вигляді 1 Сучасні комп'ютери використовують програмовані ПЗУ. вміст яких можна змінювати, однак така зміна завжди вважається ситуацією нештатної: наприклад, запис нової версії вмісту ПЗУ. в якій виправлені помилки (upgrade). У спеціалізованих комп'ютерах (наприклад, в дешевих ігрових приставках) все, що потрібно користувачеві, записується саме на ПЗУ (часто змінне), і запуском програми звідти завантаження закінчується.
Зазвичай в комп'ютерах загального призначення програма з ПЗУ користувачеві нічим корисна не буває: вона невелика, та й робить завжди одне і те ж. Злегка змінити поведінку програми з ПЗУ можна, оперуючи даними, записаними в незалежну пам'ять (іноді її називають CMOS, іноді - NVRAM). Обсяг енергонезалежної пам'яті дуже невеликий, а дані з неї зберігаються після вимкнення комп'ютера за рахунок автономного електроживлення (як правило, від батарейки на кшталт годинний).
BIOS. Скорочення від "Basic Input-Output System", набір підпрограм в ПЗУ. призначених для найпростішого низкоуровневого доступу до зовнішніх пристроїв комп'ютера. У сучасних ОС використовується тільки в процесі початкового завантаження.
Цей етап завантаження системи можна назвати нульовим. так як ні від якої системи він не залежить. Його завдання - визначити (можливо, за допомогою користувача), з якого пристрою буде йти завантаження, завантажити звідти спеціальну програму-завантажувач і запустити її. Наприклад, з'ясувати, що пристрій для завантаження - жорсткий диск, вважати найперший сектор цього диска і передати управління програмою, яка знаходиться в ліченої області.
Завантажувальний сектор і первинний завантажувач
Найчастіше розмір первинного дискового завантажувача - програми, якою передається керування після нульового етапу, - дуже невеликий. Це пов'язано з вимогами універсальності подібного роду програм. Зчитувати дані з диска можна секторами. розмір яких різниться для різних типів дискових пристроїв (від половини кілобайт до восьми або навіть більше). Крім того, якщо вважати один, перший, сектор диска можна завжди одним і тим же способом, то команди читання декількох секторів на різних пристроях можуть виглядати по-різному. Тому-то первинний завантажувач займає зазвичай не більше одного сектора на самому початку диска, в його завантажувального сектору.
Якби первинний завантажувач був побільше, він, напевно, і сам міг би розібратися, де знаходиться ядро операційної системи. і зміг би самостійно вважати його, розмістити в пам'яті, налаштувати і передати йому управління. Однак ядро операційної системи має досить складну структуру - а значить, і непростий спосіб завантаження; воно може бути досить великим, і, що найнеприємніше, може розташовуватися невідомо де на диску, підкоряючись законам файлової системи (наприклад, складатися з декількох частин, розкиданих по диску). Врахувати все це первинний завантажувач не в силах. Його завдання скромніше: визначити, де на диску знаходиться "великий" вторинний завантажувач. завантажити і запустити його. Вторинний завантажувач простий, і його можна покласти в заздалегідь визначене місце диска, або, на худий кінець, покласти в заздалегідь визначене місце карту розміщення. описує, де саме шукати його частини (розмір вторинного завантажувача обмежений, тому побудувати таку карту можливо).
Карта розміщення. Подання області з необхідними даними (наприклад, вторинним загрузчиком або ядром системи) у вигляді списку секторів диска, які вона займає.
У разі IBM-сумісного комп'ютера розмір завантажувального сектора становить всього 512 байтів. з яких далеко не всі припадають на програмну область. Завантажувальний сектор IBM PC, званий MBR (master boot record), містить також таблицю розбиття диска. структура якої описана в лекції 11. Зрозуміло, що програма такого розміру не може похвалитися розмаїттям функцій. Стандартний для багатьох систем завантажувальний сектор може тільки вважати таблицю розбиття диска. визначити так званий завантажувальний розділ (active partition) і завантажити програму, розташовану на початку цього розділу. Для кожного типу диска може бути своя програмна частина MBR. що дозволяє зчитувати дані з будь-якого місця диска, погодившись з його типом і геометрією. Однак зчитувати можна все ж не більше одного сектора: невідомо, для чого використовуються встановленої на цьому розділі операційною системою другий і наступні сектора. Виходить, що стандартна програмна частина MBR - це якийсь предзагрузчік. який зчитує і запускає справжній первинний завантажувач з першого сектора завантажувального розділу.
Існують версії предзагрузчіка. надають користувачеві можливість самостійно вибрати. з якого з розділів виконувати завантаження 2 Наприклад, BOOTACTV з пакета pfdisk або стандартний для FreeBSD предзагрузчік boot0. які, в силу їх досистемно. можна застосовувати де завгодно. Це дозволяє для кожної зі встановлених операційних систем зберігати власний первинний завантажувач на початку розділу і вільно вибирати серед них. У стандартній схемі завантаження Linux використовується інший підхід: простий первинний завантажувач записується прямо в MBR. а функція вибору передається вторинному завантажувачу.
Первинний завантажувач. Перша стадія завантаження комп'ютера: програма, розмір і можливості якої залежать від апаратних вимог і функцій BIOS. Основне завдання - завантажити вторинний завантажувач.
завантажувач ядра
У завдання вторинного завантажувача входить завантаження і початкова настройка ядра операційної системи. Як правило, ядро системи записується в файл з певним ім'ям. Але як вторинного завантажувачу прочитати файл з ядром. якщо в Linux ця операція і є функція ядра. Це завдання може бути вирішена трьома способами.
По-перше, ядро може і не бути файлом на диску. Якщо завантаження відбувається по мережі, досить попросити у сервера "файл з таким-то ім'ям", і у відповідь прийде цілісна послідовність даних, що містить запитане ядро. Всі файлові операції виконає сервер, на якому система вже завантажена і працює. В інших випадках ядро "заганяють" в спеціально виділений під це розділ, де воно лежить вже не у вигляді файлу, а таким же безперервним шматком, розмір і місце розташування якого відомі. Однак в Linux так чинити не прийнято, так як місця для спеціального розділу на диску, скажімо, IBM-сумісного комп'ютера може і не знайтися.
По-друге, можна скористатися описаної вище картою розміщення. уявити ядро у вигляді набору секторів на диску, записати цей набір в заздалегідь визначене місце, а завантажувач змусити збирати ядро з шматків по карті. Використання карти розміщення має два суттєвих недоліки: її створення можливо тільки під управлінням вже завантаженої системи, а зміна ядра повинно обов'язково супроводжуватись зміною карти. Якщо з якоїсь причини система не завантажується в жодній з заздалегідь спланованих конфігурацій, єдина можливість виправити становище - завантажитися з зовнішнього носія (наприклад, з лазерного диска). А система може не завантажуватися саме тому, що адміністратор забув після зміни ядра пересобрать карту. в карті вказаний список секторів, які відповідали старому файлу з ядром. і після видалення старого файлу в цих секторах може міститися будь-якій "сміття".
По-третє, можна навчити вторинний завантажувач розпізнавати структуру файлових систем і знаходити там файли по імені. Це помітно збільшить його розмір і зажадає "подвоєння функцій" - адже точно таке ж, навіть більш потужне, розпізнавання буде і в самому ядрі. Зате описаної вище тупикової ситуації можна уникнути, якщо, скажімо, не видаляти старе ядро при установці нового, а перейменовувати його. Тоді, якщо завантаження системи з новим ядром не вдалася, можна завантажитися ще раз, вручну вказавши ім'я файлу (або каталогу) зі старим ядром. під керуванням якого все працювало справно.
Вторинний завантажувач може не тільки завантажувати ядро. але і налаштовувати його. Найчастіше використовується механізм настройки ядра. схожий на командний рядок shell: в ролі команди виступає ядро. а в ролі параметрів - налаштування ядра. Налаштування ядра потрібні для тимчасової зміни його функціональності: наприклад, щоб вибрати інший графічний режим віртуальних консолей. щоб відключити підтримку додаткових можливостей зовнішніх пристроїв (якщо апаратура їх не підтримує), щоб передати самому ядру вказівки, як завантажувати систему і т.п.
Дуже часто конфігурація вторинного завантажувача передбачає кілька варіантів завантаження, починаючи від декількох варіантів завантаження одного і того ж ядра з різними настройками (наприклад, стандартний профіль і профіль з відключеними розширеними можливостями) і закінчуючи варіантами завантаження різних ядер і навіть різних операційних систем. Це вимагає від самого завантажувача деякої розмаїтості інтерфейсних засобів. З одного боку, він повинен вміти працювати в невибагливому оточенні, наприклад обмінюватися з користувачем даними через послідовний порт, до якого підключена системна консоль. З іншого боку, якщо є стандартні графічні пристрої введення / виводу, хотілося б, щоб завантажувач використовував і їх. Тому все завантажувачі мають універсальний текстовий інтерфейс (найчастіше з досить багатими можливостями) і різноманітний графічний (частіше у вигляді меню).
Особлива ситуація виникає в разі, коли на комп'ютері встановлено декілька операційних систем (наприклад, якщо персональний комп'ютер використовується також і для комп'ютерних ігор, строго прив'язаних до певної системи). У цьому випадку не варто сподіватися на "універсальність" вторинного завантажувача. навіть якщо він здатний розрізняти безліч файлових систем і кілька форматів завантаження ядер. неможливо знати їх все. Однак якщо в завантажувальному секторі розділу операційної системи записаний первинний завантажувач. можна просто завантажити його, як якщо б це сталося одразу після роботи MBR. Таким чином, вторинний завантажувач може виступати в ролі предзагрузчіка. передаючи управління "по ланцюжку" (chainloading). На жаль, чим довше ланцюжок, тим вище ймовірність її порвати: можна, наприклад, завантажити по ланцюжку MS-DOS, видалити з його допомогою розділ Linux, що мав вторинний завантажувач. а потім переразметіть цей розділ, чим і привести комп'ютер в неробочий стан.
Вторинний завантажувач. Друга стадія завантаження комп'ютера: програма, розмір і можливості якої практично не залежать від апаратних вимог. Основне завдання - повністю підготувати і запустити завантаження операційної системи.