Obsah

chroot na usb (extroot)

extroot - pouzivani externiho uloziste jako korenovy adresar / (root) teorie extroot, extroot

Embeded zarizeni (SoC) vetsinou nepodporuji 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

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:

image pro raw flash

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.

block-mount kmod-usb-storage kmod-fs-ext4 mod-usb-core kmod-usb2 kmod-mmc
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)

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.

mkdir /tmp/sto /tmp/new_root
mount /dev/sda1 /tmp/sto
mount -t mini_fo -o base=/rom,sto=/tmp/sto /rom /tmp/new_root
mount --bind /tmp/sto /overlay
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
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 :(
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