Modul 1 — Základy Linuxu a příkazové řádky
6. Balíčkovací systémy a správa softwaru (apt/yum, kompilace ze zdroje)
Jak se v Linuxu instaluje, aktualizuje a odstraňuje software pomocí balíčkovacích systémů apt a yum/dnf a kdy je namísto toho potřeba kompilovat ze zdrojového kódu.
Úvod a kontext
Poslední lekce prvního modulu se věnuje otázce, kterou DevOps inženýr řeší
téměř při každém nasazení serveru: jak na něj dostat potřebný software —
webserver, databázi, programovací jazyk, monitorovací agenta — správně,
opakovatelně a bez ruční práce v grafickém instalátoru (kterou serverové
distribuce ani nenabízejí). Odpovědí jsou balíčkovací systémy, které
řeší instalaci, aktualizace, odstranění i závislosti mezi programy. V
menšině případů, kdy potřebná verze nebo konfigurace není v balíčku
k dispozici, přichází na řadu kompilace ze zdrojového kódu.
Teorie
Co řeší balíčkovací systém
Balíček (package) je archiv obsahující zkompilovaný program, jeho
konfigurační soubory, metadata (verze, popis, závislosti) a instalační
skripty. Balíčkovací systém se stará o:
- stažení balíčku z důvěryhodného repozitáře,
- rozbalení souborů na správná místa v souborovém systému,
- automatické doinstalování závislostí (knihoven, které program potřebuje),
- evidenci nainstalovaných balíčků, aby šly později aktualizovat nebo
odinstalovat, - ověření integrity a pravosti balíčku (kontrolní součty, digitální podpisy).
Bez balíčkovacího systému by administrátor musel ručně řešit, které
knihovny program potřebuje, stahovat je jednu po druhé ze správných zdrojů
a hlídat verze — u desítek balíčků na serveru prakticky nezvladatelné.
Debianová rodina: apt (Ubuntu, Debian)
Distribuce odvozené od Debianu (Ubuntu, Debian samotný) používají formát
balíčků .deb a nástroj apt (dříve apt-get/apt-cache):
sudo apt update # stáhne aktuální seznam dostupných balíčků
# z repozitářů (nutné před instalací)
sudo apt upgrade # aktualizuje všechny nainstalované balíčky
sudo apt install nginx # nainstaluje balíček nginx a jeho závislosti
sudo apt install nginx=1.18.0-0ubuntu1 # nainstaluje konkrétní verzi
sudo apt remove nginx # odinstaluje balíček, ponechá konfiguraci
sudo apt purge nginx # odinstaluje balíček VČETNĚ konfiguračních souborů
sudo apt autoremove # odstraní osiřelé závislosti, které už nikdo nepoužívá
apt search "monitoring" # vyhledá balíčky podle klíčového slova
apt show nginx # zobrazí detailní informace o balíčku
dpkg -l | grep nginx # nižší vrstva – vypíše nainstalované balíčky odpovídající vzoru
Zdrojové repozitáře jsou definované v /etc/apt/sources.list a souborech
v /etc/apt/sources.list.d/ — sem se přidávají i repozitáře třetích stran
(např. oficiální repozitář Dockeru nebo Kubernetes).
Red Hat rodina: yum / dnf (RHEL, CentOS, Fedora, Rocky, Alma)
Distribuce odvozené od Red Hatu používají formát .rpm a nástroj yum
(starší) nebo jeho nástupce dnf (novější, kompatibilní syntaxe):
sudo dnf check-update # zkontroluje dostupné aktualizace (obdoba "apt update")
sudo dnf update # aktualizuje všechny balíčky
sudo dnf install nginx # nainstaluje balíček nginx
sudo dnf remove nginx # odinstaluje balíček
dnf search monitoring # vyhledá balíčky podle klíčového slova
dnf info nginx # detailní informace o balíčku
rpm -qa | grep nginx # nižší vrstva – vypíše nainstalované .rpm balíčky
Koncepčně jsou apt a dnf téměř identické — liší se syntaxí příkazů a
formátem balíčků, ale řeší stejný problém stejným způsobem (repozitáře,
metadata, řešení závislostí).
Repozitáře třetích stran a podepisování balíčků
Výchozí repozitáře distribuce obsahují jen ověřený a otestovaný software,
často ve starších verzích. Pro novější verze specializovaného softwaru
(Docker, Kubernetes, PostgreSQL) se přidávají oficiální repozitáře výrobce
společně s jejich GPG podpisovým klíčem — balíčkovací systém pak umí
ověřit, že balíček skutečně pochází od deklarovaného zdroje a nebyl cestou
pozměněn. Přidávání repozitářů bez ověření klíče nebo z nedůvěryhodných
zdrojů je bezpečnostní riziko — instalovaný balíček běží s právy roota a
může obsahovat cokoliv.
Kdy kompilovat ze zdrojového kódu
Ačkoliv je instalace z balíčku vždy preferovaná varianta (jednodušší
aktualizace, řešení závislostí, integrace se systemd), existují situace,
kdy je potřeba kompilace ze zdroje (build from source):
- potřebujete verzi softwaru, která ještě není zabalená pro vaši
distribuci, - potřebujete nestandardní kompilační přepínače (např. vlastní moduly,
optimalizace pro konkrétní hardware), - pracujete s interním nebo vlastním softwarem, který balíček vůbec nemá.
Typický postup kompilace v jazyce C/C++ (klasický vzor configure +
make):
# 1) Doinstalujeme nástroje potřebné ke kompilaci
sudo apt install build-essential
# 2) Stáhneme a rozbalíme zdrojový archiv
wget https://example.org/software-1.2.3.tar.gz
tar -xzf software-1.2.3.tar.gz
cd software-1.2.3
# 3) Zkontrolujeme prostředí a připravíme sestavení
./configure --prefix=/usr/local
# 4) Zkompilujeme (využije všechna jádra procesoru přepínačem -j)
make -j$(nproc)
# 5) Nainstalujeme zkompilovaný software do systému
sudo make install
Nevýhoda tohoto přístupu: takto nainstalovaný software balíčkovací systém
nezná — neumí ho automaticky aktualizovat, evidovat ani čistě
odinstalovat. Proto se v praxi kompilace ze zdroje používá jen tam, kde
balíček skutečně neexistuje, a i tak se preferuje sestavit si vlastní
.deb/.rpm balíček nebo použít kontejner s předpřipraveným image, aby
build zůstal opakovatelný a spravovatelný.
Praktický příklad
Instalace webserveru Nginx a monitorovacího nástroje z oficiálního
repozitáře na čerstvě nainstalovaném Ubuntu serveru:
# Aktualizujeme seznam dostupných balíčků
$ sudo apt update
Získávat:1 http://archive.ubuntu.com/ubuntu jammy InRelease
...
Načteny stránky se seznamy balíků. Hotovo.
# Nainstalujeme Nginx z výchozího repozitáře
$ sudo apt install -y nginx
...
Zpracovávám aktivační skripty pro systemd (245.4-4ubuntu3.22) ...
# Ověříme nainstalovanou verzi
$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
# Zkontrolujeme, že služba běží (viz předchozí lekce o systemd)
$ systemctl is-active nginx
active
# Přidáme oficiální repozitář Dockeru, abychom mohli instalovat
# aktuálnější verzi, než jakou nabízí výchozí repozitář Ubuntu
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo "deb [signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu jammy stable" \
| sudo tee /etc/apt/sources.list.d/docker.list
# Znovu načteme seznam balíčků (teď včetně nového repozitáře) a nainstalujeme
$ sudo apt update
$ sudo apt install -y docker-ce docker-ce-cli containerd.io
Shrnutí
Balíčkovací systémy (apt v debianové rodině, yum/dnf v red hatovské
rodině) řeší instalaci, aktualizace a odinstalaci softwaru včetně jeho
závislostí a ověření pravosti pomocí digitálních podpisů. Pro novější nebo
specializovaný software se přidávají oficiální repozitáře výrobců s jejich
GPG klíčem. Kompilace ze zdrojového kódu (configure && make && make
install) je záložní řešení pro případy, kdy balíček neexistuje, ale
znamená ztrátu integrace s balíčkovacím systémem, a proto se v produkčním
provozu používá jen výjimečně.
Kontrolní otázky
- Jaký je ekvivalent příkazu
apt install nginxv distribuci založené na
Red Hatu? - K čemu slouží
sudo apt updatea proč se musí spouštět předapt install, pokud jsme právě přidali nový repozitář? - Proč je riskantní přidávat repozitáře třetích stran bez ověření jejich
GPG klíče? - Jaké jsou nevýhody instalace softwaru kompilací ze zdroje oproti
instalaci z balíčku?
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.