Bagaimana cara menghapus versi kernel lama untuk membersihkan menu boot?

701

Setiap kali saya menginstal kernel Linux baru, ia ditinggalkan di grub_config, membuat menu boot lebih lama setiap kali.

Saya tahu saya bisa mencari secara manual melalui paket yang diinstal dan menghapusnya.

Apakah Ubuntu menyediakan cara yang lebih mudah untuk membersihkannya atau mencegahnya agar tidak muncul di daftar boot?

Hans
sumber
10
Ada perintah ubuntu yang disebut purge-old-kernels untuk melakukan pekerjaan itu. Lihat jawaban saya untuk informasi lebih lanjut.
jarno
29
sudo apt-get autoremoveharus melakukan trik di Ubuntu 14.04+
hobs
1
Akumulasi kernel lama adalah bug, dengan perbaikan sedang berlangsung: bugs.launchpad.net/bugs/1357093 . Ketika perbaikan dilepaskan, kernel yang lebih tua akan secara otomatis autoremove secara default.
user535733
1
@hobs Perintah ini tidak melakukan trik untuk saya di Ubuntu Studio 14.04, jika kernel belum diinstal secara otomatis, tetapi oleh Software Updater.
jarno
1
Saya selalu kembali ke halaman ini ... komentar oleh @hobs hanya berfungsi jika kernel Anda terinstal otomatis - namun Anda membuat sudo apt-get autoremove --purge jawabannya dengan mengikuti apt-marksaran di https://help.ubuntu.com/community/RemoveOldKernels
earcam

Jawaban:

602

16.04 dan versi Ubuntu yang lebih baru

sudo apt autoremove

Perintah ini menghapus paket yang secara otomatis diinstal untuk menyelesaikan ketergantungan, tetapi sekarang tidak lagi bergantung pada. Ini termasuk versi lama linux-headers-*dan linux-image-*. (Ini juga pintar tentang proses ini, meninggalkan satu versi cadangan dari kernel sebagai cadangan!)

11.10 dan versi Ubuntu yang lebih baru

GRUB2 dan tampilan semua kernelnya

Versi terbaru dari Grub2 yang dipasang di Ubuntu secara otomatis menampilkan kernel terbaru dan menyembunyikan kernel lama yang mungkin telah Anda instal.

GNU GRUB

Jika Anda tidak melihat grub Anda - maka ingatlah untuk menekan Shiftsaat booting.

Seperti yang Anda lihat, hanya kernel terbaru yang ditampilkan.

Jika Anda memilih opsi yang ditunjukkan (tekan Enter) maka semua kernel lama menjadi terlihat dan tersedia untuk boot.

GNU GRUB Versi sebelumnya

Cara menghapus kernel lama secara permanen

Boot pertama dengan kernel terbaru yang tersedia.

Ada beberapa cara untuk menghapus kernel lama. Secara pribadi, saya tidak akan menyentuh Computer Janitor karena ini diakui dapat merusak komputer Anda dengan saran-sarannya.

sinaptik

Alternatifnya adalah Synaptic ( sudo apt install synaptic)

cari linux-image , klik kanan kernel dan pilih penghapusan lengkap dan akhirnya klik tombol Terapkan untuk menghapus kernel.

Manajer Paket Synaptic

Ulangi pencarian tetapi kali ini untuk linux-header - Anda dapat menghapus header terkait untuk gambar kernel yang dipilih sebelumnya.

Synaptic meskipun tidak akan mencoba memverifikasi apa yang Anda coba hapus ... Anda bisa secara tidak sengaja menghapus kernel terbaru Anda - atau bahkan menghapus semua kernel Anda melalui alat ini meninggalkan Anda dengan Ubuntu yang tidak dapat di-boot !

Ingatlah untuk memeriksa kernel yang Anda gunakan ketik:

uname -r

Hasilnya akan mirip dengan:

Terminal <uname -r>

Ingat hasil dan jumlahnya - pastikan Anda tidak menghapus gambar atau tajuk yang sesuai.

Rekomendasi

Rekomendasi saya adalah menyimpan setidaknya dua atau lebih disukai tiga kernel termasuk yang terbaru. Alasan untuk rekomendasi ini adalah bahwa Anda akan memiliki setidaknya satu / dua kernel untuk di-boot, jika karena alasan apa pun kernel terbaru yang tidak dapat Anda boot dengan atau memperkenalkan kemampuan yang mengalami kemunduran seperti nirkabel yang rusak.

fossfreedom
sumber
3
Menghapus paket "linux-image *" lama menggunakan synaptic, bekerja dengan baik dengan 10,04 juga. (Saya menyebutkannya karena judulnya menunjukkan hanya untuk 11,10 dan lebih tinggi)
mivk
4
yang -yberalih pada akhir apt-getbaris diperlukan, jika tidak apt-get hanya meminta konfirmasi dan karena input pipa, itu hanya dibatalkan. Jadi harus diakhiri dengan:| xargs sudo apt-get purge -y
Josh
37
Menghapus sekitar 20 versi lama linux-imagedan linux-headersmembebaskan ruang 4,5GB di komputer saya.
Andrew Mao
16
Metode ini bekerja dengan baik, tetapi penghapusan setiap kernel secara berlebihan meregenerasi grub.cfg, yang membutuhkan waktu. Apakah ada cara menonaktifkan ini untuk penghapusan batch, kemudian regenerasi sekali?
spacediver
15
Saya pertanyaan kedua dari @spacediver - ini adalah proses gila-lambat ketika Anda memiliki 38 kernel yang tidak dibutuhkan, karena karena masing-masing kernel dihapus instalannya melalui semua yang tersisa sambil menghasilkan grub.cfg baru. Itulah yang kami sebut operasi N ^ 2 - proses kernel sekitar (38 ^ 2/2) = 722 kali, dan sangat lambat. Tentunya Ubuntu dapat menghasilkan sesuatu yang lebih baik ....
nealmcb
384

Pertama, reboot sistem Anda untuk memastikan ia menggunakan kernel terbaru. Kemudian buka terminal dan periksa kernel Anda saat ini:

uname -r 

JANGAN HAPUS KERNEL INI!

Selanjutnya, ketik perintah di bawah ini untuk melihat / mendaftar semua kernel yang diinstal pada sistem Anda.

dpkg --list 'linux-image-*'

