Dual boot with Windows (简体中文) - ArchWiki

Jump to content

## 重要信息

### Windows 在 UEFI 和 BIOS 上的限制

不同版本的 Windows 对固件启动模式和分区表有不同的需求。以下依版本列出。

注意： 下列情形是 Windows 安装程序的限制。但 Windows 本身仍可能在安装程序不支持的环境下正常运行。例如，在绕过相关安装检测后，Windows 11 仍可在 BIOS/MBR 的配置上运行。

- XP 所有版本均只支持从 BIOS/MBR 配置启动。
- Vista
  - 32 位所有版本均只支持从 BIOS/MBR 配置启动。
  - 64 位 RTM 只支持从 BIOS/MBR 配置启动，SP1 及以上追加支持 64 位 UEFI/GPT 配置。
- 7
  - 32 位所有版本均只支持从 BIOS/MBR 配置启动。
  - 64 位支持从 BIOS/MBR 或 64 位 UEFI/GPT 配置启动。
- 8/8.1/10
  - 32 位支持从 BIOS/MBR 或 32 位 UEFI/GPT 配置启动。
  - 64 位支持从 BIOS/MBR 或 64 位 UEFI/GPT 配置启动。
- 11 仅支持 UEFI/GPT。

对于预装系统的计算机：

- XP、Vista、7（32 位）全是 BIOS/MBR 启动，无论软硬件配置如何。
- 7（64 位）几乎都是 BIOS/MBR 启动。仅有极少数晚近的型号是 64 位 UEFI/GPT 启动。
- 从 8 开始，都是 UEFI/GPT 启动。UEFI 和操作系统的位数（32/64）是相同的。

最准确的判断方式：

- 启动到Windows
- 按`Win+R`打开“运行”，运行`msinfo32.exe`
- 系统信息->系统摘要->BIOS模式
  - UEFI -> UEFI
  - Legacy -> BIOS

总的来说，Windows 安装程序基于固件模式强制要求分区，UEFI 启动只能装到 GPT 盘，BIOS 启动只能装到 MBR 盘。

提示： Windows 10 1703 及以后版本提供从 BIOS/MBR 转换到 UEFI/GPT 的工具。

Linux 内核没有这样的限制，但引导加载程序及其设置可能会有影响。如果想要在同一硬盘上启动 Windows 和 Linux，请考虑上述的 Windows 限制，因为引导加载程序的安装过程依固件和分区类型可能会有区别。

### 安装介质的限制

Intel Atom SoC（Clover 和 Bay）只提供 32 位 UEFI 支持，没有 BIOS 支持。由于 Arch 官方安装镜像没有 32 位 UEFI 启动支持，无法直接在这类系统上启动。可在在 32 位 UEFI 上启动 64 位内核[损坏的链接：无效的章节]查看变通方法。

### UEFI 和 BIOS 引导加载程序的限制

大多数某类（UEFI 或 BIOS 之一）固件上的 Linux 引导加载程序，不能启动或链式加载另一种固件上的引导加载程序。例如，如果 Arch 以 UEFI 模式安装在一块硬盘下、Windows 以 BIOS 模式安装在另一块硬盘下，Arch 的 UEFI 引导加载程序不能链式加载 Windows 的 BIOS 引导加载程序。这与分区表类型无关。反之亦然。

有几个例外：

- 装在苹果电脑上的 GRUB。这里，UEFI 模式的 GRUB 可以用`appleloader`命令启动 BIOS 模式安装的操作系统（在非苹果电脑上无效）。
- rEFInd 理论上也支持从 UEFI 固件启动 BIOS 操作系统，但作者称在非苹果电脑上不总是正常工作。
- 一块硬盘上的 BIOS/GPT Arch 所使用的引导加载程序可以启动另一块硬盘上的 BIOS/MBR Windows，如果该引导加载程序本身支持链式加载其他硬盘的系统。

### UEFI 安全启动

一切预装的 Windows 8/8.1/10/11 系统都默认使用 UEFI/GPT 方式启动且默认启用 UEFI 安全启动 (Secure Boot)。对于所有 OEM 预装系统 Microsoft 都强制要求这么做。

