Windows PE
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 共享。