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 qemu

Wi臋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


    vi sarge_fs/etc/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 tutaj
Skompilowane 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)


    touch initrd_fs/etc/mtab

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


    ldd /sbin/insmod

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)


    make menuconfig

(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:


    aptitude install qemu

Uruchomienie sprowadza si臋 do wydania polecenia


    qemu -cdrom livecd.iso

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 BusyBox
konfiguracja j膮dra 2.6.15
艣rodowisko + initrd