@@ -864,6 +864,18 @@ pve_mail_notification_setup() {
864864 return 0
865865}
866866
867+ # 获取已安装的 PVE 内核包(兼容 pve-kernel / proxmox-kernel 以及 -signed 后缀)
868+ get_installed_kernel_packages () {
869+ local status_regex=" ${1:- ii|hi} "
870+
871+ dpkg -l 2> /dev/null | awk -v sr=" $status_regex " '
872+ $1 ~ ("^(" sr ")$") &&
873+ $2 ~ /^(pve-kernel|proxmox-kernel)-[0-9].*-pve(-signed)?$/ {
874+ print $2
875+ }
876+ ' | sort -Vu
877+ }
878+
867879# 检测当前内核版本
868880check_kernel_version () {
869881 log_info " 检测当前内核信息..."
@@ -888,7 +900,7 @@ check_kernel_version() {
888900 echo -e " 类型: ${GREEN} $kernel_variant ${NC} "
889901
890902 # 检测可用的内核版本
891- local installed_kernels=$( dpkg -l | grep -E ' pve-kernel|linux-image ' | grep -E ' ii|hi ' | awk ' {print $2} ' | sort -V )
903+ local installed_kernels=$( get_installed_kernel_packages )
892904 if [[ -n " $installed_kernels " ]]; then
893905 echo -e " ${CYAN} 已安装的内核版本:${NC} "
894906 while IFS= read -r kernel; do
@@ -1082,8 +1094,11 @@ remove_old_kernels() {
10821094 log_info " 清理旧内核..."
10831095
10841096 # 获取所有已安装的内核
1085- local installed_kernels=$( dpkg -l | grep -E ' ^ii.*pve-kernel' | awk ' {print $2}' | sort -V)
1086- local kernel_count=$( echo " $installed_kernels " | wc -l)
1097+ local installed_kernels
1098+ installed_kernels=" $( get_installed_kernel_packages " ii" ) "
1099+ local -a kernel_list
1100+ mapfile -t kernel_list < <( printf ' %s\n' " $installed_kernels " | sed ' /^$/d' )
1101+ local kernel_count=${# kernel_list[@]}
10871102
10881103 if [[ $kernel_count -le 2 ]]; then
10891104 log_info " 当前只有 $kernel_count 个内核,无需清理"
@@ -1097,7 +1112,7 @@ remove_old_kernels() {
10971112 echo -e " ${YELLOW} 将删除 $remove_count 个旧内核,保留最新的 $keep_count 个内核${NC} "
10981113
10991114 # 获取要删除的内核列表(最旧的几个)
1100- local kernels_to_remove=$( echo " $installed_kernels " | head -n $remove_count )
1115+ local kernels_to_remove=( " ${kernel_list[@] : 0 : $remove_count } " )
11011116
11021117 read -p " 是否继续?(y/N): " confirm
11031118 if [[ " $confirm " != " y" && " $confirm " != " Y" ]]; then
@@ -1106,14 +1121,14 @@ remove_old_kernels() {
11061121 fi
11071122
11081123 # 删除旧内核
1109- while IFS= read -r kernel ; do
1124+ for kernel in " ${kernels_to_remove[@]} " ; do
11101125 log_info " 正在删除内核: $kernel "
11111126 if apt-get remove -y --purge " $kernel " ; then
11121127 log_success " 内核 $kernel 删除成功"
11131128 else
11141129 log_error " 删除内核 $kernel 失败"
11151130 fi
1116- done <<< " $kernels_to_remove "
1131+ done
11171132
11181133 # 更新引导配置
11191134 update_grub_config
0 commit comments