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.

Odhadovaná délka studia: 50 minut · Stav: nehotovo

Technologie: Linux

Ú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

  1. Jaký je ekvivalent příkazu apt install nginx v distribuci založené na
    Red Hatu?
  2. K čemu slouží sudo apt update a proč se musí spouštět před apt install, pokud jsme právě přidali nový repozitář?
  3. Proč je riskantní přidávat repozitáře třetích stran bez ověření jejich
    GPG klíče?
  4. 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í.