This commit is contained in:
zj
2026-02-12 03:55:30 +08:00
parent bddd7d2557
commit 6587f3783e

View File

@@ -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(