Как освободить больше места в /boot?

Вопрос или проблема

Мой /boot раздел почти заполнен, и я получаю предупреждение каждый раз, когда перезагружаю систему. Я уже удалил старые пакеты ядра (linux-headers…), на самом деле я сделал это для установки новой версии ядра, которая появилась с автоматическими обновлениями.

После установки этой новой версии раздел снова почти полон. Что еще я могу удалить? Есть ли какие-то другие файлы, связанные со старыми образами ядра?

Вот список файлов на моем /boot разделе:

:~$ ls /boot/
abi-2.6.31-21-generic         lost+found
abi-2.6.32-25-generic         memtest86+.bin
abi-2.6.38-10-generic         memtest86+_multiboot.bin
abi-2.6.38-11-generic         System.map-2.6.31-21-generic
abi-2.6.38-12-generic         System.map-2.6.32-25-generic
abi-2.6.38-8-generic          System.map-2.6.38-10-generic
abi-3.0.0-12-generic          System.map-2.6.38-11-generic
abi-3.0.0-13-generic          System.map-2.6.38-12-generic
abi-3.0.0-14-generic          System.map-2.6.38-8-generic
boot                          System.map-3.0.0-12-generic
config-2.6.31-21-generic      System.map-3.0.0-13-generic
config-2.6.32-25-generic      System.map-3.0.0-14-generic
config-2.6.38-10-generic      vmcoreinfo-2.6.31-21-generic
config-2.6.38-11-generic      vmcoreinfo-2.6.32-25-generic
config-2.6.38-12-generic      vmcoreinfo-2.6.38-10-generic
config-2.6.38-8-generic       vmcoreinfo-2.6.38-11-generic
config-3.0.0-12-generic       vmcoreinfo-2.6.38-12-generic
config-3.0.0-13-generic       vmcoreinfo-2.6.38-8-generic
config-3.0.0-14-generic       vmcoreinfo-3.0.0-12-generic
extlinux                      vmcoreinfo-3.0.0-13-generic
grub                          vmcoreinfo-3.0.0-14-generic
initrd.img-2.6.31-21-generic  vmlinuz-2.6.31-21-generic
initrd.img-2.6.32-25-generic  vmlinuz-2.6.32-25-generic
initrd.img-2.6.38-10-generic  vmlinuz-2.6.38-10-generic
initrd.img-2.6.38-11-generic  vmlinuz-2.6.38-11-generic
initrd.img-2.6.38-12-generic  vmlinuz-2.6.38-12-generic
initrd.img-2.6.38-8-generic   vmlinuz-2.6.38-8-generic
initrd.img-3.0.0-12-generic   vmlinuz-3.0.0-12-generic
initrd.img-3.0.0-13-generic   vmlinuz-3.0.0-13-generic
initrd.img-3.0.0-14-generic   vmlinuz-3.0.0-14-generic

В данный момент я использую ядро 3.0.0-14-generic.

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

sudo apt-get purge linux-image-{3.0.0-12,2.6.3{1-21,2-25,8-{1[012],8}}}

Это сокращение для:

sudo apt-get purge linux-image-3.0.0-12 linux-image-2.6.31-21 linux-image-2.6.32-25 linux-image-2.6.38-10 linux-image-2.6.38-11 linux-image-2.6.38-12 linux-image-2.6.38-8

Удаление пакета linux-image-x.x.x-x также удалит linux-image-x.x.x-x-generic.

Заголовки устанавливаются в /usr/src и используются при сборке модулей ядра (таких как проприетарный драйвер nvidia и virtualbox). Большинство пользователей должны удалить эти пакеты заголовков, если соответствующий пакет ядра (linux-image-*) не установлен.

Чтобы перечислить все установленные ядра, выполните:

dpkg -l linux-image-\* | grep ^ii

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

kernelver=$(uname -r | sed -r 's/-[a-z]+//')
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver

Это выбирает все пакеты с именем, начинающимся с linux-headers-<какое-то число> или linux-image-<какое-то число>, печатает имена пакетов для установленных пакетов и затем исключает текущие загруженные/работающие ядра (не обязательно последние ядра!). Это соответствует рекомендации тестировать новое ядро перед удалением старых, известных как рабочих.

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

sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")

