Kiedy będziesz musiał skompilować własne jądro

Kiedy będziesz musiał skompilować własne jądro

Postanowiłeś więc wypróbować to, o czym słyszałeś, o czym mówiono inni, o nazwie „Kompilowanie niestandardowego jądra”. Jeśli próbujesz tego jako hobby lub dlatego, że chcesz nauczyć się nowej umiejętności, bardzo dobrze - czytaj dalej.

Jednak zanim zaczniemy, postaramy się wyjaśnić sytuacje, kiedy ta potrzeba pojawi się i jak sobie z tym poradzić. Zauważ, że jest to obszerny temat, który potrzebuje znacznie więcej pod względem przestrzeni niż tutaj dostarczymy. Nauczysz się podstaw, czego potrzebujesz, co robić i co osiągniesz.

Aby uzyskać więcej informacji, jak zwykle Google jest twoim przyjacielem; Również dokumentacja mieszkająca w drzewie źródłowym jądra odpowie na wiele pytań. Zacznijmy więc od początku, od ostatniej uwagi: w razie potrzeby opublikujemy więcej artykułów związanych z kompilowaniem jądra dotyczącym innych dystrybucji.

Kiedy będziesz musiał skompilować własne jądro

Pierwsza sytuacja byłaby wtedy, gdy potrzebujesz nowszego jądra, niż zapewnia dystrybucja, zwłaszcza gdy prowadzisz stabilny dystrybucję (e.G. Debian Stable, Centos), ponieważ twoje jądro nie obsługuje jakiejś funkcji/sterownika, ani po prostu dlatego, że czujesz, że chcesz wypróbować najnowsze i najlepsze.

Ostrzeżenie: Jeśli chcesz uruchomić jądro krwawienia, upewnij się, że będzie ono kompatybilne z innymi kluczowymi elementami twojego systemu (takimi jak Glibc), pamiętaj, że nowsze oznacza mniej testowania i (prawdopodobnie) większą niestabilność; Keeperzy z jądrem dystrybucji zwykle wykonują dobrą robotę, cofając nowe funkcje starszym, bardziej stabilnym jądrowym, więc upewnij się, że naprawdę potrzebujesz krwawienia. Naszą radą nie jest korzystanie z tych jądrów (długoterminowe jądra stanowiłyby tutaj wyjątek) w systemach produkcyjnych. Jak powiedziano, zaufaj opiekunom dystrybucji.

Druga sytuacja polega na tym, że czujesz, że prowadzisz rozdęte jądro, z wieloma komponentami niepotrzebnymi. Podczas gdy jądro ładuje tylko moduły pasujące do istniejącego sprzętu, mniejszy ślad pamięci jądra zwykle pomaga prędkości i czasu rozruchu.

# lspci -vv # lsusb # hwinfo # cat /proc /cpuinfo 

Powyższe polecenia pomagają lepiej poznać swój sprzęt. Zapisz to, co znalazłeś i upewnij się, że uruchamiasz polecenia LS* powyżej jako root, aby uzyskać dodatkowe informacje.

Inną sytuacją byłoby pomożesz w testowaniu jądra, uruchamiając najnowsze w systemie. Obowiązują te same ostrzeżenia, co powyżej: Zrób to w systemach testowych, pozostań w kontakcie z uptream na wypadek, gdybyś znalazł błąd (LKML.Org to główna lista mailingowa jądra - duży ruch) i staraj się być jak najbardziej pomocny.Nie można tego wystarczająco zestresować: przeczytaj dokumentację, ponieważ znajdujesz się w paskudnej sytuacji, chcesz zgłosić błąd lub po prostu mieć pytania.

Następnie możesz być fajnym dzieckiem na bloku i uruchomić najnowsze i najlepsze, być może spoglądające na źródło (pod warunkiem, że jesteś w tym i masz trochę wiedzy C i ASM), a nawet przesyłać łatki. Możesz najpierw sprawdzić, jeśli dystrybucja nie oferuje jeszcze nowszego pakietu jądra, na przykład możesz zainstalować jądra z Debian Experimental w systemie testowym, jeśli zmieniasz swoje źródła.odpowiednio list. Ponownie pracuj z opiekunami, jeśli wpadniesz na błąd.

