Windows PCとWindows上のIoT Edgeモジュール間でファイル共有を行う
※2024/02/16 追記
「手順」において、共有フォルダの割り当て方法を修正しました。
ゴール:Windows PCに配置したファイルをWindows上のIoT Edgeモジュールから閲覧および編集ができる
Raspberry Piに入れた自作IoT Edgeモジュールを用いて、Raspberry Piに配置したファイルをIoT Edgeモジュールから閲覧や編集ができるようにしました。
そのモジュールをWindows PCに入れて実行することになり、ファイル共有処理も使用する必要が出ました。
本記事はその共有の方法についてまとめています。
説明すること
- ゴールを達成するためのIoT Edgeモジュールのデプロイ設定
- Windowsの共有フォルダおよびその中に入れる設定ファイルの中身
説明しないこと
- Azure IoT Edgeモジュールの詳細な作り方
- Pythonによるファイルの読み書き処理の実装方法
概要
Raspberry PiとRaspberry Pi上のIoT Edgeモジュールでのやり取り
IoT Edge モジュールはコンテナーベースのため、Dockerのときと同じようにモジュールコンテナー内のストレージ フォルダーをホストコンピューター上のフォルダーにバインドする必要があります。
Azure IoT Edge for Linux on Windows (EFLOW)
Azure IoT Edge for Linux on Windows(EFLOW)は、Windows デバイスで Linux ワークロードを簡単に実行できるようにするソリューションです。これにより、Windows デバイスで Linux ベースの IoT Edge モジュールを実行できます。
EFLOW は Windows Subsystem for Linux (WSL) とは異なり、製品レベルのエンタープライズ ソリューションを提供します。Windows OS の上で完全に Linux カーネルを動作させることで、Linux と完全に互換性があり、企業が実運用で使用することを前提としたソリューションです。
これにより、組み込みシステムや産業用システムなど、様々な種類のデバイスで IoT ソリューションを展開することが可能になります。
Azure IoT Edge for Linux on Windows と Windows フォルダーを共有する
Azure IoT Edge for Linux on Windows (EFLOW) 仮想マシンは Windows ホスト OS から分離されており、仮想マシンはホスト ファイル システムにアクセスできません。既定では、EFLOW 仮想マシンには独自のファイル システムがあり、ホスト コンピューター上のフォルダーまたはファイルにアクセスできません。 "EFLOW ファイルとフォルダーの共有メカニズム" は、Windows ファイルとフォルダーを CBL-Mariner Linux EFLOW VM と共有する方法を提供します。
「Raspberry Piに入れたIoT EdgeモジュールでRaspberry Pi内のファイルを共有」と「Windowsに入れたIoT EdgeモジュールでWindows上のファイルを共有」の比較
開発環境
- Windows PC (Windows 11 Pro)
- Visual Studio Code
- Azure
- IoTHub
- Container Registry
- Python 3.11.6
事前準備
IoTHubにIoTEdgeデバイスを1つ作成します。認証方法は対称キーにします。
モジュール作成時にContainer Registryを設定した場合は、development.template.jsonに以下のようなパラメータ設定されています。
"acrtest": {
"username": "$CONTAINER_REGISTRY_USERNAME",
"password": "$CONTAINER_REGISTRY_PASSWORD",
"address": "acrtest.azurecr.io"
}
その場合は.envに以下のように環境変数を設定してあげます。
CONTAINER_REGISTRY_USERNAME="acrtest"
CONTAINER_REGISTRY_PASSWORD="acrtestのパスワード"
例えばTestIoTEdge
というディレクトリ下でモジュールを作成すると、以下のようなディレクトリ構成になるかと思います。
TestIoTEdge/
├── config
├── deployment.debug.template.json
├── deployment.template.json
├── .env
├── .gitignore
├── modules
├── TestModule
├── Dockerfile.amd64
├── Dockerfile.amd64.debug
├── Dockerfile.arm32v7
├── Dockerfile.arm32v7.debug
├── Dockerfile.arm64v8
├── Dockerfile.arm64v8.debug
├── main.py
├── module.json
├── requirements.txt
手順
- Windows PC内に共有用フォルダを
C:\\Shared\\EFLOW-Shared
に作成します。 - 1で作成したフォルダにsharedFolder.json、
Read-Access
フォルダ(読み取り専用フォルダ)、およびRead-Write-Access
フォルダ(読み書き可能フォルダ)を作成します。 - sharedFolders.jsonに以下の内容を記載して保存します。
[
{
"sharedFolderRoot": "C:\\Shared\\EFLOW-Shared",
"sharedFolders": [
{
"hostFolderPath": "Read-Access",
"readOnly": true,
"targetFolderOnGuest": "/tmp/host-read-access"
},
{
"hostFolderPath": "Read-Write-Access",
"readOnly": false,
"targetFolderOnGuest": "/tmp/host-read-write-access"
}
]
}
]
- 読取専用で共有したいファイルを
Read-Access
フォルダにコピーします。同様に、読み書き両方で共有したいファイルをRead-Write-Access
フォルダにコピーします。今回は、Read-Write-Access
フォルダに以下のテキストが入ったhello-test.txtというファイルを置きます。ファイルの文字コードはUTF-8で、改行コードはLFで保存します。
hello!
- Windows端末において、PowerShellを管理者で実行します。
- sharedFolders.jsonを用いて、共有フォルダを作成します。
Add-EflowVmSharedFolder -sharedFoldersJsonPath "C:\Shared\EFLOW-Shared\sharedFolders.json"
- .envに
HOST_DOCUMENTS_PATH
という環境変数を設定し、Edgeモジュールで使用したいファイルが入っているhostFolderPathフォルダに対応した、sharedFolder.jsonで指定されているtargetFolderOnGuest
のパスを記載します。
CONTAINER_REGISTRY_USERNAME="acrtest"
CONTAINER_REGISTRY_PASSWORD="acrtestのパスワード"
# 追記
HOST_DOCUMENTS_PATH="/tmp/host-read-write-access"
- TestModuleディレクトリにモジュールで使用するための.envファイルを作成し、その中に「IoT EdgeのVM上で管理したいファイル名」と「そのファイルを置いておくディレクトリ」を記載します。
MANAGE_CONTROL_FLAG_JSON_PATH="/data"
MANAGE_CONTROL_FLAG_JSON_FILENAME="hello-test.txt"
- development.template.jsonの中にmodules/TestModule/createOptionsがあるため、以下のように設定します。
"modules": {
"TestModule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "${MODULES.TestModule}",
"createOptions": {
"HostConfig": {
"Binds": [
"$HOST_DOCUMENTS_PATH:/data"
]
}
}
}
}
}
10./data/hello-test.txtを読み書きできる処理をmain.pyに記載します。
11. これを設定した状態でIoT Edgeモジュールをデプロイすると、WindowsのC:\\Shared\\EFLOW-Shared\\Read-Write-Access
フォルダに入っているhello-test.txtをAzure IoT Edge を実行している Linux 仮想マシンにバインドすることができ、そこからモジュール内で対象のファイルを読み書きすることができます。
おわりに
この記事ではWindows PCとWindows上のIoT Edgeモジュール間でファイル共有を行う方法を説明しました。
Discussion