Ваш раздел загрузки полон. Поскольку это обновление ядра, эти файлы будут скопированы в раздел загрузки, поэтому вам нужно очистить его. Вот публикация в блоге, которая покажет вам, как очистить старые образы ядра одной командой. Я дам краткий обзор метода. Используйте эту команду, чтобы напечатать текущую версию вашего ядра:

uname -r

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

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'

Убедитесь, что ваше текущее ядро не находится в этом списке. Обратите внимание, что это большинство окончательной команды (внизу). Чтобы удалить и удалить эти старые ядра, вы захотите передать эти аргументы:

sudo apt-get -y purge

Теперь мы можем сделать все, что хотим, объединяя эти последние две команды в этот бесстыдный беспорядок:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge

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

sudo apt-get autoremove

Эта команда делает работу автоматически.

Менеджер пакетов Synaptic может использоваться для легкого выбора и удаления старых образов ядра.
Скриншот менеджера пакетов Synaptic

Если у вас еще не установлен Synaptic:

sudo apt-get install synaptic

Запустите приложение и выберите показанные варианты.

Вы должны быть в состоянии выделить все пакеты “linux-” с версией “2.6.x”, где x заключается между 31 и 38 в соответствии с файлами в вашей папке /boot.

Щелкните правой кнопкой мыши каждый из этих пакетов linux и выберите опцию “Пометить для полного удаления”. Наконец, нажмите кнопку примения. Это удалит все файлы и любые связанные с ними файлы. Ваша папка /boot теперь должна быть немного аккуратнее.

Спасибо за ваш подробный пост о вашей проблеме, это направило меня в правильном направлении. Хотя полезно сохранить предыдущие файлы ядра, вы можете удалить все их за один раз, посмотрите этот пост:
Как удалить все неиспользуемые заголовки, образы и модули ядра Linux

Сделано через командную строку. Если вы делаете это удаленно, используйте что-то вроде WINSCP, чтобы открыть сессию терминала и просто вставьте это, работает очень хорошо.

Вот это скопировано из статьи, рекомендую вам прочитать полную статью:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

Список всех ядер:

dpkg --list 'linux-image*'

Показать текущее ядро:

uname -r

Перечислить все ядра КРОМЕ текущего:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'

Убедитесь, что ваше текущее ядро не находится в этом списке.

Удалить все ядра КРОМЕ текущего:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge

Очистить другие файлы:

sudo apt-get autoremove

Если он все еще выдает вам ошибку пространства загрузочного диска при установке/удалении файлов, то напрямую удалите один из СТАРЫХ образов из каталога /boot,

