Hlavní navigace

Plnohodnotný Linux na RouterBoardu s OpenWRT

14. 7. 2009
Doba čtení: 10 minut

Sdílet

Dnešní routovací krabičky mají bohužel velmi málo funkcí. Často je potřeba přidat třeba sdílení USB disku nebo tiskárny, případně podporu IPv6 nebo dynamického routování. Naštěstí není nic ztraceno a máme tu projekt OpenWRT, který dokáže naše požadavky splnit do puntíku. Naneštěstí, nemusí být zcela jednoduché OpenWRT na router dostat.

Motivační odstavec

V tomto motivačním odstavci bych vás rád upozornil na fakt, že jakýmkoli podobným zásahem můžete ztratit záruku anebo v horším případě si svůj router znefunkčnit. Než začnete, rozhodně nenechávejte nic náhodě a držte se rad, které vám tu dám. Je velmi pravděpodobné, že router nebude fungovat podle vašich představ napoprvé. Vždy mějte zálohu původního systému anebo alespoň ověřenou cestu jak se k němu vrátit. Pokud přežijete vy i váš router, budete v něm mít na konci plnohodnotný Linux, pro který nebude problém streamovat video, provozovat web nebo si povídat s ostatními routery v síti o routách.

Než začneme

Než začneme s jakýmkoli zásahem do routeru, musíme si říct, co všechno budeme potřebovat. Především to je samotný router, o kterém alespoň tušíme, že ho OpenWRT podporuje. Pak je to rozhodně sériový nebo JTAG kabel, případě jiný přístup ke krabičce nezávislý na síti. Nakonec pevné nervy a pokud možno i zmíněná záloha původního systému. Dokumentace není kompletní a často se budete muset uchýlit k četbě nejrůznějších návodů, které přes svoje léta vývoje už nemusí být aktuální, a také na vlastní pokus omyl metody.

Seznam podporovaného hardware najdete na wiki. Další odkazy které se mohou hodit:

Pokud váš router v seznamu není, hledejte i Googlem. Často jsou routery stejné, pouze mají jinou nálepku, nebo se může stát, že ten váš obsahuje chipset stejný, jako je  v nějakém již podporovaném. Všechen hardware, co jsem doma vyhrabal, nějakou podporu OpenWRT měl, tak to s tím svým nevzdávejte moc rychle.

Kabely pro přístup ke krabičce

Konektory pro JTAG nebo sériový kabel mohou být řešeny různě, ale na desce ve většině případů jsou. Když máte štěstí, budou řešeny nějakým konektorem, pokud ne, budou řešeny ploškami. V druhém případě je potřeba kabel napájet přímo na desku. U sériového kabelu musíte mít TTL převodník. Já jsem použil kabel od starého telefonu Siemens, kde stačilo odštípnout konektor a nahradit ho vlastním. Další krabičky TTL převodník nepotřebují, jsou to třeba RouterBoardy od Mikrotiku nebo routery Alix.

Seriový kabel a převodník na USB

Potřebný software

Pokud jde o přístup ke krabičce, tak krom toho, že na vašem PC musí být sériový případně paralelní konektor (stačí i USB převodník), tak je potřeba mít i správný software. V Linuxu najdeme třeba oblíbený minicom, ale já mám radši gtkterm.

Dále budeme potřeba DHCP server a TFTP server. Pokud jde všechno dobře hned na poprvé nebo jsme získali již zkompilované obrazy, tak se bez nich možná i obejdeme (upload přes webové rozhraní). Návodů je k dispozici pro oba daemony hodně, ale na jejich konfiguraci se také podíváme.

Hardware

Pokud doma ještě hardware nemáte, můžete si vybrat takový, který bude OpenWRT pasovat nejlépe. Nejméně omezující jsou třeba desky Alix nebo RouterBoardy od Mikrotiku. Ty dají OpenWRT rozlet, že už ani nebudete potřebovat jiný domácí router. Mohou k nim být připojeny i Compact Flash karty nebo USB zařízení. Samozřejmostí jsou MiniPCI případně PCI sloty na WiFi karty a to vše s minimální spotřebou. Společně s RouterBoardy je dodáván velmi kvalitní a stabilní systém RouterOS. Je to systém vhodný pro routování na velkých sítích, ale pro domácí podmínky mu chybí uživatelský software, kvůli kterému to děláme.

