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

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

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

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

1
задан 22 January 2016 в 19:20

29 ответов

Откройте терминал и проверьте текущее ядро:

uname -r 

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

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

dpkg --list | grep linux-image 

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

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

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

sudo update-grub2 

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

360
ответ дан 29 May 2018 в 12:42
  • 1
    Делая это в 10.04 и 12.04, я обнаружил, что обновление-grub автоматически запускается во время процесса очистки. – aidan 2 January 2013 в 06:45
  • 2
    можно использовать расширение расширения bash , например. sudo apt-get purge linux-image-3.2.0-3{0..5}-generic (удаляет 30,31, .., 35) – ajo 19 March 2013 в 15:04
  • 3
    После этого не нужно перезагружать систему. Фактически, вы должны перезагрузить систему до , выполнив эти шаги, чтобы убедиться, что вы используете последнюю версию ядра, которую вы, вероятно, просто загрузили & amp; (вы сделали apt-get update & amp; & amp; apt-get upgrade до этого, правильно?) – Ricket 28 February 2014 в 08:27
  • 4
    Вы также можете удалить пакеты linux-signed-image, которые могут быть установлены в системах UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic, который удалит 12, 14 и 24 – devius 1 July 2014 в 15:53
  • 5
    @jarno Я не знаю, использую ли я подписанное ядро ​​или нет, но uname -r не имеет в моей системе строки signed. Кажется, у меня установлено подписанное изображение, а вывод этой команды ls: /boot/vmlinuz-3.19.0-16-generic.efi.signed. – devius 13 May 2015 в 17:38

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

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 помещает элементы в порядок по номеру версии [ f9] печатает строки до того, как текущее ядро ​​xargs sudo apt-get -y purge очистит найденные ядра

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

