Live linux pendrivera

Van nekem egy régi, 128MB-os pendriveom, amit a mérete miatt az utóbbi években már nem igazán használtam semmire. Mivel ez zavart, elgondolkoztam, mit is lehetne vele kezdeni, és kitaláltam, hogy rakok rá egy live linuxot. Csakhogy a legtöbb live linux nem fér el egy ekkora pendriveon, ami meg igen, az csak recovery utilityket tartalmaz. Így elhatároztam, hogy saját rendszert építek.

A következő követelményeket állítottam fel magammal szemben:

  • minimum X legyen rajta
  • legyen moduláris (ha már egyszer a pendrive rw device) és könnyen karbantartható

Arra jutottam, hogy csak akkor fér rá az X, ha tömörítem a rendszert és futás előtt ramdiskbe tömörítem ki. Viszont ha a teljes rendszert egy image-be tömörítem, oda a modularitás. De ha választok egy bináris csomagokkal dolgozó disztribúciót, és a megfelelő csomagjait tárolom a pendriveon amit initrd-ből telepítek a ramdiskbe, az biztosítja a modularitást is, és akár az X is elfér. Persze a módszer hátránya, hogy sokáig fog tartani a boot, de a gyors boot nem is volt szempont.

Amit eddig leírtam, azt elég régen kitaláltam már, csak sajnos a kiválasztott disztribúció (Frugalware) összeválogatott csomagjai épphogy nem fértek el a pendriveon. Viszont amikor váltottak xz alapú csomagokra az 1.3-as verzióval, annyival jobb lett a tömörítési arány, hogy már elfértek a csomagok a pendriveon. Így végül be tudtam fejezni a projectet (már csak akaraterőt kellett hozzá gyűjteni :)).

Megvalósítási terv:

  1. először teszek egy boot managert a pendrivera
  2. majd egy virtuális gépben összerakom a rendszert
  3. majd készítek egy initrd-et ami elvégzi boot közben a csomagok telepítését a pendriveról
  4. majd írok pár scriptet ami kényelmessé teszi a pendrive használatát
  5. végül átrakom az egészet a pendrivera és kijavítom az esetleges hibákat

Megvalósítás:

  1. Itt egy picit csaltam, mert a pendriveon már telepítve volt egy minimális freedos, ugyanis mai napig képesek a hardware gyártók a bios és firmware frissítéseket dos-hoz adni. Régen a loadlin-nel lehetett dos alól linuxot bootolni, a mai kernelekkel viszont nem működik. Semmi gond, mert van linld, ami tökéletesen működik. (Bár a linld-t később találtam, először syslinux-szal oldottam meg a problémát pár hack árán, ezt most nem fejteném ki.)
  2. VMware-ben viszonylag kényelmesen feltelepítettem és bekonfiguráltam egy minimális rendszert, amiben már van X. Gyakorlatilag egyesével kellett a csomagokat összeválogatni, mert még a base groupból se került rá minden a pendrivera a helyspórolás miatt.
  3. Na ez egy nehezebb téma volt, sok utánaolvasást és hackelést kívánt a dolog, de végül semmilyen probléma nem maradt megoldatlan. Manapság érdemes initramfs-t használni (itt tenném hozzá, hogy mindenhol máshol initrd-et írok megszokásból, initramfs értendő alatta), ami egy tömörített cpio image. A tömörítő algoritmus a kernelen múlik, én lzma-t választottam. Az initrd-be belekerültek a meghívott progamok, a használt libek és a /init script. Ebben a scriptben nagy vonalakban a következőket kellett megírni: pendrive felmountolása, csomagok telepítése, szükség esetén egyéb parancsok kiadása (4-es pontban bővebben), majd a /sbin/init meghívása. Amire figyelni kellett: mivel a pendrive usb, ezért nem lesz fix device neve, érdemes label-t vagy uuid-t használni. A /sbin/init-et exec-kel kell meghívni, ugyanis az init folyamatnak mindig 1-es pid-del kell rendelkeznie.
  4. Mivel a csomagokból nyersen telepített rendszeren jobb esetben minden az alapértelmezett szerint fut, rosszabb esetben hiányol pár config file-t, ezért ezeket valahogy be kellett helyezni a rendszerbe. Rakhattam volna az initrd-be is, azonban az a karbantarthatóság rovására ment volna. Ezért azt csináltam, hogy létrehoztam a pendriveon egy mappát, amiben a unixos könyvtárszerkezetnek megfelelően helyeztem el a behelyezendő fileokat. A behelyezést pedig az initrd-ből végzem automatikusan, symlinkek létrehozásával.
    Pár saját scriptet is írtam, azokat szintén ebbe a könyvtárszerkezetbe helyeztem. A scriptek: pár rc script olyan feladatok végrehajtására, amiket nem muszáj az initrd-ből végrehajtani (viszont ezeket az initrd-ből adom hozzá az inithez chkconfig használatával), pár "1 soros" script amik root jogokkal futtatnak egy-egy adott commandot (kényelmi szempontból), illetve pár script amik speciális feladatokat látnak el. Az egyik a sync.sh, ami képes a pendrive és a rendszer azonos könyvtára között a linkelt környezetben szinkronizációra, a másik az initrd.sh ami egy filelista segítségével automatikusan képes frissíteni az initrd-et.
  5. Pár hiba amibe belefutottam, a teljesség igénye nélkül:
    • Amint elindul a /sbin/init, a framebuffer elromlik. Megoldás: fel kell pakolni a grafikus kártyához a firmware-t. Ekkor pakoltam fel a hálózati kártyákhoz való firmwareket és az X drivereket is.
    • Hu locale esetén az xterm elindulása 3mp-et vesz igénybe és egy errort is dob (Failed to open input method). Megoldás: disztró bug, pár konfigurációs file a /usr/share/X11/locale alatt egy olyan .so-ra hivatkozik ami már nem létezik, kijavítva és a pendrivera helyezve a fileokat a problémát workaroundoltam.
    • Az egyik csomag szépen települ ha a repositoryból telepítjük, de elhasal hiányzó függőségre hivatkozva amikor a pendriveról települ boot közben. Megoldás: disztró bug, a csomag régen nem frissült és idő közben megszűnt az a csomag amitől eredetileg függött. Viszont a konfigurációs scriptje frissült, így a repositoryban a megfelelő csomagoktól függ. A csomagon belüli .PKGINFO szerkesztése után a probléma megoldódott.
    • Bizonyos csomagoknak van postinstall scriptje, amik néha olyan binárisokat hívnának meg, amik még nem települtek. Megoldás: szabályozni kell a csomagok telepítési sorrendjét, azaz a * whildcard-ot le kell cserélni egy saját scriptre/shellfüggvényre, ami egy csomaglistából az első paraméterekre helyezi a megadott csomagokat, és úgy helyezi mögé a többit, hogy ne legyen ismétlődés (a csomagkezelő nem szereti). Ekkor jött elő a bash bug, amit végül sikerült aránylag elegánsan workaroundolni.

