你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Stack Edge 上的 Ubuntu VM 上部署 IoT Edge

适用于:Yes for Pro GPU SKUAzure Stack Edge Pro - GPUYes for Pro 2 SKUAzure Stack Edge Pro 2Yes for Pro R SKUAzure Stack Edge Pro RYes for Mini R SKUAzure Stack Edge Mini R

本文介绍如何在 Azure Stack Edge 设备上运行的 Ubuntu VM 上部署 IoT Edge 运行时。 对于新的开发工作,请使用本文中所述的自助部署方法,因为它使用的是最新的软件版本。

概要工作流

概要流程如下所示:

  1. 创建或标识 IoT 中心或 Azure IoT 中心设备预配服务 (DPS) 实例。
  2. 使用 Azure CLI 获取 Ubuntu 20.04 LTS VM 映像。
  3. 将 Ubuntu 映像上传到 Azure Stack Edge VM 映像库。
  4. 使用以下步骤将 Ubuntu 映像部署为 VM:
    1. 提供 VM 的名称、用户名和密码。 另创建一个磁盘(可选)。
    2. 设置网络配置。
    3. 在“高级”选项卡上提供准备好的 cloud-init 脚本

先决条件

在开始之前,请确保:

  • 具备已激活的 Azure Stack Edge 设备。 有关详细步骤,请参阅激活 Azure Stack Edge Pro GPU

  • 访问最新的 Ubuntu 20.04 VM 映像(Azure 市场的映像或要引入的自定义映像):

    $urn = Canonical:0001-com-ubuntu-server-focal:20_04-lts:20.04.202007160

    使用搜索 Azure 市场映像中的步骤获取 VM 映像。

准备 cloud-init 脚本

若要将 IoT Edge 运行时部署到 Ubuntu VM,请在 VM 部署期间使用 cloud-init 脚本

使用以下某个部分中的步骤:

使用对称密钥预配

若要在不使用 DPS 的情况下将设备连接到 IoT 中心,请使用本部分中的步骤为 VM 创建“高级”页面准备 cloud-init 脚本,以部署 IoT Edge 运行时和 Nvidia 的容器运行时

  1. 使用现有的 IoT 中心或创建新的中心。 使用这些步骤创建 IoT 中心

  2. 使用这些步骤在 IoT 中心注册 Azure Stack Edge 设备

  3. 从 IoT 中心为设备检索主连接字符串,然后将其粘贴到下面的 DeviceConnectionString 位置

用于对称密钥预配的 cloud-init 脚本


#cloud-config

runcmd:
  - dcs="<DeviceConnectionString>"
  - |
      set -x
      (

        # Wait for docker daemon to start

        while [ $(ps -ef | grep -v grep | grep docker | wc -l) -le 0 ]; do 
          sleep 3
        done
        
        if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then

          #install Nvidia drivers

          apt install -y ubuntu-drivers-common
         ubuntu-drivers devices
          ubuntu-drivers autoinstall

          # Install NVIDIA Container Runtime

          curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add -
          distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
          curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list
          apt update
          apt install -y nvidia-container-runtime
        fi
        
        # Restart Docker

        systemctl daemon-reload
        systemctl restart docker

        # Install IoT Edge

        apt install -y aziot-edge

        if [ ! -z $dcs ]; then
          iotedge config mp --connection-string $dcs
          iotedge config apply
        fi
      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then      
         reboot
      fi       ) &

