跳转至内容

与Windows双启动

来自 ArchWiki


本文档详述了 Arch 与 Windows 共存的不同方法。

重要信息

Windows UEFI 与 BIOS 的局限性

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

注意 以下内容仅列出了 Windows 安装程序支持的配置,尽管 Windows 本身可能在这些不支持的配置上仍能运行。一个很好的例子是 Windows 11,一旦绕过 Windows 安装程序检查,它仍可在 BIOS/MBR 配置上运行。
  • Windows 8/8.110x86 32位 版本仅支持从 GPT 磁盘以 IA32 UEFI 模式引导,或者从 MBR 磁盘以 BIOS 模式引导。它们不支持从 GPT/MBR 磁盘进行 x86_64 UEFI 引导,不支持从 MBR 磁盘进行 x86_64 UEFI 引导,也不支持从 GPT 磁盘进行 BIOS 引导。目前市面上已知预装 IA32 (U)EFI 的系统仅有部分旧款 Intel Mac(2010年以前的型号?)以及采用 Intel Atom 片上系统(Clover trail 和 Bay Trail)的 Windows 平板电脑,它们仅支持从 GPT 磁盘以 IA32 UEFI 模式引导。
  • Windows 8/8.110x86_64 版本仅支持从 GPT 磁盘以 x86_64 UEFI 模式引导,或者从 MBR 磁盘以 BIOS 模式引导。它们不支持 IA32 UEFI 引导、从 MBR 磁盘进行 x86_64 UEFI 引导,或从 GPT 磁盘进行 BIOS 引导。
  • 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 并按回车
  • 系统信息 窗口中,选择左侧的 系统摘要,并在右侧查看 BIOS 模式 项目的值
  • 如果值为 UEFI,则 Windows 以 UEFI/GPT 模式引导。如果值为 传统 (Legacy),则 Windows 以 BIOS/MBR 模式引导。

通常情况下,Windows 会根据使用的固件模式强制规定分区类型。例如,如果 Windows 在 UEFI 模式下引导,则只能安装到 GPT 磁盘;如果 Windows 在传统 BIOS 模式下引导,则只能安装到 MBR 磁盘。这是 Windows 安装程序的强制限制。截至 2014 年 4 月,官方(微软)尚不支持在 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 引导加载程序 无法启动或链式加载另一种固件类型的引导加载程序。也就是说,如果 Arch 安装在 UEFI/GPT 或 UEFI/MBR 模式下,而 Windows 安装在另一个磁盘的 BIOS/MBR 模式下,Arch 所使用的 UEFI 引导加载程序无法链式加载另一个磁盘中以 BIOS 模式安装的 Windows。反之亦然。

唯一的例外是 Apple Mac 上的 GRUB(其 UEFI 模式下的 GRUB 可以通过 appleloader 命令引导 BIOS 安装的操作系统,但这在非 Apple 系统上无效)以及 rEFInd(理论上支持从 UEFI 系统引导传统 BIOS 操作系统,但正如其作者 Rod Smith 所言,在非 Apple 的 UEFI 系统上并不总是有效)。

不过,如果 Arch 安装在 BIOS/GPT 模式下,而 Windows 安装在另一个磁盘的 BIOS/MBR 模式下,那么 Arch 所使用的 BIOS 引导加载程序可以引导另一个磁盘上的 Windows(前提是该引导加载程序自身具备跨磁盘链式加载的能力)。

注意 若要在同一磁盘上进行双引导,Arch 应遵循 Windows 安装所使用的相同固件引导模式和分区组合。

Windows 安装程序会创建 100 MiB 的 EFI 系统分区(除了使用 Advanced Format 4K 原生驱动器的系统,它会创建 300 MiB 的 ESP),因此多 内核 的使用受到限制。解决方法包括:

COMPRESSION="xz"
COMPRESSION_OPTIONS=(-9e)
MODULES_DECOMPRESS="yes"

UEFI 安全启动

所有预装 Windows 8/8.1、10 和 11 的系统默认均以 UEFI/GPT 模式引导,且默认开启 UEFI 安全启动。这是微软对所有 OEM 预装系统的要求。

Arch Linux 安装介质尚不支持安全启动。请参阅 Secure Boot#引导安装介质

建议在尝试引导 Arch Linux 之前手动在固件设置中禁用 UEFI 安全启动。即使禁用了安全启动,Windows 8/8.1、10 和 11 也应该能正常引导。关于禁用 UEFI 安全启动支持的唯一问题是,它需要物理访问设备才能在固件设置中进行更改,因为微软已明确禁止在所有 Windows 8/8.1 及以上版本的预装系统中提供远程或以编程方式(在操作系统内)禁用安全启动的任何方法。

  • 如果 Windows 使用了 BitLocker 并将密钥存储在 TPM 中以实现启动时自动解锁,则在禁用安全启动后 Windows 将无法引导,而是显示 BitLocker 恢复屏幕。但这并非永久性问题,只需重新启用安全启动即可轻松恢复 Windows 引导。
  • 在 Windows 11 上,只要 TPM 工作正常,安装后禁用安全启动不会导致问题。
警告

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

