GNU/Linux >> Znalost Linux >  >> Debian

Vlastní jádra v Ubuntu/Debianu – jak, kdy a proč

Takže jste se rozhodli vyzkoušet tuto věc, o které jste slyšeli mluvit ostatní, nazvanou „kompilace vlastního jádra“. Pokud to zkoušíte jako koníček, nebo protože se chcete naučit novou dovednost, velmi dobře – čtěte dále.

Než však začneme, pokusíme se vysvětlit situace, kdy tato potřeba nastává a jak se s ní vypořádat. Všimněte si, že se jedná o rozsáhlé téma, které potřebuje mnohem více prostoru, než zde poskytneme. Naučíte se základy, co potřebujete, co dělat a čeho dosáhnete.

Pro více informací, jako obvykle, Google je váš přítel; také dokumentace umístěná ve zdrojovém stromu jádra odpoví na spoustu otázek. Začněme tedy od začátku, s poslední poznámkou:bude-li potřeba, uveřejníme další články související s kompilací jádra týkající se jiných distribucí.

Když budete potřebovat zkompilovat své vlastní jádro

První situace nastane, když potřebujete novější jádro, než které poskytuje vaše distribuce, zvláště když provozujete stabilní distribuci (např. Debian stable, CentOS), protože vaše jádro nepodporuje nějakou funkci/ovladač, který potřebujete, nebo jednoduše proto, že máte pocit, chcete vyzkoušet to nejnovější a nejlepší.

Upozornění však: chcete-li provozovat jádro s omezenou hranou, ujistěte se, že bude kompatibilní s ostatními klíčovými komponentami vašeho systému (jako je glibc), pamatujte, že novější znamená méně testování a (pravděpodobně) více nestability; Správci jádra vaší distribuce obvykle odvádějí dobrou práci při zpětném portování některých nových funkcí do starších, stabilnějších jader, takže se ujistěte, že opravdu potřebujete kritické. Naše rada je nepoužívat tato jádra (dlouhodobá jádra by zde tvořila výjimku) na produkčních systémech. Jak již bylo řečeno, důvěřujte správcům svého distra.

Druhá situace je, že máte pocit, že provozujete nabubřelé jádro se spoustou nepotřebných komponent. Zatímco jádro načítá pouze moduly odpovídající existujícímu kusu hardwaru, menší paměťová náročnost jádra obvykle pomáhá rychlosti a době spouštění.

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

Výše uvedené příkazy vám pomohou lépe poznat váš hardware. Zapište si, co jste našli, a ujistěte se, že jste spustili výše uvedené příkazy ls* jako root, abyste získali další informace.

Jiná situace je, že byste chtěli pomoci s testováním jádra spuštěním nejnovější verze na vašem systému. Platí stejná varování jako výše:udělejte to na testovacích systémech, zůstaňte v kontaktu s upstreamem v případě, že narazíte na chybu (lkml.org je hlavní mailing list jádra – vysoká návštěvnost) a snažte se být co nejužitečnější, když budete požádáni o informace .To nelze dostatečně zdůraznit:přečtěte si dokumentaci, ať už proto, že jste se ocitli v nepříjemné situaci, chcete nahlásit chybu nebo prostě máte otázky.

Dále možná budete chtít být skvělým klukem na bloku a spustit nejnovější a nejlepší, možná se podívat na zdroj (za předpokladu, že se tomu věnujete a máte nějaké znalosti C a ASM) a dokonce odesílat záplaty. Můžete se nejprve podívat, zda vaše distribuce již nenabízí novější balíček jádra, například můžete nainstalovat jádra z Debian experimental na testovací systém, pokud odpovídajícím způsobem upravíte svůj sources.list. Znovu, pokud narazíte na chybu, pracujte se správci.

Terminologie