Temukan semua kernel yang lebih rendah dari kernel Anda saat ini. Ketika Anda tahu kernel mana yang harus dihapus, lanjutkan di bawah ini untuk menghapusnya. Jalankan perintah di bawah ini untuk menghapus kernel yang Anda pilih.

sudo apt-get purge linux-image-x.x.x-x-generic 

Terakhir, jalankan perintah di bawah ini untuk memperbarui grub2

sudo update-grub2 

Mulai ulang sistem Anda.

penreturns
sumber
34
Ketika melakukan ini di 10,04 dan 12,04, saya menemukan pembaruan-grub secara otomatis dijalankan selama proses pembersihan.
Aidan
93
ekspansi brash bash dapat digunakan, misalnya sudo apt-get purge linux-image-3.2.0-3{0..5}-generic(menghilangkan 30,31, .., 35)
ajo
12
Tidak perlu me-reboot sistem sesudahnya. Bahkan, Anda harus reboot sistem sebelum melakukan langkah-langkah ini, untuk memastikan Anda menggunakan versi kernel terbaru yang mungkin baru saja Anda unduh & instal (Anda melakukan pembaruan apt-get && apt-get sebelum ini, kan ??)
Ricket
4
Anda mungkin juga ingin menghapus instalasi linux-signed-imagepaket yang mungkin diinstal di sistem UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-genericyang akan menghapus 12, 14 dan 24
devius
1
@ Jarno Saya tidak tahu apakah saya menggunakan kernel yang ditandatangani atau tidak, tetapi uname -rtidak memiliki signedstring pada sistem saya. Saya tampaknya memiliki citra ditandatangani diinstal dan output dari yang lsperintah: /boot/vmlinuz-3.19.0-16-generic.efi.signed.
devius
283

One-liner saya untuk menghapus kernel lama (ini juga membebaskan ruang disk)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

Penjelasan (ingat, |gunakan output dari perintah sebelumnya sebagai input ke yang berikutnya)

  • dpkg --list daftar semua paket yang diinstal
  • grep linux-image mencari gambar linux yang diinstal
  • awk '{ print $2 }' hanya menampilkan kolom ke-2 (yang merupakan nama paket)
  • sort -V menempatkan item dalam urutan dengan nomor versi
  • sed -n '/'`uname -r`'/q;p' mencetak baris sebelum kernel saat ini
  • xargs sudo apt-get -y purge membersihkan kernel yang ditemukan

