Initramfs/Guide
Egyes Linux-alapú számítógépes rendszereknek a megfelelő módon történő indításához szükségük van az initramfs fájlra. Ez az útmutató az initramfs fájlok fogalmát tárgyalja, valamint leírja azok megfelelő létrehozásának és kezelésének a módját is.
Az initramfs fogalma
Bevezetés
Az egzotikus illesztőprogramokkal vagy beállításokkal rendelkező rendszereknek, vagy a titkosított fájlrendszereknek initramfs fájlra van szükségük, így a Linux kernel képes átadni a rendszert a bináris init program irányításának.
Linux rendszerindítási folyamat
Mihelyt a Linux kernel-nek kontrollja van a rendszer felett (amit megkap azáltal, hogy a rendszerindító boot loader betölti a memóriába magát a kernelt), előkészíti a saját memóriaszerkezetét és az illesztőprogramokat saját maga számára. Ezután átadja az irányítást egy olyan alkalmazásnak (általában az init-nek), amelynek feladata a rendszer tovább előkészítése és annak biztosítása, hogy a rendszerindítási folyamat végén az összes szükséges szolgáltatás fusson, és a felhasználó képes legyen bejelentkezni a rendszerbe. Az init alkalmazás ezt úgy hajtja végre, hogy elindítja többek között az udev szolgáltatást, aki tovább tölti be a rendszert, és elkészíti a rendszert az észlelt hardvereszközök alapján. Az udev elindításakor az összes fennmaradó fájlrendszer, amely még nem lett felcsatlakozva az mind felcsatlakozik, és a még el nem elindított szolgáltatások is elindulnak.
Azoknál a rendszereknél, ahol az összes szükséges fájl és eszköz ugyanazon a fájlrendszeren található, az init alkalmazás tökéletesen tudja vezérelni a további rendszerindítási folyamatot. Viszont, ha több fájlrendszert definiálunk (vagy egzotikusabb telepítéseket készítünk), akkor ez kissé trükkösebbé válhat:
- Ha az /usr partíció külön fájlrendszeren van, akkor az eszközök és illesztőprogramok, amelyeket a /usr könyvtárban tároljuk, csak akkor használhatóak, ha alapból már elérhető a /usr könyvtár. Ha ezekre az eszközökre/illesztőprogrokra szükség van, hogy el tudjuk érni a /usr könyvtárat, akkor nem tudjuk indítani a rendszert. (Fordítói megjegyzés. Magyarul: A /usr könyvtárat el akarjuk érni egy külső SSD-n, de az SSD eléréséhes szükséges illesztőprogram is rajta van a most még nem elérhető SSD-n. Ilyen esetben nem tudunk onnan semmit betölteni).
- Ha a gyökérfájlrendszer titkosítva van, akkor a Linux kernel nem fogja megtalálni az init alkalmazást, ami a nem bootolható rendszert fogja eredményezni.
A probléma megoldása már régóta az initrd (a kezdeti root eszköz) használata.
A kezdeti root lemez
Az initrd egy memóriában lévő lemez-struktúra (ramdisk), amely tartalmazza a szükséges eszközöket és szkripteket a szükséges fájlrendszerek felcsatolásához, mielőtt a vezérlés a gyökérfájlrendszerben lévő init alkalmazásnak lenne átadva. A Linux kernel triggereli a beállítás szkriptet (általában linuxrc néven nevezik, de ez a név használata egyáltalán nem kötelező) ezen a gyökérlemezen, amely aztán előkészíti a rendszert, majd átvált a valódi gyökérfájlrendszerre, majd meghívja az azon lévő init -et.
Bár csak az initrd módszerre volt szükség, van néhány hátránya is:
- Ez egy teljes értékű blokk eszköz, amely megköveteli egy teljes fájlrendszer többletköltségét: Rögzített méretű. A túl kicsi méretű initrd választása esetében nem fér el rajta minden szükséges szkript. Túl nagy méretűre is választható ami viszont pazarolja a memóriát.
- Mivel ez egy valódi, statikus eszköz, ezért a Linux kernelben lévő gyorsítótár memóriát fogyasztani fogja, és hajlamos a memóriabeli és fájlkezelési módszerek használatára (például a lapozásra), amely metódusok ezáltal az initrd fájlstruktúrát nagyobbá teszik a memóriafogyasztás szempontjából nézve.
Ezeknek a problémáknak a megoldására jött létre az initramfs.
Az initial ram fájlrendszer
Az initramfs egy kezdeti ram (initial ram) fájlrendszer, amely tmpfs-en alapul (méretbeli-rugalmasság, memóriában lévő könnyűsúlyú fájlrendszer), amely szintén nem használ külön blokk eszközt (tehát nem végez gyorsítótárazást, és az összes korábban említett általános költség eltűnik). Csakúgy, mint az initrd, az initramfs is tartalmazza azokat a eszközöket és szkripteket, amelyek szükségesek a fájlrendszerek felcsatolásához, mielőtt a valódi gyökérfájlrendszeren beindulna az init bináris alkalmazás. Ezek az eszközök lehetnek a dekódolást végző absztrakciós rétegek (a titkosított fájlrendszerek visszafejtése érdekében), a logikai kötetkezelők, szoftver RAID, Bluetooth eszközillesztőn alapuló fájlrendszer-betöltők stb.
Az initramfs fájl tartalmát cpio archívum létrehozásával készítik. A cpio program egy régi (de jól bevált) fájlarchiváló megoldás (és a vele elkészített archív fájlokat cpio fájloknak nevezzük). A cpio program határozottan összehasonlítható a tar archiváló programmal. Azért esett a választás a cpio használatára, mert könnyebb volt azt kivitelezni (kódolási ajánlás alapján) és támogatta az eszközfájlok létrehozását, amelyeket a tar abban az időben nem támogatott.
Az összes fájlt, eszközöket, könyvtárakat, konfigurációs beállításokat (ha alkalmazható) stb. a cpio archívumba belerakják. Ez az archívum ezután a gzip segédprogrammal tömörítve lesz, és a Linux kernel mellett lesz tárolva. A rendszerbetöltő (boot loader) ezután a rendszerindításkor felajánlja a a Linux kernelnek ezt a cpio archívumfájlt, így a kernel tudja, hogy egy az initramfs -ra szüksége van.
Az észlelés után a Linux kernel létrehoz egy tmpfs fájlrendszert, kibontja rajta az archívum tartalmát, majd elindítja a tmpfs fájlrendszer gyökerében található init szkriptet. Ez a szkript ezután felcsatolja a valódi root fájlrendszert (miután megbizonyosodott arról, hogy fel tudja csatolni, például további modulok betöltésével, titkosítási absztrakciós réteg előkészítésével stb.), és a létfontosságú egyéb fájlrendszereket (például /usr és /var) is felcsatolja.
Miután a root fájlrendszer és a többi létfontosságú fájlrendszer fel van csatolva, a init szkript az initramfs a valódi root fájlrendszerre vált, és végül meghívja a /sbin/init alkalmazást a rendszeren a rendszerindítási folyamat folytatása érdekében.
Egy initramfs létrehozása
Bevezetés és rendszerbetöltő konfiguráció
Az initramfs létrehozásához fontos tudni, hogy milyen további illesztőprogramokra, szkriptekre és eszközökre lesz szükség a rendszer indításához.
A root lemeznek és a root fájlrendszernek elérhetőnek kell lennie.
A gyakorlatban ez általában azt jelenti, hogy a CONFIG_SATA_AHCI vagy a CONFIG_BLK_DEV_NVME (a lemezhez), és a CONFIG_EXT4_FS (a fájlrendszer) ideális esetben beépíthető [=y] a kernelbe. Ellenkező esetben ezeknek moduloknak [=m] szükséges lenniük azért, hogy ezeket a modulokat először az initramfs töltse be, hogy a rendszerindítás folytatódni tudjon.
Ha az LVM használva van, akkor az initramfs fájlban az LVM eszközökre szükség lesz.
Ha szoftveres-RAID van használva, akkor az mdadm segédprogramokra lesz szükség, vagy a DMRAID, ZFS, BTRFS stb. használata is itt megfontolandó.
Számos olyan automatizált eszköz létezik, amelyek segítenek a felhasználóknak az initramfs fájlok (tömörített cpio archívumok) létrehozásában a rendszerükhöz. A leggyakrabban használják a dracut és a genkernel. Azok, akik a teljes vezérlést akarják, manuálisan is könnyen létrehozhatnak személyre szabott, egyedi initramfs képfájlokat.
A létrehozás után a bootloader (a rendszerbetöltő) konfigurációját kell még beállítani, hogy tájékoztatva legyen maga a rendszerbetöltő az initramfs fájl használatáról.
Ez általában a konfigurációs fájl újragenerálásával történik grub-mkconfig -o /boot/grub/grub.cfg
Például, ha az initramfs fájlt a /boot/initramfs-5.15.32-gentoo-r1.img néven tárolják, akkor utána a GRUB rendszerbetöltő programnak a /boot/grub/grub.cfg konfigurációs fájlja valahogy úgy néz ki, mint a következő példában:
title Gentoo Linux 5.15.32-r1
set root='hd1,gpt2'
linux /boot/vmlinuz-5.15.32-gentoo-r1-x86_64
initrd /boot/initramfs-5.15.32-gentoo-r1-x86_64.img
A genkernel használata
A Gentoo kernelépítő segédprogramja (a Genkernel) felhasználható egy initramfs előállításához. A genkernel program azt várja, hogy mind a kernel fájlt, mind az initramfs fájlt ö maga hozza létre. Bár egyes esetekben a genkernel által létrehozott initramfs fájlok egy másik módszer által létrehozott kernellel lehet, hogy együtt tudnak működni, de ez a megoldás nem javasolt.
Annak érdekében, hogy genkernel programot használni tudjuk az initramfs előállításához ajánlatos az összes szükséges illesztőprogramot és kódot amelyre szükség van felcsatolni a / root és /usr elérési útvonalakra, hogy beépítve legyenek a kernelbe (tehát nem modulokként). Ha ezek be vannak közvetlen építve, akkor a genkernel futtatható a --no-ramdisk-modules
opcióval.
Ha a modulok szükségesek az initramfs-ben, akkor futtassa meg a genkernel parancsot az alábbiak szerint:
root #
genkernel --install initramfs
A rendszerünktől függően egy vagy több opcióra is szükség lehet a következő lehetőségek közül:
Opció | Leírás |
---|---|
--disklabel
|
A /etc/fstab fájlban lévő LABEL= beállítások támogatásának a hozzáadása.
|
--dmraid
|
A hamis hardveres-RAID támogatás hozzáadása. |
--firmware
|
A rendszeren talált firmware kódok támogatásának a hozzáadása. |
--gpg
|
A GnuPG támogatás hozzáadása. |
--iscsi
|
A iSCSI támogatás hozzáadása. |
--luks
|
A LUKS titkosító konténerek (LUKS encryption containers) támogatásának hozzáadása. |
--lvm
|
Az LVM támogatás hozzáadása. |
--mdadm
|
A szoftveres-RAID támogatás hozzáadása. |
--multipath
|
A többszörös I/O hozzáférés a SAN irányába támogatás hozzáadása. |
--zfs
|
A ZFS fájlrendszer-támogatás hozzáadása. |
Ha kész, az eredményül kapott initramfs fájl, akkor a /boot könyvtárban lesz eltárolva.
A dracut használata
A Dracut segédprogram kizárólag az initramfs fájlok kezelését szolgálja.
A Dracut segédprogram telepítéséhez futtassa:
root #
emerge --ask sys-kernel/dracut
A következő lépés a dracut beállítása az /etc/dracut.conf fájl szerkesztésével.
A beállítás után hozzon létre egy initramfs fájlt a dracut meghívásával az alábbiak szerint:
root #
dracut
A legenerált képfájl támogatja az általános rendszer betöltéseket az /etc/dracut.conf konfigurációja alapján. Lehetőség van egy olyan initramfs előállítására is, amelyet kifejezetten egy egyedi rendszerhez igazítanak (a dracut megpróbálja felismerni a szükséges eszközöket, és illesztőprogramokat stb. a meglévő rendszerből). Ha a modulok és az illesztőprogramok beépülnek a kernelbe (nem külön modulokként és a firmware-re való hivatkozásként), akkor a --no-kernel
opció hozzáadható:
root #
dracut --host-only --no-kernel
További információért tekintse meg a dracut és a dracut.cmdline kézikönyv oldalait:
user $
man dracut
user $
man dracut.cmdline
További olvasnivaló a témában
- Initramfs — is used to prepare Linux systems during boot before the init process starts.
- Initramfs - make your own — build an initramfs which does not contain kernel modules.
- Custom Initramfs — the successor of initrd. It provides early userspace which can do things the kernel can't easily do by itself during the boot process.
- Early Userspace Mounting — how to build a custom minimal initramfs that checks the /usr filesystem and pre-mounts /usr.
Külső források
- A ramfs-rootfs-initramfs.txt fájl a Linux kernel dokumentációban.