Először is nyugtassatok meg, hogy van ez a boot folyamat dolog annyira érdekes, hogy rászánhatom az időmet! Köszi... :-)
Ma végre volt kis időm, és megnézegettem, hogyan is dolgoznak a törpék az Ubuntu initramfs csodájában. Konklúzió: way fuckin' too much complicated, és itt még tudnék pár jelzőt írni. Főleg azok után, hogy szépen összehasonlítottam az Eee PC hasonló megoldásával. Talán ha ezeknek a mini fájlrendszereknek a méretét leírom, Ti is össze tudjátok gyorsan hasonlítani:
EeePC 1,2kbyte vs. Ubuntu 22,6 Mbyte (!), azaz 20x-os az Ubuntu túlsúlya.
Természetesen igazságtalan vagyok, hiszen az Eee hardvere minden esetben ugyanaz, ezért nem kell felkészülni mindenféle váratlan helyzetre, az Ubuntu pedig egy általános célú operációs rendszer. De nem csak sok drivert pakoltak az Ubuntuba, hanem lehetetlen módon el is bonyolították a dolgot! "Mint az közismert", az initramfs gyökerében lévő init szkript indul el először, és az futtat le mindenfélét.
Szokásos keretes írásom arról fog szólni, hogy hogyan lehet belekukkantani saját initrd-nk belsejébe. Keresgéljünk a /boot alatt! A grub menüjében (/boot/grub/menu.lst) benne van egy initrd=xxxxx sor is. Keressük meg azt a szekciót, amit jelenleg ki szoktunk választani a grub menüből (azaz a jelenleg futó kernelre vonatkozó paraméterek)! Ha nem szoktál semmit kiválasztani, akkor nagy valószínűséggel az első lesz az. :-) Szóval az a bizonyos xxxxx az initrd elérési útja és neve. Ha megvan, akkor másoljuk ki magunknak a fájlt egy kényelmes helyre. Ez a fájl gzip-pel tömörítve van, de a gzip addig nem foglalkozik velünk, amíg nem .gz a kiterjesztés. A kapott fájl pedig egy ún. cpio archívum, amelyet ha kibontunk, megkapjuk az egész kis fájlrendszert; /bin, /lib, stb. könytárakkal. Éppen ezért nehogy véletlenül rossz helyen (könyvtárban) legyünk a kicsomagoláskor! Ha rácsomagolunk a /bin-re, az nem túl egészséges.
bagoj@aranyhal:~$ mv initrd.img-2.6.24-16-generic initrd.img-2.6.24-16-generic.gz
bagoj@aranyhal:~$ gunzip initrd.img-2.6.24-16-generic.gz
bagoj@aranyhal:~$ cpio -i < initrd.img-2.6.24-16-generic
Nincs elírás, a gunzip leszedi a .gz kiterjesztést, és az a kacsacsőr nagyon is fontos! Anélkül a cpio állni fog és várni az idők végezetéig...
Ezek után máris lehet nézegetni a nyalánkságokat. ;-)
Mi ez a mindenféle? Aki ért a bash szkripteléshez, maga is megnézheti, a többi, szerencsésebb sorsú ember számára:
1. Kell nekünk egy / fájlrendszer, amin dolgozunk. Ez most az initramfs lesz, azaz az a mini fájlrendszer, amit a keretesben kicsomagolunk.
2. Kell egy /proc, /sys és /dev, ami szükséges ahhoz, hogy az eszközöket, perifériákat, folyamatokat lássuk.
3. Fel kell dolgozni a parancssori paramétereket. Aki itt már elismerően hümmög és sejti, hogy ezek a paraméterek a grub-ban megadott boot paraméterek, az nyert egy kakasos nyalókát.
4. El kell végezni azt a bizonyos munkát a modulok betöltésével, hiszen az initrd-nek ez a legfőbb feladata.
5. Át kell mozgatni a felcsatolt partíciókat a /root alá (ahogyan az előző postban írtam), hogy az igazi init program, minden programok szülőanyja megtalálhassa.
6. Át kell adni a vezérlést az igazi initnek.
Ezt az Eee PC-ben megoldották olyan 40 sorban, az Ubuntuban több száz sornyi kóddal. Azt mindenesetre kapisgálom, hogy mi volt eddig a probléma; és ennek megfelelően AZÉRT IS ki fogom gyökölni a unionfs szkriptemet, ugyanis egyre inkább meggyőződésem, hogy nagyon jó dologba tenyereltem bele. Hiszen mostanában nagyon terjednek a memóriakártyák és SSD merevlemezek, amelyek sok írást nem bírnak ki, ezért adódik hogy védjük őket. Nem utolsó sorban végre belemélyedtem az initramfs szépségeibe is, amiktől eddig a sors megóvott...
Most már hamarosan. Addig is írjatok, hogy mennyire érdekes a téma (de az az igazság, hogy rengeteg blogot látok, amelyik linkeket gyűjt, meg olyan is van, amelyik alkalmazásokkal foglalkozik. Viszont nehéz találni, főleg magyarul ilyesféle, rendszerközeli dolgokkal foglalkozó blogot. Ezért foglalkozom most ezzel a témával).
Mai napi bónusz annak, aki idáig még nem unja: A boot felgyorsításának az is remek módja (kernel újrafordítás nélkül!), hogy kigyököljük a kernel-fordítás post alapján, hogy milyen modulok kellenek nekünk; majd felrakjuk az initramfs-tools csomagot (ez kell az initrd újragenerálásához, ezt múltkor elfelejtettem írni), majd a /etc/initramfs-tools/initramfs.conf-ban megkeressük a MODULES=most sort, és átírjuk MODULES=list-re, majd ugyanebben a könyvtárban a modules fájlba felsoroljuk, hogy mi kell nekünk. Kevésbé bátrak válasszák a MODULES=dep opciót. A "most" ugye azt jelentené, hogy a legtöbb modult betölti, a "dep" kitalálja, mire van szükségünk, a "list" pedig csak azokat tölti be, amiket mi szeretnénk. Ne felejtsétek, hogy csak azok a modulok igazán szükségesek, amikre a boot-nak szüksége van! A többi modult be tudja tölteni a kernel később is, amikor szükség van rá.
Ezek után (rootként ám!):root@aranyhal~# update-initramfs -u
Ha valami nem jött össze, ne szigyjatok nagyon, hanem írjatok és akkor kitérek arra, hogyan mentsük meg a rendszert félhalott állapotból. :-)