이 답변의 장점은 타사 응용 프로그램을 설치하지 않고 네이티브 Ubuntu Bash가 사용된다는 것입니다. 사용하지 않은 사용자 정의 커널의 사용자 apt
또는 dpkg
자신의 필요에 따라이 bash는 스크립트를 변경할 수 있습니다. 이 답변은 ( 오래된 커널을 한 번에 선택적으로 제거하는 방법)을 기반으로 합니다.
Zenity 기반 솔루션
Zenity는 터미널에 멋진 GUI 인터페이스를 제공하여 목록을 처리하고 라디오 버튼으로 항목을 선택 합니다 .
제목에서 알 수 있듯이 부팅 한 현재 커널을 제거 할 수 없으며 목록에 포함되지 않습니다. 보고 된 크기는 /boot
디렉토리에 얼마나 저장 될 것인가 입니다. 커널 바이너리는 다른 영역에도 있기 때문에 디스크에 더 많은 것이 저장됩니다. 2017 년 7 월 27 일 참고 : 디렉토리 /usr/src/*kernel_version*
및 /lib/modules/*kernel_version*
이제 포함됩니다.
수정 한 날짜는 사용하여 발견 stat
명령을 사용합니다. 내 시스템 에서이 날짜를 사용하여 커널을 부팅 할 때마다 해당 날짜가 "만져집니다" ( 특정 커널 버전이 마지막으로 부팅 된 시간을 어떻게 알 수 있습니까? ) cron reboot 스크립트. 그러나 시스템에서 날짜는 마지막으로 부팅 한 날짜가 아니라 커널 릴리스 날짜입니다.
apt-get purge
당신에게 중단 기회를 제공합니다
제거 될 모든 항목을보고 복구 될 총 디스크 공간 (약간의 오도)을 볼 수있는 마지막 기회가 제공됩니다.
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]
코드
라는 실행 파일에이 코드를 복사 rm-kernels
에 /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
참고 : 파일을 만들려면 sudo 권한이 필요하므로 다음을 사용하십시오.
gksu gedit /usr/local/bin/rm-kernels
파일을 실행 파일로 사용하려면 :
sudo chmod +x /usr/local/bin/rm-kernels
서버 버전
rm-kernels-server
커널을 선택적으로 한 번에 선택적으로 삭제하는 서버 버전입니다. GUI (그래픽) 대화 상자 대신 제거 할 커널을 선택하는 데 텍스트 기반 대화 상자가 사용됩니다.
대화 상자는 기본 Ubuntu Desktop 설치에 있지만 Ubuntu Server에는 없습니다.
샘플 화면
rm-kernels-server
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
참고 :dialog
지시문에 대한 호출에서 --ascii-lines
선 그리기 확장 문자 세트 ( ssh
좋지 않은)를 그리기 상자의 "+ ----- +" 로 바꾸도록 전달됩니다 . 이 모양이 마음에 들지 않으면 --no-lines
상자에 지시문을 전혀 사용할 수 없습니다.
2017 년 7 월 28 일 업데이트
각 커널의 계산 된 크기는 /boot/*kernel_version*
총 50MB 인 5 개 파일 에서 가져 왔습니다 . /usr/src/*kernel_version*
및에 파일을 포함하도록 수식이 변경되었습니다 /lib/modules/*kernel_version*
. 각 커널의 계산 크기는 이제 ~ 400MB입니다. 에 대한 위의 코드 rm-kernels
와이 rm-kernels-server
업데이트되었습니다. 그러나 위의 샘플 화면에는 이러한 변경 내용이 아직 반영되지 않았습니다.
기본값은 du
파일이 캐시에 있지 않으면 고통스럽게 느려질 수 있으므로 Linux 헤더의 파일 크기는 125MB, linux-image는 220MB 입니다. 사용하여 실제 크기를 얻으려면 du
스크립트에 매개 변수를 전달하십시오.
제거 할 수없는 현재 실행중인 버전을 제외한 모든 커널 크기의 총계가 제목 표시 줄에 표시됩니다.
대화 상자는 각 커널의 마지막 액세스 날짜 를 표시하는 데 사용됩니다 . 이 날짜는 백업 또는 유사한 작업 중에 모든 커널에 대해 대량으로 덮어 쓸 수 있습니다. 대화 상자에 수정 날짜가 대신 표시 됩니다.