Jak mogę obniżyć pakiety bez usuwania ich osób na utrzymaniu?

17

Mam kilka pakietów mesa, które uaktualniłem do wersji PPA, przed wyczyszczeniem PPA, aby móc zaktualizować swój system. Różnice w wersjach są niewielkie (technicznie są takie same, tylko jeden zestaw bibliotek pochodzi z git, a pozostałe są wersjami ostatecznymi).

Jeśli spróbuję obniżyć wersję poprzez Synaptic, apt-get lub aptitude, zostanę wrzucony do piekła zależności.

Czy istnieje sposób ręcznego obniżenia poziomu pakietów (być może jeden po drugim) i oznaczenia ich zależnych pakietów jako nieruchome (jeśli ma to sens), dopóki nie skończę?

PS to pytanie: Jak obniżyć pakiet za pomocą apt-get? jest trochę inny i nie pomaga w tej sytuacji.

RolandiXor
źródło
Dlaczego nie ppa-purgepierwszy?
landroni
Możesz ponownie zainstalować synapticpakiet. Na przykład, jeśli użyjesz , gdy wybierzesz pakiet xyz, wszystkie zależności zostaną wybrane domyślnie. Ale zawsze możesz odznaczyć wszystkie zależności i po prostu zainstalować pakiet główny. Później możesz zainstalować wszystkie zależności. Ale ponownie, działa to tylko wtedy, gdy jesteś gotowy do ponownej instalacji.
Zarejestrowany użytkownik
@landroni, jeśli wyczyszczę, usunie pakiety, których nie chcę usuwać.
RolandiXor

Odpowiedzi:

13

Nigdy wcześniej z tym nie grałem, ale sugerowałbym, abyś hold(lub lock) wersja zależności, które powodują problemy. W ten sposób dostępna aptjest bardziej ograniczona liczba możliwych rozwiązań i być może nie pomylić się przy próbie obniżenia poziomu innych pakietów.


Jeśli nic więcej nie działa, możesz zastosować ręczne podejście sugerowane w tej odpowiedzi: Jak obniżyć pakiet za pomocą apt-get? . Zasadniczo, pobrać niezbędne .debręcznie pakietów, a następnie zainstalować je jeden po drugim, korzystając z niższego poziomu dpkg, a jeden z jej argumentów siłowych: --ignore-depends, --force-depends, --force-depends-version, lub nawet --force-all.

W tym samym duchu co powyżej masz --force-downgradeargument:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

Ale zakłada to, że przeczytałeś man dpkgi rozumiesz, co robisz:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

Zobacz Błąd: numer wersji nie zaczyna się od cyfry i Jak zainstalować starszą wersję Java i Jak zainstalować starszą wersję pakietu, np. Liquid 2.2.2? dla przykładów:

sudo dpkg --force-downgrade -i your_mesa_package.deb

I zobacz Jak mogę zainstalować pakiet bez instalowania niektórych zależności? na przykład (wraz z odpowiednim ostrzeżeniem):

sudo dpkg --force-all -i your_mesa_package.deb

Jeszcze innym podejściem byłoby utworzenie fikcyjnego .debpakietu przy użyciu equivspakietu (i być może nieco innej nazwy). Następnie instalacja fikcyjnego pakietu powinna umożliwić usunięcie pakietu „true” przy zachowaniu odpowiednich zależności, a następnie zainstalowanie starszej wersji. Nie jestem pewien, jak dokładnie to zadziałałoby, ale sprawdź ten odpowiedni wątek, aby uzyskać szczegółowe informacje: Jak usunąć deb bez usuwania jego zależności .

landroni
źródło
4

Możesz najpierw użyć apt-markdo zaznaczenia wszystkich zależności pakietu docelowego (i być może również tych zalecanych / sugerowanych) zainstalowanych w systemie jako instalacji ręcznych . Po wykonaniu tej czynności zainstaluj poprzednie wersje oprogramowania z wyraźnym apt-getpodaniem wersji.

  • Aby wyświetlić zależność, zalecane i sugerowane pakiety dla pakietu docelowego:

    apt-cache show <target-package-name>
    
  • Oznaczanie pakietów jako zainstalowane ręcznie :

    sudo apt-mark manual <package-name(s)>
    

    (użyj tego dla wszystkich zależności, rekomendacji i sugestii).

  • Usuń pakiet docelowy:

    sudo apt-get remove <target-package-name>
    
  • Aby zobaczyć listę wersji pakietów, które możesz obniżyć / uaktualnić, użyj:

    apt-cache policy <target-package-name>
    
  • Zainstaluj docelową wersję wymaganego pakietu:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    lub

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. Jeśli lista zależności / rekomendowanych / sugerowanych pakietów, tj. Tych, które mają być oznaczone, apt-markjest duża, zapisz zamierzoną listę spakowanych danych wyjściowych apt-cache show <target-package-name>w dowolnym pliku powiedz /path/to/fooi użyj apt-markw takiej kombinacji:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
precyzyjny
źródło
Ta metoda może działać, ale zamiast oznaczać ponad 100 paczek, wybrałem inną odpowiedź.
RolandiXor
@RolandiXor, możesz użyć apt-cache policy <target-package-name>do posiadania listy wersji pakietów, które możesz obniżyć / uaktualnić do ...
dokładnie
... proszę odnieść się do edycji dokonanej w poście; jeśli ma być zaznaczona większa liczba plików, możesz użyć dołączonej kombinacji poleceń ...
dokładnie
Nie sądzę, że mnie rozumiesz. W każdym razie mam to teraz naprawione i wydałem nagrodę (nie mogę jej zamienić).
RolandiXor
1

Właśnie przeszedłem przez ból związany z aktualizacją do wyższej wersji pakietu, a następnie zdecydowałem się na obniżenie wersji. Odbyło się to za pośrednictwem prywatnego repozytorium opiekunów. W moim przypadku chodziło o wypróbowanie najnowszej wersji systemd 233 (jeszcze nie wydanej).

Kluczem jest zrozumienie, że musisz określić wszystkie pakiety, które powinny zostać obniżone. Jeśli dobrze to zrozumiesz, prawdopodobnie zrobisz, co chcesz. Jeśli coś przeoczysz, apt powie ci, że akcja spowoduje usunięcie wielu pakietów. Aby upewnić się, że używamy flagi „-s”, aby wypróbować wersję starszą, zanim faktycznie to zrobimy.

Kroki, które musisz podjąć, to:

1) Wymień wszystkie zależności, które zostały uaktualnione do upstream (użyj innej słowa kluczowego, jeśli Twoja sytuacja jest inna):

dpkg -l|grep upstream

Daje ci to listę pakietów z nadrzędnym numerem wersji.

2) Podaj, jaka jest poprawna stabilna wersja dla każdego pakietu:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Sprawdź dwukrotnie, czy wszystko jest w porządku:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(nie jestem pewien, czy wymagana była opcja --reinstall btw, ale tak właśnie zrobiłem)

4) Usuń -s i zrób to.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5
użytkownik2427436
źródło