Dzisiejszy wpis powstał dzięki dyskusji, którą wczoraj nawiązałem z jednym z czytelników MatBloga – Lucasem. W dyskusji poruszyliśmy temat bloków, które Gentoo stawia od czasu do czasu podczas kompilacji pakietów lub ich uaktualnienia. Mam nadzieję, że przybliżę także Wam istotę problemu blokad i wzajemnego wykluczenia pakietów w drzewie Portage.

Gentoo Linux blokada block blok portage emerge dependencies error package ebuild cannot compile how to

 

Dlaczego bloki?

System bazuje na pakietach, które często są zależnościami dla kolejnych aplikacji czy bibliotek. Niestety niektóre aplikacje zawierają podobne funkcjonalności, które zainstalowane w jednym systemie mogą powodować szereg dalszych błędów – np. w trakcie aktualizacji jednej aplikacji przestaje działać inna korzystająca z tej samej biblioteki współdzielonej.

Aby zapobiec dublowaniu bibliotek, funkcji oraz takim właśnie przypadkom straty spójności Portage zostało wyposażone w mechanizm tzw. bloków/blokad. Jeśli instalowałeś KDE, zapewne zauważysz, że pakiet FFMPEG oraz LIBAV (libav to fork pakietu FFMPEG) nie mogą istnieć na raz w systemie. To tylko jeden z przykładów założenia blokady na instalowane pakiety a w procesie instalacji i aktualizacji na pewno znajdziesz ich więcej.

Gentoo Linux blokada block blok portage emerge dependencies error package ebuild cannot compile how to

Blokada zależności liniowych

Poruszony wcześniej temat KDE jest także idealnym przykładem dla blokad liniowych. Blokady liniowe chronią zainstalowane aplikacje przed zamianą zależności, co w przypadku dobrze skonfigurowanego systemu może stanowić problem w ich funkcjonowaniu. Blokady liniowe to np. w przypadku KDE niemożność aktualizacji Qt z wersji 4.9.7 do 4.9.8, gdyż w procesie aktualizacji pakiety Qt zależą od siebie, a od nich szereg aplikacji KDE. Aby przeprowadzić aktualizację KDE należy odinstalować wszelkie biblioteki Qt oraz wywołać instalator metapakietu kde-meta. Biblioteki Qt zostaną pociągnięte do instalacji poprzez Portage jako drzewo zależności pakietu kde-meta w nowszej wersji i zostaną zbudowane na aktualnych systemowych zależnościach.

Blokada wzajemnego wykluczenia

W Gentoo istnieją także wzajemne wykluczenia, które utrudniają proces aktualizacji systemu w znacznym stopniu. Z taką blokadą spotkamy się w chwili próby aktualizacji dwóch zależnych od siebie pakietów – będących na raz pakietem docelowym i zależnością.

 

Blokady związane z wymaganymi flagami

Tego typu blokad nie powinno się nazywać blokadami a raczej spełnieniem wzajemnych zależności. Rozpoznamy je po komunikatach portage podobnych do tych:

? vlc (phonon && !speech)

Zwrócony komunikat Portage oznacza nic innego jak – włączyłeś flagę USE „VLC”, musisz zaznaczyć także flagę „PHONON” i odznaczyć flagę „SPEECH”. Jest to oczywiście przykład nie oparty na rzeczywistości – VLC nie będzie zależny od PHONON i SPEECH.

 

Burzenie bloków

Aby uniknąć blokad w aktualizowanym/budowanym systemie musisz stworzyć odpowiednie pliki w katalogach:

/etc/portage/package.use/

Pierwszy katalog służy do definiowania flag USE zależnie od instalowanego pakietu – może więc rozwiązywać zarówno blokady liniowe, wzajemnego wykluczenia oraz wymaganych flag USE.

Przykładem określania takich zależności w moim przypadku jest pakiet inkscape:

# cat /etc/portage/package.use/inkscape
media-gfx/imagemagick X bzip2 corefonts cxx djvu fontconfig jpeg jpeg2k lcms lzma openmp png postscript static-libs tiff truetype wmf xml zlib fftw fpx graphviz hdri jbig lqr opencl openexr pango pdf q32 q64 q8 raw svg webp

Jako drugi przykład użycia plików w katalogu /etc/portage/package.use mogę przedstawić też definicje dla pakietu libxml2:

# cat /etc/portage/package.use/libxml2
>=dev-libs/libxml2-2.9.1-r1 python

 

Oznacza to dosłownie określenie flagi „python” dla pakietów libxml2 w wersji większej lub równej 2.9.1 revision 1.

 

/etc/portage/package.mask/

W drugim katalogu możesz maskować pakiety oraz ich wersje. Przykład pliku maskującego XORG to:

# cat /etc/portage/package.mask/xorg-server

 

>=x11-base/xorg-server-1.14.99

Jako drugi przykład mogę przedstawić zawartość pliku maskującego pakiet sysvinit w wersji mniejszej niż 2.88 revision 5

# cat /etc/portage/package.mask/sysvinit
<sys-apps/sysvinit-2.88-r5

 

 

Blokowe bezpieczeństwo

Maskowanie może więc zabezpieczyć system przed pociągnięciem przestarzałych zależności. Jest to oczywiście problem natury programistycznej – starsze aplikacje powinny funkcjonować z nowymi bibliotekami, jednak czasami programiści nie dostosowują starych aplikacji do nowych funkcji bibliotek współdzielonych. W chwili gdy program „A” korzysta z sysvinit-2.73 ale w systemie zainstalowany jest już sysvinit-2.88 standardowo Portage powinno zablokować instalację programu „A” nie pozwalając na zastąpienie sysvinit-2.88 starszą wersją.

Zmiana podejścia

Blokady systemowe nie powinny być traktowane jak utrudnienie w budowie systemu – to informacje dla Ciebie, o tym jak zmienić konfigurację systemu, aby wszystko grało jak w szwajcarskim zegarku. Jest to jedna z przewag systemów kompilowanych ze źródeł – wszystko ze wszystkim współgra mimo znaczących modyfikacji aplikacji, np. poprzez wyłączenie określonych funkcji.

Portage także podpowie Ci, jakie zmiany w innych plikach konfiguracyjnych wprowadzić a na upartego możesz wymusić tryb automaskowania:

emerge –autounmask-write […] <nazwa pakietu>

Spowoduje to zapisanie zmian w środowisku systemowym w sposób umożliwiający budowanie pakietów. Pamiętaj jednak, iż jest to automatyczna zmiana, więc nie zawsze rozwiązuje wszelkie problemy związane z aktualizacją a w pewnych zestawieniach może sporo namieszać w systemie.

Gentoo Linux blokada block blok portage emerge dependencies error package ebuild cannot compile how to

MM.