使用对称密钥在 Linux 上大规模创建和预配 IoT Edge 设备

适用于:“是”图标 IoT Edge 1.1

重要

IoT Edge 1.1 终止支持日期为 2022 年 12 月 13 日。 有关此产品、服务、技术或 API 支持方式的信息,请查看 Microsoft产品生命周期 。 有关更新到最新版本的 IoT Edge 的详细信息,请参阅 更新 IoT Edge

本文提供有关使用对称密钥自动预配一个或多个 Linux IoT Edge 设备的详尽说明。 可以使用 Azure IoT 中心设备预配服务 (DPS)自动预配 Azure IoT Edge 设备。 如果不熟悉自动预配过程,请在继续之前查看 预配概述

任务如下:

  1. 为单个设备创建单个注册,或为一组设备创建组注册。
  2. 安装 IoT Edge 运行时并连接到 IoT 中心。

对称密钥证明是一种通过设备预配服务实例对设备进行身份验证的简单方法。 这种验证方法为新手开发人员提供了一个“Hello world”体验,无论他们是首次接触设备预配,还是对安全性要求不高。 使用 TPMX.509 证书 的设备证明更安全,应用于更严格的安全要求。

先决条件

云资源

  • 一个活动的 IoT 中心
  • 在 Azure 中,一个与您的 IoT 中心链接的 IoT 中心设备预配服务实例

设备要求

作为 IoT Edge 设备的物理或虚拟 Linux 设备。

您需要定义一个唯一的注册 ID 来标识每个设备。 可以使用 MAC 地址、序列号或设备中的任何唯一信息。 例如,可以使用 MAC 地址和序列号的组合,构成以下注册 ID 字符串:sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6。 有效字符为小写字母数字和短划线 (-)。

创建 DPS 登记

创建注册以通过 DPS 预配一个或多个设备。

如果要预配单个 IoT Edge 设备,请创建一个独立注册。 如果需要预配多个设备,请按照创建 DPS 组注册的步骤进行操作。

在 DPS 中创建注册时,可以声明“初始设备孪生状态”。 在设备孪生中可以设置标记,以便按解决方案中所需的任何指标(例如区域、环境、位置或设备类型)将设备分组。 这些标记用于创建 自动部署

有关设备预配服务中的注册的详细信息,请参阅 如何管理设备注册

创建 DPS 个人注册

小提示

本文中的步骤适用于 Azure 门户,但你也可使用 Azure CLI 创建单个注册。 关于更多信息,请参阅 az iot dps enrollment。 作为 CLI 命令的一部分,使用 edge-enabled 标志指定注册适用于单个 IoT Edge设备。

  1. Azure 门户中,转到您的 IoT 中心设备预配服务实例。

  2. 在“设置”下,选择“管理注册”。

  3. 选择“添加个人注册”,然后完成以下步骤以配置注册:

    1. 对于机制,选择对称密钥。

    2. 为设备提供一个唯一的注册 ID。

    3. (可选)为设备提供一个 IoT 中心设备 ID。 可以使用设备 ID 将单个设备指定为模块部署的目标。 如果未提供设备 ID,则会使用注册 ID。

    4. 选择“True”,声明该注册适用于 IoT Edge 设备。

    5. (可选)向“初始设备孪生状态”添加一个标记值。 可以使用标记将设备组指定为模块部署的目标。 例如:

      {
         "tags": {
            "environment": "test"
         },
         "properties": {
            "desired": {}
         }
      }
      
    6. 选择“ 保存”。

  4. 复制个人注册的“主密钥”值,以便在安装 IoT Edge 运行时的情况下使用。

既然此设备已存在注册,IoT Edge 运行时在安装期间可以自动预配设备。

安装 IoT Edge

在本部分中,为 IoT Edge 准备 Linux VM 或物理设备。 然后安装 IoT Edge。

运行以下命令以添加包存储库,然后将 Microsoft 包签名密钥添加到你的受信任密钥列表中。

重要

2022 年 6 月 30 日,Raspberry Pi OS Stretch 将在第 1 层 OS 支持列表中停用。 为避免潜在的安全漏洞,请将主机 OS 更新为 Bullseye。

安装可通过几个命令来完成。 打开终端并运行以下命令:

  • 20.04:

    wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    
  • 18.04

    wget https://packages.microsoft.com/config/ubuntu/18.04/multiarch/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    

注释

Azure IoT Edge 软件包受制于每个包(usr/share/doc/{package-name}LICENSE 目录)中的许可条款。 请在使用包之前阅读许可条款。 安装和使用包即表示你接受这些条款。 如果你不同意许可条款,请不要使用该包。

安装容器引擎

Azure IoT Edge依赖于与 OCI 兼容的容器运行时。 对于生产方案,建议使用 Moby 引擎。 Moby 引擎是 IoT Edge 正式支持的唯一容器引擎。 Docker CE/EE 容器映像与 Moby 运行时兼容。

安装 Moby 引擎。

sudo apt-get update; \
  sudo apt-get install moby-engine

