Mi partición / boot alcanzó el 100% y ahora no puedo actualizar. No se pueden eliminar granos viejos para hacer espacio

154

Mi primer problema fue cuando intenté apt-get updateo apt-get upgrade. En la actualización me sale el siguiente error:

You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not installed
E: Unmet dependencies. Try using -f.

Intenté ejecutar apt-get install -f y este fue el resultado (después de decir que sí en el indicador)

(Reading database ... 186183 files and directories currently installed.)
Unpacking linux-image-3.2.0-27-generic (from .../linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb) ...
Done.
dpkg: error processing /var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb (--unpack):
 failed in write on buffer copy for backend dpkg-deb during `./boot/System.map-3.2.0-27-generic': No space left on device
 No apport report written because the error message indicates a disk full error
                                                                          dpkg-deb:    error: subprocess paste was killed by signal (Broken pipe)
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.2.0-27-generic   /boot/vmlinuz-3.2.0-27-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.2.0-27-generic /boot/vmlinuz-3.2.0-27-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Intenté ejecutar apt-get autoremovey me da el mismo error que apt-get upgrade.

Cuando corro df, obtengo esto para /boot:

/dev/sda1                    233191     230297         0 100% /boot

Entonces, leí en otra parte que debería tratar de purgar los núcleos viejos. Verifiqué qué núcleos tenía con:

$ dpkg -l linux-image-\* | grep ^ii
ii  linux-image-2.6.38-13-server  2.6.38-13.52  Linux kernel image for version 2.6.38 on x86_64
ii  linux-image-3.0.0-13-server   3.0.0-13.22   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-14-server   3.0.0-14.23   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-15-server   3.0.0-15.26   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-16-server   3.0.0-16.29   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-17-server   3.0.0-17.30   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.2.0-24-generic  3.2.0-24.39   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-25-generic  3.2.0-25.40   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-26-generic  3.2.0-26.41   Linux kernel image for version 3.2.0  on 64 bit x86 SMP

Cuando trato de eliminar el más antiguo con esto:

$ sudo apt-get purge linux-image-2.6.38-13-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not going to be     installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

¿Cómo puedo liberar o extender el arranque sin estropear mi instalación?

Strifey16
fuente
Creo que la respuesta de @ mreiter puede ser la mejor: utiliza el administrador de paquetes y funcionó cuando otros comandos del administrador de paquetes fallaron, al menos para mí: askubuntu.com/a/205776/247661
Aaron Hall
1
@dskrvk ¡Sí! ¿Por qué Remove-Unused-Dependenciesno es el predeterminado?
Steven R. Loomis

Respuestas:

130

Liberando espacio en el sistema de archivos raíz

Para liberar espacio en el sistema de archivos raíz, puede intentar ejecutar apt-get clean.

Si eso no funciona, puede ir /var/cache/apt/archivesy eliminar manualmente algunos archivos del caché para recuperar algo de espacio, por ejemplo:

sudo rm linux-headers-*

.debSi es necesario , no hará daño eliminar todos los archivos aquí, eso es lo que apt-get cleanhace. Se volverán a descargar automáticamente aptsi se vuelven a necesitar.

Liberando espacio en el sistema de archivos / boot

El póster original tiene una /bootpartición separada , y eso es lo que está lleno y evita que el aptsistema funcione. Será necesario que libere espacio allí.

Si hay casi suficiente espacio, vaya /booty elimine uno o dos archivos de configuración:

sudo rm config-3.2.0-19-generic-pae

por ejemplo, pero usando el nombre de una de las versiones del núcleo que tiene intención de eliminar de todos modos. Esto liberará un poco de espacio (aproximadamente 144K cada uno).

Si necesita más espacio eliminar de forma individual viejos vmlinuz, initrd, abiy System.maplos archivos hasta que haya suficiente espacio (alrededor de 22M para una de mis versiones del kernel i386).

Hagas lo que hagas, no los elimines a todos . Al menos debe mantener las dos últimas versiones coincidentes de cada tipo de archivo, para cada tipo de núcleo que utilice.

Luego proceda con sus comandos de instalación de apt-get. Como se mencionó anteriormente, es posible que tengan que volver a descargar algunas de las debs que eliminó, pero si es así, eso sucederá automáticamente. Cuando haya vuelto a trabajar, limpie utilizando apt-get para eliminar los paquetes correspondientes a los archivos que eliminó, para que todo coincida.


El archivo de configuración en /bootes la configuración del núcleo que utilizó el equipo del núcleo para construir el núcleo del mismo nombre. Debería ser inofensivo eliminarlo a menos que lo desee como referencia o para ayudarlo a construir sus propios núcleos.

Finalmente, está eliminando manualmente uno o dos paquetes de kernel antiguos de la /bootpartición para dejar aún más espacio para el nuevo.

John S Gruber
fuente
Intenté eliminar casi todas las configuraciones. Todavía no parece tener suficiente espacio. ¿Qué otros archivos allí serían seguros de eliminar? Mi sistema de archivos raíz no está casi lleno, así que no me preocupa.
Strifey16
Actualicé mi respuesta con los archivos adicionales para eliminar a mano. Me parece que sería suficiente eliminar los conjuntos 3.0.0.13 y 3.0.0.14 (cinco archivos para el conjunto, incluido el archivo abi).
John S Gruber
2
Esto lo solucionó. Me di cuenta de que probablemente se reduciría a eliminar archivos a mano, pero siempre dudo en hacer eso con cualquier cosa instalada por apt, así que pensé en preguntar aquí primero.
Strifey16
99
No lo use sudo rmpara eliminar / arrancar. En su lugar, use sudo dpkg --purgepara eliminar algunos paquetes viejos de linux-image. A partir de entonces, use sudo apt-get -f installpara arreglar la dependencia rota.
jarno
44
Aunque en algún momento el sistema puede estar tan lleno que incluso dpkg no puede funcionar. Pero rmse puede usar entonces.
jarno
66

En mi caso, los aptcomandos y el dpkgcomando no pudieron finalizar y no pudieron eliminarse. La actualización automática había fallado en la instalación 2.6.32-56-server.

Mi primer paso fue identificar el espacio que se utilizará,

cd /boot
du -sk *|sort -n

Tenía unos 30 núcleos y archivos de soporte.

Hice una uname -apara obtener el kernel en ejecución, identifiqué que estaba en Linux alternativo 2.6.32-43-servere hice una tarde 6 de las versiones que no se estaban ejecutando y que eran viejas.

tar -cvf ~username/boot.tar *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Luego hice algo rm -rfde lo que había respaldado:

rm -rf *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Estoy mostrando estos comandos como ejemplos, tendrá que decidir con qué trabajará para su situación.

Ahora que tenía algo de espacio /boot, pude correr

apt-get -f install 

Para limpiar la instalación fallida de 2.6.32-56-server.

Entonces hice un

apt-get remove linux-headers-2.6.32-38 linux-headers-2.6.32-38-server linux-image-2.6.32-38-server
apt-get remove linux-headers-2.6.32-39 linux-headers-2.6.32-39-server linux-image-2.6.32-39-server

Esto me dio espacio para devolver lo que había respaldado.

tar -xf ~username/boot.tar
rm  ~username/boot.tar    

Para limpiar, entonces podría ejecutar:

apt-get autoremove

Reinicié y ahora estoy usando 4% de /boot.

AG Russell
fuente
Esto fue lo más útil para mí de todas las sugerencias. ¡Muchas gracias!
Joshua F. Rountree
eliminar archivos de / boot simplemente rompe horriblemente apt y dpkg ya que sus scripts de instalación y eliminación fallan DURO cuando faltan los archivos. No veo cómo conseguiste que esto funcione.
FizxMike
20

Puede usar en dpkglugar de apt-geteliminar los núcleos más antiguos:

sudo dpkg -r linux-image-3.2.0-29-generic
psusi
fuente
Tal vez hay ventajas por usar esto, pero la sugerencia de @ mreiter funcionó para mí cuando esta no (esta fue sugerida en el canal de soporte IRC de ubuntu).
Aaron Hall
3
@AaronHall Esta respuesta simplemente contiene la parte clave de la respuesta de mitre (la última línea) y es mucho más corta ya que no cubre la limpieza de los encabezados (lo que no ayuda en el caso de una /bootpartición separada ).
Melebius el
9

Noté que todavía había algunos archivos de las versiones anteriores en el directorio de arranque:

$ ls /boot
vmcoreinfo-2.6.31-17-server

Y el administrador de paquetes enumeraría las versiones anteriores:

dpkg -l | grep linux-image

Por lo tanto, usé este comando ( autoremovetambién eliminaría imágenes más recientes que no quiero eliminar)

sudo apt-get purge linux-image-2.6.31-17-server

Todavía me quedaban algunos encabezados:

dpkg -l | grep linux-headers

Entonces hice esto:

sudo apt-get purge linux-headers-2.6.32-34

Finalmente quedaba un paquete que no pude eliminar con apt-get purge:

$ dpkg -l | grep linux-image
rc  linux-image-2.6.28-11-server

Fuente: eliminar un paquete marcado como rc por dpkg

sudo dpkg --purge linux-image-2.6.28-11-server
mitre
fuente
3

Compruebe el uso de /var/tmpcon du -sh /var/tmp/. Todos los archivos en esa carpeta se pueden eliminar para hacer espacio.

Luego puede ejecutar lo siguiente para eliminar los núcleos antiguos:

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub
Tercio
fuente
¿Qué /var/tmptiene que ver con los granos viejos? Y no siempre es seguro eliminar todo en /var/tmp...
fosslinux
3

Esto es lo que usé:

sudo apt-get autoremove linux-image-xxxx

Haga eso para todos los núcleos antiguos y solo mantenga los dos más recientes.

Si desea eliminar automáticamente los núcleos antiguos y actualizar GRUB, vea esto: Documentación de Ubuntu

Samer
fuente
2
Esta debería ser la respuesta aceptada. Si no le importa limpiar todo, ni siquiera necesita especificar la imagen de Linux.
CyberEd
2

Descubrí que lo único que funcionaba para mí era usar Aptitude.

sudo aptitude

Luego, cuando se abre, generalmente dirá algo sobre dependencias insatisfechas en la parte inferior. Puede presionar la letra gpara continuar con la eliminación sugerida. Te llevará a una página donde enumera lo que va a suceder.

Debe haber un signo menos al -lado de los núcleos rotos. Presione gnuevamente y eliminará los granos rotos. Presione qpara salir. Entonces debería poder usar sudo apt-get autoremovepara deshacerse de los núcleos antiguos y liberar espacio.

Matthew Swanson
fuente
1
Esta es la ÚNICA respuesta válida. todas las otras respuestas no funcionaron, ya que el administrador de paquetes quería instalar un paquete antes de que pudiera eliminar cualquier cosa.
machineaddict
2

No puede actuar sobre paquetes, pero puede actuar sobre otros archivos. Primero, revise su carpeta de inicio y vea si hay algo que pueda eliminar. De lo contrario, intente mover una buena cantidad de archivos a otra partición (o una unidad flash) y luego intente sudo apt-get install -fsolucionar los problemas de dependencia del paquete (lo más probable es que haya instalado un archivo .deb dpkg) y luego purgue los núcleos antiguos. Una vez que tenga al menos 10 MB de forma segura, intente depurar software o archivos innecesarios.

ζ--
fuente
55
La carpeta de inicio no está en / boot
Thorbjørn Ravn Andersen
1

Utilice Synaptic Package Manager. Simplemente elija el paquete que desea eliminar y le pedirá que también elimine los paquetes que dependen de él. En mi experiencia, los paquetes de kernel siempre vienen en grupos de dos (o más, dependiendo de cómo cuente) que son interdependientes. Por lo general, puede encontrar los antiguos rápidamente utilizando el filtro "local / obsoleto".

Wegko
fuente
2
Por ejemplo, en un servidor (solo texto), no hay Synaptic. Por lo tanto, no es realmente una solución viable para servidores.
nerdoc
1

He estado luchando con este problema de vez en cuando, y todavía no he visto ninguna solución que realmente haga el trabajo completo. En algunos casos, eliminar los núcleos antiguos termina en dependencias que me impiden eliminar cualquier cosa y tuve que eliminar los núcleos manualmente de / boot. Sin embargo, todavía quería hacer todo el trabajo, ya que imagino que los núcleos eliminados manualmente se registran en algún lugar y pueden causar problemas en el futuro, cuando algo informa que faltan archivos por estar sentado haciendo rm -rf en los archivos.

Así que escribí este script, basado en muchas sugerencias de Google aquí que no requieren ninguna instalación adicional de algo. El script se ha modificado varias veces para admitir algunas de mis propias situaciones "inesperadas". Por ejemplo, al ejecutar esto en una frambuesa pi, update-grub probablemente no existe. Y en algunos casos, cuando se ejecutaban los últimos actualizadores, los servidores estaban atascados con IPv6 donde algunos sitios eran inaccesibles.

El script determina si tiene que eliminar forzosamente los núcleos que están completamente atascados debido a las compilaciones de dependencia, o si puede hacerlo de la manera "correcta".

#!/bin/bash

ipv4="-o Acquire::ForceIPv4=true"

if [ "$1" = "4" ] ; then
    withip=$ipv4
    echo "Going IPv4 ($withip)"
fi

echo "Autoremove+Purge."
apt-get $withip -y -f autoremove --purge >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "Auto Removal Failed!"
fi

echo "Old dependency fix."
apt-get $withip -f -y install >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "That failed. So we'll try to make up to it during this process."
fi

echo "Now, going old kernel cleanup!"
kern=$(dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r`)
hadErrors=0

