Почему apt-get autoremove не удаляет мои старые ядра?

53

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

BlueBomber
источник
3
Возможный дубликат Почему Ubuntu не удаляет старые ядра автоматически?
Восстановить Монику - М. Шредер
1
Autoremove действительно удаляет старые ядра в большинстве случаев. Ядра накапливаются, потому что система не запускает автоматическое удаление по умолчанию. Это параметр в автоматических обновлениях, и его можно изменить. Автоматическое удаление не может удалить старые ядра, если ранее не выполненные действия apt (например, установка нового ядра) были поставлены в очередь (из-за недостатка места). См. Bugs.launchpad.net/bugs/1357093 для исправления для необслуживаемых обновлений, которые начнут автоматически удалять старые ядра.
user535733 31.12.15

Ответы:

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
Очень интересно! У My /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разделе.
Ярно
2
@BlueBomber, причина, по которой apt-get autoremoveне удаляются ядра, не перечисленные в /etc/apt/apt.conf.d/01autoremove-kernelsтом, что эти ядра помечены как установленные вручную; смотри мой ответ .
Ярно
8

Для меня это помогло установить последнюю (X) Ubuntu (15.10). В более ранних выпусках пакеты ядра можно было пометить как установленные вручную, по крайней мере, если они установлены с помощью Software Updater, чтобы их sudo apt-get autoremove --purgeнельзя было удалить. Есть сообщения об ошибках, связанных с этой проблемой: Ошибка # 1175637 , Ошибка # 1439769

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

Ярно
источник
О, команда autoremove имеет тенденцию удалять слишком много ядер, см. Ошибка # 1440608
jarno
1
apt-markсделал трюк для меня, хотелось бы upvote 10 раз: P
Майк Глисон младший Кутюрье