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
, 然后就可以了。