Bagaimana cara membebaskan lebih banyak ruang di / boot?

563

/bootPartisi saya hampir penuh dan saya mendapat peringatan setiap kali saya reboot sistem saya. Saya sudah menghapus paket kernel lama (linux-header ...), sebenarnya saya melakukan itu untuk menginstal versi kernel yang lebih baru yang datang dengan pembaruan otomatis.

Setelah menginstal versi baru itu, partisi hampir penuh lagi. Jadi apa lagi yang bisa saya hapus? Apakah ada beberapa file lain yang terkait dengan gambar kernel lama?

Berikut adalah daftar file yang ada di /bootpartisi saya :

:~$ ls /boot/
abi-2.6.31-21-generic         lost+found
abi-2.6.32-25-generic         memtest86+.bin
abi-2.6.38-10-generic         memtest86+_multiboot.bin
abi-2.6.38-11-generic         System.map-2.6.31-21-generic
abi-2.6.38-12-generic         System.map-2.6.32-25-generic
abi-2.6.38-8-generic          System.map-2.6.38-10-generic
abi-3.0.0-12-generic          System.map-2.6.38-11-generic
abi-3.0.0-13-generic          System.map-2.6.38-12-generic
abi-3.0.0-14-generic          System.map-2.6.38-8-generic
boot                          System.map-3.0.0-12-generic
config-2.6.31-21-generic      System.map-3.0.0-13-generic
config-2.6.32-25-generic      System.map-3.0.0-14-generic
config-2.6.38-10-generic      vmcoreinfo-2.6.31-21-generic
config-2.6.38-11-generic      vmcoreinfo-2.6.32-25-generic
config-2.6.38-12-generic      vmcoreinfo-2.6.38-10-generic
config-2.6.38-8-generic       vmcoreinfo-2.6.38-11-generic
config-3.0.0-12-generic       vmcoreinfo-2.6.38-12-generic
config-3.0.0-13-generic       vmcoreinfo-2.6.38-8-generic
config-3.0.0-14-generic       vmcoreinfo-3.0.0-12-generic
extlinux                      vmcoreinfo-3.0.0-13-generic
grub                          vmcoreinfo-3.0.0-14-generic
initrd.img-2.6.31-21-generic  vmlinuz-2.6.31-21-generic
initrd.img-2.6.32-25-generic  vmlinuz-2.6.32-25-generic
initrd.img-2.6.38-10-generic  vmlinuz-2.6.38-10-generic
initrd.img-2.6.38-11-generic  vmlinuz-2.6.38-11-generic
initrd.img-2.6.38-12-generic  vmlinuz-2.6.38-12-generic
initrd.img-2.6.38-8-generic   vmlinuz-2.6.38-8-generic
initrd.img-3.0.0-12-generic   vmlinuz-3.0.0-12-generic
initrd.img-3.0.0-13-generic   vmlinuz-3.0.0-13-generic
initrd.img-3.0.0-14-generic   vmlinuz-3.0.0-14-generic

Saat ini, saya menggunakan 3.0.0-14-generickernel.

pengguna6722
sumber
5
Perlu disebutkan bahwa tidak setiap instalasi Ubuntu akan memiliki partisi / boot terpisah - seringkali itu semua hanya akan menjadi satu partisi besar. Jawaban ini berlaku untuk mereka yang memiliki partisi / boot terpisah. Mereka yang menggunakan enkripsi LVM atau "disk lengkap" perlu boot / terpisah, jika tidak maka opsional.
thomasrutter
4
Jika ada orang lain yang memiliki masalah yang sama dengan saya: setelah / boot tidak memiliki ruang tersisa "apt-get upgrade" akan gagal ketika menghasilkan kembali file initrd untuk kernel yang diinstal atau yang skrip pembaruan-initramfs yakini diinstal dengan memeriksa isi / var / lib / initramfs-tools. Dalam situasi ini seseorang tidak dapat menghapus kernel lama menggunakan apt-get karena partisi fscking / boot tidak memiliki ruang tersisa di perangkat. Seseorang dapat melakukan ini menggunakan "dpkg -P" diikuti dengan membersihkan entri yang sesuai di / boot (untuk mengosongkan ruang) dan / var / lib / initramfs-tools (gambar initrd tidak akan dihasilkan).
wojci
3
Poin kunci untuk jawaban yang benar adalah mereka memberi tahu Anda untuk menghapus paket yang berisi versi kernel yang lebih lama. Banyak halaman web yang mengatasi masalah ini merekomendasikan untuk langsung menghapus file di partisi / boot; yang mungkin bekerja untuk sementara waktu, tetapi pada akhirnya Anda dapat memperbarui paket yang membuat kembali file yang hilang untuk versi kernel yang memiliki paket, sehingga membuat Anda kehabisan ruang.
kgrittn

Jawaban:

629

Anda memiliki banyak kernel yang tidak digunakan. Hapus semua kecuali kernel terakhir dengan:

sudo apt-get purge linux-image-{3.0.0-12,2.6.3{1-21,2-25,8-{1[012],8}}}

Ini adalah singkatan untuk:

