Tarkibga o'tish

Boot jarayoni va GRUB

Quvvat tugmasini bosgandan login so'rovi chiqquncha Linux mashinasi bir nechta alohida, ketma-ket bosqichlardan o'tadi. Har bir bosqich keyingisini yuklaydi va boshqaruvni unga topshiradi. Bu ketma-ketlikni bilish ayniqsa biror narsa buzilganda muhim: qayta yuklashdan keyin ko'tarilmagan server qaysi bosqichda to'xtab qolganiga qarab butunlay boshqa-boshqa belgilar beradi va bu belgilarni to'g'ri o'qish ketma-ketlikning o'zini tushunishdan boshlanadi.

Bu maqola init va systemd boshqaruvni olishidan oldin sodir bo'ladigan hamma narsani ko'rib chiqadi. Kernel ishga tushgandan keyin nima bo'lishi Kernel modullari maqolasida davom etadi, bu bilim imkon beradigan tiklash vaziyatlari esa Rescue va emergency mode maqolasida ko'rib chiqiladi.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • mashina BIOS/UEFI dan systemd gacha o'tadigan beshta bosqichni tartib bilan nomlash;
  • GRUB nima qilishini va uning konfiguratsiya fayllari qayerda turishini tushuntirish;
  • kernel parametrini bitta boot uchun vaqtincha o'zgartirish;
  • kernel parametrini /etc/default/grub orqali doimiy qo'shish;
  • faqat belgilariga qarab boot xatosi taxminan qaysi bosqichda yuz berayotganini aniqlash.

Beshta bosqich

1. BIOS/UEFI  →  2. Bootloader (GRUB)  →  3. Kernel  →  4. initramfs  →  5. systemd (PID 1)
  1. BIOS/UEFI — quvvat berilishi bilan ishga tushadigan firmware. U asosiy uskunalarni tekshirish uchun Power-On Self-Test (POST) ni bajaradi, so'ng sozlangan boot qurilmalari ro'yxatini (disk, USB, tarmoq) tartib bilan ko'rib chiqadi va boot qilish mumkin bo'lgan birinchi qurilmadan bootloader’ni yuklaydi.
  2. Bootloader (GRUB) — diskdan kernel image’ini topib, uni xotiraga yuklaydi. U foydalanuvchiga boot menyusini ham beradi va kernel parametrlarini bitta boot uchun tahrirlash imkonini yaratadi.
  3. Kernel — Linux kernelining o'zi xotiraga yuklanadi, to'g'ridan-to'g'ri muloqot qila oladigan uskunalarni ishga tayyorlaydi va birinchi user-space jarayonini — initramfs ichida ishlaydigan init ni ishga tushiradi.
  4. initramfs (initial RAM filesystem) — haqiqiy root fayl tizimini mount qilish uchun yetarli drayver va vositalarnigina o'z ichiga olgan kichik, vaqtinchalik fayl tizimi. Masalan, root volume LVM yoki dasturiy RAID ustida joylashgan bo'lsa va uni topishning o'zi uchun avval muayyan drayverni yuklash kerak bo'lsa, aynan initramfs kerak bo'ladi.
  5. systemd (PID 1) — haqiqiy root fayl tizimi mount qilingach, kernel boshqaruvni PID 1 sifatida systemd ga topshiradi. Shundan keyin tizim init va systemd maqolasida ko'riladigan target va unit mexanizmi orqali yuklanadi.

Info

UEFI tizimlarida GRUB o'rniga ba’zan systemd-boot kabi soddaroq bootloader ishlatiladi. Ubuntu Server sukut bo'yicha GRUB dan foydalanadi, shuning uchun bu maqola aynan GRUB ga qaratilgan.

GRUB aslida nima qiladi

GRUB (GRand Unified Bootloader) ikkita vazifani bajaradi:

  • foydalanuvchi qaysi kernel yoki operatsion tizimni yuklashni tanlashi uchun boot menyusini ko'rsatadi;
  • tanlangan kernelni to'g'ri parametrlar bilan xotiraga yuklaydi va boshqaruvni unga topshiradi.

GRUB konfiguratsiyasi har biri alohida vazifaga ega uchta faylga bo'lingan:

