Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 2
  • 29
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedzi (2)

  • 0

Na jakim poziomie szczegółowości Cię to interesuje?

Generalnie, to na początku startuje bios. Albo UEFI albo coś w tym stylu co "inicjuje" sprzęt, udostępnia określony zestaw operacji (przerwań w przypadku x86) i na koniec ładuje "coś" z dysku twardego, cdromu, sieci itepe.

W przypadku Linuksa tym czym jest bootloader - dla x86 zazwyczaj grub albo lilo, czasami spotyka się jeszcze syslinuxa lub którąś z jego form (isolinux dla płyt cd, pxelinux dla bootowania z sieci). Dla innych architektur istnieją odpowiedniki - dla sparc jest to np silo.

Bootloader następnie w "jakiś" sposób ładuje do pamięci initrd (jeżeli jest używane i obsługiwane przez bootloader) i jądro. Jakiś sposób - jest zależny od rodzaju bootloadera - czasami ma on po prostu zapisany adres plików (jak np lilo, syslinux...), czasami zaś "umie" obsłużyć system plików, więc wczytuje z poziomu systemu plików pliki initrd i jądra. initrd i jądro są rozpakowywane w pamięci i sterowanie jest przekazywane do jądra. 

Jądro wykonuje skrypt/program z initrd, który zazwyczaj inicjalizuje sprzęt, "składa" raidy, lvmy, ładuje do pamięci potrzebne moduły itepe i na koniec zazwyczaj montuje właściwy rootfs, przez pivot_root ustawia go jako /root i uruchamia init. Init - przeprowadza dalszy proces bootowania się systemu - zależny już od dystrybucji, skryptów startowych itepe. Inaczej będzie tutaj w przypadku skryptów w stylu sys v, inaczej przy skryptach w stylu bsd, inaczej przy systemd.

Na temat każdego z etapów można dużo opowiedzieć. :)

Jak masz jakieś bardziej szczegółowe pytania, to pytaj.

Andrzej_Dopierała
  • Odpowiedział
  • @ Andrzej_Dopierała | 04.04.2017
    • lider
    • laureat
    • ekspert
    • 83
    • 65
    • 169
Komentarze
interesuje mnie co się dzieje po załadowaniu gruba, jakie pliki/skrypty/configi są uruchamiane.
Gdzie w dowolnej dystro mogę to sprawdzić?
Skomentował : @ Grzegorz_Chojnowski_ ,05.04.2017
  • 40
  • 10
  • 57
  • 0

Zacznijmy od tego że grub uruchamia się dwuetapowo. W pierwszym etapie bios albo coś takiego ładuje jego "stage1". W drugim etapie - stage1 gruba ładuje moduły do obsługi systemu plików/raid/lvm itepe (stage2) - i od tego momentu grub jest w stanie załadować plik konfiguracyjny, jądro i initrd.

Po wybraniu przez użytkownika odpowiedniej opcji - zazwyczaj do pamięci ładowany jest initrd i jądro. initrd jest albo bezpośrednio systemem plików (squashfs np.), który zostaje załadowany do ramdysku, albo też spakowanym archiwum systemu plików, który zostaje załadowany do ramdysku (initramfs).

Dla Ubuntu initrd jest w formie spakowanego przez gzip archiwum w postaci cpio:

undefine@uml:~$ file /boot/initrd.img-4.4.0-71-generic 
/boot/initrd.img-4.4.0-71-generic: gzip compressed data, last modified: Sun Apr  2 22:19:18 2017, from Unix
undefine@uml:~$ gzip -d < /boot/initrd.img-4.4.0-71-generic  |file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)

Zobaczmy co w nim jest:

undefine@uml:~/altkom$ gzip -d < /boot/initrd.img-4.4.0-71-generic  |cpio -i
216729 bloków
undefine@uml:~/altkom$ ls
bin  conf  etc  init  lib  lib64  run  sbin  scripts  usr  var

Grub po załadowaniu initrd i jądra do pamięci - uruchamia z niego skrypt /init.

Co robi skrypt init - jest to już zależne od dystrybucji. W przypadku Ubuntu jest to zwykły skrypt, który po kolei ładuje potrzebne moduły, potem np. odszyfrowuje urządzenia blokowe (./scripts/local-block/cryptroot), składa raid (./scripts/local-block/mdadm), podnosi lvma (./scripts/local-block/lvm2). Ogólnie - wykonuje wszelkie operacje niezbędne, by w systemie pojawił się zamontowany przyszły /root (może go np. montować przez sieć z nfs-a, może go składać z lvma będącego na raidzie na szyfrowanych urządzeniach blokowych itepe). Na samym końcu, gdy już przyszły root (/) jest dostępny, skrypt init wykonuje przemontowanie /sys i /proc z swojego systemu plików do przyszłego roota i zmienia roota:

# Move virtual filesystems over to the real filesystem
mount -n -o move /sys ${rootmnt}/sys
mount -n -o move /proc ${rootmnt}/proc

# Chain to real filesystem
exec run-init ${drop_caps} ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1

W tym momencie powinien się już wykonywać init z właściwego systemu plików, domyślnie jeżeli nie podano inaczej  /sbin/init, który w Ubuntu jest linkiem do systemd:

undefine@uml:~$ file /sbin/init
/sbin/init: symbolic link to /lib/systemd/systemd

W tym momencie uruchamia się systemd i zabawa się toczy dalej. :) Ale systemd to już kolejna historia. ;)

Andrzej_Dopierała
  • Odpowiedział
  • @ Andrzej_Dopierała | 05.04.2017
    • lider
    • laureat
    • ekspert
    • 83
    • 65
    • 169