for k in $kern
do
    echo apt-get -y purge $k
    apt-get $withip -y purge $k >/dev/null 2>&1

    if [ "$?" != "0" ] ; then
        echo "Failed apt-purge... Using plan B (--force-all -P)..."
        dpkg --force-all -P $k >/dev/null 2>&1
        echo "Rerunning stuff (apt-get -f -y install) for dependencies..."
        apt-get $withip -f -y install >/dev/null 2>&1
        if [ "$?" != "0" ] ; then
            echo "Still failing..."
            hadErrors=1
        fi
    fi
done

if [ "$hadErrors" = "1" ] ; then
    echo "I had errors. I should rerun this process, to see if there are more kernels that were left out after cleanup..."
    /usr/local/tornevall/cleankernel
fi

apt-get $withip autoremove
apt-get $withip update
apt-get $withip upgrade
apt-get $withip dist-upgrade

grb=$(which update-grub)
if [ "" != "$grb" ] ; then
    update-grub
else
    echo "Can't upgrade grub since update-grub is missing..."
fi
Tomás Tornevall
fuente
¿Intentaste con Linux-Purge ? Sin embargo, actualmente no tiene esa cosa de Force IPv4.
jarno
Su script purgaría linux-image-generic en mi sistema, lo cual es malo.
jarno
Por alguna razón, se vuelven a colocar cuando se han limpiado los núcleos antiguos. Al menos este ha sido el caso para mí desde que construí este script. Sin embargo, este script es algo que uso cuando no hay otras opciones para continuar. Normalmente, las actualizaciones se ocupan de esto por sí mismas, pero cuando se trata de este momento, cuando nada más funciona, esta puede ser una buena opción, ya que generalmente vienen más núcleos que se configurarán después de la limpieza. Si esto bueno o malo es probablemente discutible.
Tomas Tornevall
0

