Uživatelské nástroje

Nástroje pro tento web


Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
cs:howto:turris_os_build [2017/03/09 12:05]
nkoranova [Vlastní kompilace Turris OS]
cs:howto:turris_os_build [2018/09/05 17:40]
jschlehofer Docker v tuto chvíli není podporovaný.
Řádek 21: Řádek 21:
 Nejlepším způsobem jak zajistit hladký průběh kompilace je použít totožné Nejlepším způsobem jak zajistit hladký průběh kompilace je použít totožné
 prostředí jako v produkci. Nejlépe pak nasazením tohoto prostředí do kontejneru, prostředí jako v produkci. Nejlépe pak nasazením tohoto prostředí do kontejneru,
-což také umožní oddělení hlavního systému od systému pro kompilaci. ​Jsou +což také umožní oddělení hlavního systému od systému pro kompilaci. ​V tuto chvíli je pouze jedna varianta ​jak toto učinit ​to pomocí nástroje Vagrant.
-podporovány dvě varianty ​jak toto učinit, buďto pomocí nástroje Vagrant ​a nebo +
-pomocí Dockeru.+
  
 ==== Vagrant ==== ==== Vagrant ====
Řádek 66: Řádek 64:
 synchronizován s repositářem v hostitelském systému, je v systému dostupný v cestě synchronizován s repositářem v hostitelském systému, je v systému dostupný v cestě
 ''/​openwrt''​. ''/​openwrt''​.
- 
-==== Docker ==== 
- 
-Docker je oproti nástroji Vagrant více rozšířený a tak je možné že již na vašem 
-systému je nainstalovaný a nastavený. Soubory potřebné k vytvoření Docker 
-kontejnerů se nacházejí v naklonovaném repositáři Turris OS v adresáři '​Docker'​. 
-Obsahem jsou dva skripty a to ''​build-all''​ a ''​run''​ a především soubory 
-popisující Docker kontejnery. 
- 
-Prvním krokem je vytvoření kontejnerů. Skript ''​build-all''​ obsahuje pět řádek 
-volajících ''​docker'',​ které postupně vytvoří pět kontejnerů. Jejich jména a 
-význam je následující:​ 
- 
- * //base// - Základní systém obsahující všechny závislosti potřebné pro sestavení Turris OS. Do adresáře '/​home/​build/​openwrt'​ jsou naklonovány zdrojové kódy a to v nejnovější verzi z větvě `test` (větev na které probíhá vývoj). ​ 
- * //​omnia-toolchain//​ - Vyžaduje a vychází z //base//. Je v něm nastavena konfigurace pro Turris Omnia a obsahuje zkompilovaný toolchain. Balíčky ale nejsou zkompilovány. Toto se může hodit pokud je nutné nestavit pouze jeden balíček, nikoli celý systém. 
- * //omnia// - Vyžaduje a vychází z //​omnia-toolchain//​. V tomto kontejneru je sestaven základní systém, systém pro Turris Omnia a kompilace při malé změně by tak měla být rychlá. Ale ani v tomto kontejneru nejsou zkompilovány všechny balíčku (to by vyžadovalo velké množství času). 
- * //​turris-toolchain//​ - Vyžaduje a vychází z //base//. Je v něm nastavena konfigurace pro Turris 1.x a je v něm zkompilovaný toolchain. Balíčky ale nejsou zkompilovány. Toto se může hodit pokud je nutné sestavit pouze jeden balíček, nikoli celý systém. 
- * //turris// - Vyžaduje a vychází z //​turris-toolchain//​. V tomto kontejneru je sestaven základní systém pro Turris 1.x a kompilace při malé změně by tak měla být rychlá. Ale ani v tomto případě nejsou zkompilovány všechny balíčky (to by vyžadovalo velké množství času). 
- 
-Pokud chcete ušetřit čas a místo tak můžete odstranit řádky pro vámi necílenou 
-platformu. Následně spusťte skript ''​build-all''​. Tento proces může trvat i 
-hodiny, záleží na výkonu hardwaru na kterém kompilace běží a na tom které 
-kontejnery vytváříte. ​ 
- 
-Poté co jsou kontejnery vytvořeny, tak je do nich možné přistoupit pomocí skriptu 
-''​run''​. Tento skript jako první argument očekává volitelně jméno kontejneru (tedy 
-např. ​ ''​./​run omnia''​). Pokud není žádný argument předán, tak se pokusí 
-připojit do kontejneru //​omnia-toolchain//​. 
- 
-<WRAP important>​ 
-Pozor, v případě Dockeru, po ukončení kontejneru jsou všechny změny zahozeny, pokud nenastavíte jinak. 
-Také na rozdíl od nástroje Vagrant nepracuje Docker s originálním vámi naklonovaným repositářem. ​ 
-</​WRAP>​ 
- 
-V následujících sekcích rozlišujte který kontejner jste se rozhodli použít. V 
-případě //base// musíte provést celý postup jak je popsán. V případě ostatních 
-Docker kontejnerů není nutné dělat update feedů a nastavení konfigurace,​ můžete se 
-rovnou přesunout na kompilaci. V takovém případě také není doporučeno používat 
-''​compile_fw''​ skript, protože jako první krok provádí čištění repositáře. 
  
 ==== Nastavení prostředí bez kontejnerů ==== ==== Nastavení prostředí bez kontejnerů ====
  
