与Windows双启动
本文档详述了 Arch 与 Windows 共存的不同方法。
重要信息
Windows UEFI 与 BIOS 的局限性
微软根据所使用的 Windows 版本,对支持的固件引导模式和分区样式施加了限制。
- Windows 8/8.1 和 10 的 x86 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.1 和 10 的 x86_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 配置。
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(前提是该引导加载程序自身具备跨磁盘链式加载的能力)。
Windows 安装程序会创建 100 MiB 的 EFI 系统分区(除了使用 Advanced Format 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 安全启动。这是微软对所有 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 工作正常,安装后禁用安全启动不会导致问题。
如果您也打算为 Linux 使用安全启动,则可能需要对安全启动设置进行更改。这些更改会阻止在没有恢复密钥的情况下解锁 BitLocker 磁盘,从而导致永久性数据丢失。在继续操作之前,请检查是否属于这种情况,如果尚未操作,请保存您的 BitLocker 恢复密钥。如果 Windows 是由供应商预装的,这一点尤为重要。
快速启动与休眠
有两个操作系统可以休眠,您可以休眠 Windows 并引导 Linux(或其他系统),或者休眠 Linux 并引导 Windows,或者同时休眠两个系统。
同样,如果您在 Windows 和 Linux 之间共享一个 EFI 系统分区,那么如果您休眠(或在开启快速启动的情况下关机)Windows 然后启动 Linux,或者休眠 Linux 然后启动 Windows,EFI 系统分区可能会损坏。有关缓解策略,请查看 EFI 系统分区 中的相应章节。
ntfs-3g 增加了一个 安全防护措施 以防止读写挂载处于休眠状态的 NTFS 文件系统,但 Linux 内核中的 NTFS 驱动程序没有此防护。
Windows 默认无法读取 ext4 等 Linux 常用文件系统。除非您安装了相关的 Windows 驱动程序,否则无需考虑这些文件系统。
Windows 设置
快速启动是 Windows 8 及以上版本中的一项功能,它通过休眠计算机而不是实际关机来加快启动速度。
关于 Windows 快速启动和休眠的设置有多个选项,将在后续章节中介绍。
- 禁用快速启动和禁用休眠
- 禁用快速启动和启用休眠
- 启用快速启动和启用休眠
禁用快速启动的操作步骤详见 Windows 8、Windows 10 和 Windows 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 限制文件路径长度必须小于 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 恢复环境 分区,大小通常为 499 MiB,
- 一个包含 Windows Boot Manager、使用 FAT32 文件系统的 EFI 系统分区,
- 一个大小通常为 128 MiB 的 Microsoft 保留分区 (MSR),
- 一个使用 NTFS 文件系统的 Microsoft 基本数据分区,对应于
C:盘, - 可能还有系统恢复和备份分区,以及/或二级数据分区(通常对应
D:及后续盘符)。
使用 Windows 中的“磁盘管理”工具,查看分区的标记和报告类型。保留分区在“磁盘管理”中可能不可见,这种情况下可以使用 Windows cmd 中的 diskpart 工具来识别。这将帮助您了解哪些分区对 Windows 至关重要,以及哪些可以重新利用。Windows 的“磁盘管理”工具也可以用来缩小 Windows (NTFS) 分区,为 Linux 的额外分区释放空间。
您可以根据需要进行 分区。引导加载程序需要支持链式加载其他 EFI 应用程序才能双引导 Windows 和 Linux。不应创建额外的 EFI 系统分区,因为它可能 阻止 Windows 引导。
只需 挂载现有分区 即可。
- rEFInd 和 systemd-boot 会自动检测 Windows Boot Manager (
\EFI\Microsoft\Boot\bootmgfw.efi) 并将其自动显示在引导菜单中。对于 GRUB,请按照 GRUB#Windows 以 UEFI/GPT 模式安装 手动添加引导菜单项,或按照 GRUB#检测其他操作系统 生成配置文件。 - 为了节省 EFI 系统分区的空间,特别是针对多内核的情况,请 增加 initramfs 的压缩率。
预装较新版本 Windows 的计算机通常开启了 安全启动 (Secure Boot)。您需要采取额外步骤来禁用安全启动,或者使您的安装介质兼容安全启动(见上文及链接页面)。
先安装 Linux,后安装 Windows
尽管设置 Linux/Windows 双引导系统的推荐方法是先安装 Windows,但也可以反过来操作。与先装 Windows 的情况不同,您需要提前为 Windows 留出一个分区(例如 40GB 或更大),或者预留一些未分区的磁盘空间,也可以在 Linux 安装过程中,在启动 Windows 安装前为 Windows 创建并调整分区大小。
Windows 将使用已有的 EFI 系统分区。以下是操作大纲,假设固件中的 安全启动 已禁用。
- 引导进入 Windows 安装程序。注意让它仅使用预期的分区,但在其他方面让它像没有 Linux 安装一样执行工作。
- 按照 #快速启动与休眠 部分操作。
- 修复启动时加载 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
恢复意外删除的 EFI 系统分区
如果您有一个 GPT 分区的磁盘并擦除了(例如使用 mkfs.fat -F32 /dev/sdx)EFI 系统分区,您会发现 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 系统分区了!
Windows 安装程序创建的 EFI 系统分区太小
默认情况下,Windows 安装程序会创建 100 MiB 的 EFI 系统分区(除了使用 Advanced Format 4K 原生驱动器的系统,它会创建 300 MiB 的 ESP)。这通常不足以容纳所需的一切。您可以 用一个更大的新 EFI 系统分区替换现有的。
如果您是从零开始安装 Windows,可以在安装过程中指定 EFI 系统分区的大小 [9]:
- 选择安装目标并确保其没有分区。
- 点击 新建,然后点击 应用。Windows 安装程序将生成预期的分区(将几乎所有空间分配给主分区),但仅给 EFI 分区分配 100MB。
- 使用 UI 删除
系统、MSR和主要分区。保留恢复分区(如果有)。 - 按
Shift+F10打开命令提示符。 - 输入
diskpart.exe并按回车打开磁盘分区工具。 - 输入
list disk并按回车列出您的磁盘。找到您要修改的磁盘并记录其编号。 - 输入
select disk 磁盘编号以选择要修改的磁盘。 - 输入
create partition efi size=大小(以 MiB 为单位指定所需的 ESP 大小),并按回车。有关推荐大小,请参阅 EFI 系统分区#创建分区 中的说明。 - 输入
format quick fs=fat32 label=System并按回车以格式化 ESP。 - 输入
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 分区改回活动状态。
时间标准
- 推荐:按照 系统时间#在 Microsoft Windows 中使用 UTC 的说明,将 Arch Linux 和 Windows 都设置为使用 UTC。某些版本的 Windows 如果设置为在线同步时间,会将硬件时钟改回 当地时间。这个问题似乎在 Windows 10 中已得到修复。
- 不推荐:将 Arch Linux 设置为 当地时间 并禁用所有 时间同步守护进程。这将使 Windows 负责硬件时钟的校准。您需要记得每年(在春季和秋季)至少启动两次 Windows,以便在 夏令时 (DST) 开始或结束时进行同步。所以如果您通常好几天或好几周都不启动 Windows,请不要在论坛上询问为什么时钟快了或慢了一个小时。
蓝牙配对
当将蓝牙设备与 Linux 和 Windows 双系统配对时,两个系统具有相同的 MAC 地址,但会使用配对过程中生成的不同链路密钥。这导致设备在与其中一个系统配对后,无法连接到另一个系统。要使设备无需重新配对即可连接到任一系统,请按照 蓝牙#双引导配对 的说明操作。