Skip to main content

Azure IoT Edge Runtime升级到了1.4,终于可以自动管理系统模块的Local Storage权限了

分类:  Azure物联网 标签:  #Azure #IoT Edge # 发布于: 2023-06-15 9:27:39

今天无意中发现Azure IoT Edge Runtime升级到了1.4了,升级速度是蛮快的,其中有一个特性引起了我的兴趣:系统模块在Host上的Storage权限终于可以自动管理了。

这里系统模块主要指的是模块EdgeAgentEdgeHub, 这两个模块一个负责整个系统上除它自己所有模块的安装配置,一个负责系统上所有模块和IoT Hub或者子设备和模块之间的通讯,EdgeHub就是一个缩小版的IoT Hub, 所有的SDK都可以直接把EdgeHub当成是IoT Hub就好了。

之前我们所有的文章中一再强调EdgeAgentEdgeHub在生产环境中是非常重要的,因为它们都会有不少数据,在这两个镜像从设备上拉起来之后,如果docker的运行的instance一直不发生变化还不会出什么问题,但是一旦instance停止或者删除,那么原有的数据基本都会丢光,这主要包括针对模块的配置,以及EdgeHub上可能存有的离线数据(注:EdgeHub会在连接不上IoT Hub的时候将数据临时存在storage里,上线后重发), 这种情况很容易发生,例如你有一个新的部署,这个部署里调整了OnCreate的值等,都可能会引发这个问题。

因此只要是在产线,我们都会建议用户绑定host上的storage到容器里。原理很简单,就是docker的mount,你可以参考一下:https://docs.docker.com/storage/bind-mounts/。 之前我们在IoT Edge设备上绑定Host的目录到系统模块(docker镜像实例), 很烦的一点是,在Host机器上创建了目录,然后不知道要给这个目录什么权限,才能让docker镜像启动之后绑定这个目录到容器实例,并有权限读写该目录。之前的做法就是直接先给目录777, 然后等两个模块起来之后,会创建很多文件,查看这些文件的权限和属性,再赋予上层目录的同样的权限和属性,保证可以运行。新建的设备上用固定的脚本创建目录,并赋予同样的权限,这样就会很烦,但是1.4.0runtime就不用了,只要把预定义的路径创建好,系统模块会自动赋予权限。

注意
需要注意的是只有系统模块才会自动管理权限,如果是用户自己开发的模块,那么用户还是要自己管理权限的,毕竟用户可以在DockerFile里配置要求的权限,这个到是可以理解的。

下面我们来演示一下。

这次演示就不演示如何在Linux上安装runtime了,这个你可以参考文档:https://www.azuredeveloper.cn/article/deploy-custom-module-to-linux-base-iot-edge

或者参考官方文档:
https://learn.microsoft.com/en-us/azure/iot-edge/how-to-provision-single-device-linux-symmetric?view=iotedge-1.4&tabs=azure-portal%2Cubuntu

我们之前很多文章讲过,要理解IoT Edge DeploymentIoT Edge设备之间的管理,关于这个部分您可以参考:https://www.azuredeveloper.cn/article/how-to-deploy-a-iot-edge-device

总之一句话:先要有IoT Edge Deployment后有物理设备。

因此我们创建一个IoT Hub和一个IoT Edge Identity,但是先不要连接物理设备,连接物理设备之前,我们需要更改一下设备的twin, 给它增加一个tags, 方便我们在deployment中定位它, 例如:

  "deviceId": "test-storage-device",
    "etag": "AAAAAAAAAAI=",
    "deviceEtag": "OTU4NTA1MTg=",
    "status": "enabled",
    "statusUpdateTime": "0001-01-01T00:00:00Z",
    "connectionState": "Connected",
    "lastActivityTime": "0001-01-01T00:00:00Z",
    "cloudToDeviceMessageCount": 0,
    "authenticationType": "sas",
    "x509Thumbprint": {
        "primaryThumbprint": null,
        "secondaryThumbprint": null
    },
    "modelId": "",
    "version": 3,
    "tags": {
        "vendor": "DaJiang"
    },
    "properties": {
        ......
    },
    "capabilities": {
        "iotEdge": true
    },
    
    "deviceScope": "ms-azure-iot-edge://test-storage-device-638010006734252561"
}

请注意上述的tags的定义。

然后我们创建一个新的IoT Edge Deployment:

  1. 点击创建一个新的deployment:



  2. 配置Runtime:




说明:

  • 每个系统模块都需要配置一个变量storageFolder, 这个变量指向Host机器上的目录用于对应的EdgeAgentEdgeHu

  • 要更正一下EdgeAgentEdgeHubruntime对应的版本。

  • 在选项Container Create Options里需要如下格式的Binds配置:

       "HostConfig": {
        "Binds": [
            "/var/myiotedge/edgeagent:/tmp/edgeAgent"
        ]
    }
    

    Binds是一个数组,注意观察[]

这样配置完成之后,记得在部署时设定选择设备的条件,本例是:tags.vendor='DaJiang' 。

完成部署创建之后,就可以上连上物理设备了,基本不用其他的配置,只需要自动安装好runtime就可以了,定制安装方法很多,找操作系统对应的文档就可以了。

注意
如果发现启动失败,尝试创建文件目录,例如本例的: mkdir -p /var/myiotedge/edgeagent 和 mkdir -p /var/myiotedge/edgehub, 然后就可以了。