dpkg --list перечисляет все установленные пакеты [!d3 ] `uname -r` выводит текущую установленную версию ядра - мы включаем ее в обратные так, чтобы выход включался как часть команды (вы также можете видеть это как $(uname -r) grep linux-image ищет установленные изображения linux [ ! d4] p is print awk '{ print $2 }' просто выводит второй столбец (который является именем пакета)

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

Если вы параноидально (как и я), вы можете e последняя часть 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
257
ответ дан 29 May 2018 в 12:42
  • 1
    Обратите внимание, что немного немного опасно сопоставлять текущую версию ядра с регулярным выражением: Точки соответствуют любому символу и 3.1.2-23 соответствуют 3.1.2-2 (или наоборот). См. Также мой ответ . – jarno 16 May 2015 в 04:22
  • 2
    Вот настроенная версия «все-в-одном»: 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) См. Также мой ответ . – jarno 18 May 2015 в 15:38
  • 3
    @jarno, который помог мне в очень большой степени ... Престижность к вашему одному лайнеру – Clain Dsilva 4 September 2015 в 07:14
  • 4
    Из-за неудовлетворенных зависимостей мне пришлось использовать его с 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 – Sebastian Sastre 23 June 2016 в 00:55
  • 5
    НЕТ НЕ СДЕЛАЙТЕ ЭТО! «Этот oneliner выглядит немного опасно, но, безусловно, 220 злоумышленников не могут ошибаться!» Я подумал про себя и слепо скопировал. Перезагружено, прямо в GRUB. Эта команда вытерла все мои ядра, включая ту, которую я использовал. Возможно, я запускал ядро ​​реального времени, даже не могу вспомнить. В настоящее время я просматриваю свой дом для USB-накопителя для установки Ubuntu Live CD на :( – Andreas Jansson 27 August 2017 в 00:04

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
54
ответ дан 29 May 2018 в 12:42
  • 1
    Эта команда - это сценарий оболочки, местоположение которого вы можете найти по which purge-old-kernels. – jarno 16 May 2015 в 16:46
  • 2
    Рад, что они сделали это намного легче в 16.04! Надеюсь, этот ответ продолжает пробиваться ... – Toby J 30 March 2017 в 16:53
  • 3
    На Ubuntu 16.04 у меня есть purge-old-kernels без bikeshed ( случайных полезных инструментов, у которых еще нет постоянного дома ) или какого-либо конкретного. Избегайте использования опции apt-get -y, как закрытие глаз и надеемся, что все все будет хорошо. Также здесь , как autoremove решает, сколько старых ядер сохранить. – Pablo Bianchi 21 May 2017 в 18:06
  • 4
    В 16.04 чистка-старое ядро ​​обеспечивается пакетом byobu (подсказка: apt-file search purge-old-kernels). Согласившись на apt-get -y, я удалю его. – bmaupin 21 May 2017 в 21:34
  • 5
    @Dan, так как я не использую версии, отличные от LTS, я не был уверен точно, когда это началось. Но я могу с уверенностью сказать, что sudo apt-get autoremove не удаляет ядра в 14.04. Не стесняйтесь обновлять ответ с конкретной версией, если знаете, что это такое! – bmaupin 12 September 2017 в 16:41

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

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

Если вы не уверены в том, какое ядро ​​вы используете, в терминале типа uname -r. Ядра, удаленные с помощью APT (Synaptic, «apt-get remove» и т. Д.) Будут автоматически обновлять grub.cfg, и никаких действий пользователя не требуется. Отличным инструментом для удаления ядер (и записей в меню) является Ubuntu-Tweak, безопасное и удобное графическое приложение. Установите ubuntu tweak. Ubuntu-Tweak будет доступен в разделе «Приложения»> «Системные инструменты».

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

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

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

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

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

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

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

Элементы меню помещаются в меню Grub2 по сценариям. Если вы не хотите, чтобы в меню вводились другие операционные системы, отключите /etc/grub.d/30_osprober . Отличным инструментом для удаления ядер (и записей в меню) является Ubuntu-Tweak, безопасный и простой в использовании -use GUI.

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

[ ! d24]

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

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

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

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

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

Источник

startupmanager

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

41
ответ дан 29 May 2018 в 12:42
  • 1
    На самом деле, startupmanager dint дает мне такое окно на Ubuntu 10.04, вместо этого он просто дал окно с двумя вкладками - & gt; Параметры загрузки и Дополнительно .. и в расширенном режиме есть возможность ограничить количество ядер. Поэтому, пожалуйста, обновите ответ для Ubuntu 10.04. (И именно поэтому я отказался от этого ...) – Sen 13 December 2010 в 09:12
  • 2
    любая идея о том, как «количество ядер для сохранения» может быть определен на компьютере, на котором не установлен GUI (сервер)? – sylvainulg 28 March 2013 в 15:24
  • 3
    startupmanager устарел. См. grup-customizer – muhasturk 6 September 2014 в 07:23

Чистая командная строка, это приведет к удалению всех, кроме текущего и второго самых текущих (через «-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
38
ответ дан 29 May 2018 в 12:42
  • 1
    однострочный из там : 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 – Dmitry Verkhoturov 6 August 2012 в 00:31
  • 2
    @DmitryPaskal, вы должны добавить это как новый ответ. – saji89 12 March 2013 в 16:26
  • 3
    @DmitryPaskal Как всегда, не просто скопируйте их, не понимая их. На моей машине этот однострочный шрифт также соответствует linux-libc-dev:amd64, который не следует удалять. – jamesadney 13 March 2013 в 02:19
  • 4
    @Kees Cook, не должен ли аргумент awk окружать одиночные кавычки? Если ваше намерение состоит в том, чтобы добавить «linux-image- " к линиям с каналами это работает, только если вы используете awk '{print "linux-image-" $0}'. – Mark 12 June 2013 в 22:33
  • 5
    это не работает для меня, оно включает мое настраиваемое ядро ​​(Ubuntu 14.04 с 3.17) – Alex R 5 February 2015 в 13:39

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

Я сделал сценарий для очистки ядер даже в сложных условиях.

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

Существует также страница документации Ubuntu, которую я внес в отношении удаления старых ядер этого скрипта .

34
ответ дан 29 May 2018 в 12:42
  • 1
    Похоже, purge-old-kernels не в точной версии (1.22) bikeshed. Есть ли разумный / безопасный способ получить более свежий bikeshed для точного определения? Или было бы проще / безопаснее просто установить скрипт? Я бы предпочел использовать репо, хотя, несмотря на длинный список зависимостей. – drevicko 8 June 2015 в 05:32
  • 2
    @drevicko См. здесь . – jarno 8 June 2015 в 11:27
  • 3
    Еще один слегка касательный вопрос: не доходит до источника, есть ли способ определить, какие команды станут доступны при установке bikeshed? – drevicko 8 June 2015 в 15:00
  • 4
    @drevicko, конечно, dlocate -lsbin bikeshed – jarno 9 June 2015 в 07:57
  • 5
    @drevicko, см. также другой вопрос – jarno 9 June 2015 в 07:59

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

Вам нужно изменить следующую строку в . Используя «без присмотра» -upgrades "[] d1] file

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

с

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

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

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

"^linux-image.*"; 

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

29
ответ дан 29 May 2018 в 12:42
  • 1
    Я сделал это, но он все еще собирал 3+ старых ядра, потребляющих 100 МБ. Поэтому я добавил apt-get autoremove к моему ежедневному заданию cron, которое фактически выполняет обновления, поскольку оно не всегда проходит через встроенный менеджер обновлений. – Marcos 24 August 2012 в 17:01
  • 2
    Я думаю, что это работает в Trusty только для ядер, которые были установлены автоматически. – jarno 10 February 2016 в 14:52
  • 3
    Это отлично, чтобы предотвратить накопление старых ядер при автоматическом обновлении пакетов, например. с автоматическими обновлениями. Однако, если вы не перезагрузитесь, вы можете обнаружить, что пакет для текущего ядра был удален! Одна из проблем может привести к тому, что новые устройства, которые вы подключаете, могут не работать, потому что модуль для них не может быть горячим, потому что он больше не находится на вашем диске. (Быстрое исправление для этого - это просто установить пакет ядра снова, а затем отключить и переустановить устройство.) – joeytwiddle 18 March 2017 в 21:32
  • 4
    Я создал автоматическое решение для вышеупомянутой проблемы. Если вы считаете, что это хороший подход, то не стесняйтесь добавлять его в ответ Qwerty. – joeytwiddle 21 May 2017 в 09:04

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

sudo apt-get autoclean

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

sudo apt-get clean

Который устранит все, что скачано и сохранено в папке кеша apt. Наконец, у вас есть:

sudo apt-get autoremove

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

27
ответ дан 29 May 2018 в 12:42
  • 1
    Я полагаю, что это изменилось в новых версиях, так как в 14.04 это просто очищает кеш пакетов и не влияет на установленные пакеты или grub. – jarno 16 May 2015 в 15:35
  • 2
    Я могу подтвердить, что sudo apt-get autoremove удаляет старые (более одной версии назад) ядра в 14.04. Возможно, вам придется запускать его до и после обновления вашего ядра. Когда я запускал до обновления, он удалял только общую версию старого ядра. Затем, обновив мое ядро, он также удалил версию низкого уровня старого ядра. – tekNorah 16 May 2015 в 23:24
  • 3
    Я имел в виду команду sudo apt-get autoclean. @tekNorah Я установил пару старых ядер, а затем побежал sudo apt-get autoremove в Ubuntu Studio 14.04. Он не удалял никаких ядер. У меня установлены только ядра с низкой степенью достоверности. Почему у вас установлены как ядра, так и неактивные ядра? – jarno 18 May 2015 в 14:05
  • 4
    Да, это прекрасно сработало для меня, правильно очистило все старые ядра и не полагается на сумасшедшие однострочные скрипты! Рекомендовано, хотелось бы, чтобы это было не раз! – Jeff Atwood 8 August 2015 в 08:59
  • 5
    @JeffAtwood хорошо, он может удалить больше ядер, которые безопасны. См. отчет об ошибке – jarno 30 January 2016 в 11:11

10.04 GUI Method

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

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

25
ответ дан 29 May 2018 в 12:42
  • 1
    Не следует использовать компьютер-джойнер - он глючит и теперь был сброшен как приложение по умолчанию в natty / oneiric / exact. – fossfreedom♦ 13 February 2012 в 22:04
  • 2
    Скорее установите «Ubuntu Tweak», как описано в другом ответе (собственном ppa), который имеет свой собственный «компьютерный помощник». (не путать с «компьютерным уборщиком», который временно был доступен в более старых версиях ubuntu) – michael 4 February 2013 в 08:10

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

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
23
ответ дан 29 May 2018 в 12:42
  • 1
    Сценарий, который вы нашли на форуме, неисправен. Он может не удалить какой-либо желаемый пакет заголовков (если вы используете какое-то старое ядро ​​-pa), а с другой стороны, он может удалить некоторые пакеты (ы), которые вы хотите сохранить. – jarno 18 April 2015 в 02:36
  • 2
    Спасибо за комментарий. Сценарий может быть не идеальным, однако я использовал его в течение многих лет, в основном на 12.04 и 14.04, 32 и 64 бит, и у меня не было никаких проблем. ... и да, linux-libc-dev установлен. – mikewhatever 18 April 2015 в 06:59
  • 3
    Я полагаю, что номер версии linux-libc-dev соответствует номеру версии текущего ernernel. Здесь dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' печатает linux-libc-dev: amd64 – jarno 18 April 2015 в 12:49
  • 4
    Тем не менее, я все еще не могу воспроизвести ваши результаты, чтобы быть в безопасности, я изменил команду, добавив дополнительный фильтр - grep -E "(image|headers)". – mikewhatever 2 May 2015 в 22:15
  • 5
    Затем скрипт может оставить дополнительные пакеты. Я думаю, вы можете увидеть различные типы возможных пакетов, запустив apt-cache search --names-only "^linux-.*" | cut -d' ' -f1 | grep -E -e linux-.*-[0-9]+(\.[0-9]+){2}-[^-]+ – jarno 3 May 2015 в 20:09

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

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

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

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

16
ответ дан 29 May 2018 в 12:42
  • 1
    Это, вероятно, самый базовый метод, который будет использоваться для пользователей, у которых есть установка без компьютера. – Broam 18 September 2010 в 02:34
  • 2
    Из Ubuntu 11.04 меню grub показывает только текущее ядро ​​по умолчанию, более старые ядра скрыты в меню «Предыдущие ядра». Этот метод по-прежнему будет работать для очистки старых. – Andy 16 May 2011 в 21:03

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

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

14
ответ дан 29 May 2018 в 12:42

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

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

Открыть UbuntuTweak Нажмите «Очистить пакет» 'в разделе «Приложения» в левой панели. В правой части «очистки» нажмите «Очистить ядра». Выберите все ядра. Я думаю, что тот, который используется, отсутствует в списке, но на всякий случай проверьте работу uname -a в терминал
7
ответ дан 29 May 2018 в 12:42
  • 1
    В Synaptic вы можете отфильтровать «Компоненты» - & gt; «Ядро и модули», которые включают все ядра. И отсортируйте по первому столбцу: «S» (статус), поэтому вы получите все установленные ядра сверху. Действительно update-grub рекомендуется. – danger89 24 April 2018 в 23:48

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

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

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

См. Эту страницу.

6
ответ дан 29 May 2018 в 12:42
  • 1
    Grub2 теперь создает свою запись grub каждый раз, когда устанавливается новое ядро. с update-grub, который перепишет все эти ядра. – Marco Ceppi♦ 12 December 2010 в 22:47

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

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

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 для удаления пакетов.

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

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 $(
  ...)
4
ответ дан 29 May 2018 в 12:42
  • 1
    @jarno Я ценю ваши усилия по объединению и оптимизации моей командной строки. Я удалил вашу командную строку, потому что я предпочитаю читаемость и простоту. Я специально настроил свою команду для удобства чтения и простоты. По крайней мере, читаемый и простой для моего мозга. Пожалуйста, разместите свою командную строку в качестве комментария или в своем собственном ответе. – lesmana 16 May 2015 в 18:59
  • 2
    Это объединяет две цели: сохранить последние два ядра и сохранить ядра более новыми, чем текущие 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 может обрабатывать регулярные выражения. Обратите внимание, как я избегаю точек, и добавляю префикс и суффикс в регулярном выражении. Используя скрипт в мой собственный ответ , вы также можете сохранить некоторые ядра, которые старше, чем текущие. – jarno 17 May 2015 в 13:39

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

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

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

Как выборочно удалять старые ядра все сразу

Поскольку заголовок указывает, что текущее ядро, с которым вы загрузились, не может быть удалено и isn Включено в список. Сообщается, сколько будет сохранено в каталоге /boot. На вашем диске сохраняется больше, потому что двоичные файлы ядра также находятся в других областях. radio-buttons Теперь включены каталоги /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] 

Код

Скопируйте этот код в исполняемый файл с именем [ f13] в /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 код 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, передайте любой параметр сценарию.

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

Диалоговое окно, используемое для отображения каждого ядра ПРИМЕЧАНИЕ: . Эта дата может быть перезаписана для всех ядер во время резервного копирования или аналогичных операций. В диалоговом окне теперь отображается cron .

3
ответ дан 29 May 2018 в 12:42

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

dpkg --purge $(aptitude search ?obsolete)

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

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

2
ответ дан 29 May 2018 в 12:42
  • 1
    Данная команда не очищает старые ядра и не влияет на меню grub в моем опыте. – jarno 16 May 2015 в 15:39

Принимаемый ответ с использованием 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

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

2
ответ дан 29 May 2018 в 12:42
  • 1
    Это не позволит удалить ядра или ядра с низкой степенью достоверности любого другого аромата, чем общий. – jarno 10 May 2015 в 20:11
  • 2
    Я полагаю, вы ссылаетесь на эти sed решения. – jarno 16 May 2015 в 17:39
  • 3
    @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]+"? – Sadi 16 November 2015 в 01:23
  • 4
    @Sadi, хорошо, что тоже не найдет ядра с малой задержкой. – jarno 16 November 2015 в 17:41
  • 5
    Благодарю. Другие методы не работали для меня. Твоя работа. – Philippe Delteil 22 December 2017 в 17:10

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

