Как «apt» решает, сколько старых ядер оставить?

23

Я управляю парой серверов для основных служб (NTP, DNS и т. Д.), И мне просто пришло в голову, что один из серверов, похоже, содержит 3 последних ядра, а не 2 на других:

nul@quark:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@quark:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-51-generic       3.13.0-51.84                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-51-generic 3.13.0-51.84                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

...

nul@dwarf:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@dwarf:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

Все серверы обслуживаются одинаково, не знаю, что я мог бы сделать, должен быть где-то параметром, но не могу его найти!

Пожалуйста, кормите мое любопытство! Спасибо

ionreflex
источник

Ответы:

32

Существует автоматически сгенерированный файл, который сообщает, apt-getкакие ядра нужно удалить, а какие оставить.
Файл, который сообщает, из apt-getкаких они ядер, /etc/apt/apt.conf.d/01autoremove-kernelsгенерируется /etc/kernel/postinst.d/apt-auto-removal.

Обычно случается так, что когда вы получаете обновления ядра, когда изменяется версия ядра, скажем, с, 3.13на 3.16, /etc/apt/apt.conf.d/01autoremove-kernelsзатем обновляется, чтобы сохранить 3.16*ядра, и затем устанавливается удаление всех 3.13ядер, если это не указано в сценарии создания, который не будет удален.

Из apt-auto-removalсценария:

# Автор: Стив Лангасек 
#
# Отметить как не для автоматического удаления те пакеты ядра, которые:
# - текущая загруженная версия
# - версия ядра, к которой мы обратились
# - последняя версия ядра (определяется по правилам, скопированным из grub
# пакет для определения, какое ядро ​​загружаться)
# - вторая последняя версия ядра, если загруженная версия ядра
# уже самая последняя и этот скрипт вызывается для той же версии,
# для обеспечения доступности резервной копии в случае, если недавно установленная
# ядро ​​в этом ABI не загружается
# В общем случае это приводит к сохранению ровно двух ядер, но может
# результат в сохранении трех ядер. Лучше ошибиться на стороне
# сохранение слишком большого количества ядер, чем сохранение слишком малого.
#
# Мы генерируем этот список и сохраняем его в /etc/apt/apt.conf.d вместо маркировки
# пакетов в базе данных, потому что это запускается из сценария postinst и apt
# перезапишет БД при выходе.

Однако это иногда не помечает их для автоматического удаления, поскольку некоторые версии кодирования были изменены по сравнению с версиями, чтобы этого не происходило.

Если вы хотите пометить предыдущие ядра, autoremoveкроме обязательных, основанных на сценариях, запустите следующую команду из окна терминала:

sudo apt-mark auto ^linux-image-

Затем, когда вы запускаете apt-get autoremoveкоманду, могут быть удалены только те, которые больше не нужны. Я привел примеры ниже:

Этот первый показывает все ядра в системе минус текущее работающее ядро.

root @ terrance-Linux: / home / share # dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
Linux-Headers-3.16.0-34
Linux-Headers-3.16.0-34-родовое
Linux-Headers-3.16.0-36
Linux-Headers-3.16.0-36-родовое
Linux-Headers-3.16.0-37
Linux-Headers-3.16.0-37-родовое
Linux-Headers-4.0.0-040000
Linux-Headers-4.0.0-040000-родовое
Linux-изображения 3.16.0-34-родовое
Linux-изображения 3.16.0-36-родовое
Linux-изображения 3.16.0-37-родовое
Linux-изображения 4.0.0-040000-родовое
Linux-образ-экстра-3.16.0-34-родовое
Linux-образ-экстра-3.16.0-36-родовое
Linux-образ-экстра-3.16.0-37-родовое

Это показывает текущее работающее ядро.

terrance @ terrance-Linux: ~ $ uname -r
4.0.1-040001-родовое
terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
[sudo] пароль для terrance: 
Чтение списков пакетов ... Готово
Построение дерева зависимостей       
Чтение информации о состоянии ... Готово
0 обновлено, 0 вновь установлено, 0 для удаления и 0 не обновлено.
terrance @ terrance-Linux: ~ $ sudo apt-mark auto ^ linux-image-
linux-image-extra-3.16.0-33-generic нельзя пометить, так как он не установлен.
linux-image-extra-3.13.0-27-generic нельзя пометить, так как он не установлен.
linux-image-3.13.0-44-lowlatency нельзя пометить, так как он не установлен.
linux-image-3.13.0-27-generic нельзя пометить, так как он не установлен.
linux-image-3.16.0-31-lowlatency не может быть помечен, так как он не установлен.
linux-image-3.16.0-36-generic установлен на автоматически установленный.
linux-image-lowlatency-lts-utopic не может быть помечен, так как он не установлен.
linux-image-extra-3.13.0-36-generic нельзя пометить, так как он не установлен.
linux-image-3.13.0-36-generic нельзя пометить, так как он не установлен.
linux-image-4.0.0-040000-generic устанавливается на автоматически установленный.
linux-image-extra-3.13.0-45-generic нельзя пометить, так как он не установлен.
linux-image-3.16.0-25-generic нельзя пометить, так как он не установлен.

ПРИМЕЧАНИЕ . Вышеприведенный список был слишком длинным, поэтому я немного обрезал его.

terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
Чтение списков пакетов ... Готово
Построение дерева зависимостей       
Чтение информации о состоянии ... Готово
Следующие пакеты будут удалены:
  linux-image-3.16.0-34-generic linux-image-3.16.0-36-generic
  linux-image-4.0.0-040000-generic linux-image-extra-3.16.0-34-generic
  Linux-образ-экстра-3.16.0-36-родовое
0 обновлено, 0 вновь установлено, 5 для удаления и 0 не обновлено.
После этой операции освободится 613 МБ дискового пространства.
Вы хотите продолжить? [Y / N]

Итак, после выполнения этих команд вы можете видеть, что теперь я могу автоматически удалить все старое, кроме текущего ядра (4.0.1-040001-generic) и следующее новейшее (3.16.0-37-generic).

Надеюсь, это поможет.

Терренс
источник
Ubuntu по умолчанию не выполняет автоудаление? У нас есть возможность, но было (все еще) считалось невозможным решить, что такое «нежелательное» ядро ​​(в другой операционной системе «нежелательное» равно «неиспользованному»).
Rinzwind
Хорошо. Я неправильно прочитал ваш пост об этом ;-)
Rinzwind
1
@Terrance Я пытался пройти, sudo apt-mark auto ^linux-image-а затем sudo apt-get autoremove --purgeбезрезультатно; однако немного dist-upgradeмодифицированных 2 ядер (3.13.0-52 и 3.16.0.37) и следующие autoremoveизбавились от 3.13.0-51 ...
ionreflex
1
@ionreflex Рад, что вы нашли это. Не каждый ответ является идеальным, и он не может работать для всех. Но мне приятно, что такие люди, как вы, могут немного устранить неполадки и найти способ их устранения. Я думаю, что dist-upgradeвы сбежали, /etc/kernel/postinst.d/apt-auto-removalа потом изменили, а /etc/apt/apt.conf.d/01autoremove-kernelsпотом сказали, что оставить.
Терренс
1
@Terrance Я уверен, что я делал это dist-upgradeраньше, но, может быть, тот факт, что ядра были обновлены этим утром, сработал ... во всяком случае, ура, и спасибо за ваш ответ, я многому научился благодаря этому!
ionreflex