

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 自定义应用程序块
<a name="custom-app-blocks"></a>

弹性实例集流实例使用安装在虚拟硬盘（VHD）文件上的应用程序，这些文件存储在您账户的 Amazon S3 存储桶中。采用自定义打包的应用程序块可让您灵活地创建自己的 VHD 文件，并将其上传到您账户中的 Amazon S3 存储桶。

**Topics**
+ [创建 VHD](create-vhd.md)
+ [在 Amazon WorkSpaces 应用程序中为 VHD 创建安装脚本](create-setup-script.md)
+ [创建自定义应用程序块](create-app-block.md)
+ [更新应用程序块、VHD 和设置脚本](update-app-block.md)

# 创建 VHD
<a name="create-vhd"></a>

VHD 是一个单独的文件，挂载到操作系统后会被当作硬盘处理。VHD 可挂载为驱动器号和/或挂载到文件夹路径。挂载 VHD 后，您可以像对待任何其他硬盘一样对待它，包括安装应用程序或向其中复制用户需要的文件。

要创建应用程序块，您需要创建 VHD，在其中安装应用程序，然后将其分离。分离后，您可以在另一台 PC、EC2 实例或 WorkSpaces 应用程序映像生成器上测试您的 VHD，以验证应用程序是否按预期运行。完成后，将其上传到您账户中的 Amazon S3 存储桶并创建应用程序块。

**注意**  
本页介绍如何使用 VHD 交付应用程序；但是， WorkSpaces 应用程序流式传输实例将从 Amazon S3 下载任何对象。您存储在 Amazon S3 中的对象也可以是 zip 文件、应用程序安装程序或应用程序可执行文件本身。您可以在用户启动其应用程序之前，使用设置脚本在流实例上进行正确配置。  
在安装脚本 WorkSpaces 运行之前，Applications 流媒体实例最多会等待 120 秒让 VHD 完成下载。如果 VHD 未在这段时间内完成下载，则下载将停止，设置脚本也不会运行。  
我们建议 VHD 的最大大小为 1.5GB。您或许可以通过压缩来减小 VHD 的大小。挂载文件之前，您必须使用设置脚本对其进行解压缩，因为在挂载和启动应用程序之前，需要从 Amazon S3 完全下载该文件。应用程序启动和直播会话开始所需的时间越 VHDs大。

**为 Microsoft Windows 创建 VHD**

1. 从 Windows PC 或 Windows Amazon Elastic Compute Cloud（Amazon EC2）实例中，以管理权限打开命令提示符。

1. 输入以下命令启动 Microsoft **diskpart** 实用工具：

   **diskpart**

1. 输入以下命令创建未格式化且未初始化的 VHD 文件，其中 *<maximum file size>* VHD 文件的大小（以 MB 为单位）：

   **create vdisk file=C:\$1path\$1to\$1new\$1file.vhdx maximum=*<maximum file size>* type=expandable **

1. 输入以下命令选择新创建的 VHD：

   **select vdisk file=C:\$1path\$1to\$1new\$1file.vhdx**

1. 输入以下命令连接新创建的 VHD：

   **attach vdisk**

1. 输入以下命令初始化新创建的 VHD：

   **convert mbr**

1. 输入以下命令创建跨整个 VHD 的主分区：

   **create partition primary**

1. 输入以下命令格式化新创建的分区：

   **format fs=ntfs quick**

1. 您可以将新创建的 VHD 挂载到未使用的驱动器号和/或根卷上的文件夹路径。

   要挂载驱动器号，请输入：**assign letter=*<unused drive letter>***

   要挂载文件夹，请输入：**assign mount=*C:\$1path\$1to\$1empty\$1folder\$1to\$1mount\$1***
**注意**  
要挂载到文件夹路径，该文件夹必须已经存在且必须为空。

1. 现在，您可以使用在步骤 9 中选择的驱动器号或文件夹挂载路径将应用程序安装到 VHD。

将应用程序安装到 VHD 后，您需要先将其分离，然后才能安全地将其上传到 Amazon S3 存储桶。

**分离适用于 Microsoft Windows 的 VHD**

