====== chroot na usb (extroot) ======
**extroot** - pouzivani externiho uloziste jako korenovy adresar / (root) [[http://wiki.openwrt.org/doc/howto/extroot/extroot.theory|teorie extroot]], [[http://wiki.openwrt.org/doc/howto/extroot|extroot]]
Embeded zarizeni ([[http://en.wikipedia.org/wiki/System-on-a-chip|SoC]]) vetsinou nepodporuji [[http://wiki.openwrt.org/doc/techref/process.boot|bootovani]] primo z USB (FTL flash), musi se nejprve spustit system ulozeny na flash chipu (raw flash).
Extroot lze v takovych pripadech realizovat pouze tak, ze do flash chipu se ulozi system, ktery behem startu prepne na nove externi uloziste. Je potreba pripravit image pro raw flash routeru a souborovy system na externim ulozisti.
Omezeni (upgradovani) pri pouzivani externiho uloziste
* nesmi se pouzivat balicky kompilovane s jinou verzi uClibc nez image. Nemusi byt kompatibilni.
* nesmi se upgradovat kernel na jinou verzi nebo z jineho build prostredi. Zpusobilo by nekompatibilitu.
* nesmi se pouzivat balicky, ktere byly kompilovane vuci jine verzi kernelu (treba iptables)
OpenWRT od verze Attitude Adjustment se snazi detekovat takove nekonzistence a predejit problemum vypnutim bootovani z externiho zarizeni. V takovem pripade je extroot pripojen do /tmp/overlay-disabled, aby se mohl opravit. Pokud je potreba upgradovat kernel, musi se upgradovat jak na extroot, tak v image.
OpenWRT podporuje dva rezimy extroot:
* **pivot-overlay** - externi uloziste tvori "prekryv" - do puvodniho souboroveho systemu pridava/odstranuje polozky. Je vytvoren virtualni souborovy system ([[http://www.denx.de/wiki/bin/view/Know/MiniFOFAQ|mini_fo]]), ktery se sklada z read-only casti ve flash a read-write na externim ulozisti.
* **pivot-root** - pouziva se vyhradne externi uloziste
===== image pro raw flash =====
* image se vetsinou vytvari se souborovym system squashfs (read-only) + jffs (rw), aby bylo mozne ukladat konfiguracni zmeny nebo provadet upgrade balicku.
* v kernelu je potreba drivery:
* **kmod-usb-storage mod-usb-core kmod-usb2** - zakladni usb subsystem
* **kmod-mmc** - driver pro SD/MMC karty
* **kmod-fs-ext4** - pro pouzity filesystem na externim ulozisti
* i kdyz mame tyto drivery v jadre.. stale je potreba neco, co by v init pripojilo souborovy system na externim ulozisti bez jineho souboroveho systemu, kde by tato akce byla popsana. K tomu se pouziva modul **block-mount** (drive navic block-extroot, block-hotplug)
* v image je dobre mit take nastroj **e2fsprogs**, pro vytvareni filesystemu na externim ulozisit (neni nutne)
Pro image si udelam vlastni build, chci tam mit jen minimum veci nezbytnych pro pro boot z externiho uloziste. Pokud bych pouzil image primo z openwrt, musel bych tam jeste doinstalovat chybejici balicky a image by byl zbytecne velky. Bude se mi take lepe udrzovat konzistence mezi externim ulozistem a image, protoze budu mit stejne buildovaci prostredi.
* vybereme zakladni balicky plus nasledujici
block-mount kmod-usb-storage kmod-fs-ext4 mod-usb-core kmod-usb2 kmod-mmc
* do fstab pridame (az po bootu nebo modfifikujeme cilovy fs)
config mount
option target /
option device /dev/sda1
option fstype ext4
option options rw,sync
option enabled 1
option enabled_fsck 0
===== priprava externiho uloziste (pivot-root) =====
* externi uloziste se nejcasteji vytvari primo v nastarovanem OpenWrt na cilovem zarizeni.
* nejprve se vytvori filesystem (v tomto pripade ext4 na externim zarizeni /dev/sda1)
* v root filesystemu jsou pripojeny specialni soubory ve slozkach jako /dev /proc .., abychom nekopirovaly tyto systemove soubory, vytvari se bind souboroveho systemu do jineho adresare
* nevim, proc se pouziva tar misto cp, mozna je to flexibilnejsi (kopirovani po siti)
mkfs.ext4 /dev/sda1
mount /dev/sda1 /mnt
mkdir /tmp/cproot
mount --bind / /tmp/cproot
tar -C /tmp/cproot -cvf - . | tar -C /mnt -xvf -
sync ; umount /mnt
umount /tmp/cproot
**TIP**: aby se dalo ihned rozlisit, zda nastartoval image nebo extroot je mozne ulozit do /etc/banner info o tom, ze je to z extroot :)
**TIP**: online zalohu root (ro+sd) lze provest takto:
mount --bind / /tmp/xxx
ssh gate "tar -C /tmp/xxx -cvf - ." > /tmp/zaloha.tar
====== Stary pokus ======
Takto jsem se znazil, jeste nez vznikla oficialni podpora pro chroot v OpenWRT. Jsou zde zajimave veci, ktere se mohou hodit jinde.
* cil: pripravit USB disk s ext3
* [[http://www.denx.de/wiki/bin/view/Know/MiniFOFAQ|jak funguje spojeni R a W fs?]]
* problem - jak spustit chroot pred bootem init skriptu? prej to jde jen predanim options kernelu... ale do redboot preci zasahovat nemuzu ne?
* model A
* instalace
* nakopirovat obsah /dev/mtdblock3 on /overlay type jffs2 na usb
* inicializace
mkdir /tmp/sto /tmp/new_root
mount /dev/sda1 /tmp/sto
* vytvorime novy R/W FS zalozeny na ROM
mount -t mini_fo -o base=/rom,sto=/tmp/sto /rom /tmp/new_root
* premountujeme adr, do ktereho se instaluji nove balicky
mount --bind /tmp/sto /overlay
* premountujeme zakladni adresare :-D
mount --bind /tmp/new_root/etc /etc
mount --bind /tmp/new_root/lib /lib
mount --bind /tmp/new_root/sbin /sbin
mount --bind /tmp/new_root/usr /usr
mount --bind /tmp/sto/root /root
* slo by neco odmountovat?
* '''nejspis je potreba ext3!! na fat mi to hazelo nejake chyby.. nejde nastavit napriklad suid bit'''
* script pro rspro :)
* haze mi to seg.fault.. mam podezreni na FAT (misto ext3)... mozna chyba pri mountovani etc? - zkusim preskocit
mkdir /tmp/sto /tmp/new_root
mount /dev/sda1 /tmp/sto
mount --bind /tmp/sto/chroot /jffs
mount -t mini_fo -o base=/rom,sto=/tmp/sto/chroot /rom /tmp/new_root
mount --bind /tmp/new_root/lib /lib
which
Segmentation fault :(
* zjednodusena verze
mkdir /tmp/new_root
mount -t mini_fo -o base=/rom,sto=/mnt/sdcard/chroot /rom /tmp/new_root
ls -l /tmp/new_root/lib/
Segmentation fault
logread -f
Jul 3 20:11:41 HomeRouterII user.alert kernel: CPU 0 Unable to handle kernel paging request at virtual address 0000008c, epc == 87b921a0, ra == 800e1afc
Jul 3 20:11:41 HomeRouterII user.warn kernel: Oops[#1]:
Jul 3 20:11:41 HomeRouterII user.warn kernel: Cpu 0
Jul 3 20:11:41 HomeRouterII user.warn kernel: $ 0 : 00000000 00000001 00000000 0000002e
Jul 3 20:11:41 HomeRouterII user.warn kernel: $ 4 : 874e6380 874e859c 873a1d90 00000009
Jul 3 20:11:41 HomeRouterII user.warn kernel: $ 8 : 8732e011 874e635b 87b3bbe0 fffffff4
Jul 3 20:11:41 HomeRouterII user.warn kernel: $12 : 00000025 00000807 00000800 00480000
Jul 3 20:11:41 HomeRouterII user.warn kernel: $16 : 874e8580 874e8590 874e6300 873a1d90
Jul 3 20:11:41 HomeRouterII user.warn kernel: $20 : 00000009 8732e012 23d0d3f8 873fa700
Jul 3 20:11:41 HomeRouterII user.warn kernel: $24 : 00482398 87b92194
Jul 3 20:11:41 HomeRouterII user.warn kernel: $28 : 873a0000 873a1d08 873a1d80 800e1afc
* zajimave.. ok je: /tmp/new_root/, /tmp/new_root/etc, /tmp/new_root/usr,
* nok je .. /tmp/new_root/rom, /tmp/new_root/bin, /tmp/new_root/lib, /tmp/new_root/usr/*/