Bystroushaak's blog / Czech section / Hardware / Kompilace OpenWRT na router Edimax BR6104KP

Kompilace OpenWRT na router Edimax BR6104KP

Před půl rokem

O velkých prázdninách jsem při čtení webu o robotice narazil na článek o routeru BR6104KP (verzi bez P na konci nebrat, chybí jí dva USB porty které je nutné připájet!), což je v podstatě zakuklený počítač. Připadalo mi to zajímavé, ba přímo skvělé, tak jsem si z aukra přidal do readeru RSS feed vyhledávání a čekal kdy se objeví nějaký router za přijatelnou cenu. Netrvalo to dlouho a podařilo se mi jeden nový a nikdy nepoužívaný koupit za 300kč i s poštovným.

Jakmile mi přišel domu, okamžitě jsem ho vybalil a jal se prohlížet co jsem to vlastně vydražil. Router vypadá (překvapivě..) jako router - krabička v pěkném stříbrnočerném designu, 4 LAN porty, 1 WAN, 2 USB, konektor na trafo a miniaturní zapuštěné reset tlačítko. Obsah balení dále tvoří zdroj 9V v malé bílé papírové krabičce, manuál, CDčko a disketa (:D). Disketu jsem hodil do poličky mezi ostatní starožitnosti, manuál jsem zběžně prolétl, ale jedná se jen o step by step guide pro cvičené opice schopné rozpoznat obrázky. CDčko nabízí podstatně více - nacházejí se zde spousty ovladačů, elektronická verze manuálu a různé návody jak rozhodit sdílený printserver který router nabízí na všech třech hlavních OS. Po zevrubném prozkoumání jsem ho vyndal z notebooku a putovalo do další poličky, tentokrát té určené na zbytečné krámy.

Po chvíli kdy jsem hledal ethernet kabel jsem se na router napojil a prohlédl si webové rozhraní. Jedná se o standard který je možné v různém grafickém provedení nalézt na téměř každém levném domácím routeru, takže mě to rychle znudilo a začal jsem hledat jak že to mám vlastně router upravit na linuxovou mašinu. Během chvilky googlení jsem narazil na původní článek, který mě tenkrát tak nadchl.

Úprava hardware

Hardwarová modifikace je jednoduchá - stačí jen připájet neosazený konektor do portu kde je vyvedený JTAG (JP2). Jedná se o osm děr, které je nutné provrtat (jsou ucpané pájecím materiálem) a z obou stran desky do nich připájet konektor. Později jsem přišel na to, že není nutné osazovat všechny piny, ale stačí vždy dva krajní, dohromady tedy čtyři.

Jelikož je možné že čipy na desce jsou citlivé vůči magnetickým polím, není možné použít mojí milovanou, 30 let starou trafopájku, ale je nutné pájet něčím co nevytváří takové EMP, tedy například mikropájku. Díky tomu že mám nějakej 40W šmejd za stopade z GME se jednalo doslova o utrpení. Cín (je mi jasné že to není čistý cín, ale stejně tomu tak říkám) se nechtěl tavit, celé mi to trvalo strašně dlouho a na konci jsem byl už tak nasraný že jsem to vzal trafopájkou kterou jsem zapnul nataženou rukou co nejdále od desky. To co jsem neudělal za půl hodiny mikropájkou bylo trafopájkou hotové během půl minuty, obvody to naštěstí přežily bez újmy.

Připojení k počítači

Poté co jsem připájel konektor přišlo na řadu zjišťování jak že to mám vlastně s routerem komunikovat. Pro přenos dat se používá UART, což je vlastně zjednodušený RS232C pracující v nižších napěťových úrovních. V praxi to znamená, že běžný osobní počítač se na sériovou konzoli nemůže nijak jednoduše připojit. Pokud má ještě dnes již nemoderní sériový port (tedy podporu RS232), tak je pořád nutný převodník napěťových úrovní, pokud ho nemá tak je nutné si sehnat něco sofistikovanějšího.

Jedna z možností je použít externí převodník USB2RS232 a dobastlit si k němu ještě převodník úrovní, což je ovšem poněkud nepohodlné a časově náročné. Další možnost je použít arduino, nebo nějaký podobný programovatelný kit a naprogramovat si do něj UART bridge - program který přepne mikrokontroler do režimu kdy pouze předává zaslaná data dál, v našem případě na router.

