Gewähren des Zugriff auf den lokalen Speicher eines Geräts für Module

Gilt für:IoT Edge 1.4 checkmark IoT Edge 1.4

Wichtig

IoT Edge Version 1.4 wird unterstützt. Wenn Sie ein früheres Release verwenden, finden Sie weitere Informationen unter Aktualisieren von IoT Edge.

IoT Edge-Module können Speicher auf dem IoT Edge-Hostgerät selbst verwenden, um insbesondere beim Offlinebetrieb mehr Zuverlässigkeit zu erzielen.

Konfigurieren von Systemmodulen zur Verwendung von beständigem Speicher

Standardmäßig speichern IoT Edge-Systemmodule – IoT Edge-Agent und IoT Edge-Hub – ihren Zustand im kurzlebigen Dateisystem ihrer Containerinstanz. Dieser Zustand geht verloren, wenn die Containerinstanz neu gestartet wird, z. B. beim Aktualisieren von Modulimageversion oder createOptions.

Verwenden Sie in Produktionsszenarien einen persistenten Speicherort im Hostdateisystem, um den Systemmodulzustand zu speichern. Dadurch wird die Zuverlässigkeit der Lösung und die garantierte Cloudnachrichtenübermittlung verbessert.

So konfigurieren Sie Systemmodule zur Verwendung von persistentem Speicher:

  1. Fügen Sie sowohl für den IoT Edge-Hub als auch für den IoT Edge-Agent eine Umgebungsvariable namens StorageFolder hinzu, die auf ein Verzeichnis im Modul verweist.

  2. Fügen Sie sowohl für den IoT Edge-Hub als auch für den IoT Edge-Agent Bindungen hinzu, um ein lokales Verzeichnis auf dem Hostcomputer mit einem Verzeichnis im Modul zu verbinden. Zum Beispiel:

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

    Ersetzen Sie <HostStoragePath> und <ModuleStoragePath> durch Ihren Host- und Modulspeicherpfad. Beide Werte müssen absolute Pfade sein, und <HostStoragePath> muss vorhanden sein.

Sie können den lokalen Speicher auch direkt im Bereitstellungsmanifest konfigurieren. Angenommen, Sie möchten die folgenden Speicherpfade zuordnen:

Modul Hostspeicherpfad Modulspeicherpfad
edgeAgent /srv/edgeAgent /tmp/edgeAgent
edgeHub /srv/edgeHub /tmp/edgeHub

Dann würde Ihr Bereitstellungsmanifest Folgendem ähneln:

"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"
    }
}

Hinweis

Wenn Sie eine Snap-Installation verwenden, stellen Sie sicher, dass Sie einen Hostspeicherpfad auswählen, auf den die Snaps zugreifen können. Beispiel: $HOME/snap/azure-iot-edge/current/modules/.

Automatische Verwaltung von Hostsystemberechtigungen

In Version 1.4 und höher müssen der Besitz oder die Berechtigungen für den Hostspeicher für den StorageFolder nicht manuell festgelegt werden. Berechtigungen und Besitz werden beim Start automatisch durch die Systemmodule verwaltet.

Hinweis

Die automatische Berechtigungsverwaltung des hostgebundenen Speichers ist nur für die Systemmodule relevant: IoT Edge-Agent und IoT Edge-Hub. Bei benutzerdefinierten Modulen müssen Berechtigungen und Besitz für den gebundenen Hostspeicher manuell verwaltet werden, wenn der benutzerdefinierte Modulcontainer nicht als root-Benutzer ausgeführt wird.

Wenn Ihr benutzerdefiniertes Modul Zugriff auf persistenten Speicher im Hostdateisystem erfordert, verwenden Sie die Erstellungsoptionen des Moduls, um einen Speicherordner im Modulcontainer an einen Ordner auf dem Hostcomputer zu binden. Zum Beispiel:

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

Ersetzen Sie <HostStoragePath> und <ModuleStoragePath> durch den Speicherpfad für Ihren Host und Ihr Modul; beide Werte müssen ein absoluter Pfad sein. Informationen zu den Optionen finden Sie in der Docker Engine-Spezifikation für „Mount“.

Hostsystemberechtigungen

Stellen Sie sicher, dass das Benutzerprofil, das von Ihrem Modul verwendet wird, über die erforderlichen Lese-, Schreib- und Ausführungsberechtigungen für das Hostsystemverzeichnis verfügt. Standardmäßig werden Container als root-Benutzer ausgeführt, der bereits über die erforderlichen Berechtigungen verfügt. Das Dockerfile Ihres Moduls kann jedoch die Verwendung eines Nicht-Stammbenutzers angeben – in diesem Fall müssen die Hostspeicherberechtigungen manuell konfiguriert werden.

Es gibt mehrere Möglichkeiten, Verzeichnisberechtigungen auf Linux-Systemen zu verwalten, einschließlich der Verwendung von chown zum Ändern des Verzeichnisinhabers und dann chmod zum Ändern der Berechtigungen. Verwenden Sie z. B. die folgenden Befehle, um den Hostspeicherzugriff auf ein Modul zuzulassen, das als Nicht-Stammbenutzer mit der ID 1000 ausgeführt wird:

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

Verschlüsselte Daten im Modulspeicher

Wenn Module die Workload-API des IoT Edge-Dämons aufrufen, um Daten zu verschlüsseln, wird der Verschlüsselungsschlüssel unter Verwendung der Modul-ID und der Generations-ID des Moduls abgeleitet. Eine Generations-ID wird verwendet, um Geheimnisse zu schützen, wenn ein Modul aus der Bereitstellung entfernt wird und dann später ein anderes Modul mit derselben Modul-ID auf demselben Gerät bereitgestellt wird. Sie können die Generations-ID eines Moduls mit dem Azure CLI-Befehl az iot hub module-identity show anzeigen.

Wenn Sie Dateien zwischen Modulen über Generationen hinweg austauschen möchten, dürfen sie keine Geheimnisse enthalten, da sie sonst nicht entschlüsselt werden können.

Nächste Schritte

Ein weiteres Beispiel für den Zugriff auf den Hostspeicher von einem Modul aus finden Sie unter Speichern von Daten im Edgebereich mit Azure Blob Storage in IoT Edge.