ls -lh /boot/*-3.13.0-119*;

rm /boot/*-3.13.0-119*; 

ПРИМЕЧАНИЕ: Пожалуйста, проверьте текущее изображение ядра снова перед удалением любого изображения.

Если это все еще вызывает ошибку, повторите следующие команды для удаления ненужных ядер,

sudo dpkg --purge linux-image-X.X.X-XXX-generic linux-image-extra-X.X.X-XXX-generic linux-signed-image-X.X.X-XXX-generic
sudo dpkg --purge linux-image-Y.Y.Y-YYY-generic linux-image-extra-Y.Y.Y-YYY-generic linux-signed-image-Y.Y.Y-YYY-generic

sudo apt-get -f install

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge

Обратите внимание, что программное обеспечение в этом ответе не поддерживается с 2016 года. Я не знаю альтернатив…

Это новый ответ на старый вопрос, но простой способ очистить это (и многое другое) – установить Ubuntu Tweak. Чтобы установить его:

sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak

Затем вы можете запустить Ubuntu Tweak, перейдите на вкладку “уборщик”, и с этого момента вам потребуется три клика:

Уборщик Ubuntu для старых ядер

Лучше оставить последнее ядро (вы никогда не знаете) или известное рабочее ядро для безопасности, хотя это легко настраивается.

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

Мне удалось решить проблему, используя dpkg для прямого удаления пакетов. Хотя пакеты все еще перечислены в dpkg -l, файлы удалены из /boot, освобождая место.

phrogz@planar:/boot$ sudo dpkg --remove linux-image-2.6.32-30-server
(Чтение базы данных ... 145199 файлов и директорий в настоящее время установлено.)
Удаление linux-image-2.6.32-30-server ...
Запуск сценария postrm /usr/sbin/update-grub.
Генерация grub.cfg ...
Найдено linux изображение: /boot/vmlinuz-2.6.32-35-server
Найдено linux изображение: /boot/vmlinuz-2.6.32-34-server
Найдено initrd изображение: /boot/initrd.img-2.6.32-34-server
Найдено linux изображение: /boot/vmlinuz-2.6.32-33-server
Найдено initrd изображение: /boot/initrd.img-2.6.32-33-server
Найдено linux изображение: /boot/vmlinuz-2.6.32-32-server
Найдено initrd изображение: /boot/initrd.img-2.6.32-32-server
Найдено linux изображение: /boot/vmlinuz-2.6.32-31-server
Найдено initrd изображение: /boot/initrd.img-2.6.32-31-server
Найден образ memtest86+: /memtest86+.bin
Готово

# Повторите для ядер -31 и -32 и -33, до (но не включая)
# версии, перечисленной в `uname -a`

После этого apt-get -f install исправил мои проблемы с зависимостями, и все было в порядке.

Тем не менее, я не буду принимать этот мой ответ, так как мне все еще нужно знать, следует ли мне увеличивать размер /boot или делать что-то еще.

Вы можете прекратить использовать отдельный раздел /boot, тогда у вас не будет такого ограниченного пространства там. Для этого размонтируйте раздел, затем смонтируйте его в другом месте и скопируйте все файлы туда в директорию /boot в вашем корневом разделе, затем удалите запись из /etc/fstab и переустановите grub. Например (вам нужно будет использовать правильный раздел) :

sudo -s
umount /boot
mount /dev/sda2 /mnt
cp -a /mnt/* /boot/
umount /mnt
gedit /etc/fstab
grub-install /dev/sda

Затем вы можете использовать gparted, чтобы удалить старый раздел /boot, и, возможно, расширить корневой раздел, чтобы использовать это пространство. Чтобы расширить корневой раздел, вам необходимо загрузиться с livecd, и свободное пространство должно быть сразу справа. Если раздел /boot в настоящее время слева от корневого раздела, вам сначала необходимо переместить корневой раздел влево, затем расширить его, но на это может уйти очень-очень много времени, поэтому это может не стоить хлопот.

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

Взято лучшее из ответов выше, мой проверенный метод таков:

  • uname -a, чтобы найти работающее ядро.
  • dpkg -l linux-{headers,image}-\* | grep ^ii, чтобы перечислить все в настоящее время установленные пакеты, связанные с ядром. Это будет включать работающее ядро.
  • sudo apt-get purge linux-{image,headers}-3.16.0-{xx,yy,zz}, чтобы удалить старые ядра. Замените xx,yy,zz на список сборок ядра, которые вы хотите удалить – это все сборки, перечисленные предыдущей командой, которые старше текущего работающего ядра. Убедитесь, что вы не удаляете текущее работающее ядро – ваша система станет не загружаемой. Вам также может потребоваться изменить версию ядра с 3.16.0 на ту, которая установлена на вашей системе.
  • Опционально, выполните дополнительную sudo apt-get autoremove – это удалит любые остаточные зависимости старых ядер, которые больше не нужны текущему, освобождая еще больше места.

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

Если что-то не удается…

  • Если команда apt не удается из-за ошибки недостаточно места на устройстве, используйте соответствующую команду dpkg: sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}.
  • Если команда dpkg все еще не работает, потому что пакеты linux-image требуется для пакетов linux-headers той же версии (которые вы также хотите удалить), dpkg, возможно, не смог это решить. Пересмотрите выходные данные dpkg -l и укажите любые суффиксы имен пакетов в командной строке. Например, на одном из моих систем команда, которая в конечном итоге сработала, была sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}-generic-pae.
  • Если вы получите другую ошибку, обратитесь за помощью – возможно, у вас другая проблема, чем вы думали.

Автоматизация

Этот скрипт выполнит все вышеперечисленные шаги автоматически.

Побочными эффектами он удалит все неиспользуемые зависимости и обновит все пакеты в системе (не только ядро – за исключением пакетов, которые были заблокированы).

Скрипт может работать с правами пользователя, но вызовет sudo для фактических операций с пакетами. Вам будет предложено подтвердить любые операции по очистке/установке пакетов:

#!/bin/sh
verpattern=[0-9]+\.[0-9]+\.[0-9]+-[0-9]+

# Определите текущее ядро, трансформируя вывод `uname -a`
current=$(uname -a | sed -E "s/Linux .* ($verpattern)-[a-z]+ .*/\1/")

if ! ( echo "$current" | egrep -q "$verpattern" ) ; then
    # Что-то пошло не так; прервите, чтобы предотвратить повреждение
    echo "ERROR: не удается определить текущую версию ядра"
    exit 1
fi

# Определите неиспользуемые версии ядра: перечислите установленные пакеты, отбросьте записи
# для версия ядра (или без паттерна версии), затем изолируйте версию
# из каждой строки, удалите дубликаты и сохраните номера версий в `$oldvers`
oldvers=""
for ver in $( dpkg -l linux-headers-\* linux-image-\* | grep ^ii | grep -Fv "$current" | egrep "$verpattern" | sed -E "s/.* +.* +($verpattern)\.[0-9]+ .*/\1/" | sort -u ) ; do
    oldvers="$oldvers $ver"
done

pkgs=""
for ver in $oldvers ; do
    for suffix in "image" "image-unsigned" "headers" ; do
        pkgs="$pkgs linux-$suffix-$ver"
    done
done

# Удалите неиспользуемые версии (`$pkgs`), удалите устаревшие зависимости и обновите ядро
sudo apt-get purge $pkgs && sudo apt autoremove && sudo apt-get upgrade

Для меня как apt-get purge, так и dpkg --remove оба не сработали. Поэтому мне пришлось удалить несколько старых образов ядер из /boot с помощью rm -f.

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

Ubuntu как настольная ОС простого повседневного использования не имеет причин быть установленной с отдельным разделом /boot, и что-то подобное не предложит ничего “общему пользователю”… Таким образом, решением является свежая установка без раздела /boot, и таким образом у вас никогда не будет такой проблемы

Я уже удалил старые пакеты ядра (linux-headers…)

linux-headers-* это не ядра. Пакеты ядра – это те, что называются linux-image-*. Те, что называются linux-headers-* – это пакеты разработки для компиляции модулей ядра: они не находятся в директории /boot и не требуются для общего повседневного использования вашей системы.

Файлы, которые вы перечислили в /boot действительно включают несколько старых образов ядра (vmlinuz*) и скомпилированные initrd-образы (initrd.img*) для этих ядер, что указывает на то, что у вас все еще много установленных старых пакетов ядра.

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

aptitude search ~ilinux-image

(Обратите внимание, что это, вероятно, также вернет пакеты, которые не являются ядрами).

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

sudo apt-get autoremove linux-image-3.2.0-23-generic

Убедитесь, что вы заменили “3.2.0-23-generic” на фактическую версию ядра, которую вы хотите удалить! Кроме того, не удаляйте такие пакеты, как linux-image-generic. Вам нужно быть очень осторожным, чтобы не удалить текущее ядро, иначе вы не сможете загрузиться (Ubuntu может предупредить вас об этом или нет).

Вы можете найти текущее работающее ядро с помощью:

uname -r

У меня была эта проблема и больше, так как я вручную удалил некоторые initrd-img-xxx файлы из /boot и у меня была проблема, что эти старые версии продолжают генерироваться и заполнять папку /boot. Чтобы это исправить, я следовал следующему:

  • Я удалил сгенерированные старые версии ядра вручную, чтобы освободить место.
  • Вам придется редактировать текстовый конфигурационный файл как суперпользователь, поэтому вставьте следующее в терминал:

    sudo gedit /etc/initramfs-tools/update-initramfs.conf
    
  • Найдите строку update_initramfs=yes и измените ее на update_initramfs=no. Сохраните и выйдите из файла, затем выполните:

    sudo dpkg --configure -a
    

Это решило мою проблему. Это основано на этом блоге

Надеюсь, все будет в порядке, когда вы перезагрузите систему, а позже вы можете попытаться изменить no обратно на yes в update-initramfs.conf.

Я написал этот bash-скрипт для селективного удаления старых ядер сразу:

rm kernels real size

Весь bash-код и инструкции включены по ссылке.

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

git clone https://github.com/erichs/bootnukem.git
cd bootnukem
sudo ./install.sh

Используйте на свой страх и риск, но это сработало для меня:

sudo bootnukem

Раздел /boot может быть немного странным иногда

не начинайте сразу удалять файлы ядра.

