【问题标题】:Having trouble accessing /dev/serial0 on a Raspi from within a Module in Azure IoT Edge从 Azure IoT Edge 的模块中访问 Raspi 上的 /dev/serial0 时遇到问题
【发布时间】:2019-09-25 14:13:19
【问题描述】:

我正在尝试设置一个模块,该模块将在运行 Raspian Stretch 的 Raspberry Pi B+ 上与 /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"
      }
    ]
  }
}

值得注意的项目似乎是:

  • 我在"HostConfig" 中不需要"Privileged": true
  • 我似乎不需要添加“用户”
  • 我需要"GroupAdd": ["dialout"] in "HostConfig"

因此,虽然我可以随心所欲地与串行设备进行交互,但我无法与 /dev/serial0 交互似乎很奇怪,这似乎是我读过的“推荐方式”完成。

【问题讨论】:

    标签: docker raspberry-pi node-red azure-iot-edge


    【解决方案1】:

    感谢Raymond Mouthaan 对非常有帮助的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"
          }
        ]
      }
    }
    

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

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

    第一个可行的解决方案是使用"User": "root:root",但对我来说,将Devices 中调用的设备限制为似乎很好,root:dialout 似乎就是这样做的。

    但我想知道我是否应该以root 身份运行时考虑安全性。

    然后我尝试使用node-red:dialout,它似乎工作得很好,所以我更新了上面的容器创建选项,这是我认为最好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多