Membatalkan sedundangan:

  • -nmenyuruh seddiam
  • `uname -r` menampilkan rilis kernel yang terinstal saat ini - kami menyertakannya dalam backticks sehingga hasilnya termasuk sebagai bagian dari perintah (Anda mungkin juga melihat ini sebagai $(uname -r)
  • /something/qmengatakan berhenti ketika Anda mencocokkan 'sesuatu' (dalam hal ini, sesuatu adalah output uname -r) - /mengelilingi ekspresi reguler
  • p dicetak
  • itu ;adalah perintah separtor, begitu /something/q;pkata berhenti ketika Anda mencocokkan sesuatu, cetak lain

semuanya, sed -n '/'`uname -r`'/q;p'cetak baris sampai cocok dengan nama kernel saat ini.

Jika Anda paranoid (seperti saya), Anda dapat membuat bagian terakhir xargs echo sudo apt-get -y purgesehingga perintah untuk membersihkan kernel lama dicetak, maka Anda dapat memeriksa bahwa tidak ada yang tidak terduga yang dimasukkan sebelum Anda menjalankannya.


Versi modifikasi untuk menghapus header:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

Catatan: seddoa diubah. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"ekstrak hanya versi (mis. "3.2.0-44"), tanpa "-generik" atau serupa dariuname -r


Versi lengkap untuk menghapus gambar dan tajuk (menggabungkan dua versi di atas):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge
David Kemp
sumber
1
Perhatikan bahwa sedikit berbahaya untuk mencocokkan versi kernel saat ini dengan ekspresi reguler seperti itu: Dots cocok dengan karakter apa pun dan 3.1.2-23 cocok dengan 3.1.2-2 (atau sebaliknya). Lihat juga jawaban saya .
jarno
19
Ini versi all-in-one yang disetel: sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)Lihat juga jawaban saya .
jarno
1
@ Jarno yang membantu saya sampai batas yang sangat luar biasa ... Kudos to one liner Anda
Clain Dsilva
5
Karena dependensi yang belum terpenuhi, saya harus menggunakannya dengan dkpg -P. Ini adalah versi lengkapnya:dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P
Sebastian Sastre
3
JANGAN LAKUKAN INI! "Oneliner itu terlihat agak berbahaya, tetapi pasti 220 orang yang memilih tidak mungkin salah!" Saya berpikir sendiri dan secara buta menyalin-tempel. Reboot, langsung ke GRUB. Perintah itu menghapus semua kernel saya, termasuk yang saya gunakan. Mungkin saya menjalankan kernel realtime, bahkan tidak ingat. Saat ini mencari di sekitar rumah saya untuk tongkat USB untuk menginstal Ubuntu Live CD di :(
Andreas Jansson
60

Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10 dan di bawah ini:

Saya menemukan ini sebagai cara termudah dan tercepat. Itu membuat kernel terbaru dan dua lagi:

sudo apt-get install bikeshed
sudo purge-old-kernels

Untuk mengubah jumlah kernel tambahan yang disimpan:

sudo purge-old-kernels --keep 3
bmaupin
sumber
1
Perintah itu adalah skrip shell, lokasi yang dapat Anda temukan which purge-old-kernels.
jarno
Senang mereka membuat ini jauh lebih mudah di 16,04! Semoga jawaban ini terus meningkat ...
Toby J
Di Ubuntu 16.04 saya punya paket purge-old-kernelstanpa bikeshed ( alat berguna acak yang belum memiliki rumah permanen ) atau paket tertentu. Hindari menggunakan apt-get -yopsi, seperti menutup mata dan berharap semuanya akan baik-baik saja. Juga di sini adalah bagaimana autoremove memutuskan berapa banyak kernel lama yang akan disimpan.
Pablo A
2
Di 16.04 kernel purge-old disediakan oleh paket byobu (petunjuk:) apt-file search purge-old-kernels. Setuju apt-get -y, saya akan menghapusnya.
bmaupin
1
@Dan karena saya tidak menggunakan versi non-LTS saya tidak yakin kapan itu dimulai. Tetapi saya dapat mengatakan dengan pasti bahwa sudo apt-get autoremoveitu tidak menghapus kernel di 14.04. Jangan ragu untuk memperbarui jawabannya dengan versi spesifik jika Anda tahu apa itu!
bmaupin
43

Menghapus Entri dari Grub 2 Entri harus dihapus dengan mengedit atau menghapus file di folder /etc/grub.d. File /boot/grub/grub.cfg hanya-baca dan biasanya tidak memerlukan pengeditan.

Kernel terlalu banyak?

  • Jika Anda tidak yakin dengan kernel yang Anda gunakan saat ini, dalam terminal ketik uname -r .

  • Kernel dihapus melalui APT (Synaptic, "apt-get remove", dll.) Secara otomatis akan memperbarui grub.cfg dan tidak ada tindakan pengguna yang diperlukan.

  • Alat hebat untuk menghapus kernel (dan entri menu) adalah Ubuntu-Tweak, aplikasi GUI yang aman dan mudah digunakan.

  • Instal tweak ubuntu

  • Ubuntu-Tweak akan tersedia di bawah Applications> System Tools.

Hapus Entri Kernel Lama

  • Pilih "Package Cleaner" di sebelah kiri dan "Clean Kernel" dari panel kanan.

  • Tekan tombol "Buka Kunci" di kanan bawah, masukkan kata sandi Anda.

  • Pilih dari daftar yang ditampilkan gambar dan header kernel yang ingin Anda hapus. Kernel yang digunakan tidak terdaftar.

  • Tekan tombol "Cleanup" di kanan bawah untuk menghapus gambar dan header kernel yang dipilih.

Hapus Sistem Operasi dari menu Grub

  • Sistem Operasi lain yang telah dihapus dari komputer juga akan dihapus dari menu setelah "update-grub" dijalankan sebagai root.

  • Item menu ditempatkan pada menu Grub2 oleh skrip. Jika Anda tidak ingin Sistem Operasi lain dimasukkan dalam menu, nonaktifkan /etc/grub.d/30_osprober

  • Jalankan perintah ini untuk menghentikan skrip agar tidak berjalan
    sudo chmod -x /etc/grub.d/30_os-prober

  • DISABLE_30_OS-PROBER = 'true' di / etc / default / grub

Hapus Memtest86 + dari Menu Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Jalankan perintah update-grub untuk memungkinkan perubahan dimasukkan dalam grub.cfg

Sumber

Catatan: Setelah pembaruan kernel, entri baru ditambahkan ke menu GRUB. Anda dapat menghapus yang lebih tua jika Anda mau. Namun, sebagian besar pengguna yang berpengalaman akan menyarankan Anda untuk menyimpan setidaknya satu entri cadangan jika terjadi kesalahan dengan peningkatan dan Anda perlu mem-boot versi kernel lama untuk tujuan pemecahan masalah.

Cara alternatif untuk menghapus entri Kernel (sebelum 10,04)

untuk GRUB bukan GRUB2

manajer startup Instal startupmanager

Anda dapat menemukannya di Sistem >> Administrasi >> teks alternatif
teks alternatif
Anda lihat di tangkapan layar kedua Anda dapat memilih berapa banyak kernel yang akan ditampilkan? Saya biasanya hanya menyimpannya di 1, tetapi ketika saya mendapatkan upgrade kernel saya selalu mengubahnya ke 2 sebelum restart sehingga saya dapat memilih kernel yang lebih tua jika kernel baru memiliki masalah dengan perangkat keras saya. Setelah saya tahu kernel baru berfungsi dengan baik, saya mengubahnya kembali ke 1.

karthick87
sumber
2
Sebenarnya, startupmanager tidak memberi saya jendela seperti ini di Ubuntu 10,04, alih-alih itu hanya memberi jendela dengan dua tab -> opsi Boot dan Advanced .. dan di dalamnya tidak memiliki opsi untuk membatasi jumlah kernel. Jadi tolong perbarui jawaban untuk Ubuntu 10.04. (Dan itulah sebabnya saya memilih-bawah ini ..)
Sen
tahu bagaimana "jumlah kernel yang harus disimpan" dapat didefinisikan pada mesin yang tidak memiliki GUI yang diinstal (server)?
sylvainulg
startupmanager sudah usang. Lihat grup-customizer
muhasturk
39

Murni commandline, ini akan menghapus semua kecuali arus saat ini dan kedua saat ini (melalui "-2" pada perintah kepala di bawah ini):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge
Kees Cook
sumber
9
satu-liner dari sana :dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
Dmitry Verkhoturov
@DmitryPaskal, Anda harus menambahkan ini sebagai jawaban baru.
saji89
10
@DmitryPaskal Seperti biasa, jangan hanya menyalin-tempel ini tanpa memahaminya. Di komputer saya, liner satu ini juga cocok dengan linux-libc-dev:amd64yang seharusnya tidak dihapus.
jamesadney
1
@Kees Cook, bukankah argumen awk hanya dikelilingi oleh tanda kutip tunggal? Jika maksud Anda adalah untuk menambahkan "linux-image-" ke saluran pipa, ini hanya berfungsi jika Anda menggunakannya awk '{print "linux-image-" $0}'.
Tandai
ini tidak berfungsi untuk saya, ini termasuk kernel terinstal kustom saya (Ubuntu 14,04 dengan 3,17)
Alex R
35

Pembaruan: purge-old-kernelssudah usang saat ini.

Saya membuat naskah untuk membersihkan kernel bahkan dalam kondisi sulit. Ini disebut linux-purgedan Anda dapat menemukannya di sini .

Jika Anda hanya ingin membersihkan kernel (dan paket-paket terkait) yang lebih tua dari kernel yang saat ini digunakan, ketika sistem tidak rusak, Anda bisa menggunakan skrip ini .

Ada juga halaman dokumentasi Ubuntu yang saya berkontribusi untuk menghapus kernel lama di sini .

jarno
sumber
Sepertinya purge-old-kernelstidak dalam versi yang tepat (1.22) dari bikeshed. Apakah ada cara yang masuk akal / aman untuk mendapatkan bikeshed terbaru yang lebih tepat? Atau apakah lebih sederhana / aman untuk menginstal skrip saja? Saya lebih suka menggunakan repo, meskipun daftar panjang dependensi ..
drevicko
1
@drevicko Lihat di sini .
jarno
1
@drevicko, tentu,dlocate -lsbin bikeshed
jarno
1
@drevicko, lihat juga pertanyaan lain
jarno
1
@ Chris, ya ada. Saya baru saja membuat sedikit perbaikan pada skrip, jadi yang terbaik adalah menggunakan versi terbaru.
jarno
29

Anda dapat mengikuti bagian Menggunakan paket "unattended-upgrade" dari artikel Pembaruan Keamanan Otomatis di Wiki Ubuntu untuk melakukan ini.

Anda perlu mengubah baris berikut di file /etc/apt/apt.conf.d/50unattended-upgrades ;

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

dengan

Unattended-Upgrade::Remove-Unused-Dependencies "true";

untuk secara otomatis menghapus paket lama, termasuk kernel.

Juga hapus atau komentari baris

"^linux-image.*"; 

di bagian "NeverAutoRemove" pada file /etc/apt/apt.conf.d/01autoremove.

Qwerty
sumber
2
Saya melakukan ini tetapi masih mengumpulkan 3+ kernel lama mengkonsumsi 100-an MBs. Jadi saya menambahkan apt-get autoremoveke pekerjaan cron harian saya yang benar-benar melakukan peningkatan, karena tidak selalu melalui pembaruan-manajer bawaan.
Marcos
Saya pikir ini hanya berfungsi di Trusty untuk kernel yang telah diinstal secara otomatis.
jarno
Ini bagus untuk mencegah penumpukan kernel lama ketika paket pemutakhiran otomatis, misalnya dengan peningkatan tanpa pengawasan. Namun jika Anda tidak me-reboot, Anda mungkin menemukan bahwa paket untuk kernel yang saat ini berjalan telah dihapus instalasinya! Salah satu masalah ini dapat menyebabkan: perangkat baru yang Anda pasang mungkin tidak berfungsi, karena modul untuk mereka tidak dapat di-hot-load, karena tidak lagi ada di disk Anda. (Perbaikan cepat untuk ini adalah hanya menginstal paket kernel lagi, dan kemudian cabut dan pasang kembali perangkat.)
joeytwiddle
Saya membuat solusi otomatis untuk masalah yang disebutkan di atas. Jika menurut Anda ini adalah pendekatan yang baik, silakan menambahkannya ke jawaban Qwerty.
joeytwiddle
27

Cara tercepat / lebih sederhana (Berlaku setidaknya sejak 12,04) mungkin yang sudah disertakan dengan Ubuntu apt-get. Lakukan hal berikut jika Anda ingin menghapus semua versi kernel lama yang tidak digunakan (Kecuali yang sebelumnya tidak Anda gunakan. Ini untuk memastikan bahwa jika versi kernel saat ini gagal dalam beberapa cara, Anda memiliki cara untuk pergi kembali ke keadaan sebelumnya). Lakukan hal berikut:

sudo apt-get autoclean

Ini akan menghilangkan semua file lama (Termasuk versi kernel) yang mungkin Anda miliki. Perhatikan bahwa jika Anda memiliki banyak versi lama, itu akan memakan waktu cukup lama karena harus memastikan bahwa menghapus versi kernel tidak memiliki masalah. Bagi saya, menghapus 12 versi kernel terakhir membutuhkan waktu sekitar 2 menit. Anda juga dapat melakukan hal berikut:

sudo apt-get clean

Yang akan menghilangkan semua yang diunduh dan disimpan dalam folder cache apt. Terakhir yang Anda miliki:

sudo apt-get autoremove

yang akan memeriksa semua paket yang tidak digunakan dan menghapusnya jika perlu. Ini bagus untuk pustaka dan paket dependensi yang tidak lagi dibutuhkan oleh aplikasi apa pun yang diinstal.

Luis Alvarado
sumber
1
Saya kira ini telah berubah dalam rilis yang lebih baru karena pada 14.04 ini hanya membersihkan cache paket dan tidak mempengaruhi paket atau grub yang diinstal.
jarno
2
Saya dapat mengonfirmasi bahwa sudo apt-get autoremovememang menghapus kernel lama (lebih dari satu versi yang lalu) di 14,04. Anda mungkin harus menjalankannya sebelum dan setelah memutakhirkan kernel Anda. Ketika saya menjalankan sebelum memutakhirkan, itu hanya menghapus versi generik kernel lama. Kemudian, setelah memutakhirkan kernel saya, itu menghapus versi lowlatency kernel lama, juga.
tekNorah
Saya maksud sudo apt-get autocleanperintah. @tekNorah Saya menginstal beberapa kernel yang lebih tua dan kemudian dijalankan sudo apt-get autoremovedi Ubuntu Studio 14.04. Itu tidak menghapus kernel. Saya hanya menginstal kernel lowlatency. Mengapa kedua kernel -generic dan -lowlatency terinstal?
jarno
5
Ya, ini bekerja dengan baik untuk saya, membersihkan semua kernel lama dengan benar, dan tidak bergantung pada skrip satu baris yang gila! Disarankan, andai saja saya dapat memperbaiki ini lebih dari sekali!
Jeff Atwood
1
@ JeffAtwood, mungkin menghapus lebih banyak kernel yang aman. Lihat laporan bug
jarno
25

10,04 Metode GUI

Computer Janitor dapat membersihkan kernel lama dan saya percaya diinstal secara default di Ubuntu (tetapi tidak Kubuntu).

GRUB 1, jika Anda menggunakannya, memiliki opsi /boot/grub/menu.lstuntuk menentukan berapa banyak kernel yang akan ditampilkan secara maksimal. GRUB 2, sejauh yang saya tahu, tidak.

maco
sumber
4
Computer Janitor tidak boleh digunakan - itu buggy dan sekarang telah dijatuhkan sebagai aplikasi default di natty / oneiric / tepat.
fossfreedom
2
Sebaliknya, instal "Ubuntu Tweak" seperti yang dijelaskan dalam jawaban lain (ppa sendiri), yang memiliki "pembersih komputer" sendiri (jangan bingung dengan "pembersih komputer" yang sementara tersedia di versi ubuntu yang lebih lama)
michael
25

Untuk mengetahui kernel dan header apa yang diinstal gunakan

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

Anda kemudian dapat menghapusnya satu per satu atau bersama-sama, pastikan untuk menyimpan yang terbaru.

Ada juga beberapa perintah dan skrip yang berguna untuk mengotomatiskan penghapusan.

http://ubuntuforums.org/showthread.php?t=1658648

Klaim berikut untuk menghapus semua kernel dan header yang tidak digunakan:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | grep -v hwe | xargs sudo apt-get purge

(gunakan apt-get -yuntuk menghapus tanpa pertanyaan)

Inilah yang terjadi ketika dijalankan pada 18.04.1:

~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic
mikewhever
sumber
Skrip yang Anda temukan di forum salah. Itu mungkin tidak menghapus beberapa paket header yang diinginkan (jika Anda kebetulan menggunakan kernel lama -pae), dan di sisi lain, itu mungkin menghapus beberapa paket yang ingin Anda pertahankan.
jarno
Terima kasih atas komentarnya. Skripnya mungkin tidak sempurna, namun, saya telah menggunakannya selama bertahun-tahun, terutama pada 12,04 dan 14,04, 32 dan 64 bit, dan belum memiliki masalah. ... dan ya, linux-libc-devsudah diinstal.
mikewhever
Saya kira nomor versi linux-libc-devcocok dengan nomor versi dari kernel saat ini. Di sini dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'mencetak linux-libc-dev: amd64
jarno
Saya masih tidak dapat mereproduksi temuan Anda, namun, untuk berada di sisi yang aman, saya telah memodifikasi perintah dengan menambahkan filter tambahan - grep -E "(image|headers)".
mikewhever
1
Pertama-tama coba tanpa -ybendera dengan pembersih ..!
hazard89
16

Untuk menghapus kernel gambar Linux yang lebih lama, boot dulu di kernel yang ingin Anda simpan.

Anda juga dapat memeriksa versi kernel menggunakan perintah uname -rsehingga Anda tidak menghapus yang salah secara tidak sengaja.

Sekarang pergi ke manajer paket synaptic dan cari linux-imagedan hapus versi yang lebih lama kecuali yang ditunjukkan oleh perintah atas. Secara umum saya lebih suka menggunakan yang terbaru.

Sekarang ketika Anda me-restart Anda akan melihat menu grub yang lebih bersih.

anurag-jain
sumber
Ini mungkin metode paling dasar yang akan digunakan oleh pengguna yang menginstal tanpa Pengawas Komputer.
Broam
1
Dari Ubuntu 11.04 menu grub hanya menampilkan kernel saat ini secara default, kernel lama disembunyikan di menu 'Kernel sebelumnya'. Metode ini akan tetap berfungsi untuk membersihkan yang lama.
Andy
14

Anda dapat menginstal ubuntu-tweak lalu Buka Aplikasi -> System tool -> ubuntu tweak dan

masukkan deskripsi gambar di siniklik paket cleaner dan clean kernel. itu tidak menunjukkan kernel yang saat ini digunakan sehingga Anda akan selalu aman.

Lincity
sumber
8

Secara pribadi, saya suka menggunakan Synaptic. Itu membuat saya merasa lebih aman tentang apa yang terjadi. Satu-satunya aplikasi yang saya gunakan yang memiliki opsi untuk menghapus kernel lama adalah Ubuntu Tweak .

Cara menghapus kernel yang tidak Anda gunakan:

  • Buka UbuntuTweak
  • Klik 'Paket Pembersih' di bawah 'Aplikasi' di panel sebelah kiri
  • Di sisi kanan 'tampilan pembersih' tekan 'Bersihkan kernel'
  • Pilih semua kernel - Saya pikir yang digunakan tidak terdaftar tetapi hanya dalam kasus memeriksa berjalan uname -adi terminal
Alan Featherston
sumber
Di Synaptic Anda dapat memfilter pada 'Components' -> 'Kernel and modules', yang mencakup semua kernel. Dan urutkan berdasarkan kolom pertama: 'S' (Status), sehingga Anda mendapatkan semua kernel yang diinstal di atas. Memang update-grubdisarankan.
hazard89
6

Anda dapat menghapus kernel lama ( linux-image-...paket) menggunakan Synaptic, dan itu akan menghapusnya dari menu boot. Berhati-hatilah untuk tidak menghapus kernel yang berjalan (Anda dapat memeriksa versinya uname -r).

Ingatlah bahwa memiliki satu atau dua versi yang lebih lama dapat membantu Anda memecahkan masalah, jika terjadi kesalahan.

Atau, Anda dapat mengedit / menghapus entri secara manual ( gksu gedit /boot/grub/grub.cfg), tetapi akan dihasilkan kembali ketika Anda memperbarui ke kernel yang lebih baru. Jika Anda berpikir tentang menghapus recovery modeopsi - jangan. Mereka bisa berguna jika Anda memecahkan sesuatu yang mencegah Anda untuk boot.


Lihat halaman ini.

evgeny
sumber
Grub2 sekarang membangun entri grub-nya setiap kali kernel baru diinstal. dengan update-grubyang akan menulis ulang semua kernel tersebut.
Marco Ceppi
4

Ini adalah solusi baris perintah murni.

Pertama-tama buat daftar semua versi kernel yang diinstal kecuali kernel yang sedang berjalan:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))