sudo apt-get purge linux-image-3.0.0-12 linux-image-2.6.31-21 linux-image-2.6.32-25 linux-image-2.6.38-10 linux-image-2.6.38-11 linux-image-2.6.38-12 linux-image-2.6.38-8

Menghapus linux-image-x.x.x-xpaket juga akan menghapus linux-image-x.x.x-x-generic.

Header diinstal ke dalam /usr/srcdan digunakan ketika membangun modul kernel keluar-pohon (seperti driver nvidia dan virtualbox). Sebagian besar pengguna harus menghapus paket header ini jika paket kernel yang cocok ( linux-image-*) tidak diinstal.

Untuk mendaftar semua kernel yang diinstal, jalankan:

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

Satu perintah untuk menampilkan semua kernel dan header yang dapat dihapus, tidak termasuk saat kernel berjalan:

kernelver=$(uname -r | sed -r 's/-[a-z]+//')
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver

Itu memilih semua paket bernama dimulai dengan linux-headers-<some number>atau linux-image-<some number>, mencetak nama-nama paket untuk paket yang diinstal dan kemudian mengecualikan kernel saat ini dimuat / berjalan (tidak harus kernel terbaru !). Ini sesuai dengan rekomendasi pengujian kernel yang lebih baru sebelum menghapus kernel lama yang sudah dikenal.

Jadi, setelah memutakhirkan kernel dan me-reboot untuk mengujinya, Anda dapat menghapus semua kernel lainnya dengan:

sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")
Lekensteyn
sumber
16
Jawaban yang fantastis. Satu info lebih lanjut akan membantu: Bagaimana Anda bisa tahu (pasti) kernel mana yang Anda gunakan? Agaknya Anda tidak bisa hanya menganggap itu yang terakhir ... Edit : Dan sepertinya jawabannya adalah uname -a. Mungkin yang terbaik untuk memastikan Anda tidak memiliki pending restart-to-install-kernel-baru yang tertunda (seperti yang saya lakukan; tetapi saya mencatat ketidakcocokan antara uname -adan "terbaru" kernel).
TJ Crowder
5
@Freddyb Selesai. Perhatikan bahwa perintah mencetak / menghilangkan kernel selain dari yang dimuat / boot .
Lekensteyn
9
Jika apt-get purge gagal karena dependensi yang tidak terpenuhi maka Anda dapat mengikuti saran di askubuntu.com/questions/171209/…
svandragt
11
Jawaban yang sangat teliti dan masih berfungsi ... dan masih diperlukan pada tahun 2014. Agak konyol bahwa itu masih belum secara otomatis dilakukan oleh alat GUI.
allprog
6
@ byf-ferdy Kernel adalah bagian penting dari OS, jika versi terbaru entah bagaimana tidak sepenuhnya bekerja dengan perangkat keras Anda, maka Anda masih dapat memilih yang berbeda untuk boot. Fitur yang bagus mungkin akan menjadi sesuatu yang menghapus semua kernel yang diinstal secara otomatis lebih dari sebulan (kecuali untuk dua yang terbaru).
Lekensteyn
217

Partisi boot Anda penuh. Karena ini adalah pembaruan kernel, file-file ini akan disalin ke partisi boot sehingga Anda harus membersihkannya. Berikut adalah posting blog yang akan menunjukkan kepada Anda cara menghapus gambar kernel lama dengan satu perintah. Saya akan memberikan sinopsis dasar metode ini. Gunakan perintah ini untuk mencetak versi kernel Anda saat ini:

uname -r

Kemudian gunakan perintah ini untuk mencetak semua kernel yang telah Anda instal yang bukan kernel terbaru Anda:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'

Pastikan kernel Anda saat ini tidak ada dalam daftar itu. Perhatikan bagaimana ini adalah mayoritas dari perintah terakhir (di bawah). Untuk menghapus dan menghapus kernel lama ini, Anda ingin mengirimkan argumen ini ke:

sudo apt-get -y purge

Sekarang kita dapat melakukan semua yang kita inginkan dengan menggabungkan dua perintah terakhir ini ke dalam kekacauan yang tidak suci ini:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge

Dan satu perintah itu akan mengurus segalanya untuk Anda. Saya akan mengkonfirmasi bahwa ini berfungsi dengan baik tetapi tidak pernah mempercayai siapa pun di internet. :) Untuk info lebih lanjut, posting blog memberikan penjelasan yang sangat baik tentang apa yang dilakukan setiap bagian dari perintah sehingga membacanya sehingga Anda puas bahwa itu melakukan apa yang Anda inginkan.

dward
sumber
ini juga cocok dengan linux-libc-dev: amd64
Frederick Nord
apa yang akan menyebabkan penghapusan "linux-libc-dev: amd64" yang tidak disengaja?
ConfusedStack
@ Patrick, terima kasih atas bantuannya. Memperbaiki ini. Itu akan menyebabkan beberapa kesulitan menyusun program c.
dward
9
Perintahnya terdengar bagus, tetapi ketika saya menjalankannya saya mendapatkan kesalahan yang sama dengan yang saya dapatkan ketika saya ingin menginstal sesuatu dan itu tidak dapat melakukannya karena boot sudah penuh: --------------- ----------- Paket-paket berikut memiliki dependensi yang belum terpenuhi: linux-image-extra-4.2.0-27-generic: Tergantung: linux-image-4.2.0-27-generic tetapi tidak berjalan untuk diinstal linux-image-extra-4.2.0-30-generic: Tergantung: linux-image-4.2.0-30-generic tetapi tidak akan diinstal
Alex
109
sudo apt-get autoremove

