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

664

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

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

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

    
задан Hans 22.01.2016 в 16:20
источник

37 ответов

572

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

sudo apt autoremove

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

uname-r

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

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

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

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

    
ответ дан fossfreedom 08.05.2018 в 18:09
источник
367

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

uname -r 

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

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

dpkg --list | grep linux-image 

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

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

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

sudo update-grub2 

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

    
ответ дан penreturns 11.07.2018 в 10:33
263

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

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

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

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

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

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

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

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

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

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

Примечание: вызов sed изменен. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)//")" извлекает только версию (например, «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]\+\)//")"'/q;p') | xargs sudo apt-get -y purge
    
ответ дан David Kemp 21.07.2015 в 08:27
55

Ubuntu 16.04 +:

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

Ubuntu 15.10 и ниже:

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

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

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

sudo purge-old-kernels --keep 3
    
ответ дан bmaupin 21.05.2017 в 20:34
42

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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

для GRUB не GRUB2

startupmanager

Вы можете найти его в разделе System > > Администрирование > > >

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

    
ответ дан karthick87 11.03.2017 в 19:59
39

Чистая командная строка, это приведет к удалению всех, кроме текущего и второго самых текущих (через «-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
    
ответ дан Kees Cook 08.05.2015 в 19:01
34

Обновление: purge-old-kernels теперь устарело .

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

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

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

    
ответ дан jarno 19.11.2017 в 16:00
29

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

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

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

с

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

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

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

"^linux-image.*"; 

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

    
ответ дан Qwerty 01.03.2013 в 13:44
27

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

sudo apt-get autoclean

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

sudo apt-get clean

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

sudo apt-get autoremove

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

    
ответ дан Luis Alvarado 22.08.2017 в 21:44
25

10.04 GUI-метод

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

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

    
ответ дан maco 26.03.2012 в 10:58
23

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

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

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

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

Ссылка

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

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'|grep -E "(image|headers)" | xargs sudo apt-get purge
    
ответ дан mikewhatever 24.04.2018 в 22:59
16

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

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

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

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

    
ответ дан anurag-jain 03.03.2011 в 14:10
14

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

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

    
ответ дан Lincity 03.03.2011 в 14:26
8

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

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

  • Открыть UbuntuTweak
  • Нажмите «Очистка пакетов» в разделе «Приложения» в левой панели.
  • В правой части «очистки» нажмите «Очистить ядра»
  • Выберите все ядра - я думаю, что тот, который используется, не указан, но на всякий случай проверяет запуск uname -a в терминале
ответ дан Alan Featherston 08.04.2013 в 02:24
6

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

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

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

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

    
ответ дан evgeny 13.04.2017 в 14:14
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 16.05.2015 в 18:18
3

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

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

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

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

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

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

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

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

Код

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

#!/bin/bash

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

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

# NOTE: Will not delete current kernel.

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

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

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

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

current_version=$(uname -r)

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

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

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

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

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

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

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

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

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

done

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

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

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

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

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

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

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

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

    sudo apt install dialog

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

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

rm-kernels-serverbashcode

#!/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 29.07.2017 в 00:35
2

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

dpkg --purge $(aptitude search ?obsolete)

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

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

    
ответ дан Chris Cheney 06.04.2013 в 05:03
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

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

    
ответ дан heemayl 17.04.2015 в 21:21
1

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

    
ответ дан sagarchalise 17.09.2010 в 12:53
1

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

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

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

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

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

    
ответ дан sprocketoctopus 07.09.2017 в 12:39
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 и т. Д.

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

    
ответ дан Joe 09.01.2012 в 00:31
0

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

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

    
ответ дан Relish 29.05.2013 в 18:41
0

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

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

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*//' | 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
    
ответ дан Mark 12.06.2013 в 20:42
0

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

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

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

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

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

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

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -vf /root/bootedkernels | grep -v 'dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1' | grep -v 'uname -r' | xargs apt-get -y purge
    
ответ дан Alexander Thompson 30.06.2013 в 20:37
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 08.11.2013 в 13:51
0

Попробуйте это. Запустите его как 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]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[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 и сделать его неинтерактивным.

    
ответ дан Sankalp 28.01.2014 в 21:47
0

Я использую рабочий стол KDE, и самый простой вариант, который я нашел, - это использовать приложение kde-config-grub2, как предлагается здесь: Ссылка (которую я уже установил для установки фонового изображения, опции загрузки по умолчанию и т. п.). Рядом с раскрывающимся списком, в котором вы можете выбрать запись по умолчанию, есть кнопка «Удалить старые записи». Нажав эту кнопку, вы увидите список всех установленных ядер, и вы можете выбрать, какие из них нужно удалить. Когда вы применяете изменения, он будет использовать dpkg, чтобы фактически удалить их из системы, а также меню GRUB.

    
ответ дан Ben 06.07.2014 в 19:44
0

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

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

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

    
ответ дан Severo Raz 27.11.2014 в 03:26
0

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

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

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+
    
ответ дан Paulo Santos 16.05.2015 в 11:40