Debian na Compact Flash

V souladu s předchozími články (1. díl, 2. díl) o změnách v mé domácí síti pokračuji článkem o tom, jak jsem ohýbal Debian, aby spolehlivě fungoval na Compact Flash kartě. Moje řešení je možná špinavé a neoptimální, ale zase se dá realizovat poměrně rychle a zatím to vypadá, že funguje.

Předesílám, že celou úvodní instalaci a veškerou následnou konfiguraci provádím ve virtuálním stroji (VirtualBox), a teprve finální verzi nahraju na CF kartu. Výhodou je, že v té konfiguraci, kterou jsem zvolil, je možné dělat „upgrade“ přímo ze sítě. Více o tom si povíme na závěr.

Je jasné, že díky omezenému počtu přepisů flash pamětí je třeba minimalizovat zápis na CF kartu. Ultimátní řešení (ve smyslu řešení, které jde tak trochu přes mrtvoly) v tomto případě představuje připojení všech souborových systémů z CF karty v režimu read-only.

Kartu jsem rozdělil do dvou oddílů, /boot a /. Přirozeně nelze vystačit pouze se dvěma nezapisovatelnými oblastmi. Systém přeci jen potřebuje někam zapisovat. Takže všechny adresáře, kde je nutný zápis, připojím jako tmpfs. V mém případě je to /tmp, /var/log, /var/lib/dhcp3, /var/lib/urandom, /var/lib/logrotate, /var/cache/pdnsd, /etc/network/run, /var/run, /var/lock. V rámci tmpfs je možné specifikovat i maximální velikost, což se u stroje s 256MB RAM hodí (volba size).

Kromě výše uvedeného jsem ještě vytvořil symlink /var/tmp ukazující na /tmp, a problém s mtab jsem vyřešil symlinkem /etc/mtab ukazujícím na /proc/mounts. To není čisté ani 100% řešení, ale pro router to stačí.

Upgrade routeru přes síť

Výhodou je, že všechny souborové systémy na CF kartě jsou připojeny v režimu pouze pro čtení, takže se systém dá upgradovat za běhu ze sítě prostým:

dd if=image.raw | ssh root@router "dd of=/dev/hda; sync; /root/okamzity_restart"

S tím, že skriptík /root/okamzity_restart obsahuje příkaz:

echo "b" > /proc/sysrq-trigger

Ten, jak už název skriptu naznačuje, provede okamžitý reboot routeru. Zařízení pak nabootuje s novým imagem na CF kartě.

Další hacky

V zásadě nic převratného a důležitého jsem udělat nepotřeboval. Sestavil jsem jen skripty pro „odemknutí“ systému do režimu pro zápis, automatickou aktualizaci, fsck a vyčištění systému před „exportem“ na CF kartu. Do /etc/rc.local jsem přidal podmínku, která zjišťuje, jestli systém běží ve virtuálním stroji, a pokud ano, pak provede některé úpravy síťování. Opět, nic převratného.

Výsledek

Výsledek je plně funkční a dělá to, co po něm chci. Problémy jsem zatím nezaznamenal. Tyto úpravy samozřejmě nejsou čistým řešením, ale pro potřeby routeru postačují.