1212
1313
1414# 版本信息
15- CURRENT_VERSION=" 7.3 .0"
15+ CURRENT_VERSION=" 7.4 .0"
1616BUILD_NICKNAME=" Ania"
1717VERSION_FILE_URL=" https://raw.githubusercontent.com/Mapleawaa/PVE-Tools-9/main/VERSION"
1818UPDATE_FILE_URL=" https://raw.githubusercontent.com/Mapleawaa/PVE-Tools-9/main/UPDATE"
@@ -1134,6 +1134,83 @@ get_installed_kernel_packages() {
11341134 ' | sort -Vu
11351135}
11361136
1137+ # 获取可用的真实内核包(优先 proxmox-kernel,再回退 pve-kernel)
1138+ get_available_kernel_packages_raw () {
1139+ local kernel_url=" https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve/dists/trixie/pve-no-subscription/binary-amd64/Packages"
1140+ local packages_text=" "
1141+ local available_kernels=" "
1142+
1143+ packages_text=" $( curl -fsSL " $kernel_url " 2> /dev/null || true) "
1144+ if [[ -n " $packages_text " ]]; then
1145+ available_kernels=" $(
1146+ printf ' %s\n' " $packages_text " | sed -nE ' s/^Package: (proxmox-kernel-[0-9][0-9A-Za-z.+:~-]*-pve(-signed)?)$/\1/p' | sort -V | uniq
1147+ ) "
1148+ if [[ -z " $available_kernels " ]]; then
1149+ available_kernels=" $(
1150+ printf ' %s\n' " $packages_text " | sed -nE ' s/^Package: (pve-kernel-[0-9][0-9A-Za-z.+:~-]*-pve(-signed)?)$/\1/p' | sort -V | uniq
1151+ ) "
1152+ fi
1153+ fi
1154+
1155+ if [[ -z " $available_kernels " ]]; then
1156+ available_kernels=" $( apt-cache search --names-only ' ^proxmox-kernel-[0-9][0-9A-Za-z.+:~-]*-pve(-signed)?$' 2> /dev/null | awk ' {print $1}' | sort -V | uniq) "
1157+ if [[ -z " $available_kernels " ]]; then
1158+ available_kernels=" $( apt-cache search --names-only ' ^pve-kernel-[0-9][0-9A-Za-z.+:~-]*-pve(-signed)?$' 2> /dev/null | awk ' {print $1}' | sort -V | uniq) "
1159+ fi
1160+ fi
1161+
1162+ [[ -n " $available_kernels " ]] || return 1
1163+ printf ' %s\n' " $available_kernels "
1164+ }
1165+
1166+ kernel_package_is_valid () {
1167+ local package_name=" $1 "
1168+ [[ " $package_name " =~ ^(proxmox-kernel| pve-kernel)-[0-9][0-9A-Za-z.+:~ -]* -pve(-signed)? $ ]]
1169+ }
1170+
1171+ kernel_package_release_from_name () {
1172+ local package_name=" $1 "
1173+
1174+ if [[ " $package_name " =~ ^(proxmox-kernel| pve-kernel)-([0-9][0-9A-Za-z.+:~ -]* -pve)(-signed)? $ ]]; then
1175+ echo " ${BASH_REMATCH[2]} "
1176+ return 0
1177+ fi
1178+
1179+ return 1
1180+ }
1181+
1182+ kernel_package_normalize_input () {
1183+ local kernel_input=" $1 "
1184+ local kernel_version=" "
1185+
1186+ if [[ -z " $kernel_input " ]]; then
1187+ return 1
1188+ fi
1189+
1190+ if kernel_package_is_valid " $kernel_input " ; then
1191+ echo " $kernel_input "
1192+ return 0
1193+ fi
1194+
1195+ case " $kernel_input " in
1196+ proxmox-kernel-* )
1197+ kernel_version=" ${kernel_input# proxmox-kernel-} "
1198+ ;;
1199+ pve-kernel-* )
1200+ kernel_version=" ${kernel_input# pve-kernel-} "
1201+ ;;
1202+ * )
1203+ kernel_version=" $kernel_input "
1204+ ;;
1205+ esac
1206+
1207+ if [[ " $kernel_version " != * -pve && " $kernel_version " != * -pve-signed ]]; then
1208+ kernel_version=" ${kernel_version} -pve"
1209+ fi
1210+
1211+ echo " proxmox-kernel-$kernel_version "
1212+ }
1213+
11371214# 检测当前内核版本
11381215check_kernel_version () {
11391216 log_info " 检测当前内核信息..."
@@ -1179,25 +1256,16 @@ get_available_kernels() {
11791256 return 1
11801257 fi
11811258
1182- # 获取当前 PVE 版本
1183- local pve_version=$( pveversion | head -n1 | cut -d' /' -f2 | cut -d' -' -f1)
1184- local major_version=$( echo $pve_version | cut -d' .' -f1)
1185-
1186- # 构建内核包URL
1187- local kernel_url=" https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve/dists/trixie/pve-no-subscription/binary-amd64/Packages"
1188-
1189- # 下载并解析可用内核
1190- local available_kernels=$( curl -s " $kernel_url " | grep -E ' Package: (pve-kernel|linux-pve)' | awk ' {print $2}' | sort -V | uniq)
1191-
1192- if [[ -z " $available_kernels " ]]; then
1193- log_warn " 无法获取可用内核列表,使用备用方法"
1194- # 备用方法:使用apt-cache搜索
1195- available_kernels=$( apt-cache search --names-only ' ^pve-kernel-.*' | awk ' {print $1}' | sort -V)
1259+ local available_kernels
1260+ if ! available_kernels=" $( get_available_kernel_packages_raw) " ; then
1261+ log_error " 无法获取可用内核列表"
1262+ return 1
11961263 fi
11971264
11981265 if [[ -n " $available_kernels " ]]; then
11991266 echo -e " ${CYAN} 可用内核版本:${NC} "
12001267 while IFS= read -r kernel; do
1268+ [[ -n " $kernel " ]] || continue
12011269 echo -e " ${BLUE} •${NC} $kernel "
12021270 done <<< " $available_kernels"
12031271 else
@@ -1210,28 +1278,37 @@ get_available_kernels() {
12101278
12111279# 安装指定内核版本
12121280install_kernel () {
1213- local kernel_version=$1
1281+ local kernel_input=$1
1282+ local kernel_version=" "
12141283
12151284 # 验证内核版本格式
1216- if [[ -z " $kernel_version " ]]; then
1285+ if [[ -z " $kernel_input " ]]; then
12171286 log_error " 请指定要安装的内核版本"
12181287 return 1
12191288 fi
12201289
1221- # 检查是否已经是完整包名格式 (contains "pve" and ends with "pve")
1222- if [[ " $kernel_version " =~ ^[a-zA-Z0-9.-]+pve$ ]]; then
1223- # This looks like a complete package name, use it as is
1224- log_info " 检测到完整包名格式: $kernel_version "
1225- elif ! [[ " $kernel_version " =~ ^pve-kernel- ]]; then
1226- # If not in the correct format, prepend "pve-kernel-"
1227- log_info " 检测到版本号格式,自动补全包名为 pve-kernel-$kernel_version "
1228- kernel_version=" pve-kernel-$kernel_version "
1290+ if kernel_package_is_valid " $kernel_input " ; then
1291+ if [[ " $kernel_input " == pve-kernel-* ]]; then
1292+ kernel_version=" proxmox-kernel-${kernel_input# pve-kernel-} "
1293+ log_info " 检测到旧包名格式,自动转换为: $kernel_version "
1294+ else
1295+ kernel_version=" $kernel_input "
1296+ log_info " 检测到完整包名格式: $kernel_version "
1297+ fi
1298+ else
1299+ kernel_version=" $( kernel_package_normalize_input " $kernel_input " ) "
1300+ log_info " 检测到版本号格式,自动补全包名为 $kernel_version "
12291301 fi
12301302
1303+ if ! kernel_package_is_valid " $kernel_version " ; then
1304+ log_error " 无效的内核包名: $kernel_version "
1305+ return 1
1306+ fi
1307+
12311308 log_info " 开始安装内核: $kernel_version "
12321309
12331310 # 检查内核是否已安装
1234- if dpkg -l | grep -q " ^ii.* $kernel_version " ; then
1311+ if dpkg -l 2> /dev/null | awk -v pkg= " $kernel_version " ' $1 == "ii" && $2 == pkg {found=1} END {exit !found} ' ; then
12351312 log_warn " 内核 $kernel_version 已经安装"
12361313 read -p " 是否重新安装?(y/N): " reinstall
12371314 if [[ " $reinstall " != " y" && " $reinstall " != " Y" ]]; then
@@ -1423,7 +1500,7 @@ kernel_management_menu() {
14231500 3)
14241501 echo " 请输入要安装的内核版本:"
14251502 echo " - 完整包名格式 (推荐): 如 proxmox-kernel-6.14.8-2-pve"
1426- echo " - 简化版本格式: 如 6.8.8-1 (将自动补全为 pve -kernel-6.8.8-1)"
1503+ echo " - 简化版本格式: 如 6.8.8-1 (将自动补全为 proxmox -kernel-6.8.8-1-pve )"
14271504 read -p " 请输入内核标识: " kernel_ver
14281505 if [[ -n " $kernel_ver " ]]; then
14291506 install_kernel " $kernel_ver "
@@ -1477,23 +1554,38 @@ sync_kernel_update() {
14771554 local current_kernel=$( uname -r)
14781555 log_info " 当前内核版本: ${GREEN} $current_kernel ${NC} "
14791556
1480- # 获取最新可用内核
1481- local latest_kernel= $( get_available_kernels | tail -1 | awk ' {print $2} ' )
1482-
1483- if [[ -z " $latest_kernel " ]] ; then
1557+ # 获取最新可用内核包
1558+ local available_kernel_text= " "
1559+ local -a available_kernel_packages=()
1560+ if ! available_kernel_text= " $( get_available_kernel_packages_raw ) " ; then
14841561 log_error " 无法获取最新内核信息"
14851562 return 1
14861563 fi
1487-
1488- log_info " 最新可用内核: ${GREEN} $latest_kernel ${NC} "
1564+
1565+ mapfile -t available_kernel_packages < <( printf ' %s\n' " $available_kernel_text " | sed ' /^$/d' )
1566+ if [[ ${# available_kernel_packages[@]} -eq 0 ]]; then
1567+ log_error " 无法获取最新内核信息"
1568+ return 1
1569+ fi
1570+
1571+ local latest_kernel_index=$(( ${# available_kernel_packages[@]} - 1 ))
1572+ local latest_kernel_package=" ${available_kernel_packages[$latest_kernel_index]} "
1573+ local latest_kernel_release=" "
1574+ if ! latest_kernel_release=" $( kernel_package_release_from_name " $latest_kernel_package " ) " ; then
1575+ log_error " 无法解析最新内核包名: $latest_kernel_package "
1576+ return 1
1577+ fi
1578+
1579+ log_info " 最新可用内核包: ${GREEN} $latest_kernel_package ${NC} "
1580+ log_info " 最新可用内核版本: ${GREEN} $latest_kernel_release ${NC} "
14891581
14901582 # 检查是否需要更新
1491- if [[ " $current_kernel " == * " $latest_kernel " * ]]; then
1583+ if [[ " $current_kernel " == " $latest_kernel_release " ]]; then
14921584 log_success " 当前已是最新内核,无需更新"
14931585 return 0
14941586 fi
14951587
1496- echo -e " ${YELLOW} 发现新内核版本: $latest_kernel ${NC} "
1588+ echo -e " ${YELLOW} 发现新内核版本: $latest_kernel_release ${NC} "
14971589 read -p " 是否安装并更新到最新内核?(Y/n): " update_confirm
14981590
14991591 if [[ " $update_confirm " == " n" || " $update_confirm " == " N" ]]; then
@@ -1502,9 +1594,9 @@ sync_kernel_update() {
15021594 fi
15031595
15041596 # 安装最新内核
1505- if install_kernel " $latest_kernel " ; then
1597+ if install_kernel " $latest_kernel_package " ; then
15061598 # 设置新内核为默认启动项
1507- if set_default_kernel " $latest_kernel " ; then
1599+ if set_default_kernel " $latest_kernel_release " ; then
15081600 log_success " 内核同步更新完成"
15091601 echo -e " ${YELLOW} 建议重启系统以应用新内核${NC} "
15101602 return 0
0 commit comments