Не удается обновить из-за недостатка места на диске / boot

123

Я пытаюсь сделать, do-release-upgrade но потом я получаю:

Недостаточно свободного места на диске

Обновление прервано. Для обновления требуется всего 25,7 М свободного места на диске «/ boot». Пожалуйста, освободите как минимум дополнительные 25,7 М дискового пространства в / boot. Очистите корзину и удалите временные пакеты из предыдущих установок, используя команду «sudo apt-get clean».

Выход df:

                    237251272 214797108  10402504  96% /
udev                    488120         4    488116   1% /dev
tmpfs                   198676       668    198008   1% /run
none                      5120         0      5120   0% /run/lock
none                    496684         0    496684   0% /run/shm
/dev/sda1               233191    225867         0 100% /boot

Почему же на загрузке не осталось места? Вот вывод ls -as /boot:

total 221839
    4 .
    4 ..
  645 abi-2.6.32-34-generic-pae
  698 abi-2.6.35-30-generic-pae
  727 abi-2.6.38-12-generic-pae
  727 abi-3.0.0-12-generic-pae
  727 abi-3.0.0-13-generic-pae
  727 abi-3.0.0-14-generic-pae
  727 abi-3.0.0-15-generic-pae
  727 abi-3.0.0-16-generic-pae
  727 abi-3.0.0-17-generic-pae
  727 abi-3.0.0-19-generic-pae
  761 abi-3.0.0-20-generic-pae
  115 config-2.6.32-34-generic-pae
  128 config-2.6.35-30-generic-pae
  136 config-2.6.38-12-generic-pae
  140 config-3.0.0-12-generic-pae
  140 config-3.0.0-13-generic-pae
  140 config-3.0.0-14-generic-pae
  140 config-3.0.0-15-generic-pae
  140 config-3.0.0-16-generic-pae
  140 config-3.0.0-17-generic-pae
  140 config-3.0.0-19-generic-pae
  140 config-3.0.0-20-generic-pae
    5 grub
10773 initrd.img-2.6.32-34-generic-pae
13619 initrd.img-2.6.35-30-generic-pae
15365 initrd.img-2.6.38-12-generic-pae
16481 initrd.img-3.0.0-12-generic-pae
16487 initrd.img-3.0.0-13-generic-pae
16501 initrd.img-3.0.0-14-generic-pae
16476 initrd.img-3.0.0-15-generic-pae
16481 initrd.img-3.0.0-16-generic-pae
16478 initrd.img-3.0.0-17-generic-pae
   12 lost+found
  174 memtest86+.bin
  176 memtest86+_multiboot.bin
 1700 System.map-2.6.32-34-generic-pae
 1841 System.map-2.6.35-30-generic-pae
 2115 System.map-2.6.38-12-generic-pae
 2141 System.map-3.0.0-12-generic-pae
 2141 System.map-3.0.0-13-generic-pae
 2143 System.map-3.0.0-14-generic-pae
 2146 System.map-3.0.0-15-generic-pae
 2147 System.map-3.0.0-16-generic-pae
 2147 System.map-3.0.0-17-generic-pae
 2148 System.map-3.0.0-19-generic-pae
 2149 System.map-3.0.0-20-generic-pae
    2 vmcoreinfo-2.6.32-34-generic-pae
    2 vmcoreinfo-2.6.35-30-generic-pae
    2 vmcoreinfo-2.6.38-12-generic-pae
    2 vmcoreinfo-3.0.0-12-generic-pae
    2 vmcoreinfo-3.0.0-13-generic-pae
    2 vmcoreinfo-3.0.0-14-generic-pae
    2 vmcoreinfo-3.0.0-15-generic-pae
    2 vmcoreinfo-3.0.0-16-generic-pae
    2 vmcoreinfo-3.0.0-17-generic-pae
    2 vmcoreinfo-3.0.0-19-generic-pae
    2 vmcoreinfo-3.0.0-20-generic-pae
 4092 vmlinuz-2.6.32-34-generic-pae
 4347 vmlinuz-2.6.35-30-generic-pae
 4567 vmlinuz-2.6.38-12-generic-pae
 4675 vmlinuz-3.0.0-12-generic-pae
 4676 vmlinuz-3.0.0-13-generic-pae
 4681 vmlinuz-3.0.0-14-generic-pae
 4698 vmlinuz-3.0.0-15-generic-pae
 4700 vmlinuz-3.0.0-16-generic-pae
 4700 vmlinuz-3.0.0-17-generic-pae
 4703 vmlinuz-3.0.0-19-generic-pae
 4705 vmlinuz-3.0.0-20-generic-pae