Fayl Vazifasi
/etc/default/grub Administrator haqiqatan tahrirlaydigan fayl: sukut bo'yicha kernel, menyu kutish vaqti, kernel buyruq qatori parametrlari
/etc/grub.d/ Boot menyusining alohida yozuvlarini yaratadigan skriptlar
/boot/grub/grub.cfg Yuqoridagi ikkitasidan avtomatik yaratiladigan yakuniy konfiguratsiya

Danger

/boot/grub/grub.cfg ni hech qachon qo'lda tahrirlamang — update-grub navbatdagi safar ishga tushganda u qayta yoziladi va har qanday qo'lda kiritilgan o'zgarish sezdirmasdan yo'qoladi. Doimiy o'zgarish har doim avval /etc/default/grub ga kiritiladi, so'ng update-grub bilan grub.cfg ga qayta yaratiladi.

Kernel parametrini bitta boot uchun o'zgartirish

Bu usul faqat joriy boot’ga ta’sir qiladi — keyingi qayta yuklashda yo'qoladi, shuning uchun tajriba qilishning xavfsiz yo'li hisoblanadi.

  1. Server qayta yuklanayotganda GRUB menyusi chiqqanda uni Shift ni bosib turib (BIOS tizimlari) yoki Esc ni bosib (UEFI tizimlari) to'xtating.
  2. Kerakli yozuvni tanlang va e ni bosing — GRUB o'sha yozuvning boot buyruqlarini tahrirlanadigan ko'rinishda ochadi.
  3. linux bilan boshlanadigan qatorni topib, oxiriga kerakli parametrni qo'shing, masalan:
linux   /boot/vmlinuz-... root=UUID=... ro quiet splash single
  1. Shu o'zgartirilgan qator bilan boot qilish uchun Ctrl+X yoki F10 ni bosing.

single yoki systemd.unit=rescue.target kabi parametrni vaqtincha qo'shishning standart usuli shu. Aynan shu texnika Rescue va emergency mode maqolasidagi tiklash vaziyatlarida ishlatiladi.

Kernel parametrini doimiy qo'shish

Har bir boot’da qo'llanishi kerak bo'lgan parametr /etc/default/grub faylidagi GRUB_CMDLINE_LINUX_DEFAULT qatoriga yoziladi:

sudo nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

Masalan, boot paytida kernel log'ining to'liq chiqishini ko'rish uchun quiet ni olib tashlang:

GRUB_CMDLINE_LINUX_DEFAULT="splash"

Fayl saqlangach, konfiguratsiyani qayta yaratish kerak:

sudo update-grub

Ubuntu va Debian’da bu buyruq grub-mkconfig -o /boot/grub/grub.cfg uchun qobiq (wrapper). U xatosiz yakunlangach, o'zgarish keyingi qayta yuklashdan boshlab kuchga kiradi.

Warning

update-grub ni ishga tushirgandan keyin — haqiqatan qayta yuklashdan oldin — hosil bo'lgan /boot/grub/grub.cfg siz kutgan parametrni o'z ichiga olganini tekshiring:

grep -m1 'linux ' /boot/grub/grub.cfg

Noto'g'ri yozilgan kernel parametri (masalan, endi haqiqiy qurilmaga ishora qilmaydigan root= qiymati) tizimni umuman boot qila olmaydigan holatda qoldirishi mumkin. Production serverda bunday o'zgarishni faqat konsolga jismoniy yoki KVM/iLO orqali kirish imkoningiz bo'lganda qiling.

GRUB_CMDLINE_LINUX va GRUB_CMDLINE_LINUX_DEFAULT

/etc/default/grub da aslida ikkita buyruq qatori o'zgaruvchisi bor va ularni adashtirish klassik intervyu tuzog'i:

  • GRUB_CMDLINE_LINUX_DEFAULT — faqat oddiy boot yozuvlariga qo'shiladi. quiet splash kabi ko'rinishga oid yoki odatiy parametrlar shu yerga yoziladi.
  • GRUB_CMDLINE_LINUX — har bir yozuvga, jumladan recovery yozuvlariga ham qo'shiladi. Hatto recovery rejimida ham qo'llanishi shart bo'lgan parametr (masalan, console=ttyS0,115200 kabi serial-konsol sozlamasi) shu yerga yoziladi.

