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

701

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

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

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

Ганс
источник
10
Существует команда ubuntu под названием purge-old-kernels для выполнения этой работы. Смотрите мой ответ для получения дополнительной информации.
Ярно
29
sudo apt-get autoremoveследует сделать трюк на Ubuntu 14.04+
конфорки
1
Накопление старых ядер - это ошибка, исправление которой происходит: bugs.launchpad.net/bugs/1357093 . Когда исправление выпущено, старые ядра автоматически удаляются по умолчанию.
user535733 31.12.15
1
@hobs Команда не работает для меня в Ubuntu Studio 14.04, если ядра установлены не автоматически, а с помощью Software Updater.
Ярно
1
Я продолжаю возвращаться к этой странице ... комментарий @hobs работает только в том случае, если ваши ядра были автоматически установлены - однако вы можете sudo apt-get autoremove --purge ответить , следуя apt-markсовету на https://help.ubuntu.com/community/RemoveOldKernels
earcam

Ответы:

602

16.04 и более новые версии Ubuntu

sudo apt autoremove

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

11.10 и более новые версии Ubuntu

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

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

GNU GRUB

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

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

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

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

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

Первая загрузка с последним доступным ядром.

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

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

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

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

Synaptic Package Manager

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

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

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

uname -r

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

Терминал <uname -r>

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

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

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

fossfreedom
источник
3
Удаление старых пакетов "linux-image *" с использованием synaptic также хорошо работало с 10.04. (Я упоминаю об этом, потому что название предполагает, что это может быть только для 11.10 и выше)
mivk
4
необходим -yпереключатель в конце apt-getстроки, в противном случае apt-get просто запрашивает подтверждение, а поскольку вход является каналом, он просто прерывается. Так что это должно закончиться:| xargs sudo apt-get purge -y
Джош
37
Удаление около 20 старых версий linux-imageи linux-headersосвобождение 4,5 ГБ места на моей машине.
Андрей Мао
16
Этот метод работает хорошо, но удаление каждого ядра чрезмерно восстанавливает grub.cfg, что занимает много времени. Есть ли способ отключить это для пакетного удаления, а затем восстановить его один раз?
космонавт
15
Я задаю второй вопрос из @spacediver - это сумасшедший медленный процесс, когда у вас есть 38 ненужных ядер, поскольку, поскольку каждое из них удаляется, оно проходит через все оставшиеся при создании нового grub.cfg. Это то, что мы называем операцией N ^ 2 - она ​​обрабатывает ядро ​​примерно (38 ^ 2/2) = 722 раза и работает очень медленно. Конечно, Ubuntu может придумать что-то лучше ....
nealmcb
384

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

uname -r 

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

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

dpkg --list 'linux-image-*'

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

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

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

sudo update-grub2 

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

возвратных.
источник
34
Делая это в 10.04 и 12.04, я обнаружил, что update-grub автоматически запускался во время процесса очистки.
aidan
93
Bash - фигурных скобках может быть использован, например , sudo apt-get purge linux-image-3.2.0-3{0..5}-generic(удаляет 30,31, .., 35)
аджо
12
После этого не нужно перезагружать систему. Фактически, вы должны перезагрузить систему перед выполнением этих шагов, чтобы убедиться, что вы используете последнюю версию ядра, которую вы, вероятно, только что скачали и установили (перед этим вы выполнили обновление apt-get update && apt-get, верно ??)
Рикет
4
Вы также можете удалить linux-signed-imageпакеты, которые могут быть установлены в системах UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-genericкоторые будут удалены 12, 14 и 24
devius
1
@jarno Я не знаю, использую ли я подписанное ядро ​​или нет, но в моей системе uname -rнет ни одной signedстроки. Я , кажется, установлено знаковое изображение и вывод этой lsкоманды: /boot/vmlinuz-3.19.0-16-generic.efi.signed.
Деви
283

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

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 }' просто выводит 2-й столбец (который является именем пакета)
  • sort -V упорядочивает элементы по номеру версии
  • sed -n '/'`uname -r`'/q;p' печатает строки перед текущим ядром
  • xargs sudo apt-get -y purge удаляет найденные ядра

