Saya telah melihat banyak utas tentang cara mengosongkan ruang pada partisi / boot dan itulah tujuan saya juga. Namun, saya hanya tertarik menghapus kernel lama dan tidak masing-masing tetapi yang sekarang.
Saya membutuhkan solusi untuk menjadi satu-liner karena saya akan menjalankan skrip dari Puppet dan saya tidak ingin memiliki file tambahan tergeletak di sekitar. Sejauh ini saya mendapat yang berikut:
dpkg -l linux-* | awk '/^ii/{print $2}' | egrep [0-9] | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | xargs sudo apt-get -y purge
Untuk lebih tepatnya, apa yang dilakukannya saat ini adalah sebagai berikut:
- Daftar semua paket linux- * dan cetak namanya.
- Hanya daftar yang memiliki angka dan mengurutkannya, mengembalikan hasil sebaliknya. Dengan cara ini, kernel lama terdaftar terakhir.
- Cetak hanya hasil yang mengikuti kernel saat ini
- Karena ada beberapa hasil linux- {image, header}, pastikan saya tidak akan membersihkan apa pun yang berhubungan dengan kernel saya saat ini
- Panggil apt untuk membersihkan
Ini berfungsi, tapi saya yakin solusinya bisa lebih elegan dan aman untuk lingkungan produksi, karena setidaknya 20 server kami menjalankan Ubuntu.
Terima kasih untuk waktumu, Alejandro.
kernel
bash
boot-partition
Alejandro
sumber
sumber
Jawaban:
Terlihat cukup bagus, hanya beberapa komentar. Dua komentar pertama membuat perintah lebih aman, sedangkan yang ketiga dan keempat membuatnya sedikit lebih pendek. Jangan ragu untuk mengikuti atau mengabaikan salah satu dari mereka. Padahal saya akan sangat menyarankan untuk mengikuti dua yang pertama. Anda ingin memastikan itu seaman mungkin. Maksud saya serius. Anda melempar
sudo apt-get -y purge
pada beberapa daftar paket yang dibuat secara otomatis. Itu sangat jahat ! :)Cantumkan semua
linux-*
akan membuat Anda mendapatkan banyak kesalahan positif, seperti (contoh dari hasil saya)linux-sound-base
. Meskipun ini dapat disaring kemudian oleh perintah Anda, saya pribadi akan merasa lebih aman untuk tidak mendaftarkannya di tempat pertama. Lebih baik kontrol paket apa yang ingin Anda hapus. Jangan lakukan hal-hal yang mungkin memiliki hasil yang tidak terduga. Jadi saya akan mulai denganRegex Anda untuk "daftar hanya yang memiliki angka" sedikit terlalu sederhana menurut saya. Misalnya ada paket
linux-libc-dev:amd64
ketika Anda menggunakan sistem 64-bit. Regex Anda akan cocok. Anda tidak ingin itu cocok. Memang, jika Anda mengikuti saran pertama saya, makalinux-libc-dev:amd64
tidak akan terdaftar, tapi tetap saja. Kami tahu lebih banyak tentang struktur nomor versi daripada fakta sederhana "ada nomor". Selain itu, umumnya adalah ide yang baik untuk mengutip regex, hanya untuk mencegah kesalahan interpretasi oleh shell. Jadi saya akan membuat perintah egrep ituLalu ada hal semacam ini. Mengapa Anda menyortir? Karena Anda akan menghapus semua kernel (kecuali yang sekarang), apakah penting bagi Anda untuk menghapus yang lebih lama sebelum yang lebih baru? Saya tidak berpikir itu membuat perbedaan. Atau apakah Anda hanya melakukan itu sehingga Anda dapat menggunakannya
sed
untuk "Hanya mencetak hasil yang mengikuti kernel saat ini"? Tapi IMO ini terasa terlalu rumit. Mengapa tidak hanya menyaring hasil yang sesuai dengan kernel Anda saat ini, seperti yang sudah Anda lakukan dengangrep -v
, dan dilakukan? Jujur, jika saya mengambil bagian pertama dari perintah Anda (dengan dua saran saya sebelumnya terintegrasi), di komputer saya saya dapatkanMenghapus hal penyortiran / sed, saya dapatkan
Jadi perintah Anda yang lebih rumit sebenarnya akan melewatkan dua paket di mesin saya, yang ingin saya hapus (sekarang mungkin saja itu
linux-image-extra-*
hal itu bergantung pada hal-linux-image-*
hal dan karenanya akan dihapus, tetapi tidak ada salahnya untuk membuatnya eksplisit). Bagaimanapun, saya tidak melihat titik penyortiran Anda; sederhanagrep -v
tanpa preprocessing mewah harus baik-baik saja, mungkin bahkan lebih baik. Saya seorang pendukung prinsip KISS. Ini akan membuat Anda lebih mudah untuk memahami atau men-debug nanti. Juga, tanpa penyortiran, ini sedikit lebih efisien;)Ini murni aestetik tetapi Anda akan mendapatkan hasil yang sama dengan varian yang sedikit lebih pendek ini. :-)
Akibatnya, saya berakhir dengan perintah yang lebih sederhana dan lebih aman
Karena Anda benar-benar ingin membersihkan
/boot
partisi Anda , pendekatan yang sama sekali berbeda adalah dengan membuat daftar isi/boot
, gunakandpkg -S
untuk menentukan paket-paket yang dimiliki oleh masing-masing file, memfilter yang termasuk dalam kernel saat ini, dan menghapus paket-paket yang dihasilkan. Tapi saya lebih suka pendekatan Anda, karena juga akan menemukan paket-paket usang sepertilinux-headers-*
, yang tidak diinstal/boot
, tetapi untuk/usr/src
.sumber
uname -r
. Bagi saya itu berfungsi dengan baik. Akan menarik untuk melihat mengapa itu tidak berhasil dalam kasus Anda.uname -r
menghasilkan4.8.0-36-generic
, yang gagal untuk mengecualikanlinux-headers-4.8.0-36
dari daftar.Saya menulis skrip ini yang menghapus paket "linux- *" yang memiliki versi lebih rendah daripada yang saat ini di-boot. Saya pikir tidak perlu menguji status paket. Perintah meminta konfirmasi sebelum membersihkan paket. Jika Anda tidak menginginkannya, tambahkan opsi -y ke perintah apt-get.
Namun, untuk dapat meninggalkan jumlah kernel cadangan yang dapat dikonfigurasi, saya sarankan untuk menggunakan
linux-purge
skrip saya dengan--keep
opsi. Lihat di sini untuk informasi lebih lanjut tentang skrip.sumber
TL; DR: lompat ke bawah.
Ini sedikit lebih lama. Saya akan memecahnya untuk Anda:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
Seperti yang disarankan Malte. Daftar file-file kernel yang relevan.egrep '[0-9]+\.[0-9]+\.[0-9]+'
Juga disarankan oleh Malte sebagai cara yang lebih aman untuk memilih hanya file-file kernel dengan mencari nomor versi.Karena sekarang kami mungkin mencantumkan paket gambar dan header, penamaan paket dapat bervariasi sehingga kami memiliki solusi awk yang diperlukan untuk pengurutan
awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
. Hasilnya adalah kolom baru dengan nomor versi sebelum nama paket asli seperti di bawah ini:Sekarang kita harus mengurutkan daftar untuk mencegah mencopot pemasangan gambar yang lebih baru daripada yang sedang berjalan.
sort -k1,1 --version-sort -r
memberi kami ini:Sekarang hapus file kernel saat ini dan yang lebih baru yang
sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
memberi kami ini:Sekarang lepaskan kolom pertama yang kita tambahkan
awk '{print $2}'
untuk mendapatkan apa yang kita inginkan:Sekarang kita dapat memasukkan itu ke manajer paket untuk secara otomatis menghapus semuanya dan mengkonfigurasi ulang grub:
Saya sarankan melakukan dry run terlebih dahulu (meskipun untuk keperluan skrip Anda ini mungkin tidak praktis jika Anda memiliki lingkungan yang besar)
Sekarang jika semuanya terlihat bagus, silakan hapus dengan:
Sekali lagi inti dari "one-liner" ini adalah untuk menghapus hanya kernel yang LEBIH TUA dari kernel yang saat ini berjalan (yang membuat kernel yang baru diinstal masih tersedia)
Terima kasih beri tahu saya bagaimana ini bekerja untuk Anda dan jika Anda dapat memperbaikinya!
sumber
Anda cukup daftar direktori / boot untuk melihat versi kernel yang Anda miliki menggunakan perintah 'ls'. Kemudian gunakan 'sudo apt-get -y purge "xxx"' di mana "xxx" diganti dengan nomor versi yang ingin Anda hapus. Berhati-hatilah karena ini bukan versi yang sedang Anda jalankan !!.
sumber
Instal
bikeshed
(apt install bikeshed
) dan panggilpurge-old-kernels
sebagai root.sumber
Jawaban cepat, penjelasan atas permintaan:
sumber
sed '$d'
perintah. Skrip tidak menghapus paket linux-header atau paket lain yang terkait dengan paket kernel yang akan dihapus, selain itu tidak menghapus file konfigurasi paket. Saya akan merekomendasikan menggunakan jawaban saya, sebagai gantinya.echo
) yangapt-get
perintah yang Anda dapat menjalankan.Saya benar-benar bosan dengan semua kerumitan yang tidak perlu ini dan membuat paket Python yang membuat sepele satu-baris:
Instal dengan
Lihat lebih lanjut di https://github.com/mrts/ubuntu-old-kernel-cleanup .
Semoga ini bisa membantu orang lain juga.
sumber
sudo pip install ...
seperti yang dijelaskan di atas?sudo
sebenarnya penting, jika tidakpip
akan menginstalnya di beberapa direktori pengguna dan shell mungkin tidak mencari direktori ini untuk file yang dapat dieksekusi.Bekerja setiap saat, dan bahkan ubuntu 17.10
sumber
linux-libc-dev:amd64
, itu tidak diinginkan.