Выход uname -a:

 Linux kitsch 3.0.0-17-generic-pae #30-Ubuntu SMP Thu Mar 8 17:53:35 UTC 2012 i686 i686 i386 GNU/Linux
зажим
источник
Добавьте вывод к ls -l /bootи uname -aна ваш вопрос.
Джиппи
Также добавьте вывод dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'к вашему вопросу.
Джиппи
ls -as /bootможет быть полезно вместо Он будет включать в себя только размеры файлов.
adempewolff
вывод команды ls -l / boot слишком длинный, так что здесь есть pastebin pastebin.com/yM1aEJUx
зажим
5
Нет это не так. Это причина вашей проблемы. Если ваш вопрос действительно становится слишком длинным, кто-то отредактирует его. Использование внешних сервисов, таких как pastebin, нарушит ценность вопроса для дальнейшего использования.
Джиппи

Ответы:

160

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

Сначала проверьте, uname -aчтобы проверить текущую версию.

Затем выполните следующую команду:

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

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

sudo apt-get -y purge some-kernel-package

Интермеццо

Это intermezzo более подробно описывает, как работают команды, и пытается исправить проблему linux-libc-dev:amd64. Большинство пользователей могут пропустить этот пункт.

  • dpkg -l 'linux-*' перечислите все пакеты, имена которых начинаются с 'linux-'
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" найти текущую версию ядра
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Удалить все строки, кроме тех, которые содержат текущий номер версии ядра
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ Для каждой строки списка только название пакета
  • /[0-9]/!d Удалить строки, которые не содержат чисел.

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

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d;/^linux-\(headers\|image\)/!d'

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

  • / ^ linux- (заголовки \ | image) /! d Удалить все строки, которые не начинаются с linux-headersилиlinux-image

/Интермеццо

Где some-kernel-packageможно заменить одним из перечисленных пакетов. Просто помните, что вы не удаляете пакеты ядра, которые используются в данный момент (как указано в uname -a), например. sudo apt-get purge -y linux-headers-3.0.0-12и т.п.

Это может быть автоматизировано с помощью команды xargs, но мне это не нравится. Это личная вещь. Тем не менее, вот команда, чтобы сделать это:

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

Вот как я /bootвыгляжу: одно запасное ядро ​​(2.6.38-11) на всякий случай и текущее 3.2.0-24:

$ ls -l /boot
total 59388
-rw-r--r-- 1 root root   730545 Sep 13  2011 abi-2.6.38-11-generic
-rw-r--r-- 1 root root   791023 Apr 25 13:51 abi-3.2.0-24-generic
-rw-r--r-- 1 root root   130326 Sep 13  2011 config-2.6.38-11-generic
-rw-r--r-- 1 root root   140341 Apr 25 13:51 config-3.2.0-24-generic
drwxr-xr-x 3 root root     5120 May 27 17:46 grub
-rw-r--r-- 1 root root 20883146 Oct  1  2011 initrd.img-2.6.38-11-generic
-rw-r--r-- 1 root root 22474219 May  5 09:04 initrd.img-3.2.0-24-generic
drwxr-xr-x 2 root root    12288 Apr 16  2009 lost+found
-rw-r--r-- 1 root root   176764 Nov 27 11:00 memtest86+.bin
-rw-r--r-- 1 root root   178944 Nov 27 11:00 memtest86+_multiboot.bin
-rw------- 1 root root  2656297 Sep 13  2011 System.map-2.6.38-11-generic
-rw------- 1 root root  2884358 Apr 25 13:51 System.map-3.2.0-24-generic
-rw------- 1 root root     1369 Sep 13  2011 vmcoreinfo-2.6.38-11-generic
-rw------- 1 root root  4526784 Sep 13  2011 vmlinuz-2.6.38-11-generic
-rw------- 1 root root  4965776 Apr 25 13:51 vmlinuz-3.2.0-24-generic

И использование файловой системы:

