====== 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/*/