Správa linuxového serveru: Kompilace softwaru

V minulém díle byla probrána teorie kolem kompilace softwaru včetně alternativ, pomocí kterých se můžete kompilaci vyhnout. Tento díl se bude věnovat praktické stránce kompilace, i když zatím převážně jen teoreticky, stejně jako jejím úskalím.

Úvod

Poselstvím minulého dílu měl být pohled na kompilaci spíše jako na nouzové řešení. Ideální je používat správce balíčků a software instalovat a spravovat prostřednictvím něj. Ruční kompilace je nejen relativně složitější, ale také vyžaduje, abyste se o takto instalovaný software starali, tedy primárně sledovali bezpečnostní problémy, hodnotili jejich vážnost a řešili je, druhotně pak abyste také měli přehled o dostupnosti nových verzí a změn fungování i nastavování daného softwaru. To je velmi důležité, jelikož nové verze mohou měnit syntax či parametry v konfiguračních souborech, což by při slepém přechodu na novou verzi mohlo zapříčinit nefunkčnost dané komponenty.

Kompilace však přináší i jisté výhody, které pak dotahují do konce zdrojově založené (source-based) distribuce jako Gentoo, SourceMage GNU/Linux atd., které pak kompilaci v mnohém usnadňují. Co se týče výhod kompilace, v první řadě je to jistě možnost mít konkrétní verzi softwaru bez ohledu na to, která verze je k dispozici v aktuálním vydání distribuce. Vedle toho je to ale také možnost používat upravenou verzi, aplikovat specifické patche nebo naopak možnost použít čistou (tzv. vanilla) verzi, která nebyla distribučně upravena – řada distribucí totiž pro různé komponenty využívá vlastní patche, které mohou měnit jejich funkčnost, což někdy přináší nové vlastnosti, ale někdy to může být zdrojem chyb či problémů (v souvislosti s tím nemohu nezmínit nechvalně známý zásah Debianu do openssl knihovny, který díky predikovatelnosti generátoru náhodných čísel oslabil veškeré klíče či certifikáty generované pomocí této knihovny).

Leckterý software lze sestavit s podporou nějaké komponenty nebo bez ní. Kupříkladu, oblíbený textový editor Vim může fungovat jak v terminálu, tak samostatně v grafickém prostředí. Podpora grafického režimu je otázkou kompilační volby. Na serveru je obvykle zbytečné mít konzolové aplikace zkompilované s podporou Xorg, což u binárních distribucí znamená mj. nutnost dotáhnout spolu s instalovanými aplikacemi ještě Xkové knihovny. Kompilací můžete sami určit, jak se má vámi instalovaný software sestavit. Výše uvedená situace je opravdu jen příklad pro ilustraci, jelikož v Debianu můžete tuto situaci snadno vyřešit nainstalováním verze Vimu zkompilované bez Xorg (balíček vim-nox).

Další výhodou kompilace je možnost použít specifické volby kompilátoru, které mohou kód optimalizovat (zrychlit, zmenšit apod.) či jej lépe zabezpečit.

Máte-li potřebu měnit konfigurační volby a kompilovat větší množství softwaru podle svých potřeb, doporučuji zvážit použití některé ze source-based distribucí.

Kompilační nástroje a zdrojový kód

Abyste mohli kompilovat, potřebujete příslušné nástroje, zejména pak kompilátor. Pro software napsaný v C nebo C++ postačí GCC, dále pak nástroj make. V Debianu je možné tyto nástroje nainstalovat prostřednictvím metabalíčku build-essential:

aptitude install build-essential

Ne vždy ale budete kompilovat zrovna aplikace v C. To poznáte podle dokumentace k danému softwaru, která by vám měla říci, co potřebujete k úspěšnému sestavení.

Kromě kompilačních nástrojů potřebujete samozřejmě zdrojový kód daného softwaru. Obvykle jeho získání nepředstavuje problém, pomocí vyhledávače lokalizujete oficiální web projektu, stáhnete příslušný balíček, obvykle tar.gz či tar.bz2, přičemž před jeho použitím ověříte kontrolní součty nebo digitální podpisy. Na serveru se vám určitě hodí nástroj wget, popřípadě nějaký textový prohlížeč (např. lynx), abyste mohli příslušný software stahovat přímo na serveru a nemuseli ho tam kopírovat ze své stanice (což byste nejspíše provedli pomocí nástroje scp či FUSE modulu sshfs).

SCM: Systémy pro správu verzí

