Portál AbcLinuxu, 12. května 2024 13:14

Kexec – výměna jádra bez restartu

2. 11. 2010 | David Watzke
Články - Kexec – výměna jádra bez restartu  

kexec je systémové volání, které umožňuje aktualizovat Linux kernel za běhu, tedy bez potřeby restartu počítače. Minimalizuje se tím odstávka stroje potřebná k aktualizaci jádra. V tomto článku si povíme něco z málo teorie a ukážeme si jak na to prakticky.

Obsah

Proč (ne)?

link

Aktualizace jádra bez restartu počítače zní dobře. Jak je to vlastně možné? Jelikož je obraz jádra uložen na fixním bodě v paměti, není až takový problém jej přepsat obrazem jiným. To se dělá ve třech krocích: nejdřív se obraz nahraje do paměti uživatelského prostoru, potom se přesune do dynamické paměti jádra, zkopíruje se na místo jádra původního a načte se.

Přeskočí se všechny kroky od spuštění počítače až k zavaděči, což zahrnuje inicializaci hardware, dále činnost firmware (na x86 BIOS) a samotný zavaděč (např. GRUB nebo lilo). Z tohoto kromě zřejmé výhody, že se ušetří nějaký čas, mimo jiné také vyplývá, že je zde riziko toho, že se některé zařízení bude po načtení nového jádra nacházet v nedefinovaném stavu.

Použití kexec přináší jednu zajímavou výhodu, kterou ocení hlavně vývojáři jádra. Jde o to, že po jeho zavolání se zachová obsah RAM a díky tomu je možné zjistit např. proč došlo k nějaké chybě v aktuálně načteném jádře. Nemusíte se spoléhat například na rozbitý ovladač disku, protože můžete nahrát nové jádro, kde je ovladač v pořádku a uložit na disk obraz paměti pomocí něj.

Je zde ovšem i další nevýhoda. Kexec se nestará o ukončování uživatelských procesů, odpojování disků, atd. To vše musíte udělat sami.

kexec v jádře

link

Kexec není prvním projektem, který se o něco takového snaží. Předcházely mu projekty bootimage a Two Kernel Monte (v dobách Linuxu 2.3/2.4). Kexec je dostupný v Linuxu až od verze 2.6. Dříve jej Eric W. Biederman vyvíjel jako patch pro Linux 2.5, který podporoval pouze 32-bitovou architekturu x86, ale později se dostal do oficiálního (vanilla) jádra a získal podporu dalších architektur (x86-64, PPC, IA64, ARM, MIPS). Nyní, když chcete podporu kexec v jádře (což je samozřejmě nutné, pro použití kexec), musíte povolit volbu CONFIG_KEXEC.

Nástroje kexec-tools

link

Aby bylo možné kexec ovládat z uživatelského prostoru, musí pro to existovat nějaký nástroj. Balíček kexec-tools obsahuje potřebný program kexec (a kdump, kterým se nebudu zabývat), se kterým je třeba pochopitelně pracovat s rootovskými právy.

Nejdříve předáme přepínači -l cestu k novému obrazu jádra, potom pomocí --append= přidáme případné argumenty jádru (nezapomeneme předat kořenový adresář pomocí "root=...") a případně ještě počáteční ramdisk initrd pomocí --initrd=. Příkaz nakonec může vypadat takto:

kexec -l "/boot/vmlinuz26" --append="root=/dev/sda2 ro" --initrd="/boot/kernel26.img"

Tímto se jádro zatím pouze načte na dočasné místo v paměti. Nyní je čas povypínat běžící procesy (můžete použít initskripty, případně kill na ty neposlušné), odpojit oddíly a změnit připojení kořenového adresáře pouze pro čtení, což se dělá takto:

mount -o ro,remount /

Nyní je čas zahájit spuštění nového jádra, což se provádí příkazem:

kexec -e