目前 Arch Linux 的安装媒体尚不支持安全启动。参见Secure Boot#Booting an installation medium。

目前建议的做法是，在试图启动 Arch Linux 之前在固件设置中手动禁用 UEFI 安全启动。这样，Windows 8/8.1/10/11 应该 也还能正常启动。但是由于 Microsoft 已经明确禁止出现任何在预装的 Windows 8/8.1 及以上的系统中远程地或以编程方式地（从OS之内）禁用安全启动的方式，因此关于这种做法唯一的问题就是它需要操作者能够坐在目标电脑前面直接访问该电脑。

注意：

- 如果使用 BitLocker 加密 Windows 且将密钥保存在 TPM 内以便启动时自动解锁，则一旦禁用安全启动，Windows 将无法启动，并显示 BitLocker 恢复屏幕。虽然如此，该问题并不永久，只要再次启用安全启动即可再次启动 Windows。
- 如果使用的是 Windows 11，禁用安全启动将同时导致 Windows Hello、WSM（适用于 Android 的 Windows 子系统以及 Windows Update 无法使用。

### 快速启动和休眠

两个系统都可以休眠，既可以休眠 Windows 而启动 Linux （或者另一个 OS），又可以休眠 Linux 而启动 Windows，或者也可以两个系统都休眠。

警告： 如果在 Windows 休眠时使用双启动进入另一 OS 并在二者皆可读/写的（如 NTFS）且已经被 Windows 挂载的某个文件系统上做出更改，有可能发生数据损失。（参见[1]。）同样，如果 Linux 休眠而启动另一个 OS，也可能出现数据损失，如此之类。在选择关闭 Windows 时，Windows 也有可能实际上在休眠。参见#Windows 设置。

同样的原因，如果 Windows 和 Linux 使用同一个 EFI 系统分区，如果休眠（或在启用快速启动时关闭）Windows 并启动 Linux，或者休眠 Linux 并启动 Windows， EFI 系统分区可能遭到破坏。

ntfs-3g 加入了一种 保护机制 以阻止以读/写方式挂载已休眠的 NTFS 文件系统，但是 Linux 内核中的 NTFS 驱动并没有该机制。

一般情况下，Windows 是无法读取像目前广泛用于 Linux 的 ext4 之类的文件系统的。除非你为这些 Windows 所不支持的文件系统安装 Windows 驱动，这些文件系统可以忽略。

#### Windows 设置

快速启动在 Windows 8 引入，其在关机时会休眠而非真正意义上关闭 Windows 以加快启动速度。

在之后的章节中会谈到关于快速启动和休眠的 Windows 设置项。

- 关闭快速启动并关闭休眠
- 关闭快速启动并启用休眠
- 启用快速启动并启用休眠

禁用快速启动的方法：Windows 8，Windows 10, Windows 11。此时无论如何，只要你禁用某项设置，请确保禁用某项设置，关闭 Windows，再安装 Linux；请注意不应只是重启。

##### 关闭快速启动并关闭休眠

这是最安全的方法，并且如果对该问题不确定，那么推荐使用该方法。因为该方法在重启进入另一 OS 时对用户感知要求并不高。这时可以让 Windows 和 Linux 共享 EFI 系统分区。

##### 关闭快速启动并启用休眠

该方法在重启进入另一 OS 时要求用户感知。如果你想在 Windows 休眠时启动 Linux（这种情况很常见）那么：

- 必须为 Windows 和 Linux 使用不同的 EFI 系统分区 (ESP)，并确保 Windows 在休眠前没有挂载 Linux 的 ESP。由于每个硬盘只能有一个 ESP，Linux 的 ESP 所处的盘必须与 Windows 的不同。即使在这种情况下， Windows 和 Linux 仍然可以安装在同一硬盘的不同分区中。
- 不能在 Linux 下以读/写方式挂载任何在 Windows 休眠时已经由 Windows 挂载的任何文件系统。必须非常小心对待此事，对此还应考虑Automount行为。
- 如果完全关闭 Windows 而非将其休眠，那么这些文件系统可以读/写挂载。

