Konfigurowanie, kompilowanie i instalowanie niestandardowego jądra systemu Linux


38

Chciałbym spróbować użyć jądra innego niż dostarczone przez moją dystrybucję - albo skądś indziej, albo według własnego uznania. Czy to trudne czy niebezpieczne?

Gdzie zaczynam?

Odpowiedzi:


51

Zbudowanie niestandardowego jądra może być czasochłonne - głównie w konfiguracji, ponieważ współczesne komputery mogą wykonać kompilację w ciągu kilku minut - ale nie jest to szczególnie niebezpieczne, jeśli utrzymasz bieżące, działające jądro i upewnij się, że je zostawiłeś jako opcja za pośrednictwem bootloadera (patrz krok # 6 poniżej). W ten sposób, jeśli twój nowy nie działa, możesz po prostu zrestartować stary.

W poniższych instrukcjach ścieżki wewnątrz drzewa źródłowego mają postać [src]/whatever, w której [src]znajduje się katalog, w którym zainstalowano źródło, np /usr/src/linux-3.13.3. Prawdopodobnie chcesz to zrobić, su rootponieważ drzewo źródłowe powinno pozostać bezpieczne pod względem uprawnień do zapisu (powinno być własnością root).

Chociaż niektóre kroki są opcjonalne, należy je przeczytać mimo wszystko, ponieważ zawierają informacje niezbędne do zrozumienia pozostałej części procesu.

  1. Pobierz i rozpakuj źródłowy plik archiwum.

    Są one dostępne na kernel.org . Najnowsze są wymienione na stronie głównej, ale jeśli zajrzysz do /pub/katalogu, znajdziesz archiwum sięgające wstecz do wersji 1.0. Jeśli nie masz specjalnego powodu, aby zrobić inaczej, najlepiej wybrać opcję „Ostatnia stabilna”. W chwili pisania tego tekstu jest to tar.xzplik o wielkości 74 MB .

    Po pobraniu tarballa musisz go gdzieś rozpakować. Normalne miejsce to /usr/src. Umieść tam plik i:

    tar -xJf linux-X.X.X.tar.xz
    

    Zauważ, że poszczególne dystrybucje zwykle zalecają użycie jednego z ich pakietów źródłowych zamiast drzewa waniliowego. Zawiera łatki specyficzne dla dystrybucji, które mogą, ale nie muszą mieć znaczenia. Będzie również pasować do nagłówków zawierających nagłówki używane do kompilacji niektórych narzędzi przestrzeni użytkownika, chociaż i tak najprawdopodobniej są one identyczne.

    Przez ponad 15 lat budowania niestandardowych jąder (głównie na Fedorze / Debian / Ubuntu) nigdy nie miałem problemu z używaniem źródła waniliowego 1 . Nie robi to jednak wielkiej różnicy, poza tym, że jeśli chcesz mieć absolutnie najnowsze jądro, Twoja dystrybucja prawdopodobnie jeszcze go nie spakowała. Tak więc najbezpieczniejszą drogą jest nadal użycie pakietu dystrybucyjnego, który powinien zostać zainstalowany /usr/src. Wolę najnowszą stajnię, aby móc działać jak świnka morska, zanim zostanie wprowadzona do dystrybucji :)

  2. Zacznij od podstawowej konfiguracji [opcjonalnie].

    Nie musisz tego robić - możesz po prostu zanurkować i stworzyć konfigurację od zera. Jeśli jednak nigdy tego nie robiłeś, spodziewaj się wielu prób i błędów. Oznacza to także konieczność przeczytania większości opcji (są ich setki). Lepszym rozwiązaniem jest użycie istniejącej konfiguracji, jeśli jest dostępna. Jeśli korzystałeś z pakietu źródłowego dystrybucji, prawdopodobnie już zawiera on [src]/.configplik, więc możesz go użyć. W przeciwnym razie sprawdź, czy /proc/config.gz. Jest to opcjonalna funkcja dodana do jądra 2.6. Jeśli istnieje, skopiuj go na najwyższy poziom drzewa źródłowego i gunzip -c config.gz > .config.

