Mengapa file initrd lama dari kernel yang dihapus instalasinya mengisi / mem-boot partisi?

12

Pada beberapa mesin Ubuntu saya terus-menerus menghadapi masalah partisi boot penuh walaupun saya selalu menghapus semua kernel lama. Masalahnya tampaknya terjadi, karena banyak initrdfile ada di partisi boot meskipun kernel yang terkait sebenarnya tidak diinstal. Memberi contoh:

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

Tetapi hanya linux-image-4.4.0-104-generic dan linux-image-4.4.0-109-generic yang diinstal:

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

Jika saya menghapus file initrd yang tidak perlu secara manual mereka akan dihasilkan lagi segera setelah saya mencoba melakukan upgrade.

Apa yang bisa menjadi penyebab masalah ini dan bagaimana saya bisa menyingkirkan file-file itu secara permanen?

pengguna5950
sumber
1
Bagaimana Anda menghapus paket yang sesuai dengan versi ini?
muru
1
@muru Saya tidak ingat pernah melakukannya dengan cara lain, selain membersihkannya apt-get autoremove.
user5950

Jawaban:

12

Anda harus memeriksa kernel yang dihapus sebagian

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

dan hapus dengan misalnya sudo apt-get purge linux-image-4.4.0-101-generic.

Purging akan menghapus aturan generasi initramfs dari /var/lib/initramfs-tools/.

Jika tidak membantu, Anda dapat menghapusnya secara manual dari daftar 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

Biasanya saya menjalankan purge-old-kernelsdiikuti sudo apt-get autoremovehanya memiliki 2 kernel baru.

Anda dapat menginstal ulang kernel yang diinstal dengan initramfses mereka:

sudo apt-get install --reinstall \
$(dpkg -l linux-image-\* | grep ^ii | awk '{print $2}')
N0rbert
sumber
1
Ini sepertinya bekerja dengan cukup baik. Singkatnya: ada beberapa kernel yang hanya dihilangkan sebagian. Saya melihat dan menghapusnya seperti dijelaskan di atas. Kemudian saya harus menghapus initrdfile yang tidak perlu dari boot secara manual sekali lagi untuk membebaskan beberapa ruang di sana, dan masalah diselesaikan! Terima kasih!
user5950
Seperti yang saya baca, ini adalah bentuk yang buruk untuk digunakan rmuntuk apa pun yang dirilis ke initrdatau kernel atau header. Ada beberapa perintah yang tersedia yang akan menangani penghapusan file kernel / header / initrd.img yang dihapus sebagian untuk Anda. Lihat update-initramfs. Lihat jawaban saya di bawah ini untuk lebih jelasnya.
Daniel
1

Jika Anda sudah menggunakan dpkguntuk membersihkan kernel / header dan jika Anda telah diperiksa dpkg -ldan masih tidak melihat kernel / header dipasang di sana, tetapi Anda masih melihat referensi untuk ini kernel lama di /bootdalam bentuk initrd-imgfile, maka cara yang tepat untuk membersihkan referensi dan file ini adalah dengan update-initramfsperintah.

Misalnya, jika Anda baru saja 4.4.0-109menginstal, tetapi Anda masih melihat yang berikut ini di /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

Anda dapat dengan aman menghapus 4.4.0-104dan 4.4.0-103dari /bootdengan perintah berikut:

$ 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

Dua perintah pertama menghapus referensi ke kernel tersebut dalam initramfsaturan pembuatan serta file dalam /boot. Perintah terakhir memberitahu initramfs untuk membuat ulang initrd.imgfile berdasarkan aturan yang diperbarui.

Secara teoritis Anda juga bisa menggunakan

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

untuk menghapus beberapa kernel sekaligus, tetapi untuk beberapa alasan ini tidak berhasil untuk saya.

Daniel
sumber
+1 - Ini adalah metode yang benar (dan jawaban) untuk initrd yatim.
bshea