Jelikož se mi doma už nějakou dobu válí BusPirate, rozhodl jsem se že ho konečně nějak smysluplně využiji. BusPirate není programovatelný obvod jako třeba arduino (resp. je, ale není k tomu určený), ale svým způsobem hydra, která se umí připojit na nejrůznější komunikační sběrnice a odposlouchávat je (funguje i jako ne moc kvalitní logický analyzátor), popřípadě do komunikace aktivně zasahovat. Funkci UART bridge v sobě má už zabudovanou a její spuštění a nastavení je dílem několika příkazů (M, 3, 9, ENTER, ENTER, ENTER, 2, (1), mezerník). Potěšilo mě že umí přímo 3.3V logiku, takže jsem nemusel ani přidávat odpory které by zajistily konverzi mezi 5V UARTem.

Zapojení konektoru je jednoduché - na jedničce (je označená na desce) je Rx, na dvojce +3V, na sedmičce Tx a na osmičce Gnd. Jelikož jsem na rozložení neustále zapomínal, po chvíli jsem se naštval a napsal jsem si to tam lakem na nehty (drží o hodně lépe jak lihová fixa, je levný, ale zase se s ním blbě píše).

Minicom (software pro sériovou komunikaci) jsem už měl z dřívějška na ubuntu nastavený, takže jsem ho zapnul a přepnul buspirate do potřebného módu. Poté co se jsem experimentálně ověřil (;D) že Rx na zařízení musí přijít Tx mastera a naopak jsem byl konečně připojený na sériovou konzoli.

Jakmile jsem desku resetoval, objevila se bootovací hláška (pokud chcete přejít do nastavení, je nutné třikrát rychle zmáčknout mezerník), po které následovala záplava informací od linuxového jádra a něco co požadovalo heslo, ale nešlo do toho psát, protože se přepisoval pořád ten samý znak. Moc jsem to nezkoumal a desku jsem zase vypnul.

Nahrávání software

Když jsem teď měl vyřešené propojení s počítačem, nastalo shánění software. Jako první jsem našel distribuci Midge. Chvíli mi trvalo než jsem na jejich stránce nalezl binárku ke stažení, přičemž mě zarazilo především to, že je to poněkud stará distribuce. Poslední buildy jsou staré cca čtyři roky a jedou ještě na jádru 2.4.

Spustil jsem minicom a rychle zmáčkl třikrát po sobě mezerník. Naskočilo menu, ze kterého jsem si vybral že chci nahrávat do flash paměti, načež počalo zobrazování jakéhosi progressbaru. Došlo mi, že bych měl asi vybrat soubor který chci uploadnout, ale než jsem v nápovědě minicomu našel jak na to, spojení timeoutovalo. Nenechal jsem se odradit a zkusil jsem to znovu, ale opět s neúspěchem. Zkoušel jsem to takhle několikrát, ale prostě není možné tak rychle vybrat upload souboru, vybrat xmodem, najít ve filesystému potřebnou image, mezerníkem jí potvrdit a eneterem odeslat. Naštěstí jsem po chvíli googlení našel python script který to automatizuje.

Midge nebylo úplně špatné, ale postupně jsem dostával pocit že tomu něco chybí. Jasně, zařízení v /dev do kterých se dá zapisovat a podle nich blikají ledky jsou parádní, ale jakákoliv snaha o instalaci nového software byla fakt utrpení. Navíc podpora flashdisku byla fakt podivná a trvalo mi fakt dlouho než jsem přišel na to, že nemám hledat zařízení v /dev, ale v /rom/dev/scsi/tri/prdele/podslozek. Má nespokojenost s touto distribucí narůstala, takže jsem se rozhodl že si najdu jinou. Mezitím mi ovšem začala škola, takže jsem se k tomu už nedostal.

Squidge vs OpenWRT

Squidge je lehce upravené OpenWRT, což je linuxová distribuce určená pro routery. V případě Squidge se jedná o model Edimax BR6104KP a většina úprav spočívá v automatickém nastavení distribuce a patche pro podporu usbrootu, což znamená že kořenový adresář není v routeru, ale na externím flashdisku. Má to své nevýhody - router tak ke svému běhu potřebuje neustále připojený flashdisk, který se navíc časem opotřebovává, také je třeba počítat s jistým zpomalením. Na druhou stranu to má i své výhody - místo 2MB získáváte prakticky neomezený prostor, pokud si vytvoříte swap, tak navíc i rozšíření na dnešní dobu nepěkně malých 16MB SD-RAM.

