在 Azure IoT Edge 中的模块中访问 Raspi 上的 /dev/serial0 时遇到问题



>我正在尝试设置一个模块,该模块将与运行Raspian Stretch的Raspberry Pi B +上的/dev/serial0进行交互。我在/boot/config.txt中使用了dtoverlay=pi3-miniuart-bt将UART0/ttyAMA0恢复到GPIO14和15(这是我基于Raspi的硬件需要我做的(。

我尝试使用以下容器创建选项使模块可以访问该设备:

{
"HostConfig": {
"PortBindings": {
"1880/tcp": [
{
"HostPort": "1880"
}
]
},
"Privileged": true,
"Devices": [
{
"PathOnHost": "/dev/serial0",
"PathInContainer": "/dev/serial0",
"CgroupPermissions": "rwm"
},
{
"PathOnHost": "/dev/ttyAMA0",
"PathInContainer": "/dev/ttyAMA0",
"CgroupPermissions": "rwm"
},
{
"PathOnHost": "/dev/ttyS0",
"PathInContainer": "/dev/ttyS0",
"CgroupPermissions": "rwm"
}
]
}
}

当我 ssh 时,我可以看到/dev/serial0,但我无法从正在运行的模块中看到它:

pi@azure-iot-test:~ $ ls -l /dev/ser*
lrwxrwxrwx 1 root root 7 Sep 24 21:17 /dev/serial0 -> ttyAMA0
lrwxrwxrwx 1 root root 5 Sep 24 21:17 /dev/serial1 -> ttyS0
pi@azure-iot-test:~ $ sudo docker exec hub-nodered ls -l /dev/ser*
ls: /dev/serial0: No such file or directory
ls: /dev/serial1: No such file or directory

有什么想法吗?

随访:

其他事情 我尝试了从这里收集的以下想法:

  • "User": "node-red"添加到容器创建选项的根
  • 目录
  • "User": "root"添加到容器创建选项的根
  • 目录
  • "GroupAdd": "dialout"添加到容器中的"HostConfig": {...}创建选项

跟进 #2

虽然我仍然无法与/dev/serial0交互,但我能够使用以下容器创建选项与/dev/ttyAMA0交互:

{
"HostConfig": {
"GroupAdd": [
"dialout"
],
"PortBindings": {
"1880/tcp": [
{
"HostPort": "80"
}
]
},
"Devices": [
{
"PathOnHost": "/dev/serial0",
"PathInContainer": "/dev/serial0",
"CgroupPermissions": "rwm"
},
{
"PathOnHost": "/dev/ttyAMA0",
"PathInContainer": "/dev/ttyAMA0",
"CgroupPermissions": "rwm"
}
]
}
}

值得注意的项目似乎是:

  • 我不需要"Privileged": true"HostConfig"
  • 我似乎不需要添加"用户">
  • 我需要"GroupAdd": ["dialout"]"HostConfig"

因此,虽然我可以随心所欲地与串行设备进行交互令人满意,但我无法与/dev/serial0交互似乎很奇怪,这似乎是我所做的阅读中的"推荐方式"。

感谢 Raymond Mouthaan 在非常有用的 Node-RED Slack 频道上的帮助和见解,我找到了这个容器创建选项的方式,为我提供了访问/dev/serial0

{
"User": "node-red:dialout",
"HostConfig": {
"PortBindings": {
"1880/tcp": [
{
"HostPort": "80"
}
]
},
"Devices": [
{
"PathOnHost": "/dev/serial0",
"PathInContainer": "/dev/serial0",
"CgroupPermissions": "rwm"
}
]
}
}

这与我在上面的"跟进#2"中找到的部分解决方案不同,因为我现在确实可以根据需要访问/dev/serial0

更新:我最初使用"User": "root:dialout"而不是您目前在上面看到的"User": "node-red:dialout"发布了这个答案。

第一个有效的解决方案是"User": "root:root",但对我来说,只限制在Devices中调用的设备似乎很好,root:dialout似乎这样做了。

但我想知道我是否应该在安全方面关注root运行。

然后我尝试使用node-red:dialout它似乎运行良好,所以我更新了上面的容器创建选项,使其成为我认为的最佳答案。

最新更新