Windows PE
Windows PE 是 Windows 的轻量级版本,旨在用于安装 Windows Vista 及更高版本的 Windows,以及系统维护。它完全在内存中运行,并且可以从网络启动。
Windows PE 镜像通常在 Windows 中使用 Windows ADK 创建。本页面描述了如何使用 (Arch) Linux 机器创建自定义的 Windows PE 镜像,并可以选择将其发布到网络上。如果您需要:
- 您需要从网络安装 Windows,或者从网络启动 Windows PE 以进行系统管理,使用基于 Arch Linux 的服务器。这可能是因为您没有基于 Windows 的服务器,或者您更喜欢使用 Linux 服务器,因为其改进的安全性和可配置性,或者您已经将 Linux 服务器用于其他目的。
- 您需要运行 Windows 环境来运行 Win32 程序,您没有可用的 Windows 机器,并且您不想使用 Wine,或者程序无法使用 Wine 正确运行。
- 您需要更新固件,但您的设备制造商只提供 Windows 二进制文件。
创建可引导的 Windows PE 镜像
安装 wimlib。
获取 Windows ISO 或 WAIK 镜像
您需要 Windows 安装介质的副本,以便提取包含 Windows PE 初始副本的 boot.wim
文件,以及一些引导文件。不同版本的 Windows 包含不同版本的 Windows PE。有关 Windows 版本和 Windows PE 版本之间的关系,请参阅 Wikipedia。
最简单的方法是下载最新的 Windows 11 ISO。
- 对于 32 位版本的 Windows PE,请下载 Windows 10 iso,因为 Windows 11 已经放弃了对 32 位的支持。
- 对于 Windows 8 之前的版本,您可以改为下载 Windows 自动化安装工具包 (WAIK) 镜像。请参阅 [1],[2]
- 可以使用 httpfs 来避免下载整个镜像文件。
准备可引导的 Windows PE ISO
挂载安装镜像,例如:
# mount --mkdir winimg.iso /media/winimg
使用 wimlib 提供的 mkwinpeimg
脚本来创建可引导的 Windows PE ISO
$ mkwinpeimg --iso --windows-dir=/media/winimg winpe.iso
--waik-dir
而不是 --windows-dir
。请参阅 mkwinpeimg(1) 以获取更多信息,包括将文件复制到镜像中的 --overlay
选项。您可能希望这样做来添加您想要在 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
/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 是从内存中运行的。请参阅 Category:Hypervisors 以获取可用虚拟化软件的列表。
从 USB 密钥
如果您已按照上述指南为 UEFI 系统准备了 USB 密钥,它应该可以正常启动。启动可能需要一些时间(10 到 20 秒并不少见,具体取决于您的 USB 密钥),因为加载程序似乎将一些/所有数据复制到 RAM。
从 CD
只需将 winpe.iso
刻录到 CD 上,您就可以从中启动。
从网络
Windows PE 可以使用 PXELINUX 及其 MEMDISK 模块在 BIOS 系统上从网络启动。对于 UEFI 系统,可以使用 wimboot 和 iPXE。
将所需的 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 服务器(例如 Dhcpd 或 Dnsmasq)以将 pxelinux.0
指向为引导文件,并使用 Linux 服务器的 IP 地址。注意:如果您的 DHCP 服务器在路由器上,则可能无法在不安装自定义固件的情况下执行此操作。
完成上述步骤后,您应该能够从网络启动 Windows PE。
winpe.iso
,它可能为 118MB 或更大,并且需要大约 30 秒才能加载。通过使用 gpxelinux.0
引导加载程序而不是 pxelinux.0
,并使用 HTTP 而不是 TFTP 加载 winpe.iso
,可以提高性能。从 Windows PE 安装 Windows
启动进入 Windows PE 后,您可以从安装介质安装 Windows。
安装介质可以是网络共享 (Samba)。请参阅 Samba 以了解如何在 LAN 上的另一台机器上设置 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
继续执行#创建可引导的 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 固件。
自定义 Windows PE 镜像
诸如 Hiren's BootCD 之类的工具包含 Windows PE,并且大小约为完整 Windows ISO 的一半 (~2.8GB)。它们通常是功能更全的启动环境,并且可以包含 Internet Explorer,这可能有助于查找 bcdedit
或 bootrec
命令来修复 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 构建。