从 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 收集的以下想法的其他事情:

跟进#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"
      }
    ]
  }
}

值得注意的项目似乎是:

因此,虽然我可以按照自己的意愿与串行设备进行交互,这让我很满意,但我无法与 /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 以成为我认为的最佳答案。