From 85d0f00a483689eaec5b955dbc3ed05664703391 Mon Sep 17 00:00:00 2001 From: zj <1052308357@qq.com> Date: Wed, 11 Feb 2026 23:23:48 +0800 Subject: [PATCH] 3 --- __pycache__/backend.cpython-39.pyc | Bin 41562 -> 41877 bytes __pycache__/frontend.cpython-39.pyc | Bin 0 -> 16368 bytes backend.py | 21 ++++++++++++++++++--- frontend.py | 6 +++++- 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 __pycache__/frontend.cpython-39.pyc diff --git a/__pycache__/backend.cpython-39.pyc b/__pycache__/backend.cpython-39.pyc index 117495d0f8786b04b22940995aa7773efabdad1e..f63e746f1b1cd5f30c9af18d05f97b7a57fd14c2 100644 GIT binary patch delta 2847 zcmahLTWl0n^xm1->2{xe&i$q@62wC5}nPQd(S=Z*WJ1B zxpd-7sdYFQ^bve6UVnVw35k-699j4T5Lt__{?ogyNjV%D$sdV~lXwPb;nThs;;Xxj4S(&p>X%sIAc5d^*$kOsvjDk^ zAashbVhAH#1O=zal$x-(a@8!15wi%SB-N`>jjS04VI^F7&b?A}uUKF~C{9x}bp}R_Dz*evv0EDRlo7KO0!c~Rh^DK#JOAK~Fo&zm zD1!e^cD(YFb{1rApEydt%|_ z-;$PcUR8&`WZ)Zh>=6IdB6L+)C`QrQNm!3*Jbs6}|klt)D8He0k!>>gAlv%y0oscI5-g`aI^TVfK9>{d49&Uv}n zWH#ZLd$iw>M$P89&+xEqVAbQLnnlDOTkc+VA6C6NEm})>ud@50J{vPP0nMm>JKK>{ z@7yA)z8Cvs=lt+upX_olw@)4r`rJz&>aASFEl$MHf|2HF-2yA)7*Iz6f3^Z&D}!_V`lpyhyfmgg1E#U zwzw$PJ1XMk|AUY4Tb&IErjrmxra1B_$g|wdP*h~-5=ObnH8AR~kGkstch%fg=WE<> z<(H$pSKB7!`TXO?$Qku&cvCq>*+FL-ke*e1Nbo)8q!rH(y9UO@`8Yc5)$Y#9Pbn@n z>*nJw4(@6uXr(ZJ#67V1$|eR$^AiV~q|65Rg|3R=^RG{hp2*y*@60COm^=OKWj+|@$0zW%8AFM_=cXnd#{bRF7XRghi`Sr+0G&3{t zv$SP3ayv{{=|h7bd^|guibSK_N|f!>Ms^#c+SrY*)fb+eJ25j}dTny%Wa6+&m)OOV zbroCDfVPfOql8?LM)zNkM>I|Q8tIwuC*P%O&f_^L zt&##XL_>0jD%2}`sUkU8fa8)+R>iqOeU$I`S|Q;o2kcLd&-njT^Hu7lKFKH9#&h4& zXy&%(zw^+DUHwvwc4nS=X@=7Av)wOKy5C;?N|dh5#9rx@=ri`&*V^f-%(t&yk?5QD z`P03$JEKhX(Qp?!^`nX*Y~XQp*+bLoX^(w!y3WHX7wvP?x7YUIPHW`!-rP>0O+p6G zF4-Ng_lDJe?L|E4->l(x66w#3y}p%}M7c;O2P-*P#X+}yDb+w*ZGXB=ZQ%!v_PRi^ fy)hl4f7-j!pQ895JbFp|0)GT7Vv#|+<4nunNwpEv delta 2516 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 Tuple[bool, str]: + efi_bootloader_id: str = "GRUB", + has_separate_boot: bool = False) -> Tuple[bool, str]: """ Chroot到目标系统并执行GRUB修复命令。 支持多种安装模式、架构、EFI fallback、Secure Boot 等。 @@ -1245,6 +1246,7 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, install_hybrid: 是否同时安装 BIOS 和 EFI 模式(混合启动) use_fallback: 是否安装 EFI fallback 文件 efi_bootloader_id: EFI 启动项名称 + has_separate_boot: 是否有独立的 /boot 分区 """ global _grub_install_cmd, _grub_mkconfig_cmd @@ -1266,6 +1268,12 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, log_info(f"使用 grub-install: {_grub_install_cmd}") log_info(f"使用 grub-mkconfig: {_grub_mkconfig_cmd}") + # 检查是否有独立的 /boot 分区 + boot_mount_point = os.path.join(mount_point, "boot") + if os.path.ismount(boot_mount_point): + has_separate_boot = True + log_info("检测到独立的 /boot 分区") + chroot_cmd_prefix = ["sudo", "chroot", mount_point] # 检测 Live 环境 @@ -1401,10 +1409,17 @@ def chroot_and_repair_grub(mount_point: str, target_disk: str, _grub_install_cmd, "--target=i386-pc", "--recheck", - "--force", - target_disk + "--force" ] + # 如果有独立的 /boot 分区,需要指定 --boot-directory + # 这样 GRUB 才能在启动时正确找到配置文件 + if has_separate_boot: + log_info("独立 /boot 分区: 添加 --boot-directory=/boot 参数") + bios_cmd.append("--boot-directory=/boot") + + bios_cmd.append(target_disk) + success, stdout, stderr = run_command( bios_cmd, f"安装 BIOS GRUB 到 {target_disk}", diff --git a/frontend.py b/frontend.py index cb8653d..d6c1c53 100644 --- a/frontend.py +++ b/frontend.py @@ -510,6 +510,9 @@ Secure Boot: {'已启用' if self.system_info.get('sb_enabled') else '已禁用/ self.log_message(f"EFI Fallback: {'是' if use_fallback else '否'}", "info") self.log_message(f"启动项名称: {bootloader_id}", "info") + # 检查是否有独立的 /boot 分区 + has_separate_boot = self.selected_boot_partition_info is not None + repair_ok, repair_err = backend.chroot_and_repair_grub( self.mount_point, target_disk_path or "", # UEFI 模式下可能为空 @@ -517,7 +520,8 @@ Secure Boot: {'已启用' if self.system_info.get('sb_enabled') else '已禁用/ distro_type, install_hybrid=install_hybrid, use_fallback=use_fallback, - efi_bootloader_id=bootloader_id + efi_bootloader_id=bootloader_id, + has_separate_boot=has_separate_boot ) if not repair_ok: