我知道也有人问过类似的其他问题,但我认为这种情况有点不同。
系统是配备 2 个 SSD 的 Lenovo T430(其中一个位于光驱托架中)。
原始安装是主 SSD 中的 Win10。添加了 Mint 使其成为双启动,一切都很好。
决定在辅助 SSD 上使用 Kali 进行三重启动 - 仍然很好(Kali 同时选择了 Mint 和 Win 10)。
一切都很顺利,直到我想到了在辅助 SSD 上安装 XP 和 Kali 的好主意(这是有原因的,别担心)。我拉出了主 SSD 并将辅助 SSD 放回原位。我先对原来的Kali进行了镜像,然后擦除驱动器并安装了XP。完成后,我安装了最新版本的 Kali。在此过程中,它询问我是否要强制使用 UEFI。我最初拒绝了,然后它似乎想要擦除驱动器,而我显然也不想这样做。所以,我说是的,强制 UEFI。不用说,Kali 已安装,但没有看到 XP(这很好,我已将它们单独分区,因此它不会覆盖 XP 安装。我启动到 XP cd,修复了 MBR,然后启动到 XP,但是Kali 是隐形的。好吧,我想,无论如何,也许它们不能很好地配合,不用担心,我只需拍摄每个分区的图像,并在需要使用其中一个时重新映像该驱动器。
因此,我将主系统和辅助系统恢复到原始配置(主系统上安装 Win 10 + Mint,辅助系统上安装 XP 和无法访问的 Kali),擦除辅助系统(分别对 XP 和 Kali 部分进行映像后),然后再次安装 Kali 作为唯一操作系统在次要的。再次弹出消息“您想强制 UEFI 吗?”我想,嘿,我现在使用的是所有现代操作系统,所以没有问题,就答应了。
只是这一次,它不会在主服务器上看到 Windows。它可以看到 Mint 并启动它,但不能看到 Windows。分区看起来仍然存在于 gparted 中。我尝试使用Win 10修复,不行。尝试重新安装 Mint,以为它可能会拾取它并恢复到原始配置,但没有 - Mint 在尝试编写 Grub 时失败。
所以,我被困住了。我已经清除了辅助驱动器,因此它是空白的(暂时将其从等式中取出 - 不太复杂)。
如何恢复 Windows?我知道 Kali 并没有真正吃掉它,它只是覆盖了一些指向它的东西。我知道它就在那里,而且上面有我需要的很多东西。
预先感谢您的任何帮助。我对 Linux 的了解足以让自己陷入麻烦(显然),但还不足以说我精通。
编辑:添加照片。在我看来SSD2是GPT而SSD1是MBR?另外,两者都是 2.5 英寸 SSD,这台笔记本电脑对于 NVMe 驱动器来说太旧了。谢谢!
帮助!
答案1
好的,首先介绍一些背景信息:
以 UEFI 原生方式启动的操作系统将能够在操作系统作为一组 UEFI NVRAM 启动变量运行时访问启动配置;这是 UEFI 规范的一部分。在Linux中,最人性化的方式就是
efibootmgr
命令;在 Windows 中,该bcdedit
命令以管理员身份运行时可以访问 UEFI 启动变量。要查看引导变量,请efibootmgr -v
在 Linux 中以 root 身份运行,或bcdedit /enum FIRMWARE
在 Windows 中以管理员身份运行。某些 UEFI 固件实现不会提供对“BIOS”配置菜单中 UEFI 启动变量的完整访问,但坚持采用类似 BIOS 的简化启动磁盘选择。当您尝试构建高级多重启动方案时,这可能会困扰您。您需要了解 UEFI 启动变量的存在,并准备好在各种安装程序出错时编辑它们。
如果您有 NVMe SSD,您的系统固件需要专门支持从它启动,因为 NVMe SSD 根本不像 SATA 驱动器。某些 UEFI 固件仅支持在 UEFI 模式下从 NVMe 设备启动。如果操作系统有可用的 NVMe 驱动程序,这通常不会阻止操作系统访问 NVMe 设备。
大多数支持 UEFI 的操作系统安装程序将检测操作系统安装程序的启动模式(BIOS 或 UEFI),并安装匹配类型的引导加载程序,不会出现任何问题。 Kali 显然可以提供“强制 UEFI”,即安装 UEFI 引导加载程序,即使安装程序是 BIOS 风格引导的。
使用 BIOS 式引导,磁盘的 MBR 一次只能被一个引导加载程序/管理器占用;通常您会选择最有能力启动多个操作系统的操作系统(例如 GRUB)。如果其他操作系统覆盖了 MBR,您将需要能够使用外部启动介质启动“指定的 MBR 管理器操作系统”并重写 MBR。
对于 UEFI 式引导,引导加载程序包含在标准化目录结构的 ESP 分区(基本上是 FAT32 分区)中。多个操作系统的引导加载程序可以在单个 ESP 分区中共存。但是,如果没有 UEFI 引导变量将其定向到特定的引导加载程序文件,UEFI 固件将寻找一个“神奇”的引导加载程序文件名:在 x86_64 硬件上,它是
\EFI\BOOT\BOOTX64.efi
. Windows 通常会在此位置放置其文件的第二个副本,\EFI\Microsoft\Boot\bootmgfw.efi
以便即使 UEFI NVRAM 启动变量丢失(例如由于 BIOS 更新/刷新)也能够启动 Windows。 Kali 的“强制 UEFI?”可能意味着也可能不意味着将 UEFI GRUB 的副本写入\EFI\BOOT\BOOTX64.efi
ESP 分区。不同的操作系统具有不同级别的 UEFI 支持,引导方法的选择可能与分区类型的选择相关:
- Windows XP(常见的32位版本)无法以UEFI方式启动,也无法访问GPT分区的磁盘。仅支持 BIOS 式引导。
- 64 位版本的 Windows XP(很少见,查找驱动程序可能很困难)可以访问 GPT 分区的磁盘,但需要 MBR 分区的系统磁盘才能启动。仅支持 BIOS 式引导。
- Windows 10 可以支持两种启动方式,但需要 MBR 分区的系统磁盘来启动 BIOS 方式,需要 GPT 分区的系统磁盘来启动 UEFI 方式。你不能混合搭配。
- Linux 通常可以配置为以任何组合启动,尽管更深奥的组合可能需要特别注意。MBR 分区磁盘上的 UEFI 需要一个分区类型为 0xef 的 FAT32 分区来包含 UEFI 引导加载程序;GPT 分区磁盘上的 BIOS 样式启动需要一个支持 GPT 的 BIOS 和一个特殊的“biosboot”分区来包含通常嵌入在 MBR 和第一个分区开头之间的 GRUB 部分,因为这个空间在 GPT 分区中不可用。
与 Windows XP 不同,Windows 10 需要多个分区。当启动 UEFI 风格时,它需要一个 ESP 分区(可能与其他操作系统共享)、一个主 Windows 系统分区(通常是 C: 驱动器)和一个小的恢复分区。在新安装中,通常还有一个“Microsoft 保留”分区,尽管从技术上来说这并不是绝对必要的:从 Windows 早期版本升级的安装可能没有它。
大多数引导加载程序/引导管理器只能使用与引导加载程序相同的引导样式来引导操作系统。如果您有一个具有一个旧版操作系统和一个 UEFI 本机操作系统的双引导,则在操作系统之间切换的唯一方法可能是使用 BIOS 菜单在引导模式或“UEFI/旧版优先”首选项之间切换。rEFInd 启动管理器是一个 UEFI 原生引导加载程序,在某些情况下显然可以启动 BIOS 样式的引导加载程序,但不能保证适用于所有系统;您可能需要尝试一下,看看它是否适合您。
如果您的系统的 BIOS 菜单提供了多种引导方法选项,那么它会非常有用:
- 启用/禁用兼容性支持模块 = BIOS 式引导功能
- 仅限制 BIOS 式引导方法的能力
- 从可移动媒体启动时更喜欢 UEFI/BIOS 风格的启动方法
- 从 HDD/SSD 启动时更喜欢 UEFI/BIOS 风格的启动方法
- 甚至能够同时在启动顺序列表中包含 BIOS 和 UEFI 式启动目标
某些笔记本电脑或名牌台式机可能提供简化的 BIOS 菜单,但可配置性非常有限。在这些情况下,您可能必须弄清楚系统是否更喜欢 UEFI 还是 BIOS,在最坏的情况下,您可能必须创建操作系统安装介质,并故意禁用“错误”类型的引导加载程序(对于 USB 记忆棒,删除以\EFI\boot\bootx64.efi
使其成为 BIOS -only,或将 MBR 引导代码替换为有效的非引导 MBR,使其仅适用于 UEFI)。
听起来您的主磁盘是 GPT 分区的,并且其上的操作系统可能使用 UEFI。要确认这一点,请运行fdisk -l
并将输出编辑到您的原始问题中。
如果确实如此,则您的 UEFI 引导变量当前可能配置错误和/或 Windows UEFI 引导加载程序(/boot/efi/EFI/Microsoft/Boot/bootmgfw.efi
从 Mint 查看的位置)可能已损坏。请sudo efibootmgr -v
在 Linux 中运行以检查 UEFI 启动变量的当前状态并将输出编辑到您的原始问题中,或者如果它很长,例如将其放入 Pastebin 站点并将其链接到您的问题中。
可视化 ESP 分区状态的最便捷方法可能是sudo tree --charset ASCII /boot/efi
从 Linux 运行。请将其添加到您原来的问题中。为了使其更短,您可以省略该目录的子目录/boot/efi/EFI/Microsoft/Boot
,因为有多个特定于语言的目录。
有了这些信息,我(或 StackExchange 中的其他人)可能能够帮助您,而无需盲目猜测。
从图片中可以看出,您的sda
磁盘采用 MBR 样式分区,但efibootmgr -v
输出中包含一行Windows Boot Manager
,表明系统在过去的某个时刻以 UEFI 样式启动 Windows。 UEFI 变量通过 GPT 分区唯一的 GUID(在 Linux 中)来标识它们引用的 ESP 分区,并且 Windows Boot Manager 行上的 GUID 与's 行PARTUUID
上的 GUID 不匹配。kali
另一方面,该ubuntu
行引用 MBR 分区,并且该行包含0xd1e9685
与 的磁盘标识符完全匹配的值sda
。
基于此,看起来发生了这样的事情:
磁盘sda
在某个时刻从 GPT 转换为 MBR,或者在安装 Windows 时两个磁盘都已存在,并且sda
已按 MBR 样式进行分区。但 Windows 安装程序是以 GPT 样式启动的,因此它寻找一个位置将 ESP 分区添加到 GPT 分区磁盘上,以实现正确的 UEFI 样式启动。因此,它以 GPT 方式格式化辅助 SSD,并将 ESP 分区和 Windows 引导加载程序放入其中,因为当时它可能完全未初始化。
(如果有机会的话,这种将 ESP 放置在与 Windows 其余部分不同的磁盘上的倾向是 Windows 10 安装程序的一个已知问题。标准建议是在运行 Windows 10 安装程序之前暂时拔下或禁用任何其他磁盘(如果您的系统有)超过 1 个磁盘。)
安装 Mint 时,安装程序再次以 UEFI 样式启动,但与 Windows 安装程序不同,除非明确告知,否则它不会接触磁盘,因此它在 MBR 分区磁盘上创建了自己的 ESP 分区(sda5
分区类型 0xef)。
第一个 Kali 显然还在辅助 SSD 上创建了自己的 ESP 分区,但在 GPT 分区中,每个分区都有一个唯一的 GUID,UEFI 使用它来识别每个操作系统使用哪个 ESP 分区来启动,因此这不会导致任何混淆。
当您断开主 SSD 并将辅助 SSD 放回原位以安装 XP 时,您可能会看到一个类型为 0xee 的分区。这是一个虚拟的 MBR 分区表,是 GPT 分区标准的一部分,用于向任何不支持 GPT 的操作系统指示该磁盘正在使用中。但您假设该磁盘未使用,并忽略了它 - 因此,Windows 引导加载程序在您不知情的情况下被覆盖。
第二次安装的 Kali 也必须以 UEFI 方式启动,并且它在 MBR 上创建了一个 ESP 分区 - 就像 Mint 那样。 Kali 的“Force UEFI”可能意味着两件事:
- 它将删除任何现有的 MBR 启动代码,因此磁盘将无法启动 MBR 样式
- 它还会将其引导加载程序的副本写入
\EFI\BOOT\BOOTx64.efi
ESP 分区。
结果,您现在在同一磁盘上拥有两个具有不同引导方法的操作系统。 Kali 的 UEFI GRUB 无法启动 Windows XP,因为从 GRUB 跳转到 XP 引导加载程序时需要重新打开 BIOS 兼容性,而 GRUB 不知道如何执行此操作。您的系统似乎更喜欢以传统方式启动而不是 UEFI,因为修复 XP 的 MBR 后,固件会直接返回 BIOS 方式启动...这使得切换到 Kali 的 UEFI GRUB 变得不可能,因为 16 位 BIOS 兼容模式没有希望有意义地使用 UEFI GRUB 的 64 位代码。
当您将磁盘移回其原始位置并再次擦除辅助磁盘时,Windows 引导加载程序现在被擦除了两次。 Windows 10 启动恢复感到困惑,因为它看到大多数 Windows(配置为 UEFI 样式启动)位于 MBR 分区磁盘上,而 GPT 分区磁盘上看不到任何 ESP 分区。 Mint 安装程序可能也以某种方式感到困惑,但这可能不是最重要的事情。
摆脱这种情况并进入正常配置的最佳方法可能是使用 Mint 访问 Windowssda2
磁盘,并将所有重要的内容复制到可移动介质或其他安全位置:
sudo mkdir /windows_c
sudo mount -t ntfs-3g /dev/sda2 /windows_c
cd /windows_c
cp <whatever> </some/where/safe>
然后断开辅助 SSD,擦除主 SSD,然后开始安装 Windows 10 UEFI 样式。如果可能,您可能需要更改 BIOS 设置以关闭旧版 BIOS 样式兼容性,以确保一切都以 UEFI 样式进行。然后在旁边安装Mint。
然后,您可以卸下主 SSD,在其位置安装辅助 SSD,重新打开 BIOS 样式兼容性并安装 XP。现在将两个磁盘移回原来的位置,并可能以 UEFI 模式将 Kali 安装到第二个磁盘上(不选择“强制 UEFI”)。然后启动到 Mint,确保os-prober
安装了软件包,然后运行sudo update-grub
Kali 进入 Mint 的启动菜单。
现在,无论您使用 Kali 还是 Mint 的 GRUB,两者都应该为您提供三个选项:Kali、Mint 和 Windows 10。要进入 XP,不幸的是,您需要进入 BIOS 设置并明确选择从辅助磁盘启动传统风格。
答案2
使用以下命令将磁盘转换回 GPT gdisk
:
sudo gdisk /dev/sda
输出应类似于以下内容:
$ sudo gdisk /dev/sda
[sudo] password for xxx:
GPT fdisk (gdisk) version 1.0.3
Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************
Warning! Secondary partition table overlaps the last partition by
33 blocks!
You will need to delete this partition or resize it in another utility.
Command (? for help):
如果您没有收到上述警告,请按w将更改写入磁盘,然后使用 进行确认y。然后再次运行sudo gdisk /dev/sda
,按p以检查您的 EFI 分区是否已列出并带有代码EF00
。如果不是这种情况,您需要更改类型(选项t,选择分区号,输入ef00
,w写入更改,用 确认y),否则用 退出q。然后重新启动。运气好的话,您的 Windows 应该可以再次启动。
如果收到警告,请退出q。您需要事先根据上述块的数量调整 Mint 分区的大小,以便为磁盘末尾的辅助分区表腾出空间。你可以用gparted
它。或者/dev/sda6
,如果您要重新安装,请删除。然后重复。
您可以将 Bios 中的启动模式从UEFI/Legacy Boot
->更改为Both
,以UEFI only
防止再次以传统模式启动。
您可能还想删除现有的“kali”和“ubuntu”UEFI 引导条目efibootmgr
,例如
sudo efibootmgr -b19 -B
删除该Boot0019* kali
条目。
答案3
更新:我现在可以启动进入 Windows。
这就是我所做的:
- 按照 Freddy 的建议转换为 GPT。尽管它确实允许我正常重新安装 Mint,但它本身并没有解决问题。
- 重新安装了 Mint(希望 Grub 能够恢复 Windows - 它没有,但是在没有 grub 的情况下直接启动到 Mint,这意味着无论出于何种原因,它都没有看到 Windows
- 从 Win10 安装 USB 启动并尝试启动修复。失败了,所以我跳到命令提示符。在那里,我尝试了在这里找到的一系列命令:https://docs.Microsoft.com/en-us/Windows/client-management/advanced-troubleshooting-boot-problems
我直接使用方法3。它在D:\Windows下找到了Windows,如图所示。所以我知道它仍然存在并且有效。
重新启动后,这一次,我进入了 Grub - 但在 Grub 菜单中仍然找不到 Windows。
再次重新启动,进入“一次性启动菜单”,并且尝试了 Windows 启动管理器(之前每次都失败)。这一次,它启动进入了 Windows。
我仍然不太确定神奇的组合是什么,但我怀疑 GPT 转换是步骤 1,修复 BCD 错误是步骤 2,现在 Windows 启动管理器可以看到它。