Atau buatlah daftar semua versi kernel yang diinstal kecuali dua yang terakhir:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)

Periksa daftarnya. Pastikan versi kernel yang ingin Anda pertahankan bukan bagian dari daftar. Gunakan perintah uname -runtuk melihat versi kernel yang sedang berjalan.

Jika Anda puas dengan hasilnya, Anda dapat menggunakan apt-getuntuk menghapus paket.

Pertama menjalankan kering (menggunakan generator pertama sebagai contoh):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Kemudian menjalankan nyata:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Jika Anda ingin mengotomatiskan proses kemudian tambahkan --yesparameter:

sudo apt-get --yes purge $(
  ...)
lesmana
sumber
@ Jarno Saya menghargai upaya Anda untuk menggabungkan dan mengoptimalkan baris perintah saya. Saya menghapus baris perintah Anda karena saya lebih suka keterbacaan dan kesederhanaan. Saya sengaja menyesuaikan perintah saya untuk keterbacaan dan kesederhanaan. Setidaknya mudah dibaca dan sederhana untuk otak saya. Silakan kirim baris perintah Anda sebagai komentar atau dalam jawaban Anda sendiri.
lesmana
1
Ini menggabungkan dua tujuan: Menjaga dua kernel terakhir dan membuat kernel lebih baru dari yang sekarang sudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/'). Tidak perlu dpkg-querykarena apt-getdapat menangani ekspresi reguler. Harap perhatikan bagaimana saya lolos dari titik, dan menambahkan awalan dan akhiran dalam ekspresi reguler. Menggunakan skrip dalam jawaban saya sendiri, Anda juga dapat menyimpan beberapa kernel yang lebih tua dari yang sekarang.
jarno
4

