Windows PE

来自 ArchWiki
(重定向自 Windows PE/技巧和窍门

Windows PE 是 Windows 的轻量级版本,旨在用于安装 Windows Vista 及更高版本的 Windows,以及用于系统维护。它完全从内存运行,可以从网络启动。

注意: 不要与 PE 二进制可执行文件格式混淆。

Windows PE 镜像通常在 Windows 中使用 Windows ADK 创建。本页介绍如何使用(Arch)Linux 机器创建自定义的 Windows PE 镜像,并可选择将其发布到网络上。如果以下情况,这可能会很有用:

  • 您需要从网络安装 Windows,或者从网络启动 Windows PE 以进行系统管理,使用基于 Arch Linux 的服务器。这可能是因为您没有基于 Windows 的服务器,或者您更喜欢使用 Linux 服务器,因为其改进的安全性和可配置性,或者您已经将 Linux 服务器用于其他目的。
  • 您需要运行 Windows 环境以运行 Win32 程序,您没有可用的 Windows 机器,并且您不想使用 Wine,或者程序无法通过 Wine 正确运行。
  • 您需要更新固件,但您的设备制造商仅提供 Windows 二进制文件。
警告: 通过下载 Windows 自动安装工具包,您可能会受到其许可协议的约束,该协议禁止您(除其他事项外)将 Windows PE 用作通用操作系统。

创建可启动的 Windows PE 镜像

安装 wimlib

获取 Windows ISO 或 WAIK 镜像

您需要 Windows 安装介质的副本,以便提取包含 Windows PE 初始副本的 boot.wim 文件,以及一些启动文件。不同版本的 Windows 包含不同版本的 Windows PE。有关 Windows 版本和 Windows PE 版本之间的关系,请参阅 维基百科

最简单的方法是下载最新的 Windows 11 ISO

提示
  • 对于 32 位版本的 Windows PE,请下载 Windows 10 iso,因为 Windows 11 已放弃对 32 位的支持。
  • 对于 Windows 8 之前的版本,您可以下载 Windows 自动化安装工具包 (WAIK) 镜像。请参阅 [1], [2]
  • 可以使用 httpfs 来避免下载整个镜像文件。
警告: 确保根据您的目标用途选择正确的架构:x86 (32 位) 或 x64 (64 位)。32 位程序在 Windows x64 上的兼容性通常很好,但您的实际情况可能会有所不同。

准备可启动的 Windows PE ISO

挂载安装镜像,例如:

# mount --mkdir winimg.iso /media/winimg

使用 wimlib 提供的 mkwinpeimg 脚本来创建可启动的 Windows PE ISO

$ mkwinpeimg --iso --windows-dir=/media/winimg winpe.iso
注意: 如果使用 WAIK 镜像,请使用 --waik-dir 而不是 --windows-dir

有关更多信息,包括将文件复制到镜像中的 --overlay 选项,请参阅 mkwinpeimg(1)。您可能希望这样做以添加您想在 Windows PE 中运行的其他 Windows 应用程序,或添加 Windows PE 需要的任何其他驱动程序。可以使用 Windows PE 中的 drvload 命令加载驱动程序。

卸载源 ISO

# umount /media/winimg

为 UEFI 系统准备可启动的 Windows PE 介质

mkwinpeimg 无法原生构建可启动的 UEFI 系统,但必要的 UEFI 启动文件包含在 Windows 安装介质中。

这些文件可用于创建可启动的 USB 密钥或 UEFI 系统的可启动 ISO 文件。

以下步骤假设 winimg.iso 仍挂载在 /mnt/winimg

创建一个目录 winpe_uefi,其中将包含创建 UEFI 启动介质所需的文件。

挂载新创建的 Windows PE ISO 文件,并将必要的文件复制到 winpe_uefi

# mount --mkdir winpe.iso /media/winpe
# cp -r /media/winpe/* winpe_uefi
# cp -r /mnt/winimg/efi winpe_uefi
警告: 确保您为 Windows ISO 镜像选择了合适的架构(x86 或 x64)。本指南仅在 x64 上进行了测试,即它使用 /efi/boot/bootx64.efi 启动。尚不清楚 UEFI 系统是否会以这种方式启动 x86 版本的 Windows。如果您可以测试,请更新此页面。

选项 1:为 UEFI 系统创建 ISO 文件

使用以下命令创建可从 UEFI 系统启动的 ISO 文件版本

$ mkisofs \
    -no-emul-boot \
    -b "microsoft/boot/efisys.bin" \
    -iso-level 4 \
    -udf \
    -joliet \
    -disable-deep-relocation \
    -omit-version-number \
    -relaxed-filenames \
    -output "winpe_uefi.iso" \
    winpe_uefi

您现在可以卸载所有 ISO。您的 winpe_uefi.iso 文件现在可以在 UEFI 系统上启动了。

选项 2:为 UEFI 系统创建 USB 密钥

在 USB 密钥上,创建 GPT 分区表,其中包含一个类型为 EFI System 的分区,并将该分区格式化为 FAT32

winpe_uefi 目录中准备的文件复制到 USB 密钥

# mount --mkdir /dev/sdX1 /media/usb
# cp -r winpe_uefi/* /media/usb/

您现在可以卸载所有 ISO 和 USB 密钥,您的 USB 密钥已准备好启动。

启动 Windows PE

在按照上一节中的描述创建 Windows PE 的可启动 ISO (winpe.iso) 后,您可能希望通过以下方式启动 Windows PE

在虚拟机中

运行虚拟机,并将 winpe.iso 作为 CD-ROM 连接。请务必为其提供足够的内存,绝对要大于 ISO 的大小,因为 Windows PE 从内存运行。有关可用虚拟化软件的列表,请参阅分类:虚拟机监控程序

从 USB 密钥

如果您已按照上述指南为 UEFI 系统准备了 USB 密钥,它应该可以正常启动。启动可能需要一些时间(10 到 20 秒并不少见,具体取决于您的 USB 密钥),因为加载程序似乎会将一些/所有数据复制到 RAM。

从 CD

只需将 winpe.iso 刻录到 CD 上,您就可以从中启动。

从网络

本文或章节是与 PXE 合并的候选对象。

注意: PXE 文章已经描述了大部分内容,无需重复。只需确保配置文件不会丢失(如果对 Windows 来说是必要的)。除此之外,一切都是重复的。(在 Talk:Windows PE 中讨论)

Windows PE 可以使用 PXELINUX 及其 MEMDISK 模块在 BIOS 系统上从网络启动。对于 UEFI 系统,可以使用 wimbootiPXE

安装 syslinuxtftp-hpa

将所需的 PXELINUX 文件复制到 TFTP 服务器 根目录。

# rsync -aq /usr/lib/syslinux/bios/ /var/tftpboot/

winpe.iso 放在 TFTP 服务器 根目录中。

# mv winpe.iso /var/tftpboot

为 PXELINUX 创建一个 配置文件,类似于以下内容

/var/tftpboot/pxelinux.cfg/default
UI         menu.c32
MENU TITLE Network Boot
TIMEOUT    50

LABEL      winpe
MENU LABEL Boot Windows PE from network
KERNEL     /memdisk
INITRD     winpe.iso
APPEND     iso raw

LABEL      localboot
MENU LABEL Boot from local disk
LOCALBOOT  0

启动 TFTP 服务器

配置您的 DHCP 服务器(例如 DhcpdDnsmasq)以将 pxelinux.0 指向启动文件,并使用 Linux 服务器的 IP 地址。注意:如果您的 DHCP 服务器位于路由器上,则可能无法在不安装自定义固件的情况下执行此操作。

完成上述步骤后,您应该能够从网络启动 Windows PE。

注意: 使用给定的 PXELINUX 配置文件,Windows PE 将在 5 秒后默认启动。
提示: TFTP 并非设计用于传输大型文件,例如 winpe.iso,它可能为 118MB 或更大,并且需要大约 30 秒才能加载。通过使用 gpxelinux.0 引导加载程序而不是 pxelinux.0 并使用 HTTP 而不是 TFTP 加载 winpe.iso,可以提高性能。

从 Windows PE 安装 Windows

启动进入 Windows PE 后,您可以从安装介质安装 Windows。

安装介质可以是网络共享(Samba)。有关在 LAN 上的另一台计算机上设置 Samba 服务器的信息,请参阅 Samba。要共享挂载在 /media/winimg 的安装镜像,请将以下共享定义添加到 /etc/samba/smb.conf

/etc/samba/smb.conf
[REMINST]
browsable = true
read only = no
guest ok = yes
path = /media/winimg

启动进入 Windows PE 命令提示符后,运行以下命令以初始化网络接口,获取 Samba 服务器的 IP(假设 Windows PE 是通过 PXE 从运行 DHCP、TFTP 和 Samba 服务器的计算机启动的,服务器 IP 通常将是网关 IP),挂载共享,并启动 GUI 安装程序

 > wpeinit
 > ipconfig
 > net use I: \\IP.ADDRESS.OF.SAMBA.SERVER\REMINST
 > I:\setup.exe

技巧和窍门

更新 Intel Management Engine 固件

如果您的硬件制造商仅提供 Windows 二进制文件,并且您无法通过 Fwupd 更新,则可以使用 Windows PE 来安装固件更新,例如 Intel ME

您将需要下载:

  • 您的制造商的 Intel ME 更新工具
  • Intel Management Engine 的驱动程序。

将两个解压后的存档存储在一个文件夹中,例如:

/vendor_files
  ├── me_driver
  └── update_tool
注意: 您可能需要使用 Wine 和/或 cabextract 以解压驱动程序,具体取决于它们的打包方式。

继续 #创建可启动的 Windows PE 镜像,但请确保:

  • 选择您的设备供应商提供 Intel ME 驱动程序的 Windows PE 版本,即 32 位或 64 位。
  • 使用 --overlay 包含设备驱动程序和更新工具,例如:
$ mkwinpeimg --iso --windows-dir=/media/winimg --overlay=vendor_files winpe.iso

继续 #启动 Windows PE,然后使用以下命令加载驱动程序:

X:\Windows\Systems32>cd \
X:\>drvload me_driver\...\heci.inf

最后,使用更新工具更新 Intel ME 固件。

提示: 您可以使用 Intel CSME 版本检测工具 检查漏洞。

自定义 Windows PE 镜像

Hiren's BootCD 等工具包含 Windows PE,并且大约只有完整 Windows ISO 大小的一半 (~2.8GB)。它们通常是功能更全面的启动环境,并且可以包含 Internet Explorer,这可能有助于查找 bcdeditbootrec 命令来修复 Windows 启动管理器。

Hiren's BootCd 已经可以启动,只需要将其解压到 USB。

dd bs=4M if=./HBCD_PE_x64.iso of=/dev/sdX status=progress && sync

确保 USB 密钥使用 GPT 分区表,如 #为 UEFI 系统准备可启动的 Windows PE 介质 中所述。

故障排除

系统错误 58 已发生。指定服务器无法执行请求的操作

如果您在使用 net use 命令时遇到以下错误:

System error 58 has occurred.

The specified server cannot perform the requested operation.

1. 确保您没有意外卸载 /media/winimg 目录。

2. 将 map to guest 添加到 /etc/samba/smb.conf。在文件顶部添加以下内容:

/etc/samba/smb.conf
[global]
map to guest = Bad User
...

3. 重新启动 smbd.service

4. 在 net use 命令中指定任何用户名/密码

net use I: \\IP.ADDRESS.OF.SAMBA.SERVER\REMINST /user:user pass

发生这种情况是因为 Windows 10 通过检查某些用户名和密码来连接到匿名共享,以查看它是否能够登录,如果可以,则允许匿名连接。显然,无论哪个部分向用户隐藏了这一点,都没有进入 PE 构建。

参见