From d0bd5520acb934492a518fb3e6a147b56ea1db36 Mon Sep 17 00:00:00 2001 From: zj <1052308357@qq.com> Date: Wed, 11 Feb 2026 14:54:49 +0800 Subject: [PATCH] fix --- __pycache__/backend.cpython-36.pyc | Bin 22205 -> 0 bytes __pycache__/backend.cpython-39.pyc | Bin 37345 -> 38239 bytes __pycache__/frontend.cpython-36.pyc | Bin 10374 -> 0 bytes backend.py | 41 +++++++++++++++++++++++++--- 4 files changed, 37 insertions(+), 4 deletions(-) delete mode 100644 __pycache__/backend.cpython-36.pyc delete mode 100644 __pycache__/frontend.cpython-36.pyc diff --git a/__pycache__/backend.cpython-36.pyc b/__pycache__/backend.cpython-36.pyc deleted file mode 100644 index 9535b7c0baba1aa30be8d43e72b7c11bcfc03088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22205 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 diff --git a/__pycache__/backend.cpython-39.pyc b/__pycache__/backend.cpython-39.pyc index 7a03b56b863d1284d994e46717c956ecbc470029..3242a64b1c6b1188c63bbd7a924558deba8b095e 100644 GIT binary patch delta 7139 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 delta 6025 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 diff --git a/__pycache__/frontend.cpython-36.pyc b/__pycache__/frontend.cpython-36.pyc deleted file mode 100644 index 79f542aeebf5b594b3480e970dcaa21c975b812c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10374 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 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: