Dlaczego apt-get autorove nie usuwa moich starych jąder?

53

Moja partycja rozruchowa znajduje się na dysku SSD, więc nie ma miejsca na więcej niż około 8 zainstalowanych wersji jądra, a ostatecznie niektóre aktualizacje jądra nie zostaną zainstalowane, ponieważ moja partycja rozruchowa jest pełna starych wersji. Istnieje wiele pytań na temat usuwania starych wersji (nawet jak zautomatyzować proces), ale moje pytanie brzmi po prostu: dlaczego nie apt-get autoremovewykrywa ich i nie usuwa automatycznie i czy jest sposób, aby to zrobić ? Mam na myśli, czy apt-getto, co je zainstalowało, więc o nich wie, więc dlaczego decyduje się na pozostawienie wszystkich starych wersji?

BlueBomber
źródło
3
możliwy duplikat Dlaczego Ubuntu nie usuwa automatycznie starych jąder?
Przywróć Monikę - M. Schröder
1
Autoremove sposób usuwania starych jąder w większości przypadków. Jądra kumulują się, ponieważ system domyślnie nie uruchamia automatycznie autorove. Jest to ustawienie w uaktualnieniach nienadzorowanych i można je zmienić. Autoremove nie może usunąć starych jąder, gdy poprzednio ustawione w kolejce akcje apt (np. Instalowanie nowego jądra) zawiodą (z powodu niewystarczającej ilości miejsca). Zobacz bugs.launchpad.net/bugs/1357093, aby uzyskać łatkę do aktualizacji nienadzorowanych, która rozpocznie automatyczne usuwanie starych jąder.
user535733,

Odpowiedzi:

36

Aby odpowiedzieć dlaczego, zapoznaj się z plikiem /etc/apt/apt.conf.d/01autoremove-kernels

wprowadź opis zdjęcia tutaj

Jak widać, apt dowiaduje się nigdy autoremove jądra, jak powiedział o innym pliku (skryptu) /etc/kernel/postinst.d/apt-auto-removal. A oto:

wprowadź opis zdjęcia tutaj

Jeśli ręcznie zainstalujesz 2 wybrane jądra, tj. Pierwsze i bieżące, apt-autorove usunie tylko starsze wersje, których nie zainstalowałeś ręcznie, więc zawsze będziesz miał te 2 opcje plus cokolwiek najnowszego.

Aktualizacja:

W /etc/kernel/postinst.d/apt-auto-removaltej części jest:

if [ "$latest_version" != "$installed_version" ] \
   || [ "$latest_version" != "$running_version" ] \
   || [ "$installed_version" != "$running_version" ]
then
        # We have at least two kernels that we have reason to think the
        # user wants, so don't save the second-newest version.
        previous_version=
fi

Więc jeśli porównasz dane wyjściowe 01autoremove-kernelspliku i uname -rzdasz sobie sprawę, że aktualnie działające jądro i najnowsze przed nim, nigdy nie zostaną usunięte przez ten skrypt. Okazuje się, że jest inny plik /etc/apt/apt.conf.d/01autoremove, w którym są wiersze:

    APT
    {
      NeverAutoRemove
      {
            "^firmware-linux.*";
            "^linux-firmware$";
      };
  VersionedKernelPackages
  {
        # linux kernels
        "linux-image";
        "linux-headers";
        "linux-image-extra";
        "linux-signed-image";
        # kfreebsd kernels
        "kfreebsd-image";
        "kfreebsd-headers";
        # hurd kernels
        "gnumach-image";
        # (out-of-tree) modules
        ".*-modules";
        ".*-kernel";
        "linux-backports-modules-.*";
        # tools
        "linux-tools";
  };

Możesz więc je skomentować, a to pozwoli ci automatycznie usunąć jądra apt-autoremove, jednak pamiętaj - rób to na własne ryzyko

Sergiy Kolodyazhnyy
źródło
1
Bardzo interesujące! Mój /etc/apt/apt.conf.d/01autoremove-kernelsma wiele wierszy, ale tylko dwie wersje spośród nich wszystkich: 3.13.0. {39,43}. dpkg -l linux-*Wymienia jednak cztery wersje, 3.13.0. {39, 40, 41, 43}, więc czymś innym niż /etc/apt/apt.conf.d/01autoremove-kernelsutrzymanie tych środkowych wersji, prawda?
BlueBomber,
1
TL: DR: 01autoremoveplik, który chcesz, 01autoremove-kernelsjest prawdopodobnie tylko ochroną, więc apt nie usuwa aktualnie zainstalowanego jądra i najnowszego (na wypadek, gdyby najnowsze
spieprzyły
1
O ile nie mylę się 01autoremove, chroni to tylko przed automatycznym usunięciem pakietów zależności, takich jak linux-image-extra. Zmiana nie powinna mieć wpływu na to, czy linux-image-3.16.0-31-genericautoroved. Żaden z zawartych w nim wzorców nie pasuje do nazw pakietów, które chcemy automatycznie usunąć.
Peter Cordes,
1
@PeterCordes Nie usuwaj ani nie komentuj wierszy /etc/apt/apt.conf.d/01autoremove. To nie pomaga w pisaniu starych wersji jądra, ale może mieć niepożądane efekty. Plik nie chroni przed autorovingiem, linux-image-extraale pakiety pasujące do wyrażeń regularnych w NeverAutoRemovesekcji.
jarno
2
@BlueBomber, powodem, dla którego apt-get autoremovenie usuwa się jądra niewymienionego na liście, /etc/apt/apt.conf.d/01autoremove-kernelsjest to, że jądra te są oznaczone jako zainstalowane ręcznie; zobacz moją odpowiedź .
jarno
8

Dla mnie pomogło to zainstalować najnowsze (X) ubuntu (15.10). We wcześniejszych wersjach pakiety jądra mogą być oznaczone jako zainstalowane ręcznie, przynajmniej jeśli zostały zainstalowane przy użyciu Software Updater, więc sudo apt-get autoremove --purgenie można ich usunąć. Istnieją raporty o błędach dotyczące problemu: Bug # 1175637 , Bug # 1439769

We wcześniejszej wersji można było spróbować oznaczyć pakiety jądra automatycznie instalowane przez sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")i uruchomić sudo apt-get autoremove --purgepóźniej, aby sprawdzić, czy to robi różnicę. Polecenie nadal nie powinno usuwać pakietów jądra pokazanych w /etc/apt/apt.conf.d/01autoremove-kernels, ale najbezpieczniej jest uruchomić najpierw apt-get autoremovez --dry-runopcją.

jarno
źródło
Och, polecenie autorove ma tendencję do usuwania zbyt wielu jąder, patrz Bug # 1440608
jarno
1
apt-markwystarczyły dla mnie, chciałbym móc upvote 10 razy: P
Mike Gleason jr Couturier