Perintah ini melakukan pekerjaan secara otomatis.

karan
sumber
7
Seperti namanya, apt-get AUTOremove adalah operasi otomatis di mana sistem mengambil "tebakan terbaik" apa yang ingin Anda capai. Seharusnya tidak digunakan sebagai pengganti administrasi sistem akal sehat. Masalah dengan pendekatan ini: Jika Anda (atau pembaruan) menghapus paket yang merupakan bagian dari daftar dependensi ini fungsi auto-remove ingin menghapus semua paket lain dalam daftar dependensi, meninggalkan Anda dengan sistem tanpa desktop yang berfungsi (dan kadang-kadang bahkan dengan sistem yang benar-benar rusak).
Rinzwind
Referensi: 1 dari banyak sumber untuk komentar ini di atas: linuxquestions.org/questions/debian-26/…
Rinzwind
7
jika linux-image-generic diinstal dan kernel baru tidak diinstal secara eksplisit, ini akan menghapus kernel lama. Akal sehat adalah untuk tidak menerima perubahan apa pun pada sistem tanpa membacanya terlebih dahulu. Jika akal sehat telah digunakan sebelum menggunakan perintah ini maka tidak akan ada masalah.
mchid
1
@Rinzwind - Perintah ini mengosongkan 250 mb ruang disk saya dengan menghapus 'linux header' lama
Chinmaya B
3
autoremove berfungsi jika digunakan sebelum kondisi di luar ruang ada. Namun, begitu apt kehabisan ruang dan membatalkan (dan pengguna akhirnya memperhatikan masalah), sudah terlambat untuk menjalankan autremove atau solusi berbasis apt lainnya. Jika itu masalahnya, coba salah satu solusi berbasis dpkg.
user535733
40

Synaptic Package Manager dapat digunakan untuk memilih dan menghapus gambar kernel lama dengan mudah. Cuplikan layar dari Package Package Synaptic

Jika Anda belum menginstal Synaptic:

sudo apt-get install synaptic

Mulai aplikasi dan pilih opsi yang ditampilkan.

Anda harus dapat menyorot semua paket "linux-" dengan versi "2.6.x" di mana x adalah antara 31 hingga 38 sesuai dengan file di folder / boot Anda.

Klik kanan masing-masing paket linux tersebut dan pilih opsi "Mark for Complete Removal". Terakhir klik tombol apply. Ini akan menghapus semua file dan semua file terkait. /bootFolder Anda sekarang harus sedikit lebih rapi.

kebebasan fosil
sumber
Saya pada 14,04. Saya telah menangani situasi ini di masa lalu melalui baris perintah, tetapi saya memutuskan untuk mencoba metode ini hari ini ... bagi saya, gambar linux saya berada di bawah terinstal (manual), tidak diinstal (lokal atau usang)
Ryan
8
Oh tidak. Saya tidak dapat menginstal Synaptic karena tidak ada ruang di /boot!
John McGehee
@JohnMcGehee fsck dan berpisah harus menyelesaikan masalah itu untuk Anda.
FlipMcF
25

Terima kasih atas pos detail masalah Anda, ini membuat saya mengarah ke arah yang benar. Meskipun berguna untuk menyimpan file kernel sebelumnya, Anda dapat menghapus semuanya dalam sekali jalan, periksa posting ini:
Cara Menghapus Semua Header, Gambar, dan Modul Kernel Linux yang Tidak Digunakan

Dilakukan melalui baris perintah. Jika Anda melakukan ini melalui remote gunakan sesuatu seperti WINSCP untuk membuka sesi terminal dan hanya menempelkannya, berfungsi dengan sangat baik.

Di sini disalin dari tautan artikel, saya sarankan Anda membaca artikel lengkap:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge
Omni
sumber
23

Ini adalah jawaban baru untuk pertanyaan lama, tetapi cara mudah untuk membersihkan hal ini (dan banyak lagi) adalah dengan menginstal Ubuntu Tweak . Untuk menginstalnya :

sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak

maka Anda dapat menjalankan Ubuntu Tweak, Going to the "janitor" tab, dan dari sini tinggal tiga klik:

Ubuntu men-tweak petugas kebersihan untuk kernel lama

Lebih baik meninggalkan kernel terakhir (Anda tidak pernah tahu) atau kernel yang terkenal untuk keamanan, meskipun; tapi itu mudah disesuaikan.

Anda dapat menggunakan alat yang sama untuk membersihkan banyak hal --- hanya ingat bahwa jika Anda membersihkan cache thumbnail atau cache TB maka sistem harus membangunnya kembali jika diperlukan.