原因

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

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

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

快速启动与休眠

有两个操作系统可以休眠,您可以休眠 Windows 并引导 Linux(或其他系统),或者休眠 Linux 并引导 Windows,或者同时休眠两个系统。

警告 如果任一操作系统处于休眠状态而非完全关闭,则在 Windows 和另一个操作系统(如 Linux)之间进行双引导时,可能会发生数据丢失或文件系统损坏。当系统休眠时,它会将当前会话保存到磁盘,并假定没有其他系统会修改文件或文件系统。如果您随后引导到另一个操作系统并访问或更改共享文件系统(如 Windows 和 Linux 都可以读写的 NTFS)上的文件,原始系统在恢复休眠时可能会还原过时或不一致的数据[3]。这可能导致文件损坏或工作丢失。请特别小心,即使选择了“关机”,Windows 也可能进入混合关机模式(一种休眠形式)。有关如何确保完全关机的信息,请参阅 #Windows 设置 部分。

同样,如果您在 Windows 和 Linux 之间共享一个 EFI 系统分区,那么如果您休眠(或在开启快速启动的情况下关机)Windows 然后启动 Linux,或者休眠 Linux 然后启动 Windows,EFI 系统分区可能会损坏。有关缓解策略,请查看 EFI 系统分区 中的相应章节。

ntfs-3g 增加了一个 安全防护措施 以防止读写挂载处于休眠状态的 NTFS 文件系统,但 Linux 内核中的 NTFS 驱动程序没有此防护。

Windows 默认无法读取 ext4 等 Linux 常用文件系统。除非您安装了相关的 Windows 驱动程序,否则无需考虑这些文件系统。

Windows 设置

快速启动是 Windows 8 及以上版本中的一项功能,它通过休眠计算机而不是实际关机来加快启动速度。

关于 Windows 快速启动和休眠的设置有多个选项,将在后续章节中介绍。

  • 禁用快速启动和禁用休眠
  • 禁用快速启动和启用休眠
  • 启用快速启动和启用休眠

禁用快速启动的操作步骤详见 Windows 8Windows 10Windows 11 的教程。无论如何,如果您要禁用某项设置,请确保先禁用它并关闭 Windows,然后再安装 Linux;请注意,仅仅重启是不够的。

禁用快速启动和禁用休眠

这是最安全的选项,如果您不确定相关问题,建议使用此选项,因为它在从一个系统重启到另一个系统时需要用户注意的事项最少。您可以共享同一个 EFI 系统分区。

在具有管理员权限的 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 挂载的文件系统。您应该对此格外小心,并考虑 自动挂载 (Automount) 的行为。
  • 如果您彻底关闭 Windows 而非进入休眠,则可以读写挂载该文件系统。
注意 您可以通过将驱动器作为外部驱动器在 Windows 中进行挂载,并在休眠前在 Windows 中弹出该驱动器,从而避免此类问题。
启用快速启动和启用休眠

适用与“禁用快速启动和启用休眠”相同的情况,但由于 Windows 无法完全关闭而只能进入休眠,因此您永远无法对 Windows 在处于休眠状态时挂载的任何文件系统进行读写挂载。

注意 据报告,Windows 更新可能会重新启用快速启动 [4][失效链接 2024-07-30—HTTP 404]

Windows 文件名限制

Windows 限制文件路径长度必须小于 260 个字符

出于追溯到 DOS 时代的原因,Windows 对文件名中的 某些字符 也进行了限制:

  • < (小于号)
  • > (大于号)
  • : (冒号)
  • " (双引号)
  • / (正斜杠)
  • \ (反斜杠)
  • | (竖线或管道符)
  • ? (问号)
  • * (星号)

这些是 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 安装将创建可供您的 Linux 引导加载程序 使用的 EFI 系统分区。如果您是从零开始安装 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 的计算机通常开启了 安全启动 (Secure Boot)。您需要采取额外步骤来禁用安全启动,或者使您的安装介质兼容安全启动(见上文及链接页面)。

先安装 Linux,后安装 Windows

尽管设置 Linux/Windows 双引导系统的推荐方法是先安装 Windows,但也可以反过来操作。与先装 Windows 的情况不同,您需要提前为 Windows 留出一个分区(例如 40GB 或更大),或者预留一些未分区的磁盘空间,也可以在 Linux 安装过程中,在启动 Windows 安装前为 Windows 创建并调整分区大小。

Windows 将使用已有的 EFI 系统分区。以下是操作大纲,假设固件中的 安全启动 已禁用。

  1. 引导进入 Windows 安装程序。注意让它仅使用预期的分区,但在其他方面让它像没有 Linux 安装一样执行工作。
  2. 按照 #快速启动与休眠 部分操作。
  3. 修复启动时加载 Linux 的能力,或许可以参考 #安装 Windows 后无法引导 Linux。在 #先安装 Windows,后安装 Linux 中已经提到,一些 Linux 引导管理器会自动检测 Windows Boot Manager。尽管更新的 Windows 安装程序提供了可以从中引导进入 Linux 的高级重启选项,但建议准备其他引导进入 Linux 的手段,如 Arch 安装介质或 Live CD。