Squidge vzniklo cca v roce 2009, a OpenWRT od té doby podstatně pokročilo. V dnešní době již není problém nastavit usbroot bez nutnosti nějakého složitého patchování a úprav konfiguračních scriptů. Na Squidge mi navíc nefunguje většina balíků, protože jim něco chybí (přebývá), takže po spuštění binárky vypíšou podivnou hlášku a spadnou. To je dost velká závada třeba v případě takového pythonu, bez kterého se na libovolném shellu prakticky neobejdu. Nevím nakolik se jedná o můj problém a nakolik je to problém samotného Squidge a úprav kompilačních scriptů, ale nepodařilo se mi ho vyřešit a tak jsem se odhodlal zkusit sestavit OpenWRT.

Samotné sestavení je relativně jednoduché - v textové grafice je nutné zaškrtat všechny potřebné moduly a nastavení. Při jejich výběru jsem vycházel z anglického OpenWRT fóra, konkrétně USB-rootfs on boot on Edimax BR-6104KP (ADM5120) [WORKS]. Považuji za nutné dodat, že v prvním příspěvku není popsané úplně všechno a stálo mě několik hodin života než jsem na to přišel. Celé sestavování probíhalo na Ubuntu 10.10.

Získání zdrojových kódů

Prvním krokem je stažení aktuální kopie zdrojových kódů. I když samotné zdrojové soubory zabírají poměrně málo místa (38.5MB), připravte si cca 3GB volného místa na vše ostatní co se bude stahovat v průběhu kompilace. Zdrojové kódy je možné získat přez svn, adresu najdete na stránce https://dev.openwrt.org/wiki/GetSource. Osobně jsem si vybral kamikaze, protože ho používal Squidge. Kamikaze nebrat, má porouchaný opkg. Backfire funguje k plné spokojenosti.

Stažení verze kterou jsem si vybral já provedete pomocí příkazu:

svn co svn://svn.openwrt.org/openwrt/branches/backfire .

Ten stáhne vše potřebné do aktuální složky, takže si nazapomeňte před provedením vytvořit nějakou prázdnou složku a vstoupit do ní.

make menuconfig

Jakmile máte staženo, zadejte:

make menuconfig

Pokud máte všechny potřebné nástroje, vyskočí na vás dialog, ve kterém je zapotřebí nastavit tyto hodnoty na hvězdičku (*):

Target system
  Infineon/ADMtek ADM5120 [2.6]
Subtarget
  Little Endian
Target Profile
  Edimax BR-6104KP (Unofficial)
Target Images
  jffs2 (NEW)
  squashfs (NEW)
  tgz (NEW)

Pokud chcete mít možnost crosskompilovat pro daný router, zaškrtněte i

Build the OpenWrt SDK (NEW)

Díky tomu se stáhne a sestaví OpenWRT toolchain, což jsou kompilátory a další potřebné nástroje pro crosskompilaci.

Šipkou doprava vyberte Exit a potvrďte uložení konfigurace.

make kernel_menuconfig

Poté co jste nastavili obecné informace přichází na řadu to důležitější - nastavení konfigurace jádra. Spustíte jí příkazem

make kernel_menuconfig

Na terminál se vám začnou vypisovat zprávy o stahování všemožných balíků a kompilaci. Jakmile se vše potřebné stáhne a nainstaluje, vyskočí na vás opět dialog.

Machine selection
  System type (Infineon/ADMtek ADM5120 SoC based machines)
  ADM5120 Board selection
    Zde odškrtejte vše, kromě:
      Edimax BR-6104K support
      Edimax BR-6104KP support
      MikroTik RouterBOARD 111/112 support
        Bez této desky se neobjeví možnost vybrat PCI, takže jí ponechte zaškrtlou.

General setup
  * Support for paging of anonymous memory (swap)

Bus options (PCI, PCMCIA, EISA, ISA, TC)
  * Support for PCI controller
  * PCI disable common quirks

Device Drivers
  Memory Technology Device (MTD) support
    Následující tři hodnoty odškrtněte, pokud zůstanou zaškrtlé, nepůjde vám zapisovat na flashdisk:
    Automatically set 'rootfs' partition to be root filesyst
    Automatically split 'rootfs' partition for squashfs
    Automatically find and split TRX partitions

  SCSI device support
    SCSI device support
      Zaměňte M za * (stisknutím mezerníku)
    SCSI disk support
      Zaměňte M za *
  USB support
    Support for Host-side USB
      Zaměňte M za *
    * USB announce new devices
    * USB device filesystem
    ADM5120 HCD support (EXPERIMENTAL)
      Zaměňte M za *
    * OHCI HCD support //bez tohohle nepůjde v Backfire bootovat z flashdisku
    USB Mass Storage support
      Zaměňte M za *