Rmano
sumber
Saya mencoba menginstal tweak Ubuntu dan juga pergi ke situs web repositori. Dikatakan hanya untuk 13.10 dan sebelumnya. Apakah Anda memiliki versi yang diperbarui untuk 15,04?
JayCouture.com
@ JayCouture.com Versi di situs ini untuk 14,04 ("untuk 13.10 dan sebelumnya" adalah tautan ke rilis yang lebih lama). Saya mengabaikan jika ada versi untuk 14.10 atau 15.04.
Rmano
19

Saya dapat memperbaiki masalah dengan menggunakan dpkguntuk menghapus paket secara langsung. Meskipun paket masih terdaftar dalam dpkg -l, file dihapus dari /boot, membebaskan ruang.

phrogz@planar:/boot$ sudo dpkg --remove linux-image-2.6.32-30-server
(Reading database ... 145199 files and directories currently installed.)
Removing linux-image-2.6.32-30-server ...
Running postrm hook script /usr/sbin/update-grub.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-35-server
Found linux image: /boot/vmlinuz-2.6.32-34-server
Found initrd image: /boot/initrd.img-2.6.32-34-server
Found linux image: /boot/vmlinuz-2.6.32-33-server
Found initrd image: /boot/initrd.img-2.6.32-33-server
Found linux image: /boot/vmlinuz-2.6.32-32-server
Found initrd image: /boot/initrd.img-2.6.32-32-server
Found linux image: /boot/vmlinuz-2.6.32-31-server
Found initrd image: /boot/initrd.img-2.6.32-31-server
Found memtest86+ image: /memtest86+.bin
done

# Repeat for kernels -31 and -32 and -33, up to (but not including)
# the version listed by `uname -a`

Setelah ini, apt-get -f installperbaiki masalah ketergantungan saya, dan semuanya baik-baik saja dengan dunia.

Saya tidak akan menerima jawaban saya ini, karena saya masih perlu tahu apakah saya harus menambah /bootukuran saya atau melakukan sesuatu yang lain.

Phrogz
sumber
Anda seharusnya tidak memiliki partisi / boot terpisah di tempat pertama, atau Anda harus menambah ukurannya karena 100MB terlalu kecil.
psusi
1
Terima kasih, saya hapus melalui:sudo dpkg --remove linux-headers-3.5.0-28*
TiloBunt
2
dan sudo dpkg --remove linux-image-3.5.0-28*untuk gambar, diperiksa melaluidf -h
TiloBunt
Terima kasih, ini juga membantu saya. Saya menghapus beberapa kernel lama ( bukan yang saya gunakan saat ini) dan kemudian melakukan apt-get -f install. Juga, jangan lupa nanti apt-get autoremove, untuk menghapus yang tidak dibutuhkan.
Yajo
15

Anda dapat berhenti menggunakan partisi / boot terpisah, maka Anda tidak akan memiliki ruang terbatas di sana. Untuk melakukan ini, unmount partisi, kemudian pasang di tempat lain dan salin semua file di sana ke direktori / boot di partisi root Anda, kemudian hapus entri dari / etc / fstab dan instal ulang grub. Misalnya (Anda harus menggunakan partisi yang benar):

