Sestavení operačního systému OpenWRT se specifickými vlastnostmi

OpenWRTOpenWRT je operační systém založený na jádře Linux. Cílovou skupinou jsou zejména WiFi routery a zařízení s malým množstvím paměti. Velice často je tímto systémem nahrazován původní firmware komerčních produktů, oproti nimž přidává zejména podporu komunitních vývojářů a uživatelů, množství nových softwarových funkcí, ale také prakticky nekončící vydávání nových aktualizací. Kromě toho může někoho zaujmout otevřenost zdrojových kódů a možnost celý systém sestavit vlastními silami na svém vlastním počítači.
OpenWRT se skládá z několika softwarových komponent. Těmi jsou: upravené jádro Linux a ovladače pro hardware, knihovna uClibc, util-linux, BusyBox a volitelné softwarové balíčky. OpenWRT podporuje také aktualizace systému a instalaci dalších softwarových balíčků. Limitováni jsme zejména velikostí úložného prostoru (nejčastěji paměť typu Flash).

Umístění firmware ve Flash

Na embedded zařízeních nebývá operační systém zaváděn z pevných disků, ale z paměti Flash. Ta může být v závislosti na typu zařízení ve velikostech jednotek až desítek MB. Z tohoto důvodu je při výběru a instalaci softwarových balíčků velmi důležité dbát na konkrétní nároky.
Paměť Flash je rozdělena do několika bloků, kde je umístěn různý kód. Více lze nalézt zde.
Příklad detekce Flash paměti připojené přes sběrnici SPI a identifikace jednotlivých bloků z výpisu startu jádra na TP-LINK TL-WR841N/ND v7:

Hardwarové verze zařízení

TL-WR841ND - PNPři sestavování OpenWRT je důležité vybrat konkrétní model zařízení a jeho hardwarovou verzi. Jednotlivé verze nemusí být mezi sebou kompatibilní, mohou obsahovat jinou čipovou sadu, typ a velikost pamětí, atd. Název modelu a verze je k nalezení na výrobním štítku zařízení nebo desce plošných spojů. Konkrétní modely a verze jsou popsány na wiki projektu OpenWRT.

Hardwarové modifikace

Častým důvodem pro instalaci OpenWRT je hardwarová modifikace. Některá zařízení umožňují vyvést další rozhraní, kterými mohou být USB a GPIO porty, I2C sběrnice, aj. Pro takový hardware je potřeba softwarová podpora na úrovni operačního systému. Poté lze například připojovat tiskárny, externí pevné disky, ale i čidla teploty, tlaku, vlhkosti, apod. To vše lze za pomocí OpenWRT uvést do provozu. Jednoduše tedy můžeme z WiFi routeru vytvořit IoT media hub.

Sestavení OpenWRT

Sestavování OpenWRT je poměrně jednoduchý proces, který se skládá z instalace nástrojů nutných pro stažení a překlad zdrojových kódů, stažení zdrojových kódů, výběr/nastavení vlastností, kompilace a následně upgrade zařízení.

V mém případě využívám virtuální stroj s Arch Linux i686, 50 GB diskového prostoru, 3 GB RAM a 6 jader CPU i7.

Instalace nástrojů pro překlad zdrojových kódů pod GNU/Linux

Instalace veškerých potřebných nástrojů je popsána na stránkách projektu.

V prostředí Arch Linux může probíhat následovně:

Stažení zdrojových kódů

Pro zdrojové kódy a kompilaci budeme potřebovat cca 10 GB volného prostoru. V praxi to může být méně nebo mnohem více v závislosti na softwarových součástech, které budeme v projektu využívat.

Nejprve vytvoříme libovolný pracovní adresář, do kterého se následně přesuneme:

Jak je možné vidět, práce probíhá pod neprivilegovaným uživatelem (jiný než root).

Zdrojové kódy se nachází v GIT repositáři git.openwrt.org/openwrt.git. Stáhneme pouze poslední verzi bez všech předchozích změn:

Byl automaticky vytvořen adresář openwrt, do kterého se přesuneme:

V adresáři se na nachází soubor feeds.conf.default, který obsahuje definice dalších repositářů (packages, luci, routing, telephony, …), které se uplatňují při konfiguraci a stahování zdrojových kódů. Pravděpodobně vše necháme ve výchozím stavu. Pokud ale chceme využít jiné nastavení, můžeme soubor zkopírovat na feeds.conf a upravit:

Provedeme stažení dalších potřebných softwarových balíčků:

A jejich instalaci do příslušných struktur:

Tím ale stahování nástrojů a zdrojových kódů z internetu nekončí. Další, v závislosti na konfiguraci, jsou stahovány při vlastní kompilaci.

Nastavení vlastností a software

Nyní vygenerujeme výchozí nastavení nového systému OpenWRT:

To je zapsáno do textového souboru .config. Formát je stejný jako v případě nastavení při kompilaci linuxového jádra.

Ověříme nainstalované softwarové součásti nutné pro kompilaci:

Pokud nám něco v systému chybí, jsme o této situaci informováni a musíme chybu napravit.

Jak jsem již uvedl, sestavení se provádí pro konkrétní model a hardwarovou verzi. Spustíme proto textový konfigurační nástroj:

OpenWRT - Configuration
V tomto nástroji se kromě modelu a verze vybírá také kompletní nastavení jádra a ostatních součástí systému. Obecně platí, že vybíráme jenom součásti, které opravdu potřebujeme. Nesmíme zapomínat na omezenou paměť Flash, do které se vše musí vejít.

Příklad mé konfigurace:

Kompilace

Pokud máme vše vybráno, můžeme spustit vlastní kompilaci:

OpenWRT - Compile
V případě, že máme k dispozici více CPU jader, přidáme parametr -jpočet jader + 1, tedy pro můj 6jádrový systém -j7. Během procesu kompilace jsou připraveny veškeré potřebné součásti pro kompilaci (crosstools), staženy potřebné zdrojové kódy kompletních balíčků a jádra, provedena vlastní kompilace a následné sestavení. Obecně lze říci, že toto je jedna z nejkritičtějších částí sestavování operačního systému. Můžeme se dostat do situace, kdy nejsou k dispozici zdrojové kódy některé ze součástí nebo jsou chybně interpretovány závislosti z důvodu odlišných vývojových cyklů. Hledání a napravení takové chyby může zabrat velmi času. Dalším problémem je stav, kdy se nám vše nevejde do obrazu instalovaném do zařízení (díky limitu Flash). V takovém případě musíme některé z vlastností a software odebrat a spustit kompilaci znovu.

O tom, jak kompilace probíhá se můžeme přesvědčit např. pomocí nástroje top případně htop:
OpenWRT - Compile - htop

Výsledné balíčky lze nalézt v adresáři s příslušnou architekturou, např. bin/ar71xx:

Pro mé zařízení TL-WR841ND v7.2 jsou nejdůležitější soubory openwrt-ar71xx-generic-tl-wr841nd-v7-squashfs-factory.binopenwrt-ar71xx-generic-tl-wr841nd-v7-squashfs-sysupgrade.bin. V adresáři packages lze nalézt zkompilované softwarové balíčky, které je možné doinstalovat do zařízení po upgrade pomocí jednoho ze zmíněných dvou souborů. *-factory.bin používáme při prvotním upgrade nebo větších softwarových změnách. *-sysupgrade.bin používáme při malých softwarových změnách. O rozdílu mezi těmito soubory, jejich instalaci a instalaci zkompilovaných softwarových balíčků popisuje web projektu OpenWRT. Podrobný popis je mimo rámec tohoto článku.

Instalace OpenWRT do zařízení

V zásadě máme několik možností:

  1. Využít webové administrační rozhraní,
  2. přesunout obraz na běžící zařízení a upgradovat pomocí sysupgrade,
  3. použít sériové rozhraní (RS-232 TTL) a upgrade provést přes TFTP v zavaděči (U-boot),
  4. použít nízkoúrovňové rozhraní JTAG.

Upgrade přes webové rozhraní je možné jak z originálního firmware zařízení, tak z OpenWRT – LUCI (pokud je nainstalované).

Pro upgrade přímo na zařízení z příkazové řádky za využití sysupgrade je nutné, aby byl již OpenWRT nainstalován. V takovém případě přeneseme do adresáře /tmp obraz nového firmware a provedeme upgrade:

Po restartu by mělo zařízení pracovat s nezměněnou konfigurací.

Pokud ale v systému používáme vlastní skripty nebo nastavení, jejich názvy vložíme, pro zachování po upgrade, do souboru /etc/sysupgrade.conf:

Použití sériového rozhraní využijeme zejména v případě, že se nám podaří, např. vlivem špatně sestaveného firmware, zařízení znepřístupnit. Při startu zařízení je spuštěn zavaděč (např. U-boot), který zavede jádro operačního systému a předá mu řízení. Pro tuto metodu ale potřebujeme funkční TFTP server, kam umístíme nový obraz s firmware OpenWRT.

Upgrade pomocí JTAG na 99,99999 % provádět nebudeme. Ta přichází v úvahu pouze v případě poškození zavaděče (U-boot). JTAG se používá zejména pro nízkoúrovňové ladění a nahrávání prvotního software (zavaděče) do nové paměti Flash.

Příklad startu systému:

Více o upgrade pro specifická zařízení zde nebo zde.

Update GIT repositáře

GIT repositář bychom měli udržovat v aktuálním stavu. K tomu slouží následující příkazy:

Závěr

Upgradem operačního systému na OpenWRT a hardwarovými úpravami můžeme přijít o platnou záruku. Sestavování a instalaci firmware by měl provádět někdo, kdo umí ze zdrojových kódů minimálně sestavit linuxové jádro, rozumí funkci zavaděče (např. U-boot) a umí používat Google pro vyhledávání řešení na internetu. V opačném případě hrozí, že zařízení skončí v odpadu na elektronická zařízení. Úpravami nesmíme měnit elektromagnetické vyzařování zařízení (zvyšovat ale ani snižovat) – dostali bychom se do konfliktu s legislativou.

 

Sestavený firmware

2 komentáře u „Sestavení operačního systému OpenWRT se specifickými vlastnostmi

  1. Pingback: Zajimave cteni | Blog J.Z. na NAS4y.NET

  2. Pingback: Anonymous transparent proxy through Tor on OpenWRT/LEDE | brichacek.net

Leave a Reply