Jak na RB433

Tento krátký seriál se bude věnovat instalaci na RouterBoard 433. OpenWRT je ve výsledku sice plnohodnotnou distribucí, ale jelikož se instaluje na hardware, který není vždy proveden standardně, liší se jeho instalace s každou druhou krabičkou. Zařízení, jako je třeba RB433, v sobě mají flash paměť označenou jako tzv. MTD (Memory Technology Device). OpenWRT je na to perfektně připraveno, ale to chce to vědět kam co nakopírovat.

RB433 v akci

Když nabootujeme do OpenWRT, tak se můžeme podívat na oblasti MTD flash disku, které jsou vytvořeny. Nejsou to běžné oblasti jako je známe našich systémů, ale mají úzkou souvislost s JFFS2.

OpenWRT $ cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00004000 "booter"
mtd1: 003c0000 00004000 "kernel"
mtd2: 03c00000 00004000 "rootfs" 

První oblast obsahuje bootloader a je lepší ji nechat na pokoji. Špatně by se pak obnovoval její obsah. Druhá oblast obsahuje jádro systému a je to místo, kam sahá bootloader, když mu zavelíme spustit systém. Poslední oblast obsahuje root našeho systému, ať už jde o RouterOS, nebo OpenWRT. Nebudeme předbíhat a pustíme se do vytváření obrazu, který později použijeme na instalaci systému.

Krom vytváření obrazu tu je ještě možnost stáhnout si již připravené obrazy. Pokud vám s nimi RouterBoard nebo jiná krabička jede, není důvod je nepoužít. Pokud si chcete užít trochu legrace nebo si připravit obraz přesně na míru, tak bude konfigurace a kompilace právě pro vás. Pokud si obraz připravíte přesně na sebe, stačí ho pak rozkopírovat mezi hardware, doladit nastavení a vše by mělo hned jet.

Získání zdrojového kódu

Nejjednodušší cesta je získat zdrojové kódy z SVN repositáře. Můžeme si vybrat mezi vývojovou a stabilní verzí. Na RB433 se mi u stabilní větve systém resetoval, pokud data procházela přes WiFi, takže jsem nakonec zvolil vývojovou verzi a již několik dní jede router bez jediného problému.

Připravíme adresář a stáhneme do něj zdrojové kódy:

desktop $ mkdir openwrt
desktop $ cd openwrt

#Vývojová verze:
desktop $ svn co svn://svn.openwrt.org/openwrt/trunk
desktop $ cd trunk

#Stabilní verze:
desktop $ svn co svn://svn.openwrt.org/openwrt/branches/8.09/
desktop $ cd 8.09 

Vyberte si takové místo, kde máte minimálně 2 GB prostoru.

Když se vše stáhne, všimneme si adresáře bin a packages. Do bin se uloží vše, co zkompilujeme. Odtud budeme kopírovat soubory do naší krabičky. V adresáři packages jsou uloženy soubory nutné pro kompilaci balíčků. Můžeme si tam také pár balíčků přidat. Najdeme je pak v menu při konfiguraci.

Je čas začít s konfigurací. Určitě budete potřebovat nástroje pro kompilaci jako je autotools a GCC. O vše si instalační proces řekne, když kontroluje prerekvizity. Konfigurační menu spustíme pomocí známého:

desktop $ make menuconfig 
OpenWRT konfigurační menu

Objeví se nám menu, které je velmi podobné tomu, které používá jádro. V něm si můžeme vybrat balíčky, které budeme potřebovat. Pokud jde o RB433, nemusíme být zbytečně skromní, protože se do něj vejde 60 MB dat, a to je dost na všechny důležité nástroje, včetně quaggy, a ještě hodně místa zůstane.

Stabilní a vývojová verze se v tomto menu trochu liší, ale to hlavní zůstává.

OBR-menu

Nejdříve vybereme v první nabídce náš procesor. V případě RB433 to je AR71×x. V další nabídce si vybereme profil. RB433 funguje dobře s profilem „Atheros WiFi (madwifi)“. Najdeme zde ale i profily pro konkrétní zařízení. Pokud nám nevyhovuje nic, dáme „Default Profile“. Stabilní verze má jen default profil a madwifi si do ní musíme zaškrtnout zvlášť. Další velmi důležitou volbou je formát obrazu. Jako první musíme vytvořit ramdisk. Další volby týkající se vývojářů a SDK můžeme ignorovat. Pokud chcete, můžete si nastavit výchozí konfiguraci sítě. Je to lepší než ho při každém bootu měnit ručně. Až budeme později kompilovat plnohodnotný root, tak je tato volba zbytečná, protože si uložíme nastavení přesnější a přímo do něj.