1. 输入以下命令启动 Microsoft diskpart 实用工具：

   **diskpart**

1. 输入以下命令选择 VHD：

   **select vdisk file=*C:\$1path\$1to\$1new\$1file.vhdx***

1. 输入以下命令分离 VHD：

   **detach vdisk**

1. VHD 现已分离，可以在另一台 Windows PC、Amazon EC2 实例或 WorkSpaces 应用程序映像生成器上进行测试。

**创建适用于 Linux 的 VHD**

1. 打开终端：
   + 对于 Amazon Linux 2：使用 EC2 实例、 WorkSpaces 应用程序映像生成器或 WorkSpaces 由亚马逊 Linux 提供支持 2
   + 对于 Ubuntu Pro 24.04 LTS：使用 EC2 实例或 WorkSpaces 由 Ubuntu Pro 提供支持

1. 创建未格式化且未初始化的 VHD 文件：

   **dd if=/dev/zero of=*<name of file>* bs=*<size of VHD>* count=1**

1. 输入以下命令将文件系统添加到创建的 VHD 中：

   **sudo mkfs -t ext4 *<name of file>***
**注意**  
您可能会看到一条消息，指出该文件不是块特殊设备。无论如何，您都可以选择继续。

1. 输入以下命令创建一个空文件夹以用作挂载点：

   **sudo mkdir */path/to/mount/point***

1. 运行以下命令将新创建的 VHD 挂载到文件系统路径：

   **sudo mount -t auto -o loop *<name of file>* */path/to/mount/point***

1. 现在，您可以使用在步骤 4 中选择的文件夹挂载路径将应用程序安装到 VHD。
**注意**  
在 VHD 上创建的文件和文件夹的默认权限会阻止非管理员用户启动应用程序或读取文件。验证权限并在必要时进行更改。

将应用程序安装到 VHD 后，您需要先将其分离，然后才能安全地将其上传到 Amazon S3 存储桶。

**分离适用于 Linux 的 VHD**

1. 打开一个终端会话，然后输入以下命令：

   **sudo umount */path/to/mount/point***

1. VHD 现已拆卸，可以在另一个亚马逊 Linux 2/Ubuntu Pro 24.04 LTS Amazon EC2 实例、亚马逊 Linux WorkSpaces 2 应用程序映像生成器或亚马逊 Linux 2/Ubuntu Personal 上进行测试。 WorkSpaces 

# 在 Amazon WorkSpaces 应用程序中为 VHD 创建安装脚本
<a name="create-setup-script"></a>

WorkSpaces 应用程序使用您提供的安装脚本在应用程序启动之前装载 VHD。您还可以使用设置脚本来完成使应用程序正常运行所需的其他任务。例如，您可以通过安装脚本配置注册表项 DLLs、注册、管理先决条件或修改用户配置文件。 WorkSpaces 应用程序提供了可用于装载 VHD 的脚本示例。您将需要修改这些脚本以满足 VHD 和应用程序的需求。

**注意**  
使用应用程序打包的应用程序块不需要安装脚本。 WorkSpaces 但是，您可以提供可选的设置后脚本来自定义应用程序安装。

使用以下链接下载示例脚本：
+ [Ubuntu Pro 24.04 LTS 和亚马逊 Linux 2 bash 脚本](samples/Linux-mount-vhd-script2.zip)
+ [Microsoft Windows Powershell 脚本](samples/Windows-mount-vhd-script3.zip)
**注意**  
WorkSpaces 应用程序和 Microsoft Windows 操作系统会保留驱动器号 A 到 E。不要在这些驱动器号上安装 VHDs 或网络共享。

WorkSpaces 应用程序将安装脚本和 VHD 下载到队列流媒体实例上的目录中，然后运行安装脚本。设置脚本在具有完全管理员权限的操作系统上运行。安装脚本在微软 Windows 的`SYSTEM`上下文中运行，在亚马逊 Linux 2 或 Ubuntu Pro 24.04 LTS 上以`root`用户身份运行。

VHD 的文件系统位置和设置脚本：
+ Ubuntu Pro 24.04 LTS：

  `/opt/appstream/AppBlocks/appblock-name/`  
