Skip to content

Commit 6448760

Browse files
committed
fix(内核管理): 修复内核同步流程误装辅助包问题并统一包名识别逻辑
修复自动更新流程误把辅助包当作最新内核的问题,避免安装 `proxmox-kernel-libc-dev` 等非内核包 统一 `proxmox-kernel-*` 和 `pve-kernel-*` 的包名识别逻辑,确保菜单展示和安装使用同一套规范 调整可用内核列表筛选规则,只保留真实内核包,排除开发包和工具包
1 parent 16d61c8 commit 6448760

5 files changed

Lines changed: 148 additions & 45 deletions

File tree

PVE-Tools.sh

Lines changed: 129 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313

1414
# 版本信息
15-
CURRENT_VERSION="7.3.0"
15+
CURRENT_VERSION="7.4.0"
1616
BUILD_NICKNAME="Ania"
1717
VERSION_FILE_URL="https://raw.githubusercontent.com/Mapleawaa/PVE-Tools-9/main/VERSION"
1818
UPDATE_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
# 检测当前内核版本
11381215
check_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
# 安装指定内核版本
12121280
install_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

UPDATE

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
v7.3.0
2-
- 新增 Copy Fail(CVE-2026-31431)漏洞处置入口,集成到内核管理菜单
3-
- 新增漏洞检测、修复状态判断与受攻击危险评估,综合内核版本、changelog 证据、内核配置、模块状态及 LXC / SSH 暴露面
4-
- 新增手动处理说明,支持区分“已修复 / 已缓解 / 仍有风险 / 通常不受影响”
5-
- 新增两种自动临时缓解方式:禁用 algif_aead(copy.fail 建议)或禁用 authencesn(发行版 workaround 思路)
6-
- 新增临时缓解回滚入口,并保留现有内核同步更新流程辅助升级到修复内核
1+
v7.4.0
2+
- 修复内核同步更新流程误选辅助包的问题,避免把 `proxmox-kernel-libc-dev` 之类包当作可安装内核
3+
- 统一内核包名识别与规范化逻辑,增强对 `proxmox-kernel-*` / `pve-kernel-*` / `-signed` 的兼容
4+
- 调整可用内核列表与自动更新路径,确保只展示与安装真实内核包
5+
- 保持 Copy Fail(CVE-2026-31431)处置入口可用,并把版本号同步为 7.4.0

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7.3.0
1+
7.4.0

Web/CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ bun run preview # 预览构建结果
4949
| `/guide` | `guide.md` | 使用指南,高风险功能提醒 |
5050
| `/features` | `features.md` | 功能特性列表 |
5151
| `/faq` | `faq.md` | 常见问题 |
52-
| `/update` | `update.md` | 完整更新日志(v1.x - v7.3.0) |
52+
| `/update` | `update.md` | 完整更新日志(v1.x - v7.4.0) |
5353
| `/todo` | `todo.md` | 开发计划(渲染 TodoList 组件) |
5454
| `/sponsor` | `sponsor.md` | 赞助页面 |
5555
| `/pay` | `pay.md` | 付费技术支持 |

Web/update.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ description: PVE-Tools-9 官方更新日志,按版本记录脚本的重要演
77

88
> 本页用于同步脚本正式发布版本。v7.0.0 为一次覆盖 CLI、安全边界、虚拟机运维、宿主机网络与 GPU 直通体系的史诗级重构。
99
10+
## 2026年4月30日 - v7.4.0
11+
### 内核更新修复:避免误装辅助包,统一真实内核包识别
12+
13+
- 修复自动更新流程误把辅助包当作最新内核的问题,避免再次出现 `proxmox-kernel-libc-dev` 之类的错误安装目标。
14+
- 统一 `proxmox-kernel-*` / `pve-kernel-*` / `-signed` 的包名识别与规范化逻辑,确保菜单展示、自动更新和手动安装走同一套真实内核路径。
15+
- 调整可用内核列表筛选规则,只保留真实内核包,减少混入开发包、工具包或其他辅助条目的风险。
16+
- 保留 `Copy Fail(CVE-2026-31431)` 安全处置入口,并同步将脚本版本提升到 `7.4.0`
17+
18+
#### 升级提醒
19+
- 这次更新重点是修复内核管理链路,不影响已有的 Copy Fail 检测、缓解和回滚功能。
20+
- 如果你之前误触发过内核更新失败,建议先重新打开“查看可用内核列表”确认包名,再执行安装或自动同步。
21+
1022
## 2026年4月30日 - v7.3.0
1123
### 内核安全响应:新增 Copy Fail(CVE-2026-31431)检测、风险评估与缓解入口
1224

0 commit comments

Comments
 (0)