Pak už přichází jen výběr balíčků. Jak jsem již říkal, RB433 má místa dost, takže i když vyberete balíčků víc, bude mít systém maximálně 15–20 MB. Můj má 17 MB včetně collectd, dhcpd a quaggy. Běžně se dá OpenWRT namačkat i do 4 MB veliké flash paměti. Pokud ji má zařízení méně, nemá smysl se o OpenWRT pokoušet. Sice ho tam třeba dostanete, ale sváže vám to ruce. Často je velikost RAM větší než flash, a tak se dá vytvořit RAM disk a do něj skriptem nastrkat potřebné balíčky. Nicméně nejde o moc pohodlné řešení.

Než opustíme konfigurační menu, zkontrolujeme, jestli jsme zaškrtli všechny moduly související se sítí (hlavně WiFi) a také odškrtli moduly, které rozhodně potřebovat nebudeme, jako je zvuk, video, USB, hardware, který na desce není atd.

Pokud si myslíme že je vše ok, uložíme nastavení a pokračujeme kompilací.

desktop $ make -j5 

Parametr -j5 je v tomto případě důležitý, pokud nechceme čekat několik hodin, než se kompilace dokončí. Říkáme tím programu make, kolik úkolů může spustit maximálně najednou. Ve výchozím stavu to bývá často pouze jeden a v praxi je pak rozdíl až několikanásobný. Číslo si upravte podle schopností vašeho hardwaru, resp. podle počtu procesorů případně jader.

Během kompilace

Než se kompilace dokončí, bude to chvíli trvat a dá nám to čas na přípravu bootovacího prostředí. RB433 dokáže nabootvat z flash paměti nebo ze sítě. Abychom do ní dostali nějaký systém, musíme nejdříve zavést jeden ze sítě a druhý do něj nakopírovat. Proto zatím kompilujeme ramdisk. Abychom o něm mohli říct RB433, potřebujeme funkční DHCP server a TFTP server.

Najdeme si a nainstalujeme tři balíčky:

atftpd      TFTP server
atftp       pro testování
dhcp3-server    DHCP server 

Názvy se mohou v různých distribucích lišit. Poté připojíme RB433 ethernetovým kabelem do našeho počítače a nastavíme oba dva nainstalované daemony.

Daemon atftpd má v Ubuntu/Debianu svůj konfigurační soubor v /etc/default/at­ftpd. Nemusíme nic měnit, jenom si zapamatujeme, že soubory budeme kopírovat do /var/lib/tftpboot. DHCP daemon je trochu složitější. Tomu musíme říct o rozsahu, který přidělujeme, zapnout v něm podporu pro bootování a přidat pár informací pro zařízení s konkrétní MAC adresou, hlavně název souboru, který si má v rámci bootování stáhnout. Konfigurační soubor dhcpd najdeme ve většině distribucí v /etc/dhcp3/dhcp­d.conf a měl by vypadat podobně jako tento:

allow booting;
allow bootp;

authoritative;
ddns-update-style ad-hoc;

# nastavení rozsahu adres
subnet 90.182.30.16 netmask 255.255.255.240 {
range 90.182.30.23 90.182.30.30;
    option ip-forwarding off;
    option broadcast-address 90.182.30.31;
    option subnet-mask 255.255.255.240;
    option domain-name-servers 10.0.0.1;
    option routers 90.182.30.17;
}

# nastavení týkající se RB433
host routerboard {
    hardware ethernet 00:0C:42:3C:4F:56; # RB433 má tuto MAC adresu
    next-server 90.182.30.20; # na tomto serveru bude k nalezení obraz systému
    fixed-address 90.182.30.28; # RB433 dostane tuto adresu
    filename "openwrt"; # a systém je k nalezení v tomto souboru
} 

Nakonec by mělo stačit:

desktop $ /etc/init.d/dhcp3-server restart 

případně ještě:

desktop $ /etc/init.d/atftpd restart 

A měli bychom být připraveni na bootování RB433.

