Tento článek vysvětluje, jak se v Linuxu běžně instalují a odinstalují programy a co dělat, když program, který potřebujete, v distribuci chybí nebo je zastaralý. K tomu slouží program Stow.

Jak se instalují programy v Linuxu

Většinou vůbec nestahujete instalační soubory z webu, jak jste zvyklí z Windows. Každá distribuce má své repozitáře – servery s tisíci hotových balíčků – a správce balíčků, který je z nich instaluje. V Debianu, Ubuntu a jejich derivátech je to apt, ve Fedoře dnf, v Arch Linuxu pacman.

1
2
3
4
5
6
7
apt search sdcc          # hledání balíčku
sudo apt install sdcc    # instalace
sudo apt remove sdcc     # odinstalace programu (konfigurace zůstane)
sudo apt purge sdcc      # odinstalace včetně konfiguračních souborů
sudo apt autoremove      # smaže závislosti, které už nikdo nepotřebuje
sudo apt update          # obnoví seznam balíčků z repozitářů
sudo apt upgrade         # aktualizuje všechny nainstalované balíčky

Správce balíčků si pamatuje, který soubor patří kterému balíčku. Proto umí program čistě odinstalovat a proto vám nikdy nezůstanou po odinstalaci „zbytky“. Můžete se ho také zeptat:

1
2
dpkg -L sdcc             # které soubory balíček nainstaloval
dpkg -S /usr/bin/sdcc    # kterému balíčku patří tento soubor

Soubory z balíčků se rozprostřou do systémových adresářů: programy do /usr/bin, knihovny do /usr/lib, dokumentace do /usr/share a podobně. Tyto adresáře vlastní správce balíčků a ručně do nich nezasahujte.

Co když program v distribuci není

Stane se to často: program v repozitáři vůbec není, má starou verzi, nebo potřebujete nejnovější (noční) build. Pak zbývá stáhnout zdrojové kódy a přeložit je. Postup bývá stejný u většiny programů:

1
2
3
./configure
make
sudo make install

make install zkopíruje výsledek do /usr/local – adresáře, který je podle FHS určený pro programy nainstalované správcem ručně a který je už v proměnné PATH. Kopírování ale znamená problém:

  • nikdo si nepamatuje, které soubory se zkopírovaly,
  • mnoho programů nemá make uninstall, a když ho má, často nefunguje,
  • nová verze se přepíše přes starou a zbydou soubory, které už v nové verzi nejsou,
  • všechny programy se promíchají v jednom adresáři /usr/local/bin a nepoznáte, co kam patří,
  • starou verzi nemůžete vrátit zpět, když nová nefunguje.

Přesně tohle řeší Stow.

Co je Stow

Stow je malý program, který se nazývá správce symbolických odkazů (symlink farm manager). Princip je jednoduchý:

  1. Každý program nainstalujete do vlastního adresáře /usr/local/stow/jmeno-verze. Tam je s ostatními programy v bezpečí a vždy víte, co mu patří.
  2. Příkaz stow pak v adresáři /usr/local vytvoří symbolické odkazy na soubory z tohoto adresáře. Program je pak vidět v PATH, jako by byl nainstalovaný normálně.
  3. Odinstalace je smazání odkazů (stow -D) a smazání adresáře programu.

Uvnitř adresáře programu je stejná struktura jako v /usr/local:

1
2
3
4
5
6
7
8
9
/usr/local/stow/sdcc-4.5.12/
├── bin/
│   ├── sdcc
│   └── sdas8051
├── lib/
│   └── sdcc/…
└── share/
    ├── doc/sdcc/…
    └── man/man1/sdcc.1

Po zavolání stow v adresáři /usr/local/stow vzniknou odkazy:

1
2
3
4
/usr/local/bin/sdcc        ->  ../stow/sdcc-4.5.12/bin/sdcc
/usr/local/bin/sdas8051    ->  ../stow/sdcc-4.5.12/bin/sdas8051
/usr/local/share/man/man1/sdcc.1  ->  ../../../stow/sdcc-4.5.12/share/man/man1/sdcc.1
…

Stow nainstaluje odkazy do nadřazeného adresáře (..) toho, ve kterém ho spustíte. Proto ho spouštíme z /usr/local/stow. Jiný cíl zadáte parametrem -t.

Stow je v distribucích jako běžný balíček:

1
sudo apt install stow

Instalace krok za krokem

Jako příklad použijeme překladač SDCC pro mikrokontroléry.

1. Připravte si závislosti pro překlad. Na Debianu a Ubuntu to umí jeden příkaz (v /etc/apt/sources.list musí být povolené řádky deb-src):

1
sudo apt build-dep sdcc

U programu, který v distribuci není vůbec, musíte závislosti zjistit z jeho dokumentace (soubor README nebo INSTALL) a doinstalovat ručně, typicky balíčky build-essential, cmake a vývojové knihovny *-dev.

2. Stáhněte a rozbalte zdrojové kódy.

1
2
tar xjf sdcc-src-4.5.12.tar.bz2
cd sdcc-4.5.12

3. Nakonfigurujte s cílovým adresářem. Nejdůležitější je parametr --prefix: říká programu, kam se bude instalovat.

1
./configure --prefix=/usr/local/stow/sdcc-4.5.12

