Ưu điểm của câu trả lời này là Ubuntu Bash gốc được sử dụng mà không cần cài đặt các ứng dụng của bên thứ ba. Người dùng hạt nhân tùy chỉnh đã không sử dụng apt
hoặc dpkg
có thể thay đổi tập lệnh bash này cho phù hợp với nhu cầu của họ. Câu trả lời này dựa trên ( Làm thế nào để chọn lọc tất cả các hạt nhân cũ cùng một lúc ).
Giải pháp dựa trên Zenity
Zenity cung cấp giao diện GUI đẹp cho thiết bị đầu cuối để xử lý danh sách và chọn các mục bằng nút radio :
Vì tiêu đề cho biết kernel hiện tại mà bạn đã khởi động không thể bị xóa và không được đưa vào danh sách. Kích thước được báo cáo là bao nhiêu sẽ được lưu trong /boot
thư mục. Nhiều hơn được lưu trên đĩa của bạn vì các nhị phân kernel cũng nằm trong các khu vực khác. Ngày 27 tháng 7 năm 2017 lưu ý: Các thư mục /usr/src/*kernel_version*
và /lib/modules/*kernel_version*
hiện cũng được bao gồm.
Các Date Modified được phát hiện bằng cách sử dụng stat
lệnh. Trên hệ thống của tôi, ngày đó được "chạm" mỗi khi kernel được khởi động bằng cách này ( Làm thế nào để bạn biết khi nào một phiên bản kernel cụ thể được khởi động lần cuối? ) Kịch bản khởi động lại cron . Tuy nhiên, trên hệ thống của bạn, ngày sẽ là ngày phát hành kernel, không phải là lần cuối bạn khởi động nó.
apt-get purge
cho bạn cơ hội phá thai
Bạn được cung cấp một cơ hội cuối cùng để xem mọi thứ sẽ bị xóa và xem tổng dung lượng đĩa (hơi sai lệch) sẽ được phục hồi:
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]
Mật mã
Sao chép mã này vào một tệp thực thi có tên rm-kernels
trong /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
LƯU Ý: Bạn cần có quyền sudo để tạo tệp để sử dụng:
gksu gedit /usr/local/bin/rm-kernels
Để làm cho tập tin thực thi sử dụng:
sudo chmod +x /usr/local/bin/rm-kernels
Phiên bản máy chủ
rm-kernels-server
là phiên bản máy chủ để xóa tất cả các hạt nhân cùng một lúc. Thay vì hộp thoại GUI (đồ họa), hộp thoại dựa trên văn bản được sử dụng để chọn hạt nhân để thanh lọc.
Hộp thoại nằm trong cài đặt Ubuntu Desktop mặc định nhưng không có trong Ubuntu Server.
Màn hình mẫu
rm-kernels-server
mã 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
LƯU Ý: Trong lệnh gọi đến dialog
lệnh --ascii-lines
được chuyển để thay thế bộ ký tự mở rộng vẽ đường thẳng ( ssh
không giống như) bằng "+ ----- +" cho các hộp vẽ. Nếu bạn không thích sự xuất hiện này, bạn có thể sử dụng lệnh --no-lines
không có hộp nào cả.
Cập nhật ngày 28 tháng 7 năm 2017
Kích thước tính toán của mỗi hạt nhân được lấy từ /boot/*kernel_version*
đó có 5 tệp tổng cộng ~ 50 MB. Công thức đã thay đổi để bao gồm các tệp trong /usr/src/*kernel_version*
và /lib/modules/*kernel_version*
. Kích thước tính toán cho mỗi hạt nhân hiện là ~ 400 MB. Các mã trên cho rm-kernels
và rm-kernels-server
đã được cập nhật. Tuy nhiên, các màn hình mẫu ở trên chưa phản ánh những thay đổi này.
Mặc định là ước tính kích thước tệp cho các tiêu đề linux ở mức 125 MB và hình ảnh linux ở mức 220 MB vì du
có thể bị chậm một cách khó khăn trừ khi các tệp nằm trong bộ đệm. Để có được kích thước thực bằng cách sử dụng du
chuyển bất kỳ tham số nào cho tập lệnh.
Tổng số tất cả các kích thước kernel (không bao gồm phiên bản đang chạy hiện tại không thể xóa được) hiện được hiển thị trên thanh tiêu đề.
Hộp thoại được sử dụng để hiển thị Ngày truy cập cuối cùng của mỗi hạt nhân . Ngày này có thể được ghi đè hàng loạt cho tất cả các hạt nhân trong quá trình sao lưu hoặc các hoạt động tương tự. Thay vào đó, hộp thoại hiển thị Ngày sửa đổi .