Kořenový souborový systém
Na závěr si připravíme obsah a následně i obraz kořenového souborového systému. Jinými slovy vlastně obsah systémového pevného disku, kde jsou uloženy příkazy, utility, konfigurační soubory, jádro, ovladače a další soubory. A z toho všecho pak vytvoříme binární obraz vhodný pro nahrání přímo do paměti NandFlash, která v případě modulu slouží jako systémový pevný disk.
Příprava obsahu
Obsah kořenového souborového systému (dále rootfs) je vlastně to, co tvoří distribuci Linuxu. Můžeme tedy hrdě prohlásit, že si teď sestavíme vlastní linuxovou distribuci pro modul uCSimply SAM9260. Naše distribuce stojí na čtyřech pilířích:
- Příkazy a utility vyřešíme pomocí Busyboxu.
- Ovladače, kterou nejsou zakompilované do jádra, získáme kompilací ze stromu jádra.
- Systémové knihovny jsou součástí balíku křížových nástrojů CodeBench Lite Edition, stačí je jen zkopírovat.
- Konfigurační soubory a skripty si vytvoříme sami podle návodu.
Poznámka: Pro kompilaci Busyboxu použijeme nástroje GNU/Linux z balíku Sourcery CodeBench Lite Edition. Návod předpokládá Busybox verze 1.19.4, pro který je připraven patch s výchozí konfigurací pro modul uCSimply SAM9260.
Postup:
- Nejdříve si připravíme kostru rootfs (strukturu adresářů), zkopírujeme si do rootfs systémové knihovny a připravíme si konfigurační soubory a skripty. Návod jak na to naleznete na našich stránkách zdehttp://www.ucsimply.cz/elnx/sestaveni-linuxove-distribuce/zaklad-distribuce/.Poznámka: Systémové knihovny vhodné pro modul SAM9260 najdeme v instalačním adresáři balíku Sourcery CodeBench Lite Edition v podadresáři arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/lib.
- Dále si připravíme Busybox:
- Stáhneme si archiv se zdrojovými kódy Busyboxu v 1.19.4 odsudhttp://busybox.net/downloads/busybox-1.19.4.tar.bz2.
- Stáhneme si patchhttp://www.ucsimply.cz/products/modsam9260/, který přidává do Busyboxu výchozí konfiguraci pro modul SAM9260.
- Rozbalíme archiv z Busyboxem. Vznikne adresář busybox-1.19.4.:
$ tar xjf busybox-1.19.4.tar.bz2
- Aplikujeme patch pro modul SAM9260:
$ cd busybox-1.19.4 $ zcat ../busybox-1.19.4-add-ucsimply_sam9260-support.patch.gz | patch -p1
- Provedeme výchozí konfiguraci Busyboxu pro modul SAM9260:
$ make ucsimply_sam9260_defconfig
- Výchozí konfiguraci případně upravíme:
$ make menuconfig
- Zkompilujeme Busybox:
$ make
- Nainstalujeme binární soubor Busyboxu a jeho applety do struktury rootfs (musíme to provést jako superuživatel root nebo přes sudo). Adresář, kde se nalézá rootfs v rámci adresářové struktury našeho počítače, určíme proměnnou CONFIG_PREFIX:
$ sudo make CONFIG_PREFIX=/home/emlin/workspace-sam9260/projects/ucsimply/dist/rootfs install
Poznámka: Váš adresář s rootfs může být umístěn jinde. - Nastavíme setuid bit na nainstalovaném binárním souboru Busyboxu (jsme v adresáři našeho kořenového souborového systému):
$ sudo chmod +s bin/busybox
- Zkompilujeme si moduly ovladačů, které nejsou součástí jádra (jádro musí být nakonfigurované):
- Vstoupíme do adresáře se zdrojovými kódy jádra:
$ cd linux-2.6.38.8/
- Zkompilujeme ovladače, které nejsou zakompilované do obrazu jádra:
$ make modules
- Nainstalujeme zkompilované ovladače do struktury našeho rootfs. Umístění rootfs nastavíme do proměnné INSTALL_MOD_PATH.
$ export INSTALL_MOD_PATH=/home/emlin/workspace-sam9260/projects/ucsimply/dist/rootfs $ sudo -E make modules_install
Poznámka: Váš adresář s rootfs může být umístěn jinde.
- Vstoupíme do adresáře se zdrojovými kódy jádra:
Příprava obrazu ubifs/ubi
Máme nachystaný obsah rootfs. Ovšem v téhle formě jej není snadné nahrát do modulu. Už jen kvůli tomu důvodu, že paměť NandFlash by musela obsahovat vhodný oddíl zformátovaný souborovým systémem ubi/ubifs. Zdaleka nejsnazší je vytvořit obraz oddílu ubifs s kořenovým souborovým systémem a ten pak transformovat do nízkoúrovňového obrazu ubi vrtsvySouborový systém ubi/ubifs je dvouvrtsvý. Vrstva ubi je první a pracuje přímo s paměťovým médiem. Vrstva ubifs je nad ní a využívá výhod abstrakce od paměťového média. Více zde: http://www.linux-mtd.infradead.org/doc/ubifs.html. Obraz ubi vrstvy pak už můžeme rnahrát přímo do paměti NandFlash jako jakoukoliv jinou část firmware. Níže uvedený postup (vykonávaný pod účtem root) nám ukáže jak na to.
Než začneme:
- Nainstalujeme si (jako root) nástroje pro práci se souborovým systémem ubi/ubifs (platí pro linuxovou distribuci Debian 6.0 a vyšší):
# apt-get update # apt-get install mtd-utils
Postup:
- Vytvoříme obraz kořenového souborového systému pro vrstvu ubifs:
# mkfs.ubifs -v -r rootfs/ -m 2048 -e 129024 -c 1024 -o rootfs.ubifs
Uvedené parametry jsou -m 2048 (velikost stránky 2048B), -e 129024 (velikost logického bloku pro mazání - LEB - je 129.024B), -c 1024 (max. počet LEB - vlastně max. velikost oddílu) a -o rootfs.ubifs (obraz ubifs vrstvy bude uložen do souboru rootfs.ubifs).Výstup příkazu:mkfs.ubifs root: rootfs/ min_io_size: 2048 leb_size: 129024 max_leb_cnt: 1024 output: rootfs.ubifs jrn_size: 8388608 reserved: 0 compr: lzo keyhash: r5 fanout: 8 orph_lebs: 1 super lebs: 1 master lebs: 2 log_lebs: 5 lpt_lebs: 2 orph_lebs: 1 main_lebs: 30 gc lebs: 1 index lebs: 1 leb_cnt: 41 UUID: EA9C1AA9-EEE4-446E-8E7A-DD97677FF379 Success!
Poznámka: Pokud nástroj mkfs.ubifs spadne nebo zahlásí nějakou chybu, je třeba si ověřit, že velikost zdrojového adresáře není větší než součin velikost LEB * počet LEB. - Vytvoříme konfigurační soubor ubi.cfg, který nástroji ubinize řekne, kolik oddílů a jakých vlastností bude v obrazu ubi vrstvy. Příklad souboru ubi.cfg:
[rootfs] mode=ubi image=rootfs.ubifs vol_id=0 vol_size=128MiB vol_type=dynamic vol_name=rootfs [unused] mode=ubi vol_id=1 vol_size=96MiB vol_type=dynamic vol_name=unused vol_flags=autoresize
Obsah souboru ubi.cfg popisuje dva oddíly rootfs a unused s ID 0 a 1. Oddíl rootfs bude obsahovat, to co je v obrazu rootfs.ubifs, zatímco oddíl unused bude prázdný. Velikost oddílu rootfs je 128MB, zatímco oddíl unused bude mít min. 96MB volného místa. Ovšem díky příznaku autoresize bude oddíl unused ovladačem ubi/ubifs zvětšen na maximální velikost až do vyčerpání volné kapacity média (paměti NandFlash). Zvětšení proběhne během prvního bootování po nahrání obrazu ubi vrstvy do NandFlash paměti. - Pomocí nástroje ubinize vytvoříme obraz ubi vrstvy:
# ubinize -v -o ubi-nandflash.bin -m 2048 -p 128KiB -s 512 ubi.cfg
Parametr -m 2048 udává velikost stránky v Bytech, -p 128kB pak velikost PEB (fyzický blok pro mazání) v kB a -s 512 udává velikost podstránky (subpage) v Bytech. Výstup - obraz ubi vrstvy - bude uložen do souboru ubi-nandflash.bin.Výstup příkazu:ubinize: LEB size: 129024 ubinize: PEB size: 131072 ubinize: min. I/O size: 2048 ubinize: sub-page size: 512 ubinize: VID offset: 512 ubinize: data offset: 2048 ubinize: loaded the ini-file "ubi.cfg" ubinize: count of sections: 2 ubinize: parsing section "rootfs" ubinize: mode=ubi, keep parsing ubinize: volume type: dynamic ubinize: volume ID: 0 ubinize: volume size: 134217728 bytes ubinize: volume name: rootfs ubinize: volume alignment: 1 ubinize: adding volume 0 ubinize: writing volume 0 ubinize: image file: rootfs.ubifs ubinize: parsing section "unused" ubinize: mode=ubi, keep parsing ubinize: volume type: dynamic ubinize: volume ID: 1 ubinize: volume size: 100663296 bytes ubinize: volume name: unused ubinize: volume alignment: 1 ubinize: autoresize flags found ubinize: adding volume 1 ubinize: writing layout volume ubinize: done
Obraz ubi vrstvy, soubor ubi-nandflash.bin, můžeme nahrát pomocí nástroje SAM-BA do paměti NandFlash na určenou adresu. Po nabootování uvidíme v adresáři /dev dvě zařízení ubi0_0 a ubi0_1, které představují naše dva oddíly - rootfs s unused.