B1. Встановлення системи
Сервер після оновлення ядра не піднявся, на консолі emergency mode,
і треба зрозуміти, до якої ланки дійшло завантаження. Ланцюг від прошивки
до multi-user.target описано в модулі 5. У цій роботі ви
зберете його руками: розмітите диск, поставите ядро, initramfs
і завантажувач, напишете юніт. Потім тричі зламаєте завантаження
й полагодите його з аварійної консолі.
Після цієї роботи ви зможете:
- розмітити диск під UEFI і пояснити, за чим прошивка впізнає ESP;
- показати двома завантаженнями, навіщо initramfs у системі, де драйвер диска вбудований у ядро;
- написати
.service, який залежить від мережі й перезапускається після збою, і знайти вjournalctl -u, чому він упав; - прочитати
systemd-analyze critical-chainі сказати, що затримало завантаження; - відрізнити систему, яка завантажилась як слід, від тієї, що пускає по ssh, але має зламані юніти.
Такий ремонт трапляється після невдалого оновлення ядра, перенесення
диска на іншу машину чи зміни розділів: система не піднімається
або піднімається degraded, і причину шукають з аварійної консолі.
Завдання
Section titled “Завдання”Результат роботи: встановлена вручну система у віртуальній машині з UEFI, яка завантажується з GPT через ESP, монтує корінь за UUID і запускає ваш юніт, а також звіт про три сценарії поломки.
Що зробити:
- Розмітити диск GPT: ESP на 512 МіБ з типом
EFI Systemі FAT32, решта під корінь. - Поставити базову систему покроковим способом:
debootstrapдля Debian чи Ubuntu,pacstrapдля Arch. - Записати
fstabза UUID. - Поставити ядро, зібрати initramfs, встановити
systemd-bootабо GRUB у режимі UEFI. Двома завантаженнями, зroot=UUID=і зroot=/dev/…, з’ясувати, для чого тут initramfs. - Одразу після першого завантаження зняти
systemd-analyzeіsystemd-analyze critical-chain. - Написати
.service, який запускає скрипт, залежить від мережі й перезапускається після збою. Один раз дати скрипту змінну середовища, якої в юніта немає, побачити падіння і виправити. - Зламати й полагодити завантаження у трьох сценаріях, зі знімком ВМ
перед кожним: зіпсований UUID кореня у
fstab, видалений initramfs поточного ядра, юніт, який блокуєmulti-user.target.
Чого робити не треба. Графічний інсталятор не підходить: він зробить
розмітку, fstab і завантажувач за вас, і ланцюга ви не побачите.
Secure Boot і шифрування кореня лишаються на «Далі, якщо цікаво»,
а кілька дисків, LVM і RAID належать роботі B5.
Обмеження. Лише UEFI і GPT, без BIOS-режиму і MBR. fstab тільки
за UUID. Перед кожним сценарієм поломки обов’язковий знімок ВМ.
Що записати у звіт:
- вивід
sgdisk -pз GUID типу ESP іfindmnt -o SOURCE,TARGET,UUID /; - результат двох завантажень без initramfs, з
root=UUID=і зroot=/dev/…, і ваше пояснення, чому вони відрізняються; systemd-analyzeіcritical-chainпісля першого завантаження і що в ланцюзі виявилось найдовшим;- як упав юніт без змінної середовища: рядок із
journalctl -uі що ви виправили; - для кожного з трьох сценаріїв: як система себе повела, що показала аварійна консоль, якими командами ви знайшли причину і як полагодили.
Готово, коли:
- кожне з восьми тверджень у таблиці «Що треба вміти підтвердити» ви доводите однією командою на своїй системі;
systemctl is-system-runningпісля всіх трьох ремонтів кажеrunning;- у звіті є п’ять пунктів вище.
Перед початком
Section titled “Перед початком”- Прочитайте в модулі 5 розділи «Ланцюг», «systemd» і «Як це насправді в Linux». Чому контейнер не має власного завантажувача, пояснює модуль 17, розділ «З чого зроблено контейнер».
- Потрібна віртуальна машина з увімкненим UEFI, порожнім диском і можливістю робити знімки. WSL2 не підходить: завантаженням там керує Windows. На хмарній машині потрібна можливість додати диск (огляд).
- Знадобляться
sgdisk(пакетgdisk),mkfs.fat(dosfstools),debootstrapабоpacstrap,lsinitramfsіsystemd-analyze. - В архіві курсу для цієї роботи файлів немає:
ні заготовок, ні
check.sh. Перевіркою є таблиця тверджень і звіт.
-
Розмітка GPT.
Два розділи: ESP на 512 МіБ з типом
EFI Systemі файловою системою FAT32, решта під корінь.Подивіться на таблицю через
sgdisk -pі знайдіть у ній GUID типу розділу: за ним прошивка впізнає ESP, а ім’я чи розмір розділу для неї не важать. -
Базова система.
debootstrapдля Debian чи Ubuntu,pacstrapдля Arch. Підійде будь-який покроковий спосіб, крім графічного інсталятора. -
fstabза UUID.Імена на кшталт
/dev/sda2не підходять: вони залежать від порядку виявлення й міняються, коли ви додасте диск у B5. -
Ядро, initramfs і завантажувач.
Поставте ядро, зберіть initramfs, встановіть
systemd-bootабо GRUB у режимі UEFI.Далі з’ясуйте, навіщо тут initramfs. Спершу подивіться, чи драйвер вашого контролера взагалі є окремим модулем:
Terminal window grep -E '^CONFIG_(SCSI_VIRTIO|VIRTIO_BLK|BLK_DEV_NVME)=' /boot/config-$(uname -r)lsinitramfs /boot/initrd.img | grep -c 'kernel/drivers'Якщо у відповіді
=y, драйвер вбудований у саме ядро, і шукати його серед модулів initramfs марно (модуль 5). -
Перше завантаження.
systemd-analyzeіsystemd-analyze critical-chainодразу після входу, щоб було з чим порівнювати далі. -
Власний юніт.
Напишіть
.service, який запускає простий скрипт, залежить від мережі й перезапускається після збою. Перевіртеsystemctl status,journalctl -u.Обов’язково зробіть так, щоб скрипт покладався на змінну середовища, якої в юніта немає. Подивіться, як він упаде, і виправте: це найчастіша реальна проблема (модуль 5).
-
Зламати й полагодити.
Три сценарії, кожен окремо, зі знімком ВМ перед кожним:
- зіпсувати UUID кореня у
fstab; - видалити initramfs поточного ядра;
- зробити юніт, який блокує
multi-user.target.
Для кожного: як система себе поводить, що показує аварійна консоль, якими командами ви це знайшли, як полагодили.
Не чекайте, що всі три дадуть чорний екран. Тільки один із них узагалі не дасть системі завантажитись, а два інші зроблять гірше: машина підніметься, пустить вас по ssh і виглядатиме справною. Тут треба навчитися бачити різницю між «працює» і «завантажилось як слід», і
systemctl is-system-runningдля цього корисніший за будь-який зовнішній моніторинг. - зіпсувати UUID кореня у
Що треба вміти підтвердити
Section titled “Що треба вміти підтвердити”Робота зарахована, якщо ви можете однією командою довести кожне з тверджень на своїй системі:
| Твердження | Чим доводиться |
|---|---|
| Система завантажилась через UEFI, не BIOS | [ -d /sys/firmware/efi ] && echo UEFI |
| Таблиця розділів — GPT, є ESP | sgdisk -p /dev/… або lsblk -o NAME,PARTTYPENAME |
| Корінь підключений за UUID | findmnt -o SOURCE,TARGET,UUID / |
| Завантажувач знає про ядро | cat /proc/cmdline |
| Ви знаєте, навіщо тут initramfs | два завантаження: з root=UUID= і з root=/dev/… |
| Ваш юніт активний і перезапускається | systemctl status ім'я.service |
| Ви знаєте, що заповільнило завантаження | systemd-analyze critical-chain |
| Після всіх ремонтів система справді ціла | systemctl is-system-running каже running, не degraded |
Часті помилки
Section titled “Часті помилки”ESP відформатовано не у FAT32. Прошивка його просто не побачить.
GRUB встановлено в режимі BIOS на UEFI-машині. Класика жанру: команда виконалася без жодної помилки, а система не завантажилась.
fstab за іменем пристрою. Працюватиме до першого нового диска.
Юніт без After=. Служба стартує раніше за мережу й падає, а в журналі
це виглядає як помилка застосунку.
Ремонт без знімка. Після третьої спроби ви вже не пам’ятаєте, що зламали самі, а що було зламане до вас. Знімок перед кожним сценарієм обов’язковий.
mount -o remount,rw / не рятує зіпсований fstab. Команда сама читає
fstab, щоб дізнатися, який пристрій монтувати в /, і спотикається
об той самий хибний UUID: can't find UUID=…. Назвіть пристрій явно:
mount -o remount,rw /dev/sda2 /, і тоді файл можна буде виправити.
Завантажувач ставили не на тій машині. Якщо ви зібрали систему
на одному комп’ютері, а диск переставили в інший, grub-install міг
записати образ, якому бракує драйвера файлової системи кореня. Прошивка
запустить GRUB, а той не знайде власного конфіга й викине вас
у grub> з error: file '/boot/' not found. Підйом із цього стану
робиться на місці:
grub> insmod ext2grub> search --fs-uuid --set=root <UUID кореня>grub> set prefix=($root)/boot/grubgrub> insmod normalgrub> normalЩоб полагодити назавжди, повторіть grub-install уже із завантаженої
системи, на її власній машині.
Далі, якщо цікаво
Section titled “Далі, якщо цікаво”Увімкнути Secure Boot і підписати власне ядро. Або зашифрувати корінь через LUKS і подивитися, як змінюється роль initramfs.