共用方式為


提供 Azure IoT Edge 模組存取裝置本機存放區的權限

適用於: IoT Edge 1.5 核取記號 IoT Edge 1.5 IoT Edge 1.4 核取記號 IoT Edge 1.4

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 為支援的版本。 IoT Edge 1.4 LTS 於 2024 年 11 月 12 日結束生命週期。 如果您是舊版,請參閱更新 IoT Edge

為提升可靠性 (特別是在離線操作時),IoT Edge 模組可以在主機 IoT Edge 裝置上使用儲存體。

設定系統模組以使用永續性儲存體

根據預設,IoT Edge 系統模組 (IoT Edge 代理程式和 IoT Edge 中樞) 會將狀態儲存在其容器執行個體的暫時檔案系統中。 當容器執行個體回收時,此狀態會遺失,例如,當模組映像版本或 createOptions 更新時。

針對生產案例,請使用主機檔案系統上的永續性儲存位置來儲存系統模組狀態。 這麼做可改善解決方案健全性和雲端訊息的傳遞保證。

若要設定系統模組以使用永續性儲存體:

  1. 針對 IoT Edge 中樞和 IoT Edge 代理程式,新增名為 StorageFolder 的環境變數,其指向模組中的目錄。

  2. 針對 IoT Edge 中樞和 IoT Edge 代理程式,新增繫結以便將主機電腦上的本機目錄連線到模組中的目錄。 例如:

    顯示如何為本機存放區新增建立選項和環境變數的螢幕擷取畫面。

    以您的主機和模組儲存體路徑取代 <HostStoragePath><ModuleStoragePath>。 這兩個值都必須是絕對路徑,而且 <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.5",
            "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.5",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeHub:/tmp/edgeHub\"],\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
        },
        "status": "running",
        "type": "docker"
    }
}

注意

如果您使用 snap 安裝,請確定您選擇可供 snap 存取的主機儲存體路徑。 例如: $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>

模組儲存體中的加密資料

當模組叫用 IoT Edge 精靈的工作負載 API 來加密資料時,加密金鑰會使用模組識別碼和模組世代識別碼來衍生。 如果模組已從部署中移除,而具有相同模組識別碼的另一個模組稍後會部署到相同的裝置,則會使用世代識別碼來保護祕密。 您可以使用 Azure CLI 命令 az iot hub module-identity show 來檢視模組的世代識別碼。

如果您想要跨世代在模組之間共用檔案,則這些模組不得包含任何祕密,否則將無法解密。

下一步

如需從模組存取主機儲存體的其他範例,請參閱在 IoT Edge 上使用 Azure Blob 儲存體來將資料儲存在邊緣