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
- tento balík je nutno nejprve opatchovat, neboť v něm je napevno zadrátováno omezení extrootu na ext4
- Patchovat a kompilovat můžete buď sami, a nebo si stáhněte již hotový balík, který jsem zkompiloval
- 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:
3 comments
bouskam
17/04/2017 na 23:35 (UTC 2) Link to this comment
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.
bouskam
17/04/2017 na 23:38 (UTC 2) Link to this comment
p.s.2: až budete vytvářet novou partition na flashdisku, vytvořte si rovnou také jednu pro swap
bouskam
22/10/2017 na 10:52 (UTC 2) Link to this comment
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é