No se puede actualizar debido al bajo espacio en disco en / arranque

123

Intento hacerlo do-release-upgrade pero luego obtengo:

No hay suficiente espacio libre en el disco

La actualización ha abortado. La actualización necesita un total de 25.7 M de espacio libre en el disco '/ boot'. Libere al menos 25.7 M adicionales de espacio en disco en '/ boot'. Vacíe su basura y elimine los paquetes temporales de instalaciones anteriores utilizando 'sudo apt-get clean'.

Salida de 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

¿Cómo es que no queda espacio en el arranque? Aquí está la salida de 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

Salida de 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
abrazadera
fuente
Agregue el resultado a ls -l /booty uname -aa su pregunta.
jippie
Agregue también el resultado dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'a su pregunta.
jippie
ls -as /bootpodría ser útil en su lugar. Incluirá solo los tamaños de los archivos.
adempewolff
la salida de ls -l / boot es bastante larga para publicar aquí, así que aquí hay un pastebin pastebin.com/yM1aEJUx
abrazadera
55
No, no es. Es la causa de tu problema. Si su pregunta es demasiado larga, alguien la editará. El uso de servicios externos como pastebin romperá el valor de la pregunta para referencia futura.
jippie

Respuestas:

160

Su partición / boot está llena de núcleos antiguos. A veces lo hace, sin saber por qué nunca se soluciona. Puede eliminar fácilmente los núcleos antiguos si sabe en qué paquetes vinieron.

Primero verifique uname -apara verificar su versión actual.

Luego ejecute el siguiente comando:

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

Este comando enumerará todos los paquetes que ya no necesita. No me gusta eliminarlos automáticamente, me gusta tener el control cuando se trata de eliminar núcleos. Entonces, para cada paquete enumerado, haga lo siguiente:

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

Intermezzo

Este intermezzo describe con más detalle cómo funcionan los comandos e intenta solucionar un problema linux-libc-dev:amd64. La mayoría de los usuarios pueden omitir este párrafo.

  • dpkg -l 'linux-*' enumere todos los paquetes que tienen un nombre que comienza con 'linux-'
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" encontrar la versión actual del kernel en ejecución
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Elimine todas las líneas, excepto las que contienen el número de versión actual del núcleo en ejecución
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ Para cada línea enumere solo el nombre del paquete
  • /[0-9]/!d Eliminar líneas que no contienen números.

Para solucionar el problema de Frederick Nord, creo que el comando se puede modificar de la siguiente manera:

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

Básicamente agrega un filtro adicional:

  • / ^ linux- (encabezados \ | imagen) /! d Elimine todas las líneas que no comienzan con linux-headersolinux-image

/Intermezzo

Donde some-kernel-packagese puede reemplazar con uno de los paquetes enumerados. Solo tenga en cuenta que no elimina los paquetes del núcleo que están en uso actual (como se enumera en el uname -a) por ejemplo. sudo apt-get purge -y linux-headers-3.0.0-12etc.

Se puede automatizar aún más usando el comando xargs, pero eso no me gusta. Es una cosa personal. Sin embargo, aquí está el comando para hacerlo:

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

Así es /bootcomo se ve mi , un kernel de repuesto (2.6.38-11) por si acaso y 3.2.0-24 es actual:

$ 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

Y uso del sistema de archivos:

$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5  228M  63M  154M  29% /boot
jippie
fuente
2
Esta solución se inspiró en gran medida en un artículo de OzzyFrank en ubuntugenius.wordpress.com/2011/01/08/…
jippie
66
Sí, ¿por qué es este un problema? Esto no debería estar en manos del usuario.
Elijah Lynn el
2
FWIW: Esto también coincidió con linux-libc-dev: amd64 para mí. Por lo tanto, puede ser un poco demasiado generoso.
Frederick Nord,
44
It does that sometimes, not sure why it is never fixedUbuntu ha tomado la decisión, para bien o para mal, de proporcionar nuevos núcleos regulares como nuevos paquetes en lugar de como actualizaciones a los paquetes existentes, para dar la opción de tener múltiples núcleos instalados y cambiar entre ellos a voluntad. Estoy de acuerdo en que esta suposición no se adapta al 95% de las personas que solo quieren el último kernel (y tal vez una alternativa en caso de nuevos problemas de arranque), y que no quieren administrar los núcleos instalados ellos mismos. Quizás en el futuro Ubuntu cambie este comportamiento. Por ahora, asegúrese de que su / boot sea enorme.
thomasrutter
1
@thomasrutter Si usted (como yo y el 95% de las personas de las que habla) cree que este error es importante, vote aquí: bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1183692
FriendFX
46

sudo apt-get autoremove

hizo el truco para mí, limpió con éxito todos los paquetes de kernel no utilizados.

