向模块授予对设备本地存储的访问权限
适用于: IoT Edge 1.1
IoT Edge 1.2
除了使用 Azure 存储服务或在设备的容器存储中存储数据外,还可以将存储专用于主机 IoT Edge 设备本身,以提高可靠性,特别是在脱机操作时。
将模块存储链接到设备存储
若要启用从模块存储到主机系统上的存储的链接,请为模块创建指向容器中存储文件夹的环境变量。 然后,使用创建选项将存储文件夹绑定到主机上的文件夹。
例如,如果要启用 IoT Edge 中心以将消息存储在设备的本地存储中并在以后检索它们,可以在 Azure 门户的“运行时设置”部分中配置环境变量和创建选项 。
为 IoT Edge 中心和 IoT Edge 代理添加名为 storageFolder 的环境变量,使之指向模块中的目录。
为 IoT Edge 中心和 IoT Edge 代理添加绑定,以便将主机上的本地目录连接到模块中的目录。 例如:
也可直接在部署清单中配置本地存储。 例如:
"systemModules": {
"edgeAgent": {
"settings": {
"image": "mcr.microsoft.com/azureiotedge-agent:1.1",
"createOptions": {
"HostConfig": {
"Binds":["<HostStoragePath>:<ModuleStoragePath>"]
}
}
},
"type": "docker",
"env": {
"storageFolder": {
"value": "<ModuleStoragePath>"
}
}
},
"edgeHub": {
"settings": {
"image": "mcr.microsoft.com/azureiotedge-hub:1.1",
"createOptions": {
"HostConfig": {
"Binds":["<HostStoragePath>:<ModuleStoragePath>"],
"PortBindings":{"5671/tcp":[{"HostPort":"5671"}],"8883/tcp":[{"HostPort":"8883"}],"443/tcp":[{"HostPort":"443"}]}}}
},
"type": "docker",
"env": {
"storageFolder": {
"value": "<ModuleStoragePath>"
}
},
"status": "running",
"restartPolicy": "always"
}
}
将 <HostStoragePath>
和 <ModuleStoragePath>
替换为你的主机和模块存储路径;两个值都必须是绝对路径。
例如,在 Linux 系统上,"Binds":["/etc/iotedge/storage/:/iotedge/storage/"]
表示主机系统上的目录 /etc/iotedge/storage 映射到容器中的目录 /iotedge/storage/ 。 再举一个例子,在 Windows 系统上,"Binds":["C:\\temp:C:\\contemp"]
表示主机系统上的目录 C:\temp 映射到容器中的目录 C:\contemp。
可以从 docker 文档中找到有关如何创建选项的更多详细信息。
主机系统权限
在 Linux 设备上,确保模块的用户配置文件具有主机系统目录的所需读取、写入和执行权限。 回到启用 IoT Edge 中心以将消息存储到设备的本地存储的先前示例,你需要向其用户配置文件(UID 为 1000)授予权限。 在 Linux 系统上,可以通过多种方式管理目录权限,包括使用 chown
来更改目录所有者,然后使用 chmod
来更改权限,例如:
sudo chown 1000 <HostStoragePath>
sudo chmod 700 <HostStoragePath>
在 Windows 设备上,还需要配置主机系统目录的相关权限。 可以使用 PowerShell 设置权限:
$acl = get-acl <HostStoragePath>
$ace = new-object system.security.AccessControl.FileSystemAccessRule('Authenticated Users','FullControl','Allow')
$acl.AddAccessRule($ace)
$acl | Set-Acl
模块存储中的加密数据
当模块调用 IoT Edge 守护程序的工作负载 API 来加密数据时,系统会使用模块 ID 和模块的生成 ID 来派生加密密钥。 如果从部署中删除了某个模块,然后将另一具有相同模块 ID 的模块部署到同一设备,则会使用生成 ID 来保护机密。 可以使用 Azure CLI 命令 az iot hub module-identity show 查看模块的生成 ID。
如果要跨代在模块之间共享文件,则这些文件不能包含任何机密,否则无法解密。
后续步骤
有关从模块访问主机存储的其他示例,请参阅使用 IoT Edge 上的 Azure Blob 存储在边缘存储数据。