Jeśli nie istnieje, być może dlatego, że ta opcja została skonfigurowana jako moduł. Spróbuj sudo modprobe configs, a następnie ponownie sprawdź /prockatalog config.gz.

Konfiguracja dystrybucji nie jest zbyt idealna, ponieważ zawiera prawie każdy możliwy sterownik sprzętowy. Nie ma to większego znaczenia dla funkcjonalności jądra, ponieważ są to moduły i większość z nich nigdy się nie przyda, ale bardzo znacząco wydłuża czas budowy. Jest to również niewygodne, ponieważ wymaga, aby initramfs zawierał pewne podstawowe moduły (patrz krok 4 poniżej). Jest to jednak prawdopodobnie lepszy punkt początkowy niż domyślny.

Zauważ, że opcje konfiguracji zmieniają się i zmieniają z jednej wersji jądra do następnej, a kiedy uruchomisz jeden z make configponiższych programów .config, najpierw zostanie on przeanalizowany i zaktualizowany w celu dopasowania do nowej wersji. Jeśli konfiguracja pochodzi ze znacznie starszej wersji, może to prowadzić do dziwnych wyników, dlatego należy zachować ostrożność podczas konfigurowania. AFAIK nie będzie działał na odwrót (przy użyciu konfiguracji z nowszej wersji).

  1. Stwórz .configochotę.

    [src]/.configjest plikiem tekstowym używanym do konfiguracji jądra. Nie edytuj tego pliku bezpośrednio . Zmiana opcji często nie jest to prosta sprawa, wymieniając Yze związkiem N, etc; zwykle istnieje zestaw współzależności i możliwości rozgałęziania. Zamiast tego chcesz użyć jednego z celów konfiguracji z pliku makefile jądra (tzn. Wpisz make _____w wierszu poleceń z katalogu źródłowego najwyższego poziomu):

    • make configjest najbardziej podstawowy, ale prawdopodobnie nie do gustu większości ludzi. Jest to sekwencja pytań - wiele pytań - a jeśli zmienisz zdanie, musisz zacząć od nowa.

    • make oldconfigjest jak make configoprócz, jeśli masz już .configpoprzednią wersję, pominie pytania oprócz tych, które dotyczą nowych opcji. Wciąż może być ich wiele, a większość z nich będzie dla ciebie nieistotna, więc nie polecam.

    • make menuconfigjest moją (i myślę, że większość innych) preferowaną metodą. Buduje i wykonuje interfejs TUI (kolorowe menu, które będą działać na terminalu). Wymaga to -devzainstalowania pakietu dla ncurses. Jest to dość zrozumiałe, z wyjątkiem wyszukiwania, do którego można uzyskać dostęp za pośrednictwem /; „pomoc” F1 zawiera wyjaśnienie bieżącej opcji. Istnieje alternatywna wersja, make nconfigz kilkoma dodatkowymi funkcjami, w której F2 „syminfo” jest odpowiednikiem F1 menuconfig.

    • make xconfigto pełny interfejs GUI. Wymaga qmakeoraz -devpakiet dla Qt być zainstalowany, jako kolejny, że jest to program, który jest opracowany i zbudowany. Jeśli nie korzystałeś z nich wcześniej, może to być znaczne pobranie. Powodem, dla którego wolę menuconfigwersję GUI, jest to, że hierarchie opcji są prezentowane przy użyciu kolejnych ekranów w pierwszym, ale otwartym jak w akordeonie w drugim.

    Jedną z pierwszych rzeczy, które powinieneś (ale nie musisz) zrobić, to dodać ciąg „Wersja lokalna” (w Ustawieniach ogólnych ). Powód jest wymieniony w punkcie 5 poniżej.

    „Labirynt” to dobry sposób na opisanie hierarchii opcji, a szczegółowe omówienie jej znacznie wykracza poza zakres takich pytań i odpowiedzi. Jeśli chcesz usiąść i przejrzeć wszystko, odłóż godziny . Greg Kroah-Hartman (wieloletni programista dla jądra Linuksa) ma darmową książkę online na temat jądra (patrz odnośniki poniżej), która zawiera rozdział o konfiguracji , chociaż napisano go w 2006 roku. Moja rada to zacząć od rozsądnej podstawy z obecnego jądra dystrybucji (jak w punkcie 2), a następnie przejdź przez niego i odznacz wszystkie rzeczy, których wiesz, że nie potrzebujesz. Prawdopodobnie zechcesz także zmienić niektóre opcje „modułu” na „wbudowane”, co prowadzi nas do następnego punktu ...

  2. Informacje initramfs[opcjonalne]

    „Initramfs” to skompresowany system plików wbudowany w jądro i / lub załadowany podczas rozruchu. Jego podstawowym celem jest dołączenie modułów, których jądro będzie potrzebowało, aby uzyskać dostęp do tych znajdujących /lib/modulessię w głównym systemie plików - np. Sterowniki urządzenia zawierającego ten system plików. Distros zawsze używają ich częściowo, ponieważ sterowniki są wzajemnie niekompatybilne i dlatego nie można ich wszystkich wbudować w jądro. Zamiast tego, odpowiednie dla bieżącego systemu są wybierane z wnętrza initramfs.

    Działa to dobrze i nie stanowi żadnej wady, ale prawdopodobnie jest to niepotrzebna komplikacja podczas budowania własnego jądra. 2 Chwytanie polega na tym, że jeśli nie używasz initramfs, musisz upewnić się, że sterowniki dla głównego systemu plików (i urządzenia, na którym on jest włączony) są wbudowane w jądro. W menuconfigtym jest różnica pomiędzy Mopcji (= moduł) oraz *opcjonalnie (= wbudowane). Jeśli nie uda ci się tego zrobić, system zawiedzie na wczesnym etapie procesu rozruchu. Na przykład, jeśli masz dysk twardy SATA i główny system plików ext4, potrzebujesz sterowników dla tych wbudowanych. [Jeśli ktoś może wymyślić coś jeszcze, co jest obowiązkowe, zostaw komentarz, a ja go tu zamieszczę].

    Jeśli chcesz użyć initramfs, musisz wybrać odpowiednie opcje w Ustawieniach ogólnych . Jest szkielet przypomnienie tworząc jedną wbudowany w jądro w [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt, ale należy pamiętać, że dystrybucje nie rób tego; używają zewnętrznego skompresowanego pliku cpio. Jednak ten dokument zawiera dyskusję na temat tego, co powinno się znaleźć w initramfs(patrz „Zawartość initramfs”).

  3. Zbuduj i zainstaluj jądro.

    Następny krok jest łatwy. Aby utworzyć jądro, po prostu uruchom go makew [src]katalogu. Jeśli korzystasz z systemu wielordzeniowego, możesz dodać, -j Naby przyspieszyć, gdzie Njest liczba rdzeni, którą chcesz poświęcić + 1. Nie ma testlub check. Gdy to zrobisz, możesz make modules. W szybkim pudełku wszystko to powinno zająć <10 minut.

    Jeśli wszystko pójdzie dobrze, make INSTALL_MOD_STRIP=1 modules_install. Spowoduje to utworzenie katalogu /lib/moduleszgodnego z numerem wersji jądra oraz łańcucha „Wersja lokalna” wymienionego w kroku 3, jeśli taki istnieje. Jeśli nie użyłeś ciągu „Wersja lokalna”, bądź ostrożny, jeśli masz już jądro tej samej wersji, na której polegasz , ponieważ te moduły zastąpią je. 3 INSTALL_MOD_STRIP=1 jest opcjonalne, dla znaczenia patrz tutaj .

    Następnie możesz make installzainstalować jądro w domyślnej lokalizacji. Jednak moim zaleceniem jest zrobienie tego samemu, aby żadne istniejące pliki nie zostały zastąpione. Poszukaj [src]/arch/[ARCH]/bootpliku o nazwie bzImage4 , gdzie [ARCH]jest, x86jeśli korzystasz z komputera x86 lub x86-64 (i czegoś innego, jeśli korzystasz z czegoś innego). Skopiuj to /booti zmień nazwę na coś bardziej szczegółowego i informacyjnego (nie ma znaczenia co). Zrób to samo [src]/System.map, ale zmień nazwę zgodnie z następującym schematem:

    System.map-[VERSION]
    

    Tutaj [VERSION]jest dokładnie taki sam jak nazwa katalogu, w którym /lib/modulesutworzonomake modules_install , który będzie zawierał ciąg „Wersja lokalna”, np System.map-3.13.3-mykernel.

  4. Skonfiguruj bootloader GRUB 2.

    Jeśli nie używasz grub(większość użytkowników komputerów stacjonarnych z Linuksem), to oczywiście nie dotyczy ciebie. Powinieneś mieć /etc/grub.d/40_customplik z niewielką ilością. Jeśli nie, utwórz go jako root i chmod 755(musi być wykonywalny). Do tego dodaj:

    menuentry 'My new kernel, or whatever' {
        set root='hd0,1'
        linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options]
    }
    

    Jeśli używasz initramfs, powinieneś także mieć ostatnią linię initrd /path/to/initramfs. Uważaj na set root=linię. W przykładzie założono, że grub został zainstalowany na pierwszej partycji pierwszego dysku twardego (hd0,1). Jeśli masz wiele dysków, możesz zamiast tego użyć UUID partycji i zastąpić ten wiersz:

        search --no-floppy --fs-uuid --set=root [the UUID of the partition]
    

    O ile grub nie znajduje się w głównym systemie plików, powinno to również odpowiadać root=dyrektywie w linuxlinii, która wskazuje twój główny system plików (ten z /sbin/initi /lib/modules). Jego wersja UUID to root=UUID=[the UUID].

    Możesz spojrzeć na swoje istniejące, /boot/grub2/grub.cfgaby uzyskać wskazówkę dotyczącą nazwy urządzenia. Oto krótki przewodnik po grub 2. Gdy będziesz zadowolony, biegnij grub2-mkconfig -o /boot/grub2/grub.cfg(ale grub.cfgnajpierw wykonaj kopię zapasową bieżącego ). Następnie możesz edytować ten plik i przenieść swój wpis na górę. Powinien nadal zawierać listę dla twojego starego (działającego) jądra, a twoja dystrybucja może mieć mechanizm, który automatycznie kopiuje wpis dla nowego jądra (ponieważ został znaleziony w /boot; Fedora robi to, stąd użycie odrębnego tytułu za menuentrypomocą dobry pomysł). Możesz to usunąć później, jeśli wszystko pójdzie dobrze.

    Możesz także po prostu wstawić bezpośrednio menuentrydo grub.cfg, ale niektóre dystrybucje zastąpią to, gdy ich jądro zostanie zaktualizowane (podczas gdy używanie /etc/grub.d/go utrzyma).

    to jest to! Teraz wystarczy zrestartować komputer. Jeśli to nie działa, spróbuj wydedukować problem z wyjścia ekranowego, uruchom ponownie wybierając stare jądro i wróć do kroku 3 (z wyjątkiem tego, .configktórego już używasz i popraw go). Dobrym pomysłem może być make clean(lub make mrproper) między próbami, ale najpierw upewnij się, że skopiowałeś kopię [src]/.configzapasową, ponieważ zostanie ona skasowana. Pomaga to upewnić się, że obiekty użyte w procesie kompilacji nie są przestarzałe.

  5. Odnośnie nagłówków jądra i in. glin.

    Jedną z rzeczy, które powinieneś prawdopodobnie zrobić, to symlink ( ln -s -i) /lib/modules/X.X.X/sourcei /lib/modules/X.X.X/builddo /usr/srckatalogu, w którym znajduje się drzewo źródłowe (zachowaj to). Jest to konieczne, aby niektóre narzędzia przestrzeni użytkownika (i instalatory sterowników innych firm) miały dostęp do źródła dla uruchomionego jądra.

    Problemem z tym związanym są .hpliki w /usr/includeitp. Zmieniają się one bardzo stopniowo i są kompatybilne wstecz . Masz dwie możliwości:

    • Pozostaw te, których używa Twoja dystrybucja. Jeśli regularnie aktualizujesz cały system, dystrybucja i tak instaluje nowe okresowo, więc jest to opcja „najmniej kłopotów”.

    • Zastosowanie make headers_install.

    Ponieważ są one kompatybilne z poprzednimi wersjami (co oznacza, że ​​„program zbudowany w oparciu o bibliotekę C używającą starszych nagłówków jądra powinien działać na nowszym jądrze”), nie musisz się tym przejmować. Jedynym potencjalnym problemem może być zbudowanie niestandardowego jądra i zachowanie go przez jakiś czas. W tym czasie dystrybucja aktualizuje pakiet „nagłówków jądra” do nowszej wersji niż ta, którą wykorzystano do zbudowania jądra, i okazuje się, że niekompatybilność (która dotyczyłaby tylko oprogramowania skompilowanego później ze źródła).

