Кожне сімейство операційних систем здійснює завантаження по-своєму. Це з різною архітектурою ядра операційної системи, різними інструкціями роботи з підключеними пристроями. У цій статті я спробую розібрати завантаження популярної операційної системи на ядрі Linux Ubuntu. Схематично процес завантаження можна відобразити в такий спосіб. Отже, натискаємо кнопку увімкнення комп'ютера, і центральний процесор переходить на адресу BIOS. BIOS або UEFI, у більш сучасних комп'ютерах, проводить систему перевірок і вибирає носій інформації, з якого буде здійснюватися завантаження операційної системи. На носії знаходиться MBR (Master Boot Record) або GPT (Guid Partition table) на нових комп'ютерах, у яких знаходиться завантажувач. А далі вже в залежності від налаштування. Завантажувач може самостійно завантажувати операційну систему, а може передавати керування наступному завантажувачу. Наприклад, якщо Windows та Linux встановлені на одному комп'ютері та знаходяться на різних розділах жорсткого диска. У будь-якому випадку, якщо йдеться про Linux, у нас є перша стадія з невеликою частиною коду, яка завантажує у нас завантажувач. Завантажувач знає, де лежить ядро операційної системи, завантажує ядро, завантажує initial run disk, там знаходяться необхідні файли та модулі для завантаження ядра. Далі вже ядро бере процес управління він. Відбувається ініціалізація пристроїв, конфігурування процесів пам'яті тощо. Після всіх цих процесів ядро запускає процес init. Повернемося до питання завантажувачів, для кожної операційної системи розроблено свій завантажувач, а іноді й кілька. NTLDR - Завантажувач операційної системи Windows, LILO - один із стандартних завантажувачів для Linux та BSD системи. GRUB - Завантажувач операційної системи від проекту GNU.Нас цікавлять останні два. Перейдемо безпосередньо до самого завантаження. Дане меню ми можемо отримати при завантаженні якщо затиснути клавішу Shift. а лише дозволяють почати завантаження в режимі відновлення recovery mode. Дана опція не є метою стати, і ми її опустимо. Повернемося до першого пункту завантаження.eотримуємо наступну картину завантаження. На цій картинці можна побачити, що кореневий розділ монтується по uuid, він буде кореневим root і безпосередньо сам ID розділу можна подивитися після завантаження операційної системи командою blkidБільшість параметрів можна відредагувати або більш детально. Після завантаження операційної системи ми можемо за допомогою команди dmesg подивитися, повідомлення ядра, все, що відбувалося з ядром. Потрібно розрізняти повідомлення ядра і лог ядра. cat /var/log/dmesgДаний файл містить інформацію тільки про завантаження операційної системи.Якщо подія відбувається пізніше, то цього файлу цієї інформації ви не знайдете. Є таке поняття Init – це перший чи батьківський процес, який запускає усі наступні процеси. Це може бути перевірка та монтаж файлових систем запуск служб і.т.д. Існує 3 варіанти роботи цього батьківського процесу. В операційній системі Ubuntu можна переглянути дерево процесів використовуючи команду pstree. В результаті її висновку ми можемо побачити, що батьківським процесом був процес systemd. Який уже запускав свої, якісь дочірні процеси. Перейдемо до кореневої директорії boot. Тут ми можемо побачити каталог завантажувача grub. Ядра лінуксові vmlinuz (посилання на ядро) і до оновлення старого ядра vmlinux.old (посилання на старе ядро). Відповідно пара initrd* - файли диска, ці файли містять диск, який вантажиться в оперативну пам'ять, цей диск містить файли необхідні самому ядру Linux для нормального завантаження. Перейшовши до директорії grub, ми можемо знайти конфігураційний файл grub.cfg і кілька допоміжних, але не менш важливих фалів. Відповідно ми можемо внести зміни до цього файлу на постійній основі і відповідно цей код буде виконуватися при кожному завантаженні операційної системи. Оригінал: An introduction to the Linux boot and startup processes Розуміння процесів завантаження та запуску Linux важливо для того, щоб розуміти, як правильно налаштувати систему, або вирішити проблеми із завантаженням. У цій статті наведено огляд послідовності завантаження системи з використанням завантажувача GRUB2 і послідовності запуску, що виконується системою ініціалізації systemd . Насправді є дві послідовності подій, які необхідні для завантаження Linux-комп'ютера і роблять його придатним для використання: завантаження і запуск. Послідовність завантаження починається, коли комп'ютер увімкнено, і завершується, коли ініціалізується ядро і запускається systemd. Потім процес запуску завершує завдання приведення комп'ютера Linux до робочого стану. В цілому процес завантаження і запуску Linux досить простий для розуміння. Він складається з наступних етапів, які детальніше будуть описані в наступних розділах. - BIOS POST; Зверніть увагу, що у цій статті розглядаються GRUB2 та systemd, оскільки вони є поточним завантажувачем та системою ініціалізації для більшості головних дистрибутивів. Раніше використовувалися інші варіанти таких програм і вони все ще використовуються в деяких дистрибутивах. Процес завантаження може бути ініційований одним із кількох способів. По-перше, якщо живлення відключено, його включення запустить процес завантаження. Якщо комп'ютер вже запущено, локальний користувач, включаючи root або звичайного користувача, може програмно ініціювати послідовність завантаження за допомогою графічного інтерфейсу або командного рядка для перезавантаження комп'ютера. Спочатку комп'ютер буде вимкнено, а потім перезавантажено. Перший етап процесу завантаження Linux насправді немає нічого спільного з Linux. Це апаратна частина процесу завантаження та вона однакова для будь-якої операційної системи. Коли комп'ютер подається харчування, він запускає процедуру POST (Power On Self Test), яка є частиною BIOS (Basic I/O System). Коли IBM розробила перший комп'ютер ще в 1981 році, для ініціалізації апаратних компонентів було розроблено BIOS. POST є частиною BIOS, завданням якого є забезпечення правильного функціонування обладнання. Якщо POST не спрацював нормально, комп'ютер може не використовуватися, тому процес завантаження не буде продовжено. BIOS POST перевіряє базову працездатність апаратного забезпечення, а потім видає переривання BIOS, INT 13H, яке знаходить сектори завантаження на всіх підключених завантажувальних пристроях.Перший завантажувальний сектор з правильним завантажувальним записом, який він знаходить, завантажується в ОЗУ, а потім керування передається коду, завантаженому із завантажувального сектора. Завантажувальний сектор - це фактично перший етап завантажувача. Існує три завантажувачі, які використовуються більшістю дистрибутивів Linux: GRUB, GRUB2 та LILO. GRUB2 є найсучаснішим і використовується сьогодні набагато частіше, ніж старіші варіанти. GRUB2 означає "GRAND Unified Bootloader, версія 2", і сьогодні він є основним завантажувачем для більшості дистрибутивів Linux. GRUB2 - це програма, яка робить комп'ютер досить розумним, щоб знайти ядро операційної системи та завантажити його на згадку. Оскільки простіше писати і говорити GRUB, ніж GRUB2, я використовуватиму термін GRUB у цьому документі, але при цьому посилатимуся на GRUB2, якщо не вказано інше. GRUB був розроблений для сумісності зі специфікацією multiboot, що дозволяє GRUB завантажувати безліч версій Linux та інших безкоштовних операційних систем; він також може завантажувати завантажувальний запис пропрієтарних операційних систем. GRUB також дозволяє користувачеві вибирати завантаження однієї з кількох різних ядер для будь-якого дистрибутива Linux. Це дає змогу завантажитись з попередньою версією ядра, якщо оновлена версія працює некоректно або несумісна з частиною програмного забезпечення. GRUB можна налаштувати за допомогою /boot/grub/grub.conf. GRUB1 тепер вважається застарілим та був замінений у більшості сучасних дистрибутивів на GRUB2, який є переписаним GRUB1. Дистрибутиви на основі Red Hat були оновлені до GRUB2, починаючи з Fedora 15 та CentOS/RHEL 7. GRUB2 забезпечує ту ж функціональність, що й GRUB1, але GRUB2 також забезпечує більшу гнучкість на етапі попереднього завантаження.GRUB2 налаштовується за допомогою /boot/grub2/grub.cfg. Основна функція GRUB полягає в тому, щоб завантажити ядро Linux в пам'ять і запустити його. статті. Хоча GRUB2 офіційно не використовує нотацію етапів для трьох етапів завантаження GRUB2, зручно звертатися до них таким чином, що я робитиму в цій статті. Як згадувалося в розділі POST BIOS, в кінці POST BIOS переглядає прикріплені диски в пошуку завантажувального запису, що зазвичай знаходиться в головному завантажувальному записі (MBR), завантажує першу виявлену в ОЗУ, а потім починає виконання завантажувального запису, тобто. етап 1 GRUB2 дуже малий, оскільки він повинен поміщатися в перший 512-байтовий сектор на жорсткому Диск разом з таблицею розділів. Загальний обсяг простору, виділеного для реального коду початкового завантаження в загальному загальному MBR, становить 446 байт. Оскільки завантажувальний запис повинен бути таким маленьким, він не дуже розумний і не розуміє структури файлової системи. Тому єдиною метою етапу 1 є знаходження та завантаження етапу 1.5. .Після завантаження етапу 1.5 GRUB в ОЗУ, етап 1 передає управління етапу 1.5. Як згадувалося вище, етап 1.5 GRUB повинен бути розташований у просторі між самим завантажувальним записом та першим розділом на диску. З технічних причин історично цей простір не використовувався.Перший розділ на жорсткому диску починається в секторі 63 з MBR в секторі 0, що залишає 62512-байтових секторів - 31744 байти, в яких зберігається файл core.img, який є етапом 1.5 GRUB. Розмір файлу core.img дорівнює 25389 байт, тому між MBR та першим дисковим розділом є багато вільного місця для його зберігання. Через більшу кількість коду, який може бути задіяний для етапу 1.5, він може містити кілька драйверів для поширених файлових систем, таких як EXT та інші файлові системи Linux, FAT і NTFS. GRUB2 core.img набагато більш складний та інтелектуальний порівняно з більш старим етапом 1.5 GRUB1. Це означає, що етап 2 GRUB2 може бути розташований на стандартній файловій системі EXT, але може бути розташований на логічному томі. Таким чином, стандартне розташування файлів етапу 2 – файлова система /boot, а саме /boot/grub2. Зверніть увагу, що каталог /boot повинен бути у файловій системі, що підтримується GRUB. Не всі файлові системи підходять для нього. Функція етапу 1.5 - завантажити драйвера файлової системи, необхідні пошуку файлів етапу 2 у файловій системі /boot і завантаження необхідних драйверів. Усі файли етапу 2 GRUB знаходяться в каталозі /boot/grub2 та кількох його підкаталогах. GRUB2 не має файлу образу, як етапи 1 і 2. Натомість він складається в основному з модулів ядра, які завантажуються при необхідності з каталогу /boot /grub2/ i386-pc. Функція етапу 2 GRUB2 полягає в тому, щоб знайти та завантажити ядро Linux в оперативну пам'ять та переключити керування комп'ютером на ядро. Ядро та пов'язані з ним файли знаходяться в каталозі /boot. Файли ядра можуть бути ідентифіковані, оскільки всі їхні імена починаються з vmlinuz.Ви можете переглянути вміст каталогу /boot, щоб побачити встановлені у вашій системі ядра. GRUB2, як і GRUB1, підтримує завантаження з одного з ядер Linux. меню встановлених ядер, включаючи варіант безпечного завантаження та, якщо він налаштований, варіант відновлення. Етап 2 GRUB2 завантажує вибране ядро в пам'ять та передає керування комп'ютером ядру системи. Всі ядра зберігаються у форматі архіву, що саморозпаковується, для економії місця. Після того, як вибране ядро завантажиться в пам'ять і почне виконання, воно має спочатку витягти себе з архіву, перш ніж зможе виконати будь-яку корисну роботу. на неї. Це кінець процесу завантаження. До цього моменту ядро Linux і systemd працюють, але не можуть виконувати жодних продуктивних завдань для кінцевого користувача, тому що нічого не працює. Процес запуску слідує за процесом завантаження і наводить комп'ютер Linux у робочий стан, в якому він може використовуватися для продуктивної роботи. systemd є матір'ю всіх процесів, і вона відповідає за те, щоб привести систему Linux у стан, в якому на ній можна працювати.Деякі з функцій, які набагато ширші, ніж у старої програми init, призначені для управління різними аспектами працюючої системи Linux, включаючи створення файлових систем, а також запуск і управління системними службами, необхідними для повсякденної роботи Linux. Будь-яке із завдань systemd, що не належать до послідовності запуску, виходить за рамки цієї статті. По-перше, systemd монтує файлові системи, задані в / etc / fstab, включаючи будь-які файли або розділи підкачування. На цьому етапі вона може отримати доступ до файлів конфігурації , розташованим в / etc, включаючи її власний. Вона використовує свій конфігураційний файл , /etc/systemd/system/default.target для визначення стану (мети), в які він повинен завантажувати систему. Файл default.target є лише символічним посиланням на цільовий файл. Для робочої станції або настільних комп'ютерів це зазвичай буде graphical.target, що еквівалентно рівню запуску 5 у старій системі ініціалізації SystemV. Для сервера за замовчуванням, швидше за все, це буде multi-user.target, який нагадує рівень запуску 3 в SystemV. Emergency.target схожий на однокористувацький режим. Зверніть увагу, що цілі та служби є одиницями systemd. У таблиці 1 нижче наведено порівняння цілей systemd зі старими рівнями запуску SystemV. Аліаси цілей надаються systemd для зворотної сумісності. Аліаси цілей дозволяють сценаріям та багатьом системним адміністраторам, таким як я, використовувати команди SystemV, такі як init 3 для зміни рівнів запуску. Звичайно, команди SystemV для інтерпретації та виконання пересилаються до systemd. Таблиця 1: Порівняння рівнів запуску SystemV із цілями systemd. Кожна мета має набір залежностей, описаних у файлі конфігурації. systemd запускає необхідні залежності. Ці залежності – служби, необхідні для запуску хоста Linux на певному рівні функціональності. Коли всі залежності, перелічені в цільових файлах конфігурації, завантажуються і запускаються, система працює на цьому цільовому рівні. systemd також переглядає застарілі каталоги ініціалізації SystemV, щоб дізнатися, чи є файли запуску. Якщо вони є, systemd використовує їх як конфігураційні файли для запуску служб, описаних у цих файлах. Застаріла мережева служба є гарним прикладом одного з тих випадків, коли Fedora все ще використовуються файли запуску SystemV. Малюнок 1 нижче, скопійований безпосередньо з man-сторінки bootup. Він показує загальну послідовність подій під час запуску systemd і основні вимоги до їхнього порядку для забезпечення успішного запуску. Цілі sysinit.target та basic.target можна розглядати як контрольні точки в процесі запуску. Хоча однією з цілей розробки systemd було забезпечення одночасного запуску системних служб, все ще є певні служби та функціональні цілі, які необхідно запустити, перш ніж можна буде запустити інші служби та цілі. Ці контрольні точки не можуть бути пройдені доти, доки не будуть виконані всі необхідні служби та цілі. Таким чином, sysinit.target досягається, коли завершено всі компоненти, від яких він залежить. Монтування файлових систем, налаштування файлів підкачки, запуск udev, встановлення генератора випадкових чисел, запуск низькорівневих служб та налаштування криптографічних служб, якщо одна або кілька файлових систем зашифровані, повинні бути завершені, але всередині sysinit.target ці завдання можуть виконуватися паралельно. Sysinit.target запускає всі низькорівневі служби та компоненти, необхідні для мінімальної функціональності системи, та які будуть необхідні для переходу на basic.target. Малюнок 1: Карта запуску systemd. Після того, як буде виконано sysinit.target, systemd запустить basic.target, запускаючи всі компоненти, необхідні для виконання. basic.target забезпечує деяку додаткову функціональність, запускаючи компоненти, необхідні для наступної мети. Вони включають налаштування таких аспектів, як шляхи до різних виконуваних каталогів, комунікаційні сокети та таймери. Нарешті, можуть бути ініціалізовані цілі рівня користувача, multi-user.target або graphical.target. Зверніть увагу, що розрахований на багато користувачів режим повинен бути досягнутий до того, як будуть виконані графічні залежності. Підкреслені цілі малюнку 1 є звичайними цілями запуску. Коли досягнуто однієї з цих цілей, запуск завершено. Якщо за замовчуванням є параметр multi-user.target, ви повинні побачити логін у текстовому режимі на консолі. Якщо за замовчуванням є graphical.target, ви повинні побачити графічний екран входу в систему; конкретний екран входу, який ви бачите, буде залежати від диспетчера сеансів, що використовується за замовчуванням. Нещодавно мені довелося змінювати стандартне ядро на комп'ютері під Linux, що використовує GRUB2. Я виявив, що деякі з команд, схоже, не працюють належним чином, або, можливо, я використовував їх неправильно.Я ще не впевнений у причинах, чи потрібно зробити ще кілька тестів. Команда grub2-set-default неправильно настроїла індекс стандартного ядра у файлі /etc/ default/grub, тому потрібне мені альтернативне ядро не завантажилося. Далі я вручну змінив /etc/default/grub GRUB_DEFAULT=saved на GRUB_DEFAULT=2, де 2 – індекс встановленого ядра, яке я хотів завантажити. Потім я запустив команду grub2-mkconfig>/boot/grub2/grub.cfg, щоб створити новий файл конфігурації grub. Цей обхідний метод спрацював так, як я очікував, та завантажив альтернативне ядро. GRUB2 та система systemd є ключовими компонентами на етапах завантаження та запуску більшості сучасних дистрибутивів Linux. Ці два компоненти працюють разом, щоб спочатку завантажити ядро, а потім запустити всі системні служби, необхідні створення повнофункціональної системи Linux. Хоча я знаходжу GRUB2 і systemd більш складними, ніж їхні попередники, вони легко вивчаються і управляються. У man-сторінках є багато інформації про systemd, а freedesktop.org є повний набір man-сторінках systemd , доступних онлайн. Натисніть кнопку живлення на вашому системнику, і через кілька секунд ви побачите вікно входу в систему. Наважуся припустити, що кожного цікавило хоч колись те, що відбувається за завісою заставок та завантажувальних екранів з моменту включення живлення комп'ютера до моменту, коли пропонується увійти в систему. Я пропоную вам познайомитися з наступними рівнями типового завантаження Linux: Завантаження ОС Linux - процес
Завантажуємося
Система ініціалізації ОС
Введення в процес завантаження та запуску Linux
Автор: David Both
Дата публікації: 20 лютого 2017 року
А. Кривошей
Дата перекладу: березень 2018 р.
- Завантажувач (GRUB2);
- ініціалізація ядра;
- запуск systemd, батьківського компонента всіх процесів.Процес завантаження
BIOS POST
GRUB2
Етап 1
Етап 1.5
Етап 2
Ядро
Процес запуску
systemd
Рівень SystemV
Цілі target
Аліаси цілей systemd
Опис
-
halt.target
-
Вимикає систему без вимкнення живлення.
0
poweroff.target
runlevel0.target
Вимикає систему з вимкненням живлення.
S
emergency.target
-
Однокористувацький режим. Служби не працюють; файлові системи не вмонтовані. Це базовий рівень роботи з аварійною оболонкою, запущеною на головній консолі, щоб користувач міг взаємодіяти з системою.
1
rescue.target
runlevel1.target
Базова система, що включає змонтовані файлові системи лише з основними запущеними службами та аварійною оболонкою на головній консолі.
2
-
runlevel2.target
Розрахований на багато користувачів режим без NFS, але з запущеними іншими консольними службами
3
multi-user.target
runlevel3.target
Усі служби працюють, але доступний лише інтерфейс командного рядка.
4
-
runlevel4.target
Не використовується
5
graphical.target
runlevel5.target
Розрахований на багато користувачів режим з графічним інтерфейсом
6
reboot.target
runlevel6.target
Перезавантаження
-
default.target
-
Ця мета завжди є символічним посиланням на multi-user.target або graphical.target. system завжди використовує default.target для запуску системи. default.ніколи не слід посилатися на halt.target, poweroff.target або reboot.target.
local-fs-pre.target | v (різні об'єкти та (різні перемикання (різні cryptsetup fsck services. ) devices. ) devices. ) (різні низькі рівні (різні низькі рівні) | local-fs.target swap.target cryptsetup.target seed, sysctl, ) debugfs, ) | | | | | \__________________|_________________ | ___________________|____________________/ \|/ v sysinit.target | ____________________________________/|\________________________________________ / | | | \ | | | | | v v | v v (various (various | (various rescue.service timers. ) paths. ) | sockets. ) | | | | | v v v | v rescue.target timers.target paths.target | sockets.target | | | | v \_________________ | ___________________/ \|/ v basic.target | ____________________________________/| emergency.service/| | | | | | v v v v emergency.target display- (різна система (різна система manager.service services services) | required for | | graphical UIs) v | | multi-user.target | | | \_________________ | _________________/ \|/ v graphical.target
Проблеми
Висновок
6 кроків завантаження Linux на пальцях
1. BIOS
2. MBR
3. GRUB
красива анімація plymouth заставку, і, почекавши кілька секунд інтерактивного впливу користувача, якщо він натиснув жодної клавіші, він завантажує ядро, встановлене за замовчуванням у файлі конфігурації grub.#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
initrd /boot/initrd-2.6.18-194.el5PAE.img
4. Ядро або Kernel
- Ядро монтує файлову систему відповідно до налаштування «root=» у фалі grub.conf
- Виконує програму /sbin/init
- Оскільки init це перший процес, запущений ядром Linux, тому вона має ідентифікатор процесу (PID) №1. Можете виконати "ps-ef" | grep init» і переконатися у цьому.
- initrd — це Initial RAM Disk, він тимчасовий диск в оперативній пам'яті
- initrd використовується самим ядром як тимчасова коренева файлова система, поки kernel не завантажиться в реальну примонтовану файлову систему. Цей часовий диск також містить необхідні для завантаження драйвери, які дозволяють отримати доступ до розділів дисків та іншого обладнання
5. Init
- Дивиться у файл /etc/inittab для того, щоб визначити рівень виконання (run level).
- Є такі рівні виконання:
- 0 – перервати виконання
- 1 – Однокористувацький режим, так званий «Single user mode», або іншими словами, консоль відновлення
- 2 – Розрахований на багато користувачів режим без підтримки NFS
- 3 – Повноцінний розрахований на багато користувачів режим
- 4 – не використовується
- 5 – X11
- 6 – перезавантаження
6. Рівень виконання програм (Runlevel)
- Коли Лінукс виконує завантаження, ви можете спостерігати завантаження різних служб. Наприклад, це може бути повідомлення типу «starting Postfix … OK» (запускається Postfix). Ці служби — і називаються програмами рівня виконання, які виконуються з директорії, що відповідає потрібному рівню виконання.
- Виходячи з налаштувань за замовчуванням, система буде виконувати файли відповідно до наведених нижче директорій.
- Виконання рівня 0 – /etc/rc.d/rc0.d/
- Виконання рівня 1 – /etc/rc.d/rc1.d/
- Виконання рівня 2 – /etc/rc.d/rc2.d/
- Виконання рівня 3 – /etc/rc.d/rc3.d/
- Виконання рівня 4 – /etc/rc.d/rc4.d/
- Виконання рівня 5 – /etc/rc.d/rc5.d/
- Виконання рівня 6 – /etc/rc.d/rc6.d/
Ось і все. Можливо, деяким з вас це не нове і особливого інтересу не було при читанні статті, оскільки вона орієнтована на початково-середній рівень знайомства з Лінуксом.
У такому разі можу лише сказати, що "повторення - мати вчення" (с).Доповнення, виправлення, уточнення
- artemlight:: "Ну скажемо прямо - так вантажаться далеко не всі дистри". З ним погодилася більшість, відзначаючи і bsd-style init, u-boot, і хоч initrd у статті пропущено, варто зауважити, що він потрібен ядру не у всіх дистрибутивах. Також зазначено, що в slackware підтримка rc.d здійснюється тільки як сумісність, а системи, що вбудовуються, вантажаться інакше. На декстопах іноді буває EFI, а також Linux популярний у світі embedded і там ще купа різних платформ. Лінукс у телефоні взагалі інакше вантажиться.
- soomrack, посилаючи на вікіпедію: Ще хочеться зробити зауваження з приводу MBR, першого сектора та ін. Усі дещо ускладнилося за останні роки. Зараз доречніше говорити про EFI.