Шаги, которые нужно выполнить

  1. Проверьте текущее установленное ядро, использующееся в системе linux

    uname -r

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

  2. Теперь начните удалять лишние файлы, кроме того, который установлен на вашей системе

    apt-get remove linux-image-XXXXX

  3. Также удалите заголовочный файл

    apt-get remove linux-headers-XXXXX

  4. Также может возникнуть ситуация, когда apt перестал работать, в таком случае перейдите в /boot

    cd /boot

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

    rm linux-image-XXXXX

    rm linux-image-extra-XXXXXX

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

    apt-get -f install

  7. Удалите лишние файлы, остававшиеся там, как загрузочные файлы, очищенные вручную

    apt-get autoremove

  8. Обновите grub

    update-grub

  9. Наконец, обновите пакеты вашей системы

    apt-get update

Утилита linux-purge создана для этой цели:

Установите утилиту с Launchpad; вы можете найти инструкции оттуда.

Запустите:

sudo linux-purge --clear-boot --keep=1 --optimize

--keep=1 означает, что команда сохранит 1 ядро старше текущего ядра, так что всего 2, если установлено хотя бы столько. Она может сохранить еще больше, если у вас установлено больше одного мета-ядра. --clear-boot вероятно, не обязательно; это очистит ядра, неизвестные системе управления пакетами. --optimize не обязательно, но это ускорит процесс, если вам нужно удалить много ядер.

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

Если вышеупомянутое не сработает, выполните

sudo linux-purge --fix

и повторите попытку.

Если вы обнаружите ошибку в программном обеспечении, вы можете сообщить об этом в Launchpad.
Смотрите man linux-purge для получения дополнительных деталей и информации о возможных параметрах командной строки.

В aptitude или synaptic есть раздел “старые или вручную установленные пакеты”. Там должны находиться старые пакеты linux.

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

YMMV – он был сделан для Mint 14. Все еще учу BASH, так что, вероятно, это немного грубо. Используйте на свой страх и риск, но это сработало для меня!

#!/bin/bash

endCol="\e[0m"
bold_red='\e[1;31m'
bold_green='\e[1;32m'
bold_yellow='\e[1;33m'

title_color="\e[0;30;47m"

function show_kernel_info {
clear
current_kernel=$(uname -r)
echo "Текущее АКТИВНОЕ ядро:"
echo -e "  "$bold_yellow$current_kernel$endCol
echo "Это ядро будет ПОЛНОСТЬЮ ИСКЛЮЧЕНО из всех действий в этом скрипте."
echo "Также одно резервное неактивное ядро будет всегда оставаться нетронутым."
echo ""
echo "Вот неактивные ядра, хранящиеся в /boot:"
count_of_old_kernels_in_boot=$(ls -o /boot/initrd* | grep -c -v "$current_kernel")
if [ $count_of_old_kernels_in_boot = 0 ]; then
  echo " * Неактивные ядра не найдены! *"
else
  ls -o /boot/initrd* | grep -v "$current_kernel"
fi
echo ""
list_of_old_kernels=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic")
current_old_kernel=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic" | head -n 1)
count_of_old_kernels_installed=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -c -v "linux-image-generic")
echo "Список всех неиспользуемых ядер, все еще установленных в системе (они могут не существовать в /boot):"
if [ $count_of_old_kernels_installed = 0 ]; then
  echo " * Не найдены установленные неиспользуемые ядра! *"
else
  dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic"
fi
echo ""
}

function exit_script {
free_space_after=$(df -BM /boot | tail -n 1 | awk -F' ' '{ print $4 }' | tr -d M)
let freed_space=$free_space_after-$free_space_before
echo ""
echo "Результаты (в МБ)"
echo "---------------"
echo "Свободное пространство в /boot до запуска скрипта: "$free_space_before
echo "Свободное пространство сейчас: "$free_space_after
echo ""
echo "Количество освобожденного пространства = "$freed_space
echo ""
echo "Нажмите любую клавишу, чтобы выйти."
read -s -n 1
echo ""
exit
}

