Возникают проблемы с доступом к / dev / serial0 для Raspi из модуля в Azure IoT Edge - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь настроить модуль, который будет взаимодействовать с /dev/serial0 на Raspberry Pi B + с Raspian Stretch.Я использовал dtoverlay=pi3-miniuart-bt в /boot/config.txt, чтобы восстановить UART0 / ttyAMA0 для GPIO 14 и 15 (именно этого и требует мой HW на основе 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"
      }
    ]
  }
}

Я вижу /dev/serial0 при входе в ssh, но не вижу его в работающем модуле:

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": {...} в создании контейнераОпции

Followup # 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 in"HostConfig"
  • Мне, кажется, не нужен добавленный "пользователь"
  • Мне нужно "GroupAdd": ["dialout"] в "HostConfig"

Итак, пока это удовлетворительночто я могу взаимодействовать с последовательным устройством так, как я хотел, кажется странным, что я не могу взаимодействовать с /dev/serial0, что, похоже, является "рекомендуемым способом" из прочитанного мною чтения.

1 Ответ

0 голосов
/ 25 сентября 2019

Благодаря помощи и сведениям Рэймонда Мутана на очень полезном Узел-КРАСНО слабом канале , я нашел свой путь к этому Контейнеру Опции создания, предоставляя мне доступ к /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 по желанию.

UPDATE: Первоначально я опубликовал этот ответ, используя "User": "root:dialout", а не "User": "node-red:dialout", который вы сейчас видите выше.

Первое рабочее решение было с "User": "root:root", но мне показалось хорошим ограничиться толькоустройства, которые вызываются в Devices, что, похоже, root:dialout делает.

Но мне было интересно, должен ли я быть обеспокоен безопасностью работы с root вообще.

Затем я попытался использовать node-red:dialout, и, похоже, он работает отлично, поэтому я обновил приведенные выше параметры создания контейнера, и теперь я считаю, что это лучший ответ.

...