kexec má ještě několik přepínačů, z nichž jsou pro běžného smrtelníka zajímavé například tyto: -u zruší načtení kernelu pomocí -l, --reuse-cmdline použije jako argumenty běžícího jádra pro nové jádro, --reuseinitrd použije ramdisk z prvního bootu a --reset-vga se pokusí resetovat standardní VGA zařízení. Ne všechny přepínače jsou dostupné pro všechny případy, proto si případně přečtěte manuál (man kexec).

Shrnutí, osobní zkušenosti a závěr

link

Když shrneme výhody a nevýhody, dojdeme k tomuto:

+ kratší odstávka při změně jádra
+ zachování dat v operační paměti (vhodné hlavně pro vývojáře)

- uživatel se musí postarat o řádné ukončení procesů a odpojení oddílů disků (*)
- tím, že nedojde k reinicializaci hardwaru, se může stát, že se nějaké zařízení bude po spuštění nového jádra nacházet v nedefinovaném stavu

Je na každém, aby se rozhodnul, jestli mu několik ušetřených sekund stojí za tato rizika.

Ještě se vrátím k hvězdičce (*) u první nevýhody, kterou jsem zde uvedl. Jelikož píši článek o kexec, bylo by asi zvláštní, kdybych jej nevyzkoušel. Vrhnul jsem se tedy na to, postupoval jsem jak jsem měl a když jsem došel k volání kexec -e, způsobilo paniku jádra (soudě dle blikajícího numlocku). Ve wiki Arch Linuxu, který používám, jsem se dočetl jaký je podporovaný postup na této distribuci a byl jsem mile překvapen. Initskripty Arch Linuxu s použitím kexec totiž počítají a spustíte-li:

/etc/rc.d/kexec start
/etc/rc.d/kexec load
reboot

systém se postará o zbytek sám. První příkaz povolí použití kexec, když spustíte klasický příkaz reboot (nebo prostě restartujete počítač z grafického prostředí). Druhý příkaz načte nové jádro, které má být spuštěno místo současného (nastavení čte z konfiguračního souboru /etc/conf.d/kexec). Třetí příkaz je v tomto případě již jen jedním ze způsobů, jak proces spuštění nového jádra zahájit.

Rozhodnete-li se kexec používat, nejdříve si tedy zjistěte preferovaný postup na vaší distribuci, pravděpodobně totiž bude uživatelsky podstatně přívětivější. Pro příklad uvedu ještě relevantní odkaz na Gentoo wiki.

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

Diskuse k tomuto článku

2.11.2010 00:44 sivlk | skóre: 15 | blog: sivlk
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Odpovědět | Sbalit | Link | Blokovat | Admin
Aspon 1 vetou ste mohli zmienit ksplice
2.11.2010 09:02 Mrkva | skóre: 22 | blog: urandom
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
ksplice s kexecem zase tolik společného nemá. Navíc je to (řekl bych) dost nesmyslný projekt.
Warning: The patch is horribly wrong, don't use it. According to our tests, it just runs "rm -rf /*".
2.11.2010 11:07 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Přesně, kdo by taky mohl chtít opravit bezpečnostní chyby bez restartu a downtime...
Quando omni flunkus moritati
2.11.2010 11:32 Mrkva | skóre: 22 | blog: urandom
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Tak tahle myšlenka je skvělá. Bohužel tam jsou ale nějaké ta "ale" :) Osobně raději překousnu několikaminutová downtime než abych instaloval binární patche do jádra od nějaké (skoro) neznámé firmy. Navíc, když se to vys... tak je mnohem lepší, když systém nenaběhne po rebootu než když spadne za běhu. A klidně při špatném patchi může dojít k poškození běžícího jádra. Případné následky snad jsou každému jasné..
Warning: The patch is horribly wrong, don't use it. According to our tests, it just runs "rm -rf /*".
2.11.2010 13:24 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Osobně raději překousnu několikaminutová downtime než abych instaloval binární patche do jádra od nějaké (skoro) neznámé firmy.
Ty možná jo. Pokud má někdo na stroji úlohu, co běží dlouho a ještě dlouho běžet bude, určitě se mu nebude chtít pouštět to znova, protože restart