apt:
  preserve_sources_list: true
  sources:
    msft.list:
      source: "deb https://packages.microsoft.com/ubuntu/20.04/prod focal main"
      key: |
        -----BEGIN PGP PUBLIC KEY BLOCK-----
        Version: GnuPG v1.4.7 (GNU/Linux)

        mQENBFYxWIwBCADAKoZhZlJxGNGWzqV+1OG1xiQeoowKhssGAKvd+buXCGISZJwT
        LXZqIcIiLP7pqdcZWtE9bSc7yBY2MalDp9Liu0KekywQ6VVX1T72NPf5Ev6x6DLV
        7aVWsCzUAF+eb7DC9fPuFLEdxmOEYoPjzrQ7cCnSV4JQxAqhU4T6OjbvRazGl3ag
        OeizPXmRljMtUUttHQZnRhtlzkmwIrUivbfFPD+fEoHJ1+uIdfOzZX8/oKHKLe2j
        H632kvsNzJFlROVvGLYAk2WRcLu+RjjggixhwiB+Mu/A8Tf4V6b+YppS44q8EvVr
        M+QvY7LNSOffSO6Slsy9oisGTdfE39nC7pVRABEBAAG0N01pY3Jvc29mdCAoUmVs
        ZWFzZSBzaWduaW5nKSA8Z3Bnc2VjdXJpdHlAbWljcm9zb2Z0LmNvbT6JATUEEwEC
        AB8FAlYxWIwCGwMGCwkIBwMCBBUCCAMDFgIBAh4BAheAAAoJEOs+lK2+EinPGpsH
        /32vKy29Hg51H9dfFJMx0/a/F+5vKeCeVqimvyTM04C+XENNuSbYZ3eRPHGHFLqe
        MNGxsfb7C7ZxEeW7J/vSzRgHxm7ZvESisUYRFq2sgkJ+HFERNrqfci45bdhmrUsy
        7SWw9ybxdFOkuQoyKD3tBmiGfONQMlBaOMWdAsic965rvJsd5zYaZZFI1UwTkFXV
        KJt3bp3Ngn1vEYXwijGTa+FXz6GLHueJwF0I7ug34DgUkAFvAs8Hacr2DRYxL5RJ
        XdNgj4Jd2/g6T9InmWT0hASljur+dJnzNiNCkbn9KbX7J/qK1IbR8y560yRmFsU+
        NdCFTW7wY0Fb1fWJ+/KTsC4=
        =J6gs
        -----END PGP PUBLIC KEY BLOCK----- 
packages:
  - moby-cli
  - moby-engine
write_files:
  - path: /etc/systemd/system/docker.service.d/override.conf
    permissions: "0644"
    content: |
      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime --log-driver local

使用 DPS

使用本部分中的步骤将设备连接到 DPS 和 IoT Central。 你将准备一个 script.sh 文件,用于在创建 VM 时部署 IoT Edge 运行时

  1. 使用现有的 IoT 中心和 DPS,或创建新的 IoT 中心。

  2. 转到 DPS 资源并创建单个注册。 

    1. 转到“设备预配服务”>“管理注册”>“添加单个注册”
    2. 确保为“证明类型和 IoT Edge 设备的对称密钥”选择 True。 默认选择为 False
    3. 从 DPS 资源页中检索以下信息:
      • 注册 ID。 建议对 IoT 中心使用与“设备 ID”相同的 ID
      • ID 范围(在“概述”菜单)。
      • “单个注册”菜单中的“主 SAS 密钥”
  3. 将 IoT 中心 (IDScope) 和 DPS(RegistrationID、对称密钥)中的值复制并粘贴到脚本参数中。

IoT 中心 DPS 的 cloud-init 脚本


#cloud-config

runcmd:
    - dps_idscope="<DPS IDScope>"
    - registration_device_id="<RegistrationID>"
    - key="<Symmetric Key>"
    - |
      set -x
      (
      
      wget https://github.com/Azure/iot-edge-config/releases/latest/download/azure-iot-edge-installer.sh -O azure-iot-edge-installer.sh \
      && chmod +x azure-iot-edge-installer.sh \
      && sudo -H ./azure-iot-edge-installer.sh -s $dps_idscope -r $registration_device_id -k $key \
      && rm -rf azure-iot-edge-installer.sh
      
      # Wait for docker daemon to start

      while [ $(ps -ef | grep -v grep | grep docker | wc -l) -le 0 ]; do 
        sleep 3
      done

      systemctl stop aziot-edge

      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then

        #install Nvidia drivers

        apt install -y ubuntu-drivers-common
        ubuntu-drivers devices
        ubuntu-drivers autoinstall

        # Install NVIDIA Container Runtime

        curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add -
        distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
        curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list
        apt update
        apt install -y nvidia-container-runtime
      fi

      # Restart Docker

      systemctl daemon-reload
      systemctl restart docker

      systemctl start aziot-edge    
      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then      
         reboot
      fi
      ) &
write_files:
  - path: /etc/systemd/system/docker.service.d/override.conf
    permissions: "0644"
    content: |
      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime --log-driver local

部署 IoT Edge 运行时

使用上述 cloud-init 脚本部署 IoT Edge 运行时是 VM 创建过程的一部分

以下是部署 VM 和 IoT Edge 运行时的大致步骤:

  1. 从 Azure 市场获取 Ubuntu VM 映像。 有关详细步骤,请按照使用 Azure 市场映像为 Azure Stack Edge 创建 VM 映像中的说明进行操作。

    1. Azure 门户中,转到 Azure 市场。
    2. 连接到 Azure Cloud Shell 或已安装 Azure CLI 的客户端。 有关详细步骤,请参阅 Azure Cloud Shell 中的 Bash 快速入门

    注意

    关闭 shell 会话将删除在 shell 会话期间创建的所有变量。 重新打开会话需要重新创建变量。

    c. 运行以下命令设置订阅。

    az account set –subscription <subscription id>
    
  2. 使用搜索 Azure 市场映像中的步骤在 Azure 市场中搜索 Ubuntu 20.04 LTS 映像。

    Ubuntu 20.04 LTS 映像的示例:

    $urn = Canonical:0001-com-ubuntu-server-focal:20_04-lts:20.04.202007160
    
  3. 从市场映像创建新的托管磁盘。 详细步骤请参见使用 Azure 市场映像为 Azure Stack Edge 创建 VM 映像

  4. 将 VHD 从托管磁盘导出到 Azure 存储帐户。 更多详细步骤请参见将 VHD 从托管磁盘导出到 Azure 存储

  5. 按照以下步骤使用 VM 映像创建 Ubuntu VM。

    1. 在“高级”选项卡上指定 cloud-init 脚本。若要创建 VM,请参阅通过 Azure 门户部署 GPU VM通过 Azure 门户部署 VM

      Screenshot of the Advanced tab of VM configuration in the Azure portal.

    2. 在 cloud-init 中指定适当的设备连接字符串以连接到 IoT 中心或 DPS 设备。 有关详细步骤,请参阅使用对称密钥进行预配,或使用 IoT 中心 DPS 进行预配

      Screenshot of the Custom data field of VM configuration in the Azure portal.

如果在创建 VM 期间未指定 cloud-init,则必须在创建 VM 后手动部署 IoT Edge 运行时

  1. 通过 SSH 连接到 VM。
  2. 在 VM 上安装容器引擎。 有关详细步骤,请参阅使用对称密钥在 Linux 上创建和预配 IoT Edge 设备快速入门 - 使用 Azure 门户设置 IoT 中心 DPS

验证 IoT Edge 运行时

使用这些步骤验证 IoT Edge 运行时是否正在运行。

  1. 在 Azure 门户中,转到 IoT 中心资源。

  2. 选择 IoT Edge 设备。

  3. 验证 IoT Edge 运行时是否正在运行。

    Screenshot of the IoT Edge runtime status in the Azure portal.

    若要对 IoT Edge 设备配置进行故障排除,请参阅对 IoT Edge 设备进行故障排除

更新 IoT Edge 运行时

若要更新 VM,请按照更新 IoT Edge 中的说明进行操作。 若要查找最新版本的 Azure IoT Edge,请参阅 Azure IoT Edge 版本

后续步骤

若要在 Ubuntu VM 上部署和运行 IoT Edge 模块,请参阅部署 IoT Edge 模块中的步骤。

若要部署 Nvidia 的 DeepStream 模块,请参阅在具有 GPU 的 Azure Stack Edge Pro 上的 Ubuntu VM 上部署 Nvidia DeepStream 模块

若要部署 NVIDIA DIGITS,请参阅在预制 NVIDIA 模块中启用 GPU