在 GRUB 中使用 Windows 10

以下内容假设使用 GRUB 作为引导加载程序(其他引导加载程序的过程类似),且 Windows 10 将安装在具有现有 EFI 系统分区的 GPT 块设备上(更多信息请参阅 微软文档 中的“系统分区”部分)。

使用 gdisk 程序在块设备上创建以下三个新分区。关于更精确的分区大小,请参见 [5]

最小大小 代码 名称 文件系统
16 MB 0C01 Microsoft 保留分区 (MSR) N/A
~40 GB 0700 Microsoft 基本数据分区 NTFS
300 MB 2700 Windows RE (恢复环境) NTFS

使用 ntfs-3g 软件包中的 mkntfs 程序,在新的 Microsoft 基本数据分区和 Windows RE 分区上创建 NTFS 文件系统。

重启系统进入 Windows 10 安装介质。在提示安装时选择自定义安装选项,并将 Windows 安装在之前创建的 Microsoft 基本数据分区上。这也会在 EFI 系统分区 中安装 Microsoft EFI 文件。

安装完成后(不需要设置并登录 Windows),重启进入 Linux 并 生成 GRUB 配置,以便在下次启动时在 GRUB 菜单中看到 Windows 引导管理器。

故障排除

无法创建新分区或找不到现有分区

请参阅 #Windows UEFI 与 BIOS 的局限性

安装 Windows 后无法引导 Linux

请参阅 统一可扩展固件接口#Windows 更改引导顺序

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

如果您有一个 GPT 分区的磁盘并擦除了(例如使用 mkfs.fat -F32 /dev/sdxEFI 系统分区,您会发现 Windows Boot Manager 从引导选项中消失了,或者选择它后会回到 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。这种情况偶尔会发生,但您仍会收到类似 引导文件成功创建 的消息,且操作已经生效。

现在您应该可以让 Windows Boot Manager 作为引导选项运行,从而访问 Windows。请务必记住不要再格式化您的 EFI 系统分区了!

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

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

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

默认情况下,Windows 安装程序会创建 100 MiB 的 EFI 系统分区(除了使用 Advanced Format 4K 原生驱动器的系统,它会创建 300 MiB 的 ESP)。这通常不足以容纳所需的一切。您可以 用一个更大的新 EFI 系统分区替换现有的

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

  1. 选择安装目标并确保其没有分区。
  2. 点击 新建,然后点击 应用。Windows 安装程序将生成预期的分区(将几乎所有空间分配给主分区),但仅给 EFI 分区分配 100MB。
  3. 使用 UI 删除 系统MSR主要 分区。保留 恢复 分区(如果有)。
  4. Shift+F10 打开命令提示符。
  5. 输入 diskpart.exe 并按 回车 打开磁盘分区工具。
  6. 输入 list disk 并按 回车 列出您的磁盘。找到您要修改的磁盘并记录其编号。
  7. 输入 select disk 磁盘编号 以选择要修改的磁盘。
  8. 输入 create partition efi size=大小(以 MiB 为单位指定所需的 ESP 大小),并按 回车。有关推荐大小,请参阅 EFI 系统分区#创建分区 中的说明。
  9. 输入 format quick fs=fat32 label=System 并按 回车 以格式化 ESP。
  10. 输入 exit 并按 回车 退出分区工具,再次输入 exit 并按 回车

Windows 安装完成后,您可以在 Windows 中缩小主分区,然后重启并继续正常的 Arch 安装,填满刚才创建的空间。

或者,您可以在驱动器上安装 Windows 之前,使用 Arch 安装介质创建一个所需大小的单一 EFI 系统分区。Windows 安装程序将使用您创建的 EFI 系统分区,而不会创建自己的。

无法在 BIOS 系统上安装 Windows 累积更新

在 BIOS 系统上,Windows 累积更新可能会失败,并报错:无法完成更新。正在撤消更改。请勿关闭计算机。 在这种情况下,在 Windows 中,您需要将 Windows 分区设置为活动 (active)

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 标记相同。

时间标准

  • 推荐:按照 系统时间#在 Microsoft Windows 中使用 UTC 的说明,将 Arch Linux 和 Windows 都设置为使用 UTC。某些版本的 Windows 如果设置为在线同步时间,会将硬件时钟改回 当地时间。这个问题似乎在 Windows 10 中已得到修复。
  • 不推荐:将 Arch Linux 设置为 当地时间 并禁用所有 时间同步守护进程。这将使 Windows 负责硬件时钟的校准。您需要记得每年(在春季和秋季)至少启动两次 Windows,以便在 夏令时 (DST) 开始或结束时进行同步。所以如果您通常好几天或好几周都不启动 Windows,请不要在论坛上询问为什么时钟快了或慢了一个小时。

蓝牙配对

当将蓝牙设备与 Linux 和 Windows 双系统配对时,两个系统具有相同的 MAC 地址,但会使用配对过程中生成的不同链路密钥。这导致设备在与其中一个系统配对后,无法连接到另一个系统。要使设备无需重新配对即可连接到任一系统,请按照 蓝牙#双引导配对 的说明操作。

参见

© . 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.