Do názvu adresáře vždy napište verzi programu. Díky tomu můžete mít vedle sebe více verzí.

4. Přeložte a nainstalujte.

1
2
make -j$(nproc)
sudo make install

sudo potřebujete jen proto, že adresář /usr/local/stow patří administrátorovi. Program se tím nainstaloval jen do vlastního adresáře a zatím ho nikdo nevidí.

5. Aktivujte ho pomocí Stow.

1
2
cd /usr/local/stow
sudo stow sdcc-4.5.12

Hotovo. Ověříte to takto:

1
2
3
which sdcc               # /usr/local/bin/sdcc
ls -l /usr/local/bin/sdcc
sdcc --version

Pokud shell program přesto nenajde, zapomněl cestu k němu. Příkaz hash -r ji obnoví. Pokud jste instalovali sdílenou knihovnu, spusťte ještě sudo ldconfig.

Jiné systémy překladu

Parametr --prefix pochází ze sady nástrojů autotools (./configure). Jiné systémy mají vlastní zápis téhož:

Systém překladu Nastavení cílového adresáře
autotools ./configure --prefix=/usr/local/stow/jmeno-verze
CMake cmake -DCMAKE_INSTALL_PREFIX=/usr/local/stow/jmeno-verze ..
Meson meson setup build --prefix=/usr/local/stow/jmeno-verze
jen Makefile sudo make install PREFIX=/usr/local/stow/jmeno-verze

U programu s jen Makefile přečtěte jeho README. Proměnná se může jmenovat PREFIX, prefix nebo DESTDIR.

Hotové binární archivy

Někteří autoři dávají ke stažení už přeložené programy v archivu (.tar.gz, .tar.xz). Pokud je uvnitř struktura bin/, lib/, share/, stačí archiv rozbalit do vlastního adresáře a spustit stow:

1
2
3
4
sudo mkdir /usr/local/stow/program-1.2.3
sudo tar xf program-1.2.3.tar.xz -C /usr/local/stow/program-1.2.3 --strip-components=1
cd /usr/local/stow
sudo stow program-1.2.3

Parametr --strip-components=1 odstraní z cesty první adresář, který je v archivu obvykle navíc.

Odinstalace a aktualizace

Odinstalace jsou dva kroky. Nejdřív odstraníte odkazy, potom adresář programu:

1
2
3
cd /usr/local/stow
sudo stow -D sdcc-4.5.12       # smaže jen symbolické odkazy
sudo rm -r sdcc-4.5.12         # smaže program samotný

Na systému nezůstane žádný zbytek, protože všechny soubory byly na jednom místě.

Aktualizace na novou verzi:

1
2
3
cd /usr/local/stow
sudo stow -D sdcc-4.5.12       # vypne starou verzi
sudo stow sdcc-4.5.13          # zapne novou verzi

Stará verze zůstala v adresáři, takže se k ní můžete jednoduše vrátit. Až si budete jistí, že nová funguje, starou smažte.

Pro rychlé přepnutí stejné verze (třeba po doplnění souborů) slouží sudo stow -R jmeno (restow).

Užitečné parametry

Parametr Význam
-n nic neprovádět, jen vypsat, co by se stalo (dry run)
-v vypisovat, co Stow dělá (-vv ještě podrobněji)
-D odinstalovat (delete), tedy odstranit odkazy
-R znovu nainstalovat (restow)
-t DIR cílový adresář místo nadřazeného
-d DIR adresář s balíčky místo aktuálního

Před prvním ostrým použitím vždy zkuste:

1
sudo stow -nv sdcc-4.5.12

Kdy se Stow zlobí

Konflikt souborů. Stow nikdy nepřepíše existující soubor, který sám nevytvořil. Pokud už v /usr/local/bin leží soubor stejného jména (třeba zbytek po dřívějším sudo make install), skončí s chybou typu existing target is neither a link nor a directory. Stow je v tomto ohledu bezpečný: nejdřív starý soubor odstraňte (nebo přesuňte) a potom to zkuste znovu.

Program přeložený bez správného --prefix. Pokud jste zapomněli parametr a make install zapsal soubory přímo do /usr/local, Stow vám nepomůže. Zkuste make uninstall, a když neexistuje, smažte soubory ručně podle výpisu make install. Příště nezapomeňte --prefix.

Pozor na sudo a stow dohromady. stow zapisuje do /usr/local, které patří rootovi. Spouštějte ho proto přes sudo. Instalovat se Stow do vlastního domovského adresáře je také možné, a to pomocí -t:

1
2
3
mkdir -p ~/stow ~/.local
cd ~/stow
stow -t ~/.local program-1.2.3

V tom případě sudo nepotřebujete, ale ~/.local/bin musí být v proměnné PATH.

Shrnutí

  • Programy z distribuce instalujte pomocí apt (nebo správce vaší distribuce). Odinstalace je pak čistá.
  • Programy, které v distribuci nejsou, překládejte s --prefix=/usr/local/stow/jmeno-verze a aktivujte pomocí stow.
  • Odinstalace je stow -D a smazání adresáře. Aktualizace je výměna odkazů mezi verzemi.
  • Do systémových adresářů (/usr/bin, /usr/lib) ručně nikdy nic nekopírujte.

Související posty