Co dzieje się na każdym etapie procesu budowania jądra systemu Linux?

27

Przeczytałem wiele samouczków o tym, jak zbudować niestandardowe jądra i uruchomić system Ubuntu przy użyciu tych jąder, i z powodzeniem postępowałem zgodnie z instrukcjami i uruchomiłem niestandardowe jądra, ale nie rozumiem, co robi każde z poleceń w przewodnikach i co się właściwie dzieje każde polecenie.

Procedura opisana na stronie Ubuntu ma dużo pracy z fakeroot, dpkg, make-kpkgniektórzy initramfs i inne straszne rzeczy, że działa, ale po prostu nie pomaga mi zrozumieć, co się dzieje.

  • Jakie są dane wyjściowe makew katalogu jądra systemu Linux?
  • Czy tworzy „skompresowany obraz jądra”?
  • Jak nazywa się plik „skompresowanego obrazu jądra” i gdzie się on znajduje?
  • Co ma make moduleszrobić?
  • Czy make modulesnależy to zrobić przed czy po make?
  • Nie makebuduje moich modułów automatycznie?
  • Jak wygląda proces (po angielsku, nie tylko lista poleceń) dodawania nowo zbudowanych jąder do listy jądra rozruchowego?
  • Co ma make installzrobić?
  • Czy make installdoda to do mojej listy jąder rozruchowych, aby nie musiałem nic więcej robić?
  • Czy istnieje odpowiednik make modules_install?
AnkurVj
źródło
To powinno być podzielone na wiele pytań.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

34

Z góry...

  • makekompiluje i łączy obraz jądra. To jest pojedynczy plik o nazwie vmlinuz.
  • make moduleskompiluje pojedyncze pliki dla każdego pytania, na które odpowiedziałeś Mpodczas konfiguracji jądra. Kod obiektowy jest powiązany ze świeżo zbudowanym jądrem. (W przypadku pytań, na które odpowiedziano Y, są one już częścią vmlinuz, a w przypadku pytań, Nktóre zostały pominięte).
  • make installinstaluje wbudowane jądro do /vmlinuz.
  • make modules_installinstaluje moduły jądra w /lib/moduleslub /lib/modules/<version>.

Jeśli chodzi o dodanie go do listy dostępnych jąder, zajmuje się tym moduł ładujący. Jest różny dla każdego programu ładującego, ale grubnajczęściej występuje na x86 i amd64, więc opiszę to. To jest właściwie dość proste. Grub wygląda w /, /booti /lib/modulesdla każdej rzeczy, która wygląda jak to może być jądro pracę i dodaje go. I tak, to jest uproszczony opis.

Te dodatkowe „okropne rzeczy” w dokumentacji Ubuntu to dodatkowe rzeczy do stworzenia debpakietu. Kiedy robisz to więcej niż dla siebie, znacznie lepiej jest go spakować. Zmienisz się w czasie.

Budowanie jądra i modułów jest oddzielone, ponieważ ludzie, którzy tego potrzebują (tj. Programiści jądra), często wprowadzają zmiany tylko w module. Mogą zastosować swoje zmiany, przebudować i zainstalować tylko moduły. Oszczędza to dużo czasu, gdy trzeba to robić 20 razy dziennie. Nigdy nie będzie aktualizowany o jedno make everythingpolecenie. Zamiast tego działaj make && make modules && make install && make modules_install tak, jak mówi dokumentacja . Proces kompilacji faworyzuje programistów jądra, a nie ciebie. I tak powinno być.

W rzeczywistości nie ma prawie żadnego powodu, aby ktokolwiek poza programistami jądra lub pakietami dystrybucyjnymi skompilował jądro. W prawie każdych okolicznościach funkcja jądra, którą chcesz, została już dla Ciebie zbudowana i jest dostępna w jednym z wstępnie zapakowanych jąder. Są wyjątki, ale w dzisiejszych czasach są niezwykle rzadkie.

Nie dlatego, że zniechęcam cię do budowania własnego jądra, tak naprawdę zachęcam do zrobienia tego. Myślę, że budowanie jądra od zera jest nieocenioną praktyką do nauki o tym, jak to wszystko tam działa. Po części dlatego, że być może pewnego dnia będzie stanowić wyjątek, który musi. Ale uczy też wiele o jądrze i procesie rozruchu w ogóle. Będziesz lepszą osobą, która to zrobiła.

bahamat
źródło
1
Dziękuję bardzo za czytelny dla człowieka opis procesu. Mam kilka wątpliwości. Moja kompilacja jądra wyprodukowała vmlinux, a nie vmlinuz. Myślę, że różnica polega na kompresji. Czy powinienem ręcznie skompresować obraz? Czy /vmlinuzkatalog znajduje się w folderze głównym? kiedy wykonam make install, czy ten katalog zostanie utworzony i tam zostanie umieszczone nowe jądro? Czy make modules_installzastąpię obecnie zainstalowane moduły? Załóżmy, że umieszczam mój vmlinux w katalogu / boot, czy muszę zrobić coś innego (np. Edytować pliki konfiguracyjne gruba i zrobić aktualizację gruba czy coś po tym?)
AnkurVj
3
Masz rację, różnica polega na kompresji. To polecenie make bzimageto robi. /vmlinuzjest plikiem binarnym, a nie katalogiem. Tworzę tylko spakowane jądra od około 5 lat, więc nie pamiętam dokładnie zachowania modules_installbezpośrednio zainstalowanego jądra. Grub znajdzie twoje jądro /bootbez pomocy. Tak, zawsze powinieneś uruchomić grub-updatepo zainstalowaniu nowego jądra.
bahamat
więc powinienem to zrobić make bzimagezamiast make? Czy muszę zrobić make cleani make bzimageznowu? Przez /vmlinuzto znaczy plik zostanie utworzony w katalogu głównym lub w folderze źródłowym jądra Linux?
AnkurVj
1
To naprawdę nie ma znaczenia, czy twoje jądro jest skompresowane czy nie. Bez kompresji zajmuje tylko trochę więcej miejsca na dysku. Wszystko z prefiksem /to ścieżka bezwzględna, więc tak, to plik w katalogu głównym.
bahamat
1
@GuyAvraham Moduły, na Yktóre odpowiedziano, są wkompilowane (tj. Są częścią vmlinuz). Moduły, na Mktóre odpowiedziano, są kompilowane jako moduły ładowalne. Moduły, na Nktóre odpowiedziano, nie są kompilowane. make modules_installdotyczy tylko tych, którzy odpowiedzieli M.
bahamat