Wznowienie emerge

Przerwa w emerge -e system lub emerge -e world

Podczas instalacji systemu nadziałem się na błąd emerge -e system po kilkudziesięciu dużych pakietach. Wynikł on z błędnego obliczenia zależności -- brakowało autoconfa. No, ale jak go doinstaluję z zależnościami, to emerge --resume każe się wypchać i trzeba będzie od nowa rozpoczynać emerge -e system. Ciężka sprawa.

Jak głosi moje motto - lenistwo matką potrzeby, czyli babcią wynalazku: a skąd właściwie emerge --resume wie, co jeszcze zainstalować? Ruszyłem tym tropem na innym komputerze i znalazłem: plik /var/cache/edb/mtimedb zawiera między innymi te informacje. Zaryzykowałem - zrobiłem kopię tego pliku, doinstalowałem autoconfa, przywróciłem kopię i voila! emerge --resume grzecznie wznowił instalacje systemu od przerwy. Minus jest taki, że pakiety autoconfa będą jeszcze raz instalowane (bo były one na liście --resume, tyle, że później), ale plus jest taki, że nie musze jeszcze raz instalować kobyłek typu glibc czy gcc...

Ostatnio znalazłem inną przydatną właściwość emerge - jeżeli instalacja się przerwie i doinstaluje się jeden pakiet (czyli bez zależności), to baza mtimedb nie jest nadpisywana i emerge --resume zadziała prawidłowo.

Przerwa w zwykłym emerge

Często zdarzało się wam puścić emerge -DuN world wieczorem i zobaczyć rano, że poddał się na pierwszym pakiecie? Jeśli tak, to macie tu szybkie rozwiązanie problemu (nazwałem to forceemerge):

#!/bin/sh

emerge $@

until emerge --resume --skipfirst; do
 echo "Trying again"
done

Działa to tak, że w sytuacji, gdy emerge zakończy się błędem, system kontynuuje aktualizację z pominięciem owego błędnego pakietu. Pętla kończy się prawie poprawnie, gdyż emerge -resume -skipfirst przy braku pakietów do wznowienia zwraca kod zero ("OK"). Z drugiej strony rozwiązanie jest naprawdę brudne, gdyż:

  • po pierwsze: jak pierwszy emerge nie może rozwiązać zależności, to skrypt się zapętla — emerge --resume --skipfirst nie skraca listy pakietów do zainstalowania, w związku z czym pętla nigdy się nie kończy.
  • po drugie: jeżeli później instalowany pakiet naprawdę zależy od aktualizacji wcześniejszego, to cały system może się rozjechać. To akurat można na ogół rozwiązać robiąc revdep-rebuild. Zalecam go stosować zawsze po użyciu forceemerge.