Portál AbcLinuxu, 18. května 2024 18:03

Na co se často ptáme: Balíčkovací systémy

16. 2. 2005 | Vlastimil Ott
Články - Na co se často ptáme: Balíčkovací systémy  

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:

  1. nainstalováním připraveného balíku (připravil ho odborník)
  2. kompilací (a následnou instalací)
  3. pouhým rozbalením obsahu

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:

  1. Distribuční CD, ze kterých jsme systém nainstalovali. Pokud jsme ze čtyř disků použili jenom jeden, neznamená to, že zbylé tři jsou prázdné!
  2. Prostřednictvím hlavního portálu distribuce se obvykle dostaneme na ftp server, kde jsou i archivní vydání distribucí a různých balíčků.
  3. Použití veřejných ftp knihoven (ftp.linux.cz, ftp.mendelu.cz), Google.com, rpmfind.net, freshrpms.net a dalších.

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ě?

Red Hat, Fedora Core, SUSE, Mandrakelinux

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
name
jméno aplikace
version
verze aplikace
release
číslo označující, kolikrát byl z této verze vytvořen balíček
architecture
architektura, pro kterou je balíček určen: i386, alpha, sparc, mips (SGI), ppc, m68k; může být i src (zdrojový kód), nosrc (pouze skripty určené ke kompilaci), noarch (univerzální balíček)

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.

Debian

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
name
jméno aplikace
version
verze aplikace
revision
číslo revize
architecture
architektura, pro kterou je balíček určen: 386, sparc, m68k, alpha, powerpc, arm, mips, hppa, ia64, s390

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.

Slackware

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
name
jméno aplikace
version
verze aplikace
architecture
architektura, pro kterou je balíček určen: i386, i486, i586, i686, noarch (nezávislé na architektuře)
build
číslo revize, často významné jen pro autora balíčku
author
autor balíčku, lze tak rozlišit oficiální a neoficiální balíčky

Zdrojem pro Slackware balíčky je archiv LinuxPackages.net, oficiální balíčky jsou k dispozici na Slackware Package Browser.

Gentoo

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.

Otázky z diskuzí

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:

Vždy, když instaluji nějaký balíček stažený z netu, chce to po mně 20 dalších. Nechce se mi to hledat - neexistuje něco, co by to stáhlo za mě?

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.

Mám stáhnuté .deb balíčky, ale nevím, jak je nainstalovat.
dpkg -i balicek.deb.
Když chci odinstalovat RPM balíček pomocí rpm -e xx.686.rpm, hlásí rpm, že xx.686.rpm není nainstalován. Přitom vím, že nainstalovaný je.
Při odinstalovávání balíčku se musí zadávat pouze název balíčku - bez architektury a přípony. Tedy rpm -e xx.
Dá se nějakým způsobem zjistit, do kterého balíčku patří soubor? Mám Slackware.

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.

Stáhl jsem si XY v balíčku RPM, ale používám Slackware. Jde to nainstalovat?
Jde, existuje utilita 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 ;-).
Používám MDK a rád bych kromě urpmi používal taky APT. Ale mám strach, abych si něco nepokazil. Nebude vadit, když budu mít v systému dva balíčkovací systémy?

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ň.

Jsem v Linuxu začátečník, rád bych se zeptal, jak se vlastně soubory .tar.gz instalují. Program rozbalím a nakopíruji ho do nějakého adresáře - ale do kterého? Nebo je to jedno? Potom do toho adresáře přejdu a výpišu příkaz ./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.

Stáhl jsem si z netu program YX.exe. Jak ho mám nainstalovat a spustit?

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.

Potřebuju odinstalovat RPM balíček, ale neznám jeho přesný název. Existuje nějaký příkaz nebo soubor, kde je možno zjistit, jaké balíčky jsou nainstalované?
Vše zařídí program rpm. Příkaz 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".
Jak mám odinstalovat balíčky ve Slacku?
Pro správu balíčků existuje jednak program pkgtool, jednak jednotlivé příkazy installpkg, removepkg (a další).

Milá povinnost nakonec

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.

Seriál Na co se často ptáme (dílů: 11)

První díl: Na co se často ptáme 1: LILO, poslední díl: Na co se často ptáme: Balíčkovací systémy.
Předchozí díl: Na co se často ptáme: /etc/fstab

Související články

Seriál: Instalace softwaru v Linuxu
Seriál: Gentoo ebuild
Seriál: Rukověť baliče RPM
Seriál: Balíčkovací systém Arch Linuxu
Smart Package Manager - instalujeme chytře
Zdroje balíčkov pre Ubuntu
Balíčkovací systém Mandrake Linuxu
Balíčkovací systém Gentoo Linuxu

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.