Windows PE (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 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。

从网络启动

Merge-arrows-2.pngThis article or section is a candidate for merging with PXE.Merge-arrows-2.png

Notes: The PXE article already describes most of this stuff, no need for duplication. Also rc.d? Just make sure that configuration file is not lost if it is necessary for windows. Besides that everything is dupe. (Discuss in Talk: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.

参阅