Windows PE 是 Windows 的轻量级版本,旨在用于安装 Windows Vista 或更高版本的 Windows,或是用于系统维护。它完全运行在内存中,并可以从网络启动。本页面描述了如何创建定制化的 Windows PE 镜像文件(也可选择发布在网络上的),我们只需用到 Arch Linux 设备上的自由软件包和微软 Windows 自动安装工具包(Microsoft's Windows Automated Installation Kit,简称 WAIK)。WAIK 可以免费下载,并且我们只需解压其中的 boot.wim
文件,该文件包含了 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
分发。
不同版本的 Windows 安装介质包含不同版本的 Windows PE。Windows 版本和 Windows PE 版本之间的关系,请参考 维基百科.
准备可启动的 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盘
不幸的是,从 1.13.1-1 版的 wimlib包 开始,mkwinpeimg
无法构建可引导的 UEFI 系统,但是我们依然可以构建包含必要的 UEFI 启动文件的 Windows 10 安装 ISO。
/efi/boot/bootx64.efi
。能否以这种方式启动 Windows 的 x86 映像尚不得而知。如果您可以测试,请更新此页面。在启动盘上, 创建一个 GPT 分区表,其中包含一个类型为“EFI System”的 FAT32 分区。这可以通过 cfdisk
或 fdisk 交互式地完成,比如使用 fdisk :
# fdisk /dev/sdX (fdisk) g # 建立新的 GPT 分区表 (fdisk) n # 使用默认设置创建新分区 (fdisk) t # 修改分区类型 (fdisk) 1 # 类型 1 表示 "EFI System Partition" (fdisk) w # 保存并退出
然后把此分区格式化为 FAT32:
# mkfs.vfat /dev/sdX1
挂载由 mkwinpeimg
创建的 winpe.iso
文件,挂载你的启动盘, 复制以下内容:
# 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 和启动盘,你的启动盘已经准备就绪。
/efi/boot/bootx64.efi
引导文件。引导启动 Windows PE
按照上一节所述创建可启动的 Windows PE ISO (winpe.iso
) 之后,你也许想通过如下几种方式引导启动 Windows PE 。
在虚拟机中
在虚拟机中运行 winpe.iso
作为 CD-ROM。确保分配了足够的内存,绝对要大于 ISO 文件的大小,因为 Windows PE 是从内存启动的。
使用启动盘
如果你已经如前文所述为 UEFI 系统准备好了启动盘,你只需从启动盘启动即可。启动过程可能需要耗费一些时间(10至20秒是正常的,具体取决于启动盘的读取速度),因为加载程序需要把数据复制到内存中。
使用光盘
只需把 winpe.iso
烧录到光盘上,就可以从该光盘启动 Windows PE。
从网络启动
在 BIOS 系统中,Windows PE 可以从网络启动,通过 PXELINUX 和它的 MEMDISK 模块。对于 UEFI 系统,可以使用 wimboot 和 iPXE。
复制需要的 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 (例如 Dhcpd 和 Dnsmasq),用 Linux 服务器的 IP 地址指向作为引导文件的 pxelinux.0
。注意:如果您的 DHCP 服务器在路由器上,则可能无法在不安装自定义固件的情况下执行此操作。
完成以上全部步骤后,你将能够从网络启动 Windows PE 。
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 连接到匿名共享时,需要用一对用户名和密码检查是否能够登录,如果可以,则允许匿名连接。显然,只要有地方阻止用户验证是否可以登录,就无法在 PE 系统中访问 Samba 共享。