给予Azure IoT Edge模块对设备本地存储的访问权限

适用范围:IoT Edge 1.5 checkmark IoT Edge 1.5

重要

IoT Edge 1.5 LTS 是受支持的版本。 IoT Edge 1.4 LTS 于 2024 年 11 月 12 日终止。 如果使用的是早期版本,请参阅 Update 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 引擎存储文档

主机系统权限

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

在 Linux 系统上,可以通过多种方式管理目录权限,包括使用 chown 来更改目录所有者,然后使用 chmod 来更改权限。 例如,若要允许正在以非根用户 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。

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