Чому apt-get autoremove не видаляє старі ядра?


53

Мій завантажувальний розділ знаходиться на SSD, тому в ньому немає місця для більше ніж 8 встановлених версій ядра, і з часом деяке оновлення ядра не вдасться встановити, оскільки мій завантажувальний розділ заповнений старими версіями. Існує багато запитань про те, як видалити старі версії (навіть як автоматизувати процес), але моє запитання просто таке: чому їх не apt-get autoremoveвиявляють та не видаляють автоматично, і чи є спосіб, як я можу це зробити ? Я маю на увазі, що apt-getце все-таки встановило їх, тому воно знає про них, то чому він вирішує залишити всі старі версії?



1
Autoremove чи видалити старі ядра в більшості випадків. Ядра накопичуються, оскільки система за замовчуванням не запускається автоматично. Це налаштування для без нагляду оновлень, і їх можна змінити. Autoremove не може видалити старі ядра, коли попередньо встановлені в черзі влучні дії (наприклад, встановлення нового ядра) не вдалося (через недостатнє місце). Див bugs.launchpad.net/bugs/1357093 для пластиру необслуговуваних-оновлень , які будуть починатися видалення старих ядер автоматично.
користувач535733

Відповіді:


36

Щодо відповіді чому, зверніться до файлу /etc/apt/apt.conf.d/01autoremove-kernels

введіть тут опис зображення

Як ви можете бачити, схильний сказано ніколи не autoremove ядра, як сказав інший файл (скрипт), /etc/kernel/postinst.d/apt-auto-removal. І ось це:

введіть тут опис зображення

Якщо ви вручну встановите 2 обраних ядра, тобто перше та поточне, то apt-autoremove видалить лише старіші версії, які ви не встановили вручну, тому у вас завжди будуть ці 2 варіанти плюс будь-яка остання.

Оновлення:

У /etc/kernel/postinst.d/apt-auto-removalцій частині є:

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

Отже, якщо ви порівняєте вихідний 01autoremove-kernelsфайл і uname -rзрозумієте, що поточне ядро, що працює в даний час, і найсвіжіше до нього, це сценарій ніколи не буде видалено. Виявляється, є ще один файл /etc/apt/apt.conf.d/01autoremove, де є рядки:

    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";
  };

Тож ви можете прокоментувати це, і це дозволить вам автоматично видалити ядра за допомогою apt-autoremove, хоча пам’ятайте - робіть це на свій страх і ризик


1
Дуже цікаво! У мене /etc/apt/apt.conf.d/01autoremove-kernelsбагато рядків, але серед них лише дві версії: 3.13.0. {39,43}. Але dpkg -l linux-*перераховано чотири версії, 3.13.0. {39,40,41,43}, тож щось інше, ніж /etc/apt/apt.conf.d/01autoremove-kernelsзберігати середні версії навколо, правда?
BlueBomber

1
TL: DR: 01autoremoveпотрібний вам файл - 01autoremove-kernelsце, мабуть, лише захист, щоб apt не видалив наразі встановлене ядро ​​та найсвіжіші (про всяк випадок нові шпильки)
Сергій Колодяжний

1
Якщо я не перечитаю 01autoremove, це просто захист від автоматичного видалення пакетів залежності, як-от linux-image-extra. Змінення його не повинно впливати на те, чи linux-image-3.16.0-31-genericстає авторемонтом чи ні . Жоден із зразків у ньому не відповідає назвам пакету, який ми хочемо автоматично видалити.
Пітер Кордес

1
@PeterCordes Не видаляйте та не коментуйте рядки в /etc/apt/apt.conf.d/01autoremove. Це не допоможе вам у автоматичному переміщенні старих пакунків ядра, але може мати небажані ефекти. Файл не захищає від автоматичного переміщення, linux-image-extraале пакунки, які відповідають звичайним виразам у NeverAutoRemoveрозділі.
jarno

2
@BlueBomber, причина, по якій apt-get autoremoveне видаляються ядра, не зазначені в, /etc/apt/apt.conf.d/01autoremove-kernelsполягає в тому, що ці ядра позначені як встановлені вручну; дивіться мою відповідь .
jarno

8

Для мене це допомогло встановити останню (X) ubuntu (15.10). У попередніх випусках пакети ядра можуть бути позначені як встановлені вручну, принаймні, якщо вони встановлені за допомогою програми оновлення програмного забезпечення, так що sudo apt-get autoremove --purgeїх не можна видалити. Є повідомлення про помилки щодо проблеми: помилка # 1175637 , помилка # 1439769

У попередньому випуску ви можете спробувати позначити автоматично встановлені пакети ядра sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")та запустити sudo apt-get autoremove --purgeдалі, щоб побачити, чи це має значення. Команда повинна ще не видалити KERNELS пакетів , показані в /etc/apt/apt.conf.d/01autoremove-kernels, але безпечніше працювати apt-get autoremoveз --dry-runопцією першим.


О, команда autoremove прагне видалити занадто багато ядер, див. Bug # 1440608
jarno

1
я apt-markзробив трюк для мене, бажаю, щоб я міг підняти участь 10 разів: P
Майк Глісон, молодший Кутюр'є,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.