Terminologia

Zanim zagłębimy się w ten nieco tajemny temat, powinniśmy wyjaśnić podstawowe terminy (er); Jest to niezbędne do zrozumienia kluczowych części testowania i kompilacji jądra.

  • jądro - Rdzeń systemu operacyjnego, odpowiedzialny za zarządzanie zasobami sprzętowymi (we/wy, sieci, procesor, pamięć…). Zasadniczo jest to istotna część systemu operacyjnego odpowiedzialnego za całą brudną robotę. Programy użytkowników komunikują się z jądrem, żądając czasu procesora lub innych zasobów przez biblioteki systemowe, które działają jako pośredniki między użytkownikiem (patrz poniżej) a jądrem / sprzętem. Jądra mogą być monolityczne i mikrokernelami (więcej informacji, jeśli jesteś zainteresowany, zobacz podejścia projektowe w całym jądrze na Wikipedii.org . MicroKernels (jak minix) używają schematu projektowania, który dzieli rdzeń od reszty jądra, a reszta jest podzielona na komponenty, każdy robi coś konkretnego: we/wy, sieci itp. Monolityczne jądra (Linux, BSD, Solaris), jak sama nazwa, obejmują większość jądra w jednej jednostce, mając dodatkową funkcjonalność (e.G. sterowniki) dostarczone przez moduły. Istnieją również jądra hybrydowe, połączenie między nimi, dobrym przykładem jest jądro Windows.
  • użytkownik - Wszystko w systemie operacyjnym, które nie jest częścią jądra (biblioteki, aplikacje), jest częścią użytkownika. Nazwa jest taka oczywista.
  • moduł - Jak pokazano wcześniej, moduł jądra jest oprogramowaniem binarnym, które w zasadzie „uczy” jądra, jak „rozmawiać” ze sprzętem lub zapewniać pewną funkcjonalność (e.G. NFS)
  • kompilator - Kompilator to aplikacja, która zasadniczo przyjmuje kod pisemny, jak pobrano przez ciebie z jądra.org i przekształca go w binarie. Kompilator znaleziony w rozkładach Linux nazywa się „GCC”, który oznacza kolekcję kompilatora GNU, która wymaga również komponentów niezbędnych do budowania oprogramowania: narzędzia znalezione w Binutils, takich jak asembler (AS) lub archiwatka biblioteki (AR) .W Systemach Debian lub Ubuntu można znaleźć, do którego pakietu należy plik, instalując i uruchamiając apt. Mówiąc o tym, zobaczmy, jakie pakiety musimy zainstalować do udanej kompilacji jądra.
  • jądro waniliowe - To jest nazwa używana do jądra upstream, jak znaleziono na jądrze.org, więc bez plastrów specyficznych dla dystrybucji.

Należy pamiętać, że za każdym razem, gdy zobaczysz polecenie w tym dokumencie, zaczynając od podpowiedzi „$” Oznacza to, że polecenie będzie musiało być uruchomione jako normalny, codzienny użytkownik; Ilekroć widzisz „#” Poniższy, oznacza to, że polecenie ma być uruchamiane jako root (używamy sudo, ale to nie jest obowiązkowe). Obecny katalog, o ile nie określono inaczej, jest tym, który trzyma drzewo źródłowe, w tym przypadku Linux-2.6.

Co potrzebujesz do zainstalowania

  • GCC - oczywiście kompilator jest niezbędny
  • Binutils - Ten pakiet zawiera linker, asembler i inne narzędzia niezbędne do kompilowania programów napisanych w C.
  • GCC -DOC - strony instrukcyjne i informacyjne dla GCC. Przydatne, jeśli chcesz się zabrudzić i zmodyfikować flagi kompilacji. W każdym razie, jeśli chcesz napisać lub skompilować pakiety C.
  • GDB - debugger GNU. Nie obowiązkowe, ale przydatne, jeśli coś pójdzie nie tak. GDB-DOC również pomoże.
  • Libreadline5-dev-do korzystania z interfejsu opartego na konfiguracji jądra. Możesz użyć innych interfejsów (patrz poniżej).
  • make - zostanie zainstalowane jako zależność, ale niewiele słów jest w porządku. Zapoznaj się z instrukcją lub książkami, ponieważ nie jest to przedmiot, który należy wyjaśnić lekko w tak krótkiej przestrzeni. Make to narzędzie używane podczas kompilacji programów C/C ++, a to, co robi, wygląda na makefile, zawierające zasady dotyczące tego, jak i w jakiej kolejności powinna się nastąpić, i próbuje wykonać te dyrektywy. Przeczytaj makefile w drzewie źródłowym, aby rzucić okiem.
  • Git-Git to VCS (system kontroli wersji), robienie tego, co robi CVS lub Subversion, a mianowicie na bieżąco z najnowszym drzewem jądra.

Uzyskanie źródła jądra

Jeśli chcesz zainstalować źródło z dystrybucji, użyj

# apt-get instaluj Linux-Source-

gdzie można zebrać z wydawania:

Uname -r 

Użyj tego, jeśli chcesz zmodyfikować istniejące jądro (dodanie sterowników, przycinanie itp. ). W przeciwnym razie chcesz jądro waniliowe. Możesz go uzyskać z www.jądro.org (sugerujemy wget lub curl tutaj jako menedżerowie pobierania) lub, jeśli chcesz najnowsze, użyjesz git. Zalecamy przechowywanie źródła w katalogu domowym użytkownika, a poleceniem, aby uzyskać najnowsze drzewo główne, jest (patrz Man Git):

$ git Clone git: // git.jądro.org/pub/scm/linux/jądro/git/torvalds/linux-2.6.Git Linux-2.6 

W przeszłości znaleźliśmy mini-howto na http: // linux.Yyz.USA/Git-Howto.HTML, aby być użytecznym; Sprawdź także jądra.org . Powyższe polecenie utworzy folder w bieżącym katalogu o nazwie Linux-2.6, które można później zaktualizować, przechodząc do niego i wydając proste

sprawić się; git ciągnie 

Teraz, po uzyskaniu źródła, będziemy musieli skonfigurować jądro .

Konfiguracja i budynek

Jeśli masz istniejący .Plik konfiguracyjny (plik, który zawiera opcje budowania jądra - co się dzieje, a co nie), skopiuj go w Linux -2.6 (od /boot /config- lub /proc /config.GZ - aktualna konfiguracja). Jeśli nie chcesz modyfikować istniejącego .konfiguracja, wystarczy wydać

$ Make Oldconfig 

W przeciwnym razie przeczytaj. Jeśli chcesz zmodyfikować istniejącą konfigurację, problem

$ Make Menuconfig 

(Zalecenie: Możesz użyć konfiguracji dla wielu pytań dotyczących opcji w jądrze lub tworzyć xconfig, który wymaga bibliotek QT, dla ładniejszych, graficznych menu) i wybrać „załaduj alternatywny plik konfiguracyjny” i naciśnij Enter Enter dla Enter .Config, domyślna nazwa pliku konfiguracyjnego lub wpisz alternatywną nazwę pliku już zapisaną w Linux-2.6.

Następnie zacznij przeglądać menu, aby dokonać niezbędnych zmian w zasadzie tutaj „jeśli nie wiesz, co robi, nie zadzieraj z tym”, przynajmniej dopóki nie dostaniesz doświadczenia. Na koniec, z górnego menu, wybierz „Zapisz alternatywny plik konfiguracyjny”, naciśnij ENTER, aby uzyskać nazwę domyślną (.Config - zalecane), a następnie „wyjście” od dołu. Jeśli chcesz zacząć od zera, zapomnij o kroku „załaduj alternatywny plik konfiguracyjny” i kontynuuj. Na następnym skompilowaniu jądra, po wyczyszczeniu i zaktualizowaniu drzewa, użyj „Make Oldconfig” jak wyżej, aby użyć starej konfiguracji. Ok, teraz mamy konfigurację dostosowaną do naszych potrzeb, które po prostu czekają na budowę. Budowanie jądra jest tak proste, jak jego konfiguracja (!). Po prostu wpisz Make, a wyjście powinno wyglądać poniżej:

$ Make HostCC/Basic/FixDep HostCC Scenariusz/KCONFIG/CONF.o Wysłane skrypty/kconfig/zconf.patka.C wysłane skrypty/kconfig/zconf.Lex.C wysłane skrypty/kconfig/zconf.haszysz.C Skrypty hostccc/kconfig/zconf.patka.o Scenariusze hostld/kconfig/con con cHK include/linux/wersja.h.H CHK obejmują/generowane/Utsrelease.h.H CC jądro/granice.g gen obejmują/generowane/granice.H CC Arch/x86/jądro/ASM-OFFISET.S… 

A po pewnym czasie, w zależności od konfiguracji maszyny i jądra, zostanie to zrobione. Jeśli chcesz nieco przyspieszyć, użyj flagi -JN do wykonania, gdzie n to liczba procesorów/rdzeni + 1. Uważaj jednak, że może to ujawnić błędy w jądrze lub budować infrastrukturę, więc jeśli coś pójdzie nie tak, spróbuj ponownie, używając MAKE bez flag. Jeśli po przeczytaniu instrukcji GCC (i jeśli nadal jesteś rozsądny), czujesz się przygód i chcesz zmodyfikować niektóre flagi specyficzne dla sprzętu lub masz ochotę na optymalizację kodu, użyj strony Make Manual, aby dowiedzieć się, jak (głównie copts i cflags ). Jednak optymalizacje większe niż -O2 są ryzykowne.

Zachowaj ostrożność i oczekuj złamania, jądro może się skompilować bez problemów, ale może zachowywać się dziwnie. Pamiętaj, aby wpisać wszystkie polecenia jako normalny użytkownik. Nie trzeba budować jako korzeni i programiści jądra marszczenia brwi na temat pomysłu.

Instalacja

Teraz zainstalujmy moduły: należy to zrobić jako root, ponieważ moduły są instalowane w /lib, a normalny użytkownik nie ma dostępu do zapisu. Więc,

# tworzy moduły_install 

tylko to i należy to zrobić przed zainstalowaniem jądra, aby moduły i zainstalowane jądro były zsynchronizowane. Używać

# Zrób instalację 

Aby zainstalować jądro do /rozruch

# DEPMOD 

i przygotuj się do utworzenia initramfs (początkowy system plików RAM), który jest tymczasowym systemem plików załadowanym do pamięci RAM na wczesnych etapach rozruchu i służy do dostarczania podstawowych sterowników i innych urządzeń, aby zamontować system plików root. Więcej informacji można znaleźć na stronie initrd Wikipedii. Poleceniem potrzebnym do tego zadania jest aktualizacja initramfs (jest to wywoływane również za każdym razem, gdy instalowane jest nowe jądro, wyzwalające menedżer pakietów), które może utworzyć initramfs (-C) lub zaktualizować istniejący (-u) . Pełne polecenie jest

# aktualizacja initramfs -c -k 

Wersja to ta, którą zobaczysz po zakończeniu „Make Modules_Install” (ostatni wiersz jej wyjścia będzie „Depmod”).Jeśli chcesz mieć dokładny i dłuższy numer wersji, więc możesz powiedzieć programistom, jakiego użyłeś „Moment Git”, wybierz „Ogólne konfigurację” → „Automatycznie dołącz informacje o wersji do ciągu wersji” po wydaniu Menuconfig. Wyjście w moim systemie Ubuntu wygląda tak:

Update-Initramfs: Generowanie /boot /initrd.IMG-3.1.0-RC3+… 

Zaktualizuj Grub, aby zauważył nowe jądro

# aktualizacja Grub 

Na mojej maszynie testowej Debiana wyjście wygląda tak:

Generowanie grubu.CFG… Znalezione obraz tła:/usr/share/images/Desktop-Base/Desktop-Grub.PNG znaleziono obraz Linux: /boot /vmlinuz-3.0.0-1-AMD64 Znaleziono obraz initrd: /boot /initrd.IMG-3.0.0-1-AMD64 Znaleziono obraz Linux: /boot /vmlinuz-3.0.0-RC6-AMD64 Znaleziono obraz initrd: /boot /initrd.IMG-3.0.0-RC6-AMD64 Znaleziono obraz Linux: /boot /vmlinuz-2.6.39-07727-GBD1Bfe4 Znaleziono obraz initrd: /boot /initrd.IMG-2.6.39-07727-GBD1Bfe4 Znaleziono obraz Linux: /boot /vmlinuz-2.6.39-2-AMD64 Znaleziono obraz initrd: /boot /initrd.IMG-2.6.39-2-AMD64 Znaleziono obraz Linux: /boot /vmlinuz-2.6.39-RC7-AMD64 Znaleziono obraz initrd: /boot /initrd.IMG-2.6.39-RC7-AMD64 Znaleziono obraz Linux: /boot /vmlinuz-2.6.38.5 znaleziony obraz initrd: /boot /initrd.IMG-2.6.38.5 Znaleziono obraz Linux: /boot /vmlinuz-2.6.38.4-00001-GFAA8EE7 Znaleziono obraz initrd: /boot /initrd.IMG-2.6.38.4-00001-GFAA8EE7 Znaleziono obraz Linux: /boot /vmlinuz-2.6.38.4 Znaleziono obraz initrd: /boot /initrd.IMG-2.6.38.4 Znaleziono obraz Linux: /boot /vmlinuz-2.6.38-2-AMD64 Znaleziono obraz initrd: /boot /initrd.IMG-2.6.38-2-AMD64 Znaleziono obraz Linux: /boot /vmlinuz-2.6.32-5-AMD64 Znaleziono obraz initrd: /boot /initrd.IMG-2.6.32-5-AMD64 Znaleziono Memtest86+ Image: /Memtest86+.Bin Found Memtest86+ Multiboot Image: /memtest86+ _Multiboot.Bin gotowy 

Oczywiście twoje wyjście nie będzie wyglądać dokładnie tak samo, ale zarys powinien być taki sam; Na koniec pamiętaj: jeśli chcesz, edytuj/etc/default/grub, aby zmienić niektóre opcje przed aktualizacją Grub i, z kciukami, ponownie uruchom swój komputer, aby przetestować nowe jądro.

Jeśli coś pójdzie nie tak

Najbardziej zwykłe sytuacje, w których twoje nowe jądro jest bezużyteczne, jest to, że nie można go uruchomić w pierwszej kolejności lub to, że nie ma on jakiegoś niezbędnego sterownika (na przykład sterowników sieciowych). Zwykle aktualizacja Grub wykonuje dobrą robotę, pisząc plik menu Grub, ale i tak możesz to sprawdzić. Jeśli zdasz Grub, są szanse, że jesteś nadgorliwy i poślubiłeś niezbędnego sterownika systemu, takiego jak części związane z dysku (ATA, SATA, SCSI…), a może NFS, jeśli masz montaż NFS korzeni. Uruchom działające jądro i ponownie skonfiguruj, używając Google i możliwych innych źródeł, takich jak IRC .

Są szanse, że ktoś już natknął się na twój problem w przeszłości i masz szansę znaleźć odpowiedź. Jeśli problem jest poważniejszy i masz pewność, że przeczytasz o Netiquette i jak publikować na liście mailingowej jądra, zapytaj ładnie. Istnieje wielu miłych i pomocnych ludzi, ale zwykle nie są tak szalone, gdy nie odrobiłeś pracy domowej i/lub marnujesz swój czas. Jeśli masz osobny /rozruchowy, pamiętaj, że zwykle nie jest zbyt duży i może szybko wypełnić jądra. Również /lib /moduły mają tendencję do gromadzenia dużo miejsca w /, więc od czasu do czasu upewnij się. Pamiętaj, że jądro jest złożonym oprogramowaniem, a wiele przyczyn może znajdować się u podstaw twoich problemów. Jeśli nie miałeś problemów z następstwem tego przewodnika, jesteś gotowy na bardziej zaawansowaną konfigurację jądra Linux.

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Ubuntu 20.04 Przewodnik
  • Jak usunąć stare jądra na Ubuntu
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Hung Linux System? Jak uciec do wiersza poleceń i…
  • Rzeczy do zainstalowania na Ubuntu 22.04
  • Zainstaluj Arch Linux na stacji roboczej VMware