Cara Buang Kernel Lama Ubuntu Untuk Kosongkan /boot
Apabila partition /boot penuh, apt akan gagal memasang pakej baharu dengan ralat No space left on device. Ikuti panduan ini untuk mengenal pasti dan membuang kernel lama.
Mengapa apt berhenti berfungsi apabila /boot penuh dengan kernel lama
Pada Ubuntu, setiap kemas kini kernel menulis set fail baharu ke dalam /boot dan membiarkan fail sebelumnya di situ, jadi partition /boot yang kecil akan penuh dan apt tidak lagi dapat menyelesaikan pemasangan. Pembaikan ini melibatkan dua langkah. Tentukan pakej mana pada pelayan yang merupakan kernel dan yang mana satu sedang digunakan, kemudian buang yang lain dengan apt autoremove --purge.
Urutan adalah penting. Kernel yang sedang berjalan adalah satu-satunya pakej yang tidak boleh dibuang, dan pelayan mungkin sudah berada dalam keadaan di mana apt tidak boleh dijalankan langsung. Lakukan diagnosis terlebih dahulu.
Rupa kegagalan yang sebenar
Versi kernel memasang dua fail besar ke dalam /boot: kernel yang dimampatkan (vmlinuz-<version>) dan initramfs (sistem fail RAM awal, initrd.img-<version>, arkib kecil yang dinyahzip oleh kernel sebelum ia melekapkan root sebenar). Initramfs dibina pada mesin anda semasa pemasangan, itulah sebabnya pemasangan memerlukan ruang kosong dan bukan sekadar lebar jalur muat turun. Apabila tiada ruang yang tinggal, proses binaan gagal dan menyebabkan pakej tersebut turut gagal.
update-initramfs: Generating /boot/initrd.img-6.8.0-64-generic
gzip: stdout: No space left on device
E: mkinitramfs failure gzip 1
update-initramfs: failed for /boot/initrd.img-6.8.0-64-generic with 1.
dpkg: error processing package linux-image-6.8.0-64-generic (--configure):
installed linux-image-6.8.0-64-generic package post-installation script subprocess returned error exit status 1Rentetan versi akan mengikut versi anda. Nama pemampat datang daripada COMPRESS= dalam /etc/initramfs-tools/initramfs.conf, jadi imej terkini mungkin menamakan zstd manakala imej lama menamakan gzip. Dua baris yang mengenal pasti masalah ini ialah No space left on device dan baris dpkg: error processing package di bawahnya.
Selepas itu, pakej tersebut berada dalam keadaan separuh konfigurasi. Setiap pelaksanaan apt seterusnya akan cuba mengkonfigurasinya semula, gagal dengan cara yang sama, dan berakhir dengan E: Sub-process /usr/bin/dpkg returned an error code (1). Ini adalah bahagian yang penting selain daripada ruang cakera: unattended-upgrades berjalan mengikut pemasa, menemui ralat yang sama, dan berhenti. Pelayan kelihatan sihat dan secara senyap berhenti menggunakan tampalan keselamatan. Ini juga bermakna sebarang pemasangan yang tidak berkaitan yang anda cuba lakukan akan gagal dengan baris yang sama dan kesalahan akan diletakkan pada apa sahaja yang anda tambah pada masa itu, itulah sebabnya pemasangan Tailscale yang gagal pada Ubuntu perlu dibaca sebagai ralat apt terlebih dahulu. Jika apt update gagal sebelum anda sampai ke tahap ini, itu adalah masalah berasingan, selalunya entri pendua selepas migrasi sumber deb822.
Semak sama ada /boot merupakan partition yang berasingan
Sebelum memadamkan apa-apa, kenal pasti ruang yang sebenarnya akan dikosongkan.
findmnt /boot
findmnt -T /boot
df -h /boot /Perintah pertama hanya mencetak baris jika /boot merupakan titik lekap (mount point)nya yang tersendiri. Perintah kedua sentiasa mencetak output, dan menamakan sistem fail yang sebenarnya menampung /boot. Jika kedua-duanya menamakan sistem fail yang sama seperti /, maka /boot hanyalah direktori pada sistem fail root dan ia tidak boleh penuh dengan sendirinya: sistem fail root anda yang penuh, dan kernel lama hanyalah salah satu penyumbang kepada masalah tersebut. Dalam kes itu, sudo apt clean, yang mengosongkan fail .deb yang dimuat turun di bawah /var/cache/apt/archives, akan memberikan anda ruang tambahan. Pada mesin yang mempunyai partition /boot yang sebenar, apt clean tidak akan mengosongkan apa-apa di sana, kerana cache tersebut berada pada sistem fail yang berbeza.
Sekarang, dapatkan angka yang akan anda gunakan sebagai rujukan.
df -h /boot
ls -lh /boot/vmlinuz-$(uname -r) /boot/initrd.img-$(uname -r)Bandingkan lajur Avail dengan saiz kedua-dua fail tersebut. Fail initrd adalah yang lebih besar. Kemas kini kernel seterusnya memerlukan ruang untuk sepasang fail dengan saiz yang lebih kurang sama, jadi jika Avail lebih kecil daripada saiz initrd semasa, kemas kini seterusnya pasti akan gagal.
Mencari kernel yang sedang dijalankan
uname -r
cat /var/run/reboot-required.pkgsuname -r mencetak rentetan keluaran kernel yang sedang dimuatkan dalam memori. Salin rentetan tersebut ke suatu tempat. Ia adalah satu-satunya versi yang tidak boleh anda usik.
Fail kedua hanya wujud apabila sesuatu pakej meminta but semula. Baris linux-image di dalamnya bermaksud kernel yang lebih baharu telah dipasang pada cakera dan belum digunakan, kerana mesin belum but semula sejak ia dipasang. But semula sebelum anda melakukan pembersihan jika boleh. apt melindungi kernel yang sedang berjalan dan yang terbaharu, jadi melakukan pembersihan semasa anda menjalankan kernel lama akan mengekalkan satu versi tambahan yang tidak diperlukan.
Senaraikan pakej kernel dan baca statusnya
dpkg --list | grep -E 'linux-(image|modules|headers|tools)' | awk '{print $1, $2}'Medan pertama ialah kod status dpkg. ii bermaksud dipasang dan dikonfigurasikan. iF bermaksud dipasang tetapi separuh dikonfigurasikan, iaitu keadaan yang ditinggalkan oleh naik taraf yang gagal di atas. rc bermaksud dibuang dengan konfigurasinya masih ada pada cakera, yang tidak menggunakan ruang dalam /boot dan selamat untuk dibuang sepenuhnya (purge).
Medan kedua memberitahu anda jenis pakej tersebut. Nama yang mengandungi versi, seperti linux-image-6.8.0-64-generic, ialah satu kernel khusus. Nama tanpa versi, seperti linux-image-generic, linux-headers-generic atau linux-generic, ialah meta-pakej. Ia tidak mengandungi kernel. Tugas keseluruhannya adalah untuk bergantung pada kernel berversi yang paling baharu supaya apt upgrade menarik kernel baharu masuk. Membuang meta-pakej akan menghentikan mesin daripada menerima kemas kini kernel, dan tiada amaran yang akan diberikan kepada anda selepas itu.
Keluarga pakej dibahagikan seperti berikut. linux-image-* menyimpan kernel termampat dalam /boot. linux-modules-* dan linux-modules-extra-* menyimpan pemacu di bawah /lib/modules. linux-headers-* menyimpan build headers di bawah /usr/src, yang bermaksud membuang headers akan mengosongkan ruang sistem fail root dan bukan ruang /boot. Jika masalah anda ialah partition /boot yang penuh, pakej imej adalah apa yang anda perlu cari.
ls -1 /boot/vmlinuz-*
ls -1 /lib/modules/Kedua-dua senarai ini harus selari antara satu sama lain dan dengan output dpkg --list. Direktori dalam /lib/modules yang tidak mempunyai pakej terpasang yang sepadan adalah sisa daripada tindakan memadam fail secara manual.
Bagaimana apt menentukan kernel yang perlu dikekalkan
apt autoremove tidak akan membuang kernel yang dianggap sebagai dilindungi, dan set yang dilindungi itu termasuk kernel yang sedang anda jalankan sekarang. Polisi pengekalan telah berubah antara keluaran Ubuntu, jadi bacalah polisi tersebut daripada mesin anda sendiri dan jangan hanya mempercayai nombor yang tertulis di mana-mana.
apt-config dump | grep -i -e neverautoremove -e versionedkernel
ls -l /etc/apt/apt.conf.d/01autoremove /etc/apt/apt.conf.d/01autoremove-kernelsAPT::NeverAutoRemove ialah senarai corak nama pakej yang apt autoremove enggan ubah. APT::VersionedKernelPackages ialah senarai awalan nama yang apt anggap sebagai pakej kernel berversi. Pada keluaran yang menjana /etc/apt/apt.conf.d/01autoremove-kernels, fail tersebut ditulis semula oleh /etc/kernel/postinst.d/apt-auto-removal setiap kali pakej kernel dipasang, jadi menyuntingnya secara manual tidak akan membuahkan hasil: pemasangan kernel seterusnya akan menimpa suntingan anda. Pada keluaran yang tidak mempunyai fail tersebut, apt menggunakan perlindungan yang sama secara dalaman. Walau apa pun, apt-config dump menunjukkan peraturan yang berkuat kuasa pada mesin anda, dan output tersebut merupakan jawapan yang tepat untuk keluaran anda.
Pembersihan yang selamat untuk dijalankan
sudo apt update
sudo apt autoremove --purge --dry-run--dry-run tidak mengubah apa-apa pada cakera dan mencetak dengan tepat perkara yang akan dibuang oleh proses sebenar. Baca senarai tersebut. Dua perkara harus membuatkan anda berhenti. Pakej meta seperti linux-generic atau linux-image-generic dalam senarai pembuangan bermakna sesuatu telah menandakannya sebagai automatik, dan membuangnya akan menamatkan kemas kini kernel anda. Rentetan daripada uname -r dalam senarai pembuangan bermakna kernel yang sedang berjalan tidak dilindungi, yang sepatutnya tidak berlaku dan perlu disiasat sebelum anda meneruskan.
Jika senarai tersebut kelihatan betul, jalankan proses tersebut secara sebenar.
sudo apt autoremove --purge
df -h /bootSeparuh daripada --purge memadamkan konfigurasi yang tertinggal serta pakej tersebut. Ia membebaskan sedikit ruang tambahan, dan ia memastikan dpkg --list bebas daripada pengumpulan baris rc, yang menjadikan audit seterusnya lebih mudah dibaca.
Kemudian, sahkan menu but telah dibina semula. Membuang pakej kernel menjalankan update-grub untuk anda, jadi menu tersebut sepatutnya merujuk hanya kepada fail yang masih wujud.
sudo grep -o 'vmlinuz-[^ ]*' /boot/grub/grub.cfg | sort -u
ls -1 /boot/vmlinuz-*Setiap versi dalam output pertama mesti muncul dalam output kedua. Entri menu yang menghala ke fail yang telah tiada adalah punca pelayan yang berfungsi menjadi pelayan yang terhenti pada prompt GRUB. Itu adalah salah satu laluan kepada VPS yang tidak boleh but selepas kemas kini kernel, dan ia jauh lebih sukar untuk dibaiki daripada konsol penyelamat berbanding mengelakkannya di sini.
Mengapa apt autoremove kadangkala tidak membuang apa-apa
apt autoremove hanya membuang pakej yang ditandakan sebagai automatik, iaitu pakej yang dipasang sebagai dependensi kepada perisian lain. Kernel yang anda pasang sendiri menggunakan apt install linux-image-6.8.0-40-generic ditandakan sebagai manual, dan autoremove tidak akan membuangnya walau berapa lama pun usia kernel tersebut.
apt-mark showmanual | grep -E '^linux-'Mana-mana kernel berversi dalam output tersebut tidak akan dikesan oleh autoremove. Tandakannya semula sebagai manual menggunakan rentetan versi daripada senarai anda sendiri:
sudo apt-mark auto linux-image-6.8.0-40-generic linux-modules-6.8.0-40-generic
sudo apt autoremove --purge --dry-runBiarkan pakej meta ditandakan sebagai manual. Ia sepatutnya kekal manual kerana pakej tersebut adalah apa yang anda minta untuk dipasang.
Alih keluar kernel tertentu secara sengaja
Kadangkala anda mahu versi tertentu dibuang serta-merta dan bukannya menunggu polisi membenarkannya. Namakan pakej imej tersebut dan biarkan apt menguruskan selebihnya.
sudo apt purge linux-image-6.8.0-40-genericapt akan mencetak senarai penyingkiran sebelum melakukan sebarang tindakan, kerana linux-modules-extra-* bergantung pada pakej imej tersebut dan perlu dibuang dalam transaksi yang sama. Senarai yang dicetak itu merupakan semakan keselamatan sebenar anda, dan di situlah anda boleh mengesan jika terdapat meta package yang turut terbuang bersama versi yang ingin anda alih keluar. Jawab n jika terdapat sebarang perkara yang tidak dijangka dalam senarai tersebut. Susuli dengan sudo apt autoremove --purge untuk mengumpul pakej modul dan header yang kini tidak lagi diperlukan.
Mengapa anda tidak boleh memadam kernel yang sedang berjalan
Kernel yang sudah berada dalam memori akan terus berjalan walaupun failnya telah dipadamkan, jadi tiada apa-apa yang kelihatan rosak pada mulanya. Perkara yang akan rosak ialah segala komponen yang belum dimuatkan oleh kernel tersebut. Proses pembersihan linux-modules-$(uname -r) akan memadamkan /lib/modules/$(uname -r)/, menyebabkan muatan modul seterusnya gagal:
modprobe: FATAL: Module nf_tables not found in directory /lib/modules/6.8.0-64-genericMuat semula firewall akan gagal dari titik tersebut, begitu juga dengan proses mounting jenis sistem fail yang tidak pernah dicapai oleh kernel ini sejak but. Sementara itu, /boot/vmlinuz-$(uname -r) telah tiada, jadi menu but tidak lagi menawarkan kernel yang sedang anda jalankan, dan but semula seterusnya akan membawa sistem ke lokasi lain. Mesin tersebut terus melayani trafik walaupun sudah tidak boleh dibut. Sentiasa semak uname -r berbanding senarai pemadaman setiap kali.
Apabila /boot terlalu penuh sehingga apt tidak boleh dijalankan
Ini adalah keadaan yang menyebabkan pengguna mencari halaman ini. apt autoremove memerlukan dpkg untuk melengkapkan konfigurasi pakej kernel yang separuh siap terlebih dahulu, dan langkah tersebut membina semula initramfs, yang memerlukan ruang dalam /boot yang sudah kehabisan ruang. Pecahkan gelung ini secara manual, sekali sahaja.
uname -r
ls -1 /boot/initrd.img-*Pilih satu initrd yang versinya bukan rentetan yang diberikan oleh uname -r kepada anda, dan padamkan fail tunggal tersebut.
sudo rm /boot/initrd.img-6.8.0-40-generic
sudo apt --fix-broken install
sudo apt autoremove --purge
sudo update-grubSetiap baris mempunyai sebabnya. rm ialah pengecualian sengaja yang menyebabkan dpkg percaya bahawa sesuatu fail wujud sedangkan ia tidak wujud. apt --fix-broken install melengkapkan konfigurasi yang gagal tadi, memandangkan kini terdapat ruang untuk initramfs. autoremove --purge kemudian membuang pakej yang failnya telah anda padamkan bersama-sama versi lama yang lain, yang menyelaraskan semula dpkg dengan cakera. update-grub membina semula menu daripada fail yang benar-benar wujud. Jangan but semula (reboot) antara rm dan update-grub, kerana dalam tempoh tersebut menu masih boleh merujuk kepada fail yang baru anda padamkan. Jika dpkg memberi amaran bahawa ia terganggu, sudo dpkg --configure -a melakukan pembaikan yang sama seperti apt --fix-broken install.
Tugas yang sama pada sistem dnf
Jika VPS anda menjalankan Fedora atau salah satu binaan semula RHEL seperti Rocky Linux, mekanismenya adalah terbalik. Debian dan Ubuntu melindungi kernel dengan peraturan autoremove apt dan membiarkan pembersihan dilakukan oleh anda atau dicetuskan oleh unattended-upgrades, manakala dnf menguatkuasakan kiraan yang dipanggil installonly_limit dan membuang kernel paling lama secara automatik sebaik sahaja pemasangan baharu melebihi had tersebut. Baca nilai yang berkuat kuasa dengan grep installonly_limit /etc/dnf/dnf.conf dan man 5 dnf.conf, serta kosongkan tunggakan sedia ada dengan sudo dnf remove --oldinstallonly. Kernel yang sedang berjalan juga dilindungi di sana. Untuk pemetaan yang lebih luas antara kedua-dua pengurus pakej, lihat setara arahan dnf dan apt.
Mencegah perkara ini daripada berulang
Pembersihan yang bergantung pada ingatan anda akhirnya akan gagal, jadi masukkan ia ke dalam proses yang memasang kernel. Buka /etc/apt/apt.conf.d/50unattended-upgrades dan cari kunci-kunci ini, yang mana fail asal sudah pun mengandungi baris-baris tersebut sebagai komen:
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";Nyahkomen baris tersebut daripada menambah salinan kedua di bahagian akhir. Dalam konfigurasi apt, tugasan terakhir bagi sesuatu kunci akan diguna pakai, jadi pendua akan menyebabkan fail tersebut bercanggah dengan dirinya sendiri dan menyembunyikan nilai yang sebenar. Semak hasil akhir pengurai (parser), dan perhatikan proses yang tidak mengubah apa-apa:
apt-config dump | grep -i 'Unattended-Upgrade::Remove'
sudo unattended-upgrade --dry-run --debug
sudo tail -n 40 /var/log/unattended-upgrades/unattended-upgrades.logLog adalah buktinya. Ia merekodkan setiap proses, jadi naik taraf yang gagal kerana kekurangan ruang akan terpapar di sana jauh sebelum sesiapa menyedari mesin tersebut ketinggalan dalam kemas kini tampalan (patch). Selebihnya konfigurasi tersebut diliputi dalam kemas kini keselamatan automatik pada Ubuntu.
Sebelum kernel seterusnya tiba, terdapat satu angka yang perlu disemak, dan ia adalah pasangan arahan yang sama dari permulaan panduan ini:
df -h /boot
ls -lh /boot/initrd.img-$(uname -r)Jika Avail tidak jauh lebih besar daripada fail tersebut, kernel seterusnya akan gagal tepat seperti yang diterangkan di atas, jadi betulkan sekarang dan bukannya semasa proses naik taraf. Semakan ini berbaloi untuk dilakukan selama seminit bersama-sama semakan kesihatan cakera pada VPS anda yang lain. Ia paling penting dilakukan tepat sebelum naik taraf keluaran, kerana memindahkan Ubuntu 24.04 ke 26.04 memasang kernel baharu di peringkat awal proses dan do-release-upgrade akan enggan meneruskan apabila /boot kekurangan ruang.
FAQ
Mengapakah Ubuntu menyimpan kernel lama dan tidak memadamnya?
Kerana kernel yang gagal but akan menyebabkan anda tiada pilihan lain untuk dipilih. Menyimpan versi sebelumnya bermakna kemas kini yang bermasalah boleh dipulihkan daripada menu GRUB dan bukannya daripada konsol penyelamat pembekal. apt oleh itu melindungi set pakej kernel daripada pemadaman automatik, dan sentiasa menyertakan versi yang sedang anda jalankan. Jalankan apt-config dump | grep -i neverautoremove untuk melihat corak tepat yang dilindungi oleh keluaran anda, memandangkan polisi tersebut telah berubah antara keluaran.
Adakah apt autoremove --purge selamat dijalankan pada pelayan pengeluaran?
Ya, dengan syarat anda membaca simulasi (dry run) terlebih dahulu. Jalankan sudo apt autoremove --purge --dry-run, yang tidak menulis apa-apa, dan semak senarai yang dipaparkan. Berhenti jika ia mengandungi meta pakej seperti linux-generic atau linux-image-generic, kerana memadam salah satu daripadanya akan menamatkan kemas kini kernel pada masa hadapan. Berhenti juga jika ia mengandungi rentetan versi yang dicetak oleh uname -r. Jika tiada satu pun muncul, pemadaman tersebut adalah kernel lama dan dependensi yang terbiar.
apt autoremove tidak memadam apa-apa dan /boot masih penuh. Apa seterusnya?
Kernel lama hampir pasti ditandakan sebagai manual, dan autoremove hanya menyentuh pakej yang ditandakan sebagai automatik. Jalankan apt-mark showmanual | grep -E '^linux-'. Mana-mana kernel berversi yang disenaraikan di situ telah dipasang secara manual pada satu ketika. Tandakannya sebagai automatik dengan sudo apt-mark auto linux-image-<version> dan jalankan simulasi sekali lagi, atau hapuskan versi tersebut secara terus dengan sudo apt purge linux-image-<version>.
Bolehkah saya memadam fail dari /boot secara manual?
Hanya sebagai tindakan sekali sahaja yang disengajakan, apabila /boot terlalu penuh sehingga apt tidak dapat mengkonfigurasi pakej kernel yang rosak. Padam satu fail initrd.img-<version> yang versinya bukan output daripada uname -r, kemudian jalankan sudo apt --fix-broken install, sudo apt autoremove --purge dan sudo update-grub dengan segera. Memadam fail tanpa langkah susulan tersebut akan menyebabkan dpkg merekodkan pakej yang failnya sudah tiada dan meninggalkan entri menu GRUB yang menghala ke fail yang hilang, dan mesin akan gagal pada but seterusnya dan bukannya pada saat anda melakukan kesilapan tersebut.