Instalace programů
Nejdříve si uděláme malé shrnutí, jakým způsobem zhruba emerge uvažuje při instalaci balíčku.
emerge vždy řeší závislosti na základě nastavení USE
. Nebere v úvahu, jak byl program zkompilován, proto je důležité udržovat systém zkompilovaný podle aktuálního nastavení. Viz kapitolu „Synchronizace USE“.
- pokusí se najít ebuild odpovídajícího jména
- zjistí, jestli není blokován jiným programem – ne všechny programy mohou být společně nainstalováný v systému, např. xorg vs. xfree
- najde nejnovější verzi, která odpovídá nastavení
ACCEPT_KEYWORDS
a zároveň není zamaskována – tímto mechanismem jsou instalovány všechny programy (samozřejme i závislosti) - začne řešit závislosti. Pokud závisí na programu, který nemůže být nainstalován (obvykle bývá problém s tím, že jste nastavili testing keyword (např. ~x86) pro instalovaný program a některé jeho závislosti jsou také testing), musíte všechny tyto závislosti stejným způsobem přidat do
package.keywords
. Analogicky to platí pro maskované ebuildy - nainstaluje závislosti
- nainstaluje požadovaný program a zapíše si ho do souboru
/var/lib/portage/world
, o kterém se budeme bavit při upgradování a pročišťování systému. Ještě si to trošku zkomplikujeme. Pokud bychom použili zápis, kde určíme verzi (např.emerge =mplayer-1.0_pre4-r5
), tak se doworld
souboru nepřipíše. Cílem bylo zřejmě, aby nám zůstala v systému vysněná verze i po upgradu. Jenže při pročišťování systému by došlo k odinstalování. To je jen další důvod proč používatpackage.mask
.
Pokud se nějaký bod nepodaří splnit, vypíše emerge většinou poměrně jasnou chybovou hlášku, která vám napoví, v čem je problém. Dobrý přehled o dostupných verzích a o jejich zamaskovanosti můžete získat opět přes etcat
(1), který najdete v gentoolkitu ( emerge gentoolkit
).
etcat -v xorg-x11 (1)
Upgradování systému
V Gentoo vycházejí pravidelně čtyřikrát (od nového roku jen dvakrát) do roka pouze stages, LiveCD a packageCD, které slouží k instalaci. Každý den do portage přibývají nové programy a nové verze. Je pouze na vás, jestli se rozhodnete upgradovat každý den/týden/měsíc, nebo budete jen záplatovat. Kompletní upgrade s sebou přináší potenciální problémy, proto je na produkčním stroji lepší se držet jen bezpečnostních záplat. Podíváme se na jednotlivé volby, které upgrade ovlivňují.
Proč jsou u všech následujících příkladů použity přepínače -a
a -v
? Přepínač -a
nejdříve vypíše, co se bude dít, a pak se vás zeptá, jestli se vším souhlasíte, a -v
způsobí upovídanější výstup – uvidíte USE flagy apod. Ještě se občas hodí přidat přepínač -t
, který vám zobrazí, jaké programy si vynutily instalaci nebo upgrade nového programu. Pokud chce emerge při upgradu instalovat nové programy, je to ideální způsob, jak zjistit, který program si je vyžádal.
emerge -avU world
Záměrně uvádím -U
jako první, protože je poměrně oblíbený a přitom se nemá používat. Dřívější způsob, jak si instalovat některé testing programy, byl ACCEPT_KEYWORDS=~x86 emerge program
, ale, jak už jsme si vysvětlili, při upgradu bude emerge chtít program downgradovat zpět na nemaskovanou verzi. Proto se využívalo přepínače -U, který zabraňuje, aby došlo k jakémukoli downgradu. Ještě vás trochu postraším, abyste rychle začali používat package.keywords
.
Mějme program breaker, který má v portage k dispozici dvě verze, 2.4 stable a 2.5 testing. Nainstalujeme si verzi 2.5 pomocí ACCEPT_KEYWORDS=~x86 emerge breaker
…
- … jenže ve verzi 2.5 byla objevena zásadní bezpečnostní chyba, která je opravena ve verzi 2.5.1.
emerge -U
však na tuto verzi neupgraduje, protože mu nebylo řečeno, že má používat testing verze, ale pouze, že nemá downgradovat. - … časem se zjistí, že breaker 2.5 může něco poškodit a je označen jako nefunkční (-x86). Jenže emerge má zakázáno downgradovat, tak vám zákeřný breaker 2.5 zůstane v systému.
emerge -avu world
Řekli jsme si, že program, který nainstalujeme, se zapíše do souboru /var/lib/portage/world
(dále jen world
). Jsou tam pouze programy, které jsme při instalaci vypsali za emerge, nikoli jejich závislosti. Mechanismus při upgradu je poměrně jednoduchý. Procházejí se jednotlivé záznamy ve world
a zjišťuje se, jaká verze v portage je zároveň nejnovější a odpovídá nastavení ACCEPT_KEYWORDS
a package.mask
. Pokud se nalezená verze liší od nainstalované, je upgradována nebo downgradována. Při instalaci nové verze se postupuje stejným způsobem, jaký jsme si popsali u instalace programu. Pokud je u nějaké závislosti k dispozici nová verze, je také upgradována.
Většina závislostí ale zůstane naprosto bez povšimnutí, protože program na nich závisející není upgradován – to může způsobit některé nechtěné efekty. Je důležité si uvědomit, že mezi závislostmi nejsou jen knihovny, ale i běžné programy, které ke své činnosti využívá jiný program.
Ukážeme si opět příklad, ze kterého by váš systém nemusel mít radost.
- U nějaké knihovny se změní KEYWORDS nebo je zamaskována, ale emerge na to nezareaguje a nedojde k downgradu a zákeřná knihovna si dál vegetuje v systému.
emerge -avuD world
Chování při upgradu můžeme ovlivnit přepínačem --deep (-D)
. Název je poměrně výstižný – upgrade je prováděn do hloubky. Stejným způsobem jako u -u
se procházejí jednotlivé záznamy ve world
, s tím rozdílem, že se u každého záznamu zabýváme i jeho závislostmi a závislostmi závislostí atd. Tak máme jistotu, že všechny programy/knihovny v systému odpovídají aktuálnímu stavu v portage stromu, a také, že všechny závislosti jsou nainstalovány. Pokud bychom pomocí emerge -C
odinstalovali některou ze závislostí, bude ji emerge -avuD world
chtít opět nainstalovat. Výjimku tvoří programy, které nejsou ve world
a zároveň na nich nic nezávisí – ještě se k nim vrátím, až se jich budeme chtít zbavit.
Vzhledem k tomu, že jsou často upgradovány pouze závislosti (obvykle knihovny), je tento způsob nejvíce náchylný k poškození zpětných závislostí. Co je to a co s tím, si povíme v kapitole o následcích.
glsa-check
GLSA je zkratka pro Gentoo Linux Security Advisories – jsou to oznámení obsahující informace o bezpečnostní chybách a dozvíte se, jakým způsobem chybu odstranit, obvykle upgradem na novější verzi. GLSA jsou posílány do mailinglistu gentoo-announce. V gentoolkitu ( emerge -av gentoolkit
) je program glsa-check
, který tato oznámení parsuje, a můžete tak zjistit, jestli je ve vašem systému ještě nějaký program s bezpečnostní chybou. Tento nástroj je považován za experimentální, ale už dobře použitelný. Čte oznámení z portage stromu ( /usr/portage/metadata/glsa
), proto je potřeba synchronizovat portage strom, aby měl glsa-check
k dispozici nejnovější oznámení.
Pokud ho spustíte bez parametrů, zobrazí se vám nápověda. Můžete si nechat zobrazit všechny nezazáplatované díry (1), prohlédnout konkrétní oznámení (2). glsa-check
navrhne (3), jak se chyby zbavit, a nebo si můžete rovnou nechat chybu opravit (4) – glsa-check
předhodí emerge
příslušný balíček a dojde k upgradu. Poslední příklad (5) se pokusí vyřešit všechny bezpečnostní díry v systému.
glsa-check -t all (1)
glsa-check -d 200407-12 (2)
glsa-check -p 200407-12 (3)
glsa-check -f 200407-12 (4)
glsa-check -f all (5)
Tento nástroj nejspíš oceníte na produkčním stroji, kde půjdete cestou bezpečnostních záplat.
Následky a důsledky
Synchronizace USE
Časem se rozhodnete, že budete používat alsu, tak si logicky přidáte flag alsa
do USE
. Jenže všechny programy, které jste doposud nainstalovali a umí pracovat s alsou, jsou zkompilovány bez její podpory. Je tady samozřejme možnost si zkompilovat znovu celý systém - emerge -e world
, ale mnohem efektivnější je najít pouze ty programy, které mají v USE
alsu. Vývojáři portage nám vyšli vstříc a v nové verzi (2.0.51) přibyla volba –newuse
(1), která objeví programy, jež byly zkompilovány s jinými USE
než je aktuálně nastaveno. Vzhledem k tomu, že nová USE
může přibýt i s instalací některých programů, není od věci používat volbu –newuse
pravidelně.
emerge -avuD --newuse world (1)
Poškozené zpětné závislosti
Při upgradu knihovny na novou verzi se může stát, že dojde ke změnám, kvůli nimž je potřeba překompilovat programy, které ji využívají. Problém je právě v tom, že není dost dobře možné určit, kdy k tomu dojde. V gentoolkitu je utilitka revdep-rebuild
(1), která se snaží hrubou silou najít tyto poškozené závislosti a překompiluje „postižené“ programy. V readme k programu revdep-rebuild
se můžeme dočíst, že je to dočasné řešení, než bude portage podporovat zpětné závislosti. Uvidíme, jakým směrem se to bude dál vyvíjet. Překompilovávat vždy všechny programy závisející na nějaké knihovně by se také docela protáhlo.
Způsob, jak tento problém částečně minimalizovat, je nepoužívat přepínač -D
. Knihovny se budou upgradovat jen, pokud se bude upgradovat nějaký program, který na nich závisí. Pokud se nad tím trošku zamyslíte, tak se tomu stejně úplně nevyhneme a také už víme, že použití emerge -u world
není optimální.
revdep-rebuild -av (1)
Nepotřebné závislosti
Kde se v systému vzaly? Staly se obětí evoluce – nejsou dále potřeba. Program, který na nich závisel, je nepotřebuje nebo byl odinstalován. Už jsme si prozradili, že jsou vyřazeny i z procesu upgradování. emerge
umí tyto závislosti najít a odstranit (1). Po spuštění se vám zobrazí dlouhé upozornění, ale pokud máte v pořádku world
soubor, měly by se odinstalovat jen nepotřebné závislosti. Doporučuji použít utilitu regenworld
(2), která na základě logovacího souboru /var/log/emerge.log
dopíše případně chybějící záznamy. Také si pro jistotu projděte seznam odinstalovávaných programů, ať se vám neodinstaluje něco, co nechcete.
emerge depclean
neumí dobře pracovat se SLOTy. Pokud máte nainstalováno víc verzí od jedné knihovny a je potřeba jen ta novější, depclean si nevšimne, že může odinstalovat tu starší verzi. V manuálových stránkách si můžete všimnout, že k pročišťování SLOTů slouží emerge prune
, ale ten raději nepoužívejte, protože se nezabývá závislostmi a jednoduše v systému nechá jen verzi z nejvyššího slotu. Místo prune
doporučuji použít bash script dep od Ecatmura, který na rozdíl od emerge prune
dává pozor na závislosti. Script dep
umí spoustu dalších věcí. Např. zobrazí vám zpětné závislosti (4) nebo se pokusí pročistit world
(5). Princip je takový, že ve worldu
najde všechny programy, na kterých už něco závisí, a navrhne je k odstranění. Jestli je to pro vás užitečné, záleží na tom, jak si udržujete world
. Např. pokud překompilováváte knihovnu, měli byste používat parametr --oneshot
(6), aby se nepřipsala do world
a zůstala jen „závislostí“.
emerge -av depclean (1)
regenworld (2)
dep -P (3)
dep -r aalib (4)
dep -w (5)
emerge -av --oneshot aalib (6)
Shrnutí
Ani bych se nedivil, pokud je toho na vás moc. Asi jste si všimli, že velkou slabinou portage jsou zpětné závislosti. Při odinstalaci se neřeší, jestli bude ten program něčemu chybět, emerge prune také odinstalovává SLOTy hlava nehlava, také by mohly pomoct smést ze světa revdep-rebuild
. Pro portage 2.1 je ve vývoji nový systém na řešení závislostí, pro který by zpětné závislosti neměly být problém, a život uživatelů by mohl být zase o něco příjemnější.
Pokusím se shrnout, jak by mohl vypadat kompletní upgrade desktopu.
Nejdříve musíme udělat samotný upgrade (1). Po úspěšném upgradu se opatrně zbavíme (2)(3) všech nepotřebných programů a knihoven. A na závěr překompilujeme programy, které mají problém se svými dynamickými knihovnami (4).
emerge -avuD --newuse world (1)
emerge -av depclean (2)
dep -P -a (3)
revdep-rebuild -av (4)