创建工厂 OS 映像

本实验室介绍如何使用 Windows 系统工具包 (WSK) 来设计和创建工厂 OS 映像。

我们介绍:

  • 从装载的 WSK ISO 工作
  • 添加驱动程序
  • 添加应用
  • 添加测试内容文件夹
  • 自定义设备布局
  • 自定义设置
  • 生成映像

1. 需要具备的条件

要完成此实验室,需要以下工具:

  • 技术人员 PC
  • Windows 系统工具包
  • 如果要创建 FFU:
  • 如果要创建 VHDX 映像,则需要:
    • 一台安装了 Hyper-V 的电脑。 这可以与技术人员电脑是同一台电脑。
  • 包含测试附件的文件夹
  • (可选)要在映像中包括的应用
  • (可选)要在映像中包括的驱动程序

2. 装载 WSK ISO 并启动 WSK 环境

若要创建工厂 OS 映像,需要使用 WSK,其中包含创建映像所需的包和工具。 可以通过将 WSK ISO 的内容复制到技术人员电脑,或者通过从网络共享或在电脑上本地装载 ISO 来使用 WSK。 在本实验室中,我们将装载本地存储的 WSK ISO,并继续开始操作。

装载 WSK

  1. 在名为 C:\WSK 的技术人员电脑上创建一个目录,并将 WSK ISO 从实验室辅助 USB 驱动器复制到该目录中。
  2. 在文件资源管理器中,导航到 WSK ISO
  3. 右键单击 ISO,然后单击“装载”

打开 Windows 系统工具包环境

打开 Windows 系统工具包环境:

  1. 导航到分配给已装载的 WSK ISO 的驱动器根目录。
  2. 右键单击 SetImagGenEnv.cmd,选择“以管理员身份运行”。

将会看到以下内容:

**********************************************************************
** Windows System Kit image generation environment
** Version xxx.xxxxx.1001
**********************************************************************

3. 创建工厂 OS 工作区

工作区是一个工作目录,它有助于整理创建工厂 OS 映像所需的应用、驱动程序和其他资产。

PrepWSKWorkspace C:\FactoryWorkSpace -Product FactoryOS

注意

如果要创建虚拟机,请向上述命令添加 -vm 参数:

PrepWSKWorkspace C:\FactoryWorkSpace -Product FactoryOS -VM

有关所有可用的选项,请参阅 PrepWSKWorkspace 语法。

下面是将在 WSK 环境中看到的内容:

Overwrite == Prompt. PrepOEMWorkspace will prompt for permission to overwrite an existing workspace.
Prepping C:\FactoryWorkSpace as a WSK workspace for building a FactoryOS AMD64 UEFI Hardware image....
OEMInput file C:\FactoryWorkSpace\FactoryOS_Development_AMD64_UEFI_SpacesGPT_Hardware.xml created.

Success!

根据上述输出,现在在 C:\FactoryWorkspace 处有一个工作区,其中包含名为 FactoryOS_Development_AMD64_UEFI_SpacesGPT_Hardware.xmlOEMInput.xml 文件。 你将在整个实验室中修改此 OEMInput.xml 文件。 还可以从 WSK 环境运行 echo %OEMInputFileName%,查看 OEMInput.xml 文件的路径和文件名。

创建工作区时,WSK 配置了映射到工作区的 %WSKWorkspaceRoot% 环境变量。 如果关闭并重新打开 Windows 系统工具包环境,则必须通过将目录更改为工作区根目录并运行 SetWSKWorkspaceRoot 来重置 WSKWorkspaceRoot

4. 功能清单简介

功能清单定义要包括在映像中的应用、驱动程序和包的文件位置。 添加应用和驱动程序时,默认情况下会将它们添加到所有映像中,除非将它们标记为可选。

以下部分使用功能清单来定义要包括在映像中的应用、驱动程序和设置。

5. 添加驱动程序

