Initramfs hogyan?

Fórumok

Következőt szeretném. A /usr tartalma egy squashfs image-ben, ez felcsatolva /.usrfs/ro alá, a /usr üres. Van egy /.usrfs/rw alkönyvtár is, a kettőt szeretném merge-elni funionfs-sel valahogy emígyen:


/.usrfs/usr.squash     /.usrfs/ro      squashfs        loop,ro                                         0 0
funionfs#none          /usr            fuse            dirs=/.usrfs/ro=ro:/.usrfs/rw=rw,allow_other    0 0

A /etc/modules-load.d/usr.conf file-ba ezt írtam:

loop
squashfs
fuse

A /etc/dracut.conf.d/usr.conf file-ba pedig ezt:

add_drivers+=" loop fuse squashfs"

Mit kell tennem a dracuttal, hogy működjön az elképzelésem?

A pontos hibaüzenetre nem emlékszem, ismeretlen filerendszerre hivatkozott. Megpróbáltam azt is, hogy közvetlenül a squashfs image-et csatolja fel, ekkor talán a loop device-t hiányolta.

Az oprendszer Fedora 20, x86_64, sima desktop gép.

Hozzászólások

squashfs-nek a kernelben modulként kell lennie, nem beforgatva.
A loopdevice-ok száma gondolom jól van meghatározva.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

A squashfs modul, csak az nem teljesen világos nekem, hogyan indul a linuxom, mit kell reszelnem az initrd-n.

Tulajdonképpen az fstab értelmezőjét keresem, továbbá azt, hogy ez miként zajlik, mi kell hozzá. Egyáltalán script vagy bináris, bár eddigi nyomozásom szerint talán script csinálja.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

nekem ilyen soraim vannak az efestabban:

#cuccok:

/mnt/sqsh/usr-share-texmf.sqsh /usr/share/texmf squashfs ro,defaults 0 0
/mnt/sqsh/usr-lib-wine.sqsh /usr/lib/wine squashfs ro,defaults0 0
/mnt/sqsh/usr-share-wine.sqsh /usr/share/wine squashfs ro,defaults0 0
...és ebből van 30-40 db.
A /mnt/sqsh kártyaolvasón van, így cserélgethetem is. Ily módon mindig más rendszerem van látszólag.

Amit végső soron szeretnél, az pedig azt hiszem a SLAXnál megoldották, de sosem volt energiám, hogy jobban belemélyedjek. http://www.slax.org/hu/documentation.php Meg ha jól emléxem a Xandrosnál is valami hasonlót hoztak ki.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Nagyon klassz, érthető leírás világos ábrákkal az Internals fülön, köszönet érte! :) Igen, épp ilyesmit akartam, csak nem live-on, hanem desktopon. A squashfs-ig meg tudtam csinálni, működött is, a unionfs már nem. Tegyük hozzá, Fedorához nincs normális unionfs támogatás. :( Az mhddfs már élő rendszeren, néhány alkönyvtárral próbálgatva sem kegyeskedett működni, az funionfs igen, de a SELinux label-ek nem maradtak meg, ami probléma.

A Slaxban is használt aufs-ről azt olvasom, hogy elavult, Fedora kernel nem támogatja, és idővel kiszedik - vagy már ki is szedték? - a mainline kernelből.

Pedig egy ilyen unionfs felületesen szemlélve nem tűnik túl bonyolultnak, nem tudom, miért nincs normális, kernel által támogatott implementációja, vagy ha van, miért nem tudok róla. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A SLAX alapjaira építették a spanyolok a wifiway vagy néhol wifislax elnevezésű live verziót, ami ugyanezzel működik. De beleszerkesztettek valamit, amitől ezeket tudja pluszban:
--változtatások mentése (ezeket a következő bootoláskor mountolja)
--install to hdd.

Well, én jelenleg egy ilyen install to HDD-t használok egy netbúkomon. Persze angol-spanyol hibridnyelven, mert az divatos, különösen Giblaltárnál, ahol még ma sem dőlt el, kié a szoros meg az erőd :)

Azért kedvelem a slaxokat, mert slackware-alapúak, kompatibilisek az esetleges anomáliái a slackware-rel, és rengeteg jól elaberrált dolgot lehet belőlük tanulni, ami más distribben nincs jelen. Ráadásképpen minden laptopmba kerül egy sd kártya, amin 2 könyvtárban elfér egy ilyen slax. A kártya többi része meg másra használható, a slax nem ír rá semmit.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Van egy saját, Fedora alapú live-om. Abban megcsináltam a változások mentését, legalább is a $HOME-okra nézvést, meg még néhány file-ra, például, hogy lehessen root illetve felhasználói jelszót módosítani.