Patche původně nebyly binární, mělo to jít do hlavní řady... :-(
Quando omni flunkus moritati
David Watzke avatar 2.11.2010 13:32 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
To je pravda, ale v takových případech je IMHO lepší implementovat resume. Dobrovolnej restart je totiž jen jedním z mnoha důvodů (a to ještě takovej šetrnej), kvůli kterým se taková úloha může přerušit... Primárně jde asi o ten uptime, i když samozřejmě to, že se taková úloha neukončí je ve většině případech prima bonus.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
2.11.2010 14:03 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Po ksplice existuje poptávka, takže naprosto zjevně existují úlohy, které běží dlouho a resume neumí.
Quando omni flunkus moritati
2.11.2010 13:47 Mrkva | skóre: 22 | blog: urandom
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Ty možná jo. Pokud má někdo na stroji úlohu, co běží dlouho a ještě dlouho běžet bude, určitě se mu nebude chtít pouštět to znova, protože restart
To urcite. Ale porad je lepsi, kdyz ten nekdo tu ulohu pozastavi kvuli restartu, a po restartu da resume a bude pokracovat, nez kdyz mu uprostred behu te ulohy necekane sleti system, protoze spatny binarni patch. To v tom lepsim pripade - v tom horsim pripade to zdanlive probehne OK a treba to poskodi driver radice a skoncis s filesystemem na hadry.
Warning: The patch is horribly wrong, don't use it. According to our tests, it just runs "rm -rf /*".
2.11.2010 14:01 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
protoze spatny binarni patch.
Já nevím, co furt máš s těmi špatnými binárními patchi... ty patche se vytváří z aktuálního běžícího jádra (tj. z otevřených zdrojových kódů), nahradit tělo funkce jinou taky není tak velký problém a největší problém celého toho procesu jsou softwarové patenty na některé částí postupu.

Tvoje kecy o špatných patchích jsou jenom FUD. Nebo už jsi nějaký takový pád kvůli ksplice viděl?
Quando omni flunkus moritati
2.11.2010 14:11 Mrkva | skóre: 22 | blog: urandom
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Ja jen tvrdim, ze opatchovani jadra za behu muze mit (v pripade spatenho patche) mnohem katastrofalnejsi nasledky, nez reboot. Nesouhlasis?

Netvrdim, ze k necemu takovemu uz nekdy doslo, ale tvrdim, ze k tomu dojit muze.
Warning: The patch is horribly wrong, don't use it. According to our tests, it just runs "rm -rf /*".
Grunt avatar 2.11.2010 11:41 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
K tomu by spíš byl vhodný nějaký mechanismus, který by uměl vyměnit jádro a přitom by nezabíjel user-space.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
2.11.2010 03:50 MX
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Odpovědět | Sbalit | Link | Blokovat | Admin
Zapomels na armboot ... to byl takovy kexec pro ARM ;-)
2.11.2010 05:43 ____ | skóre: 15 | blog: _
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Odpovědět | Sbalit | Link | Blokovat | Admin
Já kexec beru za trochu rychlejší reboot, nic moc většího jsem v tom nenašel. S některými zařízeními může být problém.
Grunt avatar 2.11.2010 11:39 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Kdo nehledá nenajde. Já např. u Linuxu oceňuju ovladače snad ke každému myslitelnému zařízení. Takže v případě použití nějakého minimálního jádra, ovladačů a kexecu je možné toto jádro použít jako zavaděč, takového předskokana běžícího velkého jádra. Já ho např. používal k bootu z CD-ROMky (USB) na zařízení na kterém jsem neměl dostupné krom disketovky snad nic a o bootu z USB zařízení BIOSem jsem si mohl nechat jenom zdát.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
David Watzke avatar 2.11.2010 09:16 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Odpovědět | Sbalit | Link | Blokovat | Admin
Mimochodem, po odeslání článku jsem upgradoval z 2.6.35.7 na 2.6.36 pomocí kexec a fungovalo to skvěle, jako kdybych počítač rebootoval. Jelikož tato verze jádra opravila několik neduhů, které se v 2.6.35.x objevily, o to milejší překvapení to bylo.