Než se do tohoto poněkud tajemného tématu ponoříme dále, měli bychom si ujasnit některé základní pojmy (ehm); to je nezbytné pro pochopení klíčových částí testování a kompilace jádra.

  • jádro – Jádro operačního systému, zodpovědné za správu hardwarových zdrojů (I/O, sítě, CPU, paměť…). V podstatě je to základní část operačního systému zodpovědná za veškerou špinavou práci. Uživatelské programy komunikují s jádrem a požadují CPU čas nebo jiné zdroje od systémových knihoven, které fungují jako prostředníci mezi uživatelskou zemí (viz níže) a jádrem / hardwarem. Jádra mohou být monolitická a mikrojádra (další informace, pokud vás to zajímá, najdete v části Kernel-wide design approachs na Wikipedia.org . Mikrojádra (jako Minix) používají návrhové schéma, které odděluje jádro od zbytku jádra, a to zbytek je rozdělen na komponenty, z nichž každá dělá něco specifického:I/O, sítě atd. Monolitická jádra (Linux, BSD, Solaris), jak název napovídá, obsahují většinu jádra v jedné jednotce a mají další funkce (např. ) poskytované moduly. Existují také hybridní jádra, kombinace obou, dobrým příkladem je jádro Windows.
  • uživatelská země – vše v OS, co není součástí jádra (knihovny, aplikace), je považováno za součást uživatelského prostoru. Jméno je jasné.
  • modul – jak bylo ukázáno výše, modul jádra je kus binárního softwaru, který v podstatě „učí“ jádro, jak „mluvit“ s kusem hardwaru nebo poskytovat nějakou funkcionalitu (např. nfs)
  • kompilátor – kompilátor je aplikace, která v podstatě vezme napsaný kód, který jste si stáhli z kernel.org, a převede jej na binární soubory. Kompilátor nalezený v linuxových distribucích se nazývá 'gcc' a to znamená GNU Compiler Collection, který také potřebuje komponenty nezbytné pro tvorbu softwaru:nástroje nacházející se v binutilech, jako je assembler (as) nebo archivátor knihoven (ar). Na systémech Debian, nebo Ubuntu, lze zjistit, ke kterému balíčku soubor patří, instalací a spuštěním apt-file. Když už o tom mluvíme, podívejme se, jaké balíčky musíme nainstalovat pro úspěšné sestavení jádra.
  • jádro vanilky – toto je název používaný pro upstream jádro, jak je uvedeno na kernel.org, takže bez patchů specifických pro distribuci.

Vezměte prosím na vědomí, že kdykoli v tomto dokumentu uvidíte příkaz začínající výzvou ‘$‘ to znamená, že příkaz bude muset být spuštěn jako normální každodenní uživatel; kdykoli uvidíte znak ‘#‘ prompt, to znamená, že příkaz má být spuštěn jako root (používáme sudo, ale není to povinné). Aktuální adresář, pokud není uvedeno jinak, je ten, který obsahuje váš zdrojový strom, v tomto případě linux-2.6.

Co je potřeba nainstalovat

  • gcc – kompilátor je samozřejmě nezbytný
  • binutils – tento balíček obsahuje linker, assembler a další nástroje nezbytné pro kompilaci programů napsaných v C.
  • gcc-doc – manuál a informační stránky pro gcc. Užitečné, pokud se chcete ušpinit a upravit některé příznaky kompilace. Užitečné, pokud chcete psát nebo kompilovat balíčky C.
  • gdb – GNU debugger. Není to povinné, ale užitečné, pokud se něco pokazí. Gdb-doc také pomůže.
  • libreadline5-dev – pro použití rozhraní založeného na konfiguraci jádra ncurses. Můžete použít i jiná rozhraní (viz níže).
  • make – bude nainstalováno jako závislost, ale pár slov je v pořádku. Nahlédněte do příručky nebo knih, protože toto není téma, které by se mělo lehce vysvětlit na tak krátkém prostoru. Make je utilita používaná při kompilaci programů v C/C++ a co dělá, je, že se dívá do souboru Makefile, který obsahuje pravidla o tom, jak a v jakém pořadí by mělo sestavení probíhat, a pokouší se provést tyto direktivy. Přečtěte si Makefiles ve zdrojovém stromě, abyste nahlédli.
  • git – Git je VCS (systém pro správu verzí), který dělá to, co dělá cvs nebo subversion, konkrétně vás udržuje v aktuálním stavu s nejnovějším stromem jádra.

Získání zdrojového kódu jádra

Pokud chcete nainstalovat zdroj z vaší distribuce, použijte

# apt-get install linux-source-<version>

kde lze získat z vydání:

uname -r

Toto použijte, pokud chcete upravit své stávající jádro (přidání ovladačů, oříznutí atd.). Jinak chcete vanilkové jádro. Můžete jej získat z www.kernel.org (jako správce stahování zde doporučujeme wget nebo curl) nebo, chcete-li nejnovější, použijete git. Doporučujeme uložit zdroj do domovského adresáře vašeho uživatele a příkaz k získání nejnovějšího stromu hlavní řady je (viz man git):

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

V minulosti jsme zjistili, že mini-howto na http://linux.yyz.us/git-howto.html je užitečné; podívejte se také na kernelnewbies.org . Výše uvedený příkaz vytvoří ve vašem aktuálním adresáři složku s názvem linux-2.6, kterou lze později aktualizovat tak, že do ní vstoupíte cd’ing a vydáte jednoduchý

make clean; git pull 

Nyní, až budete mít zdrojový kód, budeme muset nakonfigurovat jádro .

Konfigurace a stavba

Pokud máte existující soubor .config (soubor, který obsahuje možnosti pro sestavení jádra – co se do něj vloží a co ne), zkopírujte ho do linux-2.6 (z /boot/config- nebo /proc/config .gz – aktuální konfigurace). Pokud nechcete upravit stávající .config, stačí vydat

$ make oldconfig

Jinak čtěte dál. Pokud chcete upravit stávající konfiguraci, problém

$ make menuconfig

(doporučení:můžete použít make config pro spoustu otázek o možnostech v jádře, nebo make xconfig , který vyžaduje knihovny qt, pro hezčí grafické menu) a vyberte „Load an Alternate Configuration File“ a stiskněte enter pro .config , výchozí název konfiguračního souboru nebo zadejte alternativní název souboru již uložený v linux-2.6.

Poté začněte procházet nabídky, abyste provedli potřebné změny. Zde platí pravidlo „pokud nevíte, co to dělá, nehrabejte se v tom“, alespoň dokud nezískáte nějaké zkušenosti. Nakonec z horní nabídky vyberte „Save an Alternate Configuration File“ , stiskněte enter pro výchozí název (.config – doporučeno) a poté „Exit“ zdola. Pokud chcete začít od začátku, zapomeňte na krok „Načíst alternativní konfigurační soubor“ a pokračujte. Při příští kompilaci jádra, po vyčištění a aktualizaci stromu, použijte „make oldconfig“ jako výše, abyste použili starou konfiguraci. OK, nyní máme konfiguraci přizpůsobenou našim potřebám, která jen čeká na sestavení. Sestavení jádra je stejně jednoduché jako jeho konfigurace (!). Stačí zadat make a výstup by měl vypadat takto:

$ make 

  HOSTCC  scripts/basic/fixdep 
  HOSTCC  scripts/kconfig/conf.o 
  SHIPPED scripts/kconfig/zconf.tab.c 
  SHIPPED scripts/kconfig/zconf.lex.c 
  SHIPPED scripts/kconfig/zconf.hash.c 
  HOSTCC  scripts/kconfig/zconf.tab.o 
  HOSTLD  scripts/kconfig/conf 
  
  CHK     include/linux/version.h 
  UPD     include/linux/version.h 
  CHK     include/generated/utsrelease.h 
  UPD     include/generated/utsrelease.h 
  CC        kernel/bounds.s 
  GEN     include/generated/bounds.h 
  CC        arch/x86/kernel/asm-offsets.s 
...

a po chvíli, v závislosti na vašem počítači a konfiguraci jádra, bude hotovo. Pokud chcete věci trochu urychlit, použijte k vytvoření příznak -jn, kde n je počet procesorů/jádr + 1. Buďte však opatrní, protože to může odhalit chyby v jádře nebo infrastruktuře budování, takže pokud se něco pokazí, zkuste to znovu pomocí make bez jakýchkoli příznaků. Pokud se po přečtení příručky gcc (a jste-li stále při smyslech), cítíte dobrodružně a chcete upravit některé hardwarově specifické příznaky nebo máte chuť optimalizovat kód, použijte stránku manuálu k vytvoření, abyste zjistili jak (hlavně COPTS a CFLAGS ). Optimalizace větší než -O2 jsou však riskantní.

Buďte opatrní a počítejte s rozbitím, jádro se může zkompilovat bez problémů, ale může se chovat divně. Nezapomeňte zadat všechny příkazy jako normální uživatel. Není třeba stavět jako root a vývojáři jádra se na tento nápad mračí.

Instalace

Nyní nainstalujme moduly:toto je třeba provést jako root, protože moduly jsou nainstalovány v /lib a běžný uživatel tam nemá přístup pro zápis. Takže,

# make modules_install 

dělá právě to a to je potřeba udělat před instalací jádra, aby byly moduly a nainstalované jádro synchronizované. Použijte

# make install 

k instalaci jádra do /boot, pak

# depmod 

a připravte se na vytvoření initramfs (počáteční souborový systém RAM), což je dočasný souborový systém načtený do RAM v raných fázích spouštění a používá se k poskytování základních ovladačů a dalších zařízení, aby mohl být připojen kořenový souborový systém. Více informací naleznete na stránce Initrd Wikipedie. Příkaz potřebný pro tuto úlohu je update-initramfs (toto je vyvoláno také vždy, když je nainstalováno nové jádro, spouštěné správcem balíčků), který může vytvořit initramfs ( -c ) nebo aktualizovat existující ( -u ) . Úplný příkaz je

# update-initramfs -c -k  

Verze je ta, kterou uvidíte po dokončení 'make modules_install' (poslední řádek jejího výstupu bude „DEPMOD“). Pokud chcete mít přesné a delší číslo verze, můžete vývojářům říci, jaký „git moment“ které jste použili, vyberte „Obecné nastavení“ → „Automaticky připojit informace o verzi k řetězci verze“ po vydání menuconfig. Výstup na mém systému Ubuntu vypadá takto:

update-initramfs: Generating /boot/initrd.img-3.1.0-rc3+
...

Aktualizujte svůj Grub, aby si všiml vašeho nového jádra pomocí

# update-grub

Na mém testovacím počítači Debian vypadá výstup takto:

Generating grub.cfg ... 
Found background image: /usr/share/images/desktop-base/desktop-grub.png 
Found linux image: /boot/vmlinuz-3.0.0-1-amd64 
Found initrd image: /boot/initrd.img-3.0.0-1-amd64 
Found linux image: /boot/vmlinuz-3.0.0-rc6-amd64 
Found initrd image: /boot/initrd.img-3.0.0-rc6-amd64 
Found linux image: /boot/vmlinuz-2.6.39-07727-gbd1bfe4 
Found initrd image: /boot/initrd.img-2.6.39-07727-gbd1bfe4 
Found linux image: /boot/vmlinuz-2.6.39-2-amd64 
Found initrd image: /boot/initrd.img-2.6.39-2-amd64 
Found linux image: /boot/vmlinuz-2.6.39-rc7-amd64 
Found initrd image: /boot/initrd.img-2.6.39-rc7-amd64 
Found linux image: /boot/vmlinuz-2.6.38.5 
Found initrd image: /boot/initrd.img-2.6.38.5 
Found linux image: /boot/vmlinuz-2.6.38.4-00001-gfaa8ee7 
Found initrd image: /boot/initrd.img-2.6.38.4-00001-gfaa8ee7 
Found linux image: /boot/vmlinuz-2.6.38.4 
Found initrd image: /boot/initrd.img-2.6.38.4 
Found linux image: /boot/vmlinuz-2.6.38-2-amd64 
Found initrd image: /boot/initrd.img-2.6.38-2-amd64 
Found linux image: /boot/vmlinuz-2.6.32-5-amd64 
Found initrd image: /boot/initrd.img-2.6.32-5-amd64 
Found memtest86+ image: /memtest86+.bin 
Found memtest86+ multiboot image: /memtest86+_multiboot.bin 
done 

Váš výstup samozřejmě nebude vypadat úplně stejně, ale obrys by měl být stejný; nakonec si pamatujte:pokud chcete, upravte /etc/default/grub a změňte některé volby před update-grub a se zkříženými prsty restartujte počítač, abyste otestovali nové jádro.

Pokud se něco pokazí

Nejběžnější situace, kdy je vaše nové jádro nepoužitelné, je, že jej nemůžete nabootovat, nebo že se nabootuje a nemá nějaký základní ovladač (například síťové ovladače). Update-grub obvykle odvádí dobrou práci při psaní souboru nabídky grub, ale možná si to budete chtít prohlédnout. Pokud projdete grubem, je pravděpodobné, že jste příliš horliví a vybavili jste základní ovladač pro systém, jako jsou části související s diskem (ATA, SATA, SCSI…), nebo možná NFS, pokud máte kořenový adresář připojený na NFS. Spusťte funkční jádro a překonfigurujte jej pomocí Googlu a dalších možných zdrojů, jako je IRC .

Je pravděpodobné, že někdo již narazil na váš problém v minulosti a vy máte šanci najít odpověď. Pokud je problém vážnější a jste si jisti, že čtete o netiketě a o tom, jak posílat příspěvky do mailing listu jádra, pěkně se zeptejte. Je tam spousta milých a ochotných lidí, ale nebývají tak milí, když neuděláte svůj domácí úkol a/nebo ztrácíte čas. Pokud máte samostatný /boot, mějte na paměti, že obvykle není příliš velký a může se rychle zaplnit jádry. Také /lib/modules má tendenci hromadit spoustu místa v /, takže čas od času proveďte nějaké vyčištění. Pamatujte, že jádro je složitý software a kořenem vašich problémů může být mnoho příčin. Pokud jste při dodržování této příručky neměli žádné problémy, jste připraveni na pokročilejší konfiguraci jádra Linuxu.


Debian
  1. Jak nainstalovat Python 3.7 na Ubuntu, Debian a LinuxMint

  2. Debian – jak postupovat před duálním bootováním Windows 7 a Debianu na Efi?

  3. Proč Ubuntu potřebuje dvě jádra?

  1. Jak odstranit stará jádra na Ubuntu 16.04, 18.04 a 19.04

  2. Jak nainstalovat Monit (Monitorování procesů a služeb) na Ubuntu / Debian

  3. Jak zkompilovat a nainstalovat wxWidgets na Ubuntu/Debian/Linux Mint

  1. Jak nainstalovat Netflix v Kodi na Ubuntu a Debian

  2. Jak odstranit stará jádra na Ubuntu

  3. Jak nainstalovat a nakonfigurovat Webmin na Debian / Ubuntu