如果要为物理设备创建 FFU 映像,Windows 系统工具包中包含的脚本可以使向工厂 OS 映像中添加兼容驱动程序变得更加容易。 这些脚本会根据添加到工作区的驱动程序自动创建或更新功能清单文件:

  • CreateWSKDriversFM 脚本创建驱动程序功能清单,并将 %WSKWorkspaceRoot%\DCHUDrivers 文件夹中的所有驱动程序添加到驱动程序功能清单中。

  • UpdateWSKDriversFM 脚本将 %WSKWorkspaceRoot%\DCHUDrivers 文件夹中的所有驱动程序添加到现有的驱动程序功能清单中。 由于工作区包含空的 DriversFM,我们将使用 UpdateWSKDriversFM 将驱动程序添加到现有驱动程序功能清单中。 如果决定稍后添加更多驱动程序,可以将其他驱动程序添加到 DCHUDrivers 文件夹中,然后重新运行此脚本。

  1. 将驱动程序复制到工作区:

    xcopy /s E:\Drivers\ %WSKWorkspaceRoot%\DCHUDrivers /chrkyf
    

    其中 E:\Drivers\ 是存放工厂 OS 兼容驱动程序的位置

  2. 将驱动程序添加到工作区中的驱动程序功能清单。 创建工作区时,系统会创建一个空驱动程序功能清单 %WSKWorkspaceRoot\FMFiles\OEMDriversFM.xml 并将其添加到 OEMInput.xml。 WSK 包含一个脚本,该脚本将 %WSKWorkspaceRoot%\DCHUDrivers 文件夹中的所有驱动程序添加到驱动程序功能清单中。 将驱动程序添加到 OEMDriversFM 功能清单后,这些驱动程序将包含在映像中。

    运行脚本以从工作区中的 DCHU 驱动程序文件夹添加驱动程序:

    UpdateWSKDriversFM
    

    输出:

    Script will backup then append new Drivers to C:\FactoryWorkspace\FMFiles\OEMDriversFM.xml if it exists.
    Existing Drivers FM found. Backing up existing file to C:\Users\username\AppData\Local\Temp\WSKScriptBackups\OEMDriversFM.xml...
    
    Searching C:\FactoryWorkspace\DCHUDrivers for Drivers to add to C:\FactoryWorkspace\FMFiles\OEMDriversFM.xml...
    Adding C:\FactoryWorkspace\DCHUDrivers\devices.driver.display.inf to FM...
    …
    Adding C:\FactoryWorkspace\DCHUDrivers\audio.driver.inf to FM...
    
    FM file successfully created at C:\FactoryWorkspace\FMFiles\OEMDriversFM.xml.
    All newly found Drivers under C:\FactoryWorkspace\DCHUDrivers are now unconditionally in any image that includes C:\FactoryWorkspace\FMFiles\OEMDriversFM.xml.
    Remember to make apps or drivers you do not want in every image "Optional" (apps) or in a FM Feature (drivers).
    
    The previous version of C:\FactoryWorkspace\FMFiles\OEMDriversFM.xml is backed up at C:\Users\username\AppData\Local\Temp\WSKScriptBackups\OEMDriversFM.xml.
    
  3. 在文本编辑器中打开 OEMInput.xml 文件,并验证 OEMDriversFM.xml 是否包含在 <AdditionalFMs> 元素中。 这可以确保映像中包含 OEMDriversFM.xml 中定义的驱动程序。 如果不记得 OEMInput.xml 文件的名称,可以运行 echo %WSKOEMInputFileName% 来查看 OEMInput.xml 的路径。

    <AdditionalFMs>
    <AdditionalFM>%WSKContentRoot%\FMFiles\%WSKImageArchitecture%\FactoryOS\WindowsCoreProductionFM.xml</AdditionalFM>
    <AdditionalFM>%WSKContentRoot%\FMFiles\%WSKImageArchitecture%\FactoryOS\FOSNonProductionFM.xml</AdditionalFM>
    <AdditionalFM>%WSKContentRoot%\FMFiles\%WSKImageArchitecture%\FactoryOS\WindowsCoreNonProductionFM.xml</AdditionalFM>
    <AdditionalFM>%WSKContentRoot%\FMFiles\%WSKImageArchitecture%\FactoryOS\GenericDeviceFM.xml</AdditionalFM>
    <!-- Add OEM FMs here. -->
    <AdditionalFM>%WSKWorkspaceRoot%\FMFiles\OEMAppsFM.xml</AdditionalFM>
    <AdditionalFM>%WSKWorkspaceRoot%\FMFiles\OEMDriversFM.xml</AdditionalFM>
    </AdditionalFMs>
    