Chcete-li opravdu „bleeding-edge“ kód (na serveru lze jeho použití důrazně nedoporučit), přijdete nejspíše do styku s nástroji pro správu verzí (SCM, Source Control Management, tedy např. Git, Mercurial, Subversion apod.). To jsou nástroje, které umožňují v zásadě dvě věci – v první řadě udržují přehled změn ve zdrojovém kódu, ve druhé řadě pak umožňují nebo usnadňují spolupráci více vývojářů na jednom projektu. Z pohledu správce obvykle představují nutnost nainstalovat příslušný nástroj nebo jeho klienta. Zde předešlu, že mnoho webových služeb (GitHub apod.) umožňuje stáhnout balíček s kódem odpovídajícím dané revizi, čímž si tuto práci ušetříte.

Závislosti a instrukce pro sestavení

Řada softwaru má k dispozici instrukce pro sestavení buď v dokumentaci na webu projektu, nebo v souboru INSTALL, který je přibalován ke zdrojovému kódu. Měli byste zde najít veškeré podstatné závislosti.

Závislosti kompilovaných programů lze rozdělit do dvou kategorií – závislosti kompilační, které jsou nutné pro kompilaci, ale už ne pro samotný běh programu, a závislosti běhové, které jsou třeba pro samotnou funkčnost zkompilovaného softwaru. Kompilační závislostí je samozřejmě kompilátor a s ním spojené nástroje, ale občas to může být i něco jiného. Více vám napoví dokumentace k danému softwaru. Podstatné je, že kompilační závislosti můžete po kompilaci bez obav ze systému odstranit, ty běhové samozřejmě nikoliv.

Jelikož v případě kompilace za vás správce balíčků závislosti řešit nemůže, musíte se s nimi vypořádat ručně. Řešit závislosti je však vhodné s pomocí správce balíčků: máte-li příslušnou závislost v požadované verzi v repozitářích, můžete ji nainstalovat a nemusíte ji kompilovat. K vyhledávání můžete použít příslušné funkce správce balíčků:

aptitude search závislost
apt-cache search závislost

Pokud danou závislost v repozitářích nemáte, nebo ji máte ve staré verzi, nezbude vám než ji zkompilovat také. Vzhledem k tomu, že závislostní vazby mohou být košaté, musíte zvážit, zdali se vám kompilace, ale také následná údržba, opravdu vyplatí. Máte-li stabilní binární distribuci, která je už nějaký čas venku, může se klidně stát, že aktuální verze vámi zvoleného softwaru bude vyžadovat kompilaci řady dalších komponent, jelikož v repozitářích je sice máte, ale příliš zastaralé. Udržovat takto sestavený software ručně je dřina.

Hlavičkové soubory

V případě knihoven a komponent, které tvoří závislosti vámi zvoleného softwaru, potřebujete nejenom binárky příslušných knihoven, ale také tzv. hlavičkové soubory. Hlavičkové soubory představují kompilační závislost, k běhu softwaru po kompilaci je tedy nepotřebujete. V případě některých distribucí jsou hlavičkové soubory součástí balíčků s danými komponentami (namátkou Arch Linux). V Debianu jsou umístěny v samostatných balíčcích s přídomkem -dev. Pokud byste tedy měli knihovnu libssl v závislostech vámi zvoleného softwaru, nainstalovali byste nejenom balíček libssl, ale také libssl-dev.

Svatá trojice

Tento díl zakončím základní informací o tzv. svaté trojici, tedy sérii třech příkazů, které se nejčastěji zmiňují v souvislosti s kompilací. V příštím díle na tuto informaci navážu a ukážu vám vše na příkladu. „Svatá trojice“ vypadá takto:

./configure
make
make install

První příkaz spouští skript configure v aktuálním adresáři. Předpokládá se, že se nacházíte v adresáři s rozbalenými zdrojovými kódy. Tento skript je generován obvykle vývojářem, pomocí nástroje autoconf (více viz GNU build system), a distribuován spolu se zdrojovými kódy. V některých případech (často při kompilaci softwaru získaného pomocí SCM) se můžete setkat s tím, že tento skript chybí a vy si jej musíte vygenerovat sami.

Skript configure analyzuje váš systém a vygeneruje soubor Makefile, který pak řídí proces kompilace. Pokud vám chybí nějaká závislost, nebo váš systém neodpovídá požadavkům daného softwaru, měl by tento skript skončit a vyprodukovat chybovou hlášku. Ta by vám měla osvětlit, co vám chybí nebo co musíte udělat.

Jakmile máte k dispozici Makefile, můžete spustit kompilaci pomocí nástroje make. Pokud půjde vše dobře, kompilace skončí úspěchem.

Zbývá už jen software nainstalovat. Jeho instalaci je možné provést příkazem make install, avšak tento postup nedoporučuji – software instalovaný mimo repozitáře je vhodné izolovat od zbytku systému, abyste měli přehled o tom, kde se nachází jeho soubory a nezanesli si do systému nepořádek. Popřípadě si můžete (např. pomocí nástroje checkinstall) vytvořit balíček, který pak nainstalujete pomocí správce balíčků (v Debianu nástrojem dpkg). O tom ale až v příštím díle.