-Pokud na vašem systému nemůžete nebo nechcete používat prostředí Vagrant ​či +Pokud na vašem systému nemůžete nebo nechcete používat prostředí Vagrant je možné nainstalovat závislosti kompilace systému přímo do hostitelského
-Docker, ​je možné nainstalovat závislosti kompilace systému přímo do hostitelského+
 systému. Tyto závislosti lze nalézt v inicializačním skriptu systému. Tyto závislosti lze nalézt v inicializačním skriptu
 ''​vagrant/​vagrant_bootstrap.sh'',​ který se spouští po prvním spuštění prostředí ''​vagrant/​vagrant_bootstrap.sh'',​ který se spouští po prvním spuštění prostředí
Řádek 131: Řádek 89:
 ===== Vlastní kompilace Turris OS ===== ===== Vlastní kompilace Turris OS =====
  
-Buildroot (kompilační prostředí) ​Turris OS, respektive ​OpenWrt, se skládá z +Turris OS, respektive ​OpenWRT, se skládá z velkého množství skriptů. K sestavení Je nutné vykonat několik kroků jako například vytvoření konfiguracestažení feedů ​(zdrojů balíčků nad rámec OpenWRT), záplatování feedů a další. Protože dohromady se jedná o komplexní postup tak v Turris OS je implementován ​''​compile_fw'' ​skript. Ten automatizuje všechny kroky potřebné pro sestavení Turris OS.
-velkého množství skriptů, ​které zajišťují cross kompilaci ​(kompilaci pro cílovou +
-platformuprostřednictvím rozhraní nástroje //GNU Make//. Hlavním příkazem,​ +
-kterým proto budete buildroot ovládat, je příkaz ​''​make''​. ​+
  
-Kromě klíčových komponent systému, obsažených v repositáři //openwrt// (resp. +V závislosti ​na cílovém routeru ​by měbýt použit skript ​''​compile_omnia_fw'' ​(pro Turris Omnia) nebo ''​compile_turris_fw''​ (pro Turris 1.x).
-//​turris-os//​),​ jsou se systémem kompilovány další balíčky, které jsou spravovány +
-v repositáři //​turris-os-packages//​ a dalších repositářích třetích stran. O jejich +
-zahrnutí do systému se stará skript pro správu tzv. feeds. Podívejme se tedy na +
-příkazy, které se mohou hodit při používání buildrootu. Všechny příkazy ​by měly +
-být spouštěny v kořenovém adresáři repositáře (ve složce ''​/openwrt'' ​v prostředí +
-Vagrant). Uvedeny jsou v pořadí, ve kterém je nutné je spustit po inicializaci +
-čistého vývojového prostředí:​+
  
-''​./​scripts/​feeds update -a'' ​-- Aktualizace všech feeds z jejich umístění. V tomto kroku se zpravidla stáhne obsah dalších repozitářů jako turris-os-packages do oddělených složek. +''​compile_fw'' ​skriptu ​je možné ​dát argumenty, které jsou následně použity ​pro volání ​''​make''​ pro OpenWRT buildDoporučeným argumentem je ''​-j$(nproc)'' ​tak aby sestavení probíhalo paralelně.
- * ''​./​scripts/​feeds install -a''​ -- Instalace balíčků ze všech feeds do buildrootu. Tím se vytvoří symbolické odkazy na definice balíčků v adresáři ''​package/''​ a je tak možné ​balíčky vybrat a zkompilovat. +
- * ''​cp configs/​omnia .config''​ -- Zkopírování konfiguračního souboru ​pro Turris Omnia (alternativně ​''​configs/​turris''​ pro Turris 1.x) +
- * ''​make menuconfig''​ -- Zobrazení konfiguračního menu. V rámci nělze nastavit, jaké balíčky se mají kompilovat a případně lze upravit další parametry sestavovaného systému. Po uložení se zároveň sestaví informace o aktuální konfiguraci ​(toho lze docílit i spuštěním příkazu ​''​make defconfig''​).+
  
-Po spuštění těchto příkazů můžete spustit kompilaci všech nástrojů a systému +Ve výchozím stavu je sestavena pouze minimální sada balíčNejedná ​se tak kompletní Turris OSale je to dostatečný základ pro například vytváření nových balíčTento typ sestavení se používá pro vývoj ​zrychlené sestavování. V závislosti ​na hardwaru může trvat celou hodinu.
-samotného. Protože by jednovláknově tato operace trvala velice dlouho, v ukázce ​je +
-použit příznak ''​-j ČÍSLO'',​ kde ''​ČÍSLO''​ reprezentuje počet úloh, které mohou +
-souběžně probíhatDoporučuje ​se volit počet, který odpovídá počtu jader CPU nebo +
-hodnota ​jedna vyšší. Parametry ''​LOGFILE=1 BUILD_LOG=1 IS_TTY=1''​ zajišťujíaby +
-se výstup kompilace zaznamenával do souboru a na konzoli se zobrazovaly pouze +
-základní informace o průběhu kompilace:​ +
- +
- make -j 4 LOGFILE=1 BUILD_LOG=1 IS_TTY=1 +
- +
-<WRAP tip> +
-Občas operace skončí s nějakou chybouV tom případě ​použijte buď parametry z +
-uvedené ukázky ​chybu poté hledejte v souboru ''​logs/​build.log''​ nebo u +
-spouštěného příkazu přidejte parametr ''​V=s''​ pro obdržení "​upovídaného"​ výstupu +
-na konzoli. +
-</​WRAP>​ +
- +
-Někdy je žádoucí sestavit pouze jeden balíček. Pokud už máte sestavený toolchain +
-(například jste spouštěli ​příkaz ''​make''​ jako v ukázce výše), stažení zdrojových +
-kódů, jejich kompilaci pro cílový systém ​vytvoření ''​.ipk''​ balíčku pro +
-instalaci na router odstartujete následujícím příkazem. Někdy je však ještě nutné +
-sestavit nejprve balíčky závislostí požadovaného balíčku. +
- +
- make package/​nazev-balicku/​install+
  
 +Pro sestavení a nebo vygenerování medkitu je nutné specifikovat proměnnou ''​BUILD_ALL=y''​ v proměnném prostředí při spuštění jednoho z ''​compile_fw''​ skriptů. To je možné udělat takto: ''​BUILD_ALL=y ./​compile_omnia_fw''​ (v případě Turris 1.x pak ''​compile_turris_fw''​). Tento typ sestavení je nutný pro vygenerování vlastního medkitu (archivu s kořenovým souborovým systémem který je možné nahrát do routeru). Tento typ sestavení může trvat více než osm hodin a to v závislosti na použitém hardwaru. Je také náchylný na selhání (způsobené souběhem balíčků).
  
 <WRAP info> <WRAP info>
-Jako název balíčku se zadává název složky, ve které je soubor ​''​Makefile'' ​pro +Pokud narazíte na problém při sestavování tak můžete zkusit snížit hodnotu argumentu ​''​-j'' ​nebo ji nastavit na ''​-j1'' ​pro vypnutí paralelního sestavováníTyto problémy jsou způsobené souběhem balíčků ​při sestavování a obtížně objevitelnými chybějícími závislostmi.
-daný balíček, nikoliv název balíčku specifikovaný v proměnné ​''​PKG_NAME''​. ​+
-případě, že soubor ''​Makefile'' ​balíčků ​obsahuje více balíčků, budou vytvořeny +
-všechny, které jsou vybrány v konfiguraci.+
 </​WRAP>​ </​WRAP>​
- 
-Zkompilované balíčky (a případně další výstup kompilace, jako SDK, a další 
-soubory) naleznete v adresáři ''​bin/''​. Vytvořené ''​.ipk''​ soubory je pak možné v 
-případě správně dodrženého postupu zkopírovat na router a nainstalovat. 
- 
-Pro usnadnění kompilace jsou pak v repozitáři shellové skripty 
-''​compile_turris_fw''​ a ''​compile_omnia_fw'',​ který po spuštění odstraní staré 
-soubory, provede inicializaci feeds a spustí kompilaci systému. Vhodné je ho 
-spouštět s parametrem ''​USE_CCACHE=1''​ a v několika úlohách (tedy například 
-''​USE_CCACHE=1 ./​compile_turris_fw -j4'',​ což značně urychlí kompilaci (je nutné v 
-systému, ve kterém probíhá kompilace, nainstalovat balík ''​ccache''​). Zároveň je 
-možné použít parametr ''​BUILD_ALL''​ -- tím spustíme instalaci opravdu všech 
-balíků, které jsou v systému Turris OS zahrnuty. Tato operace však trvá značně 
-dlouhou dobu (řádově hodiny). Pro spuštění kompilace kompletního Turris OS, s 
-využitím cache během kompilace, ve čtyřech úlohách a s chybovým výstupem 
-zaznamenávaným do souboru: 
- 
- USE_CCACHE=1 BUILD_ALL=1 ./​compile_turris_fw -j 4 LOGFILE=1 BUILD_LOG=1 IS_TTY=1 
- 
-===== Řešení problémů ===== 
- 
-==== Nedostatek místa při vytváření Docker kontejneru ==== 
- 
-Docker kontejnery zabírají řádově desítky gigabajtů. Pokud jejich vytváření 
-selhalo s hláškou o nedostatku místa, tak v prvním kroku je třeba zkontrolovat 
-zdali vám skutečně nedošlo místo a případně ho uvolnit. Pokud, ale místa máte 
-dostatek, pak je nutné upravit konfiguraci Docker daemonu a to pomocí těchto 
-voleb ''​%%--%%storage-opt dm.basesize=40G %%--%%storage-opt dm.loopmetadatasize=10G''​. 
-Výsledná spouštěcí řádka by tak měla vypadat například takto: 
- 
- dockerd -H fd:// --storage-opt dm.basesize=40G --storage-opt dm.loopmetadatasize=10G 
- 
-Po této úpravě je nutné Docker daemon restartovat a odstranit všechny doposud 
-vygenerované soubory tak aby se změna aplikovala. Přesná cesta souborů je dána 
-vaším systémem, ale obecně se užívá ''/​var/​lib/​docker''​. 
-