Bootujeme ze sítě

Po kompilaci se opět přepneme do konfiguračního menu a v nabídce „Target Image“ vybereme „tgz“. Po uložení dáme opět „make -j5“. Nyní bude čekání o dost kratší, protože není potřeba kompilovat vše.

Teď do adresáře, který zpracovává atftpd nakopírujeme ramdisk se systémem a jádrem:

desktop $ sudo cp bin/openwrt-ar71xx-vmlinux-initramfs.elf /var/lib/tftpboot/openwrt 

Mikrotika si připojíme k sériové lince, spustíme gtkterm nebo podobný program a při nabíhání bootovací proces přerušíme a pomocí písmene „o“ nastavíme bootování ze sítě. Možná bude ještě potřeba přehodit bootovací protokol.

Pokud vše proběhlo správně, měl by nám začít nabíhat systém a později po stisknutí enteru i příkazová řádka. Pokud jsme si nenastavovali síť při konfiguraci obrazu, musíme ji teď nastavit ručně.

openWRT $ ip l s br-lan down
openWRT $ brctl delbr br-lan
openWRT $ ip a a 90.182.30.21/28 dev eth0 

Teď bychom měli mít k dispozici síť. Přimontujeme si disky:

openWRT $ mkdir /mnt/kernel
openWRT $ mkdir /mnt/root
openWRT $ mount /dev/mtdblock1 /mnt/kernel
openWRT $ mount /dev/mtdblock2 /mnt/root 

Než začneme dělat destruktivní změny, je potřeba si všechno zazálohovat. Zjednoduší to pozdější obnovu (pokud bude potřeba). Pro RouterBoardy existuje i program netinstall, který dokáže RouterOS vrátit na své místo. Pokud se k RouterOS již vracet nechcete, zálohu dělat nemusíte. Nejjednodušší je zabalit celý adresář /mnt/root do tar archivu a odeslat ho někam na bezpečné místo pomocí scp. V adresáři /mnt/kernel je pouze soubor kernel, obsahující jádro, ten balit nemusíme, stačí ho přesunout jinam.

Instalace

Pokud se nám již zkompiloval systém, kde je root uložen v tgz, je čas začít kopírovat nový systém tam kam patří.

Nejdříve je potřeba vymazat existující data na /dev/mtdblock1 a 2.

openWRT $ umount /mnt/kernel
openWRT $ umount /mnt/root
openWRT $ mtd erase /dev/mtdblock1
openWRT $ mtd erase /dev/mtdblock2
openWRT $ mount /dev/mtdblock1 /mnt/kernel
openWRT $ mount /dev/mtdblock2 /mnt/root 

Pokud tento krok vynecháte, můžou se stávat různé divné věci jako třeba ztráta souborů po restartování routeru.

Poté je potřeba přebalit tgz na tar, protože si OpenWRT s tgz neporadí.

desktop $ cd bin/
desktop $ mkdir root
desktop $ cp openwrt-ar71xx-rootfs.tgz root/
desktop $ cd root
desktop $ tar xf openwrt-ar71xx-rootfs.tgz
desktop $ rm openwrt-ar71xx-rootfs.tgz
desktop $ tar cf ../root.tar * 

Nyní na OpenWRT zadáme něco ve smyslu:

openWRT $ scp 90.182.30.20:/cesta/k/bin/root.tar /mnt/root/
openWRT $ scp 90.182.30.20:/cesta/k/bin/openwrt-ar71xx-vmlinux.elf /mnt/kernel/kernel 

Nakopírovali jsme si archiv s rootem do paměti a taky jsme přenesli jádro přímo na své místo.

Nyní zbývá rozbalit root kam patří.

CS24_early

openWRT $ cd /mnt/root
openWRT $ tar xf root.tar
openWRT $ rm root.tar 

Nakonec můžeme upravit některá nastavení a po restartu by mělo RB433 nabootovat do OpenWRT. Pokud se tak stalo, gratuluji.

Závěr

Tady naše cesta za plnohodnotným Linuxem na RB433 nekončí. Musíme si ukázat jak se instalují balíčky, jak přidat balíčky přímo do rootu při kompilaci, jak se nastavuje síť pomocí konfiguračních souborů OpenWRT nebo jak se nastavují WiFi karty. Tohle všechno ale až příště.

Seriál: OpenWRT

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.