Как удалить старые версии ядра для очистки меню загрузки?

Каждый раз, когда я устанавливаю новое ядро ​​Linux, оно остается в файле grub_config, делая загрузочное меню дольше.

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

Поддерживает ли Ubuntu более простой способ их очистки или не показывать в списке загрузки?

654 голоса | спросил 14 revs, 9 users 32%
Hans
1 Jam1000000amThu, 01 Jan 1970 03:00:00 +030070 1970, 03:00:00

30 ответов


564

16.04 и более поздние версии Ubuntu

sudo apt autoremove

Эта команда удаляет пакеты, которые были автоматически установлены для разрешения зависимостей, но теперь больше не зависят от них. Это включает в себя старые версии linux-headers-* и linux-image-*. (Itâ € ™ s также умный об этом процессе, оставляя одну запасную версию ядра вокруг как резерв!)

11.10 и более поздние версии Ubuntu

GRUB2 и его отображение всех ядер

В последних версиях Grub2 , установленных в Ubuntu , автоматически отображается последнее ядро ​​и скрывается от старых ядер, которые вы, возможно, установили.

GNU GRUB

Если вы не видите свой grub , то не забудьте нажать Shift во время загрузки.

Как вы можете видеть, отображается только самое последнее ядро.

Если вы выберете показанную опцию (нажмите Enter ), все старые ядра станут видимыми и доступны для загрузки.

GNU GRUB Предыдущие версии

Как навсегда удалить старые ядра

Сначала загрузитесь с последним доступным ядром.

Существует несколько способов удаления старых ядер. Лично я бы не касался Computer Janitor , так как это признано, что он разбивает ваш компьютер с его предложениями.

синаптической

Альтернативой является Synaptic (sudo apt install synaptic)

найдите linux-image , щелкните правой кнопкой мыши ядро ​​и выберите полное удаление и, наконец, нажмите кнопку Применить , чтобы удалить ядро.

Менеджер синаптических пакетов

Повторите поиск, но на этот раз для linux-header - вы можете удалить связанные заголовки для изображения ядра, выбранного ранее.

Synaptic , хотя и не будет пытаться проверить, что вы пытаетесь удалить ... вы можете случайно удалить свое новейшее ядро ​​- или даже удалить все свои ядра с помощью этого инструмента, оставив вас с не загружаемым Ubuntu !.

Не забудьте проверить, какое ядро ​​вы используете:

uname -r

Результат будет похож на:

Terminal <uname -r>

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

Рекомендация

Моя рекомендация состоит в том, чтобы сохранить как минимум два или, желательно, три ядра, включая последние. Причиной рекомендации является то, что у вас будет, по крайней мере, один /два других ядра для загрузки, если по какой-либо причине последнее ядро ​​вы не можете загружать или вводить регрессированную возможность, например, сломанную беспроводную сеть.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
364

Сначала перезагрузите свою систему, чтобы убедиться, что она использует последнее ядро. Затем откройте терминал и проверьте текущее ядро:

uname -r 

НЕ УДАЛЯЙТЕ ЭТОТ КЕРНЕЛЬ!

Затем введите следующую команду для просмотра /списка всех установленных ядер в вашей системе.

dpkg --list | grep linux-image 

Найдите все ядра, которые ниже вашего текущего ядра. Когда вы знаете, какое ядро ​​удалить, продолжите ниже, чтобы удалить его. Выполните приведенные ниже команды, чтобы удалить выбранное ядро.

sudo apt-get purge linux-image-x.x.x-x-generic 

Наконец, запустите команды ниже, чтобы обновить grub2

sudo update-grub2 

Перезагрузите систему.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
259

Мой однострочный файл для удаления старых ядер (это также освобождает дисковое пространство)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

Объяснение (помните, | использует вывод предыдущей команды как входной для следующего)

  • dpkg --list перечисляет все установленные пакеты
  • grep linux-image ищет установленные изображения linux
  • awk '{ print $2 }' просто выводит второй столбец (который является именем пакета)
  • sort -V помещает элементы в порядок по номеру версии
  • sed -n '/'`uname -r`'/q;p' печатает строки перед текущим ядром
  • xargs sudo apt-get -y purge очищает найденные ядра