Referencje

Oto niektóre zasoby:

  • [src]/README zawiera krótki przewodnik po budowaniu i instalowaniu.

  • [src]/DocumentationKatalog zawiera wiele informacji, które mogą być pomocne w konfiguracji.

  • Znaczna część książki Grega KH „ Linux Kernel in a Nutshell” (dostępna tam za darmo jako seria plików PDF) obraca się wokół budowania jądra.

  • Grub 2 ma instrukcję online .


1. „Wanilia” odnosi się do oryginalnego, niezafałszowanego oficjalnego źródła znalezionego na kernel.org. Większość dystrybucji bierze to waniliowe źródło i dodaje kilka drobnych dostosowań.

2. Należy pamiętać, że istnieją okoliczności, które wymagają initramfs, ponieważ pewna przestrzeń użytkownika jest potrzebna do zamontowania głównego systemu plików - na przykład, jeśli jest on zaszyfrowany lub rozproszony w złożonej macierzy RAID.

3. Nie usunie modułów, które już tam są, jeśli ich nie zbudowałeś, co oznacza, że ​​możesz dodać moduł później, po prostu modyfikując konfigurację i uruchamiając make modules_installponownie. Zauważ, że zbudowanie niektórych modułów może wymagać zmian w samym jądrze, w takim przypadku musisz także wymienić jądro. Będziesz mógł powiedzieć, kiedy spróbujesz użyć modprobedo wstawienia modułu.

