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权限终于可以自动管理了。
这里系统模块主要指的是模块EdgeAgent和EdgeHub, 这两个模块一个负责整个系统上除它自己所有模块的安装配置,一个负责系统上所有模块和IoT Hub或者子设备和模块之间的通讯,EdgeHub就是一个缩小版的IoT Hub, 所有的SDK都可以直接把EdgeHub当成是IoT Hub就好了。
之前我们所有的文章中一再强调EdgeAgent和EdgeHub在生产环境中是非常重要的,因为它们都会有不少数据,在这两个镜像从设备上拉起来之后,如果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.0的runtime就不用了,只要把预定义的路径创建好,系统模块会自动赋予权限。
注意
需要注意的是只有系统模块才会自动管理权限,如果是用户自己开发的模块,那么用户还是要自己管理权限的,毕竟用户可以在DockerFile里配置要求的权限,这个到是可以理解的。
下面我们来演示一下。
这次演示就不演示如何在Linux上安装runtime了,这个你可以参考文档:https://www.azuredeveloper.cn/article/deploy-custom-module-to-linux-base-iot-edge
我们之前很多文章讲过,要理解IoT Edge Deployment和IoT 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:
- 点击创建一个新的 - deployment:
  
  
- 配置 - Runtime:
    
说明:
- 每个系统模块都需要配置一个变量 - storageFolder, 这个变量指向- Host机器上的目录用于对应的- EdgeAgent和- EdgeHu。
- 要更正一下 - EdgeAgent和- EdgeHub和- runtime对应的版本。
- 在选项 - 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, 然后就可以了。