Разматывание sedвызова:

  • -nговорит, sedчтобы быть тихим
  • `uname -r` выводит текущую установленную версию ядра - мы включаем ее в обратные кавычки, чтобы вывод был включен как часть команды (вы также можете увидеть это как $(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"), без "-generic" или подобного из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
David Kemp
источник
1
Обратите внимание, что сопоставлять текущую версию ядра с регулярным выражением немного опасно: точки совпадают с любым символом, а 3.1.2-23 - с 3.1.2-2 (или наоборот). Смотрите также мой ответ .
Ярно
19
Вот настроенная версия «все в одном»: sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)см. Также мой ответ .
Ярно
1
@jarno, который помог мне в очень большой степени ... Престижность твоего единственного лайнера
Клин Дсилва
5
Из-за неудовлетворенных зависимостей мне нужно было использовать его dkpg -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 dpkg -P
Себастьян Састре
3
НЕТ, НЕ ДЕЛАЙТЕ ЭТОГО! «Этот пользователь выглядит немного опасно, но, конечно, 220 пользователей не могут ошибаться!» Я подумал про себя и слепо скопировал. Перезагрузился, прямо в GRUB. Эта команда уничтожила все мои ядра, включая то, которое я использовал. Может быть, я запускал ядро ​​реального времени, даже не помню. В настоящее время осматриваю в моем доме флешку для установки Ubuntu Live CD :(
Andreas Jansson
60

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
оборота бмаупин
источник
1
Эта команда является сценарием оболочки, местоположение которого вы можете найти which purge-old-kernels.
Ярно
Рад, что они сделали это намного проще в 16.04! Надеюсь, что этот ответ продолжает свой путь ...
Тоби J
В Ubuntu 16.04 у меня нет purge-old-kernelsпакета bikeshed ( случайные полезные инструменты, у которого еще нет постоянного места жительства ) или какого-либо конкретного пакета. Избегайте использования apt-get -yопции, все равно что закрывать глаза и надеяться, что все будет хорошо. Также здесь показано, как autoremove решает, сколько старых ядер оставить.
Пабло А
2
В 16.04 purge-old-kernels предоставляется пакетом byobu (подсказка:) apt-file search purge-old-kernels. Договорились apt-get -y, я его уберу.
bmaupin
1
@ Да, поскольку я не использую не-LTS версии, я не был уверен, когда именно это началось. Но я могу точно сказать, что sudo apt-get autoremoveне удаляет ядра в 14.04. Не стесняйтесь обновить ответ конкретной версией, если вы знаете, что это такое!
bmaupin
43

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

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

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

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

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

  • Установите Ubuntu твик

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

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

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

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

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

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

Удалить операционные системы из меню 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

Источник

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

Альтернативный способ удаления записей ядра (до 10.04)

для GRUB не GRUB2

startupmanager Установить автозагрузку

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

karthick87
источник
2
На самом деле, startupmanager dint дает мне окно, подобное этому, в Ubuntu 10.04, вместо этого оно просто дает окно с двумя вкладками -> Boot options и Advanced .. и в продвинутом dint имеет возможность ограничить количество ядер. Поэтому, пожалуйста, обновите ответ для Ubuntu 10.04. (И именно поэтому я проголосовал против этого ..)
Сен
Любая идея, как «количество ядер для хранения» может быть определено на машине, на которой не установлен графический интерфейс (сервер)?
sylvainulg
startupmanager устарел. См. Grup-customizer
muhasturk
39

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

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
Kees Cook
источник
9
один вкладыш из там :dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
Дмитрий Верхотуров
@DmitryPaskal, вы должны добавить это в качестве нового ответа.
saji89
10
@DmitryPaskal Как всегда, не просто копируйте и вставляйте их, не понимая их. На моей машине эта однострочная также совпадает, linux-libc-dev:amd64что не должно быть удалено.
Джеймсадни
1
@ Кук Кук, разве аргумент awk не должен быть заключен в одинарные кавычки? Если ваше намерение состоит в добавлении «linux-image-» к переданным по конвейеру строкам, это работает только при использовании awk '{print "linux-image-" $0}'.
Марк
это не работает для меня, оно включает мое собственно установленное ядро ​​(Ubuntu 14.04 с 3.17)
Alex R
35

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

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

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

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

ярно
источник
Похоже, purge-old-kernelsне в точной версии (1.22) байкшед. Есть ли разумный / безопасный способ получить более позднюю байку для точного? Или было бы проще / безопаснее просто установить скрипт? Я бы предпочел использовать репо, несмотря на длинный список зависимостей ..
drevicko
1
@ Drevicko Смотрите здесь .
Ярно
1
@drevicko, конечно,dlocate -lsbin bikeshed
Ярно
1
@drevicko, см. также другой вопрос
Ярно
1
@ КрисW да, есть. Я только слегка улучшил скрипт, поэтому лучше использовать последнюю версию.
Ярно
29

Вы можете следовать разделу Использование пакета «unattended-updates» в статье « Автоматические обновления безопасности» в 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.

Qwerty
источник
2
Я сделал это, но он все еще собирал 3+ старых ядра, потребляющих 100 МБ. Поэтому я добавил apt-get autoremoveк своей ежедневной работе cron, которая фактически выполняет обновления, поскольку она не всегда проходит через встроенный менеджер обновлений.
Маркос
Я думаю, что это работает в Trusty только для ядер, которые были установлены автоматически.
Ярно
Это прекрасно для предотвращения накопления старых ядер при автоматическом обновлении пакетов, например, с помощью автоматических обновлений. Однако, если вы не перезагрузите компьютер, вы можете обнаружить, что пакет для работающего в данный момент ядра удален! Это может вызвать одну проблему: новые устройства, которые вы подключаете, могут не работать, потому что модуль для них не может быть загружен, потому что его больше нет на вашем диске. (Быстрое решение этой
проблемы
Я создал автоматизированное решение вышеупомянутой проблемы. Если вы считаете, что это хороший подход, добавьте его в ответ Qwerty.
Joeytwiddle
27

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

sudo apt-get autoclean

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

sudo apt-get clean

Который устранит все загруженное и хранящееся в папке кеша apt. Наконец у вас есть:

sudo apt-get autoremove

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

Луис Альварадо
источник
1
Я полагаю, что это изменилось в более новых выпусках, так как в 14.04 это просто очищает кеш пакетов и не влияет на установленные пакеты или grub.
Ярно
2
Я могу подтвердить, что sudo apt-get autoremoveудаляет старые (более одной версии назад) ядра в 14.04. Возможно, вам придется запустить его до и после обновления вашего ядра. Когда я запускал перед обновлением, он удалял только общую версию старого ядра. Затем, после обновления моего ядра, оно также удалило версию старого ядра с низкой загрузкой.
Текнорах
Я имел в виду sudo apt-get autocleanкоманду. @tekNorah Я установил пару старых версий ядра и после этого запустился sudo apt-get autoremoveв Ubuntu Studio 14.04. Он не удалил никаких ядер. У меня установлены только ядра с низкой загрузкой. Почему у вас установлены ядра -generic и -lowlatency?
Ярно
5
Да, это прекрасно сработало для меня, правильно почистило все старые ядра и не использует сумасшедшие однострочные скрипты! Рекомендуется, если бы я мог проголосовать больше, чем один раз!
Джефф Этвуд
1
@JeffAtwood хорошо, это может удалить больше ядер, что безопасно. Смотрите сообщение об ошибке
Ярно
25

10.04 GUI Метод

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

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

MACO
источник
4
Компьютер Janitor не должен использоваться - он содержит ошибки и теперь был удален как приложение по умолчанию в natty / oneiric / precision.
fossfreedom
2
Вместо этого установите «Ubuntu Tweak», как описано в другом ответе (его собственный ppa), который имеет свой собственный «компьютерный уборщик» (не путать с «компьютерным уборщиком», который временно был доступен в более старых версиях Ubuntu)
майкл
25

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

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|modules)" | grep -v hwe | xargs sudo apt-get purge

(используйте, apt-get -yчтобы удалить без вопросов)

Вот что происходит при запуске 18.04.1:

~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic
mikewhatever
источник
Сценарий, который вы нашли на форуме, неисправен. Он может не удалить желаемый пакет заголовков (если вы используете какое-то старое ядро ​​-pae), а с другой стороны, он может удалить некоторые пакеты, которые вы хотите сохранить.
Ярно
Спасибо за комментарий. Сценарий может быть не идеальным, однако я использую его годами, в основном на 12.04 и 14.04, 32 и 64 битах, и у меня не было никаких проблем. ... и да, linux-libc-devустановлен.
mikewh независимо от
Я полагаю, что номер версии соответствует номеру linux-libc-devверсии текущего ядра. Здесь dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'печатает linux-libc-dev: amd64
jarno
Я все еще не могу воспроизвести ваши выводы, однако, чтобы быть в безопасности, я изменил команду, добавив дополнительный фильтр - grep -E "(image|headers)".
mikewh независимо
1
Сначала попробуйте без -yфлага с продувкой, пожалуйста ..!
danger89
16

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

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

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

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

Анураг-Jain
источник
Это, вероятно, самый основной метод, который будет использоваться для пользователей, которые устанавливают без Computer Janitor.
Broam
1
В Ubuntu 11.04 в меню grub по умолчанию отображается только текущее ядро, более старые ядра скрыты в меню «Предыдущие ядра». Этот метод все еще будет работать для очистки старых.
Энди
14

Вы можете установить Ubuntu-Tweak, а затем перейдите в Приложения -> Системный инструмент -> Ubuntu Tweak и

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

Lincity
источник
8

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

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

  • Откройте UbuntuTweak
  • Нажмите «Очиститель пакетов» в разделе «Приложения» на левой панели.
  • В правой части окна «Очистка» нажмите «Очистить ядра».
  • Выберите все ядра - я думаю, что используемого в списке нет, но на всякий случай проверка работает uname -aв терминале
Алан Фезерстон
источник
В Synaptic вы можете фильтровать «Компоненты» -> «Ядро и модули», которые включают все ядра. И отсортируйте по первому столбцу: «S» (Состояние), чтобы все установленные ядра были расположены сверху. Действительно update-grubрекомендуется.
danger89
6

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

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

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


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

евгений
источник
Grub2 теперь создает свою запись grub каждый раз, когда устанавливается новое ядро. с update-grubкоторой перепишу все те ядра.
Марко Чеппи
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 $(
  ...)
lesmana
источник
@jarno Я ценю ваши усилия по объединению и оптимизации моей командной строки. Я удалил вашу командную строку, потому что я предпочитаю удобочитаемость и простоту. Я намеренно адаптировал свою команду для удобства чтения и простоты. По крайней мере, читабельно и просто для моего мозга. Пожалуйста, оставьте свою командную строку в качестве комментария или в своем собственном ответе.
Лесмана
1
Это объединяет две цели: сохранить последние два ядра и сделать ядра более новыми, чем текущее sudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/'). Там нет необходимости, dpkg-queryтак как apt-getможет обрабатывать регулярные выражения. Обратите внимание, как я избегаю точек, и добавляю префикс и суффикс в регулярное выражение. Используя скрипт в моем собственном ответе, вы также можете оставить некоторые ядра старше, чем текущее.
Ярно
4

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

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

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

рм-ядра 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версия сервера для выборочного удаления всех ядер одновременно Вместо графического диалогового окна с графическим интерфейсом используется текстовое диалоговое окно для выбора очищаемых ядер.

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

    sudo apt install dialog

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

Образец экрана

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передайте любой параметр в скрипт.

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

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

WinEunuuchs2Unix
источник
2

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

dpkg --purge $(aptitude search ?obsolete)

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

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

Крис Чейни
источник
Данная команда не очищает старые ядра и не влияет на меню grub.
Ярно
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

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

оборота хеймайл
источник
Это не удалит ядра с низкой загрузкой или ядра любого другого вида, кроме общего.
Ярно
Я полагаю, вы ссылаетесь на это sed решения.
Ярно
@jarno: Как насчет замены grep -Po "^linux-image-[^-]+-[^-]+-generic\b"на grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"и grep -Po ".*(?=-[a-z]*$)"с grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"и grep -Po "[0-9].*(?=-[a-z]*)"с grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Сади
@ Сади, ну, я бы тоже не нашел ядер с низкой задержкой.
Ярно
1
Благодарю. Другие методы не работают для меня. Твой сделал работу.
Филипп Делтейл
1

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

sagarchalise
источник
«Ailurus - это инструмент для резервного копирования списка имен установленного программного обеспечения. ... В прошлом у Ailurus было много функций. Теперь у него есть только одна функция. Потому что я думаю, что одна действительно полезная функция лучше, чем десятки менее полезных функций».
Ярно
1

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

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

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)+
Пауло Сантос
источник
1

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

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

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

ukuu

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

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

sprocketoctopus
источник
1

Основываясь на предыдущем ответе Дэвида Кемпа, следующий скрипт очистит все заголовки и изображения, кроме последних 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 purge

(используйте, apt-get -yчтобы удалить без вопросов)

отметки
источник
Любая причина, почему это было понижено? Разве это не работает для кого-то? При копировании / вставке убедитесь, что вы не переносите длинные строки при вставке. У меня не было проблем с этим, работая.
Марк
Самая новая версия ядра на моей машине - 3.13.0-43-lowlatency. Этот скрипт очистит linux-headers-3.13.0-43-lowlatency.
Ярно
@jarno как ты это определил? чтобы попробовать это, фактически ничего не делая, добавьте флаг "-s" к команде apt-get (или просто удалите все | xargs sudo apt-get -y purge). Если он печатает 3.13.0-43-lowlatency, то, возможно, у вас есть более поздние версии, чем установленные в вашей системе.
Марк
Я попробовал симуляцию. Нет, но у меня была удалена более ранняя версия ядра, но она не была очищена, а соответствующие пакеты заголовков были удалены.
Ярно
Во всяком случае, я разрабатывал сценарий, основанный на идее ответа Санкалпа.
Ярно
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 и т. Д. ...

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

Джо
источник
3
Этот ответ кажется излишним. Лучше просто удалить старые ядра.
Скотт Северанс
Я читал, что дополнительные ядра могут быть полезны в случае восстановления. Кроме того, это простой способ редактировать текст загрузочной записи. Поэтому вместо того, чтобы говорить «Ubuntu, ядро ​​Linux xxxx-yy --text1 -text2 -t3 -t4 --t5 и т. Д. И т. Д.» (Где записи --text просто обозначают некоторые опции / параметры, которые я не понимаю), вы можете изменить это к "Ubuntu xx.yy", хотя у меня была скобка "{", от которой я не смог избавиться.
Джо
1
Я сохраняю предыдущее ядро ​​до тех пор, пока не проверю, работает ли самое новое ядро ​​правильно. Если это работает, это не собирается прекращать работать. Итак, после того, как я проверил самое последнее ядро ​​(примерно через неделю), у меня нет причин держать старое ядро ​​рядом. Если это не сработает, то у меня есть последнее известное исправное ядро. На самом деле, я сейчас использую старое ядро ​​из-за ошибки showtopper в текущих ядрах. Но это не меняет мою общую политику. Вам нужно только одно известное хорошее ядро.
Скотт Северанс
0

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

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

смаковать
источник
В Synaptic вы можете фильтровать «Компоненты» -> «Ядро и модули», которые включают все ядра. И отсортируйте по первому столбцу: «S» (Состояние), чтобы все установленные ядра были расположены сверху. Действительно update-grubрекомендуется.
danger89
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

Настройте список версий ядра, чтобы соответствовать.

NeilNjae
источник
0

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

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

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

    
#! / Bin / Баш

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

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

п = $ 1

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

# суффикс, например -generic-pae
# тип ядра, в которое вы загружаетесь
суффикс = $ (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} $ {суффикс}"
сделанный

$ команда

Пример использования:

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

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

Sankalp
источник
Он удаляет все ядра, если вы запускаете ./keep-n-kernels.sh 0. Обнаружение строки суффикса не работает; Я думаю суффикс = $ (uname -r | sed -r 's / ^ [0-9.] * (- [0-9.] +) * //') или суффикс = $ (uname -r | egrep - -only-matching - '- [[: alpha:] -] + $').
Ярно
Но я думаю, что идея хорошая. Я работал над улучшением сценария и, возможно, я опубликую его здесь когда-нибудь, когда я думаю, что он достаточно готов.
Ярно
Пожалуйста, поделитесь, @jarno. Рад, что идея кажется полезной.
Санкальп
Хорошо, вот оно: ссылка
Ярно
0

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

Бен
источник
0

Просто чтобы вмешаться, вы также можете выдать

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

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

Северо Раз
источник
0

Если вы используете ansible для управления машинами, эта книга может оказаться полезной.

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
flickerfly
источник