4. Ten plik może mieć inną nazwę, jeśli użyjesz niestandardowej opcji kompresji. Nie jestem pewien, jakie są wszystkie możliwości.


3
Pozytywne. Możesz dodać wzmiankę o localmodconfignarzędziach takich jak streamline_config.plskrypt; pomocne podejście do pracy z istniejącej konfiguracji ...
jasonwryan

1
Jest to prawdopodobnie wystarczająco szczegółowe, aby mogło być pytaniem typu kanonicznego z inicjatywy @ terdona. Rozważ udzielenie odpowiedzi na jego pytanie dotyczące meta. Albo mógłbym, jeśli wolisz. Wygląda na to, że taka była intencja, skoro i tak zadałeś pytanie. Myślę, że uwzględnienie metod budowania pakietów binarnych specyficznych dla dystrybucji byłoby również przydatne.
Faheem Mitha

1
FYI: initramfspowinien być używany prawie zawsze. Na przykład ustawienie rootfów na LVM + RAID często wymaga jednego. Zaszyfrowany root zdecydowanie. Czynią to nawet dość skomplikowane konfiguracje RAID. Automatyczne składanie w jądrze nawet trywialnych tablic jest w rzeczywistości przestarzałe ...
derobert

2
@derobert: To nasuwa pytanie, że „prawie zawsze” linux jest używany do uruchamiania serwera korporacyjnego. Chodzi mi o initramfsto, że jeśli nie musisz go używać, nie musisz, a to upraszcza proces. W każdym razie dodałem przypis na temat zaszyfrowanych plików root root itp.
goldilocks

Podaj szczegóły dotyczące EFI i funkcjonalności efi-stubu w Linuksie.
IW16,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.