From 6645d8dea3521de42a3f54bb46064885fa32cc60 Mon Sep 17 00:00:00 2001 From: zj <1052308357@qq.com> Date: Wed, 11 Feb 2026 03:48:54 +0800 Subject: [PATCH] fix4 --- __pycache__/backend.cpython-36.pyc | Bin 20136 -> 22205 bytes backend.py | 106 ++++++++++++++++++++++------- 2 files changed, 81 insertions(+), 25 deletions(-) diff --git a/__pycache__/backend.cpython-36.pyc b/__pycache__/backend.cpython-36.pyc index b9e7183f35df37d3496e9a12292c19c532cccb1c..9535b7c0baba1aa30be8d43e72b7c11bcfc03088 100644 GIT binary patch delta 4043 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 diff --git a/backend.py b/backend.py index 45984b1..7124096 100644 --- a/backend.py +++ b/backend.py @@ -537,12 +537,25 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, try: contents = os.listdir(efi_check_path) log_info(f" 当前 EFI 目录内容: {contents}") + + # 检查是否已有其他启动项 + existing_entries = [d for d in contents if d not in ['BOOT', 'boot']] + if existing_entries: + log_info(f" 发现已有启动项: {existing_entries}") + log_info(f" 建议:在BIOS中选择这些启动项之一,或继续使用新安装的GRUB") except Exception as e: log_warning(f" 无法列出 EFI 目录: {e}") else: log_warning(f"✗ EFI 目录不存在: {efi_check_path}") - # 第一次尝试:正常安装 + # 检测是否在Live环境中(通过检查/sys/firmware/efi/efivars是否存在且可访问) + is_live_env = not os.path.exists("/sys/firmware/efi/efivars") or \ + not os.listdir("/sys/firmware/efi/efivars") + + if is_live_env: + log_info(f"检测到 Live 环境(无法访问 EFI 变量),将使用 --removable 模式安装") + + # 第一次尝试:标准安装(带NVRAM注册) log_info(f"尝试 1/3: 标准 UEFI 安装(带 NVRAM)...") success, stdout, stderr = run_command( chroot_cmd_prefix + ["grub-install", "--target=x86_64-efi", @@ -553,20 +566,12 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, ) if not success: - log_warning(f"标准安装失败,错误: {stderr}") + log_warning(f"标准安装失败") + log_debug(f"错误详情: {stderr}") - if "EFI variables are not supported" in stderr or "efibootmgr" in stderr: - log_info(f"尝试 2/3: 使用 --no-nvram 选项...") - success, stdout, stderr = run_command( - chroot_cmd_prefix + ["grub-install", "--target=x86_64-efi", - "--efi-directory=/boot/efi", "--bootloader-id=GRUB", - "--no-nvram", "--verbose"], - "安装UEFI GRUB(不带NVRAM)", - timeout=60 - ) - - if not success: - log_info(f"尝试 3/3: 使用 --removable 选项...") + # Live环境或NVRAM失败时,优先使用 --removable(创建 /EFI/Boot/bootx64.efi) + if "EFI variables are not supported" in stderr or "efibootmgr" in stderr or is_live_env: + log_info(f"尝试 2/3: Live环境模式(--removable,安装到 /EFI/Boot/bootx64.efi)...") success, stdout, stderr = run_command( chroot_cmd_prefix + ["grub-install", "--target=x86_64-efi", "--efi-directory=/boot/efi", @@ -574,25 +579,51 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, "安装UEFI GRUB(可移动模式)", timeout=60 ) + + if success: + log_info(f"✓ 可移动模式安装成功!") + log_info(f" GRUB 已安装到 /EFI/Boot/bootx64.efi") + log_info(f" 这是UEFI通用回退路径,应该在大多数BIOS中自动识别") + + # 如果 removable 也失败,尝试 --no-nvram(标准路径但不注册NVRAM) + if not success: + log_info(f"尝试 3/3: 使用 --no-nvram 选项(标准路径但不注册启动项)...") + success, stdout, stderr = run_command( + chroot_cmd_prefix + ["grub-install", "--target=x86_64-efi", + "--efi-directory=/boot/efi", "--bootloader-id=GRUB", + "--no-nvram", "--verbose"], + "安装UEFI GRUB(不带NVRAM)", + timeout=60 + ) # 检查安装结果 if success: log_info(f"✓ GRUB EFI 文件安装成功") # 检查生成的文件 - efi_grub_path = os.path.join(mount_point, "boot/efi/EFI/GRUB") - efi_boot_path = os.path.join(mount_point, "boot/efi/EFI/Boot") + efi_paths_to_check = [ + os.path.join(mount_point, "boot/efi/EFI/GRUB"), + os.path.join(mount_point, "boot/efi/EFI/Boot"), + os.path.join(mount_point, "boot/efi/efi/GRUB"), # 某些系统使用小写 + os.path.join(mount_point, "boot/efi/efi/boot"), + ] - for path in [efi_grub_path, efi_boot_path]: + found_efi_file = False + for path in efi_paths_to_check: if os.path.exists(path): log_info(f" 检查目录: {path}") try: files = os.listdir(path) for f in files: - full = os.path.join(path, f) - size = os.path.getsize(full) - log_info(f" - {f} ({size} bytes)") + if f.endswith('.efi'): + full = os.path.join(path, f) + size = os.path.getsize(full) + log_info(f" ✓ EFI文件: {f} ({size} bytes)") + found_efi_file = True except Exception as e: log_warning(f" 无法列出: {e}") + + if not found_efi_file: + log_warning(f" 未找到任何 .efi 文件,安装可能有问题") else: log_info(f"BIOS 模式安装...") success, stdout, stderr = run_command( @@ -679,11 +710,36 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, if is_uefi: log_step("UEFI 修复完成提示") log_info(f"GRUB EFI 文件已安装到 EFI 分区") - log_info(f"如果无法启动,请检查:") - log_info(f" 1. BIOS/UEFI 设置中是否启用了 UEFI 启动模式") - log_info(f" 2. 启动顺序中是否有 'GRUB' 或 'Linux' 选项") - log_info(f" 3. 安全启动 (Secure Boot) 是否已禁用") - log_info(f" 4. EFI 分区中的文件: /EFI/GRUB/grubx64.efi") + + # 检测安装模式并给出相应提示 + efi_boot_path = os.path.join(mount_point, "boot/efi/EFI/Boot/bootx64.efi") + efi_grub_path = os.path.join(mount_point, "boot/efi/EFI/GRUB/grubx64.efi") + + if os.path.exists(efi_boot_path): + log_info(f"") + log_info(f"【重要】使用可移动模式安装 (/EFI/Boot/bootx64.efi)") + log_info(f"启动方法:") + log_info(f" 1. 在BIOS中选择 'UEFI Hard Drive' 或 'UEFI OS' 启动") + log_info(f" 2. 如果有多块硬盘,选择正确的硬盘 (通常是第一块)") + log_info(f" 3. 确保启动模式为 UEFI(不是 Legacy/CSM)") + elif os.path.exists(efi_grub_path): + log_info(f"") + log_info(f"【重要】使用标准模式安装 (/EFI/GRUB/grubx64.efi)") + log_info(f"启动方法:") + log_info(f" 1. 在BIOS启动菜单中选择 'GRUB' 或 'Linux' 启动项") + log_info(f" 2. 如果没有该选项,需要手动添加启动项") + log_info(f" 路径: \\EFI\\GRUB\\grubx64.efi") + + log_info(f"") + log_info(f"故障排除:") + log_info(f" • 如果仍无法启动,请检查:") + log_info(f" - BIOS 是否设置为 UEFI 启动模式(非 Legacy/CSM)") + log_info(f" - 安全启动 (Secure Boot) 是否已禁用") + log_info(f" - EFI 分区格式是否为 FAT32") + log_info(f"") + log_info(f" • 如果BIOS中有旧启动项(如 BBT-TMS-OS),请尝试:") + log_info(f" - 选择该启动项可能可以启动(如果它指向正确的系统)") + log_info(f" - 或删除旧启动项,让BIOS重新检测") return True, ""