6. 添加应用

Windows 系统工具包包含的脚本使向工厂 OS 映像添加兼容的应用变得更加容易。 这些脚本会根据添加到工作区的应用自动创建或更新功能清单文件:

  • CreateWSKAppsFM 脚本创建应用清单,并将 %WSKWorkspaceRoot%\Apps 文件夹中的所有应用添加到应用功能清单中。

  • UpdateWSKAppsFM 脚本将 %WSKWorkspaceRoot%\Apps 文件夹中的所有应用添加到现有的应用功能清单中。 由于工作区包含空的 AppsFM,我们将使用 UpdateWSKAppsFM 将新应用添加到 OEMInput.xml 中默认包含的现有应用功能清单中。

如果要将应用添加到映像:

  1. 将应用复制到工作区:

    Xcopy /s E:\UWP %WSKWorkspaceRoot%\Apps /chrkyf
    

    其中,E:\UWP 是从中复制 UWP 应用的位置

  2. Apps 文件夹中的应用添加到 OEMAppsFM.xml 功能清单。 将应用添加到 OEMAppsFM 功能清单后,这些应用将包含在映像中:

    UpdateWSKAppsFM
    

    下面是一些示例输出:

    Script will backup then append new Apps to C:\FactoryWorkSpace\FMFiles\OEMAppsFM.xml if it exists.
    Existing Apps FM found. Backing up existing file to C:\Users\administrator\AppData\Local\Temp\WSKScriptBackups\OEMAppsFM_3.xml...
    
    Searching C:\FactoryWorkSpace\Apps for Apps to add to C:\FactoryWorkSpace\FMFiles\OEMAppsFM.xml...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\arm\Microsoft.NET.Native.Framework.1.7.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\arm\Microsoft.NET.Native.Runtime.1.7.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\arm\Microsoft.VCLibs.Arm.14.00.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\x64\Microsoft.NET.Native.Framework.1.7.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\x64\Microsoft.NET.Native.Runtime.1.7.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\x64\Microsoft.VCLibs.x64.14.00.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\x86\Microsoft.NET.Native.Framework.1.7.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\x86\Microsoft.NET.Native.Runtime.1.7.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\Dependencies\x86\Microsoft.VCLibs.x86.14.00.appx to FM...
    Adding C:\FactoryWorkSpace\Apps\HelloWorld_1.0.0.0_x64.appx to FM...
    
    FM file successfully created at C:\FactoryWorkSpace\FMFiles\OEMAppsFM.xml.
    All newly found Apps under C:\FactoryWorkSpace\Apps are now unconditionally in any image that includes C:\FactoryWorkSpace\FMFiles\OEMAppsFM.xml.
    Remember to make apps or drivers you do not want in every image "Optional" (apps) or in a FM Feature (drivers).
    
    The previous version of C:\FactoryWorkSpace\FMFiles\OEMAppsFM.xml is backed up at C:\Users\administrator\AppData\Local\Temp\WSKScriptBackups\OEMAppsFM_3.xml.
    
  3. 打开 OEMInput.xml 文件,验证 OEMAppsFM.xml 是否包含在 <AdditionalFMs> 元素中。 这可以确保映像中包含 OEMAppsFM.xml 中定义的应用。

    应会看到:

    <AdditionalFMs>
    <AdditionalFM>%WSKContentRoot%\FMFiles\%WSKImageArchitecture%\FactoryOS\WindowsCoreProductionFM.xml</AdditionalFM>
    <AdditionalFM>%WSKContentRoot%\FMFiles\%WSKImageArchitecture%\FactoryOS\FOSNonProductionFM.xml</AdditionalFM>
    <AdditionalFM>%WSKContentRoot%\FMFiles\%WSKImageArchitecture%\FactoryOS\WindowsCoreNonProductionFM.xml</AdditionalFM>
    <AdditionalFM>%WSKContentRoot%\FMFiles\%WSKImageArchitecture%\FactoryOS\GenericDeviceFM.xml</AdditionalFM>
    <!-- Add OEM FMs here. -->
    <AdditionalFM>%WSKWorkspaceRoot%\FMFiles\OEMAppsFM.xml</AdditionalFM>
    <AdditionalFM>%WSKWorkspaceRoot%\FMFiles\OEMDriversFM.xml</AdditionalFM>
    </AdditionalFMs>
    

    注意

    如果在创建工作区时添加了 -VM 选项,则 OEMInput.xml 名为 FactoryOS_Development_AMD64_UEFI_SpacesGPT_VM.xml

