Mana Blog Next

自宅IoT、仕事と家庭、カメラ、筋トレ生活

Raspberry Pi Zero からAzure Filesにアクセスする方法

ググってもあまり情報が出てこないのでエントリーを書いてみました。誰得なのか分からない情報ですが、もしお役に立てたら幸いです。

事象

Raspberry Pi Zero W (Raspbian Stretch) からAzure Files のファイル共有をマウントしようとするとできない。 vers=2.1 にSMBバージョンを落としてみても繋がりませんでした。

$ sudo mount -t cifs //pistorage.file.core.windows.net/pifile /mnt/azure -o vers=3.0,username=pistorage,password=key,dir_mode=0777,file_mode=0777,sec=ntlmssp
mount error(11): Resource temporarily unavailable
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

原因

dmesgで情報を見てみると・・・まあなんということでしょう。SMB3 encryption not supported yet と出てます。

$ dmesg
[30739.337990] CIFS VFS: SMB3 encryption not supported yet
[31260.358217] Status code returned 0xc0000022 STATUS_ACCESS_DENIED
[31260.358354] CIFS VFS: Send error in SessSetup = -13
[31260.358845] CIFS VFS: cifs_mount failed w/return code = -13

トラブルシューティングのページを調べてみると、Linuxの場合、SMB 3.0の暗号化機能は、Kerrnel 4.11で導入されたようです。この機能を使用すると、オンプレミスまたは他のAzureリージョンからもAzureファイル共有をマウントできるようになります。

Troubleshoot Azure Files problems in Linux | Microsoft Docs

  • Linuxからファイル共有をマウントするには、クライアントをファイル共有と同じAzureのリージョンに建てる
  • Kerrnel 4.11 以上をサポートしているLinuxからアクセスする

追記:対応しました!(2018/02/24)

Raspbian Stretch の場合、カーネルバージョンをアップデートしたら、SMB3.0に対応しました!素晴らしい!

$ uname -a
Linux raspberrypi 4.14.20+ #1094 Mon Feb 19 14:43:02 GMT 2018 armv6l GNU/Linux
$ sudo mount -t cifs //pistorage.file.core.windows.net/pifile /mnt/azure -o vers=3.0,username=pistorage,password=PASSWORD==,dir_mode=0777,file_mo
de=0777
pi@raspberrypi:~ $ df -h
ファイルシス                             サイズ  使用  残り 使用% マウント位置
/dev/root                                   15G  7.0G  7.0G   51% /
devtmpfs                                   181M     0  181M    0% /dev
tmpfs                                      186M     0  186M    0% /dev/shm
tmpfs                                      186M  2.8M  183M    2% /run
tmpfs                                      5.0M  4.0K  5.0M    1% /run/lock
tmpfs                                      186M     0  186M    0% /sys/fs/cgroup
/dev/mmcblk0p1                              42M   22M   20M   52% /boot
tmpfs                                       38M     0   38M    0% /run/user/1000
//pistorage.file.core.windows.net/pifile    10G  320K   10G    1% /mnt/azure

Fedora 27 の場合

Fedora27 からは余裕でマウントできました。Kerrnelのバージョンは4.14.6 ですので、SMB3 encryption がサポートされています。

4.14.6-300.fc27.x86_64

Windows 10 の場合

Windows 10 はSMB 3.0にバッチリ対応しているのでPCからアクセスしても問題無くマウントできます。

以下をPowerShellで実行し、Azure Filesの共有フォルダをマウントしています。

PS C:\Users\taira> $acctKey = ConvertTo-SecureString -String "key" -AsPlainText -Force
PS C:\Users\taira> $credential = New-Object System.Management.Automation.PSCredential -ArgumentList "Azure\pistorage", $
acctKey
PS C:\Users\taira> New-PSDrive -Name X -PSProvider FileSystem -Root "\\pistorage.file.core.windows.net\pifile" -Credenti
al $credential -Persist

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
X                   0.00         10.00 FileSystem    \\pistorage.file.core.windows.ne...

Azure Fileサービスの共有フォルダをエクスプローラーで開いたところ。

f:id:mana-cat:20180103011614p:plain

他のWindows バージョン

Windows 7 はSMB 3.0に対応していないです。その他の情報については公式ドキュメントを参照すると詳しく記載されています。

docs.microsoft.com

回避策

考えられる回避策

考えられる回避策としては以下の通り。

  • SMB3 encryptionに対応しているLinuxマシンからアクセスする
  • Azure CLI 2.0 からAzure Storageにファイルをアップロードする
  • Azure Storage Explorer からアクセスする
  • REST APIを使う
  • smbclient コマンドから操作する
  • 自力でKernelバージョンを上げる(万人向けの選択肢としては無し)
    Kernel - Raspberry Pi Documentation
  • 諦める(Kerrnelアップデートされるのを待つ)

smbclient で、もういいんじゃないのかと思いました。
Azure CLI 2.0 をインストールしてもいいのですが、ラズパイZeroにAzure CLI 2.0 をインストールするのに1時間前後かかるので、現実的じゃないと思いました(便利ですけどね)。

しかしながら、必要に応じて設定したい人も居ると思いますので、別エントリーに記事を書きましたので参考にして下さい。

smbclient コマンドの接続方法

Raspberry Pi のコマンドラインからは、Azure CLI 2.0 または smbclient を使ってアクセスすると問題無く繋がりますので、こちらを使います。 ちなみに smbclient の繋ぎ方は以下の通り。
--user=pistorage%password のように、%の後にpassword(Key)を入力します。 --userにはストレージ アカウント名を指定します。

$ sudo smbclient //pistorage.file.core.windows.net/pifile --user=pistorage%password  -mSMB3
WARNING: The "syslog" option is deprecated
Domain=[X] OS=[] Server=[]
smb: \> ls
  .                                   D        0  Tue Jan  2 21:24:34 2018
  ..                                  D        0  Tue Jan  2 21:24:34 2018
  2017-09-07-162135_1824x984_scrot.png      A  2034061  Tue Jan  2 23:53:35 2018
  20170503011149.jpg                  A   356965  Tue Jan  2 23:36:46 2018

                163840 blocks of size 65536. 163803 blocks available
smb: \> lcd img
smb: \> !ls
2017-09-07-162135_1824x984_scrot.png  2017-10-15-234940_1824x984_scrot.png
2017-09-07-162337_1824x984_scrot.png  2017-10-15-235031_1824x984_scrot.png

コマンドの使い方はhelpを実行すれば表示されます。

smb: \> help

念のためファイルを送信する方法を記載します。

smb: \> put 2017-09-07-162135_1824x984_scrot.png
putting file 2017-09-07-162135_1824x984_scrot.png as \2017-09-07-162135_1824x984_scrot.png (1900.8 kb/s) (average 1900.8 kb/s)

まとめ

  • KerrnelのアップデートでRaspbian StretchでもAzure Filesをマウントできるようになった
  • ラズパイで撮影した写真をSMB(CIFS)でAzure Filesへ転送し、データを溜め込んで、Azure上のサーバー側で画像合成や解析などに使うと楽しそう
  • Azure CLI 2.0 をラズパイZeroにインストールするのが思った以上に時間が掛かる(1時間)なので、より簡単な方法を考えていこうと思った