Windows PE (简体中文)

From ArchWiki
翻译状态:本文是 Windows PE翻译。上次翻译日期:2021-08-20。如果英文版本有所更改,则您可以帮助同步翻译。

Windows PE 是Windows的轻量级版本,旨在用于安装 Windows Vista 或更高版本的 Windows,或是用于系统维护。 它完全运行在内存中,并可以从网络启动。本页面描述了如何创建定制化的Windows PE镜像文件(也可选择发布在网络上的),我们只需用到Arch Linux设备上的自由软件包和微软Windows自动安装工具包(Microsoft's Windows Automated Installation Kit ,简称WAIK)。WAIK 可以免费下载,能用到它的地方只有:我们只需解压其中的boot.wim文件,该文件包含了 Windows PE 的最初备份, 还有一些启动文件。

警告: 下载 Windows Automated Installation Kit 时, 您可能会受到其许可的约束,这会阻止您将 Windows PE 用作通用操作系统。

使用场合

通常,只能使用 Windows 计算机上的 Windows 自动安装工具包 (WAIK) 创建 Windows PE 的映像。但是,也可以使用 (Arch) Linux 机器创建和修改 Windows PE 的映像,并可选择将它们发布到网络上以进行 PXE 引导。不使用 Windows 机器是可能的。在以下情况出现时,您可能想要这样做:

  • 您需要使用Arch Linux的服务器从网络安装 Windows ,或者从网络启动  Windows PE 来进行系统管理。这样做可能是因为您没有基于 Windows 的服务器,或者因为绝佳的安全性和可配置特性就是喜欢用 Linux 服务器,又或是您因为别的原因已经拥有了一台 Linux 服务器。
  • 您需要在 Windows 环境下运行 Win32 应用程序,但您并没有可用的 Windows 设备,也不想用 Wine 或者您的程序在 Wine 下没有正确执行。

创建可启动的 Windows PE 镜像

安装 wimlib.

配置 Windows PE 镜像

要启动到命令提示符,请创建一个启动脚本,该脚本将包含在下一步的可启动映像中:

start.cmd
cmd.exe
pause

mkwinpeimg 脚本支持使用 --overlay 选项对 Windows PE 进行进一步修改。 有关 mkwinpeimg 的更多信息,请参阅它的手册页。您可能希望这样做以添加要在 Windows PE 中运行的 Windows 应用程序或者额外的驱动程序。(可以用 Windows PE 中的命令 drvload 加载所需的驱动程序).

获取 Windows ISO 或 WAIK 镜像

mkwinpeimg 可以从各种来源创建可启动的 Windows PE ISO。 您首先需要获得:

  • 选项A (适用于 Windows 7 及更高版本): Windows 安装镜像ISO文件, 它可以在微软网站上免费下载:: Windows 10 ISO. 这是最简单的方法。
  • 选项B: Windows自动安装工具包镜像(WAIK)文件。 对于 Windows Vista/7, 它可以在此处下载: 一个单独的 WAIK 发行版. 从 Windows 8 开始, WAIK 被重命名为 WADK 并通过 adksetup.exe 分发。
警告: 确保根据您的实际需要选择正确的目标架构: x86 (32位) 或 x64 (64位)。 Compatibility of 32-bit programs on Windows x64 is generally good, but your mileage may vary.

不同版本的 Windows 安装介质包含不同版本的 Windows PE。Windows 版本和 Windows PE 版本之间的关系,请参考 维基百科.

提示: 也许可以使用 httpfs 来避免下载整个镜像文件。 Windows PE 只占该镜像文件大小的 118MB。

准备可启动的 Windows PE ISO

成功获取 Windows 安装镜像或者 WAIK/WADK 镜像后,你需要挂载它。假设它叫做winimg.iso:

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

使用 wimlib 提供的 mkwinpeimg 脚本创建可启动的 Windows PE ISO文件 winpe.iso, 启动脚本在上一节中已经创建:

选项A: 源镜像是 Windows 安装介质

$ mkwinpeimg --iso --windows-dir=/media/winimg --start-script=start.cmd winpe.iso

选项B: 源镜像是 WAIK/WADK:

$ mkwinpeimg --iso --waik-dir=/media/winimg --start-script=start.cmd winpe.iso

有关更多信息,请参阅 mkwinpeimg(1) , 包含 --overlay 选项以把文件复制到镜像中。

卸载源 ISO:

# umount /media/winimg

为 UEFI 系统准备 Windows PE 启动U盘

不幸的是,从 wimlib 的1.13.1-1开始,mkwinpeimg 无法构建可引导的 UEFI 系统。但是我们依然可以轻松构建这样的 UEFI 系统:Windows 10 安装 ISO 已经包含必要的 UEFI 启动文件。

警告: 确保为 Windows ISO 映像(x86 或 x64)选择了合适的体系结构。本指南仅在 x64 上进行过测试,即它使用 /efi/boot/bootx64.efi 。 UEFI 系统是否会以这种方式启动 Windows 的 x86 映像尚不得而知。如果您可以测试,请更新此页面。

在U盘上, 创建一个 GPT 分区表,其中包含一个类型为 “EFI System”的 FAT32 分区。 这可以通过 cfdisk 或 fdisk 交互式地完成,比如使用 fdisk :

# fdisk /dev/sdX
(fdisk) g  # Create a new GPT partition table
(fdisk) n  # Create new partition, leave all parameters as default
(fdisk) t  # Change type of partition
(fdisk) 1  # Type 1 is "EFI System Partition"
(fdisk) w  # Save and quit

然后把此分区格式化为 FAT32:

# mkfs.vfat /dev/sdX1

挂载由 mkwinpeimg 创建的 winpe.iso 文件,挂载你的启动U盘, 复制以下内容:

# mkdir /media/{winpe,usb}
# mount winpe.iso /media/winpe
# mount /dev/sdX1 /media/usb
# cp -r /media/winpe/* /media/usb/

最后,挂载原始 Windows ISO 文件并复制 efi 中的所有文件:

# mount winimg.iso /media/winimg
# cp -r /media/winimg/efi /media/usb/

现在,你可以卸载所有 ISO 和 U 盘,你的启动 U 盘已经准备就绪。

没错: 不需要 syslinux 或 grub magic。UEFI 固件会找到 FAT 分区并加载Windows 提供的 /efi/boot/bootx64.efi 引导文件以从 U 盘引导。

引导启动 Windows PE

按照上一节所述创建可启动的 Windows PE ISO (winpe.iso) 之后,你也许想通过如下几种方式引导启动 Windows PE 。

在虚拟机中

在虚拟机中运行 winpe.iso 作为 CD-ROM。确保分配了足够的内存,绝对要大于 ISO 文件的大小,因为 Windows PE 是从内存启动的。

使用启动U盘

如果你已经如前文所述为UEFI系统准备好了启动U盘,你只需从U盘启动即可。启动过程可能耗费一些时间(10至20秒也不算稀奇,具体取决于你的U盘),因为加载程序似乎要把一些(也可能是所有)数据复制到内存中。

使用光盘

只需把 winpe.iso烧录[损坏的链接:无效的章节] 到光盘上,就可以从该光盘启动 Windows PE。

从网络启动

在 BIOS 系统中,Windows PE 可以从网络启动,通过 PXELINUX 和它的 MEMDISK 模块。 对于 UEFI 系统,可以使用 wimboot 和 iPXE

安装 syslinux 和 tftp-hpa.

复制需要的 PXELINUX 文件到 TFTP server 的根目录。

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

winpe.iso 文件放进 TFTP server 的根目录。

# 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 server.

配置你的 DHCP server (例如 DhcpdDnsmasq),用Linux服务器的IP地址指向作为引导文件的 pxelinux.0 。注意:如果您的 DHCP 服务器在路由器上,则可能无法在不安装自定义固件(firmware)的情况下执行此操作。

完成以上全部步骤后,你将能够从网络启动 Windows PE 。

注意: 根据上面给出的 PXELINUX 配置文件, Windows PE 将在5秒后默认启动
提示: TFTP 并非为传输大文件而设计, winpe.iso足足有 118MB 或更大,可能需要花费超过30秒的时间加载。 使用gpxelinux.0 bootloader 而不是 pxelinux.0, 使用HTTP而不是TFTP加载winpe.iso 或许可以提高性能

从 WIndows PE 安装 Windows

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

安装介质可以是网络共享(Samba)。有关在局域网中的另一台机器上设置 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 是从运行 DHCP、TFTP 和 Samba 服务器的机器上通过 PXE 启动的,服务器 IP通常也是网关 IP),挂载网络共享,并运行图形化安装程序:

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

问题解决

出现系统错误 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中明指定任意一个用户名和对应密码:

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

发生这种情况是因为 Windows 10 通过检查一些用户名和密码来连接到匿名共享,以查看它是否能够登录,如果可以,则允许匿名连接。 Apparently whatever part hides this from the user did not make it into the PE build.

参阅