Por que os arquivos initrd antigos dos kernels desinstalados estão preenchendo a partição de inicialização / inicialização?

12

Em várias máquinas Ubuntu, estou constantemente enfrentando o problema de uma partição de inicialização completa, embora sempre remova todos os kernels antigos. O problema parece ocorrer, pois há muitos initrdarquivos na partição de inicialização, mesmo que os kernels relacionados não estejam realmente instalados. Para dar um exemplo:

root@Jacobi:/boot# ls -lah
insgesamt 202M
drwxr-xr-x  3 root root 3,0K Jan 30 10:03 .
drwxr-xr-x 25 root root 4,0K Jan 30 10:03 ..
-rw-r--r--  1 root root 1,2M Dez 11 15:36 abi-4.4.0-104-generic
-rw-r--r--  1 root root 1,2M Jan  9 22:28 abi-4.4.0-109-generic
-rw-r--r--  1 root root 1,2M Jan 19 14:06 abi-4.4.0-112-generic
-rw-r--r--  1 root root 187K Dez 11 15:36 config-4.4.0-104-generic
-rw-r--r--  1 root root 187K Jan  9 22:28 config-4.4.0-109-generic
-rw-r--r--  1 root root 187K Jan 19 14:06 config-4.4.0-112-generic
drwxr-xr-x  5 root root 1,0K Jan 30 10:03 grub
-rw-r--r--  1 root root  10M Jan 30 10:03 initrd.img-3.13.0-39-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-101-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-103-generic
-rw-r--r--  1 root root  38M Jan 30 10:02 initrd.img-4.4.0-104-generic
-rw-r--r--  1 root root  38M Jan 30 10:02 initrd.img-4.4.0-109-generic
-rw-r--r--  1 root root  10M Jan 30 10:03 initrd.img-4.4.0-38-generic
-rw-r--r--  1 root root  10M Jan 30 10:03 initrd.img-4.4.0-45-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-59-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-77-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-81-generic
-rw-r--r--  1 root root 179K Jan 28  2016 memtest86+.bin
-rw-r--r--  1 root root 181K Jan 28  2016 memtest86+.elf
-rw-r--r--  1 root root 181K Jan 28  2016 memtest86+_multiboot.bin
-rw-------  1 root root 3,8M Dez 11 15:36 System.map-4.4.0-104-generic
-rw-------  1 root root 3,8M Jan  9 22:28 System.map-4.4.0-109-generic
-rw-------  1 root root 3,8M Jan 19 14:06 System.map-4.4.0-112-generic
-rw-------  1 root root 6,8M Dez 11 15:36 vmlinuz-4.4.0-104-generic
-rw-------  1 root root 6,8M Jan  9 22:28 vmlinuz-4.4.0-109-generic
-rw-------  1 root root 6,8M Jan 19 14:06 vmlinuz-4.4.0-112-generic

Mas apenas linux-image-4.4.0-104-generic e linux-image-4.4.0-109-generic estão instalados:

root@Jacobi:/boot# dpkg -l linux-image-\* | grep ^ii
ii  linux-image-4.4.0-104-generic       4.4.0-104.127 amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-4.4.0-109-generic       4.4.0-109.132 amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-104-generic 4.4.0-104.127 amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-109-generic 4.4.0-109.132 amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP

Se eu excluir manualmente os arquivos initrd desnecessários, eles serão gerados novamente assim que eu tentar fazer uma atualização.

Qual poderia ser a causa desse problema e como posso me livrar desses arquivos permanentemente?

user5950
fonte
1
Como você removeu os pacotes correspondentes a essas versões?
muru
1
@ muru Não me lembro de tê-lo feito de outra maneira, além de eliminá-los apt-get autoremove.
usar o seguinte comando

Respostas:

12

Você deve verificar os kernels parcialmente removidos com

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

e remova-os com, por exemplo sudo apt-get purge linux-image-4.4.0-101-generic.

A limpeza removerá as regras de geração do initramfs /var/lib/initramfs-tools/.

Se isso não ajudar, você pode removê-los manualmente da lista initramfs:

sudo rm /var/lib/initramfs-tools/3.13.0-39-generic
sudo rm /var/lib/initramfs-tools/4.4.0-101-generic
sudo rm /var/lib/initramfs-tools/4.4.0-103-generic
sudo rm /var/lib/initramfs-tools/4.4.0-38-generic
sudo rm /var/lib/initramfs-tools/4.4.0-45-generic
sudo rm /var/lib/initramfs-tools/4.4.0-59-generic
sudo rm /var/lib/initramfs-tools/4.4.0-77-generic
sudo rm /var/lib/initramfs-tools/4.4.0-78-generic
sudo rm /var/lib/initramfs-tools/4.4.0-81-generic

Normalmente eu corro purge-old-kernelsseguido por sudo apt-get autoremoveter apenas 2 kernels recentes.

Você pode reinstalar os kernels instalados com o initramfses:

sudo apt-get install --reinstall \
$(dpkg -l linux-image-\* | grep ^ii | awk '{print $2}')
N0rbert
fonte
1
Isso parece funcionar muito bem. Resumindo: de alguma forma, havia muitos núcleos apenas parcialmente removidos. Eu os localizei e os removi como descrito acima. Então eu tive que remover initrdmanualmente os arquivos desnecessários do formulário de inicialização novamente para liberar espaço lá, e pronto, o problema foi resolvido! Obrigado!
usar o seguinte comando
Como eu li, é uma má forma de usar rmpara qualquer coisa relacionada a initrdkernels ou headers. Existem alguns comandos disponíveis que manipularão a remoção de arquivos kernels / headers / initrd.img parcialmente removidos para você. Veja update-initramfs. Veja minha resposta abaixo para mais detalhes.
Daniel Daniel
1

Se você já tiver usado dpkgpara purgar os kernels / cabeçalhos e se você já verificou dpkg -le ainda não vê os kernels / headers instalado lá, mas você ainda ver referências a esses kernels antigos em /bootna forma de initrd-imgarquivos, então a forma apropriada limpar essas referências e arquivos é com o update-initramfscomando

Por exemplo, se você 4.4.0-109instalou apenas , mas ainda vê o seguinte em /boot:

-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-103-generic
-rw-r--r--  1 root root  38M Jan 30 10:02 initrd.img-4.4.0-104-generic
-rw-r--r--  1 root root  38M Jan 30 10:02 initrd.img-4.4.0-109-generic

Você pode remover com segurança 4.4.0-104e 4.4.0-103de /bootcom os seguintes comandos:

$ sudo update-initramfs -d -k 4.4.0-103-generic
$ sudo update-initramfs -d -k 4.4.0-104-generic
$ sudo update-initramfs -c -k all

Os dois primeiros comandos excluem as referências a esses kernels nas initramfsregras de geração, bem como aos arquivos /boot. O último comando diz ao initramfs para regenerar os initrd.imgarquivos com base nas regras atualizadas.

Teoricamente, você também pode usar

$ sudo update-initramfs -d -k 4.4.0-{103,104}-generic

excluir vários kernels de uma só vez, mas por algum motivo isso não funcionou para mim.

Daniel
fonte
+1 - Este é o método correto (e a resposta) para initrd órfãos.
bshea 25/02