«

»

Openwrt s extroot na TL-MR3420 v2

po flashnutí Openwrt 15.05.1 (release, nikoli trunk) na Tp Link MR3420 v2 máme k dispozici necelých 300 kB místa interní flash paměti. (po nabootování a spuštění všech potřebných služeb vč. Wlan s WPA2 zůstane k dispozici jen asi 55 % volného prostoru z celkem 512 kB).

V této konfiguraci sice openwrt v pohodě funguje (používá ramdisk). Avšak ojediněle – cca 1x za 2 měsíce – docházelo na mém routeru ke zhroucení jffs2 partition na /dev/mtdblock3 – nic nešlo uložit, soubory náhodně mizely.. Pomohlo až zformátování overlaye (jffs2reset -y) které uvedlo router zpět do „továrního“ nastavení. Toto řešení však bylo však pouze dočasné a bylo nutné opakovat vždy když se znovu objevily problémy s jffs2

Bohužel jsem nezjistil, za jakých okolností přesně dochází k tomuto zhroucení, nicméně vypozoroval jsem, že celkem spolehlivě ho takto lze zabít pouhým zaplněním nad 90% (tedy pokud zbývá méně jak cca 50kiB volného místa)

Rozhodl jsem se tedy tento problém vyřešit použitím externího overlaye na USB disku. Tzv. extroot je oficiálně podporován, konfigurace není složitá.

Upozorňuji, že postup níže platí pouze pro release 15.05.1 s kernelem 3.18.23

Trunk v současné době obsahuje kernel 4.4, pro který ale tento návod nelze použít, neboť  potřebné moduly pro 4.4 jsou příliš velké!!

Problém spočívá v tom, že pro extroot potřebujeme nejprve rozchodit usb-storage a podporu nějakého žurnálovacího fs.

V oficiálních návodech se vždy dočteme, že jediný fs který je podporován pro extroot je ext4.

Jenomže samotný balík kmod-fs-ext4 (podpora jádra pro EXT2,3,4 systémy) má ve verzi 3.18.23-1 přesně 225.581 B plus k tomu kmod-usb-storage 3.18.23-1 22.263 B = celkem cca 250 kB zabalených, což neodvratitelně znamená zaplnění a zhroucení overlayfs během pokusu o jejich instalaci

Ostatně píšou i v příslušné device WIKI, že pro podporu USB storage už nezbývá místo (Stock install leaves only 360KiB free for loading packages which doesn’t seem to be enough to enable USB storage support)

Nicméně, co je psáno, s tím není nutno se smiřovat bez boje – existují přece i jiné filesystémy, než ext4.

Vytvořil jsem seznam oficiálních balíčků podporovaných souborových systému seřazených podle velikosti :

RELEASE 15.05.1 (kernel 3.18.23)

jméno verze velikost popis
kmod-fs-exportfs 3.18.23-1 3547 Kernel module for exportfs. Needed for some other modules.
kmod-fs-msdos 3.18.23-1 5505 Kernel module for MSDOS filesystem support
kmod-fs-cramfs 3.18.23-1 5525 Kernel module for cramfs support
kmod-fs-configfs 3.18.23-1 12048 Kernel module for configfs support
kmod-fs-autofs4 3.18.23-1 14176 Kernel module for AutoFS4 support
kmod-fs-minix 3.18.23-1 15469 Kernel module for Minix filesystem support
kmod-fs-isofs 3.18.23-1 16092 Kernel module for ISO9660 filesystem support
kmod-fs-fscache 3.18.23-1 25934 General filesystem local cache manager
kmod-fs-hfs 3.18.23-1 28499 Kernel module for HFS filesystem support
kmod-fs-vfat 3.18.23-1 39289 Kernel module for VFAT filesystem support
kmod-fs-nfsd 3.18.23-1 44016 Kernel module for NFS kernel server support
kmod-fs-exfat 3.18.21+git-20150301-1 46431 Kernel module for ExFAT Filesytems
kmod-fs-udf 3.18.23-1 50408 Kernel module for UDF filesystem support
kmod-fs-ntfs 3.18.23-1 55252 Kernel module for NTFS filesystem support
kmod-fs-hfsplus 3.18.23-1 56519 Kernel module for HFS+ filesystem support
kmod-fs-nfs 3.18.23-1 73058 Kernel module for NFS support
kmod-fs-f2fs 3.18.23-1 78239 Kernel module for F2FS filesystem support
kmod-fs-jfs 3.18.23-1 97257 Kernel module for JFS support
kmod-fs-cifs 3.18.23-1 112208 Kernel module for CIFS support
kmod-fs-nfs-common 3.18.23-1 113480 Common NFS filesystem modules
kmod-fs-reiserfs 3.18.23-1 123829 Kernel module for ReiserFS support
kmod-fs-ext4 3.18.23-1 225581 Kernel module for EXT4 filesystem support
kmod-fs-xfs 3.18.23-1 273230 Kernel module for XFS support
kmod-fs-btrfs 3.18.23-1 470399 Kernel module for BTRFS support

z tabulky vyplývá, že zrovna ext4 je třetí největší, zatímco na opačném konci tabulky máme na výběr z daleko úspornějších modulů (co do velikosti balíčku)

