Cara Menghapus Kernel Lama Ubuntu dan Mengosongkan /boot
Saat /boot penuh, apt dapat berhenti dengan error “No space left on device”. Temukan kernel yang aman dihapus, pertahankan kernel aktif, lalu bebaskan ruang.
Mengapa apt berhenti bekerja saat /boot penuh oleh kernel lama
Di Ubuntu, setiap pembaruan kernel menulis kumpulan file baru ke /boot dan membiarkan file versi sebelumnya tetap ada. Akibatnya, partisi /boot yang kecil dapat penuh dan apt tidak dapat menyelesaikan instalasi. Perbaikannya terdiri atas dua langkah. Tentukan paket mana pada server yang merupakan kernel dan kernel mana yang sedang digunakan untuk boot, lalu hapus paket lainnya dengan apt autoremove --purge.
Urutannya penting. Kernel yang sedang berjalan adalah paket yang tidak boleh dihapus. Server mungkin sudah berada dalam kondisi ketika apt sama sekali tidak dapat dijalankan. Lakukan diagnosis terlebih dahulu.
Tampilan kegagalan yang sebenarnya
Satu versi kernel memasang dua file besar ke /boot: kernel terkompresi (vmlinuz-<version>) dan initramfs (initial RAM filesystem, initrd.img-<version>, yaitu arsip kecil yang dibongkar kernel sebelum memasang root yang sebenarnya). initramfs dibuat di mesin Anda saat instalasi, sehingga instalasi memerlukan ruang kosong, bukan hanya bandwidth untuk mengunduh. Jika ruang sudah habis, proses build gagal dan paket tersebut ikut gagal dipasang.
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 1String versi akan berbeda pada sistem Anda. Nama kompresor berasal dari COMPRESS= di /etc/initramfs-tools/initramfs.conf, sehingga image terbaru mungkin menggunakan nama zstd, sedangkan image yang lebih lama menggunakan nama gzip. Dua baris yang mengidentifikasi masalah ini adalah No space left on device dan baris dpkg: error processing package di bawahnya.
Setelah itu, paket berada dalam kondisi setengah terkonfigurasi. Setiap eksekusi apt berikutnya mencoba mengonfigurasinya lagi, gagal dengan cara yang sama, lalu berakhir dengan E: Sub-process /usr/bin/dpkg returned an error code (1). Bagian ini penting, bukan hanya karena ruang disk: unattended-upgrades berjalan sesuai jadwal, menemukan error yang sama, lalu berhenti. Server terlihat sehat, tetapi diam-diam berhenti menerapkan patch keamanan. Ini juga berarti setiap instalasi lain yang Anda coba akan gagal dengan baris yang sama, dan penyebabnya tampak seolah-olah berasal dari apa pun yang sedang Anda tambahkan. Karena itu, instalasi Tailscale yang gagal di Ubuntu sebaiknya dibaca terlebih dahulu sebagai error apt. Jika apt update gagal sebelum Anda mencapai tahap ini, itu merupakan masalah terpisah, yang sering disebabkan oleh entri duplikat setelah migrasi sumber deb822.
Periksa apakah /boot merupakan partisi terpisah
Sebelum menghapus apa pun, cari tahu ruang penyimpanan yang sebenarnya akan dibebaskan.
findmnt /boot
findmnt -T /boot
df -h /boot /Perintah pertama hanya menampilkan satu baris jika /boot merupakan titik mount tersendiri. Perintah kedua selalu menampilkan hasil dan menyebutkan filesystem yang benar-benar menampung /boot. Jika keduanya menyebut filesystem yang sama dengan /, berarti /boot hanyalah direktori pada filesystem root dan tidak dapat penuh secara terpisah: filesystem root Anda penuh, dan kernel lama hanyalah salah satu dari banyak penyebabnya. Dalam kondisi ini, sudo apt clean, yang mengosongkan file .deb yang telah diunduh di bawah /var/cache/apt/archives, akan membebaskan ruang. Pada mesin dengan partisi /boot yang benar-benar terpisah, apt clean sama sekali tidak membebaskan ruang di sana karena cache berada pada filesystem yang berbeda.
Sekarang dapatkan angka yang akan Anda gunakan sebagai acuan.
df -h /boot
ls -lh /boot/vmlinuz-$(uname -r) /boot/initrd.img-$(uname -r)Bandingkan kolom Avail dengan ukuran kedua file tersebut. Initrd adalah file yang lebih besar. Pembaruan kernel berikutnya memerlukan ruang untuk sepasang file lain dengan ukuran kira-kira sama. Jadi, jika Avail lebih kecil daripada initrd saat ini, pembaruan berikutnya pasti akan gagal.
Cari tahu kernel yang sedang dijalankan
uname -r
cat /var/run/reboot-required.pkgsuname -r menampilkan string rilis kernel yang saat ini berada di memori. Salin string tersebut ke suatu tempat. Itulah versi yang tidak boleh Anda hapus.
File kedua hanya ada ketika sebuah paket meminta reboot. Baris linux-image di dalamnya berarti kernel yang lebih baru telah terpasang di disk tetapi belum digunakan, karena mesin belum melakukan reboot sejak kernel tersebut terpasang. Lakukan reboot sebelum pembersihan jika memungkinkan. apt melindungi kernel yang sedang berjalan dan kernel terbaru. Karena itu, pembersihan saat menjalankan kernel lama akan menyisakan satu versi tambahan yang dipertahankan melebihi kebutuhan.
Daftar paket kernel dan baca statusnya
dpkg --list | grep -E 'linux-(image|modules|headers|tools)' | awk '{print $1, $2}'Kolom pertama adalah kode status dpkg. ii berarti terinstal dan telah dikonfigurasi. iF berarti terinstal tetapi baru dikonfigurasi sebagian. Kondisi ini persis seperti yang ditinggalkan oleh pemutakhiran yang gagal di atas. rc berarti paket telah dihapus, tetapi konfigurasinya masih tersimpan di disk. Kondisi ini tidak menggunakan ruang di /boot dan aman untuk dibersihkan.
Kolom kedua menunjukkan jenis paket. Nama yang memuat versi, seperti linux-image-6.8.0-64-generic, adalah satu kernel tertentu. Nama tanpa versi, seperti linux-image-generic, linux-headers-generic, atau linux-generic, adalah meta package. Paket tersebut tidak berisi kernel. Tugasnya hanya bergantung pada kernel versi terbaru agar apt upgrade mengambil kernel baru. Menghapus meta package menghentikan penerimaan pembaruan kernel oleh mesin, dan tidak ada peringatan setelahnya.
Keluarga paket tersebut terbagi sebagai berikut. linux-image-* menyimpan kernel terkompresi di /boot. linux-modules-* dan linux-modules-extra-* menyimpan driver di bawah /lib/modules. linux-headers-* menyimpan header untuk build di bawah /usr/src. Artinya, membersihkan header akan membebaskan ruang pada root filesystem, bukan ruang /boot. Jika masalah Anda adalah partisi /boot yang penuh, paket image adalah yang harus dicari.
ls -1 /boot/vmlinuz-*
ls -1 /lib/modules/Kedua daftar ini seharusnya selaras satu sama lain dan dengan output dpkg --list. Direktori di /lib/modules yang tidak memiliki paket terinstal yang sesuai merupakan sisa dari penghapusan file secara manual.
Cara apt menentukan kernel yang dipertahankan
apt autoremove tidak akan menghapus kernel yang dianggapnya terlindungi. Set kernel yang dilindungi mencakup kernel yang sedang Anda jalankan. Kebijakan penyimpanan berubah antar-rilis Ubuntu. Karena itu, baca kebijakan tersebut dari mesin Anda sendiri, bukan dari angka yang ditulis di tempat lain.
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 adalah daftar pola nama paket yang tidak akan disentuh oleh apt autoremove. APT::VersionedKernelPackages adalah daftar awalan nama yang sejak awal dianggap apt sebagai paket kernel berversi. Pada rilis yang menghasilkan /etc/apt/apt.conf.d/01autoremove-kernels, file tersebut ditulis ulang oleh /etc/kernel/postinst.d/apt-auto-removal setiap kali paket kernel diinstal. Karena itu, mengeditnya secara manual tidak ada gunanya: instalasi kernel berikutnya akan menimpa perubahan Anda. Pada rilis yang tidak memiliki file tersebut, apt menerapkan perlindungan yang sama secara internal. Bagaimanapun, apt-config dump menampilkan aturan yang berlaku pada mesin Anda, dan keluaran tersebut merupakan jawaban yang benar untuk rilis Anda.
Pembersihan yang aman untuk dijalankan
sudo apt update
sudo apt autoremove --purge --dry-run--dry-run tidak mengubah apa pun pada disk dan menampilkan secara tepat apa yang akan dihapus oleh eksekusi sebenarnya. Baca daftarnya. Ada dua hal yang mengharuskan Anda berhenti. Paket meta seperti linux-generic atau linux-image-generic dalam daftar penghapusan berarti ada sesuatu yang menandainya sebagai otomatis, dan penghapusannya akan menghentikan pembaruan kernel Anda. String dari uname -r dalam daftar penghapusan berarti kernel yang sedang berjalan tidak dilindungi. Kondisi ini seharusnya tidak terjadi dan perlu diselidiki sebelum Anda melanjutkan.
Jika daftarnya benar, jalankan perintah tersebut secara nyata.
sudo apt autoremove --purge
df -h /bootBagian --purge juga menghapus konfigurasi yang tersisa selain paketnya. Ruang tambahan yang dibebaskan hanya sedikit, tetapi dpkg --list tetap bebas dari penumpukan baris rc, sehingga audit berikutnya lebih mudah dibaca.
Kemudian, pastikan menu boot dibuat ulang. Menghapus paket kernel akan menjalankan update-grub untuk Anda, sehingga menu seharusnya hanya merujuk pada file yang masih ada.
sudo grep -o 'vmlinuz-[^ ]*' /boot/grub/grub.cfg | sort -u
ls -1 /boot/vmlinuz-*Setiap versi pada output pertama harus muncul pada output kedua. Entri menu yang menunjuk ke file yang sudah tidak ada dapat membuat server yang sebelumnya berfungsi berhenti pada prompt GRUB. Ini adalah salah satu penyebab VPS tidak dapat melakukan boot setelah pembaruan kernel, dan memperbaikinya dari konsol pemulihan jauh lebih sulit daripada mencegahnya sejak awal.
Mengapa apt autoremove terkadang tidak menghapus apa pun
apt autoremove hanya menghapus paket yang ditandai sebagai otomatis. Paket tersebut dipasang sebagai dependensi dari paket lain. Kernel yang Anda pasang sendiri dengan apt install linux-image-6.8.0-40-generic ditandai sebagai manual. autoremove tidak akan pernah menghapusnya, meskipun kernel tersebut sudah lama.
apt-mark showmanual | grep -E '^linux-'Kernel dengan versi apa pun dalam output tersebut tidak terlihat oleh autoremove. Tandai kembali kernel tersebut menggunakan string versi dari daftar 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 paket meta tetap ditandai sebagai manual. Paket tersebut memang seharusnya manual karena Anda yang memintanya.
Hapus kernel bernama secara sengaja
Terkadang Anda ingin versi tertentu segera dihapus, bukan menunggu hingga kebijakan mengizinkannya. Tentukan nama paket image, lalu biarkan apt menentukan langkah lainnya.
sudo apt purge linux-image-6.8.0-40-genericapt menampilkan daftar penghapusan sebelum melakukan tindakan apa pun karena linux-modules-extra-* bergantung pada paket image dan harus dihapus dalam transaksi yang sama. Daftar tersebut adalah pemeriksaan keamanan yang sebenarnya. Di sinilah Anda dapat mengetahui apakah meta package ikut dihapus bersama versi yang memang ingin Anda hapus. Jawab n jika ada sesuatu yang tidak diharapkan dalam daftar tersebut. Setelah itu, jalankan sudo apt autoremove --purge untuk mengumpulkan paket modul dan header yang tidak lagi diperlukan.
Mengapa Anda tidak boleh menghapus kernel yang sedang berjalan
Kernel yang sudah berada di memori tetap berjalan setelah file-nya dihapus, sehingga pada awalnya tidak terlihat ada masalah. Masalah muncul pada semua komponen yang belum dimuat oleh kernel. Menghapus linux-modules-$(uname -r) juga menghapus /lib/modules/$(uname -r)/, sehingga pemuatan modul berikutnya gagal:
modprobe: FATAL: Module nf_tables not found in directory /lib/modules/6.8.0-64-genericSejak saat itu, reload firewall gagal. Mount filesystem dengan tipe yang belum pernah digunakan kernel ini sejak boot juga gagal. Sementara itu, /boot/vmlinuz-$(uname -r) sudah hilang, sehingga menu boot tidak lagi menawarkan kernel yang sedang Anda jalankan dan reboot berikutnya membawa sistem ke kernel lain. Mesin tetap melayani trafik, tetapi sudah tidak dapat melakukan boot. Setiap kali, bandingkan uname -r dengan daftar penghapusan.
Saat /boot terlalu penuh sehingga apt sama sekali tidak dapat berjalan
Inilah kondisi yang membuat orang mencari halaman ini. apt autoremove memerlukan dpkg untuk menyelesaikan konfigurasi paket kernel yang masih setengah terkonfigurasi, dan langkah tersebut membangun ulang initramfs yang memerlukan ruang di /boot, tetapi ruang itu tidak tersedia. Putuskan siklus ini secara manual, satu kali.
uname -r
ls -1 /boot/initrd.img-*Pilih satu initrd yang versinya bukan string yang diberikan oleh uname -r, lalu hapus satu file tersebut.
sudo rm /boot/initrd.img-6.8.0-40-generic
sudo apt --fix-broken install
sudo apt autoremove --purge
sudo update-grubSetiap baris memiliki alasannya. rm merupakan pengecualian yang disengaja. Perintah tersebut membuat dpkg menganggap sebuah file masih ada, padahal file itu sudah tidak ada. apt --fix-broken install menyelesaikan konfigurasi yang sebelumnya gagal setelah ruang untuk initramfs tersedia. Selanjutnya, autoremove --purge menghapus paket yang file-nya Anda hapus, bersama versi lama lainnya. Dengan demikian, dpkg kembali sesuai dengan isi disk. update-grub membangun ulang menu berdasarkan file yang benar-benar ada. Jangan reboot di antara rm dan update-grub, karena selama jeda tersebut menu masih dapat menunjuk ke file yang baru saja Anda hapus. Jika dpkg melaporkan bahwa prosesnya terhenti, sudo dpkg --configure -a melakukan perbaikan yang sama seperti apt --fix-broken install.
Pekerjaan yang sama pada sistem dnf
Jika VPS Anda menjalankan Fedora atau salah satu rebuild RHEL seperti Rocky Linux, mekanismenya berkebalikan. Debian dan Ubuntu melindungi kernel dengan aturan autoremove apt dan menyerahkan pembersihan kepada Anda atau unattended-upgrades untuk memicunya, sedangkan dnf memberlakukan jumlah yang disebut installonly_limit dan secara otomatis menghapus kernel tertua segera setelah instalasi baru akan melampaui jumlah tersebut. Baca nilai yang sedang berlaku dengan grep installonly_limit /etc/dnf/dnf.conf dan man 5 dnf.conf, lalu bersihkan backlog yang ada dengan sudo dnf remove --oldinstallonly. Kernel yang sedang berjalan juga dilindungi di sana. Untuk pemetaan yang lebih luas antara kedua package manager tersebut, lihat padanan perintah dnf dan apt.
Hentikan agar tidak terjadi lagi
Pembersihan yang bergantung pada ingatan Anda pada akhirnya akan gagal. Karena itu, masukkan konfigurasi tersebut ke komponen yang memasang kernel. Buka /etc/apt/apt.conf.d/50unattended-upgrades dan cari kunci berikut, yang sudah tersedia dalam file bawaan sebagai baris komentar:
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";Hapus tanda komentar pada baris tersebut. Jangan menambahkan salinan kedua di bagian akhir. Dalam konfigurasi apt, penetapan terakhir untuk suatu kunci akan digunakan. Duplikasi membuat isi file tidak konsisten dan menyembunyikan nilai yang sebenarnya berlaku. Periksa hasil akhir yang dibaca parser, lalu pantau proses yang tidak mengubah apa pun:
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. Log mencatat setiap proses, sehingga pemutakhiran yang gagal karena kekurangan ruang akan terlihat di sana jauh sebelum ada yang menyadari bahwa mesin tertinggal dari patch terbaru. Konfigurasi lainnya dibahas dalam pembaruan keamanan otomatis di Ubuntu.
Sebelum kernel berikutnya dipasang, ada satu angka yang harus diperiksa. Angka tersebut diperoleh dengan pasangan perintah yang sama seperti pada awal panduan ini:
df -h /boot
ls -lh /boot/initrd.img-$(uname -r)Jika Avail tidak jauh lebih besar daripada file tersebut, kernel berikutnya akan gagal persis seperti yang dijelaskan di atas. Perbaiki sekarang, bukan saat pemutakhiran berlangsung. Pemeriksaan ini hanya memerlukan waktu satu menit dan dapat dilakukan bersama pemeriksaan kesehatan disk pada VPS lainnya. Pemeriksaan ini paling penting tepat sebelum pemutakhiran rilis, karena memindahkan Ubuntu 24.04 ke 26.04 memasang kernel baru di awal proses, dan do-release-upgrade akan menghentikan proses jika /boot kekurangan ruang. Jika server LTS Anda belum ditawari pemutakhiran tersebut, penyebabnya adalah waktu rilis, bukan kerusakan. Ubuntu menunda pemutakhiran LTS ke LTS hingga rilis 26.04.1 tersedia. Dengan demikian, Anda memiliki waktu yang jelas untuk menyiapkan /boot terlebih dahulu.
FAQ
Mengapa Ubuntu mempertahankan kernel lama dan tidak menghapusnya?
Karena kernel yang gagal melakukan boot akan membuat Anda tidak memiliki pilihan lain. Mempertahankan versi sebelumnya berarti pembaruan yang bermasalah dapat dipulihkan dari menu GRUB, bukan melalui konsol rescue provider. apt karena itu melindungi sekumpulan paket kernel dari penghapusan otomatis dan selalu mencakup kernel yang sedang Anda gunakan. Jalankan apt-config dump | grep -i neverautoremove untuk melihat pola persis yang dilindungi oleh release Anda, karena kebijakan tersebut berubah antar-release.
Apakah apt autoremove --purge aman dijalankan pada server produksi?
Ya, selama Anda membaca dry run terlebih dahulu. Jalankan sudo apt autoremove --purge --dry-run, yang tidak menulis perubahan apa pun, lalu periksa daftar yang ditampilkan. Hentikan proses jika daftar tersebut berisi meta package seperti linux-generic atau linux-image-generic, karena menghapus salah satunya akan menghentikan pembaruan kernel berikutnya. Hentikan juga proses jika daftar tersebut berisi string versi yang ditampilkan oleh uname -r. Jika tidak ada satupun, paket yang akan dihapus adalah kernel lama dan dependensi yatim.
apt autoremove tidak menghapus apa pun dan /boot masih penuh. Apa yang harus dilakukan?
Kernel lama hampir pasti ditandai sebagai manual, sedangkan autoremove hanya memproses paket yang ditandai sebagai automatic. Jalankan apt-mark showmanual | grep -E '^linux-'. Setiap kernel berversi yang tercantum di sana pernah diinstal secara manual. Tandai kernel tersebut sebagai automatic dengan sudo apt-mark auto linux-image-<version>, lalu jalankan dry run lagi, atau purge versi tersebut secara langsung dengan sudo apt purge linux-image-<version>.
Apakah saya dapat menghapus file dari /boot secara manual?
Hanya sebagai tindakan satu kali yang disengaja, ketika /boot sudah begitu penuh sehingga apt tidak dapat mengonfigurasi paket kernel yang bermasalah. Hapus satu file initrd.img-<version> yang versinya bukan keluaran dari uname -r, lalu segera jalankan sudo apt --fix-broken install, sudo apt autoremove --purge, dan sudo update-grub. Menghapus file tanpa langkah lanjutan tersebut membuat dpkg mencatat paket yang file-nya sudah tidak ada dan membuat entri menu GRUB mengarah ke file yang hilang. Akibatnya, mesin gagal pada reboot berikutnya, bukan saat kesalahan tersebut dibuat.