GNU/Linux >> Znalost Linux >  >> Linux

Linux – konfigurace, kompilace a instalace vlastního linuxového jádra?

Chtěl bych zkusit použít jiné jádro než to, které poskytuje moje distribuce – buď odjinud, nebo jak jsem si ho upravil. Je to obtížné nebo nebezpečné?

Kde mám začít?

Přijatá odpověď:

Vytvoření vlastního jádra může být časově náročné – většinou v konfiguraci, protože moderní počítače dokážou sestavit během několika minut – ale není nijak zvlášť nebezpečné pokud ponecháte si své aktuální funkční jádro a ujistěte se, že jste to nechali jako možnost prostřednictvím zavaděče (viz krok #6 níže). Tímto způsobem, pokud váš nový nefunguje, můžete jednoduše restartovat starý.

V následujících pokynech mají cesty ve zdrojovém stromu tvar [src]/whatever , kde [src] je adresář, do kterého jste zdroj nainstalovali, např. /usr/src/linux-3.13.3 . Pravděpodobně budete chtít provést tyto věci su root protože zdrojový strom by měl zůstat bezpečný z hlediska oprávnění k zápisu (měl by být vlastněn rootem).

I když jsou některé kroky volitelné, měli byste si je přesto přečíst, protože obsahují informace nezbytné k pochopení zbytku procesu.

  1. Stáhněte si a rozbalte zdrojový tarball.

    Ty jsou k dispozici na kernel.org. Nejnovější jsou uvedeny na titulní stránce, ale pokud se podíváte dovnitř /pub/ adresář, najdete archiv sahající až do verze 1.0. Pokud nemáte zvláštní důvod k tomu jinak, je nejlepší vybrat si „nejnovější stabilní“. V době psaní tohoto článku se jedná o 74 MB tar.xz soubor.

    Jakmile je tarball stažen, musíte jej někde rozbalit. Normální místo je v /usr/src . Umístěte soubor tam a:

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

    Všimněte si, že jednotlivá distribuce obvykle doporučují použít jeden z jejich zdrojových balíčků místo vanilla tree. Toto obsahuje patche specifické pro distribuci, na kterých vám může nebo nemusí záležet. Bude také odpovídat hlavičkám jádra používaným ke kompilaci některých nástrojů uživatelského prostoru, i když jsou s největší pravděpodobností stejně identické.

    Za 15+ let vytváření vlastních jader (většinou na Fedoře/Debianu/Ubuntu) jsem nikdy neměl problém s používáním zdroje vanilla. Pokud to uděláte, ve skutečnosti to příliš nezmění, kromě skutečnosti, že pokud chcete absolutně nejnovější jádro, vaše distribuce jej pravděpodobně ještě nezabalila. Nejbezpečnější cestou je tedy stále použít distribuční balíček, který by se měl nainstalovat do /usr/src . Preferuji nejnovější stáj, abych se mohl chovat jako pokusný králík, než se dostane do distribucí 🙂

  2. Začněte se základní konfigurací [volitelné].

    Nemusíte to dělat – stačí se ponořit a vytvořit konfiguraci od začátku. Pokud jste to však ještě nikdy neudělali, očekávejte hodně pokusu a omylu. To také znamená, že musíte pročíst většinu možností (jsou jich stovky). Lepší je použít stávající konfiguraci, pokud je k dispozici. Pokud jste použili zdrojový balíček distribuce, pravděpodobně již obsahuje [src]/.config soubor, takže jej můžete použít. V opačném případě vyhledejte /proc/config.gz . Toto je volitelná funkce přidaná do jádra 2.6. Pokud existuje, zkopírujte jej do nejvyšší úrovně zdrojového stromu a gunzip -c config.gz > .config .

Pokud neexistuje, možná proto, že tato možnost byla nakonfigurována jako modul. Vyzkoušejte sudo modprobe configs a poté zkontrolujte /proc adresář pro config.gz znovu.

Konfigurace distribuce není příliš ideální v tom smyslu, že obsahuje téměř všechny možné ovladače hardwaru. Na funkčnosti jádra to příliš nezáleží, protože jde o moduly a většina z nich se nikdy nezvykne, ale velmi výrazně to prodlužuje dobu potřebnou k sestavení. Je to také nešikovné v tom, že vyžaduje, aby initramfs obsahoval určité základní moduly (viz krok #4 níže). Je to však pravděpodobně lepší výchozí bod než výchozí.

Všimněte si, že možnosti konfigurace se posouvají a mění z jedné verze jádra na další, a když spustíte jeden z make config programy pod vaším .config bude nejprve analyzován a aktualizován, aby odpovídal nové verzi. Pokud je konfigurace z mnohem starší verze, může to vést k podivným výsledkům, takže při konfiguraci věnujte pozornost. AFAIK to nebude vůbec fungovat naopak (s použitím konfigurace z novější verze).

  1. Vytvořte .config urace.

    [src]/.config je textový soubor používaný ke konfiguraci jádra. Tento soubor přímo neupravujte . Změna voleb často není jednoduchá záležitost nahrazení Y s N , atd; obvykle existuje soubor vzájemných závislostí a možností větvení. Místo toho chcete použít jeden z konfiguračních cílů z makefile jádra (to znamená, zadejte make _____ na příkazovém řádku ze zdrojového adresáře nejvyšší úrovně):

    • make config je nejzákladnější, ale pravděpodobně ne podle vkusu většiny lidí. Je to sled otázek — hodně otázek – a pokud změníte názor, musíte začít znovu.

    • make oldconfig je jako make config kromě případů, kdy již máte .config z předchozí verze, přeskočí otázky kromě těch, které se týkají nových možností. Stále jich může být hodně a většina z nich pro vás bude irelevantní, takže to opět nedoporučuji.

    • make menuconfig je moje (a myslím, že většina ostatních) preferovaná metoda. Vytváří a spouští rozhraní TUI (barevné nabídky, které budou fungovat na terminálu). To vyžaduje, abyste měli -dev nainstalovaný balíček pro ncurses. Je to docela samovysvětlující, kromě vyhledávání, které je přístupné přes /; „Nápověda“ F1 poskytuje vysvětlení aktuální možnosti. Existuje alternativní verze, make nconfig , s několika funkcemi navíc, kde F2 „syminfo“ je ekvivalentem F1 v menuconfig.

    • make xconfig je plné GUI rozhraní. To vyžaduje qmake a -dev nainstalujte balíček pro Qt, jako znovu, je to program, který je zkompilován a sestaven. Pokud jste je dříve nepoužívali, může to být značné stahování. Důvod, proč preferuji menuconfig ve verzi s GUI spočívá v tom, že hierarchie možností jsou prezentovány pomocí postupných obrazovek v prvním, ale jako otevřené akordeon v druhém.

    Jedna z prvních věcí, kterou byste měli (ale nemusíte) udělat, je přidat řetězec „Místní verze“ (v části Obecné nastavení ). Důvod je uveden v bodě 5 níže.

    „Labyrint“ je dobrý způsob, jak popsat hierarchii opcí, a podrobně se s ní zabývat je daleko za rozsahem otázek a odpovědí, jako je tato. Pokud si chcete sednout a všechno projít, vyhraďte si hodiny . Greg Kroah-Hartman (dlouholetý hlavní vývojář pro linuxové jádro) má bezplatnou online knihu o jádře (viz reference níže), která obsahuje kapitolu o konfiguraci, ačkoli byla napsána v roce 2006. Moje rada je začít s rozumným základem z vašeho aktuálního jádra distribuce (podle #2) a poté jej projděte a zrušte zaškrtnutí všech věcí, o kterých víte, že je nepotřebujete. Pravděpodobně také budete chtít změnit některé možnosti „modulu“ na „vestavěný“, což nás přivádí k mému dalšímu bodu…

  2. O initramfs [volitelné]

    „initramfs“ je komprimovaný souborový systém zabudovaný do jádra a/nebo načtený při bootování. Jeho primárním účelem je zahrnout moduly, které bude jádro potřebovat, než bude mít přístup k modulům v /lib/modules v kořenovém souborovém systému — např. ovladače pro zařízení obsahující tento souborový systém. Distribuce je vždy používají částečně, protože ovladače jsou vzájemně nekompatibilní, a tak nemohou být všechny zabudovány do jádra. Místo toho jsou ty vhodné pro aktuální systém vybrány z initramfs .

    Funguje to dobře a nepředstavuje to žádnou nevýhodu, ale je to pravděpodobně zbytečná komplikace při sestavování vlastního jádra. Háček je v tom, že pokud nepoužíváte initramfs, musíte se ujistit, že ovladače pro váš kořenový souborový systém (a zařízení, na kterém se nachází) jsou zabudovány do jádra. V menuconfig , to je rozdíl mezi M (=modul) a * (=vestavěná) možnost. Pokud to neuděláte správně, systém selže na začátku procesu spouštění. Pokud tedy máte například pevný disk SATA a kořenový souborový systém ext4, potřebujete ovladače pro tyto vestavěné. [Pokud někoho napadne něco jiného, ​​co musíte mít, zanechte komentář a já to sem začlením].

    Pokud chcete použít initramfs , budete muset vybrat příslušné možnosti v Obecné nastavení . Existuje základní průvodce vytvořením zabudovaného do jádra v [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt , ale všimněte si, že distribuce to nedělají; používají externí gzip cpio soubor. Tento dokument však obsahuje diskuzi o tom, co by mělo být součástí initramfs (viz „Obsah initramfs“).

  3. Sestavte a nainstalujte jádro.

    Další krok je snadný. Chcete-li vytvořit jádro, stačí spustit make v [src] adresář. Pokud používáte vícejádrový systém, můžete přidat -j N pro urychlení, kde N je počet jader, která chcete věnovat + 1. Neexistuje žádný test nebo check . Jakmile to uděláte, můžete make modules . Na rychlém boxu by to vše mělo trvat <10 minut.

    Pokud vše půjde dobře, make INSTALL_MOD_STRIP=1 modules_install . Tím se vytvoří adresář v /lib/modules odpovídající číslu verze jádra plus řetězci „Local version“ uvedenému v kroku 3, pokud existuje. Pokud jste nepoužili řetězec „Místní verze“, buďte opatrní, pokud již máte jádro stejné verze, na které jste závislí , protože tyto moduly je nahradí.INSTALL_MOD_STRIP=1 je volitelný, význam viz zde.

    Poté můžete make install k instalaci jádra do výchozího umístění. Moje doporučení je však udělat to sami, abyste zajistili, že nebudou přepsány žádné existující soubory. Podívejte se do [src]/arch/[ARCH]/boot pro soubor s názvem bzImage , kde [ARCH] je x86 pokud jste na počítači x86 nebo x86-64 (a něco jiného, ​​pokud jste na něčem jiném). Zkopírujte to do /boot a přejmenujte jej na něco konkrétnějšího a informativního (je jedno co). Udělejte to samé s [src]/System.map , ale přejmenujte jej podle následujícího schématu:

    System.map-[VERSION]
    

    Zde [VERSION] je přesně stejné jako název adresáře v /lib/modules vytvořeno make modules_install , který bude obsahovat řetězec „Místní verze“, např. System.map-3.13.3-mykernel .

  4. Nakonfigurujte zavaděč GRUB 2.

    Pokud nepoužíváte grub (většina uživatelů linuxových desktopů je), to se vás samozřejmě netýká. Měli byste mít /etc/grub.d/40_custom soubor, ve kterém toho moc není. Pokud ne, vytvořte jej ve vlastnictví root a chmod 755 (musí být spustitelný). K tomu dodat:

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

    Pokud používáte initramfs, měli byste mít také poslední řádek initrd /path/to/initramfs . Dejte si pozor na set root= čára. Příklad předpokládá, že grub byl nainstalován na první oddíl prvního pevného disku (hd0,1). Pokud máte více jednotek, možná budete chtít místo toho použít UUID oddílu a nahradit tento řádek:

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

    Pokud grub není ve vašem kořenovém souborovém systému, mělo by to také odpovídat root= direktivu linux řádek, který označuje váš kořenový souborový systém (ten s /sbin/init a /lib/modules ). Verze UUID je root=UUID=[the UUID] .

    Můžete se podívat na svůj stávající /boot/grub2/grub.cfg pro představu o názvu zařízení. Zde je stručný návod, jak to provést pod grub 2. Až budete spokojeni, spusťte grub2-mkconfig -o /boot/grub2/grub.cfg (ale zálohujte si aktuální grub.cfg za prvé). Pak možná budete chtít tento soubor upravit a přesunout svůj záznam na začátek. Stále by měl obsahovat výpis vašeho starého (běžícího) jádra a vaše distribuce může mít mechanismus, který automaticky duplikuje záznam pro nové jádro (protože byl nalezen v /boot; Fedora to dělá, proto používá odlišný název s menuentry je to dobrý nápad). Pokud vše půjde dobře, můžete to později odstranit.

    Můžete také jednoduše vložit menuentry do grub.cfg přímo, ale některá distribuce to přepíší, když je jejich jádro aktualizováno (zatímco pomocí /etc/grub.d/ zůstane součástí).

    A je to. Vše, co nyní musíte udělat, je restartovat. Pokud to nefunguje, zkuste problém odvodit z výstupu obrazovky, restartujte počítač se starým jádrem a vraťte se ke kroku 3 (kromě použití .config již máte a upravte to). Může být dobrý nápad make clean (nebo make mrproper ) mezi pokusy ale nezapomeňte zkopírovat [src]/.config nejprve do nějaké zálohy, protože ta se vymaže. To pomáhá zajistit, aby objekty použité v procesu sestavování nebyly zastaralé.

  5. Pokud jde o hlavičky jádra et. al.

    Jedna věc, kterou byste pravděpodobně měli udělat, je symbolický odkaz (ln -s -i ) /lib/modules/X.X.X/source a /lib/modules/X.X.X/build do /usr/src adresář, kde je zdrojový strom (ten si ponechte). To je nezbytné, aby některé nástroje uživatelského prostoru (a instalátory ovladačů třetích stran) měly přístup ke zdroji běžícího jádra.

    Problém související s tímto jsou .h soubory v /usr/include atd. Tyto se mění velmi postupně a jsou zpětně kompatibilní. Máte dvě možnosti:

    • Nechte ty, které používá vaše distro. Pokud pravidelně aktualizujete celý systém, distribuce bude stejně pravidelně instalovat nové, takže toto je možnost „nejmenších potíží“.

    • Použijte make headers_install .

    Vzhledem k tomu, že jsou zpětně kompatibilní (to znamená, že „program vytvořený proti knihovně C používající starší hlavičky jádra by měl běžet na novějším jádře“), nemusíte se tím příliš zabývat. Jediným potenciálním problémem by bylo, kdybyste si vytvořili vlastní jádro a nějakou dobu si ho ponechali, během této doby distribuce aktualizuje balíček „kernel-headers“ na novější verzi, než která byla použita k sestavení jádra, a ukázalo se, že existuje určitá nekompatibilita (která by se vztahovala pouze na software následně kompilovaný ze zdroje).

Související:Linux – příkaz prstem nefunguje?

Odkazy

Zde jsou některé zdroje:

  • [src]/README obsahuje stručného průvodce stavbou a instalací.

  • [src]/Documentation adresář obsahuje mnoho informací, které mohou být užitečné při konfiguraci.

  • Velká část knihy Grega K-H Linux Kernel in a Nutshell (k dispozici zde zdarma jako série PDF) se točí kolem budování jádra.

  • Grub 2 má online příručku.

Související:Env či ne env?


Linux
  1. Instalace a nastavení Grafana v linuxu

  2. Linux – rozdíl mezi uživatelským prostorem a prostorem jádra?

  3. Linux – kompilace a instalace jádra Kernel.org do vlastního svazku na disku?

  1. Linux – Vypsat rozložení tabulky stránek (konfigurace jádra)?

  2. Instalace a konfigurace vsFTPD

  3. Konfigurace a ladění OpenVAS v Kali Linuxu

  1. Instalace a používání Homebrew Package Manager v systému Linux

  2. CentOS / RHEL :Instalace a konfigurace ASMLib

  3. Jak uložit nebo exportovat vlastní konfiguraci jádra Linuxu?