Я видел много тем о том, как освободить место в разделе / boot, и это тоже моя цель. Однако меня интересует только удаление старых ядер и не каждого из них, а текущего.
Мне нужно, чтобы решение было однострочным, так как я буду запускать сценарий из Puppet, и я не хочу, чтобы в нем были дополнительные файлы. До сих пор я получил следующее:
dpkg -l linux-* | awk '/^ii/{print $2}' | egrep [0-9] | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | xargs sudo apt-get -y purge
Если быть более точным, то, что он делает в данный момент, это следующее:
- Перечислите все пакеты linux- * и напечатайте их имена.
- Перечислите только те, которые имеют номера, и сортируйте их, возвращая обратный результат. Таким образом, более старые ядра перечислены последними.
- Печатать только результаты, которые идут после текущего ядра
- Поскольку есть некоторые результаты linux- {image, headers}, убедитесь, что я не буду очищать что-либо, связанное с моим текущим ядром
- Позвоните, чтобы очистить
Это работает, но я уверен, что решение может быть более элегантным и безопасным для производственной среды, так как по крайней мере 20 наших серверов работают под управлением Ubuntu.
Спасибо за ваше время, Алехандро.
kernel
bash
boot-partition
Alejandro
источник
источник
Ответы:
Выглядит достаточно красиво, всего несколько комментариев. Два первых комментария делают команду более безопасной, а третий и четвертый делают ее немного короче. Не стесняйтесь следовать или игнорировать любой из них. Хотя я настоятельно советую следовать первым двум. Вы хотите убедиться, что это максимально безопасно. Я имею в виду серьезно. Вы добавляете
sudo apt-get -y purge
в какой-то автоматически сгенерированный список пакетов. Это так зло ! :)Если вы перечислите все,
linux-*
вы получите много ложных срабатываний, например (пример из моего вывода)linux-sound-base
. Хотя они могут быть отфильтрованы позже остальной вашей командой, я бы лично чувствовал себя безопаснее, не перечисляя их в первую очередь. Лучше контролировать, какие пакеты вы хотите удалить. Не делайте вещи, которые могут иметь неожиданные результаты. Так что я бы начал сНа мой взгляд, ваше регулярное выражение "перечислять только те, у которых есть цифры", слишком простое. Например, есть пакет,
linux-libc-dev:amd64
когда вы работаете в 64-битной системе. Ваше регулярное выражение будет соответствовать. Вы не хотите, чтобы это соответствовало. Правда, если вы следовали моему первому совету, тоlinux-libc-dev:amd64
все равно не попадут в список, но все же. Мы знаем больше о структуре номера версии, чем простой факт «есть число». Кроме того, как правило, рекомендуется заключать в кавычки регулярные выражения, просто чтобы предотвратить возможные неверные интерпретации оболочкой. Так что я бы сделал эту команду egrepТогда есть эта вещь сортировки. Почему вы сортируете? Так как вы собираетесь удалить все ядра (кроме текущего) в любом случае, важно ли удалять старые, прежде чем новые? Я не думаю, что это имеет значение. Или вы делаете это только для того, чтобы затем использовать
sed
«Печать только результатов, которые идут после текущего ядра»? Но ИМО это кажется слишком сложным. Почему бы просто не отфильтровать результаты, соответствующие вашему текущему ядру, как вы уже делаете с этимgrep -v
, и все будет готово? Честно говоря, если я возьму первую часть вашей команды (с учетом двух моих предыдущих советов), на моей машине я получуУбирая сортировку / сборку, я получаю
Таким образом, ваша более сложная команда фактически пропустит два пакета на моей машине, которые я хотел бы удалить (теперь возможно, что эти
linux-image-extra-*
вещи зависят от этихlinux-image-*
вещей и, следовательно, будут удалены в любом случае, но это не помешает сделать это явным). Во всяком случае, я не вижу смысла в вашей сортировке; простая,grep -v
без излишней предварительной обработки должна быть в порядке, по-видимому, даже лучше. Я сторонник принципа KISS. Это облегчит вам понимание или отладку позже. Кроме того, без сортировки это немного более эффективно;)Это чисто эстетично, но вы получите тот же результат с этим немного более коротким вариантом. :-)
Следовательно, я получаю более простую и безопасную команду
Поскольку вы на самом деле хотите очистить свой
/boot
раздел, совершенно другой подход заключается в том, чтобы перечислить содержимое/boot
, использоватьdpkg -S
для определения пакетов, к которым принадлежат отдельные файлы, отфильтровать те, которые принадлежат текущему ядру, и удалить полученные пакеты. Но мне больше нравится ваш подход, потому что он также найдет устаревшие пакеты, такие какlinux-headers-*
, которые не устанавливаются/boot
, а в/usr/src
.источник
uname -r
. Для меня это работает нормально. Было бы интересно узнать, почему это не работает в вашем случае.uname -r
производит4.8.0-36-generic
, который не может исключитьlinux-headers-4.8.0-36
из списка.Я написал этот скрипт, который удаляет пакеты "linux- *", которые имеют меньшую версию, чем загруженная в данный момент. Я думаю, что нет необходимости проверять состояние пакета. Команда запрашивает подтверждение перед очисткой пакетов. Если вы не хотите этого, добавьте опцию -y в команду apt-get.
Однако, чтобы иметь возможность оставлять настраиваемое количество запасных ядер, я рекомендую использовать мой
linux-purge
скрипт с--keep
опцией. Смотрите здесь для получения дополнительной информации о сценарии.источник
TL; DR: пропустить на дно.
Это немного дольше, хотя. Я сломаю это для вас:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
Так же, как предложил Малте. Перечисляет соответствующие файлы ядра.egrep '[0-9]+\.[0-9]+\.[0-9]+'
Малте также предложил в качестве более безопасного способа выбрать только файлы ядра путем поиска номера версии.Поскольку теперь мы, возможно, перечисляем как пакеты изображений, так и пакеты заголовков, имена пакетов могут различаться, поэтому у нас есть этот обходной путь awk, необходимый для сортировки.
awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
В результате получается новый столбец с номером версии перед именем исходного пакета, как показано ниже:Теперь мы должны отсортировать список, чтобы предотвратить удаление более новых образов, чем тот, который запущен в данный момент.
sort -k1,1 --version-sort -r
давая нам это:Теперь удалите текущие и более новые файлы ядра,
sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
давая нам это:Теперь удалите первый столбец, который мы добавили,
awk '{print $2}'
чтобы получить именно то, что мы хотим:Теперь мы можем передать это менеджеру пакетов, чтобы автоматически удалить все и перенастроить grub:
Я рекомендую сначала выполнить пробный прогон (хотя для ваших сценариев это может быть непрактично, если у вас большая среда)
Теперь, если все выглядит хорошо, продолжайте и удалите его:
Еще раз, весь смысл этого «однострочного» заключается в том, чтобы удалить только те ядра, которые были старше, чем работающее в настоящее время ядро (что оставляет все новые установленные ядра доступными).
Спасибо, дайте мне знать, как это работает для вас, и если вы могли бы улучшить его!
источник
Вы можете просто перечислить каталог / boot, чтобы увидеть имеющиеся у вас версии ядра, используя команду 'ls'. Затем используйте 'sudo apt-get -y purge "xxx", где "xxx" заменяется номером версии, которую вы хотите удалить. Позаботьтесь, чтобы это была не та версия, которую вы сейчас используете !!
источник
Установите
bikeshed
(apt install bikeshed
) и вызовитеpurge-old-kernels
как root.источник
Быстрый ответ, объяснение по запросу:
источник
sed '$d'
команде. Сценарий не удаляет пакеты заголовков linux или другие пакеты, связанные с удаляемыми пакетами ядра, кроме того, он не удаляет файлы конфигурации пакетов. Я бы рекомендовал вместо этого использовать мой ответ.echo
)apt-get
команду, которую вы можете запустить.Я действительно устал от всей этой ненужной сложности и создал пакет Python, который делает тривиальную строку:
Установите его с
Смотрите больше на https://github.com/mrts/ubuntu-old-kernel-cleanup .
Надеюсь, что это помогает другим.
источник
sudo pip install ...
как описано выше?sudo
на самом деле важно, иначеpip
установит его в какой-то пользовательский каталог, и оболочка может не искать в этом каталоге исполняемые файлы.Работает все время, и даже Ubuntu 17.10
источник
linux-libc-dev:amd64
, что нежелательно.