跳转至内容

与Windows双启动

来自 ArchWiki


本文档详细介绍了 Arch/Windows 共存的各种方法。

重要信息

Windows UEFI 与 BIOS 限制

Microsoft 根据所使用的 Windows 版本,对支持的固件引导模式和分区样式施加了限制。

注意 以下几点仅列出了 Windows 安装程序支持的配置,尽管 Windows 本身可能仍在这些不受支持的配置上运行。一个很好的例子是 Windows 11,在绕过 Windows 安装程序检查后,它仍然可以在 BIOS/MBR 配置上运行。
  • Windows 8/8.110 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.110 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 配置。

提示 Windows 10 版本 1703 及更高版本支持使用 MBR2GPT.EXE 从 BIOS/MBR 转换为 UEFI/GPT。

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 双启动,Arch 必须遵循 Windows 安装所使用的相同固件引导模式和分区组合。

Windows 安装程序创建一个 100 MiB 的 EFI 系统分区(对于 高级格式化 4K 原生驱动器,它会创建一个 300 MiB 的 ESP),因此支持的 内核数量有限。变通方法包括:

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 工作正常。
警告

本文或本章节的准确性存在争议。

原因

安全启动的更改不应影响 BitLocker:问题可能在于自签名 Windows 引导加载程序并从引导加载程序链式加载它:只要 Windows 引导加载程序保持使用 MS 密钥签名,并且已注册 Microsoft 证书,它应该就没有问题。问题是禁用它然后启动 Windows,还是禁用、重新启用它然后启动 Windows?前者可以理解,后者需要警告。

(在 Talk:Dual boot with Windows 中讨论)

如果您打算也为 Linux 使用安全启动,则可能需要对安全启动设置进行更改。这些更改将阻止在没有恢复密钥的情况下解锁 BitLocker 磁盘,从而导致永久数据丢失。在继续之前,请检查是否属于这种情况,并且(如果尚未完成)保存您的 BitLocker 恢复密钥。如果 Windows 是由供应商预装的,这一点尤其重要。

快速启动和休眠

有两种操作系统可以进行休眠:您可以休眠 Windows 然后启动 Linux(或其他操作系统),或者休眠 Linux 然后启动 Windows,或者休眠两者。

警告 当在 Windows 和另一个操作系统(如 Linux)之间双启动时,如果任何一个操作系统选择休眠而不是完全关机,可能会导致数据丢失或文件系统损坏。当系统休眠时,它会将当前会话保存到磁盘,并假定没有其他系统会修改文件或文件系统。如果您随后启动到另一个操作系统并访问或修改共享文件系统(例如 NTFS,Windows 和 Linux 都可以读/写)上的文件,原始系统在从休眠恢复时可能会恢复过时或不一致的数据。[3] 这可能导致文件损坏或工作丢失。要特别小心,因为即使选择了“关机”,Windows 也可能进入混合关机模式(一种休眠形式)。有关如何确保完全关机的说明,请参阅 #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 挂载过的任何文件系统。

注意[4] 报道,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 中的磁盘管理工具,检查分区的标签以及报告的类型。保留分区可能在磁盘管理工具中不可见,在这种情况下,可以使用 Windows cmd 中的 diskpart 工具进行识别。这将帮助您了解哪些分区对 Windows 至关重要,哪些可以重新利用。Windows 磁盘管理工具还可以用于缩小 Windows(NTFS)分区,为 Linux 的额外分区腾出磁盘空间。

警告 上列表中前 4 个分区是必不可少的,请勿删除它们。

然后,您可以根据需要进行 分区。引导加载程序需要支持链式加载其他 EFI 应用程序才能双启动 Windows 和 Linux。不应创建额外的 EFI 系统分区,因为它可能会阻止 Windows 启动

注意 仅当 Linux 安装在第二个硬盘上,并且在第二个硬盘上创建了新的 EFI 系统分区时,才会出现这种情况。

只需挂载现有分区

提示

配备较新版本 Windows 的计算机通常启用了 安全启动。您需要采取额外的步骤来禁用安全启动,或使您的安装介质与安全启动兼容(参见上方和链接页面)。

先安装 Linux 再安装 Windows

尽管设置 Linux/Windows 双启动系统的推荐方法是先安装 Windows,但也可以反过来操作。与先安装 Windows 再安装 Linux 不同,您需要预先为 Windows 分配一个分区,例如 40GB 或更大。或者拥有一些未分区的磁盘空间,或者在启动 Windows 安装之前,在 Linux 安装过程中创建和调整 Windows 的分区。

Windows 将使用已存在的 EFI 系统分区。以下是一个概要,假设 安全启动在固件中已禁用。

  1. 启动到 Windows 安装程序。注意让它只使用预定的分区,但否则让它像没有 Linux 安装一样完成其工作。
  2. 遵循 #快速启动和休眠 部分。
  3. 修复启动时加载 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 UEFI 与 BIOS 限制

安装 Windows 后无法启动 Linux

请参阅 Unified Extensible Firmware Interface#Windows changes boot order

恢复意外删除的 EFI 系统分区

如果您有一个 GPT 分区的磁盘,并且删除了(例如使用 mkfs.fat -F32 /dev/sdxEFI 系统分区,您会发现“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 系统分区!

注意 移除分配给 EFI 系统分区的驱动器号 G,以防止它出现在“我的电脑”中。

请参阅 [6][7][8]

Windows 安装程序创建的 EFI 系统分区太小

默认情况下,Windows 安装程序创建一个 100 MiB 的 EFI 系统分区(对于 高级格式化 4K 原生驱动器,它会创建一个 300 MiB 的 ESP)。这通常不足以容纳您需要的所有内容。您可以用一个更大、更新的 EFI 系统分区替换现有的 ESP

如果您要从头开始安装 Windows,可以在安装过程中指定 EFI 系统分区的大小[9]

  1. 选择您的安装目标,并确保它没有分区。
  2. 点击“新建”然后点击“应用”按钮。Windows 安装程序将生成预期的分区(将近全部分配给主分区),而 EFI 分区仅分配 100MB。
  3. 使用 UI 删除“系统”、“MSR”和“主分区”。保留“恢复”分区(如果存在)。
  4. Shift+F10 打开命令提示符。
  5. 键入 diskpart.exe 并按 Enter 打开磁盘分区工具。
  6. 键入 list disk 并按 Enter 列出您的磁盘。找到您要修改的磁盘并记下其磁盘编号。
  7. 键入 select disk disk_number,其中 disk_number 是您要修改的磁盘编号。
  8. 键入 create partition efi size=size,其中 size 是您想要的 ESP 大小(以 Mebibytes (MiB) 为单位),然后按 Enter。有关推荐大小,请参阅 EFI system partition#Create the partition 中的说明。
  9. 键入 format quick fs=fat32 label=System 并按 Enter 格式化 ESP。
  10. 键入 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 分区重新标记为活动分区。

注意 在 Windows 的 diskpart 工具中将分区设置为 active 的效果与在 GParted 中设置 boot 标志的效果相同。

时间标准

  • 建议:按照 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 进行操作。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.