$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5  228M  63M  154M  29% /boot
jippie
источник
2
Это решение было в значительной степени вдохновлено статьей OzzyFrank на ubuntugenius.wordpress.com/2011/01/08/…
jippie
6
Да, почему это проблема, вопрос? Это не должно быть на пользователя для обработки.
Элайджа Линн
2
FWIW: Для меня это также соответствовало linux-libc-dev: amd64. Так что это может быть слишком щедрым.
Фредерик Норд
4
It does that sometimes, not sure why it is never fixedUbuntu приняла решение, в лучшую или худшую сторону, предоставлять обычные новые ядра в виде новых пакетов, а не в качестве обновлений существующих пакетов, чтобы иметь возможность установить несколько ядер и переключаться между ними по желанию. Я согласен, что это предположение не устраивает 95% людей, которым просто нужно последнее ядро ​​(и, возможно, один запасной вариант в случае новых проблем с загрузкой), и которые не хотят сами управлять установленными ядрами. Возможно, в будущем Ubuntu изменит это поведение. Пока убедитесь, что ваш / boot огромен.
Томасруттер
1
@thomasrutter Если вы (как я и 95% людей, о которых вы говорите) считаете эту ошибку важной, проголосуйте за нее здесь: bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1183692
FriendFX
46

sudo apt-get autoremove

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

с обнаженной грудью
источник
3
это не правильно. from man apt-getautoremove используется для удаления пакетов, которые были автоматически установлены для удовлетворения зависимостей для какого-либо пакета и которые больше не нужны. ядро не будет установлено для удовлетворения зависимостей, оно устанавливается во время обновлений.
dward
5
@neon_overload Я только что опубликовал это, потому что это помогло мне.
топлесс
1
@dward Это освободило место для меня: до автоматического удаления: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot после: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Стефан Рогин
6
В диалоговом окне «Недостаточно свободного места на диске» должна быть кнопка для выполнения этой задачи. Это особенно поможет начинающим пользователям, которые не знакомы с командной строкой.
Мартин Р.
1
Сделал трюк, не ломая мою ОС
Рутвик Вайла
8

Эквивалентно принятому ответу - другой (возможно) более простой способ - установить ubuntu-tweakинструмент, его можно скачать отсюда . Перейдите в «Дворник» и выберите «Старое ядро» для очистки. Это можно сделать за несколько кликов. (протестировано на рабочем столе 14.04)

введите описание изображения здесь

Исин
источник
Ситуация с нехваткой места /bootвозникает постоянно, так что это мое любимое решение - легко запустить приложение, которое выполняет работу одним щелчком мыши.
s3m3n
2

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

Решение на базе Zenity и Bash

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

рм-ядра 1

Текущее ядро, с которым вы загрузились, не может быть удалено и не включено в список. Указанный размер - это то, сколько будет сохранено в /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

ПРИМЕЧАНИЕ. Для серверной (текстовой, а не графической) версии этого сценария см .: Как удалить старые версии ядра для очистки меню загрузки?


28 июля 2017 г. Обновления

Расчетный размер каждого ядра был взят из /boot/*kernel_version*5 файлов общим объемом ~ 50 МБ. Формула была изменена, чтобы включить файлы в /usr/src/*kernel_version*и /lib/modules/*kernel_version*. Расчетный размер для каждого ядра теперь составляет ~ 400 МБ. Выше код для rm-kernelsи rm-kernels-serverбыл обновлен. Однако приведенные выше примеры экранов еще не отражают эти изменения.

По умолчанию размер файлов для linux-заголовков оценивается в 125 МБ, а для linux-образа - в 220 МБ, поскольку он duможет быть очень медленным, если файлы не находятся в кеше. Чтобы получить реальный размер, duпередайте любой параметр в скрипт.

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

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

WinEunuuchs2Unix
источник
Ты великолепен! Действительно большое спасибо! Ты делаешь меня счастливым!
Жартауник,
0

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

linux@linux-desktop:~$ uname -r 4.4.0-75-generic Так что хотя бы эту версию вы должны оставить нетронутой. Откройте synaptic и начните заполнять заполнитель быстрого фильтра, как показано ниже: введите описание изображения здесь Теперь вы можете выбрать все пакеты, которые вы хотите удалить, и сделать следующее: Пометить для полного удаления -> Применить . Я бы посоветовал сохранить хотя бы последний текущий пакет ядра и одно предыдущее ядро. Например, в этом случае вы можете безопасно избавиться от linux-image-4.4.0-66-generic и linux-image-extra-4.4.0-66-generic , но хорошо сохранить 4.4.0-72 и, конечно, 4.4.0-75 .

даго
источник