Když se řekne ‚aktualizujte si systém‘ – co provedete? Většina asi odpoví, že…

yum upgrade

Tento příkaz vám sice aktualizuje systém, ale už vám nedokáže zaktualizovat vaše konfigurační soubory. Ne, že by nechtěl, ale zásadní vlastností rpm je, že se jedná o neinteraktivní proces. Takže se vás přirozeně nemůže zeptat, jak chcete konfigurační soubory zmergovat.

Takže pokud je nějaký soubor v rpm balíku označen jako konfigurační, mohou nastat tyto tři stavy:

.rpmnew

Pokud jste konfigurační soubor na svém počítači změnili, tak rpm ponechá váš soubor nedotčený a nový konfigurační soubor pojmenuje s příponou .rpmnew. Takže v používaném konfiguračním souboru je váš původní obsah (který už nemusí fungovat s nově nainstalovanou verzí programu) a v souboru s příponou .rpmnew je konfigurační soubor nové verze programu, ale bez vašich úprav.

.rpmsave

Pokud si autor balíčku myslí, že by se měla vždy nainstalovat nová verze konfiguračního souboru i za cenu zahození vašich lokálních modifikací (takový přístup se nedoporučuje, ale občas smysl má), tak rpm přejmenuje váš starý soubor, dá mu příponu .rpmsave a nainstaluje novou verzi konfiguračního souboru. Takové soubory byste měli co nejdříve vyhledat a své změny zapojit do nového souboru.

Soubory s příponou .rpmsave se vytváří ještě v jednom případě: pokud odinstalujete balík a máte nějaké modifikace v konfiguračním souboru, který vlastní, tak se takový konfigurační soubor jenom přejmenuje s příponou .rpmsave.

.rpmorig

Pokud instalujete balíček poprvé, ale konfigurační soubor už existuje (např. když jste program před tím manuálně instalovali z tar.gz), tak je původní soubor přejmenován na .rpmorig a je vám nainstalován nový konfigurační soubor.

Takže po každé instalaci nebo aktualizaci byste měli vyhledat všechny soubory s příponou .rpmnew, .rpmsave a .rpmorig a jejich obsahy zmergovat. Naštěstí to nemusíte dělat manuálně, ale můžet použít program rpmconf.

rpmconf

rpmconf je silně inspirovaný programem debconf z Debianu, který tam podobné modifikace řeší již v průběhu aktualizace. To si může dovolit, protože Debian má interaktivní aktualizační program. Ve Fedoře je rpmconf je nutné spouštět manuálně až po instalaci/aktualizaci. Má několik parametrů (viz man rpmconf), ale asi nejlépe uděláte, když ho spustíte jako:

rpmconf -a

Velmi rychle najde výše uvedené soubory a vypíše takovýto text:

# rpmconf -a
Configuration file `/etc/cups/cups-browsed.conf'
-rw-r--r-- 1 root root 1124 May 29 11:37 /etc/cups/cups-browsed.conf
-rw-r--r-- 1 root root 1122 Aug 21 13:43 /etc/cups/cups-browsed.conf.rpmnew
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      M     : merge configuration files
      Z     : background this process to examine the situation
      S     : skip this file
 The default action is to keep your current version.
*** aliases (Y/I/N/O/D/Z/S) [default=N] ?

První, co budete chtít udělat, je podívat se na rozdíl mezi soubory. Ten rozdíl bývá zpravidla velmi malý. Zadejte D a Enter. Zobrazení rozdílu ukončíte klávesou q (jedná se o výstup diffu přesměrovaný do less).

Poté budete chtít zvolit Y, pokud si raději necháte nový konfigurační soubor dodaný distribucí. Nebo N, pokud si chcete ponechat vámi upravenou verzi souboru (to je vůbec nejčastější volba). Třetí možností je soubory spojit. Buď to můžete udělat sami v jiném okně (což osobně preferuji), nebo můžete zvolit Z, situaci ručně vyřešit a příkazem fg se opět vrátíte do běžícího rpmconf.

Poslední možností je použít nástroj na spojování. Například:

rpmconf -a -fvimdiff

Po stisknutí M spustí na obou souborech vimdiff. Takže budete mít oba soubory zobrazeny vedle sebe ve vimu, po skončení editace bude ten vlevo zachován, a ten, co byl vpravo, bude smazán. Podobně můžete použít obdobné programy, z nichž mnohé jsou uživatelsky vstřícnější. Podporované jsou gvimdiff, diffuse, kdiff3 a meld.

Pozor na defaultní hodnoty rpmconfu! V případě souboru .rpmnew je defaultní hodnotou N, v případě .rpmsave a .rpmorig je to Y. Toto rozdělení vám většinou umožní jenom mačkat Enter, ale opatrně!

rpmconf je velmi rychlý, protože hledá pouze v konfiguračních souborech nainstalovaných balíků. Ale občas se někam zatoulá soubor .rpmnew/.rpmsave, ke kterému nemáte nainstalován balík. Z toho důvodu je dobré jednou za čas ještě spustit:

rpmconf -c

Ten prohledá adresáře /etc, /var a /usr. To je ovšem trochu zdlouhavé. Výstup pak vypadá následovně:

# rpmconf -c
These files need merging - you may want to run 'rpmconf -a':
initscripts             /etc/inittab.rpmsave
ca-certificates                 /etc/pki/tls/certs/ca-bundle.trust.crt.rpmsave
ca-certificates                 /etc/pki/tls/certs/ca-bundle.crt.rpmsave
ca-certificates                 /etc/pki/java/cacerts.rpmsave
Skipping files above.

Orphaned .rpmnew and .rpmsave files:
/etc/yum/pluginconf.d/presto.conf.rpmsave
/etc/yum/pluginconf.d/katello.conf.rpmsave
/etc/tomcat6/logging.properties.rpmsave
/etc/tomcat6/catalina.policy.rpmsave
/etc/unbound/root.anchor.rpmsave
/etc/lftp.conf.rpmsave
/etc/beaker/client.conf.rpmsave
/var/spool/hylafax/FIFO.rpmnew
/var/lib/mock/fedora-17-x86_64/root/etc/hosts.rpmnew
/var/lib/mock/fedora-20-x86_64/root/etc/hosts.rpmnew
/var/lib/mock/fedora-19-x86_64/root/etc/hosts.rpmnew
/var/lib/mock/fedora-14-x86_64/root/etc/hosts.rpmnew
/var/lib/mock/fedora-rawhide-x86_64/root/etc/hosts.rpmnew
/var/lib/mock/fedora-18-x86_64/root/etc/hosts.rpmnew
/var/lib/mock/fedora-rawhide-i386/root/etc/hosts.rpmnew
/var/lib/mock/epel-6-x86_64/root/etc/hosts.rpmnew
/usr/share/texlive/texmf/web2c/fmtutil.cnf.rpmsave
/usr/share/texlive/texmf/web2c/updmap.cfg.rpmsave
Delete these files (Y/n):

Takže příště až budete aktualizovat svůj počítač, už můžete spouštět tuto dvojici příkazů:

yum upgrade
rpmconf -a

A budete vědet proč.