Simplemente correr sudo apt-get -f autoremoveresolvió mi problema.

forzagreen
fuente
2
¿Tenía 100% de espacio en disco / uso de arranque?
fosslinux
Mirando mi historial de monitoreo, no parecía. PD: Estoy en Vagrant xenial, y mi sistema de archivos de arranque /dev/sda1se monta en/
forzagreen
0

Ejecuta esto:

sudo apt-get autoremove
sudo apt-get --purge remove && sudo apt-get autoclean
sudo apt-get -f install
sudo dpkg-reconfigure -a

Fuente: me sale este error después de la actualización. por favor ayuda

Ardi Nusawan
fuente
¿Qué hace sudo dpkg-reconfigure -a this? En Ubuntu 16 dice su opción desconocida -a
Shivam Kotwalia
Para esta pregunta, aptno se eliminarán los paquetes del kernel porque el proceso de eliminación en sí genera archivos /boot, que ya están llenos. Por eso apt-get autoremovefalla. La pregunta que está buscando es askubuntu.com/q/142926/158442 , que ya tiene autoremove, en la lista.
muru
@muru Acabo de publicarlo porque hizo el truco, para mí: D
Ardi Nusawan
Estoy seguro de que sí, lo que digo es que su problema habría sido la otra pregunta, no esta.
muru
@muru oh ok lo tengo: D
Ardi Nusawan
0