# Основной код
echo ""
echo -e $title_color" --------------------------- "$endCol
echo -e $title_color" -   Очистка ядра v1.0   - "$endCol
echo -e $title_color" --------------------------- "$endCol
echo ""
echo "Максимизируйте это окно для удобочитаемости."
echo "Нажмите любую клавишу, чтобы продолжить."
read -s -n 1
echo ""
echo "Этот скрипт удалит старые неиспользуемые ядра, но он будет спрашивать вас перед удалением каждого ядра."
echo "Он никогда не удалит текущее работающее ядро и также оставит одно резервное ядро."
echo "Он также может удалить исходные файлы из /usr/src для каждого удаленного ядра."
echo "Это обычно безопасно делать и освободит много дополнительного пространства."
echo ""
echo "Вы хотите, чтобы это было сделано также? (y/n, ввод = yes)"
valid_input=0
while [ "$valid_input" = "0" ]; do
  read -s -n 1 YesNo_input
  if [ "$YesNo_input" = "" ]; then
    YesNo_input="y"
  fi
  case $YesNo_input
  in
    y)
    RemoveSource="y"
    valid_input=1
    ;;

    Y)
    RemoveSource="y"
    valid_input=1
    ;;

    n)
    RemoveSource="n"
    valid_input=1
    ;;

    N)
    RemoveSource="N"
    valid_input=1
    ;;
  esac
done

free_space_before=$(df -h /boot | tail -n 1 | awk -F' ' '{ print $4 }' | tr -d M)
show_kernel_info
while [ $count_of_old_kernels_in_boot -gt 1 ]; do
  # проверка безопасности, если каким-либо образом текущее ядро собирается быть удалено!
  if [ "$current_old_kernel" = "$current_kernel" ]; then
    echo -e $bold_red"ОШИБКА!"$endCol" Как-то текущее ядро попало в процесс удаления!"
    echo "Я отказываюсь это делать! Прерываю скрипт."
    exit_script
  fi
  # проверка безопасности, если каким-либо образом запись linux-image-generic собирается быть удалена
  if [ "$current_old_kernel" = "linux-image-generic" ]; then
    echo -e $bold_red"ОШИБКА!"$endCol" Как-то одна из записей linux-image-generic попала в процесс удаления!"
    echo "Я отказываюсь это делать! Прерываю скрипт."
    exit_script
  fi
  echo "Команда, которую собираются выполнить:"
  echo "  $ sudo apt-get purge \"$current_old_kernel\""
  check_in_boot=$(echo $current_old_kernel | sed 's/linux-image/initrd.img/g')
  if [ -e /boot/$check_in_boot ]; then
    echo -e $bold_yellow"Примечание:"$endCol" Это ядро существует в /boot, но оно неактивно, поэтому его можно удалить."
  else
    echo -e $bold_green"Совершенно безопасно удалить:"$endCol" Это ядро НЕ существует в /boot."
  fi
  echo ""
  echo "Вы уверены, что хотите удалить это ядро?"
  echo "(*заглавная буква* Y = да / любая другая клавиша завершит скрипт)"
  read -s -n 1 yes_no
  echo ""
  # Только ввод одной заглавной Y сработает!
  if [ "$yes_no" != "Y" ]; then
    echo "Прерываю скрипт."
    exit_script
  fi
  echo "Удаление ядра "$current_old_kernel"..."
  sleep 1
  sudo apt-get -y purge $current_old_kernel
  if [ "$RemoveSource" = "y" ]; then
    current_old_source=$(echo $current_old_kernel | sed 's/linux-image/linux-headers/g')
    current_old_source=$(echo $current_old_source | sed 's/-generic//g')
    current_old_source=$(echo $current_old_source | sed 's/-pae//g')
    sudo apt-get -y purge $current_old_source
  fi
  show_kernel_info
done

if [ $count_of_old_kernels_in_boot = 0 ]; then
  echo -e $bold_red"Нет неактивных ядер, которые можно удалить!"$endCol
else
  echo -e $bold_red"Осталось только одно неактивное ядро в /boot!"$endCol
  echo "Этот скрипт не удалит последнее неактивное ядро, чтобы у вас было хотя бы одно резервное ядро."
fi
echo "Прерываю скрипт."
exit_script

[Как новичок AskUbuntu я не могу комментировать, пока репутация не достигнет 50, так что не оцените низко из-за этого.]

Мой сервер также делал это. Буквально ни одно из ожидаемых ответов здесь не сработало, так как они требуют немного места на /boot, чтобы они завершились. Если загрузочный раздел полон, он резко заканчивается, не удаляя ни один из образов.

