Cara Menghapus Kernel Lama Ubuntu dan Mengosongkan /boot
Atasi error apt saat /boot penuh oleh paket linux-image. Temukan kernel yang sedang dipakai, lalu hapus kernel lama dengan aman tanpa mengganggu proses boot.
Mengapa apt berhenti bekerja ketika /boot penuh oleh kernel lama
Di Ubuntu, setiap pembaruan kernel menulis sekumpulan file baru ke /boot dan membiarkan file versi sebelumnya tetap ada. Akibatnya, partisi /boot yang berukuran kecil dapat penuh dan apt tidak dapat menyelesaikan instalasi. Perbaikannya terdiri dari dua langkah. Tentukan paket mana yang merupakan kernel dan kernel mana yang sedang digunakan untuk boot, lalu hapus paket kernel lainnya dengan apt autoremove --purge.
Urutannya penting. Kernel yang sedang berjalan adalah paket yang tidak boleh dihapus. Sistem mungkin sudah berada dalam kondisi ketika apt sama sekali tidak dapat dijalankan. Lakukan diagnosis terlebih dahulu.
Gambaran 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. Karena itu, proses instalasi memerlukan ruang kosong, bukan hanya bandwidth untuk mengunduh. Jika ruang sudah habis, proses build gagal dan paket 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. Karena itu, image terbaru mungkin menggunakan nama zstd, sedangkan image lama menggunakan 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 status half-configured. Setiap proses apt berikutnya mencoba mengonfigurasinya lagi, gagal dengan cara yang sama, lalu berakhir dengan E: Sub-process /usr/bin/dpkg returned an error code (1). Inilah dampak yang lebih penting daripada sekadar ruang disk: unattended-upgrades berjalan sesuai jadwalnya, mengalami error yang sama, lalu berhenti. Server tampak sehat, tetapi secara diam-diam berhenti menerapkan security patch. Artinya, setiap instalasi lain yang Anda coba juga gagal dengan baris yang sama. Kesalahan tersebut akan dianggap berasal dari apa pun yang sedang Anda tambahkan saat itu. 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 adalah 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 pada filesystem mana yang sebenarnya Anda bebaskan.
findmnt /boot
findmnt -T /boot
df -h /boot /Perintah pertama hanya menampilkan satu baris jika /boot merupakan mount point 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 root filesystem dan tidak dapat penuh sendiri: root filesystem Anda penuh, dan kernel lama hanya salah satu dari beberapa penyebabnya. Dalam kondisi ini, sudo apt clean, yang mengosongkan file .deb yang telah diunduh di bawah /var/cache/apt/archives, akan menyediakan ruang. Pada mesin dengan partisi /boot yang sebenarnya, apt clean sama sekali tidak membebaskan ruang di sana karena cache berada pada filesystem yang berbeda.
Sekarang dapatkan angka yang akan Anda jadikan 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 satu pasangan file lain dengan ukuran kira-kira sama. Jadi, jika Avail lebih kecil daripada initrd saat ini, pembaruan berikutnya pasti gagal.
Temukan kernel yang sedang digunakan
uname -r
cat /var/run/reboot-required.pkgsuname -r menampilkan string rilis kernel yang saat ini dimuat di memori. Salin string tersebut ke suatu tempat. Itulah satu-satunya versi yang tidak boleh Anda hapus.
File kedua hanya ada jika suatu paket meminta reboot. Baris linux-image di dalamnya berarti kernel yang lebih baru sudah terpasang di disk tetapi belum digunakan karena mesin belum di-reboot sejak kernel tersebut dipasang. Jika memungkinkan, lakukan reboot sebelum pembersihan. apt melindungi kernel yang sedang berjalan dan kernel terbaru. Karena itu, membersihkan kernel saat Anda masih menjalankan kernel lama akan mempertahankan satu versi tambahan yang sebenarnya tidak diperlukan.
Tampilkan 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 memuat kernel. Fungsinya adalah bergantung pada kernel berversi terbaru agar apt upgrade mengambil kernel baru. Menghapus meta package menghentikan penerimaan pemutakhiran 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 sistem berkas root, bukan ruang /boot. Jika masalah Anda adalah partisi /boot yang penuh, paket image adalah paket yang perlu dicari.
ls -1 /boot/vmlinuz-*
ls -1 /lib/modules/Kedua daftar ini seharusnya sesuai satu sama lain dan juga sesuai dengan output dpkg --list. Direktori di /lib/modules yang tidak memiliki paket terinstal yang cocok merupakan sisa dari penghapusan file secara manual.
Cara apt menentukan kernel yang harus dipertahankan
apt autoremove tidak akan menghapus kernel yang dianggap terlindungi. Set kernel yang dilindungi mencakup kernel yang sedang Anda jalankan. Kebijakan retensi berbeda antar-rilis Ubuntu. Karena itu, baca kebijakan tersebut langsung dari mesin Anda, bukan berdasarkan 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 oleh apt sebagai paket kernel berversi. Pada rilis yang membuat /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 berguna: instalasi kernel berikutnya akan menimpa perubahan Anda. Pada rilis yang tidak memiliki file tersebut, apt menerapkan perlindungan yang sama secara internal. Apa pun kondisinya, apt-config dump menampilkan aturan yang berlaku pada mesin Anda. Output tersebut adalah jawaban yang tepat 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 mencetak daftar yang akan dihapus oleh eksekusi sebenarnya. Baca daftar tersebut. Ada dua hal yang harus menghentikan Anda. Meta-package seperti linux-generic atau linux-image-generic dalam daftar penghapusan berarti paket tersebut ditandai sebagai otomatis, dan menghapusnya akan menghentikan pembaruan kernel. String dari uname -r dalam daftar penghapusan berarti kernel yang sedang berjalan tidak dilindungi. Hal ini seharusnya tidak terjadi dan perlu diselidiki sebelum Anda melanjutkan.
Jika daftarnya sudah 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 langkah ini mencegah dpkg --list dipenuhi baris rc yang terus bertambah sehingga audit berikutnya tetap mudah dibaca.
Selanjutnya, pastikan menu boot telah dibuat ulang. Menghapus paket kernel akan menjalankan update-grub secara otomatis, sehingga menu seharusnya hanya merujuk ke 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 menyebabkan server yang sebelumnya berfungsi berhenti pada prompt GRUB. Hal itu merupakan salah satu penyebab VPS tidak dapat melakukan boot setelah pembaruan kernel, dan memperbaikinya dari konsol pemulihan jauh lebih sulit daripada mencegahnya di sini.
Mengapa apt autoremove terkadang tidak menghapus apa pun
apt autoremove hanya menghapus paket yang ditandai sebagai otomatis. Artinya, paket tersebut diinstal sebagai dependensi paket lain. Kernel yang Anda instal sendiri menggunakan apt install linux-image-6.8.0-40-generic ditandai sebagai manual. autoremove tidak akan pernah menghapusnya, meskipun kernel tersebut sudah sangat lama.
apt-mark showmanual | grep -E '^linux-'Kernel berversi apa pun dalam output tersebut tidak akan diproses oleh autoremove. Tandai kembali kernel itu sebagai otomatis 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 harus manual karena Anda yang memintanya.
Hapus satu kernel tertentu secara sengaja
Terkadang Anda ingin segera menghapus versi tertentu, bukan menunggu hingga kebijakan mengizinkannya. Sebutkan paket image tersebut dan 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 yang ditampilkan tersebut adalah pemeriksaan keamanan yang sebenarnya. Di sinilah Anda dapat mengetahui apakah sebuah meta package ikut dihapus bersama versi yang memang ingin Anda hapus. Jawab n jika ada item yang tidak terduga di dalamnya. Setelah itu, gunakan sudo apt autoremove --purge untuk mengumpulkan paket modul dan header yang kini tidak lagi diperlukan.
Mengapa kernel yang sedang berjalan tidak boleh dihapus
Kernel yang sudah berada di memori tetap berjalan setelah file-file kernel tersebut dihapus, sehingga pada awalnya tidak ada yang tampak rusak. Yang gagal adalah semua komponen yang belum dimuat oleh kernel. Proses purge linux-modules-$(uname -r) 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, pemuatan ulang firewall gagal. Demikian pula pemasangan jenis filesystem yang belum pernah ditangani kernel ini sejak boot. Sementara itu, /boot/vmlinuz-$(uname -r) sudah tidak ada, sehingga menu boot tidak lagi menawarkan kernel yang sedang Anda jalankan. Reboot berikutnya akan mem-boot kernel lain. Mesin tetap melayani network traffic, tetapi sudah tidak dapat di-boot. Setiap kali, cocokkan uname -r dengan daftar penghapusan.
Saat /boot terlalu penuh hingga 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 terlebih dahulu. Langkah tersebut kemudian membangun initramfs, yang memerlukan ruang di /boot yang sudah tidak memiliki ruang. Putuskan loop 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 file tersebut saja.
sudo rm /boot/initrd.img-6.8.0-40-generic
sudo apt --fix-broken install
sudo apt autoremove --purge
sudo update-grubSetiap baris memiliki alasan. rm merupakan pengecualian yang disengaja agar dpkg tetap menganggap sebuah file ada, meskipun file tersebut tidak ada. apt --fix-broken install menyelesaikan konfigurasi yang 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 terinterupsi, sudo dpkg --configure -a melakukan perbaikan yang sama seperti apt --fix-broken install.
Tugas yang sama pada sistem dnf
Jika VPS Anda menjalankan Fedora atau salah satu rebuild RHEL, seperti Rocky Linux, mekanismenya terbalik. Debian dan Ubuntu melindungi kernel dengan aturan autoremove apt dan menyerahkan pembersihan kepada Anda atau unattended-upgrades untuk memicunya, sedangkan dnf menerapkan jumlah yang disebut installonly_limit dan secara otomatis menghapus kernel paling lama segera setelah instalasi baru melebihi jumlah tersebut. Baca nilai yang sedang berlaku dengan grep installonly_limit /etc/dnf/dnf.conf dan man 5 dnf.conf, lalu hapus backlog yang ada dengan sudo dnf remove --oldinstallonly. Kernel yang sedang berjalan juga dilindungi. Untuk pemetaan yang lebih luas antara kedua package manager tersebut, lihat padanan perintah dnf dan apt.
Hentikan agar tidak terulang
Pembersihan yang bergantung pada ingatan Anda pada akhirnya akan gagal, jadi masukkan konfigurasi tersebut ke komponen yang memasang kernel. Buka /etc/apt/apt.conf.d/50unattended-upgrades dan cari kunci berikut, yang sudah terdapat dalam file yang disertakan sebagai baris komentar:
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";Hapus tanda komentarnya, bukan menambahkan salinan kedua di bagian akhir. Dalam konfigurasi apt, penetapan terakhir untuk suatu kunci yang berlaku. Duplikasi membuat isi file saling bertentangan dan menyamarkan nilai yang sebenarnya digunakan. Periksa hasil pemrosesan 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 tersebut menjadi buktinya. Log mencatat setiap proses, sehingga pembaruan yang gagal karena kekurangan ruang akan tercatat jauh sebelum ada yang menyadari bahwa mesin tertinggal dari patch terbaru. Bagian lain dari konfigurasi tersebut dibahas dalam pembaruan keamanan otomatis di Ubuntu.
Sebelum kernel berikutnya dipasang, ada satu angka yang perlu 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 lebih besar dengan selisih yang memadai daripada file tersebut, kernel berikutnya akan gagal persis seperti yang dijelaskan di atas. Perbaiki sekarang, bukan saat proses pembaruan berlangsung. Pemeriksaan ini hanya memerlukan satu menit dan dapat dilakukan bersama pemeriksaan kesehatan disk pada VPS lainnya. Pemeriksaan ini terutama penting tepat sebelum pembaruan rilis, karena memindahkan Ubuntu 24.04 ke 26.04 memasang kernel baru pada tahap awal proses dan do-release-upgrade akan menolak melanjutkan jika /boot kekurangan ruang.
FAQ
Mengapa Ubuntu menyimpan kernel lama dan tidak menghapusnya?
Karena kernel yang gagal melakukan boot membuat Anda tidak memiliki kernel lain untuk dipilih. Menyimpan versi sebelumnya berarti pembaruan yang bermasalah dapat dipulihkan dari menu GRUB, bukan dari konsol pemulihan provider. apt karena itu melindungi sekumpulan paket kernel dari penghapusan otomatis dan selalu menyertakan kernel yang sedang Anda gunakan. Jalankan apt-config dump | grep -i neverautoremove untuk melihat pola persis yang dilindungi oleh rilis Anda, karena kebijakan ini berubah antarrilis.
Apakah apt autoremove --purge aman dijalankan pada server produksi?
Ya, selama Anda membaca hasil 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 yang muncul, 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 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 filenya sudah hilang dan membuat entri menu GRUB mengarah ke file yang tidak ada. Akibatnya, mesin gagal pada reboot berikutnya, bukan saat kesalahan itu dibuat.