Portál AbcLinuxu, 18. května 2024 18:03
Jak se v Linuxu instalují programy? Co jsou to balíčky? Čím se liší balíčky v různých distribucích? Základní odpovědi přináší tento článek.
Rozhodl jsem se trochu osvětlit problematiku instalování programů v Linuxu. Protože je to téma rozsáhlé, začněme hned bez prodlev. Programy lze v Linuxu instalovat třemi způsoby:
Já se v textu věnuji hlavně bodu jedna, zmiňuji i bod tři. Na téma druhé byl na AbcLinuxu publikován seriál Nebojíme se kompilace.
Balíček je soubor, který má přesně definovanou logickou strukturu a jeho název je tvořen podle určitých syntaktických pravidel. Pro každou distribuci je obvykle určen jeden typ balíčků. Znamená to, že chceme-li instalovat nový program, je vhodné (téměř nutné) najít balíček pro svou konkrétní distribuci.
Balíček hledejme v tomto pořadí, ušetříme si čas, nervy a případnou ostudu při dotazu ve fóru:
Je vhodné zmínit, co není balíček. Balíčkem v tomto kontextu
nejsou soubory .tar, .gz, .tar.gz, .bz2 a podobné kombinace. Jsou to pouze
komprimované archivy, které obvykle obsahují zdrojové kódy, nebo program a
jeho data, která obvykle nelze instalovat pomocí balíčkovacího systému. Je
to příklad produktů Mozilla.
(Všechny lze ale obvykle sehnat v patřičném balíčku pro vaši distribuci.)
Pokud archiv obsahuje připravený program (např.
firefox-1.0.tar.gz
), "instaluje" se pouhým rozbalením do
nějakého adresáře, např. do domovského adresáře uživatele nebo do adresáře
/usr/local/
(ve druhém případě jako root). Pak už jen stačí
spustit program, jehož jméno se obvykle shoduje s názvem balíčku a celého
programu: /usr/local/bin/firefox
.
Poznámka: Podobně nesrozumitelná situace panuje v případě Java programů
s příponou .jar. Ty se obvykle pouze spouštějí příkazem
java -jar jmeno_programu.jar
. (Ačkoliv i .jar je
"balíček", není ale určen k instalaci.)
Ruku v ruce s vývojem distribucí se ustálily také balíčkovací systémy, které jsou pro každou distribuci typické. Dá se tedy říci, že pro každou z nich je typický určitý balíčkovací systém. Proč je nutné používat odpovídající balíček? Systém balíčků spočívá v tom, že instalovaný soubor je začleněn do databáze již instalovaných programů, data jsou zkopírována na "správné" místo a v databázi jsou následně uloženy informace o tom, že tento proces proběhl. Tyto údaje jsou nutné pro pozdější odinstalaci balíčku.
Zde vzniká problém, který je noční můrou mnoha uživatelů a může být i
příčinou jejich "odchodu" k jiné distribuci. Je to systém závislostí.
Princip je jednoduchý: určité balíčky mají vyznačenu závislost na jiném
balíčku. Instalujete-li např. program.rpm
, často vyžaduje také
instalaci třeba libprogram.rpm
. Úmysl je jistě chvályhodný,
ale problém bývá v tom, že uživatel musí mnohdy ručně hledat požadované
balíčky, a to i přesnou verzi. Obranou proti tomu by mělo být správné
pořadí při instalaci, případně použití inteligentnějšího nástroje -
nadstavby, která zvládne řešení problémů se závislostmi za uživatele.
Slackware závislosti neřeší, Debian má vynikající nástroj apt, Gentoo stejně výborný systém emerge, které si s problematikou závislostí poradí hned v zárodku, RPM distribuce mohou využít např. urpmi (Mandrake) nebo yum (Fedora).
Pokud bychom se pokoušeli instalovat balíček, který není určen pro naši distribuci, a ono by se to povedlo, hrozí, že si databázi o nainstalovaném softwaru poškodíme a budou tedy následně problémy s odinstalováváním programů. Aplikace pro instalaci softwaru obvykle poznají, že daný balík není určen pro tento typ balíčkovacího systému a instalaci odmítnou. Nemá proto význam překonávat tuto logiku, spíš je vhodné hledat správný typ balíčku.
Nyní tedy krátké, ale praktické informace o distribucích a jejich balíčkovacích systémech. Nebo spíše obráceně?
Balíček RPM (struktura) vznikl původně pro Red Hat Linux, název je akronym pro RPM Package Manager, původně snad Red Hat Package Manager. Dnes se používá i v distribucích Fedora Core (následník RHL pro desktop, vznik 2003), SUSE a Mandrakelinux. Mandrakelinux se od větve RHL odtrhl na konci devadesátých let. Distribuce SUSE byla původně založena na Slackware, ale adoptovala také formát balíčků RPM. Kromě toho používají RPM ještě další distribuce odvozené od RHL.
Je vhodné podotknout, že kromě klasických balíčků jako
firefox-1.0-8.i386.rpm
, které obsahují data, tedy to, co
potřebujeme nainstalovat, existují také balíčky se zdrojovými kódy
aplikací, např. firefox-1.0-8.src.rpm
. Pokud je
nainstalujeme, získáme pouze zdrojové kódy aplikací, které je
nutné ještě zkompilovat. Tato činnost se vykonává výjimečně a začínající
uživatel ji vůbec nemusí provádět.
Názvy balíčků se v těchto distribucích liší, aby se vzájemně odlišily a nemátly uživatele. Na druhou stranu jistě existují balíčky, které přenášet lze; ale platí to spíše výjimečně! Tak jako se liší názvy, liší se i obsah balíčků. Logická struktura je stejná, ale například adresáře mají v každé z těchto distribucí (bohužel) nepatrně odlišnou strukturu, přesněji řečeno: některé programy se mohou instalovat jinam. Proto si nainstalováním nesprávného balíčku můžeme "zaneřádit" systém. Proto znovu opakuji: každému, co jeho jest.
harddrake-10.1-27.5.101mdk.i586.rpm xine-lib-1.0.0-2.1.fc3.fr.x86_64.rpm kernel-module-alsa-0.9.8-1.fr_2.4.20_20.9.i586.rpm anjuta-1.2.2-1.0.yd4.fr.ppc.rpm
Jména jsou tvořena podle specifikace. Ve zkratce:
name-version-release.architecture.rpm
Ne všechno je tak růžové, takže lze běžně nalézt RPM balíčky, které se normy pojmenovávání nedrží; ale s tím asi nic neuděláme.
Univerzální službou pro stažení RPM balíků je rpmfind.net. Každá distribuce má pochopitelně své archivy, kde naleznete aktuální (a počeštěné) verze. Standardní program, který umí s balíčky pracovat, je rpm. Existuje ale množství nadstaveb, více níže.
Balíky DEB jsou používány v Debianu a distribucích odvozených, např. Knoppix, Ubuntu. Způsob jejich pojmenování je následující:
name_version-revision_architecture.deb
Velkou roli hrají podtržítka a pomlčky. Podtržítko odděluje jméno programu od verze, pomlčka verzi od revize a opět podtržítko revizi od architektury. Na všechno jsou předpisy ;-).
Zdroje balíčků naleznete v seznamu zrcadel na debian.org.
Balíčky pro Slackware mají příponu TGZ. Ve skutečnosti se jedná o klasický archiv .tar.gz, který ale vždy obsahuje dodatečné informace, které jsou typické právě pro balíček. Také zde existuje syntaxe pojmenovávání:
name-version-architecture-buildauthor.tgz
Zdrojem pro Slackware balíčky je archiv LinuxPackages.net, oficiální balíčky jsou k dispozici na Slackware Package Browser.
Gentoo je výkonná distribuce založená na výrazně odlišných principech. Je-li Fedora Core nebo Mandrakelinux distribucí založenou na binárních balíčcích, potom je Gentoo distribucí založenou na zdrojových souborech, které se kompilují na míru cílovému počítači. Výhodami a nevýhodami se zde zabývat nebudeme, ale pokusíme se pochopit princip balíčkovacího systému.
Balíčkovací systém je postaven na tzv. portage stromu. Jedná se
adresářový strom uložený v /usr/portage
. Každý z
adresářů obsahuje další adresáře, které specifikují název balíčku. V
adresáři balíčku jsou mimo jiné také skripty s příponou
.ebuild
. Obsahem tohoto skriptu je popis balíčku, licence,
verze, architektura, závislosti. V každém adresáři označujícím program bývá
více ebuildů označujících verzi. Lze tak provozovat více verzí zároveň,
stejně jako držet se starší verze.
$ ls kde-base -c1 celkem 12K 512 arts/ 512 kde/ 512 kdeaccessibility/ 512 kdeaddons/ 512 kdeadmin/ 512 kdeartwork/ 512 kdebase/ 512 kdebindings/ 512 kdeedu/ 512 kde-env/
O systému emerge vyšel skvělý dvoudílný článek Balíčkovací systém Gentoo Linuxu.
Výběr několika zajímavých otázek. Nepokrývá samozřejmě všechny aspekty používání balíčkovacích systémů na všech distribucích. Podrobnější informace naleznete v článcích a příručkách:
Záleží na tom, co máš za distribuci:
Každý program používá konfigurační soubory, kde se musí zadat adresy repozitářů na Internetu, odkud se balíčky budou stahovat. To je však téma na další články.
dpkg -i balicek.deb
.rpm -e xx.686.rpm
, hlásí rpm, že
xx.686.rpm
není nainstalován. Přitom vím, že nainstalovaný
je.rpm -e xx
.V adresáři /var/log/packages/
se nacházejí textové soubory
s popisem nainstalovaných balíčků. Z těchto souborů lze zjistit mnoho
informací. Každý ze souborů se jmenuje stejně jako nainstalovaný balíček
(pouze nemá příponu .tgz):
$ ls /var/log/packages/*alsa* -c1 16K /var/log/packages/alsa-driver-1.0.8_2.4.29-i486-1 8,0K /var/log/packages/alsa-lib-1.0.8-i486-1 4,0K /var/log/packages/alsa-oss-1.0.8-i486-1 4,0K /var/log/packages/alsa-utils-1.0.8-i486-1
Hledáme-li balíček, ve kterém se nachází soubor radeon.o
(jaderný modul), můžeme to zjistit následovně:
$ grep 'radeon.*\.o' /var/log/packages/* /var/log/packages/kernel-modules-2.4.27-i486-1:\\ lib/modules/2.4.27/kernel/drivers/char/drm/radeon.o.gz /var/log/packages/kernel-modules-2.4.29-i486-1:\\ lib/modules/2.4.29/kernel/drivers/char/drm/radeon.o.gz
Soubor se tedy nachází v balíčcích
kernel-modules-2.4.27-i486-1
a
kernel-modules-2.4.29-i486-1
.
rpm2tgz
, která převede RPM balíček
do TGZ. Funguje to snad vždy. Balík, ve kterém se nachází, najdete pomocí
předchozího tipu ;-).Balíčkovací systém zůstává pořád stejný, a to RPM. Urpmi, apt, yum jsou pouze nadstavby pro automatickou aktualizaci, které stejně instalují prostřednictvím rpm. Není tedy problém použít více těchto nástrojů zároveň.
./configure
. Ale co když soubor
configure žádný není? Potom napíšu příkaz make
,
make install
nebo popořadě za sebou, či jak? V mém
terminálu však příkaz make
vůbec nefunguje, (odpověď terminálu
- příkaz nenalezen). Který balíček mně chybí? A jak se má tedy správné
instalovat vcelku, abych viděl, co a jak a kam který soubor se
překopíroval?Pokud jste začátečník, úplně zbytečně se pouštíte do kompilace. Programy, které budete potřebovat, se nacházejí na instalačním CD nebo na Internetu - každopádně však ve formě balíčku, který stačí pouze řádně nainstalovat pomocí některého nástroje (rpm, yum, Yast, urpmi). Záleží na vaši distribuci.
Programy s příponou .exe nelze v Linuxu spustit(*). Jedná se o binární kód, a ten je ve Windows, DOSu a Linuxu odlišně interpretován. Pokud stahujete nějaký soubor, přesvědčte se, že je určen pro Linux a že se jedná o balíček podle výše zmíněných pravidel.
(*) Poznámka: Množství .exe programů určených pro Windows lze v Linuxu spouštět prostřednictvím Wine či Cedega.
rpm -qa
vypíše
všechny nainstalované balíčky.
rpm -qa | grep -i 'gcc'
vypíše
balíčky, v jejichž názvu se objevuje řetězec "gcc".pkgtool
, jednak
jednotlivé příkazy installpkg
, removepkg
(a další).
Chci ještě zmínit skvělý program Checkinstall, který
funguje v mnoha distribucích. Umí vytvářet balíčky pro zvolenou distribuci,
já jej používám na Slackwaru. Příkaz checkinstall
se provádí
po dvojici příkazů configure
a make
. Po správném
nastavení vyrobí balíček (TGZ, DEB, nebo RPM) a korektně jej nainstaluje
tak, aby šel později stejně korektně a bezchybně odinstalovat. Je to
opravdu skvělá pomůcka, díky níž si v systému uchováte pořádek. Používám ji
samozřejmě pouze v případech, kdy si chci "ušít" balíček na míru, nebo
pokud balíček pro Slackware neexistuje.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.