1
ответ дан 29 May 2018 в 12:42
  • 1
    «Ailurus - это инструмент для резервного копирования списка имен установленного программного обеспечения. ... В прошлом у Айлуруса много функций. Теперь он имеет только одну функцию. Поскольку я считаю, что одна действительно полезная функция лучше, чем десятки менее полезных функций. & Quot; – jarno 18 May 2015 в 13:38

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

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

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

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

1
ответ дан 29 May 2018 в 12:42

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

gedit /boot/grub/grub.cfg

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

cd /etc/grub.d
ls

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

sudo chmod -x 10_linux

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

gksudo gedit 40_custom

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

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: [!d6 ]

sudo update-grub

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

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

0
ответ дан 29 May 2018 в 12:42
  • 1
    Этот ответ кажется излишним. Лучше просто удалить старые ядра. – Scott Severance 9 January 2012 в 05:32
  • 2
    Я прочитал, что дополнительные ядра могут быть полезны в случае ситуаций восстановления. Кроме того, это простой способ редактирования текста загрузочной записи. Поэтому вместо того, чтобы говорить «Ubuntu, ядро ​​Linux x.x.xx-yy -text1 -text2 -t3 -t4 -t5 и т. Д. И т. Д. И т. Д.». (где элементы -text просто обозначают некоторые параметры / параметры, которые я не понимаю), вы можете изменить его на «Ubuntu xx.yy». хотя у меня был «{" я не мог избавиться. – Joe 10 January 2012 в 04:35
  • 3
    Я сохраняю непосредственное предыдущее ядро ​​до тех пор, пока не проверю, как работает самое современное ядро. Если он работает, он не прекратит работать. Итак, после того, как я проверил самое последнее ядро ​​(через неделю или около того), у меня нет причин поддерживать старое ядро. Если это не сработает, то у меня есть последнее хорошо известное ядро, к которому я вернусь. На самом деле, в настоящее время я запускаю старое ядро ​​из-за ошибки showstopper в текущих ядрах. Но это не меняет мою общую политику. Вам нужно только одно известное хорошее ядро. – Scott Severance 10 January 2012 в 11:14

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

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

0
ответ дан 29 May 2018 в 12:42
  • 1
    В Synaptic вы можете отфильтровать «Компоненты» - & gt; «Ядро и модули», которые включают все ядра. И отсортируйте по первому столбцу: «S» (статус), поэтому вы получите все установленные ядра сверху. Действительно update-grub рекомендуется. – danger89 24 April 2018 в 23:48

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

#!/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
0
ответ дан 29 May 2018 в 12:42
  • 1
    Любая причина, почему это было приостановлено? Разве это не работало для кого-то? При копировании / вставке убедитесь, что вы не завертываете длинные строки при вставке. У меня не было проблем с этим. – Mark 25 January 2014 в 02:56
  • 2
    Новейшая версия ядра на моей машине 3.13.0-43-lowlatency. Этот скрипт очистит linux-headers-3.13.0-43-lowlatency. – jarno 3 January 2015 в 00:40
  • 3
    @jarno, как вы это определили? чтобы попробовать, ничего не делая, добавьте " -s " флаг в команду apt-get (или просто удалить | xargs sudo apt-get -y purge в целом). Если он печатает 3.13.0-43-lowlatency, возможно, у вас есть несколько более поздних версий, чем в вашей системе. – Mark 4 January 2015 в 10:05
  • 4
    Я попробовал моделирование. Нет, но у меня была удалена некоторая ранняя версия ядра, но не очищена, а соответствующие пакеты заголовков очищены. – jarno 5 January 2015 в 00:59
  • 5
    Во всяком случае, я разрабатывал сценарий, основанный на идее ответа Санкальпа. – jarno 5 January 2015 в 01:13

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

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
0
ответ дан 29 May 2018 в 12:42
  • 1
    Упрощенная форма будет sudo apt-get purge $(dpkg-query -W -f'${Package}\n' 'linux-image-[0-9]*' | head -n -1 | grep -v $(uname -r)), но даже это вызывает вопросы: можете ли вы полагаться на то, что последнее dpkg содержит последнее ядро? Можете ли вы полагаться на соответствие текущей версии в качестве такого регулярного выражения? Точка в строке версии соответствует любому символу. Что, если имя пакета имеет еще один символ в номере версии, чем текущая версия? Чтобы быть строгим, вам лучше использовать uname -r | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/' в качестве регулярного выражения для соответствия в последней команде grep. – jarno 16 May 2015 в 17:15
  • 2
    Кроме того, сценарий не очищает пакеты linux-заголовков или другие связанные пакеты. – jarno 16 May 2015 в 17:25

Чтобы иметь немного больше контроля над версиями, явным образом выбираю те, которые вы хотите удалить. Например, если вы хотите удалить версии ядра 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

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

0
ответ дан 29 May 2018 в 12:42

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

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

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

#!/bin/bash # pass n as a command line argument, and it will find all the installed # kernels and keep only the n most recent ones => uninstall all older ones # dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' # this command gives the list of all packages EXCEPT for the latest kernel. # source : https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels n=$1 # find the installed kernel versions : # dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sort -n # gives version numbers, one in each line # dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sed 's/\...$//g' | grep -v '\...$'| sort -u # gives only the ones that appear in linux-image # suffix, e.g. -generic-pae # the kind of kernel you boot into suffix=$(uname -r | sed 's:^[0-9]\.[0-9]\.[0-9]\-[0-9]\{2\}::g') command="apt-get purge " for version in $(dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sed 's/\...$//g' | grep -v '\...$'| sort -u | head -n -${n}) do command=${command}"^linux-image-${version}${suffix} " done $command

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

# ./keep-n-kernels.sh 4 # launch the apt-get command to remove all but the 4 most recent kernels

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

0
ответ дан 29 May 2018 в 12:42
  • 1
    Он удаляет все ядра, если вы запустите ./keep-n-kernels.sh 0. Обнаружение строки суффикса не работает; Я думаю, что суффикс = $ (uname -r | sed -r 's / ^ [0-9.] * (- [0-9.] +) * //') или суффикс = $ (uname -r | egrep - -only-matching - '- [[: alpha:] -] + $'). – jarno 2 January 2015 в 22:57
  • 2
    Но я думаю, что идея хорошая. Я работаю над улучшением сценария, и, возможно, я отправлю его здесь когда-нибудь, когда думаю, что он достаточно готов. – jarno 5 January 2015 в 01:07
  • 3
    Пожалуйста, поделитесь, @jarno. Рад узнать, что идея кажется полезной. – Sankalp 6 January 2015 в 22:41
  • 4
    Хорошо, вот оно: link – jarno 8 January 2015 в 18:38

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

0
ответ дан 29 May 2018 в 12:42

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

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

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

0
ответ дан 29 May 2018 в 12:42

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

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

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)+
0
ответ дан 29 May 2018 в 12:42

Другие вопросы по тегам:

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