Отмена вызова sed:

  • -n говорит sed, чтобы быть спокойным
  • `uname -r` выводит текущую установленную версию ядра - мы включаем ее в backticks, чтобы выход включался как часть команды (вы также можете увидеть это как $(uname -r)
  • /something/q говорит о прекращении, когда вы сопоставляете «что-то» (в этом случае что-то выводится из uname -r) - окружение / регулярное выражение
  • p напечатан
  • ; - команда separtor, поэтому /something/q;p говорит, что выходите, когда вы что-то сопоставляете, иначе печатайте

, sed -n '/'`uname -r`'/q;p' печатает строки до тех пор, пока они не совпадут с текущим именем ядра.

Если вы параноик (как и я), вы можете сделать последнюю часть xargs echo sudo apt-get -y purge, чтобы напечатать команду для очистки старых ядер, затем вы можете убедитесь, что перед запуском ничего неожиданно не было.


Измененная версия для удаления заголовков:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

Примечание: вызов sed изменен. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")" извлекает только версию (например, «3.2.0-44»), без «-генерического» или подобного из uname -r


Версия «все-в-одном» для удаления изображений и заголовков (объединяет две версии выше):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
55

Ubuntu 16.04 +:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10 и ниже:

Я считаю, что это самый простой и быстрый способ. Он сохраняет последнее ядро, а также еще два:

sudo apt-get install bikeshed
sudo purge-old-kernels

Чтобы изменить количество оставшихся сохраненных ядер:

sudo purge-old-kernels --keep 3
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
41

Удаление записей из Grub 2 Записи должны быть удалены путем редактирования или удаления файлов в папке /etc/grub.d. Файл /boot/grub/grub.cfg доступен только для чтения и обычно не требует редактирования.

Слишком много ядер?

  • Если вы не уверены в том, какое ядро ​​вы используете в терминальном типе uname -r .

  • Ядра, удаленные с помощью APT (Synaptic, «apt-get remove» и т. д.) будут автоматически обновлять grub.cfg, и никакое действие пользователя не требуется.

  • Отличным инструментом для удаления ядер (и записей в меню) является Ubuntu-Tweak, безопасное и удобное графическое приложение.

  • Установите настройку ubuntu

  • Ubuntu-Tweak будет доступен в разделе Applications> Системные инструменты.

Удалить старые записи ядра

  • Выберите «Очиститель пакетов» слева и «Очистить ядро» с правой панели.

  • Нажмите кнопку «Разблокировать» в правом нижнем углу, введите свой пароль.

  • Выберите из отображаемого списка изображения и заголовки ядра, которые вы хотите удалить. Используемое ядро ​​не указано.

  • Нажмите кнопку «Очистка» в правом нижнем углу, чтобы удалить выбранные изображения и заголовки ядра.

Удалить операционные системы из меню Grub

  • Другие операционные системы, которые были удалены с компьютера, также будут удалены из меню, как только «update-grub» будет запущен как root.

  • Элементы меню помещаются в меню Grub2 с помощью скриптов. Если вы не хотите вводить другие операционные системы в меню, отключите /etc/grub.d/30_osprober

  • Запустите эту команду, чтобы остановить запуск сценария
    sudo chmod -x /etc/grub.d/30_os-prober

  • DISABLE_30_OS-PROBER = 'true' в /etc /default /grub

Удалить Memtest86 + из меню Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Запустите команду update-grub, чтобы включить изменения в grub.cfg

startupmanager Установить startupmanager

Вы можете найти его в разделе System>> Администрирование>>> alt text
 alt text
На втором снимке экрана вы можете выбрать, сколько ядер показать? Обычно я просто держу его 1, но когда я получаю обновление ядра, я всегда меняю его на 2 перед перезагрузкой, поэтому я могу выбрать более старое ядро, если у нового ядра возникают проблемы с моим оборудованием. Как только я знаю, что новое ядро ​​работает хорошо, я меняю его на 1.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
38

Чистая командная строка, это приведет к удалению всех, кроме текущего и второго самых текущих (через «-2» в головной команде ниже):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
34

Обновление: purge-old-kernels - устарел в настоящее время.

Я сделал сценарий для очистки ядер даже в сложных условиях. Он называется linux-purge, и вы можете найти его здесь .

Если вы просто хотите очистить ядра (и связанные пакеты), которые старше, чем текущее ядро, когда система не сломана, вы можете использовать этот сценарий .

Также есть страница документации Ubuntu, которую я внес в отношении удаления старых ядер здесь .

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
29

Вы можете следить за с помощью секции пакета «без присмотра обновлений» Автоматические обновления безопасности в статье об Ubuntu Wiki для этого.

Вам нужно изменить следующую строку в файле /etc/apt/apt.conf.d/50unattended-upgrades ;

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

с

Unattended-Upgrade::Remove-Unused-Dependencies "true";

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

Также удалите или прокомментируйте строку

"^linux-image.*"; 

в разделе «NeverAutoRemove» файла /etc/apt/apt.conf.d/01autoremove.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
27

Самый быстрый /более простой способ (возможно, по крайней мере с 12.04), который уже существует с Ubuntu, - это apt-get. Выполните следующие действия, если хотите удалить все старые версии ядра, которые не используются (за исключением предыдущего, который вы не используете. Это значит, что если текущая версия ядра сработает некорректно, у вас есть способ пойти назад в предыдущее состояние). Выполните следующие действия:

sudo apt-get autoclean

Это приведет к удалению любых старых файлов (включая версии ядра), которые могут возникнуть у вас. Обратите внимание, что если у вас много старых версий, это займет некоторое время, поскольку он должен удостовериться, что удаление версии ядра не вызывает проблем. Для меня удаление последних 12 версий ядра заняло около 2 минут. Вы также можете сделать следующее:

sudo apt-get clean

Это позволит устранить все загруженные и сохраненные в папке кеша apt. Наконец, у вас есть:

sudo apt-get autoremove

, который будет проверять любые неиспользованные пакеты и удалять их, если необходимо. Это отлично подходит для тех библиотек и пакетов зависимостей, которые больше не нужны ни одному из установленных приложений.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
25

10.04 GUI-метод

Computer Janitor может очищать старые ядра, и я полагаю, что установлен по умолчанию в Ubuntu (но не в Kubuntu).

GRUB 1, если вы используете это, имеет опцию в /boot/grub/menu.lst, чтобы указать, сколько ядер он должен показывать максимум. GRUB 2, насколько я могу судить, не делает.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
23

Чтобы выяснить, какие ядра и заголовки установлены, используйте

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

Затем вы можете удалить их по одному или вместе, просто убедитесь, что вы сохранили последнее.

Также есть несколько удобных команд и скриптов для автоматизации удаления.

http://ubuntuforums.org/showthread.php?t=1658648

Следующие претензии для удаления всех неиспользуемых ядер и заголовков:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers)" | xargs sudo apt-get purge
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
16