Vyřadil jsem exotické a z jiných důvodů nevhodné.

Teoreticky by bylo možno použít i Jffs2,  který je integrován do základní image firmware, a není tedy potřeba instalovat žádný balíček, ale nedoporučuje se to kvůli odlišně řešené architektuře pamětí typu MTD

Vfat ani exfat nemají žurnál a byl by také problém s ACL. Pro ntfs neexistuje funkční fsck, hfs a hfs+ jsem raději preventivně vyloučil, neboť je pomlouvají – na každém šprochu pravdy trochu, znáte to..

Naopak ale takový f2fs je moderní systém, který je přímo určen pro flashdisky a jiné externí paměti, byl nativně vyvinut pro linux a hlavně – jeho použitím ušetříme minimálně 150kB oproti ext4.

UPOZORNĚNÍ:
neručím za jakékoliv škody, které si následováním postupu níže způsobíte. 
Vše provádíte na vlastní riziko - jedná se o experimentální úpravy, které mohou vést k znefunkčnění
 firmware routeru!
Vše si nejprve zálohujte a nepouštějte se dále, dokud si nebudete jisti že víte
jak zpřístupnit záchranný mód, a jak v něm provést factory reset !

Po instalaci kmod-fs-f2fs a kmod-usb-storage zbylo ještě asi 90 kiB volného místa.
Poté lze již k routeru připojit a namontovat flashdisk naformátovaný jako f2fs. Nicméně, aby mohl být použit jako overlay a namontován do rootu je nutno provést ještě následujících pár kroků:

Je nutné nainstalovat opatchovaný block-mount.

toto je důležité: NEinstalujte balík block-mount z oficiálního repozitáře, neboť

1. oficiální balíček block-mount je do image 15.05.1 pro MR3420v2 již integrován, takže jeho instalací si jen zbytečně uberete místo aniž by se cokoliv změnilo

  1.  tento balík je nutno nejprve opatchovat, neboť v něm je napevno zadrátováno omezení extrootu na ext4
  2. Patchovat a kompilovat můžete buď sami, a nebo si stáhněte již hotový balík, který jsem zkompiloval
  3. Instalujte balík s přepínačem –force-checksum, neboť se samozřejmě liší od oficiálního vydání a opkg se jej zdráhá instalovat jen tak

opkg install –force-checksum  /tmp/block-mount_2016-01-10-96415afecef35766332067f4205ef3b2c7561d21_ar71xx.ipk

Po instalaci opatchovaného block-mount nám zbylo ještě  64 kB volného místa – je to těsné, ale už naštěstí není potřeba už nic dalšího instalovat.

V tuto chvíli vytvoříme na usb flashdisku novou partition (v jiném *nix stroji, např na desktopu) a naformátujeme ji pomocí

mkfs.f2fs

Dále budeme postupovat zhruba podle původního návodu jen s pár drobnými modifikacemi

namontujeme flashku v routeru a zjistíme zda je vidět, a kolik má volného místa

mount /dev/sda1 /mnt

df

vytvoříme a upravíme fstab

block detect > /etc/config/fstab

vi /etc/config/fstab

změníme tučně označené hodnoty:

 

#/etc/config/fstab:

config ‘global’

.

option delay_root ’15’

.

.

config ‘mount’

option target ‘/overlay’

option uuid ‘<< uuid ponechte bez změny >>> ‘

option fstype ‘f2fs’

option enabled ‘1’

a nakonec překopírujeme stávající /overlay do nového umístění

tar -C /overlay -cvf – . | tar -C /mnt -xf –

na tomto místě Vás naposledy vyzývám: vytvořte si zálohu!

Pokud stroj v dalším bodě nenaběhne, budete muset aktivovat rescue-mód a obsah interní flashpaměti smazat, tedy provést factory reset resp. jffs2reset

Když máte zálohu konfigurace uloženou, můžete konečně router restartovat.

Po naběhnutí byste již měli mít funkční extroot s dostatečným volným místem:

extroot2

 

 

3 comments

  1. bouskam

    p.s. existuje i jiná cesta, jak rozchodit extroot – je popsána např. zde a spočívá v sestavení vlastní minimální image, ke které lze nacpat modul pro ext4 na úkor jiných modulů (luci atd).. Ašak toto už lehce zavání možným úplným bricknutím routeru pokud nastane někde chyba – stačí, když zapomeneme na nějaký důležitý balíček, nebo pokud bude výsledná image o pár bajtů větší a máme po ptákách.

  2. bouskam

    p.s.2: až budete vytvářet novou partition na flashdisku, vytvořte si rovnou také jednu pro swap

  3. bouskam

    záplata na KRAK (CVE-2017-13077 až 13088) je v současné době k dispozici pouze pro Openwrt trunk s kernelem 4.4.14. To ale zároveň znamená, že musíme volit mezi exroot a opatchovaným kernelem, neboť potřebné moduly pro 4.4.14 se mi již nepovedlo do té malinké paměti vtěsnat. resp. nacpaly se tam, ale pokusy o mount končily segmentation fault :(

    Kompilovat svou vlastní image je dost nepohodlné, takže díky této situaci budu zřejmě nucen openwrt opustit a jít do LEDE, které alespoň žije a je udržováno komunitou aktuální a opatchované

Napsat komentář