Archived
Public Access
Avoid grub package upgrades before kernel install
This commit is contained in:
@@ -25,7 +25,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/byJoey/Actions-bbr-v3/main/i
|
||||
|
||||
本项目当前内核主线为 Linux 7.x。安装内核时脚本会按最低支持系统拦截过旧环境,避免因用户态、initramfs 或引导链路过旧导致启动失败或 kernel panic。推荐系统是更稳妥的部署选择;旧系统仍可使用状态检查、网络调优、清空优化和卸载功能。
|
||||
|
||||
安装内核前,脚本会先刷新关键用户态组件:更新 apt 索引,并安装/升级当前系统已安装的 `dpkg`、`kmod`、`initramfs-tools`、`systemd`、`udev`、`grub` 等启动相关组件。该步骤不是全量系统升级,也不会执行 `dist-upgrade`;如果关键用户态刷新失败,脚本会在卸载旧内核前中止安装。
|
||||
安装内核前,脚本会先刷新关键用户态组件:更新 apt 索引,并在缺少时补装 `dpkg`、`kmod`、`initramfs-tools`,同时仅升级当前系统已安装的 `dpkg`、`kmod`、`initramfs-tools`、`systemd`、`udev` 等组件。该步骤不是全量系统升级,也不会执行 `dist-upgrade`;脚本不会自动升级 `grub-pc`、`grub-efi-*`、`shim-signed` 等 GRUB 安装器包,避免触发 `grub-install` 设备选择问题。如果关键用户态刷新失败,脚本会在卸载旧内核前中止安装。
|
||||
|
||||
## 菜单功能
|
||||
|
||||
|
||||
+35
-12
@@ -859,9 +859,30 @@ update_bootloader() {
|
||||
fi
|
||||
}
|
||||
|
||||
# 函数:检测上次 apt/dpkg 是否留下 GRUB 半配置状态
|
||||
assert_no_broken_grub_packages() {
|
||||
local broken_grub_packages=""
|
||||
|
||||
broken_grub_packages=$(dpkg-query -W -f='${binary:Package} ${db:Status-Abbrev}\n' \
|
||||
grub-common grub2-common grub-pc grub-pc-bin \
|
||||
grub-efi-amd64 grub-efi-amd64-bin grub-efi-arm64 grub-efi-arm64-bin \
|
||||
shim-signed 2>/dev/null \
|
||||
| awk '$1 != "" && $2 !~ /^ii/ {print $1}' \
|
||||
| tr '\n' ' ')
|
||||
|
||||
if [[ -n "$broken_grub_packages" ]]; then
|
||||
echo -e "\033[31m检测到 GRUB 相关软件包处于未完成配置状态:$broken_grub_packages\033[0m"
|
||||
echo -e "\033[33m这通常是之前 grub-install 设备选择失败留下的 dpkg 状态。请先手动修复:\033[0m"
|
||||
echo -e "\033[33m sudo DEBIAN_FRONTEND=dialog dpkg --configure grub-pc\033[0m"
|
||||
echo -e "\033[33m sudo dpkg --configure -a\033[0m"
|
||||
echo -e "\033[33m修复完成后再重新运行本脚本。\033[0m"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 函数:安装内核前刷新关键用户态组件,降低 7.x 内核安装和启动失败概率
|
||||
refresh_kernel_install_userspace() {
|
||||
local required_packages=(dpkg kmod initramfs-tools)
|
||||
local missing_required_packages=()
|
||||
local upgrade_candidates=(
|
||||
dpkg
|
||||
kmod
|
||||
@@ -872,27 +893,29 @@ refresh_kernel_install_userspace() {
|
||||
systemd
|
||||
systemd-sysv
|
||||
udev
|
||||
grub-common
|
||||
grub2-common
|
||||
grub-pc
|
||||
grub-efi-amd64
|
||||
grub-efi-arm64
|
||||
shim-signed
|
||||
)
|
||||
local installed_packages=()
|
||||
local pkg
|
||||
|
||||
echo -e "\033[36m安装内核前刷新关键用户态组件...\033[0m"
|
||||
echo -e "\033[33m将更新 apt 索引,并刷新已安装的 dpkg/initramfs/kmod/systemd/udev/grub 等启动相关组件。\033[0m"
|
||||
echo -e "\033[33m将更新 apt 索引,并刷新已安装的 dpkg/initramfs/kmod/systemd/udev 等组件;不会自动升级 grub 安装器包,避免触发 grub-install 设备配置。\033[0m"
|
||||
|
||||
assert_no_broken_grub_packages || return 1
|
||||
|
||||
if ! sudo apt-get update; then
|
||||
echo -e "\033[31mapt 索引更新失败。为避免安装后无法生成 initramfs 或更新引导,已中止内核安装。\033[0m"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends "${required_packages[@]}"; then
|
||||
echo -e "\033[31m关键用户态组件安装/检查失败。已中止内核安装。\033[0m"
|
||||
return 1
|
||||
command -v dpkg > /dev/null 2>&1 || missing_required_packages+=(dpkg)
|
||||
command -v modprobe > /dev/null 2>&1 || missing_required_packages+=(kmod)
|
||||
command -v update-initramfs > /dev/null 2>&1 || missing_required_packages+=(initramfs-tools)
|
||||
|
||||
if [[ ${#missing_required_packages[@]} -gt 0 ]]; then
|
||||
if ! sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends "${missing_required_packages[@]}"; then
|
||||
echo -e "\033[31m关键用户态组件安装/检查失败。已中止内核安装。\033[0m"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
for pkg in "${upgrade_candidates[@]}"; do
|
||||
@@ -903,7 +926,7 @@ refresh_kernel_install_userspace() {
|
||||
|
||||
if [[ ${#installed_packages[@]} -gt 0 ]]; then
|
||||
if ! sudo env DEBIAN_FRONTEND=noninteractive apt-get install --only-upgrade -y "${installed_packages[@]}"; then
|
||||
echo -e "\033[31m启动相关用户态组件升级失败。已中止内核安装。\033[0m"
|
||||
echo -e "\033[31m关键用户态组件升级失败。已中止内核安装。\033[0m"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user