注意： 在 Windows 中将某盘挂载为可移动磁盘并在休眠前将其弹出可以为该盘避免此问题。

##### 启用快速启动并启用休眠

此情况下，应该考虑与“关闭快速启动并启用休眠”时同样的情况。但是由于此时无法将 Windows 完全关闭，而只能将其休眠，在 Windows 休眠时由 Windows 挂载的分区将永远不能读/写挂载。

注意： Windows Update 更新可能导致快速启动被重新启用。见[2]

### Windows 文件名限制

Windows 限制文件路径小于260 个字符。

由于一些可以追溯到 DOS 的原因，Windows 同时禁止文件名中出现某些字符：

- `<` (小于号)
- `>` (大于号)
- `:` (半角冒号)
- `"` (半角双引号)
- `/` (反斜杠)
- `\` (斜杠)
- `|` (竖杠)
- `?` (半角问号)
- `*` (星号)

这属于 Windows 而非 NTFS 本身的限制——任何使用 NTFS 分区的其它 OS 都不受影响。Windows 将无法检测到这些文件，并且运行 `chkdsk` 很可能会使它们被删除，造成数据丢失的风险。

如果使用`windows_names`选项，NTFS-3G将会把和 Windows 一样的限制应用于新文件的名字上：ntfs-3g(8) § Windows_Filename_Compatibility。（见fstab）

## 安装

设置 Linux/Windows 双启动的推荐方式是，先安装 Windows， 但是只为其分区划一部分空间。在 Windows 设置完毕后，启动 Linux 的安装环境以便为 Linux 创建分区并调整分区大小，但 Windows 分区保持原样。Windows 的安装已经创建了一个能够用于你的 Linux 启动引导程序 的 EFI 系统分区。

### 先 Windows 后 Linux

#### BIOS 系统

##### 使用 Linux 启动引导程序

你可以使用任何具有多启动支持的 BIOS 启动引导程序。

##### 使用 Windows Vista/7/8/8.1 启动引导程序

本章节将讲述如何在某一分区而非 MBR 上安装一个 Linux 启动引导程序、将该程序复制到某个可被 Windows 引导程序读取的分区，以及用 Windows 引导程序启动该 Linux 引导程序。

注意： 某些文档声明能被 Windows 引导器读取的分区必须是主分区，但是扩展分区的使用也有成功记录。

- 在安装引导程序时，请将其安装在你的`/boot`分区而非 MBR 上。如果使用 GRUB，请见GRUB/Tips and tricks#Install to partition or partitionless disk；如果是 Syslinux，见Syslinux#Manual install处的附注；如果是 LILO，见LILO#Install to partition or partitionless disk。
- 建立一份 VBR 的拷贝：

    dd if=/dev/disk of=/path/to/linux.bin bs=512 count=1

其中`/dev/disk`是你安装启动引导程序的分区的路径，`/path/to/`是你想要 Windows 启动引导程序可以读取该拷贝的且已经挂载的文件系统。

- 现在你的 linux.bin 应该可以在 Windows 下访问了。以管理员权限运行cmd（进入开始菜单-全部应用程序-(Windows)附件。右键命令提示符并选择以管理员权限运行）并执行以下命令：

    bcdedit /create /d "Linux" /application BOOTSECTOR

BCDEdit 将会返回该项的UUID。该 UUID 在下面的步骤中将会用`UUID`代替。

    bcdedit /set UUID device partition=X: (X:为linux.bin所处分区的分卷号)
    bcdedit /set UUID path \path\to\linux.bin
    bcdedit /displayorder uuid /addlast
    bcdedit /timeout 30

重启之后，Windows 和 Linux 应该都显示在 Windows 的启动引导程序当中。

注意： 在某些电脑上，Windows 引导程序用另一电源按钮启动另一 OS（例如：Dell Precision M4500）。

参见 https://www.iceflatline.com/2009/09/how-to-dual-boot-windows-7-and-linux-using-bcdedit/

#### UEFI 系统

如果你已经安装 Windows，它已经在一张GPT格式的硬盘上创建如下分区：

- 一个WinRE分区，一般大小为499 MiB，包含启动 Windows 所需的文件，等同于 Linux 下的`/boot`分区;
- 一个具有 FAT32 文件系统的 EFI 系统分区;
- 一个MSR 分区;
- 一个格式化为 NTFS 的 Microsoft Basic Data 分区，对应`C:`;
- 可能是系统恢复/备份/非主要数据分区（对应`D:`等）;

在 Windows 下，使用磁盘管理工具查看各分区的标签以及报告的类型。这样能使人清楚哪些分区属于必要的 Windows 分区，以及可能随时改变用途的其它分区。Windows 磁盘管理同样可以缩小 Windows (NTFS) 分区以便为 Linux 腾出空间。

警告： 上述分区中前 4 种为关键系统分区，不能删除。

现在可以继续按需进行分区。

注意，不应再创建新的 EFI 系统分区，这么做可能导致 Windows 无法正常启动。直接挂载现有分区即可。

注意： 只有 Linux 被安装在另一块硬盘并在磁盘上创建了新的 EFI 系统分区时才会出现此问题。

启动引导程序须支持链式载入其它 EFI 应用程序以进行 Windows-Linux 双启动。

提示： rEFInd和systemd-boot都会自动检测Windows Boot Manager(`\EFI\Microsoft\Boot\bootmgfw.efi`)并将其显示于自己的启动菜单中。如果使用 GRUB，见GRUB#Windows installed in UEFI/GPT mode（手动添加启动项）或GRUB#Detecting other operating systems（自动生成配置文件）。

预装较新版本的 Windows 的电脑通常启用安全启动。需要进行额外操作以禁用安全启动或使你的安装媒体支持安全启动（详见上文）。

### 先 Linux 后 Windows

即使设置 Windows-Linux 双启动时一般推荐先安装 Windows，换成 Linux 在前也可以实现双启动。与 Windows 在前的方式相比，这种方式需要在启动 Windows 安装之前创建并搁置一个（比如 40GB 或者更高的）Windows 分区，或者预留一些空闲的未分区空间，或者从 Linux 安装中创建/调整 Windows 分区。

#### UEFI 固件

Windows 将会使用已有的EFI 系统分区。与之前所述相比，只有单个 Windows 分区而没有 WinRE 也没有 MSR 分区的 Windows 是否能正常工作并不明确。

这里假设安全启动已禁用。

1. 启动 Windows 安装。注意让安装器使用你希望其使用的分区，然后让它如同没有安装 Linux 一样工作。
2. 按照#快速启动和休眠的说明操作。
3. 恢复 Linux 启动（可参阅#安装 Windows 后 Linux 无法启动）。前面已经提到过，某些 Linux 引导启动程序会自动检测Windows Boot Manager。即使较新的 Windows 安装都有一个能用于启动到 Linux 的“高级启动”选项，仍然建议使用 Arch 安装媒体或 LiveCD 之类的方式启动 Linux。

##### Windows 10 和 GRUB

这里假设使用GRUB作为启动引导程序（对于其它引导程序大致思路也相似）且 Windows 10 将会安装到一个已经有 EFI 系统分区的 GPT 块设备上。详见这篇 Microsoft 文档的“系统分区”章节。

用`gdisk`在块设备上创建如下分区：（更精确的分区大小见[3]）

标题文本
最小尺寸 | 分区类型代码 | 分区类型名 | 文件系统
--- | --- | --- | ---
16 MB | 0C01 | Microsoft reserved | N/A
约 40 GB | 0700 | Microsoft basic data | NTFS
300 MB | 2700 | Windows RE | NTFS

用来自ntfs-3g的`mkntfs`工具在新创建的 Microsoft basic data 和 Windows RE 分区上创建新的 NTFS 文件系统。

将系统重启到 Windows 10 安装媒体。选择“自定义”安装选项并将 Windows 安装到先前创建的 Microsoft basic data 分区上。这样应该也会将 Microsoft EFI 文件安装到 EFI 分区中。

安装完毕后（不需要 OOBE 和登录），重启进入 Linux 并生成一个 GRUB 配置文件以便 Windows 的启动管理器在下次启动时启动在 GRUB 菜单中。

### 故障排除

#### 无法创建新分区或无法找到已有分区

见 #Windows 在 UEFI 和 BIOS 上的限制。

#### 安装 Windows 后 Linux 无法启动

见 Unified Extensible Firmware Interface#Windows changes boot order

#### 恢复 Windows 启动记录

按照惯例（且为了更简易的安装过程），Windows 通常安装在第一分区并将其分区表和其启动引导程序的引用安装到该分区的第一扇区。如果不慎把一个 GRUB 之类的启动引导器安装到 Windows 分区上，或者用其它什么方式弄坏了 Windows 的启动记录，就需要使用工具对其进行修复。Microsoft 在他们的恢复光盘（有些时候，安装光盘）上提供一个叫做`FIXBOOT`的启动扇区修复工具和一个名为`FIXMBR`的 MBR 修复工具。这种方式可以分别更正第一分区的启动扇区对启动引导程序的引用以及 MBR 上对第一分区的引用。在此之后需要按原先计划将 GRUB 重新安装到 MBR 上（GRUB 可以配置为链式加载 Windows 启动引导程序）。

如果你希望回退到 Windows，你可以用`FIXBOOT`命令链接 MBR 和第一分区启动扇区以恢复 Windows 的自动启动。

有一个叫做ms-sysAUR的工具可以用于安装 MBR。但是，该工具目前只能写新 MBR 或 FAT 文件系统的启动扇区（又称为启动记录；等效于`FIXBOOT`）。许多 LiveCD 默认都没有该工具，所以其需要提前安装，或者可以考虑包含该工具的急救 CD，如Parted Magic。

首先，重新写一遍分区信息（表）：

    # ms-sys --partition /dev/sda1

接下来，写 Windows 2000/XP/Server 2003 MBR：

    # ms-sys --mbr /dev/sda  #查阅 options 列表以获取不同版本的信息

最后，写启动扇区：

    # ms-sys -(1-6) #查阅 options 列表以查找正确的 FAT 记录类型

`ms-sys`同样可以写 Windows 98/ME 及 Windows Vista/7 MBR。详见`ms-sys -h`。

#### Windows 安装程序留下的 EFI 系统分区过于小

Windows 安装程序会创建一个 100 MiB 的 EFI 系统分区（在Advanced Format盘上为 300 MiB）。一般来说，这种容量并不足以放下所需要的所有文件。可以尝试使用各种工具来调整该分区大小，但是已经存在的其它分区往往导致这样做很难。一种方法是在将 Windows 安装到盘上之前就用 Arch 安装媒体创建一个自定大小（且较大）的EFI 系统分区。Windows 安装程序将会使用你自己创建的 EFI 分区，而非再为自己创建一个。

## 时间标准

- 建议：将 Arch Linux 和 Windows 皆设置为UTC（见System time#UTC in Microsoft Windows）。某些 Windows 版本在设置为自动同步网络时间时会将 RTC 回退到 localtime。该问题在 Windows 10 中似乎已解决。

- 不建议：将Arch Linux的硬件时钟模式设为localtime并禁用任何时钟同步服务。这将会使Windows检查硬件时间的正确性，并且你需要在一年中至少启动Windows两次(分别在春季与秋季)以正确应用夏令时。所以请不要忘记启动 Windows 而在论坛问为什么时钟会快/慢一个小时）。

## 蓝牙配对

对于将蓝牙设备同时与 Linux 和 Windows 配对，两个系统均使用相同的 MAC 地址，但是配对过程中会使用不同的 link keys，导致在蓝牙设备与其中一个系统配对后就无法连接到另一个系统。如果想要使蓝牙设备不用重新配对就在两个系统下都可用，见Bluetooth#Dual boot pairing。

## 参见

- Booting Windows from a desktop shortcut
- One-time boot into Windows partition from desktop shortcut
- Windows 7/8/8.1/10 ISO to Flash Drive burning utility for Linux (MBR/GPT, BIOS/UEFI, FAT32/NTFS)

Categories:

- Boot process (简体中文)
- Installation process (简体中文)

Hidden category:

- Pages with broken section links