Keuntungan dari jawaban ini adalah Bash asli Ubuntu digunakan tanpa menginstal aplikasi pihak ketiga. Pengguna kernel khusus yang tidak menggunakan aptatau dpkgdapat mengubah skrip bash ini sesuai dengan kebutuhan mereka. Jawaban ini didasarkan pada ( Cara membersihkan kernel lama secara selektif sekaligus ).

Solusi berbasis kenyamanan

Zenity menyediakan antarmuka GUI yang bagus ke terminal untuk memproses daftar dan memilih item dengan tombol radio :

kernel-rm 1

Seperti judulnya menunjukkan kernel saat ini Anda boot dengan tidak dapat dihapus dan tidak termasuk dalam daftar. Ukuran yang dilaporkan adalah berapa banyak yang akan disimpan dalam /bootdirektori. Lebih banyak disimpan di disk Anda karena binari kernel berada di area lain juga. 27 Juli 2017 catatan: Direktori /usr/src/*kernel_version*dan /lib/modules/*kernel_version*sekarang juga disertakan.

The Date Modified ditemukan menggunakan statperintah. Pada sistem saya tanggal itu "tersentuh" setiap kali kernel di-boot menggunakan ini ( Bagaimana Anda mengetahui kapan versi kernel tertentu terakhir kali di-boot? ) Cron reboot script. Namun, pada sistem Anda tanggalnya adalah tanggal rilis kernel, bukan terakhir kali Anda mem-bootnya.

apt-get purge memberi Anda kesempatan untuk membatalkan

Anda diberi kesempatan terakhir untuk melihat semua yang akan dihapus dan melihat total ruang disk (agak menyesatkan) yang akan dipulihkan:

The following packages will be REMOVED:
  linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
  linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
  linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
  linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
  linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
  linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
  linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
  linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
  linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
  linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
  linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
  linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n] 

Kode

Salin kode ini ke file yang dapat dieksekusi yang bernama rm-kernelsdi /usr/local/bin:

#!/bin/bash

# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    zenity --error --text "root access required. Use: sudo rm-kernels"
    exit 99
fi

OLDIFS="$IFS"
IFS="|"
choices=()

current_version=$(uname -r)

for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    choices=("${choices[@]}" false "$v" "$d" "$s")
done

# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large

choices=(`zenity \
        --title "rm-kernels - Total: $t MB excluding: $current_version" \
        --list \
        --separator="$IFS" \
        --checklist --multiple \
        --text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --width=640 \
        --height=480 \
        --column "Select" \
        --column "Kernel Version Number" \
        --column "Modified Date" \
        --column " Size " \
        "${choices[@]}"`)
IFS="$OLDIFS"

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
     apt-get purge $list
fi

CATATAN: Anda memerlukan izin sudo untuk membuat file jadi gunakan:

gksu gedit /usr/local/bin/rm-kernels

Untuk membuat file dapat dieksekusi, gunakan:

sudo chmod +x /usr/local/bin/rm-kernels

Versi Server

rm-kernels-serveradalah versi server untuk menghapus kernel secara bersamaan. Alih-alih kotak dialog GUI (grafis), kotak dialog berbasis teks digunakan untuk memilih kernel untuk dibersihkan.

  • Sebelum menjalankan skrip, Anda perlu menginstal fungsi dialog menggunakan:

    sudo apt install dialog

Dialog ada di instalasi Desktop Ubuntu default tetapi tidak di Server Ubuntu.

Layar sampel

rm-kernel-server 1

rm-kernels-server kode bash

#!/bin/bash

# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
#       Non-GUI, text based interface for server distro's.

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo "root access required. Use: sudo rm-kernels-server"
    exit 99
fi

# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed.  Aborting."; exit 99; }

OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.

current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    ((i++)) # Item List
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done

cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
    --title "Use space bar to toggle kernel(s) to remove" \
    --column-separator "!" \
    --separate-output \
    --ascii-lines \
    --checklist "         Kernel Version --------- Modified Date  Size" 20 60 15)

selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)

IFS=$OLDIFS

if [ $? -ne 0 ] ; then
    echo cancel selected
    exit 1
fi

i=0
choices=()

for select in $selections ; do
    ((i++))
    j=$(( 1 + ($select - 1) * 3 ))
    choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
    apt-get purge $list
fi

CATATAN: Dalam panggilan ke dialogarahan --ascii-linesdilewatkan untuk mengganti set karakter garis-diperpanjang diperpanjang (yang sshtidak suka) dengan "+ ----- +" untuk menggambar kotak. Jika Anda tidak menyukai penampilan ini, Anda dapat menggunakan --no-linesarahan tanpa kotak sama sekali.


28 Juli 2017 Pembaruan

Ukuran yang dihitung dari masing-masing kernel diambil dari /boot/*kernel_version*5 file dengan total ~ 50 MB. Formula telah berubah untuk memasukkan file ke dalam /usr/src/*kernel_version*dan /lib/modules/*kernel_version*. Ukuran yang dihitung untuk setiap kernel sekarang ~ 400 MB. Kode di atas untuk rm-kernelsdan rm-kernels-servertelah diperbarui. Namun, layar sampel di atas belum mencerminkan perubahan ini.

Standarnya adalah memperkirakan ukuran file untuk linux-header di 125 MB dan linux-image di 220 MB karena dubisa sangat lambat kecuali file dalam cache. Untuk mendapatkan ukuran sebenarnya dengan menggunakan duparameter apa saja ke skrip.

Total semua ukuran kernel (tidak termasuk versi berjalan saat ini yang tidak dapat dihapus) sekarang ditampilkan di bilah judul.

Kotak dialog yang digunakan untuk menampilkan Tanggal Akses Terakhir masing-masing Kernel . Tanggal ini dapat ditimpa secara massal untuk semua kernel selama pencadangan atau operasi serupa. Kotak dialog sekarang menunjukkan Tanggal yang Dimodifikasi sebagai gantinya.

WinEunuuchs2Unix
sumber
2

Cara mudah untuk menghilangkan hampir semua paket usang, paket tidak lagi dalam daftar paket apa pun, bersama dengan kernel usang adalah dengan melakukan salah satu dari yang berikut:

dpkg --purge $(aptitude search ?obsolete)

Namun, ini akan melewatkan paket yang masih direkomendasikan oleh paket lain, dan argumen -R / - tanpa-rekomendasi tidak menyelesaikan masalah ini.

pilih setelah beralih mode sortir dengan 'o' akan menampilkan semua paket usang termasuk yang aptitude misses, tetapi beberapa orang tidak suka menggunakannya.

Chris Cheney
sumber
Perintah yang diberikan tidak membersihkan kernel lama atau memengaruhi menu grub dalam pengalaman saya.
jarno
2

Jawaban yang diterima menggunakan sedmenghapus kernel yang lebih tua secara permanen memiliki beberapa kelemahan, jika seseorang belum me-reboot komputer setelah memutakhirkan kernel, perintah juga akan menghapus kernel yang lebih baru.

Berikut ini adalah solusi alternatif yang akan mempertimbangkan semua situasi untuk menghapus kernel lama yang sebenarnya saja:

#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

Jika Anda memiliki versi yang lebih baru dari versi saat ini, ini akan memberi Anda peringatan untuk memulai kembali komputer Anda terlebih dahulu. Perhatikan juga bahwa kernel yang lebih lama disimpan karena alasan yang bagus yaitu jika Anda entah bagaimana mengacaukan kernel Anda saat ini membuat sistem Anda tidak stabil maka Anda harus bisa boot ke kernel yang lebih tua.

heemayl
sumber
Ini tidak akan menghilangkan kernel lowlency atau kernel dengan rasa lain selain generik.
jarno
Saya kira Anda merujuk solusi ini sed .
jarno
@jarno: Bagaimana kalau mengganti grep -Po "^linux-image-[^-]+-[^-]+-generic\b"dengan grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"dan grep -Po ".*(?=-[a-z]*$)"dengan grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"dan grep -Po "[0-9].*(?=-[a-z]*)"dengan grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Sadi
@Sadi, wah, aku juga tidak akan menemukan kernel lowlatency.
jarno
1
Terima kasih. Metode lain tidak berhasil untuk saya. Anda melakukan pekerjaan.
Philippe Delteil
1

ailurus memiliki fitur menghilangkan kernel lama serta konfigurasi yang tidak digunakan. Saya pribadi menghapusnya secara manual dari sinaptik. Anda dapat menginstal ailurus dari getdeb dan juga ppa

sagarchalise
sumber
"Ailurus adalah alat untuk membuat cadangan daftar nama perangkat lunak yang diinstal. ... Di masa lalu Ailurus memiliki banyak fungsi. Sekarang hanya memiliki satu fungsi. Karena saya pikir satu fungsi yang sangat berguna lebih baik daripada banyak fungsi yang kurang bermanfaat."
jarno
1

Saya punya skrip untuk ini yang tidak perlu parsing string yang sangat mewah.

Hapus tajuk dan gambar kecuali yang sekarang untuk melepaskan ruang

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+
Paulo Santos
sumber
1

Anda dapat menggunakan ukuu - semuanya GUI - untuk memperbarui dan menghapus kernel lama. Bekerja untukku!

Ingat saja biarkan 2 yang terakhir terinstal dan jelas kernel 'running'.

Anda juga dapat mengatur ukuu untuk hanya menampilkan rilis garis utama, bahkan kernel RC, rilis titik sembunyikan.

ukuu

Anda dapat menemukan ukuu di Synaptic, atau instruksi ada di sini:

OMG! Ubuntu ukuu menginstal instruksi

sprocketoctopus
sumber
1

Berdasarkan jawaban sebelumnya oleh David Kemp, skrip berikut akan membersihkan semua header dan gambar kecuali untuk 2 versi terakhir .

#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)

# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
    if [ -n "$SECONDTOLASTVER" ]; then
        echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
    fi
}

echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get purge

(gunakan apt-get -yuntuk menghapus tanpa pertanyaan)

Tandai
sumber
Ada alasan mengapa ini diturunkan? Apakah itu tidak berhasil untuk seseorang? Saat menyalin / menempel pastikan Anda tidak membungkus garis panjang saat Anda menempel. Saya tidak punya masalah dengan itu berfungsi.
Tandai
Rilis kernel terbaru di mesin saya adalah 3.13.0-43-lowlatency. Script ini akan membersihkan linux-header-3.13.0-43-lowlatency.
jarno
@ Jarno bagaimana Anda menentukan itu? untuk mencobanya tanpa benar-benar melakukan apa pun, tambahkan bendera "-s" ke perintah apt-get (atau hapus | xargs sudo apt-get -y purgesemuanya). Jika mencetak 3.13.0-43-lowlatency, maka mungkin Anda memiliki beberapa versi yang lebih baru dari yang diinstal pada sistem Anda.
Tandai
Saya mencoba simulasi. Tidak, tapi saya sudah menghapus versi kernel sebelumnya, tetapi tidak dibersihkan, dan masing-masing paket header dibersihkan.
jarno
Ngomong-ngomong, saya telah mengembangkan naskah berdasarkan gagasan jawaban Sankalp.
jarno
0

di sini adalah garis besar kasar dari apa yang saya lakukan, hati-hati karena saya bukan ahli di linux, pastikan Anda tahu apa yang Anda lakukan dan telah membuat cadangan file yang Anda modifikasi.

gedit /boot/grub/grub.cfg

kemudian temukan entri yang ingin Anda simpan, kami akan menyoroti dan menyalinnya

cd /etc/grub.d
ls

Anda akan melihat daftar file seperti 10_linux dan 30_os-prober

sudo chmod -x 10_linux

ini akan berhenti membentuk otomatis menambahkan semua entri linux ke dalam menu boot grub.

gksudo gedit 40_custom

buka file menu boot khusus, lalu kembali ke grub.cfg (yang seharusnya masih terbuka di gedit), dan salin entri yang ingin Anda simpan ... seperti

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

rekatkan ke dalam 40_custom, lalu simpan.

sudo chmod 755 40_custom

membuatnya dapat dieksekusi, lalu akhirnya kita perbarui grub yang akan mengubah file grub.cfg:

sudo update-grub

Sekarang, WASPADALAH, jika Anda memperbarui kernel atau OS Anda, menu boot Anda mungkin tidak akan memperbarui ... Anda harus melakukannya secara manual. Tetapi melakukan prosedur ini akan memungkinkan Anda menyesuaikan menu boot sedikit lebih, seperti menghapus versi kernel dan hanya meletakkan nama ubuntu ... yaitu Ubuntu Lucid 10,04, dll ...

Semoga seseorang menemukan ini bermanfaat, karena butuh beberapa saat untuk mencari tahu ... tidak melihat solusi ini di mana pun ...

Joe
sumber
3
Jawaban ini sepertinya berlebihan. Lebih baik menghapus kernel lama.
Scott Severance
Saya telah membaca bahwa kernel tambahan mungkin berguna jika terjadi situasi pemulihan. Juga, ini adalah cara sederhana untuk mengedit teks dari entri boot. Jadi daripada mengatakan "Ubuntu, kernel Linux xxxx-yy --text1 -text2 -t3 -t4 --t5 dll dll" (di mana entri --text hanya menunjukkan beberapa opsi / parameter yang saya tidak mengerti) Anda dapat mengubah ke "Ubuntu xx.yy" walaupun saya memiliki braket "{" yang tidak bisa saya hilangkan.
Joe
1
Saya terus menggunakan kernel sebelumnya sampai saya memverifikasi bahwa kernel terbaru berfungsi dengan baik. Jika berhasil, itu tidak akan berhenti bekerja. Jadi, setelah saya memverifikasi kernel terbaru (setelah sekitar satu minggu), saya tidak punya alasan untuk mempertahankan kernel lama. Jika tidak berhasil, maka saya memiliki kernel terbaru yang bagus untuk kembali. Sebenarnya, saya sedang menjalankan kernel lama karena bug showstopper di kernel saat ini. Tapi itu tidak mengubah kebijakan saya secara keseluruhan. Anda hanya perlu satu kernel yang dikenal baik.
Scott Severance
0

Instal manajer paket sinaptik dan pergi ke tab filter (saya pikir filter, jika tidak mencoba semua 5) dan pilih "lokal". Ini akan menunjukkan kepada Anda paket yatim di sistem Anda, seperti kernel. Setelah Anda menghapusnya, jalankan update-grub. Perintah itu memperbarui daftar opsi boot untuk grub.

Jika gagal, Anda selalu dapat mencoba apt-get remove linux-image-version-generic.

Menikmati
sumber
Di Synaptic Anda dapat memfilter pada 'Components' -> 'Kernel and modules', yang mencakup semua kernel. Dan urutkan berdasarkan kolom pertama: 'S' (Status), sehingga Anda mendapatkan semua kernel yang diinstal di atas. Memang update-grubdisarankan.
hazard89
0

Untuk memiliki sedikit lebih banyak kontrol atas versi mana yang akan disimpan, pilih secara eksplisit yang ingin Anda hapus. Misalnya jika Anda ingin menghapus versi kernel 3.2.0. [49-53], gunakan forloop sederhana :

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done

Sesuaikan daftar versi kernel agar sesuai.

NeilNjae
sumber
0

Coba ini. Jalankan sebagai root.

Simpan skrip ini sebagai, misalnya ./keep-n-kernels.sh

Lulus, sebagai argumen baris perintah, jumlah kernel terbaru yang ingin Anda pertahankan.

    
#! / bin / bash

# lulus n sebagai argumen baris perintah, dan itu akan menemukan semua terinstal
# kernel dan simpan hanya n yang terbaru => copot semua yang lebih lama

# dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*#)-\([^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
# perintah ini memberikan daftar semua paket KECUALI untuk kernel terbaru.
# source: https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n = $ 1

# temukan versi kernel yang diinstal:
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | semacam -n
# memberikan nomor versi, satu di setiap baris
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v '\ ... $' | semacam -u
# hanya memberikan yang muncul di linux-image

# suffix, misalnya -generic-pae
# jenis kernel tempat Anda boot
suffix = $ (uname -r | sed 's: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g')

command = "apt-get purge"

untuk versi dalam $ (dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v ' \ ... $ '| sort -u | head -n - $ {n})
melakukan
    command = $ {command} "^ linux-image - $ {version} $ {suffix}"
Selesai

$ command

Penggunaan sampel:

# ./keep-n-kernels.sh 4 # jalankan perintah apt-get untuk menghapus semua kecuali 4 kernel terbaru

Jika Anda ingin [DAN RISIKO ANDA SENDIRI], Anda bisa menambahkan -y (atau flag kekuatan) ke perintah apt-get dan membuatnya tidak interaktif.

Sankalp
sumber
Ini menghapus semua kernel, jika Anda menjalankan ./keep-n-kernels.sh 0. Mendeteksi string suffix tidak berfungsi; Saya pikir suffix = $ (uname -r | sed -r 's / ^ [0-9.] * (- [0-9.] +) * //') atau suffix = $ (uname -r | egrep - -hanya cocok - '- [[: alpha:] -] + $') akan dilakukan.
jarno
Tapi saya pikir idenya bagus. Saya telah berusaha memperbaiki skrip dan mungkin saya akan mempostingnya di sini kapan saja, ketika saya pikir itu sudah cukup siap.
jarno
Silakan berbagi, @jarno. Senang mengetahui ide itu tampaknya berguna.
Sankalp
Oke, ini dia: link
jarno
0

Saya menggunakan desktop KDE, dan opsi termudah yang saya temukan adalah menggunakan aplikasi kde-config-grub2 seperti yang disarankan di sini: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (yang sudah saya instal untuk pengaturan gambar latar belakang, opsi boot default, dan sejenisnya). Di sebelah kotak drop-down di mana Anda dapat memilih entri default, ada tombol "Hapus Entri Lama". Mengklik tombol ini memberi Anda daftar semua kernel yang diinstal dan Anda dapat memilih yang mana yang akan dihapus. Ketika Anda menerapkan perubahan itu akan menggunakan dpkg untuk benar-benar menghapusnya dari sistem serta menu GRUB.

Ben
sumber
0

Hanya untuk berpadu, Anda juga bisa mengeluarkan

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

sebagai root, dan pekerjaan akan dilakukan.

Severo Raz
sumber
0

Jika Anda menggunakan yang dimungkinkan untuk mengontrol mesin, playbook ini mungkin bisa membantu.

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
flickerfly
sumber