Чтобы удалить старые ядра изображений Linux, сначала загрузитесь в ядро, которое вы хотите сохранить.

Вы также можете проверить версию ядра с помощью команды uname -r, чтобы вы не удалили ошибку по ошибке.

Теперь перейдите в диспетчер синаптических пакетов и найдите linux-image и удалите старые версии, кроме тех, которые показаны верхней командой. Обычно я предпочитаю идти с последним.

Теперь при перезапуске вы увидите более чистое меню grub.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
14

Вы можете установить ubuntu-tweak , а затем перейдите к Applications -> Системный инструмент -> ubuntu tweak и

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

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
7

Лично мне нравится использовать Synaptic. Это заставляет меня чувствовать себя более уверенно в том, что происходит. Единственное приложение, которое я использовал, которое имеет возможность удалить старые ядра, - Ubuntu Tweak .

Как удалить ядра, которые вы не используете:

  • Открыть UbuntuTweak
  • Нажмите «Очистка пакетов» в разделе «Приложения» в левой панели.
  • В правой части «очистки» нажмите «Очистить ядра»
  • Выберите все ядра - я думаю, что тот, который используется, не указан, но на всякий случай проверьте запуск uname -a в терминале
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
6

Вы можете удалить старые ядра (linux-image-...) с помощью Synaptic и удалить их из меню загрузки. Будьте осторожны, чтобы не удалить запущенное ядро ​​(вы можете проверить его версию с помощью uname -r).

Имейте в виду, что наличие одной или двух старых версий может помочь вам устранить неполадки, если что-то пойдет не так.

В качестве альтернативы вы можете редактировать /удалять записи вручную (gksu gedit /boot/grub/grub.cfg), но они будут сгенерированы при обновлении до более нового ядра. Если вы думаете об удалении параметров recovery mode - не надо. Они могут пригодиться, если вы сломаете что-то, что мешает вам загружаться.