He visto un par de artículos sobre / boot llenos que no se resuelven dpkg purgando viejos núcleos de Linux, porque apt-get -f install o apt-get -f autoremov e reinstalan los núcleos.

En mi caso, al menos, los paquetes firmados y adicionales también debían eliminarse: los núcleos eran dependencias de estos paquetes, por lo que era conveniente reinstalarlos. En general, los paquetes de kernel relacionados deben purgarse antes de llamar a 'instalar'. Si intentó actualizar apt-get justo después de la purga, el mensaje de error debería haber dicho qué paquetes tenían una dependencia insatisfecha del núcleo que acababa de purgar.

En mi caso, la siguiente táctica funcionó:

#as sudo, repeat 1-3 for any old kernels; can be scripted
dpkg --force-all -P linux-image-4.4.0-112-generic 
dpkg --purge linux-image-extra-4.4.0-112-generic
dpkg --purge linux-signed-image-4.4.0-112-generic
apt-get -f install #dependency resolution didn't have work to do for kernel packages
apt-get autoremove --purge -f 
apt-get autoclean
apt-get upgrade
Rhandi Martin
fuente
0

Instale la herramienta de purga de Linux como esta .

Luego corre en la terminal:

sudo linux-purge --clear-boot --fix

Luego continúe eliminando granos por ej.

sudo linux-purge --keep 1 --choose

Extra:

Si desea usar Linux Purge para la eliminación desatendida del núcleo en lugar de usar actualizaciones desatendidas para eso, debe deshabilitar la eliminación de cosas no utilizadas editando /etc/apt/apt.conf.d/50unattended-upgrades y configurando un servicio systemd ejecutando

/usr/local/bin/linux-purge --auto-only --keep 1 --yes

cuando quieras.

jarno
fuente