为 Azure IoT Edge 模块提供对设备本地存储的访问权限

适用于:IoT Edge 1.5 复选标记IoT Edge 1.5 IoT Edge 1.4 复选标记 IoT Edge 1.4

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果你使用的是较低的版本,请参阅更新 IoT Edge

为了提高可靠性,尤其是在脱机操作时,IoT Edge 模块可以在主机 IoT Edge 设备本身上使用存储。

配置系统模块以使用持久性存储

默认情况下,IoT Edge 系统模块、IoT Edge 代理和 IoT Edge 中心将状态存储在其容器实例的临时文件系统中。 回收该容器实例时(例如更新模块映像版本或 createOptions 时),会丢失此状态。

对于生产方案,使用主机文件系统上的持久性存储位置来存储系统模块状态。 这样做可以提高解决方案的稳健性,并增强对云消息传递的保障。

若要设置系统模块以使用持久性存储,请执行以下操作:

  1. 为 IoT Edge 中心和 IoT Edge 代理添加名为 StorageFolder 的环境变量,使之指向模块中的目录。

  2. 为 IoT Edge 中心和 IoT Edge 代理添加绑定,以便将主机上的本地目录连接到模块中的目录。 例如:

    屏幕截图显示了如何为本地存储添加创建选项和环境变量。

    <HostStoragePath><ModuleStoragePath> 替换为你的主机和模块存储路径。 这两个值必须是绝对路径,并且 <HostStoragePath> 必须存在。

可以直接在部署清单中配置本地存储。 例如,如果要映射以下存储路径:

模块 主机存储路径 模块存储路径
edgeAgent /srv/edgeAgent /tmp/edgeAgent
edgeHub /srv/edgeHub /tmp/edgeHub

你的部署清单将类似于以下内容:

"systemModules": {
    "edgeAgent": {
        "env": {
            "StorageFolder": {
                "value": "/tmp/edgeAgent"
            }
        },
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeAgent:/tmp/edgeAgent\"]}}"
        },
        "type": "docker"
    },
    "edgeHub": {
        "env": {
            "StorageFolder": {
                "value": "/tmp/edgeHub"
            }
        },
        "restartPolicy": "always",
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeHub:/tmp/edgeHub\"],\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
        },
        "status": "running",
        "type": "docker"
    }
}

注意

如果使用快照安装,请确保选择可供快照访问的主机存储路径。 例如 $HOME/snap/azure-iot-edge/current/modules/

自动主机系统权限管理

在 1.4 版和更高版本上,无需为支持 StorageFolder 的主机存储手动设置所有权或权限。 权限和所有权在启动期间由系统模块自动管理。

注意

主机绑定存储的自动权限管理仅适用于系统模块、IoT Edge 代理和 Edge 中心。 对于自定义模块,如果自定义模块容器未以 root 用户身份运行,则需要手动管理主机绑定存储的权限和所有权。

如果自定义模块需要访问主机文件系统上的持久性存储,请使用模块的创建选项将模块容器中的存储文件夹绑定到主机上的文件夹。 例如:

{
  "HostConfig": {
    "Mounts": [
      {
        "Target": "<ModuleStoragePath>",
        "Source": "<HostStoragePath>",
        "Type": "bind",
        "ReadOnly": false
      }
    ]
  }
}

<HostStoragePath><ModuleStoragePath> 替换为你的主机和模块存储路径;两个值都必须是绝对路径。 有关选项的详细信息,请参阅 Docker Engine Mount 规范

主机系统权限

确保模块的用户配置文件具有主机系统目录的所需读取、写入和执行权限。 默认情况下,容器以已拥有所需权限的 root 用户身份运行。 但你的模块的 Dockerfile 可能会指定使用非 root 用户,在这种情况下必须手动配置主机存储权限。

在 Linux 系统上,可以通过多种方式管理目录权限,包括使用 chown 来更改目录所有者,然后使用 chmod 来更改权限。 例如,要允许主机存储访问以非 root 用户 ID 1000 身份运行的模块,请使用以下命令:

sudo chown 1000 <HostStoragePath>
sudo chmod 700 <HostStoragePath>

模块存储中的加密数据

当模块调用 IoT Edge 守护程序的工作负载 API 来加密数据时,系统会使用模块 ID 和模块的生成 ID 来派生加密密钥。 如果从部署中删除了某个模块,然后将另一具有相同模块 ID 的模块部署到同一设备,则会使用生成 ID 来保护机密。 可以使用 Azure CLI 命令 az iot hub module-identity show 查看模块的生成 ID。

如果要跨代在模块之间共享文件,则这些文件不能包含任何机密,否则无法解密。

后续步骤

有关从模块访问主机存储的其他示例,请参阅使用 IoT Edge 上的 Azure Blob 存储在边缘存储数据