Единственное, что сработало для меня, это пересмотреть текущий образ, затем вручную sudo rm filename для самых старых образов файлов (каждый из которых имел -3.16.0-30 в своих именах). Как только это было сделано, sudo apt-get autoremove получило пространство, необходимое для выполнения своей работы. Это подчеркнуло некоторые ошибки, связанные с этой версией, например: “depmod: FATAL: не удалось загрузить /boot/System.map-3.16.0-30-generic: Нет такого файла или директории”, но это ожидалось.

Когда все было закончено, df показал 42% использования для /boot, указывая, что он снова здоров.

Сохраните этот скрипт как /usr/local/bin/remove_kernels.sh (не забудьте дать разрешения на выполнение sudo chmod 755 /usr/local/bin/remove_kernels.sh):

#!/bin/sh
if test $(id -u) != 0; then
 echo Ошибка: Вы должны быть root, чтобы запустить этот скрипт!
 exit 1
fi
apt purge $( dpkg --list | grep -P -o "linux-image-\d\S+" | grep -v $(uname -r | grep -P -o ".+\d") )
update-grub

Затем, чтобы удалить все старые ядра, просто введите: sudo remove_kernels.sh

apt-get purge или apt-get autoremove сработает только тогда, когда оставшееся пространство все еще достаточно для установки ядра, но все еще достаточно для основных операций apt. Если диск полностью заполнен, то, к сожалению, все вызовы apt или dpkg завершатся неудачей. В этом случае вам следует удалить файлы из /boot, но rm /boot/$OLD_KERNEL напрямую, как в некоторых других ответах, не безопасно, и вам следует следовать официальным шагам в вики Ubuntu:

# Удалите любые остаточные временные файлы из предыдущих обновлений ядра
sudo rm -rv ${TMPDIR:-/var/tmp}/mkinitramfs-*

# Удалите initrd.img для указанной версии ядра
sudo update-initramfs -d -k 4.2.0-15-generic

# Попробуйте удалить пакет ядра для этой версии
sudo dpkg --purge linux-image-4.2.0-15-generic # или
sudo dpkg --purge linux-image-4.2.0-15-generic linux-image-extra-4.2.0-15-generic

# Исправьте установку пакета
sudo apt-get -f install

Повторите последние 3 шага с другими старыми ядрами, пока все не выполнится успешно

Для всех с полным шифрованием диска:

Решение

  1. Перечислите установленные ядра

    $ dpkg -l | grep linux-image-.*-generic  | grep ^ii
    ii  linux-image-5.19.0-50-generic                               5.19.0-50.50                            amd64        Подписанное ядро.generic
    ii  linux-image-6.2.0-39-generic                                6.2.0-39.40~22.04.1                     amd64        Подписанное ядро.generic
    ii  linux-image-6.5.0-14-generic                                6.5.0-14.14~22.04.1                     amd64        Подписанное ядро.generic
    ii  linux-image-6.5.0-15-generic                                6.5.0-15.15~22.04.1                     amd64        Подписанное ядро.generic
    
  2. Удалите старое ядро, например.

    sudo apt purge linux-image-5.19.0-50-generic linux-modules-5.19.0-50-generic
    

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

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

Если хотите, вы также можете очистить любые ненужные пакеты позже, например:

sudo apt autoremove

(Или sudo apt autopurge)

Исправление

Истинное исправление состояло бы в том, чтобы изменить размер раздела /boot, чтобы сделать его больше.

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

Это лучший ответ, который я нашел до сих пор о том, как это сделать: Как графически отредактировать/изменить размер раздела LVM (с графическим интерфейсом)?

Я наконец сделал это сам и вот как я это сделал: https://askubuntu.com/a/1533568/18665

Детали

Ни один из других ответов не упомянул полное шифрование диска. Для тех из нас, кто использует полное шифрование диска, раздел /boot может быть недостаточно размерен из-за этого бага: https://bugs.launchpad.net/ubuntu/+source/partman-auto/+bug/1959971

Из коробки Ubuntu сохраняет 3 ядра. Насколько я понимаю, эта логика встроена в пакеты, которые обрабатывают логику для apt autoremove, и нет никакой возможности изменить это без пересборки этих пакетов. Так что я полагаю, это было бы возможным “исправлением”, но с точки зрения меня это не кажется жизнеспособным решением.

В моем случае /boot составляет 704 МБ, что должно быть достаточно для 3 ядер:

$ df -h /boot
Файловая система      Размер  Использовано Доступно Использовано% Смонтировано на
/dev/nvme0n1p2  704M  582M   71M  90% /boot

