Почему старые файлы initrd неустановленных ядер заполняют / загружают раздел?

12

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

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

Но устанавливаются только linux-image-4.4.0-104-generic и linux-image-4.4.0-109-generic:

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

Если я удаляю ненужные файлы initrd вручную, они будут сгенерированы снова, как только я попытаюсь выполнить обновление.

Что может быть причиной этой проблемы и как я могу навсегда избавиться от этих файлов?

user5950
источник
1
Как вы удалили пакеты, соответствующие этим версиям?
Муру
1
@muru Я не могу вспомнить, чтобы это делалось как-то иначе, чем для их чистки apt-get autoremove.
user5950

Ответы:

12

Вы должны проверить частично удаленные ядра с

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

и удалите их, например sudo apt-get purge linux-image-4.4.0-101-generic.

Очистка удалит правила генерации initramfs из /var/lib/initramfs-tools/.

Если это не помогает, вы можете удалить их вручную из списка 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

Обычно я запускаю purge-old-kernels, sudo apt-get autoremoveчтобы иметь только 2 последних ядра.

Вы можете переустановить установленные ядра с помощью их initramfses:

sudo apt-get install --reinstall \
$(dpkg -l linux-image-\* | grep ^ii | awk '{print $2}')
N0rbert
источник
1
Кажется, это работает очень хорошо. Подводя итог: кое-как было много только частично удаленных ядер. Я заметил и удалил их, как описано выше. Затем мне пришлось initrdеще раз вручную удалить ненужные файлы из boot, чтобы освободить место, и проблема решена! Благодарность!
user5950
Как я читал, это плохая форма для использования rmс любыми initrdядрами или заголовками. Доступны некоторые команды, которые будут обрабатывать удаление частично удаленных файлов kernels / headers / initrd.img. См update-initramfs. Смотрите мой ответ ниже для более подробной информации.
Даниил
1

Если вы уже использовали dpkgдля очистки ядра / заголовки и если вы уже проверили dpkg -lи все еще не видите установленные там ядра / заголовки, но вы по- прежнему видите ссылки на эти старые ядра в /bootвиде initrd-imgфайлов, то правильный путь очистить эти ссылки и файлы с помощью update-initramfsкоманды.

Например, если вы только 4.4.0-109установили, но вы по-прежнему видите следующее в /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

Вы можете безопасно удалить 4.4.0-104и 4.4.0-103из /bootследующих команд:

$ 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

Первые две команды удаляют ссылки на эти ядра в initramfsправилах генерации, а также файлы в /boot. Последняя команда сообщает initramfs о необходимости регенерировать initrd.imgфайлы на основе обновленных правил.

Теоретически вы также можете использовать

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

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

Даниил
источник
+1 - это правильный метод (и ответ) для осиротевших инициаторов.
bshea