Yaratilgan linux qatorida allaqachon turgan ro shunchaki bezak emas: kernel avval root fayl tizimini faqat o'qish uchun (read-only) mount qiladi, shunda fayl tizimi tekshiruvi tinch diskda xavfsiz ishlay oladi, keyinroq esa systemd uni o'qish-yozish rejimida qayta mount qiladi. Aynan shu sababli Rescue va emergency mode maqolasidagi tiklash ishlari aniq mount -o remount,rw / buyrug'idan boshlanadi.

Intervyuda

UEFI mashinasida GRUB diskning boot sektorida turmaydi — u EFI System Partition da, /boot/efi ga mount qilingan bo'limdagi .efi binary fayl (grubx64.efi). Agar GRUB ning o'zi (faqat konfiguratsiyasi emas) shikastlangan bo'lsa, grub.cfg ni update-grub bilan qayta yaratish yetarli emas: bootloader’ni sudo grub-install /dev/sda (BIOS) yoki sudo grub-install (UEFI, /boot/efi ga yozadi) bilan qayta o'rnatish va keyin update-grub ni ishga tushirish kerak. Secure Boot tizimlarida zanjir GRUB dan oldin shim orqali ham o'tadi — nega imzolanmagan maxsus kernel boot qilmasligi so'ralsa, buni tilga olish foydali.

Boot xatosi qayerda yuz berganini aniqlash

Belgi Ehtimoliy bosqich
Ekranda umuman hech narsa yo'q, hatto quvvat indikatorlari ham BIOS/UEFI yoki uskuna
GRUB menyusi chiqadi, lekin yozuv tanlangandan keyin tizim qotib qoladi Kernel yoki initramfs
"Gave up waiting for root device" xabari initramfs haqiqiy root fayl tizimini topa olmayapti
Kernel xabarlari o'tib ketadi, so'ng systemd xatolar haqida xabar beradi va to'xtaydi systemd target yoki unit muammosi — systemd troubleshooting ga qarang

Intervyuda

Intervyuda ko'p beriladigan savol: "server boot bo'lmayapti — qayerdan qidirishni boshlaysiz?" Javob aynan shu jadval: oxirgi ko'ringan belgini bosqichga moslang, chunki har bir bosqich tuzilishi jihatidan turli sabablarga ko'ra ishdan chiqadi (firmware/uskuna, yetishmayotgan kernel image, initramfs’da yo'q drayver yoki noto'g'ri sozlangan systemd unit) va har biri boshqa yechim talab qiladi. Mashina hatto GRUB gacha yetib bormagan bo'lsa, to'g'ridan-to'g'ri journalctl ga o'tish hali ishga tushmagan vosita bilan vaqt yo'qotish demakdir.

Mashqlar

  1. O'chirib tashlasa bo'ladigan sinov VM’ida GRUB menyusini Shift/Esc bilan to'xtating va mavjud yozuvlar ro'yxatini ko'ring.
  2. e ni bosib kernel qatoriga vaqtincha systemd.log_level=debug qo'shing, shu bilan boot qiling, so'ng qo'shimcha tafsilotlarni journalctl -b bilan ko'rib chiqing.
  3. /etc/default/grub dagi GRUB_TIMEOUT qiymatini o'zgartiring, update-grub ni ishga tushiring va o'zgarish grub.cfg da qanday aks etganini tekshiring.
  4. Beshta boot bosqichini (BIOS/UEFI, GRUB, kernel, initramfs, systemd) yoddan, tartib bilan, o'z so'zlaringiz bilan tasvirlab bering.

Mashqni bajardim deyish uchun: yuqoridagi jadvalga qaramasdan, berilgan boot belgisi beshta bosqichning qaysi biriga tegishli bo'lishi ehtimoli yuqori ekanini ayta olishingiz kerak.

Xulosa

Har bir boot BIOS/UEFI dan boshlanadi, GRUB orqali kernelga, undan initramfs orqali haqiqiy root fayl tizimiga va nihoyat systemd ga o'tadi. GRUB ning haqiqiy sozlamalari /etc/default/grub da turadi; yaratilgan natija esa /boot/grub/grub.cfg da bo'ladi va u hech qachon qo'lda tahrirlanmaydi. Kernel parametrini boot paytida vaqtincha (GRUB menyusida e ni bosib) yoki doimiy ravishda (/etc/default/grub va update-grub) qo'shish mumkin. Keyingi maqola — Kernel modullari kernel ishga tushgan joydan davom etadi va uning drayverlarini qanday boshqarishni ko'rsatadi.

Manbalar