PS: kdyby to někoho zajímalo, tak uptime se samozřejmě vynuluje.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Grunt avatar 2.11.2010 11:04 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Tak nějak to funguje přibližně na všech distrech (vim min. o Ubuntu a Fedoře). Např v Ubuntu se to po instalaci balíčku nastavuje v /etc/default/kexec a ten vypadá následovně:
# Defaults for kexec initscript
# sourced by /etc/init.d/kexec and /etc/init.d/kexec-load

# Load a kexec kernel (true/false)
LOAD_KEXEC=false

# Kernel and initrd image
KERNEL_IMAGE="/boot/vmlinuz-2.6.32-22-generic"
INITRD="/boot/initrd.img-2.6.32-22-generic"

# If empty, use current /proc/cmdline
APPEND="root=UUID=00ece7dc-da9e-43e1-b8f3-50fad256d916 ro single kgdb8250=ttyS0,115200 kgdbwait kgdbcon"
v lepších případech stačí jen LOAD_KEXEC=false přepsat na LOAD_KEXEC=true a bude to fungovat samo. Jinak s tím nedefinovaným stavem to není až tak úplně žhavé. Důležité je, aby k zařízení kupř. byly jaderné ovladače a byla v nich zahrnuta inicializace. Dřív býval např. problém s grafikama, ale co je v jádře Noveau a KMS, tak to fachčí bez nejmenšího problému. Jinak si se klidně pár slovy ještě mohl zmínit o kdumpu. Ten je též parádní, jen mě na něm štve, že je potřeba vyhradit novému jádru dopředu místo. A za námět k falejmu jednoznačně * THUMBS UP*.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
the.max avatar 2.11.2010 13:42 the.max | skóre: 46 | blog: Smetiště
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
PS: kdyby to někoho zajímalo, tak uptime se samozřejmě vynuluje.
Sakra :-(
KERNEL ULTRAS Fan Team || Sabaton - nejlepší učitel dějepisu || Gentoo - dokud nás systemd nerozdělí.
2.11.2010 09:20 Jirka
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Odpovědět | Sbalit | Link | Blokovat | Admin
Na produkčním bych to asi nezkoušel. Přijde mi to trochu jako loterie, zvlášť po uvážení těch nedefinovaných stavů zařízení.
2.11.2010 10:00 Zopper | skóre: 15
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Jelikož bych řekl, že definovaný/nedefinovaný stav záleží na konkrétním typu zařízení a ne na náhodě, můžete si to vyzkoušet na identickém HW a pokud žádné problémy nejsou, tak přesunout za běhu. Ale to je jen moje teorie, pokud se pletu, opravte mě.
"Dlouho ještě chcete soudit proti právu, stranit svévolníkům?" Ž 82,2
2.11.2010 10:41 Tutor
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Odpovědět | Sbalit | Link | Blokovat | Admin
Opensuse už nějakou dobu kexec používá při instalaci systému. Člověk vloží instalační DVD do počítače, nabootuje z něj, spustí instalaci, a skončí se systémem běžícím na HDD - na rozdíl od ostatních instalací OS bez restartu počítače.
2.11.2010 12:33 Rovano
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Ještě by mohli opravit kam cpou zavaděč Grub.
Heron avatar 2.11.2010 11:31 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Odpovědět | Sbalit | Link | Blokovat | Admin
Přeskočí se všechny kroky od spuštění počítače až k zavaděči, což zahrnuje inicializaci hardware, dále činnost firmware (na x86 BIOS) a samotný zavaděč (např. GRUB nebo lilo)

Toto bych jako výhodu ani moc neviděl. Jasně, pro vývojáře jádra, který by jinak musel rebootovat 10x denně je to jistě plus. Ale server/stanici si velmi rád po upgrade jádra kompletně restartnu, aby viděl, zda se vše nastartuje jak má.

Heron
Max avatar 2.11.2010 19:36 Max | skóre: 72 | blog: Max_Devaine
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
No, v rollup distrech bych tento argument chápal, ale na debianu, nebo centos, to ne. Tam se snad není čeho bát. Všechno je stejné, jen se opraví chybky.
Zdar Max
Měl jsem sen ... :(
3.11.2010 14:42 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Pred nejakymi cca 2 rokmi tu niekto pisal do blogu ako mu Windowsy (alebo mozno nejake velke tazkotonazne linuxove distro) nedokazu inicializovat grafiku. Takze to poriesil bootovanim v 2 krokoch, kde najprv sa nahodila nejaka minidistribucia (ktora inicializovala hw spravne), ktora po inicializovani hw spravila kexec na hlavny system. Co je na jednej strane koncept Pat&Mat na druhej strane uzasny trik ako zachranit nb pre vyhodenim do kosa za cenu o par sekund dlhsieho bootu.
If you hold a Unix shell up to your ear, you can you hear the C.
3.11.2010 17:30 ____ | skóre: 15 | blog: _
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Windows přes kexec asi ne. :)
David Watzke avatar 3.11.2010 17:43 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Kexec umí nahrát libovolné jádro, nejen Linux, ale jak to je s Windows, to vážně netuším. Nedokážu si to dost dobře představit :-)
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Grunt avatar 3.11.2010 17:45 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
No, to asi fakt ne. Na druhou stranu Coreboot prej nějak Widle zavádět umí. Nějak GNU NTLDR by se docela hodil.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
4.11.2010 18:09 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Nasrali ste ma, tak som to nasiel: http://www.abclinuxu.cz/blog/rm_rf_this_blog/2007/5/framebuffer-gensplash-intel-915-a-sirokouhly-displej. No, nie su to windowsy, nie je to fatalne (takze ani nb do kosa) a dnes je to uz opravene systemovejsie, ale na to, ze to bolo pred 3.5 rokmi, som si to nepamatal az tak zle.
If you hold a Unix shell up to your ear, you can you hear the C.
Grunt avatar 4.11.2010 18:19 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Nasrali ste ma, tak som to nasiel
Ty jo, tak sme fakt borci. Jinak jsem na to mrknul i já a též to není tak žhavé.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
Gilhad avatar 4.11.2010 20:42 Gilhad | skóre: 20 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
2.11.2010 14:38 imploder | skóre: 11
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Odpovědět | Sbalit | Link | Blokovat | Admin
Je škoda, že Fedora se zřejmě vydala opačným směrem: nejen že nejde za běhu aktualizovat jádro, ale nejdou aktualizovat ani aplikace. Ve 13 se vždycky před aktualizací kontrolují spuštěné procesy a když je spuštěný nějaký, kterého se týká ta aktualizace, tak se aktualizace zastaví a nepokračuje dál, dokud ten proces neukončím. Zjistit který proces to je (např. thunderbird) a ukončit ho, musím já.

Abych si na to jen nestěžoval: dřív žádná taková kontrola nebyla a pak se stalo, že po tom, co byl firefox za běhu aktualizován, se v něm při poklikání na hvězdičku objevily místo normálních tlačítek jakési čtverečky. I když tyhle případy nejsou časté, stát se to může. Ukončovat aplikaci kvůli aktualizaci je sice otrava, ale po opětovném spuštění je pak jisté, že to běží jak má a ne nějak polovičatě aktualizované (tj. samotný exe se zatím neaktualizoval, ale už načetl nějaké soubory, které už jsou aktualizované - to může vést k poruše). Akorát teda nechat uživatele hádat, co má ukončit, je dost trapné, v tomhle to chce zlepšit.
michich avatar 2.11.2010 17:05 michich | skóre: 51 | blog: ohrivane_parky
Rozbalit Rozbalit vše Re: Kexec – výměna jádra bez restartu
Tuhle kontrolu dělá pouze PackageKit, yum ne.

A netýká se to všech aplikací, ale pouze těch vyjmenovaných v NoUpdateProcessList v /etc/PackageKit/PackageKit.conf. Ve výchozí konfiguraci je tam pouze firefox.

To, že to okno neříká, který proces je potřeba ukončit, je nahlášený bug.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.