File systems
  Ext3 journalling file system support
    Zaměňte M za *

Kernel hacking
  Odentrujte poslední řádku a upravte jí do následujícího tvaru (rootdelay je doba čekání na flashdisk):
  console=ttyS0,115200 root=/dev/sda1 init=/etc/preinit ro rootwait

Poté opět vyberte Exit a potvrďte změnu konfigurace.

make

Nyní je na čase zkompilovat jádro. Provedete to zadáním příkazu make, ale osobně doporučuji spíš:

yes n | make V=99

Což zvýší jeho ukecanost a navíc automaticky na vše odpovídá že ne. To se docela hodí, protože script se z nějakého důvodu s odstupem cca 10m dvakrát za sebou ptá na podporu Olympus foťáků, což je docela nepříjemné jelikož to přeruší kompilaci dokud mu neodpovíme.

Příprava flashdisku

Nyní je dobré si připravit flashdisk. Rozdělte ho (například v Gparted) tak, aby první partišna byla typu ext3 a druhá swap. Je důležité dodržet pořadí a obě dvě nechat jako primární. Velikost swapu nechám na vás, já jsem si udělal 64MB, ale klidně to může být dvojnásobek. Pamatujte že čím větší bude swap, tím více paměti budete mít k dispozici a tím rychleji odejde příslušná část flashdisku do křemíkového nebe.

Poté co disk rozdělíte ho naformátujte.

Jakmile bude disk naformátovaný, je dobré si na něj stáhnout všechny možné balíky, protože opkg (package manager) má problém s busybox wgetem, kterému předává argument že má stáhnout informace do neexistující složky, kterou si wget neumí vytvořit :S

Přejděte do disku a vytvořte v něm složku třeba ipk, do které stáhnete všechny dostupné balíky.

mkdir ipk
cd ipk
wget -nd -r -l 1 http://downloads.openwrt.org/kamikaze/8.9.2/adm5120/packages/

Tento příkaz není úplně ideální, protože my potřebujeme pouze mipsel balíky, mips jsou nám k ničemu. To jak odstranit/nestahovat všechny mips balíky nechám na vás, sám jsem to vyřešil poněkud nepěkně.

Kompilujem a stahujem..

Jelikož tohle píšu zároveň s ukázkovou kompilací abych si ověřil že jsem na nic nezapomněl, následuje teď část kdy budu asi tak hodinu (real 45m33.908s) čekat než se systém zkompiluje. Co při tom budete dělat vy je na vás, já se jdu kouknout jestli není něco v televizi.. Nic nedávali, tak jsem si udelal aspoň večeři - dva přírodní řízky ;).

Dokompilováno a dostahováno

Jakmile se vše zkompiluje a wget dostahuje repozitáře, přijde na řadu nahrávání image do routeru a rozbalení usbrootu na flashdisk.

Ve složce bin naleznete několik souborů:

openwrt-adm5120-br-6104kp-squashfs-xmodem.bin je image, která se nahrává do routeru
openwrt-adm5120-rootfs.tgz je usbroot, který rozbalte na flashdisk
packages/ složka s balíky, v podstatě jí nepořebujete, protože již máte vše na flashdisku

Rozbalení souborů na flashdisk provedete příkazem:

tar -xvf openwrt-adm5120-rootfs.tgz /cesta/k/flashdisku

Nahrání image do routeru pak pomocí scriptu adm_upload.py (jedná se o mnou lehce ořízlou, ale ozkoušenou verzi):

sudo ./adm_upload.py -d /dev/ttyUSB0 -b openwrt-adm5120-br-6104kp-squashfs-xmodem.bin

Pokud vás zajímá jak má vypadat funkční výstup nahrávání, najdete ho zde: http://openpaste.org/en/24768/.

Co dál?

Dál je dobré přečíst si stránku na OpenWRT wiki: http://wiki.openwrt.org/toh/edimax/br-6104kp a začít konfigurovat.

Nutností je zapnout podporu swapu:

root@OpenWrt:/# opkg install swap-utils
Installing swap-utils (2.13.0.1-2) to root...
Installing libblkid (1.40.11-1) to root...
Installing libuuid (1.40.11-1) to root...
root@OpenWrt:/ipk# mkswap /dev/sda2
Setting up swapspace version 1, size = 67104 kB
no label, UUID=8c1afdc1-531b-4e73-b4f4-d88b90e63ad5
root@OpenWrt:/ipk# swapon /dev/sda2
Adding 65528k swap on /dev/sda2.  Priority:-2 extents:1 across:65528k
root@OpenWrt:/ipk# free
              total         used         free       shared      buffers
  Mem:        13612        11524         2088            0          640
 Swap:        65528            0        65528