成功安装 Moby 引擎后,将其配置为使用 local 日志记录驱动程序作为日志记录 机制。 若要了解有关日志记录配置的详细信息,请参阅 生产部署清单

  • /etc/docker/daemon.json创建或打开 Docker 守护程序的配置文件。

  • 将默认日志记录驱动程序设置为 local 日志记录驱动程序,如以下示例所示。

       {
          "log-driver": "local"
       }
    
  • 重启容器引擎以使更改生效。

    sudo systemctl restart docker
    

    小提示

    如果在安装 Moby 容器引擎时出现错误,请验证 Linux 内核的 Moby 兼容性。 有些嵌入式设备制造商提供的设备映像带有自定义 Linux 内核,但缺少支持容器引擎兼容性所需的功能。 运行以下命令,该命令使用 Moby 提供的 check-config 脚本 来检查内核配置:

    curl -ssl https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh -o check-config.sh
    chmod +x check-config.sh
    ./check-config.sh
    

    在该脚本的输出中,检查 Generally NecessaryNetwork Drivers 下的所有项是否都已启用。 如果缺少某些功能,请启用它们,方法是通过源重新构建内核,然后选择关联的模块,将其包括在相应的内核 .config 中。同样,如果使用内核配置生成器(例如 defconfigmenuconfig),请找到并启用相应的功能,然后以相应方式重新构建内核。 部署新修改的内核后,再次运行 check-config 脚本,验证是否已成功启用所有必要的功能。

安装 IoT Edge 运行时

IoT Edge 安全守护程序在 IoT Edge 设备上提供和维护安全标准。 守护程序在每次启动时启动,并通过启动 IoT Edge 运行时的其余部分来初始化设备。

本部分中的步骤表示在具有 Internet 连接的设备上安装最新版本的典型过程。 如果需要安装特定版本(如预发行版本)或在脱机时需要安装,请按照本文后面的 脱机或特定版本安装 步骤作。

安装 IoT Edge 版本 1.1.* 以及 libiothsm-std 包:

sudo apt-get update; \
  sudo apt-get install iotedge

注释

IoT Edge 版本 1.1 是 IoT Edge 的长期支持分支。 如果运行的是较旧版本,建议安装或更新到最新修补程序,因为不再支持旧版本。

为设备预配其云标识

在将运行时安装到您的设备上之后,请使用该设备用于连接设备配置服务和 IoT 中心的信息来配置设备。

准备好以下信息:

  • DPS 的 ID 范围值
  • 你为设备创建的“注册 ID”
  • 单个注册中的 主密钥 ,或者使用组注册的设备 派生密钥
  1. 在 IoT Edge 设备上打开配置文件。

    sudo nano /etc/iotedge/config.yaml
    
  2. 找到该文件的预配配置部分。 取消注释用于 DPS 对称密钥预配的行,并确保注释掉所有其他的预配行。

    provisioning: 行不应有前面的空格,嵌套项应缩进两个空格。

    # DPS TPM provisioning configuration
    provisioning:
      source: "dps"
      global_endpoint: "https://global.azure-devices-provisioning.net"
      scope_id: "PASTE_YOUR_SCOPE_ID_HERE"
      attestation:
        method: "symmetric_key"
        registration_id: "PASTE_YOUR_REGISTRATION_ID_HERE"
        symmetric_key: "PASTE_YOUR_PRIMARY_KEY_OR_DERIVED_KEY_HERE"
    
    # always_reprovision_on_startup: true
    # dynamic_reprovisioning: true
    
  3. scope_idregistration_idsymmetric_key 的值更新为你的 DPS 和设备信息。

  4. (可选)使用 always_reprovision_on_startupdynamic_reprovisioning 行配置设备的重新预配行为。 如果设备设置为在启动时重新配置,它将始终首先尝试使用 DPS 进行配置,然后在失败时回退到备用配置。 如果设备设置为动态重新预配自身,则检测到重新预配事件时,IoT Edge(和所有模块)将重启并重新预配,就像设备从一个 IoT 中心移动到另一个 IoT 中心一样。 具体来说,IoT Edge 会检查 SDK 中的 bad_credentialdevice_disabled 错误,以识别重新预配事件。 若要手动触发此事件,请在 IoT 中心禁用设备。 有关详细信息,请参阅 IoT 中心设备重新预配概念

  5. 重启 IoT Edge 运行环境,以便应用在设备上所做的所有配置更改。

    sudo systemctl restart iotedge
    

验证是否成功安装

如果运行时成功启动,则可以进入 IoT 中心,开始将 IoT Edge 模块部署到你的设备。

您可以验证您在设备预配服务中创建的单个注册是否已被使用。 在 Azure 门户中导航到你的设备预配服务实例。 打开您创建的个人注册详细信息。 请注意,注册状态为“已分配”,并且设备 ID 已列出。

在设备上使用以下命令验证是否已成功安装并启动 IoT Edge。

检查 IoT Edge 服务的状态。

systemctl status iotedge

检查服务日志。

journalctl -u iotedge --no-pager --no-full

列出正在运行的模块。

iotedge list

后续步骤

使用设备预配服务注册过程可以在预配新设备的同时,设置设备 ID 和设备孪生标记。 可以在自动设备管理中,使用这些值将单个设备或设备组指定为目标。 了解如何使用 Azure 门户或使用 Azure CLI 大规模部署和监视 IoT Edge 模块