Как удалить старые версии ядра для очистки меню загрузки?
Каждый раз, когда я устанавливаю новое ядро Linux, оно остается в файле grub_config, делая загрузочное меню дольше.
Я знаю, что могу вручную искать установленные пакеты и удалять их.
Поддерживает ли Ubuntu более простой способ их очистки или не показывать в списке загрузки?
30 ответов
16.04 и более поздние версии Ubuntu
sudo apt autoremove
Эта команда удаляет пакеты, которые были автоматически установлены для разрешения зависимостей, но теперь больше не зависят от них. Это включает в себя старые версии linux-headers-*
и linux-image-*
. (Itâ € ™ s также умный об этом процессе, оставляя одну запасную версию ядра вокруг как резерв!)
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 | grep 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
ищет установленные изображения linux -
awk '{ print $2 }'
просто выводит второй столбец (который является именем пакета) -
sort -V
помещает элементы в порядок по номеру версии -
sed -n '/'`uname -r`'/q;p'
печатает строки перед текущим ядром -
xargs sudo apt-get -y purge
очищает найденные ядра
Отмена вызова sed
:
-
-n
говоритsed
, чтобы быть спокойным -
`uname -r`
выводит текущую установленную версию ядра - мы включаем ее в backticks, чтобы выход включался как часть команды (вы также можете увидеть это как$(uname -r)
-
/something/q
говорит о прекращении, когда вы сопоставляете «что-то» (в этом случае что-то выводится изuname -r
) - окружение/
регулярное выражение -
p
напечатан -
;
- команда separtor, поэтому/something/q;p
говорит, что выходите, когда вы что-то сопоставляете, иначе печатайте
, sed -n '/'`uname -r`'/q;p'
печатает строки до тех пор, пока они не совпадут с текущим именем ядра.
Если вы параноик (как и я), вы можете сделать последнюю часть xargs echo sudo apt-get -y purge
, чтобы напечатать команду для очистки старых ядер, затем вы можете убедитесь, что перед запуском ничего неожиданно не было.
Измененная версия для удаления заголовков:
dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
Примечание: вызов sed
изменен. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"
извлекает только версию (например, «3.2.0-44»), без «-генерического» или подобного из uname -r
Версия «все-в-одном» для удаления изображений и заголовков (объединяет две версии выше):
echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge
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 будет доступен в разделе Applications> Системные инструменты.
Удалить старые записи ядра
-
Выберите «Очиститель пакетов» слева и «Очистить ядро» с правой панели.
-
Нажмите кнопку «Разблокировать» в правом нижнем углу, введите свой пароль.
-
Выберите из отображаемого списка изображения и заголовки ядра, которые вы хотите удалить. Используемое ядро не указано.
-
Нажмите кнопку «Очистка» в правом нижнем углу, чтобы удалить выбранные изображения и заголовки ядра.
Удалить операционные системы из меню Grub
-
Другие операционные системы, которые были удалены с компьютера, также будут удалены из меню, как только «update-grub» будет запущен как root.
-
Элементы меню помещаются в меню Grub2 с помощью скриптов. Если вы не хотите вводить другие операционные системы в меню, отключите /etc/grub.d/30_osprober
-
Запустите эту команду, чтобы остановить запуск сценария
sudo chmod -x /etc/grub.d/30_os-prober
-
DISABLE_30_OS-PROBER = 'true' в /etc /default /grub
Удалить Memtest86 + из меню Grub sudo chmod -x /etc/grub.d/20_memtest86+
- Запустите команду update-grub, чтобы включить изменения в grub.cfg
startupmanager Вы можете найти его в разделе System>> Администрирование>>>
На втором снимке экрана вы можете выбрать, сколько ядер показать? Обычно я просто держу его 1, но когда я получаю обновление ядра, я всегда меняю его на 2 перед перезагрузкой, поэтому я могу выбрать более старое ядро, если у нового ядра возникают проблемы с моим оборудованием. Как только я знаю, что новое ядро работает хорошо, я меняю его на 1.
Чистая командная строка, это приведет к удалению всех, кроме текущего и второго самых текущих (через «-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
Обновление: purge-old-kernels
- устарел в настоящее время.
Я сделал сценарий для очистки ядер даже в сложных условиях. Он называется linux-purge
, и вы можете найти его здесь .
Если вы просто хотите очистить ядра (и связанные пакеты), которые старше, чем текущее ядро, когда система не сломана, вы можете использовать этот сценарий .
Также есть страница документации Ubuntu, которую я внес в отношении удаления старых ядер здесь .
Вы можете следить за с помощью секции пакета «без присмотра обновлений» Автоматические обновления безопасности в статье об 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
, который будет проверять любые неиспользованные пакеты и удалять их, если необходимо. Это отлично подходит для тех библиотек и пакетов зависимостей, которые больше не нужны ни одному из установленных приложений.
10.04 GUI-метод
Computer Janitor может очищать старые ядра, и я полагаю, что установлен по умолчанию в Ubuntu (но не в Kubuntu).
GRUB 1, если вы используете это, имеет опцию в /boot/grub/menu.lst
, чтобы указать, сколько ядер он должен показывать максимум. GRUB 2, насколько я могу судить, не делает.
Чтобы выяснить, какие ядра и заголовки установлены, используйте
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
Чтобы удалить старые ядра изображений Linux, сначала загрузитесь в ядро, которое вы хотите сохранить.
Вы также можете проверить версию ядра с помощью команды uname -r
, чтобы вы не удалили ошибку по ошибке.
Теперь перейдите в диспетчер синаптических пакетов и найдите linux-image
и удалите старые версии, кроме тех, которые показаны верхней командой. Обычно я предпочитаю идти с последним.
Теперь при перезапуске вы увидите более чистое меню grub.
Вы можете установить ubuntu-tweak , а затем перейдите к Applications -> Системный инструмент -> ubuntu tweak и
нажмите очиститель пакетов и очистите ядра. он не показывает текущее ядро, поэтому вы всегда будете в безопасности.
Лично мне нравится использовать Synaptic
. Это заставляет меня чувствовать себя более уверенно в том, что происходит. Единственное приложение, которое я использовал, которое имеет возможность удалить старые ядра, - Ubuntu Tweak .
Как удалить ядра, которые вы не используете:
- Открыть UbuntuTweak
- Нажмите «Очистка пакетов» в разделе «Приложения» в левой панели.
- В правой части «очистки» нажмите «Очистить ядра»
- Выберите все ядра - я думаю, что тот, который используется, не указан, но на всякий случай проверьте запуск
uname -a
в терминале
Вы можете удалить старые ядра (linux-image-...
) с помощью Synaptic и удалить их из меню загрузки. Будьте осторожны, чтобы не удалить запущенное ядро (вы можете проверить его версию с помощью uname -r
).
Имейте в виду, что наличие одной или двух старых версий может помочь вам устранить неполадки, если что-то пойдет не так.
В качестве альтернативы вы можете редактировать /удалять записи вручную (gksu gedit /boot/grub/grub.cfg
), но они будут сгенерированы при обновлении до более нового ядра.
Если вы думаете об удалении параметров recovery mode
- не надо. Они могут пригодиться, если вы сломаете что-то, что мешает вам загружаться.
Обратитесь к этой странице .
Это чистое решение командной строки.
Сначала создайте список всех установленных версий ядра, кроме текущего ядра:
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 $(
...)
Преимущество этого ответа - родной 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-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 --purge $(aptitude search ?obsolete)
Однако это пропустит пакеты, которые по-прежнему рекомендуются другими пакетами, а аргумент -R /- without-рекомендует не разрешать эту проблему.
dselect после переключения режима сортировки с 'o' покажет все устаревшие пакеты, включая пропуски aptitude, но некоторые люди не любят его использовать.
Принятый ответ с использованием 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
Если у вас есть версия, более новая, чем текущая, это даст вам предупреждение о перезагрузке компьютера в первую очередь. Также обратите внимание, что старые ядра сохраняются по уважительной причине: если вы каким-то образом испортили свое текущее ядро, что делает вашу систему неустойчивой, тогда вы сможете загрузиться в любое более раннее ядро.
ailurus имеет функцию удаления старых ядер, а также неиспользуемых конфигураций. Я лично удаляю его вручную из синаптики. Вы можете установить ailurus из getdeb , а также ppa
Вы можете использовать ukuu - это все GUI - обновить и удалить старые ядра. Работает для меня!
Просто помните, что последние 2 установлены и, очевидно, «запущенное» ядро.
Вы также можете установить ukuu для отображения только выпусков основной линии, даже ядер RC, скрыть выпуски точек.
Вы можете найти ukuu в Synaptic или инструкции здесь:
вот грубая схема того, что я сделал, осторожно, поскольку я не эксперт в 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 и т. Д.
Надеюсь, что кто-то найдет это полезным, поскольку мне потребовалось некоторое время, чтобы разобраться ... не видел этого решения нигде ...
Установите менеджер синаптических пакетов и перейдите на вкладку фильтров (я думаю, фильтры, если не попробовать все 5) и выберите «local». Это покажет вам сиротские пакеты в вашей системе, такие как ядра. После их удаления запустите update-grub
. Эта команда обновляет список параметров загрузки для grub.
Если это не удается, вы всегда можете попробовать apt-get remove linux-image-version-generic
.
Основываясь на предыдущем ответе Дэвида Кемпа, следующий скрипт очистит все заголовки и изображения, за исключением версий last 2 .
#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)
SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)
# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
if [ -n "$SECONDTOLASTVER" ]; then
echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
fi
}
echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get -y purge
Следующая строка команд очистит все установленные ядра 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
Чтобы немного контролировать, какие версии сохранить, явным образом выберите те, которые вы хотите удалить. Например, если вы хотите удалить версии ядра 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
Отрегулируйте список версий ядра для соответствия.
Попробуйте это. Запустите его как root.
Сохраните этот скрипт как, скажем ./keep-n-kernels.sh
Передайте в качестве аргумента командной строки количество последних ядер, которые вы хотите сохранить.
#! /Bin /Баш # передать n в качестве аргумента командной строки, и он найдет все установленные # ядра и сохранить только n самых последних => удалите все старые # dpkg -l 'linux- *' | sed '/^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([^ 0-9] \ + \) /\ 1 /")" '/d; s /^ [^] * [^] * \ ([^] * \). * /\ 1 /; /[0-9] /! d ' # эта команда дает список всех пакетов EXCEPT для последнего ядра. # source: https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels п = $ 1 # найти установленные версии ядра: # dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sort -n # дает номера версий, по одному в каждой строке # dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$//g' | grep -v '\ ... $' | sort -u # дает только те, которые появляются в linux-image # суффикс, например. -генерический-пай # тип ядра, загружаемого в suffix = $ (uname -r | sed 's: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g') command = "apt-get purge" для версии в $ (dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$//g' | grep -v ' \ ... $ '| sort -u | head -n - $ {n}) делать command = $ {command} "^ linux-image - $ {version} $ {suffix}" сделанный $ команда
Использование образца:
# ./keep-n-kernels.sh 4 # запустите команду apt-get, чтобы удалить все, кроме 4 последних ядер
Если вы хотите [И НА СВОЙ СОБСТВЕННЫЙ РИСК], вы можете добавить a -y (или флаг силы) в команду apt-get и сделать его неинтерактивным.
Я использую рабочий стол KDE, и самый простой вариант, который я нашел, - это использовать приложение kde-config-grub2, как предлагается здесь: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux -versions (который я уже установил для настройки фоновое изображение, опция загрузки по умолчанию и т. п.). Рядом с раскрывающимся списком, в котором вы можете выбрать запись по умолчанию, есть кнопка «Удалить старые записи». Нажав эту кнопку, вы увидите список всех установленных ядер, и вы можете выбрать, какие из них нужно удалить. Когда вы применяете изменения, он будет использовать dpkg, чтобы фактически удалить их из системы, а также меню GRUB.
Чтобы прослушивать, вы также можете выпустить
apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}
как root, и задание будет выполнено.
У меня есть сценарий для этого, который не требует очень сильного анализа строк.
Удалить заголовки и изображения, кроме текущего, чтобы освободить пространство
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)+