Total:        13612        11524         2088
root@OpenWrt:/ipk# cd /etc/config/
root@OpenWrt:/etc/config# # je nutne aktivovat automaticke pripojovani swapu prepsanim nuly u enabled na jednicku
root@OpenWrt:/etc/config# vi fstab
root@OpenWrt:/etc/config# cat fstab
config swap
    option device   /dev/sda2
    option enabled  1

Určitě je také dobré si změnit heslo a vypnout telnet:

root@OpenWrt:/# passwd
Changing password for root
New password:
Bad password: too weak
Retype password:
Password for root changed by root
root@OpenWrt:/# cd /etc/init.d/
root@OpenWrt:/etc/init.d# ./telnet
Syntax: ./telnet [command]

Available commands:
    start   Start the service
    stop    Stop the service
    restart Restart the service
    reload  Reload configuration files (or restart if that fails)
    enable  Enable service autostart
    disable Disable service autostart

root@OpenWrt:/etc/init.d# ./telnet disable

nainstalovat python:

root@OpenWrt:/ipk# opkg install python

a v mém případě i nastavit jinou konfiguraci sítě:

root@OpenWrt:/etc/config# cat network
# Copyright (C) 2006 OpenWrt.org

config interface loopback
    option ifname   lo
    option proto    static
    option ipaddr   127.0.0.1
    option netmask  255.0.0.0

config interface lan
    option ifname   eth0
    option type     bridge
    option proto    dhcp
#   option proto    static
#   option ipaddr   192.168.1.1
#   option netmask  255.255.255.0

Rozbitý wget/opkg

Pokud se pokusím nainstalovat daný balík z repozitářů na internetu, vypadá to asi takhle;

root@OpenWrt:/# opkg update
Downloading http://downloads.openwrt.org/kamikaze/8.09.2/adm5120/packages/Packages.gz
Connecting to downloads.openwrt.org (78.24.191.177:80)
Packages.gz          100% |*******************************|   286k 00:00:00 ETA
Inflating http://downloads.openwrt.org/kamikaze/8.09.2/adm5120/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/snapshots
root@OpenWrt:/# opkg install python
Installing python (2.5.4-2) to root...
Downloading http://downloads.openwrt.org/kamikaze/8.09.2/adm5120/packages/python_2.5.4-2_mipsel.ipk
xsystem: ERROR: fork failed before execution: `wget --passive-ftp    -P /tmp/opkg-A9ul9e http://downloads.openwrt.org/kamikaze/8.09.2/adm5120/packages/python_2.5.4-2_mipsel.ipk'
Collected errors:
 * Failed to download python. Perhaps you need to run 'opkg update'?
root@OpenWrt:/# wget --passive-ftp    -P /tmp/opkg-A9ul9e http://downloads.openwrt.org/kamikaze/8.09.2/adm5120/packages/python_2.5.4-2_mipsel.ipk
Connecting to downloads.openwrt.org (78.24.191.177:80)
wget: can't open '/tmp/opkg-A9ul9e/python_2.5.4-2_mipsel.ipk': No such file or directory
root@OpenWrt:/# mkdir /tmp/opkg-A9ul9e
root@OpenWrt:/# wget --passive-ftp    -P /tmp/opkg-A9ul9e http://downloads.openwrt.org/kamikaze/8.09.2/adm5120/packages/python_2.5.4-2_mipsel.ipk
**Connecting to downloads.openwrt.org (78.24.191.177:80)**
python_2.5.4-2_mipse 100% |*******************************|  2842k 00:00:00 ETA
root@OpenWrt:/# sh --help
BusyBox v1.11.2 (2011-02-14 21:03:32 CET) multi-call binary

No help available.

root@OpenWrt:/# type wget
wget is /usr/bin/wget

Z toho nejspíš plyne, že nainstalovaný wget si neumí vytvořit složku do které má zapisovat. Nevím jestli je to jediná chyba, ale pokud se chce někomu napsat nad ním jednoduchý wrapper pro ash (resp. dash), který je v routeru přítomen namísto bashe, bude super když to postne do komentářů. Problémy se týkají pouze Kamikaze, v Backfire je vše v pořádku

Závěr

OpenWRT je skvělý systém, jehož jedinou nevýhodou jsou problémy s opkg. Oproti Squidge na něm jede python, čímž si zajistil že ho budu používat namísto něho.

Become a Patron