Uvízl jsem na mrtvém bodě a nemožnosti vytvořit ramdisk, stejně tak mi nejde do hlavy jakási nekompatibilita mezi jednotlivými verzemi gzipu. Aneb zřejmě nebootuju, alespoň ne způsobem, který by měl fungovat.

Ztroskotal jsem na snaze vytvořit vlastní initrd z ramdisku vytvořeného automaticky při sestavování Androida. Vytvořený ramdisk.img je archiv vytvořený pomocí cpio, tak jsem si řekl, že nejjednodušší bude jej rozbalit, poupravit a znovu zabalit. Logické, jednoduché…

1. $ mkdir ramdisk && cd ramdisk

2. $ zcat ../ramdisk.img | cpio -i

teď mám rozbalenou adresářovou strukturu, neudělám žádný zásah a zabalím zpět

3. $ find . -print | cpio -o > ../ramdisk2.img

4. $ cd .. && gzip ramdisk2.img && mv ramdisk2.img.gz ramdisk2.img

…ale bohužel nefunkční pro bootování, soubory nejsou totožné.

Image Hosted by ImageShack.us

Už hlavička (resp. začátek) je okem rozeznatelný – původní ramdisk začíná čísly, ve druhém vytvořeném ramdisku je znatelná struktura filesystému. OK, projdu si make soubory a zjistím, jak je to baleno. Ještě před tím jsem ale vyzkoušel, soubor ramdisku gzipem rozbalit a znovu zabalit. OUHA – rozdílné! Pokud ovšem rozbalím obsah a hned jej skrze rouru zase zabalím, tak jsou totožné, viz následující výpis:

$ zcat ramdisk.img > ramdisk

$ gzip ramdisk

$ ls -la ramdisk* && diff ramdisk.img ramdisk.gz

Image Hosted by ImageShack.us

$ zcat ramdisk.img | gzip > ramdisk2.img

v tomto případě jsou už stejné

Tímto způsobem vytvořený (rozbalený a znovu zabalený pouze gzip archiv) ramdisk jde bez problémů použít pro nabootování (narozdíl od rozbaleného kompletního archivu pomocí cpio).

$ qemu -kernel kernel -initrd ramdisk2.img -hda /dev/zero

SOLVED – problém je v parametrech!

Stačilo si přečíst dokumentaci k jádru ( kernel/Documentation/initrd.txt) a upravit parametry. Takže už se nedivím onomu pověstnému RTFM!

rozbalení:

$ gzip -cd  ../ramdisk.img | cpio -imd

zabalení:

$ find . | cpio -H newc -o | gzip -9 -n > ../ramdisk2.img

Nepoužitá možnost tvorby initrd

Resp. použitá, ale taky nefungovala, takže jsem vděčný za informaci o těch parametrech. Každopádně následující informace by se mohly v budoucnu taky hodit, proto si je sem poznamenám. Jedná se o vytvoření prázdného souboru, vytvoření filesystému v něm a jeho připojení pomocí loopback zařízení. Tento postup je detailně popsán v návodu na tvorbu LiveCD distribuce Gentoo.

$ touch initrd
$ dd if=/dev/zero of=initrd bs=1024k count=8
$ losetup /dev/loop0 initrd
$ mke2fs /dev/loop0
$ mkdir /media/initrd
$ mount /dev/loop0 /media/initrd 

Pak vytvořit adresářovou strukturu

$ cd /media/initrd
$ mkdir etc dev lib bin proc new cdrom

A některá základní zařízení

$ cd dev
$ mknod console c 5 1
$ mknod null c 1 3
$ mknod hda b 3 0
$ mknod hdb b 3 64
$ mknod tty c 4 0
$ mknod loop0 b 7 0 

V dalším kroku je nutné vytvořit init skript a nahrát základní systémové nástroje, případně využít BusyBox.