7. 添加测试内容文件夹

利用 OEMInput.xml 文件中的 <TestContent> 元素,可以指定包含测试内容(例如,脚本、可执行文件,以及将用于在工厂 OS 设备上运行测试的其他资产)的文件夹。

在构建映像时添加测试内容文件夹可确保工厂 OS 设备上可以使用测试附件,并可以减少将文件从技术人员电脑手动复制到测试设备上所花费的时间。

  1. 在技术人员电脑上的工厂 OS 工作区中创建“测试内容”文件夹:

    md %WSKWorkspaceRoot%\TestContent
    
  2. 将测试附件复制到 TestContent 文件夹中。 映像中只能包含一个测试内容文件夹,但该文件夹可以包含子文件夹。 使所有测试附件都位于单个测试内容文件夹中:

    xcopy /s E:\TestContent %WSKWorkspaceRoot$\TestContent /chrkyf
    

    其中,E:\TestContent 是包含测试内容的文件夹

  3. 将测试内容文件夹添加到 OEMInput.xml 文件。 WSK 包含自动执行此过程的脚本:

    AddTestContent %WSKWorkspaceRoot%\TestContent
    

    如果文件夹成功添加到 OEMInput.xml,则会看到以下内容:

    Successfully saved the TestContent path in the OEMInput file.
    
  4. 打开 OEMInput.xml 文件,验证它是否包含一个 <TestContent> 元素,并且该元素显示测试内容文件夹的路径:

    注意

    可以通过从 WSK 环境运行 echo %WSKOEMInputFileName 来获取测试内容文件夹的完整路径和文件名。

    <TestContent> 元素应如下所示:

    <TestContent>C:\FactoryWorkspace\TestContent</TestContent>
    

8. DeviceLayout 和设备目标

注意

如果要创建 VM,可以跳过本部分并转到下一部分,我们将在其中介绍如何自定义设置。

自定义 DeviceLayout

