Sze'ntem menő dolog "saját linux terjesztést" gyártani, illetve egy meglévő linux terjesztést felhasználni arra, hogy az alapértelmezett alkalmazásokat mi határozzuk meg, majd ebből telepítővel ellátott livecd-t készítsünk.
Nincs szükségem az Ekigára, az Evolution levelezőre, a Transmission bittorrent kliensre, az f-spotra, az Eye of the Gnome-ra, a Totemre, a Sane-re... sorolhatnám. Kellene egy Thunderbird, egy mplayer, esetleg Skype. Mégis minden friss telepítéskor (ilyen mondjuk nem nagyon fordul elő a napi használatú gépen, hiszen mindig csak frissítek) ezeket az eltávolításokat és friss telepítéseket újra meg kell tenni. Wnidowsra léteznek eszközök, amelyekkel testreszabott telepítőt készíthetünk - akkor Ubuntura is kell lennie. Ez az ötletem aztán be is jött.
A könnyű út
Azért veszem előre a könnyű utat, mert aki amúgy se olvasná végig a postot, annak pontosan tökéletes a program, amit ajánlok. :-) Ez pedig a remastersys, amely csak Ubuntu, vagy abból leszármaztatott (*buntu, Mint stb.) terjesztésekre működik. A Klikit Linux terjesztés (amely egy Kubuntu + néme feltúrbózott tartalom) fejlesztői készítették ezt a varázslatosan konzseniális eszközt arra, hogy az izgalomtól sikongatva villámgyorsan készíthessünk futó rendszerünkről backupot vagy livecd-t. Értelemszerűen a backup később visszaállítható, bár ha jól olvasom, kell hozzá egy kis tudás... :-) Olyat még nem csináltam, de fogok.
Megjegyzések:
1. Más terjesztésre nincs ilyen? De, PCLinuxOS-re remasterme; a Mandriva alatt mklivecd néven fut hasonló. Az alapötlet a Mandrivás fiúktól jött.
2. De minek a rögös út? Hát, mert úgy tanul az ember, ha szív. :-)
3. Az ugye mindenkinek világos, hogy kb. dupla annyi helyre van szükség, mint az aktuális fájlrendszer. Kevesebb hellyel bele se kezdjünk...
A Remastersys ugyan nincs benne az alapértelmezett Ubuntu terjesztésben, de ez minket a legkevésbé sem fog zavarni:
bagoj@mycogen:~# echo "deb http://www.remastersys.klikit-linux.com/repository remastersys/" > /etc/apt/sources.list.d/remastersys.list && apt-get update
Mint látható, rootként dolgoztam. Ha a dist kulcsszót használjuk, akkor az elkészült live cd nem fogja tartalmazni a felhasználóinkat, tehát terjeszthető bárki számára. Ha viszont a backup kulcsszót használjuk, akkor figyelmeztetek mindenkit, hogy a felhasználók is át fognak kerülni! Tehát a dist-et leginkább egy friss telepítéssel érdemes elkövetni; a livecd-n egy custom nevű felhasználó jön ekkor létre, jelszó nélkül. A backup viszont át fogja vinni a saját beállításunkat, ami mindenképpen nagy fegyvertény tud lenni.
bagoj@mycogen:~# apt-get install remastersys
bagoj@mycogen:~# remastersys dist bagoj.iso
Az ISO elkészültével esetleg érdemes törölni a létrehozott ideiglenes fájlokat:
bagoj@mycogen:~# remastersys clean
Ennyit a könnyű útról. :-) A nemrégiben elkészített rendszeren az ISO mérete mindössze 345 Mb lett (!!!). Most pedig leírom, hogy nagyjából hogyan kell ugyanezt kézzel megcsinálni (a program is hasonló elven működik).
(Ja, még egy megjegyzés: A menübe is bekerül a remastersys, de hiába kattintunk rá nem fog elindulni, csak parancssorból. Ennek oka, hogy a menüből a remastersys-gui-t indítaná, de annak fel kell tenni a zenity csomagot, ha még nincs fent; viszont ez a függőségeiben nincs benne.)
A livecd nem csak arra jó, hogy meg lehessen nézni előzetesen egy rendszert, mielőtt telepítjük, bár kétségkívül most a divat ezt mutatja. Régebben ezek a bootolható lemezek a rendszerek helyreállításában játszottak nagy szerepet, akár úgy, hogy valamilyen konfigurációs hibát állítottunk helyre, rosszabb esetben mentésből kellett visszarakni a rendszert. Mindez, úgy gondolom, ma is érvényes.
- Egy livecd tartalmazza a teljes könyvtárszerkezetet, amit az elő rendszer; valamilyen tömörített fájlrendszeren (hiszen a méret eléggé kötött), általában ez squashfs.
- Mivel a CD/DVD csak olvasható, létre kell hozni a memóriában egy fájlrendszert, amire a Linux tud írni; hiszen a /proc, /dev, /var és /tmp alá létre kell tudni hozni a fájlokat. Gondoljuk csak meg, hogy a livecd-k lehetővé teszik akár új csomag telepítését is (oké, hogy el fog veszni a kikapcsolás után, de van rá lehetőség), ehhez mindenképp hozzá kell engedni a felhasználót írásra a fájlrendszerhez. Erre találták ki a unionfs-t is, aminek összehozásával már próbálkoztam ([1] [2]) én is.
- A júzernek, aki a livecd-t használja, lehet sokféle (akár egyszerre több) CD/DVD-olvasója - tudnunk kell kezelni a gyökér fájlrendszer megkeresésének problémáját, valamint a megfelelő kernel modulok betöltését. Ehhez természetesen a boot előtti boot módszerét, azaz az initramfs-t fogjuk használni, amiről feltünően sokszor szoktam én is beszélni, és amely már Münchausen óta ismert. Az initramfs biztosítja a legelső gyökér fájlrendszert, és biztos pontként szolgál. Jó, hogy feltalálták...
A livecd fájlszerkezete tartalmazza az élő rendszer teljes fájlrendszerét, tömörített állapotban. Ezen felül ott kell legyen egy grub konfiguráció, egy kernel, és az initramfs, amely a kezdeti bootot végzi; ez általában egy initrd.gz nevű fájl.
Szükség van néhány eszközre, ezeket telepítsük fel:
apt-get install mkisofs grub squashfs-tools linux-ubuntu-modules-$(uname -r)
1. Livecd könyvtárszerkezet létrehozása
Elkészítjük a könyvtárszerkezetet az élő rendszerből. Az initramfs legyártásához szükséges szkripteket megírhatnánk elölről, de miért tennénk, amikor mások megtették. A legnépszerűbb ilyen szkriptgyűjtemény a casper, amely ugyanezen a néven elérhető .deb formátumban is (le is fogjuk szedni). Ezek után már csak egy update-initramfs parancsra lesz majd szükségünk.
Első (igazi) lépésként elkészítjük a könyvtárakat, amiben dolgozni fogunk (ez egy chrootolt környezet). A squashfs helyére írhatunk ext2-t is, ha nem akarunk tömörítést, ekkor gyorsabb lesz a boot, de 90% hogy DVD-re lesz majd szükségünk. (Ext3-at értelemszerűen NE írjunk, aki ezt nem érti, kérem ne válassza a rögös utat). A WORK és CD változók csak azért kellenek, hogy ne kelljen annyit gépelni. :)
export WORK=~/work
export CD=~/livecd
export FORMAT=squashfs
export FS_DIR=casper
A livecd/casper, livecd/boot/grub, work/rootfs könyvtárak létrehozása:
sudo mkdir -p ${CD}/{${FS_DIR},boot/grub} ${WORK}/rootfs
Ezek után másoljuk le a fájlrendszerünket a ~/work/rootfs alá:
sudo rsync -av --one-file-system --exclude=/proc/* --exclude=/dev/* \
--exclude=/sys/* --exclude=/tmp/* --exclude=/home/* \
--exclude=/lost+found / ${WORK}/rootfs
Az érthető, hogy a /proc, /dev, /sys, /tmp, /lost+found könyvtárakat kihagytuk, hiszen ezekben olyan fájlok vannak, amit majd boot közben hozunk létre. A /home-ról mindjárt beszélek. De előbb: Ha a /boot (vagy egyéb, amelyre szükségünk van) partíciónk külön van, azt is le kell másolnunk. Példa a /boot lemésolására:
cp -av /boot/* ${WORK}/rootfs/boot
Értelemszerűen behelyettesíthetjük pl. a /var lekopírozására.
No és mi lesz a /home-mal? Mivel nem feltétlenül akarjuk az összes felhasználónkat belemásolni a livecd-be, ezért a vak másolás helyett gondolkodjunk; először tegyük át csak a számunkra fontos beállítsokat:
sudo cp -rpv --parents /home/bagoj/.mc/ /home/bagoj/.config/ /home/bagoj/.mplayer/ /home/bagoj/.mozilla/ /home/bagoj/Desktop ${WORK}/rootfs/etc/skel
Az /etc/skel alatt vannak azok a fájlok ugyebár, amelyeket az újonnan létrejövő felhasználók home könyvtárába a Linux bemásol, azaz ezek lesznek az alapértelmzetett beállításai. Ezzel igen sokat el lehet molyolni, én most ugrok a következő lépésre, ami a chroot környezet létrehozása, amiben a beállításokat véglegesítjük:
mount -o bind /dev/ ${WORK}/rootfs/dev
mount -t proc proc ${WORK}/rootfs/proc
chroot ${WORK}/rootfs /bin/bash
Azért egy pillanatra ilyenkor mindig elgondolkodom, hogy mennyire egyszerű egy működő linuxot készíteni egy másik linuxon belül. :-) Node dolgozzunk tovább, az alábbi csomagokra szüksége lesz a livecd-nek (az ubiquity az a livecd telepítő; ha nem akarjuk hogy telepíteni lehessen a livecd-nket merevlemezre, kihagyhatjuk, de szerintem nem érdemes). Nyilván itt még bármi mást is telepíthetünk:
apt-get install casper discover1 xresprobe ubiquity
depmod -a $(uname -r)
update-initramfs -u -k $(uname -r)
Az initramfs (ez már casper-es lesz!) legyártása után eltávolítjuk a /etc/passwd fájlból a rendszerbe felvitt, nem rendszerszintű felhasználókat. Erre jó alkalmat ad, hogy a system felhasználók id-je 1000 alatti, utána jönnek az interaktív felhasználók; úgyhogy egy kis szkriptet fabrikálunk erre:
for i in `cat /etc/passwd | awk -F":" '{print $1}'`
do
uid=`cat /etc/passwd | grep "^${i}:" | awk -F":" '{print $3}'`
[ "$uid" -gt "999" -a "$uid" -ne "65534" ] && userdel --force ${i} 2>/dev/null
done
Ez értelemszerűen csak "gép a gépben", tehát a lemásolt linuxon fog történni, de azért ellenőrizzük le hogy biztosan a chroot környezetben vagyunk-e! Szükséges még néhány rendszerfájl eltávolítása, amelyek egy livecd-s környezetben problémát okozhatnak:
rm /etc/hosts /etc/hostname /etc/resolv.conf /etc/timezone /etc/fstab /etc/mtab /etc/shadow /etc/shadow- /etc/gshadow /etc/gshadow- /etc/gdm/gdm-cdd.conf /etc/gdm/gdm.conf-custom /etc/X11/xorg.conf /boot/grub/menu.lst /boot/grub/device.map
apt-get clean
find /var/run /var/log /var/mail /var/spool /var/lock /var/backups /var/tmp -type f -exec rm {} \;
rm -r /tmp/* /root/* 2>/dev/null
[ -f "/etc/gdm/factory-gdm.conf" ] && cp -f /etc/gdm/factory-gdm.conf /etc/gdm/gdm.conf 2>/dev/null
(pl. a resolv.conf-ban vannak a DNS szerverek, ki tudja hogy ezek elérhetők-e majd minden esetben. Lehet, hogy más időzónában fogják használni, ezért a timezone sem maradhat. A gdm egyedi beállítások akadályozhatják a livecd autologinját stb.)
Hogy ne csak romboljunk, létrehozunk pár logfájlt, amire viszont szükség lesz:
touch /var/log/{dpkg.log,lastlog,mail.log,syslog,auth.log,\
daemon.log,faillog,lpr.log,mail.warn,user.log,boot,debug,mail.err,\
messages,wtmp,bootstrap.log,dmesg,kern.log,mail.info}
2. Ubiquity dolgai
Ahogyan írtam korábban, az Ubiquity használata opcionális - ez tudja telepíteni a livecd tartalmát a merevlemezre. Ennek megfelelő működéséhez szükség van két fájl előállítására, amelyek tartalmazzák a csomaglistát (a filesystem.manifest tartalmaz minden csomagot, és a filesystem.manifest-desktop csak a feltelepítendő csomagokat). Ezt az Ubuntu is nyilván ugyanígy csinálja. Tehát ezt a fejezetet csak akkor kell végigcsinálni, ha akarunk telepítőt!
dpkg-query -W --showformat='${Package} ${Version}\n' | tee ${CD}/${FS_DIR}/filesystem.manifest
cp -v ${CD}/${FS_DIR}/filesystem.manifest{,-desktop}
for i in 'ubiquity casper live-initramfs user-setup discover1 xresprobe os-prober libdebian-installer4'; do sed -i "/${i}/d" ${CD}/${FS_DIR}/filesystem.manifest-desktop; done
3. Kilépés a chrootból
Ezután exit-tel lépjünk ki a chroot-ból, készen vagyunk.
4. A Livecd előkészítése
Megvan a könyvtárszerkezet, most a kis összefoglaló szerint előkészítjük a CD bebootolásához szükséges kernelt és initrd-t.
cp -vp ${WORK}/rootfs/boot/vmlinuz-$(uname -r) ${CD}/boot/vmlinuz
cp -vp ${WORK}/rootfs/boot/initrd.img-$(uname -r) ${CD}/boot/initrd.gz
cp -vp ${WORK}/rootfs/boot/memtest86+.bin ${CD}/boot
Ez a harmadik sor nem igazán feltétlenül szükséges; csak arra kell hogy a livecd-vel (az Ubuntu livecd-hez hasonlóan) tudjuk a memóriát is tesztelni. Mivel én ezt jó dolognak tartom, belerakom. Umountoljuk a chroot miatt felmountolt könyvtárakat:
umount ${WORK}/rootfs/dev ${WORK}/rootfs/proc
...majd készítsük el a squashfs fájlrendszert a könyvtárszerkezetünkből:
mksquashfs ${WORK}/rootfs ${CD}/${FS_DIR}/filesystem.${FORMAT}
Másoljuk a Grubot a helyére:
cp -v /usr/lib/grub/i386-pc/stage2_eltorito ${CD}/boot/grub
Megjegyzés: igazából ez az utolsó sor elég Ubuntu- és PC-specifikus lett. Szebb, ha a következő sort alkalmazzuk:
find /boot /usr/lib/grub/ -iname 'stage2_eltorito' -exec cp -v {} ${CD}/boot/grub \;
és akkor máris platformfüggetlenek lettünk.
Most meg kell szerkesztenünk a grub menü fájlját. Ehhez mindenki alkalmazza a kedvenc editorát; én a vi-t fogom. A lényeg, hogy a következő kerüljön a ${CD}/boot/grub/menu.lst fájlba:
default 0
5. Az ISO fájl legyártása
timeout 20
title Linux inditasa grafikus modban (alapertelmezett)
kernel /boot/vmlinuz BOOT=casper boot=casper persistent rw quiet splash
initrd /boot/initrd.gz
title Linux inditasa Safe modban
kernel /boot/vmlinuz BOOT=casper boot=casper xforcevesa rw quiet splash
initrd /boot/initrd.gz
title Linux inditasa szoveges modban
kernel /boot/vmlinuz BOOT=casper boot=casper nopersistent textonly rw quiet
initrd /boot/initrd.gz
title Memoriateszt
kernel /boot/memtest86+.bin
Először is készítünk egy md5 fájlt, amely a többi fájl ellenőrző összegét tartalmazza, így könnyen ellenőrizhető, hogy megsérült-e valami a lemezen. Ezután pedig legyártjuk az ISO fájlt, amelyet utóbb kiírhatunk tetszőleges programmal:
cd $CD && find . -type f -print0 | xargs -0 md5sum | tee ${CD}/md5sum.txt
mkisofs -b boot/grub/stage2_eltorito \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-V "Bagoj Linugz" -cache-inodes -r -J -l \
-o ~/live-cd.iso $CD
A "Bagoj Linugz" helyére tetszőleges szöveg helyettesíthető (betartva az ISO9660 szabályait). :-)
6. Takarítás
Ha kipróbáltuk a CD-t (VMWare, Virtualbox, qemu...) és minden faja, akkor letörölhetjük a munkakönyvtárainkat:
rm -r ~/work ~/livecd
Talán ez az út sem olyan rögös, nemigaz? ;-)