- předchozí článek - následující článek - obsah -

Linuxové noviny Únor 1998

Rušení balíků v systému RPM

Jan "Yenya" Kasprzak, 10. února 1998

Čas od času se ukáže, že v systému určitý software už nepotřebujete, a že byste ho chtěli smazat, odinstalovat. V systému RPM je mazání balíku jednoduché - stačí k tomu příkaz rpm -e <balík>:

# rpm -e xbill
#

Jak vlastně rušení balíků probíhá? RPM nejprve zkontroluje, jestli se případným smazáním balíku neporuší závislosti (například smazáním knihovny libc by přestaly fungovat všechny programy, které jsou proti ní dynamicky linkovány). Je-li vše v pořádku, spustí se pre-uninstall skript tak, jak je uveden v příslušném balíku. Dále systém projde všechny soubory patřící k balíku a smaže je (pokud nejsou ovšem zároveň součástí jiného balíku). S konfiguračními soubory je zacházeno zvlášť opatrně: byl-li konfigurační soubor od instalace balíku změněn, RPM jej nesmaže, ale přejmenuje tak, že souboru přidá koncovku .rpmsave.

Co dále rpm -e umí?

Samozřejmě jako u většiny ostatních variant můžeme získat podrobnější výstup použitím přepínače -v, resp. -vv. Dále je možné přepínačem --nodeps vypnout kontrolu závislostí mezi balíky (pak se ale nesmíme divit, když něco nebude fungovat). Přepínač --test provede test odinstalování balíku - zkontroluje dependence a zjistí, které soubory by smazal (přepínačem -vv lze tyto informace i zobrazit.

Upgradování RPM balíků

Upgradování je proces podobný instalaci balíku. Rozdíl je v tom, že se zároveň smažou případné starší verze téhož balíku. V podstatě tedy není důvod k instalování balíku pomocí rpm -i - použijeme-li místo toho upgrade, provede se správná činnost i v případě, že jde vlastně o instalaci.

Vlastní instalaci balíků pomocí rpm -i použijeme víceméně jen tehdy, když chceme balík nainstalovat bez toho, abychom zároveň smazali případné další nainstalované verze téhož balíku. Pokud například chceme takto mít v systému dvě verze libc, můžeme obě nainstalovat pomocí rpm -i. V případě, že takto instalované balíky neobsahují společné soubory, je instalace bezkonfliktní a naprosto v pořádku. V naprosté většině případů ale pro instalaci balíku stačí upgradovací příkaz, rpm -U. V knize Maximum RPM (Maximální otáčky) o tom píší:

Maybe the "-U" should stand for "Uh, do the right thing"...

-U by pravděpodobně mělo znamenat "Uh, udělej to správně"...
Edward C. Bailey, Maximum RPM

Proč vlastně upgradovat?

Mohlo by se zdát, že upgrade je v podstatě odinstalování starého a nainstalování nového balíku. A že tedy jedinou výhodou rpm -U oproti rpm -e; rpm -i je to, že ušetříme jeden příkaz. Není tomu tak. Oproti předchozím dvěma příkazům se rpm -U chová trochu jinak. První rozdíl je v zacházení s konfiguračními soubory a druhý rozdíl je v tom, že pre/post-install a pre/post-uninstall skripty umí poznat, kdy jde o upgrade balíku a kdy jde o jeho první instalaci, resp. smazání poslední instance balíku. Každý takový skript dostává jako svůj první parametr číslo, které udává počet existujících instancí daného balíku v systému. Takto může například post-uninstall skript programu squid zjistit, že probíhá definitivní zrušení tohoto balíku a smazat z /etc/passwd uživatele squid. Naopak post-instalační script může vědět, že při upgradu na rozdíl od instalace se nemá snažit inicializovat databázi squidu v adresáři /var/cache.

Podrobnější popis si zaslouží zacházení rpm -U s konfiguračními soubory. Jak víme, RPM si uchovává o každém souboru (nejen konfiguračním) jeho MD5 kontrolní součet. Nyní se v systému mohou vyskytnout ke každému konfiguračnímu souboru tři MD5 součty: první patří původnímu balíku tak, jak je v RPM databázi, druhý patří souboru, který je právě na disku a třetí patří konfiguračnímu souboru v nově instalovaném RPM balíku. Pravidla pro zacházení s konfiguračními soubory jsou tato:

  • Je-li MD5 součet souboru na disku totožný se součtem původního nebo nově instalovaného souboru, RPM smaže konfigurační soubor a nahradí jej novým (ano, i v případě, že soubor na disku má stejný MD5 součet jako v novém balíku - toto je kvůli případným změněným přístupovým právům případně kvůli pevným linkům na konfigurační soubor).

  • Je-li MD5 součet konfiguračního souboru ve starém a novém balíku stejný, ale na disku má soubor jiný MD5 součet, je na disku ponechán konfigurační soubor tak, jak je. Logika tohoto přístupu je zřejmá: Od poslední verze se pravděpodobně neměnila syntaxe konfiguračního souboru, takže je možno zachovat lokální změny.

  • Pokud se MD5 součty všech tří zmiňovaných instancí daného souboru navzájem liší, nainstaluje rpm -U konfigurační soubor z nového balíku a původní konfigurační soubor uloží do souboru s příponou .rpmsave. Dále RPM vypíše varovné hlášení:
    warning: /etc/squid/squid.conf saved as 
    /etc/squid/squid.conf.rpmsave
    
    Vysvětlení je opět jednoduché: V novém balíku je jiný konfigurační soubor než ve starém. Je tedy pravděpodobné, že se změnila syntaxe konfiguračního souboru, a že tedy nový konfigurační soubor by měl být nainstalován. Na druhou stranu uživatel původní soubor změnil a jeho změny by neměly být ztraceny. Proto se tedy uloží původní konfigurační soubor pod jiným jménem. Pokud provádíme upgrade celého systému RedHat, je možné si podobná varovná hlášení přečíst po skončení upgradu v souboru /tmp/upgrade.log.

    V novějších verzích RPM může autor balíku specifikovat, že nechce přepsat původní verze konfiguračních souborů. RPM pak nechává původní konfigurační soubor beze změny a nový uloží s příponou .rpmnew.

  • Poslední nezřejmou možností je, že se ve starší verzi balíku daný konfigurační soubor vůbec nevyskytuje, ale na disku se nachází a má jiný MD5 součet než tento soubor v novém balíku. V tomto případě by RPM také nemělo ztratit potenciálně důležitý obsah konfiguračního souboru. Na druhé straně by mělo být vidět, že jde o konfigurační soubor "podezřelého" původu, bez předchozího výskytu v RPM databázi. Původní konfigurační soubor se tedy přejmenuje na soubor s koncovkou .rpmorig.

Co se týče přepínačů, které rpm -U akceptuje, jsou v podstatě stejné, jako u instalace (rpm -i). Navíc je zde přepínač --oldpackage, který slouží k downgradování balíků (instalaci starší verze než je stávající). Tento přepínač jistě využijete, pokud budete zkoušet používat některé alfa a beta verze softwaru a pak se budete chtít vrátit ke stabilní starší verzi. Do přepínače --force je oproti instalaci balíku zahrnuta i funkce volby --oldpackage.

To je k upgradování RPM balíků vše. V příští části tohoto seriálu bude řeč o získávání informací z databáze RPM. *


- předchozí článek - následující článek - obsah -