Não é possível atualizar devido ao pouco espaço em disco na inicialização


123

Eu tento fazer, do-release-upgrade mas então eu recebo:

Espaço livre em disco insuficiente

A atualização foi interrompida. A atualização precisa de um total de 25,7 M de espaço livre no disco '/ boot'. Libere pelo menos um espaço adicional em disco de 25,7 M em '/ boot'. Esvazie o lixo e remova pacotes temporários de instalações anteriores usando o 'sudo apt-get clean'.

Saída 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

Como é que não resta espaço no boot? Aqui está a saída 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

Saída 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

Adicione a saída para ls -l /boote uname -apara sua pergunta.
Jippie

Adicione também a saída dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'à sua pergunta.
Jippie

ls -as /bootpode ser útil. Incluirá apenas os tamanhos dos arquivos.
Adempewolff 27/05

a saída de ls -l / boot é bastante longo demais postar aqui por isso aqui é um pastebin pastebin.com/yM1aEJUx
braçadeira

5
Não não é. É a causa do seu problema. Se a sua pergunta estiver ficando muito longa, alguém a editará. O uso de serviços externos como pastebin quebrará o valor da pergunta para referência futura.
Jippie

Respostas:


160

Sua partição / boot é preenchida com kernels antigos. Às vezes, faz isso, sem saber por que nunca é corrigido. Você pode remover facilmente os kernels antigos se souber em quais pacotes eles entraram.

Primeiro verifique uname -apara verificar sua versão atual.

Em seguida, execute o seguinte comando:

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

Este comando listará todos os pacotes que você não precisa mais. Não gosto de removê-los automaticamente, gosto de estar no controle quando se trata de remover os kernels. Portanto, para cada pacote listado, faça o seguinte:

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

Intermezzo

Esse intervalo descreve mais detalhadamente como os comandos funcionam e tentam corrigir um problema linux-libc-dev:amd64. A maioria dos usuários pode pular este parágrafo.

  • dpkg -l 'linux-*' listar todos os pacotes que têm um nome começando com 'linux-'
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" encontre a versão atual do kernel em execução
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Remova todas as linhas, exceto aquelas que contêm o número da versão atual do kernel em execução
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ Para cada lista de linhas, apenas o nome do pacote
  • /[0-9]/!d Remova as linhas que não contêm números.

Para corrigir o problema de Frederick Nord, acho que o comando pode ser alterado da seguinte maneira:

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

Basicamente, ele adiciona um filtro extra:

  • / ^ linux- (cabeçalhos \ | imagem) /! d Exclua todas as linhas que não iniciam com linux-headersoulinux-image

/Intermezzo

Onde some-kernel-packagepode ser substituído por um dos pacotes listados. Apenas tome cuidado para não remover os pacotes do kernel que estão em uso atual (conforme listado pelo uname -a) por exemplo. sudo apt-get purge -y linux-headers-3.0.0-12etc.

Ele pode ser automatizado ainda mais usando o comando xargs, mas eu não gosto disso. É uma coisa pessoal. No entanto, aqui está o comando para fazer isso:

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

É assim que se /bootparece, um kernel sobressalente (2.6.38-11), por precaução, e o 3.2.0-24 atual:

$ 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

E uso do sistema de arquivos:

$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5  228M  63M  154M  29% /boot

2
Esta solução foi fortemente inspirada em um artigo de OzzyFrank em ubuntugenius.wordpress.com/2011/01/08/…
jippie

6
Sim, por que isso é um problema? Isso não deve ser de responsabilidade do usuário.
Elias Lynn

2
FWIW: Isso também correspondeu ao linux-libc-dev: amd64 para mim. Portanto, pode muito bem ser um pouco generoso.
Frederick Nord

4
It does that sometimes, not sure why it is never fixedO Ubuntu tomou a decisão, para o bem ou para o mal, de fornecer novos kernels regulares como novos pacotes, e não como atualizações dos pacotes existentes, para dar a opção de ter vários kernels instalados e alternar entre eles à vontade. Eu concordo que essa suposição não se ajusta aos 95% das pessoas que querem apenas o kernel mais recente (e talvez um fallback em caso de novos problemas de inicialização) e que não desejam gerenciar os kernels instalados. Talvez no futuro o Ubuntu mude esse comportamento. Por enquanto, verifique se o seu / boot é enorme.
thomasrutter

11
@thomasrutter Se você (como eu e as 95% das pessoas de quem você está falando) acha que esse bug é importante, vote aqui: bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1183692
FriendFX

46

sudo apt-get autoremove

fez o truque para mim, limpou com êxito todos os pacotes de kernel não utilizados.


3
Isso não está correto. from man apt-getautoremove é usado para remover pacotes que foram instalados automaticamente para satisfazer dependências de alguns pacotes e que não são mais necessários. um kernel não seria instalado para satisfazer dependências, eles são instalados durante as atualizações.
dward 30/05

