Keuntungan dari jawaban ini adalah Bash asli Ubuntu digunakan tanpa menginstal aplikasi pihak ketiga. Pengguna kernel khusus yang tidak menggunakan apt
atau dpkg
dapat 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 :
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 /boot
direktori. 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 stat
perintah. 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-kernels
di /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-server
adalah versi server untuk menghapus kernel secara bersamaan. Alih-alih kotak dialog GUI (grafis), kotak dialog berbasis teks digunakan untuk memilih kernel untuk dibersihkan.
Dialog ada di instalasi Desktop Ubuntu default tetapi tidak di Server Ubuntu.
Layar sampel
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 dialog
arahan --ascii-lines
dilewatkan untuk mengganti set karakter garis-diperpanjang diperpanjang (yang ssh
tidak suka) dengan "+ ----- +" untuk menggambar kotak. Jika Anda tidak menyukai penampilan ini, Anda dapat menggunakan --no-lines
arahan 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-kernels
dan rm-kernels-server
telah 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 du
bisa sangat lambat kecuali file dalam cache. Untuk mendapatkan ukuran sebenarnya dengan menggunakan du
parameter 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.