From 9dc44739411aad11041738853309f37df13d586d Mon Sep 17 00:00:00 2001 From: zj <1052308357@qq.com> Date: Thu, 12 Feb 2026 02:55:48 +0800 Subject: [PATCH] 11 --- backend.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/backend.py b/backend.py index 6b00b92..2c236e8 100644 --- a/backend.py +++ b/backend.py @@ -1631,6 +1631,7 @@ def check_and_restore_kernel(mount_point: str, distro_type: str, has_separate_bo chroot_cmd_prefix + ["dracut", "-f", f"/boot/initramfs-{kernel_ver}.img", kernel_ver], f"生成 initramfs for {kernel_ver}", timeout=120 + ) if success: @@ -2165,6 +2166,49 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, log_info(f"使用命令: {' '.join(grub_update_cmd)}") log_info(f"配置文件路径: {config_path}") + # ===== 确保 grubenv 文件存在 ===== + # CentOS/RHEL/Fedora 等系统需要 grubenv 文件,否则 grub2-mkconfig 会失败 + grubenv_dir = os.path.dirname(config_path) # /boot/grub2 或 /boot/grub + grubenv_path = os.path.join(mount_point, grubenv_dir.lstrip('/'), "grubenv") + + if not os.path.exists(grubenv_path): + log_info(f"grubenv 文件不存在,尝试创建...") + + # 方法1: 使用 grub2-editenv 创建 + editenv_cmd = None + for cmd_name in ["grub2-editenv", "grub-editenv"]: + for cmd_dir in ["/usr/bin", "/bin", "/usr/sbin", "/sbin"]: + test_path = os.path.join(mount_point, cmd_dir.lstrip('/'), cmd_name) + if os.path.exists(test_path): + editenv_cmd = os.path.join(cmd_dir, cmd_name) + break + if editenv_cmd: + break + + if editenv_cmd: + success, _, stderr = run_command( + chroot_cmd_prefix + [editenv_cmd, "/boot/grub2/grubenv", "create"], + "创建 grubenv 文件", + timeout=10 + ) + if success or os.path.exists(grubenv_path): + log_success(f"✓ 成功创建 grubenv 文件") + else: + log_warning(f"grub2-editenv 创建失败: {stderr}") + + # 方法2: 直接创建空文件(如果方法1失败) + if not os.path.exists(grubenv_path): + try: + os.makedirs(os.path.dirname(grubenv_path), exist_ok=True) + # 创建一个空的 grubenv 文件(包含必要的头部) + with open(grubenv_path, 'w') as f: + f.write("# GRUB Environment Block\n") + f.write("saved_entry=\n") + f.write("#" * 1024 + "\n") # 填充到至少1KB + log_success(f"✓ 手动创建 grubenv 文件成功") + except Exception as e: + log_warning(f"手动创建 grubenv 文件失败: {e}") + # 执行配置更新 success, stdout, stderr = run_command( chroot_cmd_prefix + grub_update_cmd,