This commit is contained in:
zj
2026-02-11 14:54:49 +08:00
parent a859956597
commit d0bd5520ac
4 changed files with 37 additions and 4 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -881,7 +881,20 @@ def detect_distro_type(mount_point: str) -> str:
return "unknown"
def check_chroot_environment(mount_point: str) -> Tuple[bool, str]:
def _get_grub_package_install_cmd(distro_type: str) -> str:
"""获取安装 GRUB 包的命令提示"""
package_commands = {
"centos": "yum install grub2-tools grub2-pc",
"fedora": "dnf install grub2-tools grub2-pc",
"debian": "apt-get install grub-pc",
"ubuntu": "apt-get install grub-pc",
"arch": "pacman -S grub",
"opensuse": "zypper install grub2",
}
return package_commands.get(distro_type, "安装 GRUB 包(请查阅发行版文档)")
def check_chroot_environment(mount_point: str, distro_type: str = "unknown") -> Tuple[bool, str]:
"""
检查 chroot 环境是否可用。
检测可用的 GRUB 命令及其版本。
@@ -902,8 +915,27 @@ def check_chroot_environment(mount_point: str) -> Tuple[bool, str]:
log_debug(f" ✗ 未找到命令: {cmd}")
if not found_commands:
log_error(f"chroot 环境中未找到关键的 GRUB 命令")
return False, "chroot 环境中缺少 GRUB 命令"
log_error(f"=" * 60)
log_error(f"chroot 环境中未找到关键的 GRUB 命令")
log_error(f"")
log_error(f"目标系统缺少 GRUB 引导加载器。")
log_error(f"")
log_error(f"解决方案:")
log_error(f"1. 进入目标系统的 chroot 环境")
log_error(f"2. 安装 GRUB 包:")
install_cmd = _get_grub_package_install_cmd(distro_type)
log_error(f" {install_cmd}")
log_error(f"")
log_error(f"3. 然后重新运行此工具")
log_error(f"=" * 60)
error_msg = (
f"目标系统缺少 GRUB 工具。\n"
f"请先安装 GRUB 包:\n"
f"{install_cmd}\n"
f"然后重新运行修复工具。"
)
return False, error_msg
# 检查 grub-install 版本(优先使用 grub2-install 如果存在)
grub_cmd = "grub2-install" if "grub2-install" in found_commands else "grub-install"
@@ -1048,7 +1080,7 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str,
return False, f"无效的目标磁盘路径: {target_disk}"
# 检查 chroot 环境
ok, err = check_chroot_environment(mount_point)
ok, err = check_chroot_environment(mount_point, distro_type)
if not ok:
return False, err
@@ -1118,6 +1150,7 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str,
run_command(grub_install_cmd + ["--no-nvram"], "安装标准模式 (no-nvram)", timeout=60)
else:
log_warning(f"removable 模式失败,尝试标准模式")
install_errors.append(f"removable 模式: {stderr}")
if not grub_install_success: