与Windows双启动
本文档详细介绍了 Arch/Windows 共存的各种方法。
重要信息
Windows UEFI 与 BIOS 限制
Microsoft 根据所使用的 Windows 版本,对支持的固件引导模式和分区样式施加了限制。
- Windows 8/8.1 和 10 x86 32 位版本仅支持从 GPT 磁盘引导(IA32 UEFI 模式),或者仅支持从 MBR 磁盘引导(BIOS 模式)。它们不支持 x86_64 UEFI 从 GPT/MBR 磁盘引导,x86_64 UEFI 从 MBR 磁盘引导,或 BIOS 从 GPT 磁盘引导。市场上已知唯一预装 IA32 (U)EFI 的系统是一些旧款 Intel Mac(2010 年前型号?)以及 Intel Atom 片上系统(Clover trail 和 Bay Trail)Windows 平板电脑,它们仅以 IA32 UEFI 模式引导,且仅从 GPT 磁盘引导。
- Windows 8/8.1 和 10 x86_64 版本仅支持从 GPT 磁盘引导(x86_64 UEFI 模式),或者仅支持从 MBR 磁盘引导(BIOS 模式)。它们不支持 IA32 UEFI 引导,x86_64 UEFI 从 MBR 磁盘引导,或 BIOS 从 GPT 磁盘引导。
- Windows 11 仅支持 x86_64,并要求从 GPT 磁盘 UEFI 模式引导。
对于预装系统,*所有*预装 Windows 8/8.1、10 和 11 的系统都以 UEFI/GPT 模式引导。直到 Windows 10,固件位宽都与 Windows 的位宽匹配,即 x86_64 Windows 在 x86_64 UEFI 模式下引导,32 位 Windows 在 IA32 UEFI 模式下引导。
检测 Windows 引导模式的一个简单方法是执行以下操作[1]:
- 启动到 Windows。
- 按下
Win+R键打开“运行”对话框。 - 在“运行”对话框中键入
msinfo32并按 Enter。 - 在“系统信息”窗口中,选择左侧的“系统摘要”,然后在右侧查看BIOS 模式项的值。
- 如果值为
UEFI,则 Windows 以 UEFI/GPT 模式引导。如果值为Legacy,则 Windows 以 BIOS/MBR 模式引导。
一般而言,Windows 会强制根据使用的固件模式确定分区类型,即如果 Windows 以 UEFI 模式引导,则只能安装到 GPT 磁盘。如果 Windows 以 Legacy BIOS 模式引导,则只能安装到 MBR 磁盘。这是 Windows 安装程序强制执行的限制,截至 2014 年 4 月,没有官方(Microsoft)支持的方法可以在 UEFI/MBR 或 BIOS/GPT 配置下安装 Windows。因此,Windows 只支持 UEFI/GPT 引导或 BIOS/MBR 配置。
Linux 内核没有强制执行此类限制,但可能取决于使用的 引导加载程序以及/或引导加载程序的配置方式。如果用户希望从同一磁盘引导 Windows 和 Linux,则应考虑 Windows 的限制,因为引导加载程序的安装过程取决于固件类型和磁盘 分区配置。在 Windows 和 Linux 从同一磁盘双启动的情况下,建议遵循 Windows 使用的方法,即选择 UEFI/GPT 引导或 BIOS/MBR 引导。有关更多信息,请参阅 https://support.microsoft.com/kb/2581408。
引导加载程序 UEFI 与 BIOS 限制
大多数 Linux 引导加载程序安装后,无法启动或链式加载另一种固件类型的引导加载程序。也就是说,如果在某个磁盘上以 UEFI/GPT 或 UEFI/MBR 模式安装了 Arch,而在另一个磁盘上以 BIOS/MBR 模式安装了 Windows,则 Arch 使用的 UEFI 引导加载程序无法链式加载另一个磁盘上安装的 BIOS Windows。同样,如果在某个磁盘上以 BIOS/MBR 或 BIOS/GPT 模式安装了 Arch,而在另一个磁盘上以 UEFI/GPT 模式安装了 Windows,则 Arch 使用的 BIOS 引导加载程序无法链式加载另一个磁盘上安装的 UEFI Windows。
唯一的例外是 Apple Mac 上的 GRUB,其中 UEFI 模式下的 GRUB 可以通过 appleloader 命令引导 BIOS 安装的操作系统(在非 Apple 系统上无效),以及 rEFInd,它理论上支持从 UEFI 系统引导旧式 BIOS OS,但正如其作者 Rod Smith 所述,在非 Apple UEFI 系统上“并非总是有效”并不总是有效。
然而,如果在某个磁盘上以 BIOS/GPT 模式安装了 Arch,而在另一个磁盘上以 BIOS/MBR 模式安装了 Windows,那么 Arch 使用的 BIOS 引导加载程序*可以*引导另一个磁盘上的 Windows,前提是引导加载程序本身能够从另一个磁盘链式加载。
Windows 安装程序创建一个 100 MiB 的 EFI 系统分区(对于 高级格式化 4K 原生驱动器,它会创建一个 300 MiB 的 ESP),因此支持的 内核数量有限。变通方法包括:
- 如果您要从头开始安装 Windows,可以在安装过程中指定 EFI 系统分区的大小。请参阅 #Windows 安装程序创建的 EFI 系统分区太小。
- 将 ESP 挂载到
/efi,并使用一个具有文件系统驱动程序且能够启动位于其他分区的内核的 引导加载程序。 - 减小 Windows 分区的大小,并替换现有的 ESP 为一个更大、更新的 ESP。
- 备份并删除
esp/EFI/Microsoft/Boot/Fonts/中不需要的字体 [2]。 - 备份并删除
esp/EFI/Microsoft/Boot/中不需要的语言目录(例如,只保留en-US)。 - 使用更高但更慢的 initramfs 镜像压缩,确保解压缩可加载的内核模块和固件。例如:
COMPRESSION="xz" COMPRESSION_OPTIONS=(-9e) MODULES_DECOMPRESS="yes"
UEFI 安全启动
所有预装的 Windows 8/8.1、10 和 11 系统默认以 UEFI/GPT 模式引导,并且默认启用 UEFI 安全启动。这是 Microsoft 对所有 OEM 预装系统强制的要求。
Arch Linux 安装介质尚不支持安全启动。请参阅 Secure Boot#Booting an installation medium。
建议在尝试引导 Arch Linux 之前,在固件设置中手动禁用 UEFI 安全启动。Windows 8/8.1、10 和 11 即使禁用安全启动,也*应该*能正常启动。禁用 UEFI 安全启动的唯一问题是,它需要物理访问系统才能在固件设置中禁用安全启动选项,因为 Microsoft 已明确禁止在所有 Windows 8/8.1 及更高版本预装系统中以任何远程或编程方式(从 OS 内部)禁用安全启动的方法。
- 如果 Windows 使用 BitLocker 并将密钥存储在 TPM 中以便在启动时自动解锁,则禁用安全启动时它将无法启动,而是显示 BitLocker 恢复屏幕。但这并非永久性问题,只需重新启用安全启动即可轻松再次引导 Windows。
- 在 Windows 11 上,安装后禁用安全启动不会造成问题,只要 TPM 工作正常。
如果您打算也为 Linux 使用安全启动,则可能需要对安全启动设置进行更改。这些更改将阻止在没有恢复密钥的情况下解锁 BitLocker 磁盘,从而导致永久数据丢失。在继续之前,请检查是否属于这种情况,并且(如果尚未完成)保存您的 BitLocker 恢复密钥。如果 Windows 是由供应商预装的,这一点尤其重要。
快速启动和休眠
有两种操作系统可以进行休眠:您可以休眠 Windows 然后启动 Linux(或其他操作系统),或者休眠 Linux 然后启动 Windows,或者休眠两者。
出于同样的原因,如果您共享一个 EFI 系统分区给 Windows 和 Linux,那么当您休眠(或启用了快速启动的关机)Windows 然后启动 Linux,或者休眠 Linux 然后启动 Windows 时,EFI 系统分区可能会损坏。请参阅 EFI system partition 中关于此问题的相应部分以获取缓解策略。
ntfs-3g 添加了一个 安全保护机制,以防止对休眠的 NTFS 文件系统进行读写挂载,但 Linux 内核中的 NTFS 驱动程序没有此类保护。
Windows 默认无法读取 ext4 等 Linux 常用的文件系统。除非您为其安装 Windows 驱动程序,否则不必考虑这些文件系统。
Windows 设置
快速启动是 Windows 8 及更高版本中的一项功能,它会休眠计算机而不是真正关机,以加快启动速度。
关于 Windows 的快速启动和休眠设置,有多种选项,将在下一节中介绍。
- 禁用快速启动并禁用休眠
- 禁用快速启动并启用休眠
- 启用快速启动并启用休眠
禁用快速启动的过程在 Windows 8、Windows 10 和 Windows 11 的教程中均有描述。在任何情况下,如果您禁用某项设置,请务必在安装 Linux 之前禁用该设置然后关闭 Windows;请注意,重新启动不足以完成。
禁用快速启动并禁用休眠
这是最安全的选择,推荐在不确定问题时使用,因为它需要用户最少的意识来在操作系统之间重新启动。您可以共享同一个 EFI 系统分区给 Windows 和 Linux。
在具有管理员权限的 Windows 命令行 shell 中:
> powercfg /H off
禁用快速启动并启用休眠
此选项需要用户在从一个操作系统切换到另一个操作系统时具有足够的意识。如果您想在 Windows 休眠时启动 Linux(这是一个常见用例),那么:
- 您必须为 Windows 和 Linux 分别使用一个独立的 EFI 系统分区 (ESP),并确保 Windows 不挂载 Linux 使用的 ESP。由于每个驱动器只能有一个 ESP,因此用于 Linux 的 ESP 必须位于与用于 Windows 的 ESP 不同的驱动器上。在这种情况下,如果将 Linux 使用的 ESP 放置在比 Linux 根分区更远的驱动器上,Windows 和 Linux 仍可以在同一驱动器上安装在不同的分区中。
- 您无法在 Linux 中读写挂载任何在 Windows 休眠时被 Windows 挂载过的文件系统。您应该对此非常小心,并考虑 自动挂载行为。
- 如果您完全关闭 Windows 而不是休眠,那么您可以读写挂载文件系统。
启用快速启动并启用休眠
与“禁用快速启动并启用休眠”情况下的注意事项相同,但由于 Windows 无法完全关机,只能休眠,因此您永远无法读写挂载在 Windows 休眠时被 Windows 挂载过的任何文件系统。
Windows 文件名限制
Windows 的文件路径长度限制为260 个字符。
Windows 还因各种原因(可追溯到 DOS)将某些字符禁止用于文件名。
<(小于号)>(大于号):(冒号)"(双引号)/(正斜杠)\(反斜杠)|(竖线或管道符)?(问号)*(星号)
这些是 Windows 的限制,而不是 NTFS 的限制:任何其他使用 NTFS 分区的操作系统都可以正常运行。Windows 将无法识别这些文件,运行 chkdsk 极有可能导致它们被删除。这可能导致潜在的数据丢失。
NTFS-3G 通过 windows_names 选项将 Windows 限制应用于新文件名:ntfs-3g(8) § Windows_Filename_Compatibility(参见 fstab)。
安装
设置 Linux/Windows 双启动系统的推荐方法是首先安装 Windows,仅使用磁盘的一部分用于其分区。完成 Windows 安装后,启动到 Linux 安装环境,您可以在其中创建和调整 Linux 的分区,同时保持现有的 Windows 分区不变。Windows 安装程序将创建 EFI 系统分区,您的 Linux 引导加载程序可以使用它。如果您是从头开始安装 Windows,请注意 Windows 安装程序创建的 EFI 系统分区对于大多数用例来说太小了。请参阅 #Windows 安装程序创建的 EFI 系统分区太小。
先安装 Windows 再安装 Linux
如果您已经安装了 Windows,它将已经在 GPT 格式的磁盘上创建了一些分区:
- 一个 Windows 恢复环境分区,通常大小为 499 MiB。
- 一个具有 FAT32 文件系统的 EFI 系统分区,其中包含 Windows 引导管理器。
- 一个 Microsoft 保留分区,通常大小为 128 MiB。
- 一个 Microsoft 基本数据分区,带有 NTFS 文件系统,对应于
C:驱动器。 - 可能还有系统恢复和备份分区,以及/或二次数据分区(通常对应于
D:及以上)。
使用 Windows 中的磁盘管理工具,检查分区的标签以及报告的类型。保留分区可能在磁盘管理工具中不可见,在这种情况下,可以使用 Windows cmd 中的 diskpart 工具进行识别。这将帮助您了解哪些分区对 Windows 至关重要,哪些可以重新利用。Windows 磁盘管理工具还可以用于缩小 Windows(NTFS)分区,为 Linux 的额外分区腾出磁盘空间。
然后,您可以根据需要进行 分区。引导加载程序需要支持链式加载其他 EFI 应用程序才能双启动 Windows 和 Linux。不应创建额外的 EFI 系统分区,因为它可能会阻止 Windows 启动。
只需挂载现有分区。
- rEFInd 和 systemd-boot 会自动检测到Windows 引导管理器(
\EFI\Microsoft\Boot\bootmgfw.efi)并将其显示在它们的引导菜单中。对于 GRUB,请按照 GRUB#Windows installed in UEFI/GPT mode 手动添加引导菜单项,或按照 GRUB#Detecting other operating systems 生成配置文件。 - 为了节省 EFI 系统分区上的空间,特别是对于多个内核,请增加 initramfs 压缩。
配备较新版本 Windows 的计算机通常启用了 安全启动。您需要采取额外的步骤来禁用安全启动,或使您的安装介质与安全启动兼容(参见上方和链接页面)。
先安装 Linux 再安装 Windows
尽管设置 Linux/Windows 双启动系统的推荐方法是先安装 Windows,但也可以反过来操作。与先安装 Windows 再安装 Linux 不同,您需要预先为 Windows 分配一个分区,例如 40GB 或更大。或者拥有一些未分区的磁盘空间,或者在启动 Windows 安装之前,在 Linux 安装过程中创建和调整 Windows 的分区。
Windows 将使用已存在的 EFI 系统分区。以下是一个概要,假设 安全启动在固件中已禁用。
- 启动到 Windows 安装程序。注意让它只使用预定的分区,但否则让它像没有 Linux 安装一样完成其工作。
- 遵循 #快速启动和休眠 部分。
- 修复启动时加载 Linux 的能力,或许可以遵循 #安装 Windows 后无法启动 Linux。在 #先安装 Windows 再安装 Linux 中已经提到,一些 Linux 引导加载程序会自动检测Windows 引导管理器。尽管较新的 Windows 安装程序提供了高级重启选项,您可以通过该选项启动到 Linux,但建议有其他方式来启动 Linux,例如 Arch 安装介质或 Live CD。
Windows 10 与 GRUB
以下假设 GRUB 被用作引导加载程序(尽管过程可能与其他引导加载程序类似),并且 Windows 10 将安装在具有现有 EFI 系统分区的 GPT 块设备上(有关更多信息,请参阅 Microsoft 文档中的“系统分区”部分)。
使用 gdisk 程序在块设备上创建以下三个新分区。有关更精确的分区大小,请参阅 [5]。
| 最小尺寸 | 代码 | 名称 | 文件系统 |
|---|---|---|---|
| 16 MB | 0C01 | Microsoft 保留 | N/A |
| ~40 GB | 0700 | Microsoft 基本数据 | NTFS |
| 300 MB | 2700 | Windows RE | NTFS |
使用 ntfs-3g 包中的 mkntfs 程序在新的 Microsoft 基本数据和 Windows RE(恢复)分区上创建 NTFS 文件系统。有关更多信息,请参阅 ntfs-3g。
将系统重新启动到 Windows 10 安装介质。当提示安装时,选择自定义安装选项,并将 Windows 安装在先前创建的 Microsoft 基本数据分区上。这应该也会在 EFI 系统分区中安装 Microsoft EFI 文件。
安装后(无需设置和登录 Windows),重新启动到 Linux 并生成 GRUB 配置,以便在下次启动时在 GRUB 菜单中可以使用 Windows 引导管理器。
故障排除
无法创建新分区或找到现有分区
安装 Windows 后无法启动 Linux
请参阅 Unified Extensible Firmware Interface#Windows changes boot order。
恢复意外删除的 EFI 系统分区
如果您有一个 GPT 分区的磁盘,并且删除了(例如使用 mkfs.fat -F32 /dev/sdx)EFI 系统分区,您会发现“Windows 引导管理器”将从您的引导选项中消失,或者选择它会将您送回 UEFI。
要解决此问题,请使用 Windows 安装介质引导,按 Shift+F10 打开控制台(或单击“下一步 > 修复你的计算机 > 疑难解答... > 高级选项 > 命令提示符”),然后启动 diskpart 工具。
X:\Sources> diskpart DISKPART> list disk
键入以下命令选择合适的硬盘:
DISKPART> select disk number
确保存在一个系统类型的分区(EFI 系统分区)。
DISKPART> list partition
选择此分区。
DISKPART> select partition number
并为其分配一个临时驱动器号:
DISKPART> assign letter=G:
DiskPart successfully assigned the drive letter or mount point.
要确保驱动器号正确分配:
DISKPART> list vol
Volume ### Ltr Label Fs Type Size Status Info ---------- --- ----------- ----- ---------- ------- --------- -------- Volume 0 E DVD-ROM 0 B No Media Volume 1 C NTFS Partition 195 GB Healthy Boot Volume 2 WINRE NTFS Partition 400 MB Healthy Hidden Volume 3 G FAT32 Partition 499 MB Healthy System
关闭 diskpart。
DISKPART> exit
导航到 C:\(或您的系统驱动器号)。
X:\Sources> cd /d C:\
接下来是“魔法”命令,它将重新创建 BCD 存储(使用 /s 指定挂载点,/f 指定固件类型,可选添加 /v 进行详细输出)。
C:\> bcdboot C:\Windows /s G: /f UEFI
Ctrl+c。这种情况有时会发生,但您会收到一条消息,如 boot files successfully created,并且它应该已成功完成。现在您应该拥有一个名为“Windows 引导管理器”的引导选项,并且可以访问 Windows。只需确保以后不要再次格式化您的 EFI 系统分区!
Windows 安装程序创建的 EFI 系统分区太小
默认情况下,Windows 安装程序创建一个 100 MiB 的 EFI 系统分区(对于 高级格式化 4K 原生驱动器,它会创建一个 300 MiB 的 ESP)。这通常不足以容纳您需要的所有内容。您可以用一个更大、更新的 EFI 系统分区替换现有的 ESP。
如果您要从头开始安装 Windows,可以在安装过程中指定 EFI 系统分区的大小[9]:
- 选择您的安装目标,并确保它没有分区。
- 点击“新建”然后点击“应用”按钮。Windows 安装程序将生成预期的分区(将近全部分配给主分区),而 EFI 分区仅分配 100MB。
- 使用 UI 删除“系统”、“MSR”和“主分区”。保留“恢复”分区(如果存在)。
- 按
Shift+F10打开命令提示符。 - 键入
diskpart.exe并按Enter打开磁盘分区工具。 - 键入
list disk并按Enter列出您的磁盘。找到您要修改的磁盘并记下其磁盘编号。 - 键入
select disk disk_number,其中 disk_number 是您要修改的磁盘编号。 - 键入
create partition efi size=size,其中 size 是您想要的 ESP 大小(以 Mebibytes (MiB) 为单位),然后按Enter。有关推荐大小,请参阅 EFI system partition#Create the partition 中的说明。 - 键入
format quick fs=fat32 label=System并按Enter格式化 ESP。 - 键入
exit并按Enter退出磁盘分区工具,然后再次键入exit并按Enter。
Windows 安装完成后,您可以在 Windows 中缩小主分区的大小,然后重新启动并继续您的常规 Arch 安装,填补您刚刚创建的空间。
或者,您可以在将 Windows 安装到该驱动器*之前*,使用 Arch 安装介质创建一个您首选大小的单个 EFI 系统分区。Windows 安装程序将使用您创建的 EFI 系统分区,而不是创建自己的。
无法在 BIOS 系统上安装 Windows 累积更新
在 BIOS 系统上,Windows 累积更新可能会失败并显示错误“我们无法完成更新。正在撤销更改。请勿关闭计算机。”。在这种情况下,在 Windows 中,您需要将Windows 分区设置为活动分区。
C:\> diskpart DISKPART> list disk DISKPART> select disk number DISKPART> list partition DISKPART> select partition number DISKPART> active DISKPART> exit
成功安装 Windows 更新后,使用上述命令将 Linux 分区重新标记为活动分区。
时间标准
- 建议:按照 System time#UTC in Microsoft Windows 的说明,将 Arch Linux 和 Windows 都设置为使用 UTC。某些版本的 Windows 在设置为在线同步时间时,会将硬件时钟改回 localtime。此问题似乎已在 Windows 10 中得到修复。
- 不建议:将 Arch Linux 设置为 localtime 并禁用所有 time synchronization daemons。这将允许 Windows 处理硬件时钟校正,而您需要记住每年(春季和秋季)在 DST 生效时至少启动两次 Windows。因此,如果您通常几天或几周不启动 Windows,请不要在论坛上询问时钟为何落后或提前一小时。
蓝牙配对
当涉及到将蓝牙设备与 Linux 和 Windows 安装配对时,两个系统具有相同的 MAC 地址,但将使用在配对过程中生成的不同链接密钥。这会导致设备在与一个安装配对后,无法连接到另一个安装。要允许设备连接到任一安装而无需重新配对,请按照 Bluetooth#Dual boot pairing 进行操作。