Produkty Novinky Články Návody Kontakty

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:
  1. 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 zdeInformationhttp://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.
  2. Dále si připravíme Busybox:
    1. Stáhneme si archiv se zdrojovými kódy Busyboxu v 1.19.4 odsudInformationhttp://busybox.net/downloads/busybox-1.19.4.tar.bz2.
    2. Stáhneme si patchInformationhttp://www.ucsimply.cz/products/modsam9260/, který přidává do Busyboxu výchozí konfiguraci pro modul SAM9260.
    3. Rozbalíme archiv z Busyboxem. Vznikne adresář busybox-1.19.4.:
      $ tar xjf busybox-1.19.4.tar.bz2
      
    4. Aplikujeme patch pro modul SAM9260:
      $ cd busybox-1.19.4        
      $ zcat ../busybox-1.19.4-add-ucsimply_sam9260-support.patch.gz | patch -p1
      
    5. Provedeme výchozí konfiguraci Busyboxu pro modul SAM9260:
      $ make ucsimply_sam9260_defconfig
      
    6. Výchozí konfiguraci případně upravíme:
      $ make menuconfig
      
    7. Zkompilujeme Busybox:
      $ make
      
    8. 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.
    9. 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
      
  3. Zkompilujeme si moduly ovladačů, které nejsou součástí jádra (jádro musí být nakonfigurované):
    1. Vstoupíme do adresáře se zdrojovými kódy jádra:
      $ cd linux-2.6.38.8/
      
    2. Zkompilujeme ovladače, které nejsou zakompilované do obrazu jádra:
      $ make modules
      
    3. 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.

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 vrtsvyInformationSouborový 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:
  1. 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.
  2. 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.
  3. 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.