从 Azure IoT Edge 的模块中访问 Raspi 上的 /dev/serial0 时遇到问题
Having trouble accessing /dev/serial0 on a Raspi from within a Module in Azure IoT Edge
我正在尝试设置一个模块,它将在 Raspberry Pi B+ 运行 Raspian Stretch 上与 /dev/serial0
交互。我在 /boot/config.txt
中使用 dtoverlay=pi3-miniuart-bt
将 UART0/ttyAMA0 恢复到 GPIO 14 和 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
有什么想法吗?
跟进:
我尝试了从 here 收集的以下想法的其他事情:
- 将
"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"
- 我似乎不需要 "User" 添加
- 我需要
"GroupAdd": ["dialout"]
"HostConfig"
因此,虽然我可以按照自己的意愿与串行设备进行交互,这让我很满意,但我无法与 /dev/serial0
进行交互似乎很奇怪,这似乎是来自 "the recommended way"我读完了。
感谢 Raymond Mouthaan over on the very helpful Node-RED Slack channel 的帮助和见解,我找到了使用此容器创建选项的方法,使我可以访问 /dev/serial0
:
{
"User": "node-red:dialout",
"HostConfig": {
"PortBindings": {
"1880/tcp": [
{
"HostPort": "80"
}
]
},
"Devices": [
{
"PathOnHost": "/dev/serial0",
"PathInContainer": "/dev/serial0",
"CgroupPermissions": "rwm"
}
]
}
}
这与我在上面 "Followup #2" 中找到的部分解决方案不同,因为我现在可以根据需要访问 /dev/serial0
。
更新: 我最初使用 "User": "root:dialout"
发布此答案,而不是您目前在上面看到的 "User": "node-red:dialout"
。
第一个可行的解决方案是 "User": "root:root"
,但我认为只限制在 Devices
中调用的设备似乎很好,而 root:dialout
似乎是这样。
但我想知道我是否应该像 root
一样关注 运行 的安全性。
然后我尝试使用 node-red:dialout
,它似乎工作得很好,所以我更新了上面的 Container Create Options 以成为我认为的最佳答案。
我正在尝试设置一个模块,它将在 Raspberry Pi B+ 运行 Raspian Stretch 上与 /dev/serial0
交互。我在 /boot/config.txt
中使用 dtoverlay=pi3-miniuart-bt
将 UART0/ttyAMA0 恢复到 GPIO 14 和 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
有什么想法吗?
跟进:
我尝试了从 here 收集的以下想法的其他事情:
- 将
"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"
- 我似乎不需要 "User" 添加
- 我需要
"GroupAdd": ["dialout"]
"HostConfig"
因此,虽然我可以按照自己的意愿与串行设备进行交互,这让我很满意,但我无法与 /dev/serial0
进行交互似乎很奇怪,这似乎是来自 "the recommended way"我读完了。
感谢 Raymond Mouthaan over on the very helpful Node-RED Slack channel 的帮助和见解,我找到了使用此容器创建选项的方法,使我可以访问 /dev/serial0
:
{
"User": "node-red:dialout",
"HostConfig": {
"PortBindings": {
"1880/tcp": [
{
"HostPort": "80"
}
]
},
"Devices": [
{
"PathOnHost": "/dev/serial0",
"PathInContainer": "/dev/serial0",
"CgroupPermissions": "rwm"
}
]
}
}
这与我在上面 "Followup #2" 中找到的部分解决方案不同,因为我现在可以根据需要访问 /dev/serial0
。
更新: 我最初使用 "User": "root:dialout"
发布此答案,而不是您目前在上面看到的 "User": "node-red:dialout"
。
第一个可行的解决方案是 "User": "root:root"
,但我认为只限制在 Devices
中调用的设备似乎很好,而 root:dialout
似乎是这样。
但我想知道我是否应该像 root
一样关注 运行 的安全性。
然后我尝试使用 node-red:dialout
,它似乎工作得很好,所以我更新了上面的 Container Create Options 以成为我认为的最佳答案。