A lényeg annyi, hogy a /home-ot tmpfs-en RAM-ban hozom létre, kilépéskor meg $USER.tar.gz, illetve egy root.tar.gz file-t csinálok a RAM-disk-ről. A root.tar.gz-ben nem a /root van, hanem például a /etc/{passwd,shadow}, ilyenek.

Ugyanarra a pendrive-ra írom a mentést, amin a live image van. Ezt úgy tudom megtenni, hogy az image partíciós táblával együtt a pendrive első 1 GB-ja, utána hagyok helyet, hogy legyen hova híznia, majd a pendrive elejétől egy adott offsettel van egy filerendszerem. Az offset-et a scriptjeim tudják, loop device-nak offset mount paraméterként megadható, így ez a filerendszer nincs a partíciós táblában. Elvégre, ha tudom a helyét, nem kell partíciós tábla hozzá. :)

Itt van olyan alkönyvtár, amely root:root 0700-as jogú, ide menti a személyes adatok *.tar.gz file-jait. A hárommal korábbit törli, így ha valami baj van, manuálisan root joggal korábbi adatok még visszaszerezhetők.

Néha csinálok új image-et, amikor van új kernel, firefox, effélék.

Természetesen a rendszer változásainak mentésére alkalmas lehet egy ilyen unionfs rw könyvtárának mentése is.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Na, szóval buta dracut meg initramfs. Az van, hogy az fstab-ban a block device nekem egy squashfs image a /.usrfs/usr.squash elérési úton. Igen ám, de amikor az initramban vagyunk, a valódi rootfs az initramban egy /sysroot alá van csatolva. Amikor elemzi az fstab-ot, nem számít arra, hogy loop device-szal találkozik, így a /.usrfs/usr.squash elérési utat komolyan gondolja, ahelyett, hogy a /sysroot/.usrfs/usr.squash elérési utat használná.

Most ki kell találjam, hogy megoldás-e symlink, bind mount, vagy bármi. Mindenesetre az initram shelljéből manuálisan már tudtam boot-olni.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az funionfs-t nem tudom működésre bírni, helyesebben szólva az initram-ban nem. Még pontosabban mondva manuálisan megcsinálom a mount-ot, látom is a /sysroot/usr/bin alatt a file-okat, mondok neki egy exit-et az initram emergency shelljében, ekkor folytatná a boot-ot, a systemd meg azt mondja, nincs shell-je. Hiányolja a /bin/sh-t. Azt érdemes tudni, Fedorán a /bin egy symlink a /usr/bin-re, ezért van köze ennek a /usr-hez.

Most ott tartok, hogy csináltam az élő rendszer rootfs-ébe, azaz a /-be egy sysroot nevű symlinket, amely a /-re mutat. Az fstab-ban pedig /sysroot/.usrfs/usr.squash image-re hivatkozom. Ennek az a lényege, hogy az initramból is és a már élő rendszerből is megtalálja az image-et, hiszen az initramban valóban az az elérési út, a valós rendszerben a /sysroot -> / symlink miatt szintén jó lesz az image-re hivatkozás. Az fstab-ban egy

/sysroot/.usrfs/usr.squash                      /usr            squashfs        loop,ro         0 0

sor mondja meg a /usr mount pointhoz csatolást.

Így működik a gépem, csak nem ezt akartam, hiszen így read only lett a /usr. Az eredeti célom az lett volna, hogy squashfs-en a /usr tartalma a /.usrfs/ro helyen, de a frissítéskor történő változások a rootfs-en található /.usrfs/rw alkönyvtárba íródtak volna, s az ro és rw könyvtárak funionfs-sel lettek volna a /usr alá merge-elve.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A /etc/dracut.conf.d/usr.conf file-ba ezt írtam:

add_drivers+=" loop "
filesystems+=" fuse squashfs "
use_fstab="yes"
install_items+=" /bin/funionfs "

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az initramban ezeket a konfigfile-okat include-olják, szóval végső soron ezek shell utasításokként lefutnak. Eddig fel sem tűnt a bash-ben a += operátor, amellyel string végéhez lehet hozzáfűzni. Korábban így csináltam:

variable="${variable}string a végére"

de így is lehet:

variable+='string a végére'

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE