101.2 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
101 Архітектура системи |
Тема: |
101.2 Завантаження системи |
Урок: |
1 з 1 |
Вступ
Щоб керувати комп’ютером, основний компонент операційної системи, ядро — має бути завантажений програмою, яка називається завантажувач (bootloader). Він сам завантажується попередньо встановленим програмним забезпеченням, таким як BIOS або UEFI. Завантажувач можна налаштувати для передачі параметрів ядру, наприклад, який розділ містить кореневу файлову систему або в якому режимі повинна виконуватися операційна система. Після завантаження ядро продовжує процес завантаження, ідентифікуючи та налаштовуючи обладнання. Нарешті, ядро викликає утиліту, відповідальну за запуск і керування службами системи.
Note
|
У деяких дистрибутивах Linux команди, що пропонуються для виконання в цьому уроці, можуть вимагати привілеїв root. |
BIOS або UEFI
Процедури, які виконуються комп’ютерами x86 для запуску завантажувача, відрізняються незалежно від того, використовують вони BIOS чи UEFI. BIOS, скорочення від Basic Input/Output System, — це програма, що зберігається в мікросхемі енергонезалежної пам’яті, приєднаній до материнської плати, і вона виконується щоразу, коли комп’ютер увімкнено. Цей тип програми називається прошивка (firmware) і вона зберігається окремо від інших пристроїв зберігання даних, які може мати система. BIOS припускає, що перші 440 байт у першому запам’ятовуючому пристрої, відповідно до порядку, визначеного в утиліті налаштування BIOS, є місцем зберігання завантажувача (також званого bootstrap). Перші 512 байт запам’ятовуючого пристрою називаються MBR (Master Boot Record) пристроїв зберігання даних за стандартною схемою розділів DOS і, на додаток до першої частини завантажувача, містять таблицю розділів. Якщо MBR не містить правильних даних, система не зможе завантажитися без використання альтернативного методу.
Кроки перед запуском для завантаження системи з BIOS наступні:
-
Процес POST (power-on self-test) виконується для виявлення простих апаратних збоїв, щойно пристрій увімкнено.
-
BIOS активує основні компоненти для завантаження системи, такі як відеовихід, клавіатура та носій інформації.
-
BIOS завантажує першу частину завантажувача з MBR (перші 440 байт першого пристрою, як визначено в утиліті налаштування BIOS).
-
Перша частина завантажувача викликає другу його частину, що відповідає за представлення параметрів завантаження та завантаження ядра.
UEFI, скорочення від Unified Extensible Firmware Interface, відрізняється від BIOS у деяких ключових моментах. Як і BIOS, UEFI також є мікропрограмою, але вона може ідентифікувати розділи та читати багато файлових систем, знайдених у них. UEFI не покладається на MBR, враховуючи лише налаштування, що зберігаються в його енергонезалежній пам’яті (NVRAM), підключеній до материнської плати. Ці визначення вказують на розташування сумісних з UEFI програм, які називаються EFI застосунками, що будуть виконуватися автоматично або викликатися з меню завантаження. Програми EFI можуть бути завантажувачами, селекторами операційної системи, інструментами для діагностики та відновлення системи тощо. Вони мають бути розташовані на звичайному розділі пристрою зберігання даних і в сумісній файловій системі. Стандартні сумісні файлові системи FAT12, FAT16 і FAT32 для блочних пристроїв і ISO-9660 для оптичних носіїв. Цей підхід дозволяє реалізувати набагато складніші інструменти, ніж ті, які можливі з BIOS.
Розділ, що містить застосунки EFI, називається Системним розділом EFI або просто ESP (EFI System Partition). Цей розділ не можна спільно використовувати з іншими системними файловими системами, такими як коренева файлова система або файлові системи даних користувача. Каталог EFI в розділі ESP містить застосунки, на які вказують записи, збережені в NVRAM.
Попередні етапи завантаження системи перед операційною системою з UEFI наступні:
-
Процес POST (power-on self-test) виконується для виявлення простих апаратних збоїв, щойно пристрій увімкнено.
-
UEFI активує основні компоненти для завантаження системи, такі як відеовихід, клавіатура та носій інформації.
-
Мікропрограмне забезпечення UEFI зчитує визначення, збережені в NVRAM, щоб виконати попередньо визначену програму EFI, що зберігається у файловій системі розділу ESP. Зазвичай попередньо визначена програма EFI є завантажувачем.
-
Якщо попередньо визначена програма EFI є завантажувачем, вона завантажить ядро для запуску операційної системи.
Стандарт UEFI також підтримує функцію під назвою Безпечне завантаження (Secure Boot), яка дозволяє виконувати лише підписані програми EFI, тобто програми EFI, авторизовані виробником обладнання. Ця функція підвищує захист від шкідливого програмного забезпечення, але може ускладнити встановлення операційних систем, на які не поширюється гарантія виробника.
Завантажувач
Найпопулярнішим завантажувачем для Linux в архітектурі x86 є GRUB (Grand Unified Bootloader). Щойно його викликає BIOS або UEFI, GRUB відображає список операційних систем, доступних для завантаження. Іноді список не з’являється автоматично, але його можна викликати, натиснувши Shift, коли BIOS викликає GRUB. У системах UEFI для цього слід використовувати клавішу Esc.
З меню GRUB можна вибрати, яке з встановлених ядер потрібно завантажити, і передати йому нові параметри. Більшість параметрів ядра відповідають шаблону option=value
. Деякі з найбільш корисних параметрів ядра:
acpi
-
Вмикає/вимикає підтримку ACPI.
acpi=off
вимкне підтримку ACPI. init
-
Встановлює альтернативний системний ініціатор. Наприклад,
init=/bin/bash
встановить оболонку Bash як ініціатор. Це означає, що сеанс оболонки почнеться відразу після процесу завантаження ядра. systemd.unit
-
Встановлює systemd як цілі для активації. Наприклад,
systemd.unit=graphical.target
. Systemd також приймає числові рівні виконання, визначені для SysV. Наприклад, щоб активувати рівень виконання 1, необхідно лише включити число1
або літеруS
(скорочене від “single”) як параметр ядра. mem
-
Встановлює обсяг доступної оперативної пам’яті для системи. Цей параметр корисний для віртуальних машин, щоб обмежити обсяг оперативної пам’яті, доступний кожній гостьові ОС. Використання
mem=512M
обмежить 512 мегабайтами обсяг доступної оперативної пам’яті для певної гостьової системи. maxcpus
-
Обмежує кількість процесорів (або ядер процесора), видимих для системи в симетричних багатопроцесорних машинах. Це також корисно для віртуальних машин. Значення
0
вимикає підтримку багатопроцесорних машин і має той самий ефект, що й параметр ядраnosmp
. Параметрmaxcpus=2
обмежить кількість процесорів, доступних для операційної системи, до двох. quiet
-
Приховує більшість повідомлень про завантаження.
vga
-
Вибирає режим відео. Параметр
vga=ask
покаже список доступних режимів на вибір. root
-
Встановлює кореневий розділ, відмінний від попередньо налаштованого в завантажувачі. Наприклад,
root=/dev/sda3
. rootflags
-
Параметри монтування для кореневої файлової системи.
ro
-
Робить початкове монтування кореневої файлової системи доступним лише для читання.
rw
-
Дозволяє записувати до кореневої файлової системи під час початкового монтування.
Зміна параметрів ядра зазвичай не потрібна, але це може бути корисно для виявлення та вирішення проблем, пов’язаних з операційною системою. Параметри ядра необхідно додати до файлу /etc/default/grub
у рядку GRUB_CMDLINE_LINUX
, щоб зробити їх постійними під час перезавантажень. Новий файл конфігурації для завантажувача має генеруватися щоразу, коли змінюється /etc/default/grub
, що виконується командою grub-mkconfig -o /boot/grub/grub.cfg
. Після запуску операційної системи параметри ядра, які використовуються для завантаження поточного сеансу, доступні для читання у файлі /proc/cmdline
.
Note
|
Налаштування GRUB буде розглянуто далі в наступному уроці. |
Ініціалізація системи
Крім ядра, операційна система залежить від інших компонентів, які забезпечують очікувані функції. Багато з цих компонентів завантажуються під час процесу ініціалізації системи — від простих сценаріїв оболонки до більш складних сервісних програм. Скрипти часто використовуються для виконання короткочасних завдань, які запускаються та завершуються під час ініціалізації системи. Служби, також відомі як демони, можуть бути активними весь час, оскільки вони в цей час відповідають за внутрішні аспекти операційної системи.
Різноманітність способів, за допомогою яких сценарії запуску та демони з різними характеристиками можуть бути вбудовані в дистрибутив Linux, величезна, і цей факт історично перешкоджав розробці єдиного рішення, яке відповідає очікуванням розробників і користувачів усіх дистрибутивів Linux. Однак будь-який інструмент, який розповсюджувачі вибрали для виконання цієї функції, принаймні зможе запускати, зупиняти та перезапускати системні служби. Ці дії часто виконує сама система, наприклад, після оновлення програмного забезпечення, але системному адміністратору майже завжди потрібно буде вручну перезапустити службу після внесення змін до її конфігураційного файлу.
Системному адміністратору також зручно активувати певний набір демонів залежно від обставин. Має бути можливість, наприклад, запустити лише мінімальний набір служб для виконання завдань з обслуговування системи.
Note
|
Строго кажучи, операційна система — це лише ядро та його компоненти, які керують апаратним забезпеченням та всіма процесами. Однак прийнято використовувати термін «операційна система» більш вільно, щоб позначити цілу групу окремих програм, які складають програмне середовище, де користувач може виконувати основні обчислювальні завдання. |
Ініціалізація операційної системи починається, коли завантажувач завантажує ядро в оперативну пам’ять. Потім ядро бере на себе відповідальність за ЦП і починає виявляти та налаштовувати основні аспекти операційної системи, такі як базова конфігурація обладнання та адресація пам’яті.
Потім ядро відкриває initramfs (початкова файлова система RAM). Initramfs — це архів, що містить файлову систему, яка використовується як тимчасова коренева файлова система під час процесу завантаження. Основна мета файлу initramfs — надати необхідні модулі, щоб ядро могло отримати доступ до «справжньої» кореневої файлової системи операційної системи.
Щойно буде доступна коренева файлова система, ядро змонтує всі файлові системи, налаштовані в /etc/fstab
, а потім виконає першу програму, утиліту з назвою init
. Програма init
відповідає за виконання всіх сценаріїв ініціалізації та системних демонів. Існують різні реалізації таких системних ініціаторів, крім традиційних, подібних до systemd та Upstart. Після завантаження програми init, initramfs видаляється з RAM.
- Стандарт SysV
-
Менеджер служб на основі стандарту SysVinit контролює, які демони та ресурси будуть доступні, використовуючи концепцію runlevels. Рівні виконання пронумеровані від 0 до 6 і створені розробниками дистрибутива для виконання певних цілей. Єдиними визначенними рівнями виконання, спільними для всіх дистрибутивів, є рівні виконання 0, 1 і 6.
- systemd
-
systemd — це сучасний менеджер систем і служб з рівнем сумісності для команд і рівнів виконання SysV. systemd має паралельну структуру, використовує сокети та D-Bus для активації служби, виконання демону на вимогу, моніторингу процесу за допомогою cgroups, підтримки моментальних знімків, відновлення сеансу системи, керування точкою монтування та керування службами на основі залежностей. В останні роки більшість основних дистрибутивів Linux поступово прийняли systemd як системний менеджер за замовчуванням.
- Upstart
-
Як і systemd, Upstart є заміною init. У центрі уваги Upstart є прискорення процесу завантаження шляхом розпаралелювання процесу завантаження системних служб. Upstart використовувався дистрибутивами на базі Ubuntu в минулих випусках, але сьогодні поступився systemd.
Перевірка ініціалізації
Під час процесу завантаження можливі помилки, але вони можуть бути не такими критичними, щоб повністю зупинити роботу операційної системи. Незважаючи на це, ці помилки можуть поставити під загрозу очікувану поведінку системи. Усі помилки призводять до повідомлень, які можна використовувати для майбутніх досліджень, оскільки вони містять цінну інформацію про те, коли і як сталася помилка. Навіть якщо повідомлення про помилки не генеруються, інформація, зібрана під час процесу завантаження, може бути корисною для коригування та налаштування.
Простір пам’яті, де ядро зберігає свої повідомлення, включно з повідомленнями про завантаження, називається кільцевим буфером ядра (kernel ring buffer). Повідомлення зберігаються в кільцевому буфері ядра, навіть якщо вони не відображаються під час процесу ініціалізації, наприклад, коли замість цього відображається анімація. Однак кільцевий буфер ядра втрачає всі повідомлення, коли систему вимкнено або виконується команда dmesg --clear
. Без параметрів команда dmesg
відображає поточні повідомлення в кільцевому буфері ядра:
$ dmesg [ 5.262389] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null) [ 5.449712] ip_tables: (C) 2000-2006 Netfilter Core Team [ 5.460286] systemd[1]: systemd 237 running in system mode. [ 5.480138] systemd[1]: Detected architecture x86-64. [ 5.481767] systemd[1]: Set hostname to <torre>. [ 5.636607] systemd[1]: Reached target User and Group Name Lookups. [ 5.636866] systemd[1]: Created slice System Slice. [ 5.637000] systemd[1]: Listening on Journal Audit Socket. [ 5.637085] systemd[1]: Listening on Journal Socket. [ 5.637827] systemd[1]: Mounting POSIX Message Queue File System... [ 5.638639] systemd[1]: Started Read required files in advance. [ 5.641661] systemd[1]: Starting Load Kernel Modules... [ 5.661672] EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro [ 5.694322] lp: driver loaded but no devices found [ 5.702609] ppdev: user-space parallel port driver [ 5.705384] parport_pc 00:02: reported by Plug and Play ACPI [ 5.705468] parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA] [ 5.800146] lp0: using parport0 (interrupt-driven). [ 5.897421] systemd-journald[352]: Received request to flush runtime journal from PID 1
Виведення dmesg
може складатися з сотень рядків, тому перелік вище містить лише уривок, що показує ядро, яке викликає менеджер служби systemd. Значення на початку рядків – це кількість секунд з початку завантаження ядра.
У системах на основі systemd команда journalctl
покаже повідомлення про ініціалізацію з параметрами -b
, --boot
, -k
або --dmesg
. Команда journalctl --list-boots
показує список номерів завантаження відносно поточного завантаження, їх ідентифікаційний хеш та позначки часу першого та останнього відповідних повідомлень:
$ journalctl --list-boots -4 9e5b3eb4952845208b841ad4dbefa1a6 Thu 2019-10-03 13:39:23 -03—Thu 2019-10-03 13:40:30 -03 -3 9e3d79955535430aa43baa17758f40fa Thu 2019-10-03 13:41:15 -03—Thu 2019-10-03 14:56:19 -03 -2 17672d8851694e6c9bb102df7355452c Thu 2019-10-03 14:56:57 -03—Thu 2019-10-03 19:27:16 -03 -1 55c0d9439bfb4e85a20a62776d0dbb4d Thu 2019-10-03 19:27:53 -03—Fri 2019-10-04 00:28:47 -03 0 08fbbebd9f964a74b8a02bb27b200622 Fri 2019-10-04 00:31:01 -03—Fri 2019-10-04 10:17:01 -03
Попередні журнали ініціалізації також зберігаються в системах на основі systemd, тому повідомлення з попередніх сеансів операційної системи все ще доступні для перевірки. Якщо задано параметри -b 0
або --boot=0
, то будуть показані повідомлення для поточного завантаження. Параметри -b -1
або --boot=-1
відображатимуть повідомлення з попередньої ініціалізації. Параметри -b -2
або --boot=-2
відображатимуть повідомлення від ініціалізації до цього часу тощо. Наступна інформація показує, як ядро викликає диспетчер служби systemd для останнього процесу ініціалізації:
$ journalctl -b 0 oct 04 00:31:01 ubuntu-host kernel: EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null) oct 04 00:31:01 ubuntu-host kernel: ip_tables: (C) 2000-2006 Netfilter Core Team oct 04 00:31:01 ubuntu-host systemd[1]: systemd 237 running in system mode. oct 04 00:31:01 ubuntu-host systemd[1]: Detected architecture x86-64. oct 04 00:31:01 ubuntu-host systemd[1]: Set hostname to <torre>. oct 04 00:31:01 ubuntu-host systemd[1]: Reached target User and Group Name Lookups. oct 04 00:31:01 ubuntu-host systemd[1]: Created slice System Slice. oct 04 00:31:01 ubuntu-host systemd[1]: Listening on Journal Audit Socket. oct 04 00:31:01 ubuntu-host systemd[1]: Listening on Journal Socket. oct 04 00:31:01 ubuntu-host systemd[1]: Mounting POSIX Message Queue File System... oct 04 00:31:01 ubuntu-host systemd[1]: Started Read required files in advance. oct 04 00:31:01 ubuntu-host systemd[1]: Starting Load Kernel Modules... oct 04 00:31:01 ubuntu-host kernel: EXT4-fs (sda1): re-mounted. Opts: commit=300,barrier=0,errors=remount-ro oct 04 00:31:01 ubuntu-host kernel: lp: driver loaded but no devices found oct 04 00:31:01 ubuntu-host kernel: ppdev: user-space parallel port driver oct 04 00:31:01 ubuntu-host kernel: parport_pc 00:02: reported by Plug and Play ACPI oct 04 00:31:01 ubuntu-host kernel: parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA] oct 04 00:31:01 ubuntu-host kernel: lp0: using parport0 (interrupt-driven). oct 04 00:31:01 ubuntu-host systemd-journald[352]: Journal started oct 04 00:31:01 ubuntu-host systemd-journald[352]: Runtime journal (/run/log/journal/abb765408f3741ae9519ab3b96063a15) is 4.9M, max 39.4M, 34.5M free. oct 04 00:31:01 ubuntu-host systemd-modules-load[335]: Inserted module 'lp' oct 04 00:31:01 ubuntu-host systemd-modules-load[335]: Inserted module 'ppdev' oct 04 00:31:01 ubuntu-host systemd-modules-load[335]: Inserted module 'parport_pc' oct 04 00:31:01 ubuntu-host systemd[1]: Starting Flush Journal to Persistent Storage...
Ініціалізація та інші повідомлення, які формує операційна система, зберігаються у файлах у каталозі /var/log/
. Якщо сталася критична помилка і операційна система не може продовжити процес ініціалізації після завантаження ядра та initramfs, для запуску системи та доступу до відповідної файлової системи можна використовувати альтернативний завантажувальний носій. Потім у файлах у папці /var/log/
можна буде шукати можливі причини, що спричиняють переривання процесу завантаження. Параметри -D
або --directory
команди journalctl
можна використовувати для читання повідомлень журналу в каталогах, відмінних від /var/log/journal/
, який є розташуванням за замовчуванням для повідомлень журналу systemd. Оскільки повідомлення журналу systemd не є текстовими файлами, для їх читання потрібна команда journalctl
.
Вправи до посібника
-
Де на комп’ютері з мікропрограмою BIOS розташований двійковий файл початкового завантажувача?
-
Мікропрограмне забезпечення UEFI підтримує розширені функції, надані зовнішніми програмами, які називаються EFI-застосунками. Однак ці програми мають своє особливе розташування. Де в системі будуть розташовані програми EFI?
-
Завантажувачі дозволяють передавати спеціальні параметри ядра перед його завантаженням. Припустимо, що система не може завантажитися через неправильне розташування кореневої файлової системи. Яким чином правильна коренева файлова система, розташована в
/dev/sda3
, буде передана як параметр ядру? -
Процес завантаження комп’ютера Linux закінчується таким повідомленням:
ALERT! /dev/sda3 does not exist. Dropping to a shell!
Яка ймовірна причина цієї проблеми?
Дослідницькі вправи
-
Завантажувач надасть список операційних систем для вибору, якщо на машині встановлено більше однієї операційної системи. Однак нещодавно встановлена операційна система може перезаписати MBR жорсткого диска, стираючи перший етап завантажувача і роблячи іншу операційну систему недоступною. Чому цього не станеться на машині, обладнаній прошивкою UEFI?
-
Що є поширеним наслідком встановлення спеціального ядра без надання відповідного образу initramfs?
-
Журнал ініціалізації складається з сотень рядків, тому виведення команди
dmesg
часто передається команді для перегляду виведення частинами (наприклад, командаless
) для полегшення читання. Який параметрdmesg
автоматично розбиватиме вихідні дані на сторінки, усуваючи необхідність явного використання команди перегляду сторінок? -
Жорсткий диск, що містить всю файлову систему окремого комп’ютера, був вилучений і приєднаний до іншого комп’ютера як допоміжний диск. Припускаючи, що його точкою монтування є
/mnt/hd
, якjournalctl
використовуватиметься для перевірки вмісту файлів журналу, розташованих за адресою/mnt/hd/var/log/journal/
?
Підсумки
Цей урок охоплює послідовність завантаження в стандартній системі Linux. Належне знання того, як працює процес завантаження системи Linux, допомагає запобігти помилкам, які можуть зробити систему недоступною. Урок пояснює такі теми:
-
Чим відрізняються методи завантаження BIOS і UEFI.
-
Типові етапи ініціалізації системи.
-
Відновлення завантажувальних повідомлень.
Розглянуті наступні команди та процедури:
-
Загальні параметри ядра.
-
Команди для читання повідомлень про завантаження:
dmesg
таjournalctl
.
Відповіді на вправи до посібника
-
Де на комп’ютері з мікропрограмою BIOS розташований двійковий файл початкового завантажувача?
У MBR першого запам’ятовуючого пристрою, як визначено в утиліті налаштування BIOS.
-
Мікропрограмне забезпечення UEFI підтримує розширені функції, надані зовнішніми програмами, які називаються EFI-застосунками. Однак ці програми мають своє особливе розташування. Де в системі будуть розташовані програми EFI?
Програми EFI зберігаються в системному розділі EFI (ESP), розташованому в будь-якому доступному блоці сховища з сумісною файловою системою (зазвичай файлова система FAT32).
-
Завантажувачі дозволяють передавати спеціальні параметри ядра перед його завантаженням. Припустимо, що система не може завантажитися через неправильне розташування кореневої файлової системи. Яким чином правильна коренева файлова система, розташована в
/dev/sda3
, буде передана як параметр ядру?Слід використовувати параметр
root
, для цього прикладуroot=/dev/sda3
. -
Процес завантаження комп’ютера Linux закінчується таким повідомленням:
ALERT! /dev/sda3 does not exist. Dropping to a shell!
Яка ймовірна причина цієї проблеми?
Ядро не змогло знайти пристрій
/dev/sda3
, вказаний як коренева файлова система.
Відповіді до дослідницьких вправ
-
Завантажувач надасть список операційних систем для вибору, якщо на машині встановлено більше однієї операційної системи. Однак нещодавно встановлена операційна система може перезаписати MBR жорсткого диска, стираючи перший етап завантажувача і роблячи іншу операційну систему недоступною. Чому цього не станеться на машині, обладнаній прошивкою UEFI?
Комп’ютери з UEFI не використовують MBR жорсткого диска для зберігання першого етапу завантажувача.
-
Що є поширеним наслідком встановлення спеціального ядра без надання відповідного образу initramfs?
Коренева файлова система може бути недоступною, якщо її тип був скомпільований як зовнішній модуль ядра.
-
Журнал ініціалізації складається з сотень рядків, тому виведення команди
dmesg
часто передається команді для перегляду виведення частинами (наприклад, командаless
) для полегшення читання. Який параметрdmesg
автоматично розбиватиме вихідні дані на сторінки, усуваючи необхідність явного використання команди перегляду сторінок?Команди
dmesg -H
абоdmesg --human
увімкнуть програму перегляду інформації посторіноково за замовчуванням. -
Жорсткий диск, що містить всю файлову систему окремого комп’ютера, був вилучений і приєднаний до іншого комп’ютера як допоміжний диск. Припускаючи, що його точкою монтування є
/mnt/hd
, якjournalctl
використовуватиметься для перевірки вмісту файлів журналу, розташованих за адресою/mnt/hd/var/log/journal/
?За допомогою команд
journalctl -D /mnt/hd/var/log/journal
абоjournalctl --directory=/mnt/hd/var/log/journal