sudo -s
umount /boot
mount /dev/sda2 /mnt
cp -a /mnt/* /boot/
umount /mnt
gedit /etc/fstab
grub-install /dev/sda

Anda kemudian dapat menggunakan gparted untuk menghapus partisi lama / boot, dan mungkin memperluas partisi root untuk menggunakan ruang itu. Untuk memperpanjang partisi root, Anda harus mem-boot dari livecd, dan ruang kosong harus segera ke kanan. Jika partisi / boot saat ini berada di sebelah kiri partisi root, maka Anda harus terlebih dahulu memindahkan partisi root ke kiri, kemudian memperpanjangnya, tetapi ini bisa memakan waktu yang sangat, sangat lama, jadi mungkin tidak sepadan dengan kesulitan.

psusi
sumber
6
Memindahkan / boot ke partisi utama saya bukan solusi bagi saya karena semuanya kecuali / boot dienkripsi. Anda tidak bisa tahu itu dari pertanyaan saya, maaf.
user6722
Ini adalah solusi yang baik jika solusi di atas tidak berfungsi karena tidak memiliki ruang sama sekali pada volume boot, atau jika Anda berulang kali memiliki masalah "kehabisan ruang". Harap baca dulu mengapa kadang-kadang diperlukan untuk memiliki partisi / boot: ( help.ubuntu.com/community/DiskSpace )
svandragt
@ svandragt, pada dasarnya tidak ada alasan lagi untuk membutuhkan partisi / boot hari ini. Satu-satunya yang tersisa adalah jika bios Anda rusak dan tidak dapat melihat seluruh disk, dan mesin apa pun yang dibuat dalam dekade terakhir tidak memiliki batasan seperti itu. Kasus warisan lainnya seperti menggunakan raid atau LVM sekarang ditangani dengan benar oleh grub2.
psusi
Ada beberapa alasan untuk memiliki partisi boot terpisah. Tapi saya tidak yakin manfaatnya sebanding dengan peningkatan kompleksitas. 1. OS dapat memanfaatkan boot yang lebih cepat via ext2. 2. Keamanan dapat ditingkatkan dengan memasang / boot sebagai RO. (rootkit, dll.), atau bahkan tetap tidak di-mount saat os runtime. 3. grub (1) memiliki (memiliki) beberapa masalah dengan ext4. 4. Diperlukan untuk menjalankan lvm (grubv1). Meskipun ini tidak berlaku untuk pengaturan ubuntu default.
David Cahill
lsblkdapat digunakan untuk menentukan partisi apa
Mr Purple
9

Mengambil yang terbaik dari jawaban di atas, pendekatan saya yang sudah terbukti benar adalah:

  • uname -a untuk menemukan kernel yang berjalan.
  • dpkg -l linux-{headers,image}-\* | grep ^iiuntuk mendaftar semua paket yang terkait dengan kernel yang saat ini diinstal. Ini akan termasuk kernel yang sedang berjalan.
  • sudo apt-get purge linux-{image,headers}-3.16.0-{xx,yy,zz}untuk menghapus kernel lama. Ganti xx,yy,zzdengan daftar kernel yang ingin Anda hapus — ini semua build yang terdaftar oleh perintah sebelumnya yang lebih tua dari kernel yang saat ini berjalan. Pastikan Anda tidak menghapus kernel yang sedang berjalan — sistem Anda akan menjadi tidak bisa di-boot . Anda mungkin juga perlu mengubah versi kernel dari 3.16.0apa pun yang diinstal pada sistem Anda.
  • Secara opsional, lakukan tambahan sudo apt-get autoremove— ini akan menghapus dependensi sisa dari kernel lama yang tidak lagi dibutuhkan oleh kernel saat ini, membebaskan lebih banyak ruang.

Anda mungkin memiliki file header tanpa menginstal versi kernel yang cocok, atau sebaliknya — cukup sertakan semua versi ini dalam perintah. APT akan mengeluh bahwa beberapa paket tidak dapat dihapus karena tidak diinstal, tetapi itu tidak akan membahayakan.

Jika ada yang gagal ...

  • Jika perintah apt gagal karena tidak ada ruang yang tersisa pada perangkat kesalahan, gunakan perintah dpkg yang sesuai sebagai gantinya: sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}.
  • Jika perintah dpkg masih tidak berfungsi karena linux-imagepaket diperlukan oleh linux-headerspaket dari versi yang sama (yang juga ingin Anda hapus), dpkg mungkin gagal menyelesaikannya. Periksa kembali output dpkg -ldan tentukan sufiks nama paket apa pun pada baris perintah. Sebagai contoh, pada salah satu sistem saya perintah yang akhirnya berhasil adalah sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}-generic-pae.
  • Jika Anda mendapatkan kesalahan lain, cari bantuan — Anda mungkin memiliki masalah yang berbeda dari yang Anda pikirkan.
pengguna149408
sumber
@ user535733 kasus biasa (setidaknya yang saya terus jalankan) adalah masih ada beberapa ruang di /boot, hanya tidak cukup untuk paket kernel lain. Dalam kasus-kasus di atas telah bekerja dengan baik. Namun, jangan ragu untuk menambahkan dpkgperintah yang sesuai . Adapun purge, tidak, itu bukan semacam 'pemindahan paksa'. Apa yang dilakukannya, berbeda dari remove, adalah menghapus file konfigurasi juga. Sejak / selama paket kernel tidak menginstal file config, removedan purgeakan melakukan hal yang sama untuk paket kernel.
user149408
Menambahkan peluru keempat dengan perintah dpkg yang sesuai.
user535733
4

Bagi saya keduanya apt-get purgedan dpkg --removekeduanya gagal. Jadi saya harus menghapus beberapa imej kernel lama dari / boot dengan rm -f.

orkoden
sumber
4
Ini bukan cara yang baik untuk menghapus paket. Walaupun jawaban ini tidak terlalu spesifik tentang mengapa menghapusnya dengan cara yang benar gagal, saya yakin jika informasi itu diberikan (dalam pertanyaan yang terpisah tentu saja) kami akan dapat mencoba dan mencari tahu penyebab masalah.
thomasrutter
2
Saya percaya itu gagal, karena /bootpartisi sudah penuh. Perintah ini mencoba terlebih dahulu untuk memutakhirkan kernel ke yang terbaru dan macet No space left on devicesaat membuatinitrd.img
vp_arth
1
PERINGATAN, menghapus file secara langsung dapat menyebabkan masalah, karena pembaruan paket linux-firmware dapat membuat ulang file initrd.img untuk setiap versi yang menurutnya diinstal berdasarkan informasi paket. Lihat: askubuntu.com/questions/865577/…
kgrittn
1
terima kasih, ini adalah solusi akhir yang menyelamatkan jiwa ketika tidak ada lagi yang berfungsi.
Jeff Puckett
4

Daftar semua kernel:

dpkg --list 'linux-image*'

Tampilkan kernel saat ini:

uname -r

Daftar semua kernel KECUALI yang sekarang:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'

Pastikan kernel Anda saat ini tidak ada dalam daftar itu.

Hapus semua kernel KECUALI yang sekarang:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge

Bersihkan barang-barang lainnya:

sudo apt-get autoremove

Jika masih memberi Anda kesalahan ruang disk boot untuk menginstal / menghapus file kemudian langsung menghapus salah satu gambar TUA dari direktori / boot,

ls -lh /boot/*-3.13.0-119*;

rm /boot/*-3.13.0-119*; 

CATATAN: Harap tinjau lagi gambar kernel saat ini sebelum menghapus gambar apa pun.

Hemant Thorat
sumber
2

Saya sudah menghapus paket kernel lama (linux-header ...)

linux-headers-*bukan kernel. Paket kernel adalah yang bernama linux-image-*. Yang disebutkan linux-headers-*adalah paket pengembangan untuk mengkompilasi modul kernel: mereka tidak tinggal di direktori / boot dan tidak diperlukan untuk penggunaan sehari-hari umum sistem Anda.

File yang tercantum dalam / boot lakukan termasuk beberapa gambar kernel lama ( vmlinuz*) dan dikompilasi gambar initrd ( initrd.img*) bagi mereka kernel, yang merupakan indikasi bahwa Anda masih memiliki banyak paket kernel lama dipasang.

Anda harus dapat mendaftarkan kernel yang sudah diinstal

aptitude search ~ilinux-image

(Perhatikan bahwa ini mungkin akan mengembalikan paket yang juga bukan kernel).

Biasanya tidak perlu menginstal lebih dari dua kernel - yang saat ini digunakan dan yang sebelumnya (sebagai fallback). Jadi Anda dapat mulai menghapus yang lama, satu per satu, seperti ini:

sudo apt-get autoremove linux-image-3.2.0-23-generic

Pastikan Anda mengganti "3.2.0-23-generic" dengan versi kernel aktual yang ingin Anda hapus! Juga, jangan hapus paket seperti linux-image-generic. Anda harus benar-benar berhati-hati untuk tidak menghapus kernel yang sedang berjalan atau Anda tidak akan bisa boot (Ubuntu mungkin atau mungkin tidak memperingatkan Anda tentang melakukan ini).

Anda dapat menemukan kernel yang sedang berjalan dengan:

uname -r
thomasrutter
sumber
1

Saya punya masalah ini dan lebih banyak lagi karena saya menghapus beberapa initrd-img-xxxfile secara manual dari / boot dan saya punya masalah bahwa versi lama ini terus dihasilkan dan mengisi /bootfolder. Untuk memperbaikinya saya mengikuti yang berikut:

  • Saya menghapus versi kernel lama yang dihasilkan secara manual sehingga membebaskan ruang.
  • Anda akan mengedit file konfigurasi teks sebagai superuser, jadi rekatkan yang berikut ke terminal:

    sudo gedit /etc/initramfs-tools/update-initramfs.conf
    
  • Temukan baris update_initramfs=yesdan ubah ke update_initramfs=no. Simpan dan keluar dari file, lalu jalankan:

    sudo dpkg --configure -a
    

Itu memecahkan masalah saya. Itu didasarkan pada blog ini

Mudah-mudahan, semuanya harus baik-baik ketika anda reboot, dan kemudian Anda dapat mencoba mengubah nokembali ke yesdalam update-initramfs.conf.

aibrahim
sumber
1

Saya menunjukkan bahwa masih pada tahun 2017 pertanyaan ini memiliki komentar dan jawaban baru tetapi melewatkan satu jawaban yang menurut saya sangat berguna di sini:

Ubuntu sebagai OS desktop untuk penggunaan sehari-hari yang sederhana tidak memiliki alasan untuk diinstal dengan partisi \ boot terpisah dan sesuatu seperti ini TIDAK akan menawarkan sesuatu kepada "pengguna biasa" ... Jadi solusinya adalah instalasi baru tanpa partisi \ boot dan ini cara Anda tidak akan pernah memiliki masalah seperti itu

PS: Jawaban saya dapat dihapus atau ditambahkan dalam jawaban yang diterima ... (Saya pikir ini akan membantu beberapa orang dengan cara ini)

koleygr
sumber
1

Utilitas super bermanfaat yang akan menghapus partisi boot Anda

git clone https://github.com/erichs/bootnukem.git
cd bootnukem
sudo ./install.sh

Gunakan dengan risiko Anda sendiri, tetapi itu berhasil untuk saya:

sudo bootnukem
Jonathan
sumber
Mengapa downvote?
Jonathan
0

Dalam aptitude atau synaptic ada bagian "paket lama atau yang diinstal secara manual". Seharusnya ada paket linux lama di sana.

Martin Ueding
sumber
0

Ada skrip bash yang saya tulis berikan di bawah ini yang membuat prosesnya sedikit lebih ramah pengguna.

YMMV - itu dibuat untuk Mint 14. Masih belajar BASH jadi mungkin agak kikuk. Gunakan dengan risiko sendiri, tetapi itu berhasil untuk saya!

#!/bin/bash

endCol='\e[0m'
bold_red='\e[1;31m'
bold_green='\e[1;32m'
bold_yellow='\e[1;33m'

title_color='\e[0;30;47m'

function show_kernel_info {
clear
current_kernel=$(uname -r)
echo "Current ACTIVE kernel is:"
echo -e "  "$bold_yellow$current_kernel$endCol
echo "This kernel will be TOTALLY EXCLUDED from all actions in this script."
echo "Also, one fallback non-active kernel will be always left untouched."
echo ""
echo "These are the non-active kernels stored in /boot:"
count_of_old_kernels_in_boot=$(ls -o /boot/initrd* | grep -c -v "$current_kernel")
if [ $count_of_old_kernels_in_boot = 0 ]; then
  echo " * No non-active kernels found! *"
else
  ls -o /boot/initrd* | grep -v "$current_kernel"
fi
echo ""
list_of_old_kernels=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic")
current_old_kernel=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic" | head -n 1)
count_of_old_kernels_installed=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -c -v "linux-image-generic")
echo "Listing of all unused kernels still installed in the system (these may not exist in /boot):"
if [ $count_of_old_kernels_installed = 0 ]; then
  echo " * No unused kernel installs found! *"
else
  dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic"
fi
echo ""
}

function exit_script {
free_space_after=$(df -BM /boot | tail -n 1 | awk -F' ' '{ print $4 }' | tr -d M)
let freed_space=$free_space_after-$free_space_before
echo ""
echo "Results (in MB)"
echo "---------------"
echo "Free space in /boot before script was run: "$free_space_before
echo "Free space now: "$free_space_after
echo ""
echo "Amount of space freed up = "$freed_space
echo ""
echo "Press any key to exit."
read -s -n 1
echo ""
exit
}

# Main code
echo ""
echo -e $title_color" --------------------------- "$endCol
echo -e $title_color" -   Kernel Cleanup v1.0   - "$endCol
echo -e $title_color" --------------------------- "$endCol
echo ""
echo "Maximise this window for readability."
echo "Press any key to continue."
read -s -n 1
echo ""
echo "This script will remove old unused kernels, but it will prompt you before removing each one."
echo "It will never remove the current running kernel, and will also leave one fallback kernel."
echo "It can also remove source files from /usr/src for each kernel removed."
echo "This is normally safe to do and will free up lots more space."
echo ""
echo "Do you want that done as well? (y/n, enter=yes)"
valid_input=0
while [ "$valid_input" = "0" ]; do
  read -s -n 1 YesNo_input
  if [ "$YesNo_input" = "" ]; then
    YesNo_input="y"
  fi
  case $YesNo_input
  in
    y)
    RemoveSource="y"
    valid_input=1
    ;;

    Y)
    RemoveSource="y"
    valid_input=1
    ;;

    n)
    RemoveSource="n"
    valid_input=1
    ;;

    N)
    RemoveSource="N"
    valid_input=1
    ;;
  esac
done

free_space_before=$(df -h /boot | tail -n 1 | awk -F' ' '{ print $4 }' | tr -d M)
show_kernel_info
while [ $count_of_old_kernels_in_boot -gt 1 ]; do
  # failsafe check if somehow the current kernel is about to be removed!
  if [ "$current_old_kernel" = "$current_kernel" ]; then
    echo -e $bold_red"ERROR!"$endCol" Somehow the current kernel has crept into the removal process!"
    echo "I refuse to do that! Aborting script."
    exit_script
  fi
  # failsafe check if somehow a linux-image-generic entry is about to be removed
  if [ "$current_old_kernel" = "linux-image-generic" ]; then
    echo -e $bold_red"ERROR!"$endCol" Somehow one of the linux-image-generic entries has crept into the removal process!"
    echo "I refuse to do that! Aborting script."
    exit_script
  fi
  echo "Command about to be executed is:"
  echo "  $ sudo apt-get purge \"$current_old_kernel\""
  check_in_boot=$(echo $current_old_kernel | sed 's/linux-image/initrd.img/g')
  if [ -e /boot/$check_in_boot ]; then
    echo -e $bold_yellow"Note:"$endCol" This kernel exists in /boot but it NON-active, so it's OK to remove."
  else
    echo -e $bold_green"Totally safe to remove:"$endCol" This kernel does NOT exist in /boot."
  fi
  echo ""
  echo "Are you sure you want to remove this kernel?"
  echo "(*upper case* Y=yes / any other key will exit the script)"
  read -s -n 1 yes_no
  echo ""
  # Only entering a single upper case Y will work!
  if [ "$yes_no" != "Y" ]; then
    echo "Aborting script."
    exit_script
  fi
  echo "Removing kernel "$current_old_kernel"..."
  sleep 1
  sudo apt-get -y purge $current_old_kernel
  if [ "$RemoveSource" = "y" ]; then
    current_old_source=$(echo $current_old_kernel | sed 's/linux-image/linux-headers/g')
    current_old_source=$(echo $current_old_source | sed 's/-generic//g')
    current_old_source=$(echo $current_old_source | sed 's/-pae//g')
    sudo apt-get -y purge $current_old_source
  fi
  show_kernel_info
done

if [ $count_of_old_kernels_in_boot = 0 ]; then
  echo -e $bold_red"There are no NON-active kernels to remove!"$endCol
else
  echo -e $bold_red"There is only one NON-active kernel left in /boot!"$endCol
  echo "This script will not remove the last non-active kernel so that you have at least one backup kernel."
fi
echo "Aborting script."
exit_script
wibbynut
sumber
0

[Sebagai noob AskUbuntu, saya tidak bisa berkomentar sampai reputasi = 50 jadi jangan pilih-pilih karena ini.]

Server saya juga melakukan ini. Secara harfiah tidak ada jawaban yang diharapkan di sini yang berfungsi karena ini membutuhkan ruang kerja on / boot untuk menyelesaikannya. Jika partisi boot penuh, ia akan tiba-tiba berakhir tanpa menghapus gambar apa pun.

Satu-satunya hal yang berhasil bagi saya adalah meninjau gambar saat ini, kemudian secara manual sudo rm filenameuntuk file gambar tertua (masing-masing memiliki -3.16.0-30 dalam nama mereka). Setelah itu selesai, kemudian sudo apt-get autoremovememiliki ruang gerak yang diperlukan untuk melakukan tugasnya. Itu menyoroti beberapa kesalahan yang terkait dengan versi itu, misalnya: "depmod: FATAL: tidak dapat memuat /boot/System.map-3.16.0-30-generic: Tidak ada file atau direktori" "tetapi itulah yang diharapkan.

Setelah selesai, dfmengembalikan 42% yang digunakan untuk / boot untuk menunjukkan bahwa itu sehat kembali.

Untuk berjaga-jaga
sumber
1
Posting yang Anda cari adalah askubuntu.com/questions/171209/…
muru
@uru Ya, ya ... Saya akan menyarankan bahwa poster aslinya juga membutuhkan saran ini. Setelah / boot penuh, versi skrip yang berusaha memperbaikinya juga gagal karena, well, / boot sudah penuh.
Justin Case
Nah, ada dua masalah serupa: a) di mana sistem memperingatkan bahwa disk Anda semakin penuh, tetapi apt-getmemiliki cukup ruang untuk melanjutkan, dan b), di mana apt-getgagal karena disk terlalu penuh. Itu pos lainnya.
muru
0

Saya menulis skrip bash ini untuk secara selektif membersihkan kernel lama sekaligus:

kernel ukuran sebenarnya

Semua kode dan instruksi bash termasuk dalam tautan.

WinEunuuchs2Unix
sumber
0

Simpan skrip ini sebagai /usr/local/bin/remove_kernels.sh(jangan lupa untuk memberikan izin eksekusi sudo chmod 755 /usr/local/bin/remove_kernels.sh):

#!/bin/sh
if test $(id -u) != 0; then
 echo Error: You must be root to run this script!
 exit 1
fi
apt purge $( dpkg --list | grep -P -o "linux-image-\d\S+" | grep -v $(uname -r | grep -P -o ".+\d") )
update-grub

Kemudian untuk menghapus semua kernel lama cukup ketik: sudo remove_kernels.sh

Anthony Kelly
sumber
0

/ Partisi boot terkadang agak aneh

jangan langsung mulai menghapus file kernal.

Langkah-langkah untuk diikuti

  1. Periksa kernal yang terinstal saat ini digunakan oleh sistem linux

    uname -r

    ini akan memberi Anda nama gambar kernal yang diinstal pada sistem

  2. Sekarang mulailah menghapus file-file tambahan kecuali yang khusus diinstal pada sistem Anda

    apt-get remove linux-image-XXXXX

  3. Hapus juga file tajuk

    apt-get remove linux-headers-XXXXX

  4. Juga mungkin ada kondisi di mana apttelah berhenti bekerja, dalam hal ini beralih ke / boot

    cd /boot

  5. Mulai menghapus file secara manual tetapi sangat hati-hati juga perlu diingat tidak menghapus installed one'sfile kernal dari sistem Anda.

    rm linux-image-XXXXX

    rm linux-image-extra-XXXXXX

  6. Setelah menghapus file yang benar, instal pembersihan parsial jika ada

    apt-get -f install

  7. Hapus file tambahan yang ada di sana saat file boot dibersihkan secara manual

    apt-get autoremove

  8. Perbarui grub

    update-grub

  9. Terakhir perbarui paket sistem Anda

    apt-get update

user225
sumber
-1

Jika Anda tidak dapat menghapus lebih banyak file yang tidak digunakan dan jika Anda memiliki partisi lain dengan / atau ruang kosong pada perangkat yang sama, Anda dapat mengubah ukuran / mem-boot partisi dengan parted / gparted . (Termasuk di media instalasi juga.)

Peringatan : Mengubah ukuran partisi adalah operasi berbahaya , simpan data penting Anda di media lain sebelum melakukannya!

Rudolf Dovičín
sumber
Sebagian besar penderita partisi terpisah / boot kecil memilih 'enkripsi seluruh disk' saat instalasi, yang memerlukan LVM. Solusi ini tampaknya akan menyebabkan lebih banyak masalah daripada yang diselesaikan untuk pengguna tersebut.
user535733