Предоставление модулям доступа к локальному хранилищу устройства

Область применения:IoT Edge 1.4 checkmark IoT Edge 1.4

Важно!

IoT Edge 1.4 является поддерживаемым выпуском. Если вы используете более ранний выпуск, см. статью Обновление IoT Edge.

Модули IoT Edge могут использовать хранилище на самом устройстве IoT Edge узла для повышения надежности, особенно при работе в автономном режиме.

Настройка системных модулей для использования постоянного хранилища

По умолчанию системные модули IoT Edge, агент IoT Edge и Центр IoT Edge хранят состояние в эфемерной файловой системе своего экземпляра контейнера. Это состояние теряется при перезапуске экземпляра контейнера, например при обновлении версии образа модуля или createOptions.

В рабочих сценариях используйте постоянное расположение хранилища в файловой системе узла для хранения состояния системного модуля. Это повышает надежность решения и гарантирует доставку сообщений в облако.

Чтобы настроить системные модули для использования постоянного хранилища:

  1. Для центра IoT Edge и агента IoT Edge добавьте переменную среды с именем служба хранилища Folder, указывающую на каталог в модуле.

  2. Как для Центра IoT Edge, так и для IoT Edge агента добавьте привязки, чтобы подключить локальный каталог на компьютере виртуальной машины к каталогу в модуле. Например:

    Screenshot that shows how to add create options and environment variables for local storage.

    <ModuleStoragePath> Замените <HostStoragePath> и путь к хранилищу узлов и модулей. Оба значения должны быть абсолютным путем и <HostStoragePath> должны существовать.

Локальное хранилище можно настроить непосредственно в манифесте развертывания. Например, если вы хотите сопоставить следующие пути хранения:

Модуль Путь к хранилищу узла Путь к хранилищу модулей
edgeAgent /srv/edgeAgent /tmp/edgeAgent
edgeHub /srv/edgeHub /tmp/edgeHub

Манифест развертывания будет похож на следующий:

"systemModules": {
    "edgeAgent": {
        "env": {
            "StorageFolder": {
                "value": "/tmp/edgeAgent"
            }
        },
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeAgent:/tmp/edgeAgent\"]}}"
        },
        "type": "docker"
    },
    "edgeHub": {
        "env": {
            "StorageFolder": {
                "value": "/tmp/edgeHub"
            }
        },
        "restartPolicy": "always",
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeHub:/tmp/edgeHub\"],\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
        },
        "status": "running",
        "type": "docker"
    }
}

Примечание.

Если вы используете установку оснастки, убедитесь, что вы выберете путь к хранилищу узлов, доступный для оснастки. Например, $HOME/snap/azure-iot-edge/current/modules/.

Автоматическое управление разрешениями системы узла

В версии 1.4 и более поздних версиях не требуется вручную устанавливать права владения или разрешения для хранения StorageFolderхранилища узлов. Разрешения и владение автоматически управляются системными модулями во время запуска.

Примечание.

Автоматическое управление разрешениями привязанного хранилища узлов применяется только к системным модулям, агенту IoT Edge и концентратору Edge. Для пользовательских модулей требуется ручное управление разрешениями и владение привязанным хранилищем узлов, если контейнер пользовательского модуля не работает как root пользователь.

Если для пользовательского модуля требуется доступ к постоянному хранилищу в файловой системе узла, используйте параметры создания модуля для привязки папки хранилища в контейнере модуля к папке на хост-компьютере. Например:

{
  "HostConfig": {
    "Mounts": [
      {
        "Target": "<ModuleStoragePath>",
        "Source": "<HostStoragePath>",
        "Type": "bind",
        "ReadOnly": false
      }
    ]
  }
}

Замените <HostStoragePath> и <ModuleStoragePath> путями к хранилищу узла и хранилищу модуля; эти значения должны быть абсолютным путем. Дополнительные сведения см. в спецификации подключения подсистемы Docker.

Разрешения системы узла

Убедитесь, что профиль пользователя, который использует модуль, имеет необходимые разрешения на чтение, запись и выполнение в каталоге системы узла. По умолчанию контейнеры выполняются от имени root пользователя, у него уже есть необходимые разрешения. Но Dockerfile модуля может указывать использование пользователя, не являющегося корневым, в этом случае разрешения хранилища узлов должны быть настроены вручную.

Существует несколько способов управления разрешениями каталога в системах Linux, включая изменение chown владельца каталога, а затем chmod изменение разрешений. Например, чтобы разрешить доступ к хранилищу узлов к модулю, работающему как не корневой идентификатор пользователя 1000, используйте следующие команды:

sudo chown 1000 <HostStoragePath>
sudo chmod 700 <HostStoragePath>

Зашифрованные данные в хранилище модулей

Когда модули вызывают API рабочей нагрузки управляющей программы IoT Edge для шифрования данных, ключ шифрования извлекается с использованием идентификатора модуля и идентификатора создания модуля. Идентификатор поколения используется для защиты секретов, если модуль удален из развертывания, а затем другой модуль с таким же идентификатором модуля развернут на том же устройстве. Идентификатор создания модуля можно просмотреть с помощью команды Azure CLI az iot hub module-identity show.

Если требуется совместное использование файлов между модулями разных поколений, они не должны содержать секреты, в противном случае их расшифровка завершится ошибкой.

Следующие шаги

Дополнительные примеры доступа к виртуальному хранилищу из модуля см. в разделе Хранение данных в пограничном хранилище с помощью Хранилища BLOB-объектов Azure на IOT Edge.