Как удалить старые версии ядра, чтобы очистить меню загрузки?
Каждый раз, когда я устанавливаю новое ядро Linux, оно остается в grub_config, каждый раз делая меню загрузки длиннее.
Я знаю, что могу вручную искать установленные пакеты и удалять их.
Предоставляет ли Ubuntu какой-либо более простой способ очистить их или не показывать в списке загрузки?
40 ответов
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
Результат будет похож на:
Запомните результат и номер - убедитесь, что вы не удалили соответствующее изображение или заголовок.
Рекомендация
Моя рекомендация - оставить как минимум два или предпочтительно три ядра, включая самое последнее. Причиной рекомендации является то, что у вас будет по крайней мере одно / два других ядра для загрузки, если по какой-либо причине последнее ядро вы не можете загрузить или вводите регрессивную возможность, такую как неисправное беспроводное соединение.
Сначала перезагрузите систему, чтобы убедиться, что она использует новейшее ядро. Затем откройте терминал и проверьте ваше текущее ядро:
uname -r
НЕ УДАЛЯЙТЕ ЭТОГО ЯДРА!
Затем введите команду ниже, чтобы просмотреть / просмотреть все установленные ядра в вашей системе.
dpkg --list 'linux-image-*'
Найдите все ядра, которые ниже вашего текущего ядра. Когда вы знаете, какое ядро удалить, продолжайте ниже, чтобы удалить его. Запустите команды ниже, чтобы удалить ядро, которое вы выбрали.
sudo apt-get purge linux-image-x.x.x-x-generic
Наконец, выполните команды ниже, чтобы обновить grub2
sudo update-grub2
Перезагрузите вашу систему.
Мой однострочник для удаления старых ядер (это также освобождает место на диске)
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
ищет установленные образы Linuxawk '{ 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
это печать;
это разделитель команды, так/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
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
Удаление записей из 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+ из меню Grubsudo chmod -x /etc/grub.d/20_memtest86+
- Запустите команду update-grub, чтобы изменения могли быть включены в grub.cfg
Примечание. После обновления ядра в меню GRUB добавляется новая запись. Вы можете удалить более старую, если хотите. Однако большинство опытных пользователей посоветуют вам сохранить хотя бы одну запасную запись на случай, если что-то пойдет не так с обновлением, и вы для устранения неполадок необходимо загрузить более старую версию ядра.
Альтернативный способ удаления записей ядра (до 10.04)
для GRUB не GRUB2
startupmanager
Вы можете найти его в разделе Система >> Администрирование >>
Вы видите на втором скриншоте, вы можете выбрать, сколько ядер показать? Обычно я просто держу его на 1, но когда я получаю обновление ядра, я всегда изменяю его на 2 перед перезапуском, чтобы я мог выбрать старое ядро, если у нового ядра проблемы с моим оборудованием. Как только я знаю, что новое ядро работает хорошо, я изменяю его обратно на 1.
Чисто в командной строке это удалит все, кроме текущего и второго самого текущего (через "-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
Обновить: purge-old-kernels
устарела в настоящее время.
Я сделал скрипт для очистки ядер даже в сложных условиях. Это называется linux-purge
и вы можете найти это здесь.
Если вы просто хотите очистить ядра (и связанные пакеты), которые старше, чем используемое в настоящее время ядро, когда система не сломана, вы можете использовать этот скрипт.
Здесь также есть страница документации по Ubuntu, в которой я участвовал относительно удаления старых ядер.
Вы можете следовать разделу Использование пакета "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.
Самый быстрый / простой способ (применим как минимум с 12.04), который уже имеется в Ubuntu: apt-get
, Выполните следующие действия, если хотите удалить все старые версии ядра, которые не используются (за исключением предыдущей версии, которую вы не используете. Это делается для того, чтобы убедиться, что если текущая версия ядра каким-либо образом дает сбой, у вас есть возможность пойти вернуться в предыдущее состояние). Сделайте следующее:
sudo apt-get autoclean
Это исключит любые старые файлы (включая версии ядра), которые у вас могут быть. Обратите внимание, что если у вас много старых версий, это займет некоторое время, поскольку необходимо убедиться, что удаление версии ядра не имеет проблем. Для меня удаление последних 12 версий ядра заняло около 2 минут. Вы также можете сделать следующее:
sudo apt-get clean
Который устранит все загруженное и хранящееся в папке кеша apt. Наконец у вас есть:
sudo apt-get autoremove
который будет проверять наличие любых неиспользуемых пакетов и удалять их при необходимости. Это отлично подходит для тех библиотек и пакетов зависимостей, которые больше не нужны ни одному приложению.
Чтобы выяснить, какие ядра и заголовки установлены, используйте
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|headersmodules)" | xargs sudo apt-get -y purge
Вот что происходит при запуске 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
10.04 GUI Метод
Компьютер Janitor может очищать старые ядра, и я считаю, что по умолчанию установлен в Ubuntu (но не Kubuntu).
GRUB 1, если вы используете это, имеет опцию в /boot/grub/menu.lst
указать, сколько ядер должно показываться на максимуме. GRUB 2, насколько я могу судить, не делает.
Чтобы удалить старые образы ядра Linux, сначала загрузитесь в ядре, которое вы хотите сохранить.
Вы также можете проверить версию ядра, используя команду uname -r
чтобы вы не удалили неправильный по ошибке.
Теперь перейдите в менеджер пакетов synaptic и найдите linux-image
и удалите более старые версии, кроме той, которая показана верхней командой. Вообще я предпочитаю идти с последним.
Теперь при перезагрузке вы увидите более чистое меню grub.
Вы можете установить Ubuntu-Tweak, а затем перейдите в Приложения -> Системный инструмент -> Ubuntu Tweak и
нажмите очиститель пакетов и очистите ядра. оно не показывает используемое в настоящее время ядро, поэтому вы всегда будете в безопасности.
Лично мне нравится использовать Synaptic
, Это заставляет меня чувствовать себя более уверенно в том, что происходит. Единственное приложение, которое я использовал, имеет возможность удалять старые ядра, это Ubuntu Tweak.
Как удалить ядра, которые вы не используете:
- Откройте UbuntuTweak
- Нажмите "Очиститель пакетов" в разделе "Приложения" на левой панели.
- В правой части окна "Очистка" нажмите "Очистить ядра".
- Выбрать все ядра - я думаю, что используемого в списке нет, но на всякий случай проверка работает
uname -a
в терминале
Вы можете удалить старые ядра (linux-image-...
пакеты), используя Synaptic, и это удалит их из меню загрузки. Будьте осторожны, чтобы не удалить работающее ядро (вы можете проверить его версию с uname -r
).
Имейте в виду, что наличие одной или двух старых версий может помочь вам устранить неполадки, если что-то пойдет не так.
Кроме того, вы можете редактировать / удалять записи вручную (gksu gedit /boot/grub/grub.cfg
), но они будут сгенерированы заново при обновлении до более нового ядра. Если вы думаете об удалении recovery mode
варианты - нет. Они могут пригодиться, если вы сломаете что-то, что мешает вам загрузиться.
Обратитесь к этой странице.
Преимущество этого ответа в том, что нативный 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
версия сервера для выборочного удаления всех ядер одновременно Вместо графического диалогового окна с графическим интерфейсом используется текстовое диалоговое окно для выбора очищаемых ядер.
Перед запуском скрипта необходимо установить функцию диалога, используя:
sudo apt install dialog
Диалог находится в стандартной установке Ubuntu Desktop, но не в Ubuntu Server.
Образец экрана
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
передать любой параметр в скрипт.
Сумма всех размеров ядра (за исключением текущей работающей версии, которую нельзя удалить) теперь отображается в строке заголовка.
Диалоговое окно, используемое для отображения даты последнего доступа каждого ядра. Эта дата может быть перезаписана для всех ядер во время резервного копирования или аналогичных операций. Теперь в диалоговом окне отображается Дата изменения.
Это чисто решение командной строки.
Сначала создайте список всех установленных версий ядра, кроме работающего в данный момент ядра:
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 $(
...)
У меня есть скрипт для этого, который не требует очень сложного анализа строк.
Удалите заголовки и изображения, кроме текущего, чтобы освободить место
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)+
Принятый ответ с помощью 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
Если у вас установлена более новая версия, чем текущая, это предупредит вас о перезагрузке компьютера. Также обратите внимание, что старые ядра сохраняются по уважительной причине: если вы каким-то образом испортите свое текущее ядро, сделав вашу систему нестабильной, вы сможете загрузить любое старое ядро.
Простой способ избавиться почти от всех устаревших пакетов, пакетов, которых больше нет в списке пакетов, а также от устаревших ядер, - это выполнить одно из следующих действий:
dpkg --purge $(aptitude search ?obsolete)
Однако при этом будут пропущены пакеты, которые по-прежнему рекомендуются другими пакетами, а аргумент -R/- без-рекомендует рекомендует не решает эту проблему.
dselect после переключения режима сортировки с помощью 'o' покажет все устаревшие пакеты, включая пропущенные aptitude, но некоторые люди не любят его использовать.
Вы можете использовать ukuu - это все GUI - для обновления и удаления старых ядер. Работает для меня!
Просто не забудьте оставить последние 2 установленными и, очевидно, "работающее" ядро.
Вы также можете настроить ukuu для отображения только основных выпусков, даже ядер RC, выпусков скрытых точек.
Вы можете найти уку в Synaptic, или инструкции здесь:
Основываясь на предыдущем ответе Дэвида Кемпа, следующий скрипт очистит все заголовки и изображения, кроме последних 2 версий.
#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)
SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)
# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
if [ -n "$SECONDTOLASTVER" ]; then
echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
fi
}
echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get -y purge
Просто чтобы вмешаться, вы также можете выдать
apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}
как корень, и работа будет выполнена.
Попробуй это. Запустите его как 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 и сделать ее неинтерактивной.
В следующий раз при удалении старых ядер откройте Терминал и используйте эту команду:
sudo apt-get autoremove linux-headers-2.6.38-10-generic
Вы можете использовать Synaptic, чтобы получить точное имя ядра, которое вы намереваетесь удалить. Просто откройте Synaptic и найдите "linux-headers", а затем выберите, какую запись ядра вы хотите удалить. Соответствующая запись будет помечена как "-generic" в конце.
Чтобы убрать все неиспользованные (оставшиеся) зависимости в системе, используйте эту команду отдельно:
sudo apt-get autoremove
Вот примерный план того, что я сделал, осторожно, поскольку я не являюсь экспертом в 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.2.0.[49-53], используйте простое for
цикл:
for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done
Настройте список версий ядра, чтобы соответствовать.
Я использую рабочий стол KDE, и самым простым вариантом, который я нашел, было использование приложения kde-config-grub2, как было предложено здесь: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (который я уже установил для установки фонового изображения, параметров загрузки по умолчанию и т. п.). Рядом с раскрывающимся списком, в котором вы можете выбрать запись по умолчанию, есть кнопка "Удалить старые записи". Нажав на эту кнопку, вы увидите список всех установленных ядер и сможете выбрать, какие из них удалить. Когда вы применяете изменения, он будет использовать dpkg для фактического удаления их из системы, а также из меню GRUB.
Установите менеджер пакетов synaptic и перейдите на вкладку фильтров (я думаю, фильтры, если не попробовать все 5) и выберите "локальный". Это покажет вам потерянные пакеты в вашей системе, такие как ядра. После их удаления запустите update-grub
, Эта команда обновляет список параметров загрузки для grub.
Если это не удается, вы всегда можете попробовать apt-get remove linux-image-version-generic
,