设备布局是工厂 OS 设备的磁盘配置的蓝图。 它描述了 Microsoft、OEM 和 SV 内容如何协同工作,为工厂 OS 映像创建磁盘布局。 通过使用 XML 文件和 Windows 系统工具包来配置设备布局,从而生成特定于设备的设备布局包。

  1. 在文本编辑器中打开 %WSKWorkspaceRoot%\OEMCustomization\DeviceLayout\DeviceLayoutOEM.xml。 使用此文件可以配置所用磁盘的特征。

    • 为具有 <ID> {5a585bae-900b-41b5-b736-a4cecffc34b4}<Store> 添加 <DevicePath>。 这是将刷写 OS 的位置。 此 OS 磁盘将具有由 Microsoft 配置的分区。
      • 示例 HDD <DevicePath> - <DevicePath>PciRoot(0x0)/Pci(0x1D,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-00-00-00-00-00-00-00)</DevicePath>
      • 示例 UFS <DevicePath> - <DevicePath>PciRoot(0x0)/Pci(0x12,0x5)/UFS(0x0,0x0)</DevicePath>
    • 对于 HDD,更新设备路径中的任何 GUID 以使用通配符 (?),例如 <DevicePath>PciRoot(0x0)/Pci(0x1D,0x0)/Pci(0x0,0x0)/NVMe(0x1,??-??-??-??-??-??-??-??)</DevicePath>
    • 验证 <SectorSize> 是否与设备匹配。

    示例 DeviceLayoutOEM 如下所示:

    <OEMDeviceLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/embedded/2004/10/ImageUpdate/v2">
        <Stores>
            <Store>
                <Id>{5a585bae-900b-41b5-b736-a4cecffc34b4}</Id>
                <StoreType>Default</StoreType>
    			<DevicePath>PciRoot(0x0)/Pci(0x1D,0x0)/Pci(0x0,0x0)/NVMe(0x1,??-??-??-??-??-??-??-??)</DevicePath>
            </Store>
        </Stores>
        <SectorSize>512</SectorSize>
        <MergeVersionTag>1</MergeVersionTag>
    </OEMDeviceLayout>
    
  2. 保存并关闭 DeviceLayoutOEM.xml

  3. 更新 OEMInput,使其使用创建的布局文件:

    1. 在文本编辑器中打开工作区根目录中的 OEMinput.xml 文件。
    2. <DeviceLayoutType> 元素更新为 GPT_SPACES_SPLIT
    <DeviceLayoutType>GPT_SPACES_SPLIT</DeviceLayoutType>
    
    1. 保存 OEMInput.xml 文件。 可以使其保持打开状态,因为我们将在下一节中对它进行更多更改。

自定义设备目标

  1. 如果当前还未打开 OEMInput.xml 文件,请在文本编辑器中打开它。 可以在 %WSKWorkspaceRoot%\FactoryOS_Development_AMD64_UEFI_SpacesGPT_Hardware.xml 中找到它。

    注意

    可以从 WSK 环境运行 echo %WSKOEMInputFileName,以查看 OEMInput.xml 文件的路径和文件名。

  2. 配置 <DevicePlatformIDs> 元素,例如

    <DevicePlatformIDs>
    <DevicePlatformID>Contoso.ContosoLaptop.*.1</DevicePlatformID>
    <DevicePlatformID>*.*.*.*</DevicePlatformID>
    </DevicePlatformIDs>
    
  3. 保存并关闭 OEMInput.xml 文件。

9. 自定义设置

设计工厂 OS 映像时,可以使用设置自定义框架来确保正确配置设备的设置。