top-less
fuente
3
Esto no es correcto. from man apt-getautoremove se usa para eliminar paquetes que se instalaron automáticamente para satisfacer las dependencias de algunos paquetes y que ya no son necesarios. un kernel no se instalaría para satisfacer las dependencias, se instalan durante las actualizaciones.
Dward
55
@neon_overload Acabo de publicarlo porque hizo el truco, para mí.
topless
1
@dward Me liberó un poco de espacio: antes del retiro automático: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot después: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan Rogin
66
Debe haber un botón para realizar esta tarea en el cuadro de diálogo "No hay suficiente espacio libre en el disco". Esto ayudaría especialmente a los usuarios novatos que no están familiarizados con la línea de comandos.
Martin R.
1
Hice el truco sin romper mi sistema operativo
Ruthvik Vaila
8

Equivalente a la respuesta aceptada: otra forma (posiblemente) más fácil es instalar la ubuntu-tweakherramienta, se puede descargar desde aquí . Vaya a "Conserje" y seleccione "Kernel antiguo" para limpiar. Se puede hacer en unos pocos clics. (probado en el escritorio 14.04)

ingrese la descripción de la imagen aquí

Yixing
fuente
La situación con falta de espacio /bootocurre todo el tiempo, así que esta es mi solución favorita: una aplicación fácil de ejecutar que hace el trabajo con un solo clic.
s3m3n
2

En comparación con otras respuestas GUI aquí, la ventaja de esta respuesta es que Ubuntu Bash nativo se usa sin instalar aplicaciones de terceros.

Solución basada en Zenity y Bash

Zenity proporciona una agradable interfaz GUI al terminal para procesar una lista y seleccionar elementos con botones de radio :

rm-kernels 1

El núcleo actual con el que arrancó no se puede eliminar y no se incluye en la lista. El tamaño informado es cuánto se guardará en el /bootdirectorio. Se guarda más en su disco porque los binarios del núcleo también residen en otras áreas. Nota del 27 de julio de 2017: los directorios /usr/src/*kernel_version*y /lib/modules/*kernel_version*ahora también están incluidos.

La fecha de modificación se descubre con el statcomando En mi sistema, esa fecha se "toca" cada vez que se inicia el kernel usando este script de reinicio cron ( ¿Cómo saber cuándo se arrancó por última vez una versión específica del kernel? ) . Sin embargo, en su sistema, la fecha será la fecha de lanzamiento del kernel, no la última vez que lo inició.

apt-get purge te da la oportunidad de abortar

Se le da una oportunidad final para ver todo lo que se purgará y ver el espacio total en disco (algo engañoso) que se recuperará:

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] 

El código

Copie este código en un archivo ejecutable nombrado rm-kernelsen /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

NOTA: Necesita permiso de sudo para crear el archivo, así que use:

gksu gedit /usr/local/bin/rm-kernels

Para hacer que el archivo sea ejecutable use:

sudo chmod +x /usr/local/bin/rm-kernels

NOTA: Para ver una versión del servidor (basada en texto, no GUI) de este script, consulte: ¿Cómo elimino las versiones antiguas del kernel para limpiar el menú de arranque?


28 de julio de 2017 Actualizaciones

Se tomó el tamaño calculado de cada núcleo, de los /boot/*kernel_version*cuales había 5 archivos con un total de ~ 50 MB. La fórmula ha cambiado para incluir los archivos en /usr/src/*kernel_version*y /lib/modules/*kernel_version*. El tamaño calculado para cada núcleo es ahora ~ 400 MB. El código anterior para rm-kernelsy rm-kernels-serverha sido actualizado. Sin embargo, las pantallas de muestra anteriores aún no reflejan estos cambios.

El valor predeterminado es estimar el tamaño de los archivos para los encabezados de Linux a 125 MB y la imagen de Linux a 220 MB porque dupuede ser extremadamente lento a menos que los archivos estén en caché. Para obtener el tamaño real usando dupase cualquier parámetro al script.

El total de todos los tamaños de kernel (excluyendo la versión actual que no se puede eliminar) ahora se muestra en la barra de título.

El cuadro de diálogo utilizado para mostrar la Fecha de último acceso de cada Kernel . Esta fecha puede sobrescribirse en masa para todos los núcleos durante la copia de seguridad u operaciones similares. El cuadro de diálogo ahora muestra la Fecha de modificación en su lugar.

WinEunuuchs2Unix
fuente
¡Eres fabuloso! Realmente genial, gracias! ¡Me hiciste feliz!
zhartaunik
0

Puede manejar fácilmente los núcleos a través del administrador de paquetes sináptico. Pero primero debe saber un nombre de lanzamiento de kernel utilizado actualmente, en el indicador de terminal:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic Entonces, al menos esta versión debe mantenerse intacta. Abra Synaptic y comience a completar el marcador de posición de filtro rápido como se muestra a continuación: ingrese la descripción de la imagen aquí Ahora puede seleccionar todos los paquetes que desea eliminar y hacer lo siguiente: Marcar para eliminación completa -> Aplicar . Sugeriría mantener al menos un último paquete de kernel actual y un kernel anterior. Por ejemplo, en este caso puede deshacerse de linux-image-4.4.0-66-generic y linux-image-extra-4.4.0-66-generic de forma segura , pero es bueno mantener 4.4.0-72 y, por supuesto, 4.4.0-75 .

extranjero
fuente
0

Para facilitar la línea de comandos:

https://github.com/erichs/bootnukem

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

Entonces

sudo bootnukem --dry-run
Jonathan
fuente