Windows PE

出自 Arch Linux 中文维基

這篇文章或章節的翻譯不反映原文。

原因:翻譯已經過期,請閱讀英文頁面中的內容。(在 Prepare a bootable Windows PE ISO 中有較大修改。)(在 Talk: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 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 位)。在 x64 版 Windows PE 上運行 x86 程序並沒有那麼簡單。

不同版本的 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盤[編輯 | 編輯原始碼]

不幸的是,從 1.13.1-1 版的 wimlib 開始,mkwinpeimg 無法構建可引導的 UEFI 系統,但是我們依然可以構建包含必要的 UEFI 啟動文件的 Windows 10 安裝 ISO。

警告: 確保為 Windows ISO 映像(x86 或 x64)選擇了合適的體系結構。本指南僅在 x64 上進行過測試,即它使用 /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 和啟動盤,你的啟動盤已經準備就緒。

注意: 不需要 syslinux 或 grub magic。UEFI 固件會找到 FAT 分區並加載 Windows 提供的 /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 系統,可以使用 wimbootiPXE

安裝 syslinuxtftp-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 伺服器在路由器上,則可能無法在不安裝自定義固件的情況下執行此操作。

完成以上全部步驟後,你將能夠從網絡啟動 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 連接到匿名共享時,需要用一對用戶名和密碼檢查是否能夠登錄,如果可以,則允許匿名連接。顯然,只要有地方阻止用戶驗證是否可以登錄,就無法在 PE 系統中訪問 Samba 共享。

參閱[編輯 | 編輯原始碼]