Poznejte své Gentoo (2)

13. 12. 2004
Doba čtení: 9 minut

Sdílet

První seznámení už máme za sebou. Dnes zúročíme, co jsme se minule dozvěděli. Budeme instalovat, upgradovat, trošku uklízet a vše, co s tím souvisí.

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 U­SE“.

  • 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/porta­ge/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 do world 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žívat package.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 packa­ge.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/porta­ge/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ší.

bitcoin_skoleni

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)