5
@neon_overload Acabei de publicar porque fez o truque, para mim.
topless

11
@dward Ele fez livre algum espaço para mim: antes autremove: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot depois: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan Rogin

6
Deve haver um botão para executar esta tarefa na caixa de diálogo "Espaço em disco insuficiente". Isso ajudaria especialmente usuários iniciantes que não estão familiarizados com a linha de comando.
Martin R.

11
Fez o truque sem quebrar meu SO
Ruthvik Vaila

8

Equivalente à resposta aceita - outra maneira (possivelmente) mais fácil é instalar a ubuntu-tweakferramenta, ela pode ser baixada aqui . Vá para "Janitor" e selecione "Old Kernel" para limpar. Isso pode ser feito em alguns cliques. (testado na área de trabalho 14.04)

insira a descrição da imagem aqui


Situações com falta de espaço /bootacontecem o tempo todo, então essa é a minha solução favorita - aplicativo fácil de executar que faz o trabalho com um clique.
S3m3n 28/12/2015

2

Comparado a outras respostas da GUI aqui, a vantagem desta resposta é que o Ubuntu Bash nativo é usado sem a instalação de aplicativos de terceiros.

Solução baseada em Zenity e Bash

O Zenity fornece uma interface gráfica agradável ao terminal para processar uma lista e selecionar itens com botões de opção :

rm-kernels 1

O kernel atual com o qual você inicializou não pode ser removido e não está incluído na lista. O tamanho relatado é quanto será salvo no /bootdiretório. Mais é salvo no seu disco porque os binários do kernel também residem em outras áreas. 27 de julho de 2017 nota: Os diretórios /usr/src/*kernel_version*e /lib/modules/*kernel_version*agora também estão incluídos.

A data de modificação é descoberta usando o statcomando No meu sistema, essa data é "tocada" toda vez que o kernel é inicializado usando este ( como descobrir quando uma versão específica do kernel foi inicializada pela última vez? ) Cron reboot script. No entanto, no seu sistema, a data será a data de lançamento do kernel, não a última vez que você o inicializou.

apt-get purge dá a você a chance de abortar

Você terá a oportunidade final de visualizar tudo o que será eliminado e ver o espaço total em disco (um tanto enganoso) que será recuperado:

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] 

O código

Copiar este código a um arquivo executável chamado rm-kernelsem /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: Você precisa de permissão sudo para criar o arquivo, então use:

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

Para tornar o arquivo executável, use:

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

NOTA: Para uma versão em servidor (baseada em texto, e não GUI), consulte: Como removo versões antigas do kernel para limpar o menu de inicialização?


28 de julho de 2017 Atualizações

O tamanho calculado de cada kernel foi obtido, dos /boot/*kernel_version*quais 5 arquivos totalizando ~ 50 MB. A fórmula foi alterada para incluir os arquivos em /usr/src/*kernel_version*e /lib/modules/*kernel_version*. O tamanho calculado para cada kernel é agora ~ 400 MB. O código acima para rm-kernelse rm-kernels-serverfoi atualizado. No entanto, as telas de amostra acima ainda não refletem essas alterações.

O padrão é estimar o tamanho dos arquivos dos cabeçalhos do linux em 125 MB e da imagem do linux em 220 MB, pois dupode ser extremamente lento, a menos que os arquivos estejam no cache. Para obter o tamanho real, use duqualquer parâmetro no script.

O total de todos os tamanhos de kernel (excluindo a versão atual em execução que não pode ser removida) agora é exibido na barra de título.

A caixa de diálogo usada para exibir a Data de Último Acesso de cada Kernel . Essa data pode ser sobrescrita em massa para todos os kernels durante operações de backup ou similares. A caixa de diálogo agora mostra a Data de modificação .


Você é incrível! Realmente ótimo obrigado! Você me faz feliz!
zhartaunik

0

Você pode lidar facilmente com kernels através do gerenciador de pacotes sinápticos. Mas primeiro você deve saber um nome de versão do kernel usado atualmente, no prompt do terminal:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic Portanto, pelo menos nesta versão você deve manter-se intocado. Abra o sináptico e comece a preencher o espaço reservado para filtro rápido, como mostrado abaixo: insira a descrição da imagem aqui Agora você pode selecionar todos os pacotes que deseja excluir e fazer o seguinte: Marque para remoção completa -> Aplicar . Eu sugeriria manter pelo menos um pacote de kernel atual mais recente e um kernel anterior. Por exemplo, neste caso, você pode se livrar com segurança de linux-image-4.4.0-66-generic e linux-image-extra-4.4.0-66-generic , mas é bom manter 4.4.0-72 e, é claro, 4.4.0-75 .



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.