> obdobně lze předat i aktuálně používaný startovací RAMdisk
Jak tohle funguje? Myslel jsem, že při bootu se provede pivot_root z initramdisku do „skutečného“ systému a původní initramdisk (rozbalený i to co tam nahrál předchozí zavaděč) se uvolní.
Nový kernel nehledá v tomto případě initrd na souborovém systému (bez initrd nemusí mít holý kernel drivery, aby se dostal na storage, dokonce menusí mít ani moduly filesystémů), ale má ho už přednačtený v paměti bootloaderem nebo kexecem. A k předání informace, kde se initrd nachází, slouží paměťové struktury známé jako linux boot protocol ( https://www.kernel.org/doc/html/latest/x86/boot.html , pole initrd load address a initrd size).
Trochu jiná situace je u přímého zavedení kernelu z UEFI (bez bootloaderu), tam si kernel načítá initrd sám z ESP pomocí volání do UEFI (umístění initrd dostane kernel na cmdline, https://wiki.debian.org/EFIStub ).
Mně šlo právě o to, co předá příkaz kexec novému jádru při použití funkce --reuse-initrd
. Jenže teď, když se ponořuju hlouběji, nemůžu nikde tuhle volbu najít. Ovšem určitě jsem jí někde (vlevo dole) v manuálu viděl.
Tedy omluvám se za zmatek, zdá se, že volba na znovupoužití aktuálně běžícího RAMdisku přinejmenším v aktuální verzi kexecu není možná.
Ten parametr je bez pomlčky (--reuseinitrd), ale nefunguje na všech architekturách. Tam, kde funguje, nepotřebuje hledat žádný soubor, ale použije už načtený initrd, který v paměti stále je. Každopádně tohle bude asi už dost platform-specific (uvolňování nepotřebné paměti z doby bootu), proto to nefunguje všude.
Tak už jsem to našel, kexec hledá v /proc/cmdline, zdali byl kernel spuštěný s parametrem retain_initrd, pokud ano, tak se použije načtený initrd, jinak chyba:
Na dané architektuře pak musí být toto "vylovení" initrd navíc podporováno, pokud ne, defaultně takovou akci zamázne handler arch_reuse_initrd():