Обратитесь к этой странице .

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
4

Это чистое решение командной строки.

Сначала создайте список всех установленных версий ядра, кроме текущего ядра:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))

Альтернативно создайте список всех установленных версий ядра, кроме последних двух:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)

Изучите список. Убедитесь, что версии ядра, которые вы хотите сохранить, не являются частью списка. Используйте команду uname -r, чтобы увидеть версию текущего ядра.

Если вы довольны результатами, вы можете использовать apt-get для удаления пакетов.

Сначала сухой пробег (с использованием первого генератора в качестве примера):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Тогда реальный пробег:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Если вы хотите автоматизировать процесс, добавьте параметр --yes:

sudo apt-get --yes purge $(
  ...)
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
3

Преимущество этого ответа - родной Ubuntu Bash используется без установки сторонних приложений. Пользователи пользовательских ядер, которые не использовали apt или dpkg, могут изменить этот сценарий bash в соответствии с их потребностями. Этот ответ основан на ( Как выборочно чистить старые ядра сразу ).

Решение на основе Zenity

Zenity предоставляет удобный интерфейс графического интерфейса для терминала для обработки списка и выбора элементов с помощью радиокнопки :

 rm-ядра 1

Как заголовок указывает, что текущее ядро, которое вы загрузили, не может быть удалено и не включено в список. Сообщается о том, сколько будет сохранено в каталоге /boot. На вашем диске сохраняется больше, потому что двоичные файлы ядра также находятся в других областях. 27 июля 2017 г. примечание: Каталоги /usr/src/*kernel_version* и /lib/modules/*kernel_version* теперь включены как хорошо.

Дата изменения обнаружена с помощью команды stat. В моей системе эта дата «трогала» каждый раз, когда ядро ​​загружается с помощью этого ( Как узнать, когда была загружена последняя версия ядра? ) cron скрипт перезагрузки. Однако в вашей системе дата будет датой выпуска ядра, а не в последний раз, когда вы ее загрузили.

apt-get purge дает вам шанс прервать

Вам предоставляется последняя возможность просмотреть все, что будет очищено, и увидеть общее количество дискового пространства (несколько вводящее в заблуждение), которое будет восстановлено:

The following packages will be REMOVED:
  linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
  linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
  linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
  linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
  linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
  linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
  linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
  linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
  linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
  linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
  linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
  linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n] 

Код

Скопируйте этот код в исполняемый файл с именем rm-kernels в /usr/local/bin:

 #!/bin/bash

# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    zenity --error --text "root access required. Use: sudo rm-kernels"
    exit 99
fi

OLDIFS="$IFS"
IFS="|"
choices=()

current_version=$(uname -r)

for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    choices=("${choices[@]}" false "$v" "$d" "$s")
done

# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large

choices=(`zenity \
        --title "rm-kernels - Total: $t MB excluding: $current_version" \
        --list \
        --separator="$IFS" \
        --checklist --multiple \
        --text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --width=640 \
        --height=480 \
        --column "Select" \
        --column "Kernel Version Number" \
        --column "Modified Date" \
        --column " Size " \
        "${choices[@]}"`)
IFS="$OLDIFS"

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
     apt-get purge $list
fi

ПРИМЕЧАНИЕ. Вам нужно sudo-разрешение для создания файла, поэтому используйте:

 gksu gedit /usr/local/bin/rm-kernels

Чтобы сделать исполняемый файл:

 sudo chmod +x /usr/local/bin/rm-kernels

Версия сервера

rm-kernels-server - это версия сервера для выборочного удаления ядер одновременно. Вместо диалогового окна GUI (графического) текстовое диалоговое окно используется для выбора ядер для очистки.

  • Перед запуском скрипта вам необходимо установить функцию диалога , используя:

    sudo apt install dialog

Диалог находится в установленной по умолчанию установке Ubuntu Desktop, но не на сервере Ubuntu.

Пример экрана

 rm-kernels-server 1

rm-kernels-server код bash

 #!/bin/bash

# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
#       Non-GUI, text based interface for server distro's.

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo "root access required. Use: sudo rm-kernels-server"
    exit 99
fi

# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed.  Aborting."; exit 99; }

OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.

current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    ((i++)) # Item List
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done

cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
    --title "Use space bar to toggle kernel(s) to remove" \
    --column-separator "!" \
    --separate-output \
    --ascii-lines \
    --checklist "         Kernel Version --------- Modified Date  Size" 20 60 15)

selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)

IFS=$OLDIFS

if [ $? -ne 0 ] ; then
    echo cancel selected
    exit 1
fi

i=0
choices=()

for select in $selections ; do
    ((i++))
    j=$(( 1 + ($select - 1) * 3 ))
    choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
    apt-get purge $list
fi

ПРИМЕЧАНИЕ. . При вызове диалога dialog передается директива --ascii-lines, чтобы заменить расширенный набор символов линии (рисунок) ssh не нравится) с помощью «+ ----- +» для рисования. Если вам не нравится этот внешний вид, вы можете использовать директиву --no-lines для без полей.


28 июля 2017 г. Обновления

Вычисленный размер каждого ядра был взят из /boot/*kernel_version*, который составлял 5 файлов общим объемом ~ 50 МБ. Формула изменилась, чтобы включить файлы в /usr/src/*kernel_version* и /lib/modules/*kernel_version*. Расчетный размер для каждого ядра теперь составляет ~ 400 МБ. Вышеупомянутый код для rm-kernels и rm-kernels-server обновлен. Однако вышеприведенные экраны не отражают эти изменения.

Значение по умолчанию - размер файлов для linux-заголовков на 125 МБ и linux-изображение при 220 МБ, потому что du может быть очень медленным, если файлы не находятся в кеше. Чтобы получить реальный размер с помощью du, передайте любой параметр сценарию.

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

Диалоговое окно, используемое для отображения каждой последнего доступа к ядру . Эта дата может быть перезаписана для всех ядер во время резервного копирования или аналогичных операций. В диалоговом окне теперь отображается Измененная дата .

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
2

Простой способ избавиться от почти всех устаревших пакетов, пакеты, которые больше не входят в список пакетов, вместе с устаревшими ядрами - это одно из следующего:

dpkg --purge $(aptitude search ?obsolete)

Однако это пропустит пакеты, которые по-прежнему рекомендуются другими пакетами, а аргумент -R /- without-рекомендует не разрешать эту проблему.

dselect после переключения режима сортировки с 'o' покажет все устаревшие пакеты, включая пропуски aptitude, но некоторые люди не любят его использовать.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
2

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

Вот альтернативное решение, которое рассмотрит все ситуации, чтобы удалить только старые старшие ядра:

 #!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

Если у вас есть версия, более новая, чем текущая, это даст вам предупреждение о перезагрузке компьютера в первую очередь. Также обратите внимание, что старые ядра сохраняются по уважительной причине: если вы каким-то образом испортили свое текущее ядро, что делает вашу систему неустойчивой, тогда вы сможете загрузиться в любое более раннее ядро.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
1

ailurus имеет функцию удаления старых ядер, а также неиспользуемых конфигураций. Я лично удаляю его вручную из синаптики. Вы можете установить ailurus из getdeb , а также ppa

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
1

Вы можете использовать ukuu - это все GUI - обновить и удалить старые ядра. Работает для меня!

Просто помните, что последние 2 установлены и, очевидно, «запущенное» ядро.

Вы также можете установить ukuu для отображения только выпусков основной линии, даже ядер RC, скрыть выпуски точек.

 ukuu

Вы можете найти ukuu в Synaptic или инструкции здесь:

OMG! Ubuntu Инструкции по установке ukuu

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

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

gedit /boot/grub/grub.cfg

затем найдите записи, которые вы хотите сохранить, выделим и скопируем их

cd /etc/grub.d
ls

вы увидите список файлов, таких как 10_linux и 30_os-prober

sudo chmod -x 10_linux

это остановит автоматическое добавление всех записей linux в меню загрузки grub.

gksudo gedit 40_custom

откройте файл меню пользовательской загрузки, затем вернитесь к grub.cfg (который должен быть открыт в gedit) и скопируйте записи, которые хотите сохранить ... например

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

вставьте их в 40_custom, а затем сохраните его.

sudo chmod 755 40_custom

делает его исполняемым, затем, наконец, мы обновляем grub, который изменит файл grub.cfg:

sudo update-grub

Теперь, ОСТОРОЖНО, если вы обновляете ядро ​​или ОС, ваше меню загрузки, вероятно, не будет обновляться ... вам придется сделать это вручную. Но выполнение этой процедуры позволит вам настроить меню загрузки немного больше, например, удалить версию ядра и просто поместить имя ubuntu ... например, Ubuntu Lucid 10.04 и т. Д.

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

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

Установите менеджер синаптических пакетов и перейдите на вкладку фильтров (я думаю, фильтры, если не попробовать все 5) и выберите «local». Это покажет вам сиротские пакеты в вашей системе, такие как ядра. После их удаления запустите update-grub. Эта команда обновляет список параметров загрузки для grub.

Если это не удается, вы всегда можете попробовать apt-get remove linux-image-version-generic.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

Основываясь на предыдущем ответе Дэвида Кемпа, следующий скрипт очистит все заголовки и изображения, за исключением версий last 2 .

#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)

# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
    if [ -n "$SECONDTOLASTVER" ]; then
        echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
    fi
}

echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get -y purge
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

Следующая строка команд очистит все установленные ядра Linux, кроме текущего (grep -v uname -r) и самое последнее доступное ядро ​​(dpkg -l | .... | tail -1):

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -v `dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1` | grep -v `uname -r` | xargs apt-get -y purge

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

Что-то вроде сценария запуска, который делает:

uname -r >> /root/bootedkernels
cat /root/bootedkernels | sort -u | tail -3 > /root/bootedkernels # Keep the last 3 booted kernels

, а затем используйте:

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -vf /root/bootedkernels | grep -v `dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1` | grep -v `uname -r` | xargs apt-get -y purge
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

Чтобы немного контролировать, какие версии сохранить, явным образом выберите те, которые вы хотите удалить. Например, если вы хотите удалить версии ядра 3.2.0. [49-53], используйте простой цикл for:

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done

Отрегулируйте список версий ядра для соответствия.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

Попробуйте это. Запустите его как root.

Сохраните этот скрипт как, скажем ./keep-n-kernels.sh

Передайте в качестве аргумента командной строки количество последних ядер, которые вы хотите сохранить.

#! /Bin /Баш

# передать n в качестве аргумента командной строки, и он найдет все установленные
# ядра и сохранить только n самых последних => удалите все старые

# dpkg -l 'linux- *' | sed '/^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([^ 0-9] \ + \) /\ 1 /")" '/d; s /^ [^] * [^] * \ ([^] * \). * /\ 1 /; /[0-9] /! d '
# эта команда дает список всех пакетов EXCEPT для последнего ядра.
# source: https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

п = $ 1

# найти установленные версии ядра:
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sort -n
# дает номера версий, по одному в каждой строке
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$//g' | grep -v '\ ... $' | sort -u
# дает только те, которые появляются в linux-image

# суффикс, например. -генерический-пай
# тип ядра, загружаемого в
suffix = $ (uname -r | sed 's: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g')

command = "apt-get purge"

для версии в $ (dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$//g' | grep -v ' \ ... $ '| sort -u | head -n - $ {n})
делать
    command = $ {command} "^ linux-image - $ {version} $ {suffix}"
сделанный

$ команда

Использование образца:

# ./keep-n-kernels.sh 4 # запустите команду apt-get, чтобы удалить все, кроме 4 последних ядер

Если вы хотите [И НА СВОЙ СОБСТВЕННЫЙ РИСК], вы можете добавить a -y (или флаг силы) в команду apt-get и сделать его неинтерактивным.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

Я использую рабочий стол KDE, и самый простой вариант, который я нашел, - это использовать приложение kde-config-grub2, как предлагается здесь: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux -versions (который я уже установил для настройки фоновое изображение, опция загрузки по умолчанию и т. п.). Рядом с раскрывающимся списком, в котором вы можете выбрать запись по умолчанию, есть кнопка «Удалить старые записи». Нажав эту кнопку, вы увидите список всех установленных ядер, и вы можете выбрать, какие из них нужно удалить. Когда вы применяете изменения, он будет использовать dpkg, чтобы фактически удалить их из системы, а также меню GRUB.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

Чтобы прослушивать, вы также можете выпустить

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

как root, и задание будет выполнено.

ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28
0

У меня есть сценарий для этого, который не требует очень сильного анализа строк.

Удалить заголовки и изображения, кроме текущего, чтобы освободить пространство

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+
ответил Peaceful 19 FriEurope/Moscow2014-12-19T09:35:28+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 09:35:28 +0300 2014, 09:35:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132