From 6587f3783e5a34d8d7d2004aec4ae0bbbc676184 Mon Sep 17 00:00:00 2001 From: zj <1052308357@qq.com> Date: Thu, 12 Feb 2026 03:55:30 +0800 Subject: [PATCH] 1 --- backend.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/backend.py b/backend.py index 2c00a49..b57206a 100644 --- a/backend.py +++ b/backend.py @@ -2022,13 +2022,18 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, log_warning(f"创建目录失败: {e}") # 4. 创建 grubenv 文件(普通文件,不是符号链接) + # GRUB2 要求环境块精确为 4096 字节(一个扇区) grubenv_path = os.path.join(mount_point, "boot", grub_dir_name, "grubenv") try: + # 构建 4096 字节的 grubenv 内容 + header = "# GRUB Environment Block\n" + saved_entry = "saved_entry=\n" + # 计算需要填充的字节数(4096 - header - saved_entry - 结尾的 #) + padding_size = 4096 - len(header) - len(saved_entry) - 1 + content = header + saved_entry + "#" * padding_size with open(grubenv_path, 'w') as f: - f.write("# GRUB Environment Block\n") - f.write("saved_entry=\n") - f.write("#" * 4096 + "\n") - log_success(f"✓ 创建 grubenv: {grubenv_path}") + f.write(content) + log_success(f"✓ 创建 grubenv ({os.path.getsize(grubenv_path)} 字节): {grubenv_path}") except Exception as e: log_warning(f"创建 grubenv 失败: {e}") @@ -2379,8 +2384,11 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, os.makedirs(target_dir, exist_ok=True) log_info(f"✓ 创建目录: {target_dir}") - # 创建目标文件(1024 字节的 GRUB 环境块) - grubenv_content = "# GRUB Environment Block\nsaved_entry=\n" + "#" * 4096 + "\n" + # 创建目标文件(精确 4096 字节的 GRUB 环境块) + header = "# GRUB Environment Block\n" + saved_entry = "saved_entry=\n" + padding_size = 4096 - len(header) - len(saved_entry) - 1 + grubenv_content = header + saved_entry + "#" * padding_size with open(target_path, 'w') as f: f.write(grubenv_content) log_success(f"✓ 创建符号链接目标文件: {target_path}") @@ -2400,7 +2408,11 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, # 方法: 使用 echo 和 tee 在 chroot 内创建文件 grubenv_chroot_path = grubenv_dir_in_chroot + "/grubenv" - grubenv_content = "# GRUB Environment Block\nsaved_entry=\n" + "#" * 4096 + "\n" + # 精确 4096 字节的 grubenv + header = "# GRUB Environment Block\n" + saved_entry = "saved_entry=\n" + padding_size = 4096 - len(header) - len(saved_entry) - 1 + grubenv_content = header + saved_entry + "#" * padding_size # 使用 printf 创建文件(更可靠) success, _, stderr = run_command(