Eredmény:
http://www.youtube.com/watch?v=rBBxMDhiwN0

Megfeleltem-e a saját magamnak állított követelményeknek?

  • Van rajta X?
    Van. :)
  • Moduláris és könnyen karbantartható?
    Mivel csomagokat használok, így a csomagkezelővel kényelmesen elvégezhetem azok karbantartását, frissíthetem azokat, telepíthetek, törölhetek. A kikapcsoláskor lefutó rc.packages script feladata az, hogy a megváltozott csomagokat visszaszinkronizálja a pendrivera.
    Mivel az initrd is a rendszerre telepített binárisokból dolgozik, ezért igény lehet ennek frissítésére is, ha frissültek bizonyos csomagok. Ezért írtam az rc.initrd scriptet, ami automatikusan elkészíti egy filelistából az initrd-et.
    Szükség van legalább egy felhasználóra is, ennek létrehozása az rc.users feladata. A pendriveon levő linux/home könyvtár alatti könyvtárak alapján automatikusan létrehozza a felhasználókat. Kikapcsoláskor a felhasználók adatainak visszaszinkronizálására szolgál.

Ahogy az várható volt, a boot lassú, egyébként teljesen korrektül működik. Persze VMware-ben gyorsabb valamivel, mert ott a cpu a szűk keresztmetszet, éles rendszeren a pendrive. Dd-vel mérve 906KB/s-mal tudok olvasni a pendriveról, azaz ha 128MB-tal számolok, akkor a végigolvasásához 145s kell, ami 2 perc 25 másodperc. A tényleges boot olyan 3 és fél perc körül van a gépemen, ha ebből levonom az initet és a többi nem i/o intenzív folyamat lefutási idejét, kb. kijön. :)

Akit érdekel, a pendrive tartalma a csomagok nélkül és egy readme.txt-vel elérhető itt: http://batsite.zxq.net/files/pendrive.7z

Szeretném megköszönni a freenode #frugalware.hu és #kisletra channelek tagjainak, valamint a Miért ne használjunk basht blogbejegyzés hozzászólóinak a segítséget, valamint egy most meg nem nevezett channel tagjainak amiért folyamatosan arról biztosítottak, hogy ez mekkora időpazarlás. :)

Ui: egyszer írtam erről a tervemről ide a hup.hu-ra (vagy talán a #hup.hu-ra?), akkor valaki írta, hogy szóljak, ha elkészülök. Mivel nem találom azt a hozzászólásomat, szóljon, aki szólt, hogy szóljak. :)

Hozzászólások

Jopofa lehet, biztos sokat tanultal belole.
Viszont ha masvalaki ilyet akar, ott a slax, webes feluleten kipipalja mit ker ra, megy. http://www.slax.org/build.php
Vagy DSL, modularis, es az alap nagyon kicsi.
Vagy korulnez distrowatchon, es kivalasztja a neki tetszot.

--
Ha hulyeseget akarnek hallgatni, venne'k TV-t. - Gabucino

Nézd meg a tinycore -t, hogyan működik! Érdemes kipróbálni.

"valamint egy most meg nem nevezett channel tagjainak amiért folyamatosan arról biztosítottak, hogy ez mekkora időpazarlás."

Meglasd 5 ev mulva igazat adsz ;)

Érdekel. Van egy fölös 128-as flashdrive-om.
Úgyis divat most a Thread nekromancy-t fölöslegesen szidni ;) Pedig van értelme a régi dolgoknak.
--
AGA@
Fork portal és az egyik logóm :)