**`appblock-name` **  
VHD 和设置脚本对应的应用程序块的名称。
+ Amazon Linux 2：

  `/opt/appstream/AppBlocks/appblock-name/`  
**`appblock-name` **  
VHD 和设置脚本对应的应用程序块的名称。
+ Microsoft Windows：

  `C:\AppStream\AppBlocks\appblock-name\`  
**`appblock-name` **  
VHD 和设置脚本对应的应用程序块的名称。

WorkSpaces 应用程序保持文件名与对象上的文件名相同。例如，如果您的应用程序块名为 `MyApps`，VHD 名为 `apps.vhd`，设置脚本名为 `mount-apps.ps1`，那么 Windows 流实例的完整路径为：
+ VHD

  `C:\AppStream\AppBlocks\MyApps\apps.vhd`
+ 设置脚本

  `C:\AppStream\AppBlocks\MyApps\mount-apps.ps1`

WorkSpaces 当您的设置脚本在队列流实例上运行时，应用程序会捕获标准错误和标准输出，并将输出上传到您账户中的 Amazon S3 存储桶。您可以使用这些日志来识别和解决设置脚本中可能遇到的问题。存储桶以特定格式命名，如下所述：

```
appstream-logs-region-code-account-id-without-hyphens-random-identifier
```

**`region-code` **  
这是在其中创建弹性队列的 AWS 区域代码。

**`account-id-without-hyphens` **  
您的 AWS 账户标识符。随机 ID 确保与该区域中的其他存储桶不发生冲突。存储桶名称的第一部分 appstream-logs 不随账户或区域而改变。

例如，如果您在美国西部（俄勒冈）区域 (us-west-2) 创建了一个弹性队列，账号为 123456789012 WorkSpaces ，则应用程序将在该地区的账户中创建一个名称显示的 Amazon S3 存储桶。只有具有足够权限的管理员才能删除此存储桶。

```
appstream-logs-us-west-2-1234567890123-abcdefg
```

存储在您账户的 S3 存储桶中的日志文件所在的文件夹路径使用以下结构：

```
bucket-name/fleet-name/instance-id/appblock-name/
```

**`bucket-name` **  
存储设置脚本日志的 Amazon S3 存储桶的名称。该名称格式如本节中前面所述。

**`Instance-id` **  
设置脚本运行所在的流实例的唯一标识符

**`appblock-name` **  
设置脚本对应的应用程序块的名称。

以下示例文件夹结构适用于从 `test-fleet` 启动的流式传输会话。该会话来自 AWS 账户 ID 为 123456789012，应用程序区块名称为美国西部（俄勒冈）区域（us-west-2）的 testappblock：

`appstream-logs-us-west-2-1234567890123-abcdefg/test-fleet/i-084427ab4a1cff7f5/testappblock/`

此示例文件夹结构包含一个用于标准输出的日志文件和一个用于标准错误的日志文件。

**Topics**
+ [在 Amazon 应用程序中执行 WorkSpaces 应用程序区块设置脚本](script-execution.md)

# 在 Amazon 应用程序中执行 WorkSpaces 应用程序区块设置脚本
<a name="script-execution"></a>

下图指示了设置脚本在这个过程中的运行位置。运行顺序取决于是否在与弹性实例集关联的堆栈上启用了应用程序设置持久性。

**注意**  
WorkSpaces 应用程序使用您的 VPC 详细信息从 Amazon S3 存储桶中下载 VHD 和设置脚本。您的 VPC 必须提供对 Amazon S3 存储桶的访问权限。有关更多信息，请参阅 [将 Amazon S3 VPC 终端节点用于 WorkSpaces 应用程序功能](managing-network-vpce-iam-policy.md)。

应用程序设置持久性已启用：

![\[应用程序设置持久性已启用。\]](http://docs.aws.amazon.com/zh_cn/appstream2/latest/developerguide/images/app-settings-enabled.png)


应用程序设置持久性已禁用：

![\[应用程序设置持久性已禁用。\]](http://docs.aws.amazon.com/zh_cn/appstream2/latest/developerguide/images/app-settings-disabled.png)


# 创建自定义应用程序块
<a name="create-app-block"></a>

创建 VHD 和设置脚本并将其上传到您的 S3 存储桶后，即可使用 WorkSpaces 应用程序控制台创建应用程序块资源。 AWS 账户要了解有关在 Amazon S3 存储桶中存储 VHD 和设置脚本的更多信息，请参阅[将应用程序图标、设置脚本、会话脚本和 VHD 存储在 S3 存储桶中](store-s3-bucket.md)。

**注意**  
您必须具有 IAM 权限才能对 Amazon S3 存储桶中的 VHD 和设置脚本对象执行 `S3:GetObject` 操作，以创建应用程序块资源。

**创建应用程序块资源**

1. 在 [https://console.aws.amazon.com/appst WorkSpaces ](https://console.aws.amazon.com/appstream2) ream2 上打开应用程序控制台。

1. 从左侧导航菜单中，选择**应用程序**、**应用程序块**和**创建应用程序块**。

1. 对于应用程序块打包，请选择**自定义**。

1. 对于**应用程序块详细信息**，请键入应用程序块的唯一名称标识符。或者，您也可以指定以下内容：
   + **显示名称** - 应用程序块的易记名称。
   + **描述** - 应用程序块的描述。

1. 对于**脚本设置**下的 **S3 中的虚拟硬盘对象**，要么输入代表 VHD 对象的 S3 URI，要么选择**浏览 S3** 导航到您的 S3 存储桶并找到 VHD 对象。

1. 对于**脚本设置**下的 **S3 中的设置脚本对象**，要么输入表示设置脚本对象的 S3 URI，要么选择**浏览 S3** 导航到您的 S3 存储桶并找到设置脚本对象。

1. 对于**脚本设置**下的**设置脚本可执行文件**，请输入设置脚本所需的可执行文件。
**注意**  
如果您的设置脚本可以直接执行，请输入设置脚本的文件名。如果您的安装脚本依赖于其他可执行文件（例如 Microsoft PowerShell）来执行，请输入该可执行文件的路径。  
 PowerShell 在微软 Windows 上通往微软的路径：  
`C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`

1. 或者，对于**脚本设置**下的**设置脚本可执行文件参数**，请输入需要提供给设置脚本可执行文件用于执行设置脚本的参数。
**注意**  
如果您使用的是 Microsoft PowerShell 脚本，则必须指定带有安装脚本名称的 “-File” 参数作为可执行参数。此外，请确保执行策略允许您的脚本运行。[要了解更多信息，请参阅[关于\$1execution\$1Polic](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2) ies和什么是？ PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/overview?view=powershell-7.2) 。

1. 对于**脚本设置**下的**执行持续时间(秒)**，请输入设置脚本的超时持续时间。
**注意**  
以秒为单位的执行持续时间是 WorkSpaces 应用程序在继续运行安装脚本之前等待多长时间。如果您的设置脚本未在这段时间内完成，则系统会向您的用户显示一条错误消息，并且应用程序将尝试启动。设置脚本将在执行持续时间结束后终止。

1. （可选）对于**标签**，为应用程序块资源创建标签

1. 检查您输入的信息，然后选择**创建**。

1. 如果您的应用程序块已成功创建，则控制台顶部会显示一条成功消息。如果发生错误，则会显示一条描述性错误消息，您将需要再次尝试创建应用程序块。

# 更新应用程序块、VHD 和设置脚本
<a name="update-app-block"></a>

应用程序块资源是不可变的，一旦创建，就不允许对其进行更改。如果需要对 VHD 或设置脚本进行向后兼容的更新，建议将新版本文件上传到 Amazon S3 存储桶，覆盖当前版本文件。新的弹性实例集流式传输会话将下载并使用这些对象的最新版本。

如果需要对 VHD 或设置脚本进行向后不兼容的更新，建议将它们作为新对象上传到 Amazon S3 存储桶，并创建新的应用程序块和应用程序资源。然后，您就可以在更改时段或其他中断期间管理向用户的部署。