Tworzenie od podstaw w艂asnego LiveCD
Ostatnia zmiana: 2013-11-26 18:43
Za艂o偶eniem HOWTO jest zbudowanie dzia艂aj膮cego systemu LiveCD. Z tego wzgl臋du w dokumencie nie s膮 zawarte informacje o tworzeniu w艂asnego logo, komunikatach dla u偶ytkownika, autodetekcji sprz臋tu, karty graficznej, ustawieniach X'贸w itd.
Wst臋p
System ma startowa膰 z p艂yty CD/DVD i umo偶liwi膰 uruchomienie standardowego 艣rodowiska. G艂贸wny system plik贸w zostanie zamontowany w trybie tylko-do-odczytu; katalogi, w kt贸rych dane ulegaj膮 modyfikacji (/var, /tmp itp.) zostan膮 zamontowane w ramdysku (tmpfs). System b臋dzie korzysta艂 z p艂yty CD.
Spos贸b dzia艂ania
Wi臋kszo艣膰 LiveCD opiera si臋 na podobnej zasadzie dzia艂ania: wykonuje si臋 p艂yt臋 CD/DVD bootowaln膮, kt贸ra uruchamia specjalny bootloader. Nast臋puje za艂adowanie kernela i uruchomienie initrd. Wystarcza to do uruchomienia podstawowego 艣rodowiska, ale zwykle dzia艂anie initrd ogranicza si臋 wykonania autodetekcji no艣nika, z kt贸rego zosta艂 uruchomiony, za艂adowania niezb臋dnych modu艂贸w (dysku, cdromu, usb itp.), podmontowanie obrazu (w trybie read-only, z wykorzystaniem unionfs, cloop lub innych), wykonaniu chroot na nowy system plik贸w i normalne uruchomienie. W kwestii systemu le偶y wykonanie autodetekcji sprz臋tu, modyfikacja plik贸w konfiguracyjnych i ew uruchomienie pow艂oki graficznej.
Poniewa偶 "normalny" system plik贸w zajmuje zwykle znacznie wi臋cej ni偶 wynosi pojemno艣膰 p艂yty CD, stosuje si臋 zwykle kompresj臋 odpowiednim systemem: cloop, romfs, squashfs
Wymagania
-
syslinux-
busybox-
squashfs- mkisofs, cdrecord
- 藕r贸d艂a linuksa 2.6.15 (ftp://www kernel.org/pub/linux/kernel/v2.6/linux-2.6.15.tar.bz2)
- dzia艂aj膮cy obraz systemu linux (w przyk艂adzie zosta艂 u偶yty obraz debiana sarge, odpowiednio zmodyfikowany do potrzeb dzia艂ania w trybie tylko-do-odczytu.
- du偶o p艂yt CDR do test贸w lub lepiej emulator: vmware lub
qemuWi臋kszo艣膰 niezb臋dnych element贸w znajduje si臋 w dystrybucji debian unstable, wi臋c wystarczy wyda膰 polecenie
aptitude install busybox-static squashfs-tools mkisofs cdrecord debootstrap qemu
Tworzenie 艣rodowiska pracy
Niezb臋dne jest przygotowanie kilku katalog贸w, z kt贸rych b臋dzie tworzony livecd.
mkdir livecd
cd livecd
mkdir initrd_fs
mkdir -p iso/{kernel,isolinux}
mkdir src
mkdir tmp
Wszystkie polecenia nale偶y wykonywa膰 b臋d膮c w katalogu livecd. Zastosowanie katalog贸w:
- initrd_fs: przygotowanie systemu plik贸w dla potrzeb initrd
- iso: obraz p艂yty cd
- iso/kernel: kernel, initrd, skompresowany system plik贸w
- iso/isolinux: loader
- src: pakiety 藕r贸d艂owe: kernel, busybox, squashfs
- tmp: katalog tymczasowy do przygotowania initrd
Instalacja isolinux
ISOLINUX jest, og贸lnie m贸wi膮c, bootloaderem do uruchamiania jadra linuksa z p艂yty. W przypadku debiana nale偶y zainstalowa膰 odpowiedni pakiet (aptitude install syslinux) a nast臋pnie skopiowa膰 plik isolinux.bin do katalogu isolinux w obrazie naszej p艂yty
cp /usr/lib/syslinux/isolinux.bin iso/isolinux/isolinux.bin
W przypadku pobranie pakietu 藕r贸d艂owego syslinux nale偶y po prostu przegra膰 plik isolinux.bin zawarty w tym pakiecie do katalogu iso/isolinux.
Nast臋pnie tworzymy plik konfiguracyjny do isolinux:
touch iso/isolinux/isolinux.cfg
i umieszczamy w nim:
# isolinux/isolinux.cfg
default livecd
prompt 1
timeout 30
label livecd
kernel /kernel/vmlinuz
append initrd=/kernel/initrd.gz init=/linuxrc load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=16384 rw root=/dev/ram0 LABEL=livecd
Nie wykorzystuje to wszystkich mo偶liwo艣ci isolinux; po szczeg贸艂y zapraszam do dokumentacji. Wg przygotowanego pliku konfiguracyjnego, isolinux b臋dzie uruchamia膰 j膮dro o nazwie vmlinuz z katalogu kernel, za艂aduje initrd z katalogu kernel i uruchomi z niego plik linuxrc
Tworzenie g艂贸wnego systemu plik贸w
Mo偶na u偶y膰 praktycznie dowolnego systemu, 艂膮cznie z systemem dzia艂aj膮cym na komputerze. Jednak偶e mo偶na go utworzy膰 od podstaw.
W debianie istnieje przydatne polecenie debootstrap tworz膮ce system bazowy debiana. W podanym przyk艂adzie utworzono system bazowy Debiana Sarge
mkdir sarge_fs
debootstrap sarge sarge_fs http://ftp.pl.debian.org/debian
Z podanej lokalizacji zostan膮 艣ci膮gni臋te i rozpakowane pakiety, stanowi膮ce system bazowy. W zale偶no艣ci od szybko艣ci po艂膮czenia mo偶e to zaj膮膰 kilkana艣cie minut.
Poniewa偶 艣wie偶o zainstalowany system jest do艣膰 du偶y, warto system troch臋 zmodyfikowa膰, np. wed艂ug informacji
o odchudzaniu debiana.
Utworzony system trzeba jeszcze troch臋 zmodyfikowa膰 tak, 偶eby m贸g艂 uruchamia膰 si臋 i funkcjonowa膰 z partycji tylko-do-odczytu.
fstab
Nale偶y utworzy膰 plik fstab
o nast臋puj膮cej zawarto艣ci:
# /etc/fstab
proc /proc proc defaults 0 0
tmpfs /var/log tmpfs defaults 0 0
tmpfs /var/run tmpfs defaults 0 0
tmpfs /var/lock tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /var/lib/dhcp tmpfs defaults 0 0
tmpfs /var/lib/ntp tmpfs defaults 0 0
tmpfs /var/log/exim4 tmpfs defaults 0 0
tmpfs /var/lib/exim4 tmpfs defaults 0 0
tmpfs /var/run/sshd tmpfs defaults 0 0
tmpfs /var/spool/exim4/db tmpfs defaults 0 0
tmpfs /var/spool/exim4/input tmpfs defaults 0 0
tmpfs /var/spool/exim4/msglog tmpfs defaults 0 0
tmpfs /etc/network/run tmpfs defaults 0 0
tmpfs /var/log/news tmpfs defaults 0 0
tmpfs /var/lib/urandom tmpfs defaults 0 0
tmpfs /etc/hotplug/.run tmpfs defaults 0 0
tmpfs /var/cache/locate tmpfs defaults 0 0
Troch臋 usprawnie艅 w systemie:
rm -f sarge_fs/etc/blkid.tab*
ln -s /dev/null sarge_fs/etc/blkid.tab
rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab
Nale偶y ustawi膰 nazw臋 hosta
echo "LiveCD" > sarge_fs/etc/hostname
oraz odpowiednie wpisy w /etc/hosts
echo "127.0.0.1 localhost.localdoman localhost" > sarge_fs/etc/hosts
Poniewa偶 u偶ywamy kernela z serii 2.6, nale偶y doinstalowa膰 par臋 niezb臋dnych element贸w
chroot sarge_fs apt-get install udev module-init-tools
Nie zosta艂o ustawione has艂o root (jest puste). Nie zosta艂o zainstalowane j膮dro dystrybucyjne; b臋dzie ono kompilowane osobno. Brak te偶 jest lilo czy grub'a (nie s膮 one potrzebne).
Kompresujemy tak utworzony system przy pomocy narz臋dzia mksquashfs umieszczaj膮c do jednocze艣nie w katalogu iso/kernel
mksquashfs sarge_fs iso/kernel/fs.squashfs
Kompilacja kernela
Nale偶y pobra膰 kernel (w przyk艂adzie zastosowano 2.6.15), pakiet
squashfs, a nast臋pnie rozpakowa膰 oba w katalogu src. W pakiecie squashfs znajduje si臋 odpowiednia 艂atka (przeznaczona dla 2.6.13, ale bez problemu dzia艂a z 2.6.15); nale偶y j膮 na艂o偶y膰 na j膮dro wg informacji zawartych w README. Squashfs jest niezb臋dny dla skompresowanego systemu plik贸w. Mo偶na zamiast niego u偶y膰 np. cloop (modu艂 stosowany w Knoppix).
Poniewa偶 nie wiadomo na jakiej maszynie b臋dzie uruchamiane livecd, nale偶y j膮dro skompilowa膰 "og贸lnie": procesor i386, wsparcie dla wi臋kszo艣ci chipset贸w. Na sta艂e nale偶y wkompilowa膰 obs艂ug臋 ext2, ramdysk贸w i initrd:
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_EXT2_FS=y
Inne modu艂y jak systemy plik贸w (squashfs), cdrom, ide, usb mo偶na za艂adowa膰 w initrd. Przyk艂adowy .config dost臋pny jest
tutajSkompilowane j膮dro nale偶y przegra膰 do katalogu iso/kernel nadaj膮c mu nazw臋 vmlinuz.
Mo偶na te偶 u偶y膰 j膮dra zawartego w dystrybucji, o ile posiada ono wkompilowane odpowiednie opcje.
Tworzenie initrd
Stworzony initrd jest de-facto ma艂ym systemem dzia艂aj膮cym przy pomocy busybox'a. Jego zadaniem jest wykrycie no艣nika, za艂adowanie odpowiednich modu艂贸w na nast臋pnie uruchomienie w艂a艣ciwego linuksa.
Struktura katalog贸w
Niezb臋dna b臋dzie odpowiednia struktura katalog贸w:
mkdir -p initrd_fs/{bin,dev,etc,lib,mnt,proc,tmp}
mkdir -p initrd_fs/mnt/{cdrom,fs}
Do katalogu initrd_fs/lib/modules/`uname -r`/kernel nale偶y skopiowa膰 modu艂y niezb臋dne do poprawnego wykrycia urz膮dze艅 i p贸藕niejszego dzia艂ania systemu. W tym przypadku b臋d膮 to cdrom, ide-cd (obs艂uga cdromu), squashfs oraz zlib_inflate (obs艂uga systemu plik贸w squashfs)
Nale偶y jeszcze zasili膰 katalog dev odpowiednimi wpisami:
cd initrd_fs/dev
mknod full c 1 7
mknod kmem c 1 2
mknod mem c 1 1
mknod null c 1 3
mknod port c 1 4
mknod random c 1 8
mknod urandom c 1 9
mknod zero c 1 5
ln -s /proc/kcore core
mknod hda b 3 0
mknod hda1 b 3 1
mknod hda2 b 3 2
mknod hda3 b 3 3
mknod hda4 b 3 4
mknod hdb b 3 64
mknod hdb1 b 3 65
mknod hdb2 b 3 66
mknod hdb3 b 3 67
mknod hdb4 b 3 68
mknod hdc b 22 0
mknod hdc1 b 22 1
mknod hdc2 b 22 2
mknod hdc3 b 22 3
mknod hdc4 b 22 4
mknod hdd b 22 64
mknod hdd1 b 22 65
mknod hdd2 b 22 66
mknod hdd3 b 22 67
mknod hdd4 b 22 68
for i in `seq 0 9`; do
mknod loop$i b 7 $i
done
for i in `seq 0 9`; do
mknod ram$i b 1 $i
done
ln -s ram0 ramdisk
mknod initrd b 1 250
mknod console c 5 1
mknod tty c 5 0
for i in `seq 0 9`; do
mknod tty$i c 4 $i
done
for i in `seq 0 9`; do
mknod vcs$i b 7 $i
done
ln -s vcs0 vcs
for i in `seq 0 9`; do
mknod vcsa$i b 7 $i
done
ln -s vcsa0 vcsa
for i in `seq 0 9`; do
mknod ptyp$i c 2 $i
done
ln -s /proc/self/fd fd
ln -s fd/0 stdin
ln -s fd/1 stdout
ln -s fd/2 stderr
cd ../..
lub pos艂u偶y膰 si臋 skryptem mkdevs.sh zawartym z 藕r贸d艂ach busybox'a. Utworzy膰 plik etc/mtab (kosmetyka)
Wymagany te偶 b臋dzie zewn臋trzny program insmod, kt贸ry nale偶y wraz z bibliotekami skopiowa膰 do initrd_fs
cp -a /sbin/insmod initrd_fs/bin/insmod
cp -L /lib/tls/libc.so.6 initrd_fs/lib/
cp -L /lib/ld-linux.so.2 initrd_fs/lib/
List臋 niezb臋dnych bibliotek mo偶na uzyska膰 wydaj膮c polecenie
linuxrc
Plik ten jest wykonywany jako proces init przy uruchamianiu 艣rodowiska; nale偶y go umie艣ci膰 w katalogu g艂贸wnym initrd:
touch initrd_fs/linuxrc
chmod 755 initrd_fs/linuxrc
a nast臋pnie umie艣ci膰 w nim nast臋puj膮cy kod:
#!/bin/sh
PATH=/bin:/sbin
mount -t proc none /proc
MODULES="cdrom ide-cd zlib_inflate squashfs"
for MOD in $MODULES; do
insmod /lib/modules/'uname -r'/kernel/$MOD.ko
done
COUNT=1
CDFOUND=1
while [ $CDFOUND -eq 1 ]; do
CDDRV=`dmesg | grep "hd.*CD.*ROM" | cut -f1 -d: | grep -n "" | grep $COUNT: | cut -f2 -d:`
if [ -e $CDDRV ]; then
echo "Nie znaleziono nosnika..."
exit
fi
echo "Sprawdzanie /dev/$CDDRV..."
mount -t iso9660 /dev/$CDDRV /mnt/cdrom > /dev/null 2>&1
if [ -f /mnt/cdrom/kernel/fs.squashfs ] ; then
CDFOUND=0
echo "Znaleziono system na /dev/$CDDRV"
else
umount /mnt/cdrom
fi
COUNT=`expr $COUNT + 1`
done
mount -o loop -t squashfs /mnt/cdrom/kernel/fs.squashfs /mnt/fs
cd /mnt/fs
if [ -d initrd ]; then
:
else
mkdir initrd
fi
pivot_root . initrd
exec /usr/sbin/chroot . /sbin/init 2 </dev/console>/dev/console 2>&1
Zadaniem linuxrc jest na podstawie komunikat贸w jadra (dmesg) wykrycie wszystkich nap臋d贸w CD/DVD, podmontowanie ka偶dego z nich, a nast臋pnie wykrycie z kt贸rego wystartowa艂 system (poprzez sprawdzenie obecno艣ci pliku fs.squashfs). Nast臋pnie nast臋puje podmontowanie systemu plik贸w squashfs, prze艂膮czenie si臋 na niego (pivot_root, chroot) i uruchomienie init na poziomie 2 z nowego systemu plik贸w.
Poniewa偶 u偶ywany jest insmod zamiast modprobe nale偶y pami臋ta膰 o 艂adowaniu modu艂贸w we w艂a艣ciwej kolejno艣ci.
Kompilacja busybox
BusyBox jest ciekawym zestawem r贸偶norodnych narz臋dzi - pocz膮wszy do shella, poprzez fdiska, na edytorze vi sko艅czywszy, a wszystko mie艣ci si臋 w 1.5MiB binarce. Mo偶na by korzysta膰 z zewn臋trznych program贸w, ale wraz z bibliotekami zajmowa艂y by one cenne miejsce.
Mo偶na u偶y膰 gotowej binarki dostarczonej przez debiana:
aptitude install busybox-static
cp /bin/busybox initrd_fs/bin/busybox
lub kompilowa膰 samodzielnie, wykorzystuj膮c
podany config; nale偶y pami臋ta膰 o w艂膮czeniu niezb臋dnych aplet贸w: [, grep, mount, cut, init umount, echo, mkdir, pivot_root, chroot. Mo偶na to zrobi膰 wydaj膮c polecenie (b臋d膮c w katalogu ze 藕r贸d艂ami busybox'a)
(tak jak przy kernelu), a nast臋pnie skompilowa膰 przez wywo艂anie polecenia make. Dla uproszczenia nale偶y skompilowa膰 busybox'a statycznie (nie b臋d膮 wtedy wymagane 偶adne biblioteki). Binark臋 nale偶y skopiowa膰 do katalogu initrd_fs/bin.
Nale偶y utworzy膰 jeszcze klika dowi膮za艅 symbolicznych (wykorzystuj膮c skrypty zawarte w 藕r贸d艂ach busybox'a) lub wykonuj膮c nast臋puj膮ce polecenia
ln -s /bin/busybox initrd_fs/bin/chroot
ln -s /bin/busybox initrd_fs/bin/modprobe
ln -s /bin/busybox initrd_fs/bin/mount
ln -s /bin/busybox initrd_fs/bin/pivot_root
ln -s /bin/busybox initrd_fs/bin/sh
ln -s /bin/busybox initrd_fs/bin/umount
Nast臋pnie nale偶y utworzy膰 plik b臋d膮cy obrazem initrd (tutaj o rozmiarze 16MiB), zapisa膰 w nim odpowiednie pliki, skompresowa膰 a nast臋pnie umie艣ci膰 w katalogu iso/kernel:
dd if=/dev/zero of=initrd bs=1M count=16
mkfs.ext2 -m 0 initrd
mount -t ext2 -o loop initrd tmp
cp -a initrd_fs/* tmp
umount tmp
gzip -9 initrd
mv initrd.gz iso/kernel/initrd.gz
Tworzenie obrazu p艂yty
Wszystkie pliki s膮 ju偶 gotowane, nale偶y teraz stworzy膰 obraz bootowalnej p艂yty CD. Mo偶na to wykona膰 przy pomocy polecenia mkisofs:
mkisofs -o livecd.iso -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -V "Wlasny LiveCD" -cache-inodes -r -J -l iso
Testowanie
Stworzony obraz p艂yty mo偶na wypali膰 na p艂ycie poleceniem
cdrecord -eject -speed=24 livecd.iso
A nast臋pnie uruchomi膰 z komputer z p艂yty CD. Poniewa偶 jest to procedura czasoch艂onna, a z pewno艣ci膮 za pierwszym razem p艂yta nie b臋dzie dzia艂a艂a tak jak to chcieli艣my, lepiej do cel贸w testu wykorzysta膰 emulatory vmware lub qemu.
W debianie nale偶y zainstalowa膰 pakiet qemu:
Uruchomienie sprowadza si臋 do wydania polecenia
Podsumowanie
Zaprezentowana metoda pozwala na stworzenie od podstaw w艂asnej p艂yty typu LiveCD. W g艂贸wnej mierze
doskona艂o艣膰 takiej p艂yty zale偶y od wykrycia i autokonfiguracji 艣rodowiska. W podanym przyk艂adnie brak jest detekcji sieci, konfiguracji po艂膮czenia LAN/WLAN, konfiguracji 艣rodowiska graficznego itd. Do wykonania we w艂asnym zakresie :)
Oczywi艣cie, sam isolinux te偶 mo偶na zmieni膰 - doda膰 logo startowe, komunikaty dost臋pne dla u偶ytkownika pod klawiszami Fx, kilka r贸偶nych kerneli do wyboru z r贸偶nymi opcjami, pasek post臋pu uruchamiania (lub graficzny bootsplash/splashy/usplash).
W zastosowanej metodzie do kompresji systemu u偶yto squashfs; mo偶na te偶 do tego celu u偶y膰 cloop. Wszystkie problemy gotowym systemem objawiaj膮ce si臋 komunikatami typu "error: read-only system" wynikaj膮 ze z艂ego przygotowania systemu bazowego. Najlepiej na pocz膮tek przygotowa膰 minimalny system, bez zb臋dnych pakiet贸w. Poniewa偶 poszczeg贸lne katalogi s膮 tylko-do-odczytu lub zamontowanie w ramie, wszystkie zapisane informacje o ustawieniach, historii polece艅 itp. nie zostan膮 zachowane.
Oczywi艣cie, mo偶na te偶 zmodyfikowa膰
gotowego LiveCD (
LiveCD cz.2).
Pliki
konfiguracja BusyBoxkonfiguracja j膮dra 2.6.15艣rodowisko + initrd