设置在 XML 文件中进行配置,XML 文件用于创建添加到 OEMInput 文件中的自定义包。 设置是特定于产品的,因此请务必使用适用于正在构建的设备产品的设置自定义文件。

  1. 创建空的设置自定义 XML:

    CreateWSKCustomizationsXML
    

    输出:

    Creating output folder: C:\FactoryWorkSpace\OEMCustomization\CustomizationXML
    Created output folder: C:\FactoryWorkSpace\OEMCustomization\CustomizationXML
    …
    wcosimageprep INFO ThreadId1340 Generating WCOS customization file(s)...
    wcosimageprep INFO ThreadId1340 Writing customization files to disk...
    wcosimageprep INFO ThreadId1340 CustomizationXML generation parameters: Advanced=False, Categorize=False
    wcosimageprep INFO ThreadId1340 C:\FactoryWorkSpace\OEMCustomization\CustomizationXML\CustomizationXML.xml
    wcosimageprep INFO ThreadId1340 Time elapsed 00:00:00.4587755
    CustomizationXML file(s) has been generated successfully at C:\FactoryWorkSpace\OEMCustomization\CustomizationXML.
    
  2. 在文本编辑器中打开设置自定义 XML。

    notepad C:\FactoryWorkSpace\OEMCustomization\CustomizationXML\CustomizationXML.xml
    
  3. 填写 <Identity> 属性,例如:

    <Identity OwnerName="OEMName" ReleaseType="Test" />
    
  4. 在实验室的本部分,我们将设置:

    • 设备布局的路径(如果要构建 FFU)
    • 显示在工厂 OS 屏幕上以及工厂 Orchestrator 中的版本号

    在 CustomizationXML 中,为要自定义的设置填写 <Value> 元素。 使用以下设置可以配置自定义设备布局的路径,以及收藏栏项:

    为要自定义的设置填写 <Value> 元素。 对于此实验室:

    自定义项名称
    OEMVersion <Value>1.1.1.1</Value>
    SplitLayoutFile <Value>C:\FactoryWorkspace\OEMCustomization\DeviceLayout\DeviceLayoutOEM.xml</Value>

    注意

    如果要创建 VM 映像,则无需配置 SplitLayoutFile

    例如:

    <Customization Name="SplitLayoutFile">
        <ReadOnlyMetadata Description="OEM/SV-owned split layout file. (File must be named DeviceLayoutOEM.xml)" Type="FILE" DefaultValue="" SupportedExtensions="xml" />
        <Value>C:\FactoryWorkspace\OEMCustomization\DeviceLayout\DeviceLayoutOEM.xml</Value>
    </Customization>
    

    请参阅工厂 OS 的可用设置,查看工厂 OS 产品的可用设置。

  5. 保存并关闭 CustomizationXML.xml

  6. 使用 Windows 系统工具包中的脚本生成 OEM 自定义包,并将其添加到 OEMInput.xml 文件中。

    CreateWSKCustomizationsFM
    

    输出:

    wcosimageprep INFO ThreadId21660 Validating arguments for external action.
    wcosimageprep INFO ThreadId21660 Assigning defaults for external action.
    wcosimageprep INFO ThreadId21660 Generating WCOS customization packages from C:\FactoryWorkspace\OEMCustomization\CustomizationXML
    …
    Customization Packages have been generated successfully at C:\FactoryWorkspace\OEMCustomization\Packages
    …
    OEMCustomizationsFM file has been generated successfully at C:\FactoryWorkspace\FMFiles\OEMCustomizationsFM.xml
    
    C:\FactoryWorkspace\FMFiles\OEMCustomizationsFM.xml has been added to the OEMInput file under the AdditionalFms element
    

10. 生成映像

运行 BuildWSKImage根据 OEMInput.xml 文件创建 FFU

BuildWSKImage %WSKWorkspaceRoot%\FactoryOS_Development_AMD64_UEFI_SpacesGPT_Hardware.xml

如果要创建 VM,请运行以下命令:

BuildWSKImage %WSKWorkspaceRoot%\FactoryOS_Development_AMD64_UEFI_SpacesGPT_VM.xml

重要

如果尝试在已包含同名 .FFU 映像或虚拟硬盘的目标文件夹中生成映像,映像创建操作将失败并出现以下错误:

imageapp : ERROR : ThreadId18164 OutputFile C:\FactoryOS.Output\FactoryOS_Development_AMD64_UEFI_SpacesGPT_Hardware.ffu already exists.

在生成映像之前,请确保输出文件夹尚未包含具有相同名称的生成映像。

11. 刷写映像

自定义的工厂 OS 映像已生成并可供使用。

12.(可选)将驱动程序添加到映像

在工程设备上,可以将驱动程序添加到现有的 FFU,而无需使用 Windows 系统工具包中包含的 ImageApp.exe 重建映像。

将驱动程序添加到 FFU:

ImageApp.exe C:\FactoryWorkspace.Output\FactoryOS_Development_AMD64_UEFI_SpacesGPT_Hardware.ffu /patch /drivers:E:\OfflineDriver\ /CPUType:amd64

其中,E:\OfflineDriver\ 是包含要添加到映像的示例驱动程序 (driver-test.inf) 的文件夹。

有关详细信息和其他用途,请参阅 ImageApp/修补程序使用情况