Správa balíků softwaru -- RedHat Package Manager -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= System is going down at 2pm to install scheduler bug. Co je balík softwaru? Při instalaci jakéhokoli většího softwarového systému -- ať už je to operační systém (jako je třeba Linux) nebo aplikace (jako například WordPerfect) -- asi každý zjistil, že tento systém je distribuován v určitých oddělených kouscích -- balících (packages). Takovýto balík na instalačním médiu obvykle slouží k vygenerování jednoho nebo více souborů v příslušné části disku. Takže pod pojmem balík softwaru (package) si lze představit několik souvisejících souborů zabalených do.nějaké formy, kterou lze dále distribuovat a na.cílovém stroji rozbalovat. A právě instalace -- rozbalování -- balíků je jednou z hlavních úloh správce balíků (package manageru). Většina čtenářů tohoto listu již asi slyšela o distribucích Debian a Red Hat. V oznámeních o těchto distribucích se dočtete, že používají určitý sofistikovaný systém správy balíků. Co to je a proč nestačí distribuovat software jako tar.gz soubor se dočtete v tomto článku. Pro čtenáře výhně asi bude nutné vysvětlit. Linux se dodává v mnoha distribucích. Jedny z nich jsou Debian (jediná pořádná free distribuce) a Red Hat (nejznámější komerční - ale je také k dispozici zadarma na internetu). Tar.gz je formát zabalených soborů něco jako arj, zip nebo rar v dosu. Správce balíků Ne všechny operační systémy (nebo lépe distribuce) mají svůj vlastní definovaný formát pro správu balíků, natož pak svého vlastního správce balíků. Například pod DOSem jsou programy distribuovány například jako samorozbalující se (.EXE) nebo komprimovány programem ZIP nebo ARJ. Některé systémy sice mají správce balíků, ale ve formě příslušných balíků je distribuován pouze operační systém samotný, nikoli však další programy od jiných výrobců. To je případ většiny komerčních UNIXů, uveďme například inst na IRIXu. A jiné systémy správy balíků zase nemají všechny vlastnosti, které lze čekat od opravdového systému pro správu balíků (to je například případ Windows). Vyvstává tedy otázka, co všechno lze čekat od systému pro správu balíků. Co může umět správce balíků? Samozřejmě první a základní vlastností je, že musí umět příslušný balík rozbalit a nainstalovat. Tomuto v podstatě vyhovují i balíky distribuované ve formátu .tar.gz a tar s gzipem ve funkci správce balíků. Opět malá poznámka. V UNIXU nejsou kompresní a archivační programy pohromadě jako v DOSu. Tar je program, co umí vzít víc souboru a spojit je do jednoho a gzip je program, co umí jeden soubor zabalit. Tedy když pakujete nějaký adresář, napřed jej spojíte tarem a potom gzipem zabalíte (proto ty dvě přípony). Není ale nutné na disku dělat velký nezabalený archív po taru - protože UNIX ma multitásking, příkaz jako: tar czvf - <adresář> | gzip -9 > archiv.tar.gz (nemusí se to vždycky psát takhle složitě :) přesměruje výstup z taru rovnou do gzipu a jeho výstup do souboru, aniž by dělal nějaké dočasné fajly jako DOS. Podstatnou úlohou pro správce balíku je odinstalování softwaru. Jistě znáte případy z prostředí Windows, kdy odinstalovaný program po sobě zanechá spousty DLL souborů, volně rozprostřených po celém disku, o dočasných souborech ani nemluvě. Dobrý správce balíků by měl být schopen balík odinstalovat, a to nejen smazáním všech souborů, které k balíku patří, ale i zrušením odkazů z dalších konfiguračních souborů, zrušením příslušných pseudouživatelů ze systémových tabulek, adresářů pro dočasné soubory a podobně. To jest po odinstalování balíku by měl systém být ve stavu, v jakém byl před jeho nainstalováním. Jistě se vám už někdy stalo, že jste narazili na svém disku na nějaký soubor, o němž jste si vůbec nebyli jisti, k čemu vlastně slouží. Toto by měla být další schopnost správce balíků -- udržovat v nějaké rychle vyhledávatelné formě informace o tom, které balíky jsou v systému nainstalovány a které soubory patří do kterého balíku. Tohle už například Windows nezvládají. Správce balíků by si nejen měl pamatovat, které soubory k danému balíku patří, ale také na požádání zkontrolovat, jestli tyto soubory jsou skutečně v takovém stavu, v jakém byly při konfiguraci. Správce balíků má udržovat mimo jiné i informace o přístupových právech jednotlivých souborů, jejich vlastnících a skupinách. Navíc je dobré, pokud si správce balíků pamatuje i kontrolní součet souborů (obvykle pomocí metody MD5). Pokud instalujete na svůj počítač cizí software, měli byste také mít možnost přesvědčit se, že balík nebyl cestou modifikován. K tomu slouží mimo jiné kontrolní součet celého balíku. Také lze ověřovat, je-li balík skutečně vyroben tím, o kom to tvrdí. K tomu slouží elektronický podpis balíku, obvykle metodou RSA (PGP). Často se setkáte s nutností upgradovat určitý balík softwaru. Na některých systémech vám nezbude než smazat původní balik a nainstalovat nový. Tímto ovšem obvykle ztratíte příslušné konfigurační soubory. Správce balíků by měl být schopen upgradovat balík s tím, že vás upozorní, které konfigurační soubory jste měnili a které ne. Pochopitelně by měl konfigurační soubor přepsat novou verzí a starý někam uložit, byl-li modifikován. Stává se totiž, že nová verze softwaru vyžaduje jiný formát konfiguračního souboru, než byl u starší verze. Instalace softwaru není ovšem jen rozbalení balíku. Často je třeba přidat určité informace do různých souborů (/etc/passwd, /etc/inetd.conf a podobně). Tento úkol je netriviální a je to jedna z příčin existence konfiguračních adresářů místo konfiguračních souborů (/etc/cron.daily, /etc/profile.d, /etc/rc.d, /etc/pam.d a další). Přesto je někdy nutno změnit konfigurační soubor programem. Dobrý správce balíků/formát balíků by měl umět spustit skript uložený uvnitř balíku, a to před instalací, po instalaci, před smazáním a po smazání určitého balíku. /etc/passwd je soubor obsahující informace o všech uživatelech, jejich hesla apod. Některé programy (jako WWW server) běží pod vlastním uživatelem, aby bylo jednoduché specifikovat, kam můžou a kam ne, a nevznikaly díry v bezpečnosti systému. /etc/inetd.conf je soubor obsahující informace o službách počítače v síti. Pokud jiný počítač chce třeba ftpčkovat, přijme to internet superdaemon, ten se koukne do tohoto souboru a spustí obslužný prográmek. /etc/rc.d se spouští při startu, je tedy něco jako autoexec, /etc/profile.d se pouští při přihlášení uživatele (autoexec pro daného uživatele). Například existuje balík fortunes, který po přihlášení se do systému vybere nějaký citát a tím uživatele potěší. Takový program se by se tam pak měl při instalaci sám přidat (a zrušit po odinstalováni). /etc/cron je zase tabulka programů, které se pouští v nějaký čas (jako je úklid disku, mirror ftp apod.) Ve starých distribucích jsou toto soubory. V nových jsou to adresáře a každý package si prostě vytvoří soubor při instalaci a nemusí tedy číst a modifikovat ty soubory přímo. Někdy je také nutné, aby před nainstalováním určitého balíku byl nainstalován jiný balík (říkáme, že balík závisí na jiném balíku). Toto se typicky vyskytuje například u knihoven -- příslušná sdílená knihovna musí být nainstalována před instalací programu, který ji používá. Stává se také, že balík nevyžaduje instalaci jiného konkrétního balíku, ale balíku, obsahujícího určitý soubor (například program mail může vyžadovat existenci souboru /usr/sbin/sendmail, nebo program v Perlu vyžaduje předchozí nainstalování Perlu samotného). Další důležitou vlastností správce balíku jsou tedy závislosti (dependencies). Pro psaní obslužných programů pro správu balíků se také vyžaduje, aby byl formát balíku dobře dokumentován, navržen rozšiřitelně pro přidání dalších vlastností (s tím souvisí i umožnění dalšího vývoje formou verze příslušného formátu balíků). Vývoj aplikací a nadstaveb na správu balíků jistě usnadní i dostupnost knihovny pro práci s balíky a s databází instalovaných balíků. Správce balíků musí také napomáhat vytváření balíků někým jiným, než autorem distribuce nebo operačního systému. Musí být schopen distribuovat i balíky ve zdrojové podobě včetně případných záplat. V balíku ve zdrojové formě musí být obsaženy všechny informace k automatickému skompilování a nainstalování balíku z původní nemodifikované zdrojové verze daného softwaru. To jest v balíku by měl být původní nemodifikovaný zdrojový text sám (například ve formě tar.gz souboru), záplaty pro případný port na danou platformu, příkazy pro rozbalení, kompilaci a nainstalování, a samozřejmě seznam souborů, které v konečné fázi budou ke kompilovanému balíku patřit. Poslední, i když ne nejméně důležitou vlastností správce balíků je, aby samotný software pro správu balíků byl volně šiřitelný. Tato vlastnost je důležitá u jakéhokoli softwaru stejně jako u správce balíků softwaru. Správci balíků v Linuxu výheň