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

问题描述 投票:0回答:2

我正在尝试设置一个模块,它将与运行 Raspian Stretch 的 Raspberry Pi B+ 上的

/dev/serial0
进行交互。我已在
dtoverlay=pi3-miniuart-bt
中使用
/boot/config.txt
将 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"
  • 我似乎不需要添加“用户”
  • 我需要
    "GroupAdd": ["dialout"]
    "HostConfig"

因此,虽然我可以按照自己的意愿与串行设备交互,这很令人满意,但我无法与

/dev/serial0
交互似乎很奇怪,从我读过的内容来看,这似乎是“推荐的方式”。

docker raspberry-pi node-red azure-iot-edge
2个回答
1
投票

感谢 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
,它似乎工作得很好,所以我将上面的容器创建选项更新为我认为最好的答案。


0
投票

一个问题,您的容器是否与该用户一起运行?所以我想你的 dockerfile 中有类似的东西

USER node-red

USER $dockeruser

并传入构建参数或容器创建选项,对吧?

© www.soinside.com 2019 - 2024. All rights reserved.