Тем не менее, при установке обновлений Ubuntu сначала установит дополнительные ядра, прежде чем удалить старые ядра, так что /boot остается без пространства. Вот журнал с последнего раза, когда я столкнулся с этой ошибкой во время обновления:

Настройка initramfs-tools (0.140ubuntu13.4) ...
update-initramfs: откладывает обновление (триггер активирован)
Настройка linux-firmware (20220329.git681281e4-0ubuntu3.26) ...
update-initramfs: Генерация /boot/initrd.img-6.5.0-15-generic
I: initramfs попытается возобновить с /dev/dm-2
I: (/dev/mapper/vgubuntu-swap_1)
I: Установите переменную RESUME для переопределения.
zstd: ошибка 25: ошибка записи: На устройстве не осталось места (не удается записать сжатый блок)
E: сбой mkinitramfs zstd -q -1 -T0 25

И, конечно, установлено 4 ядра:

$ dpkg -l | grep linux-image-.*-generic  | grep ^ii
ii  linux-image-5.19.0-50-generic                               5.19.0-50.50                            amd64        Подписанное ядро.generic
ii  linux-image-6.2.0-39-generic                                6.2.0-39.40~22.04.1                     amd64        Подписанное ядро.generic
ii  linux-image-6.5.0-14-generic                                6.5.0-14.14~22.04.1                     amd64        Подписанное ядро.generic
ii  linux-image-6.5.0-15-generic                                6.5.0-15.15~22.04.1                     amd64        Подписанное ядро.generic

(Похоже, что также есть другие сценарии, при которых может быть установлено 4 или более ядер, например, при использовании пакетов HWE: Почему Ubuntu сохраняет 4 установленных ядра?)

Даже apt autoremove не срабатывает, так как прежде чем он удалит пакеты, он сначала пытается исправить существующие поврежденные пакеты, что завершается неудачей, потому что в /boot недостаточно места.

Ответ или решение

Вопрос: Как освободить больше места в разделе /boot

Ваш раздел /boot почти заполнен, и это вызывает предупреждения кажд fois, когда вы перезагружаете систему. Удаление старых пакетов ядра (таких как linux-headers...) – это правильный шаг, однако есть дополнительные меры, которые необходимо предпринять для освобождения пространства. В этом ответе мы рассмотрим, как эффективно очистить данный раздел.

1. Определите используемое ядро

Первый шаг – выяснить, какое ядро в данный момент активно. Это можно сделать с помощью следующей команды:

uname -r

2. Перечислите установленные ядра

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

dpkg -l linux-image-* | grep ^ii

Это покажет вам список всех установленных пакетов ядра.

3. Удаление старых ядер

Очень часто причина переполнения раздела /boot заключается в накоплении старых версий ядра. Удаление неактивного ядра и его заголовков можно выполнить с помощью следующей команды:

sudo apt-get purge linux-image-<старая_версия> linux-headers-<старая_версия>

В вашем случае могут быть использованы команды для автоматизации этого процесса:

sudo apt-get purge $(dpkg -l | grep linux-image | grep -v $(uname -r | awk -F "-" '{print $1"-"$2}') | awk '{print $2}')

Этот одинокий вызов очистит все старые версии ядра, кроме текущего.

4. Используйте autoremove

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

sudo apt-get autoremove

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

5. Если пространство закончилось

Если раздел /boot переполнен и команды apt-get не работают, попробуйте вручную удалить старые изображения ядра из каталога:

sudo rm /boot/vmlinuz-<старая_версия>
sudo rm /boot/initrd.img-<старая_версия>

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

6. Обновление GRUB

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

sudo update-grub

7. Расширьте раздел /boot

Если вы часто сталкиваетесь с проблемой нехватки места в /boot, возможно, стоит рассмотреть вопрос о его увеличении. Это можно сделать с использованием инструментов, таких как GParted. Однако, перед выполнением операций с разделами обязательно создайте резервные копии важных данных, так как изменение разделов – это рискованная операция.

Заключение

Поддержание порядка в разделе /boot требует регулярного обслуживания, особенно если система периодически обновляет ядро. Следуя вышеизложенным шагам, вы сможете эффективно освободить пространство и избежать предупреждений о переполнении раздела. Не забудьте периодически проверять установленные ядра и удалять те, которые вам больше не нужны.

Оцените материал
Добавить комментарий

Капча загружается...