BLOB Storage をLinuxファイルシステムとしてマウント - blobfuse (プレビュー)
結論から申し上げます。
blobfuseは、用法・用量を守って、正しくお使いください m(_)m
blobfuse に限らず Fuseアダプタを使ったファイルシステムは、POSIX準拠のファイルシステムと比較して、制限事項や注意事項は少なくありません。また、現在プレビュー中でもあります。
とはいえど、、、Managed Diskや Azure Files と比較すると、ぐーんと廉価な BLOB Storage をテープバックアップの代替・アーカイブデータの格納用途などで使用したいというニーズがあるのも、事実です。
(※以下の表は、東日本リージョン / MOSP提供価格の前提にて記載)
そこで、あえて今回は blobfuse を使う際の基本機能や制限事項、設定方法をまとめてみることにしました。
基本機能
- Linux 上でBLOB ストレージ コンテナーをマウントすることが可能
- mkdir, opendir, readdir, rmdir, open, read, create, write, close, unlink, truncate, stat, rename といった基本的なファイルシステム操作が可能
- 後続のアクセス時間を改善するためにローカル キャッシュを実装
- 大容量のBLOBへの高速なアクセスを可能にするための並列ダウンロード・アップロード機能
- 読み取り専用のシナリオにおいて、複数のノードが同じコンテナーをマウントすることが可能
現在の利用上の制限事項
- サポートしている最大ファイルサイズは 200 GB まで (将来的には上限が 800GB になる予定)
- 一部のファイルシステムAPIが実装されていません : readlink, symlink, link, chmod, chown, fsync, lock および 拡張属性の呼び出し
- 既存のファイルを更新するために最適化されていません。 blobfuseは、ファイル全体をローカル キャッシュにダウンロードして、ファイルを変更および更新できるようにします。
- SAS (Shared Access Signature: 共有アクセス署名) はサポートしていません。
- ローカルファイルシステムと比較して待ち時間が長くなります。さらにAzureリージョンから操作する場合、さらに待ち時間は長くなります。
- 現在のところ、データの整合性チェックは実装されていません。blobfuseを使用する前に、常にデータをバックアップしてください。データの整合性メカニズムとしてHTTPS にて通信します。
- ブロックBLOBにはファイルやディレクトリの概念がないため、特定のディレクトリ操作が期待どおりに動作しないことがあります。 たとえば、ディレクトリ内の最後のファイルを削除すると、そのディレクトリも削除されることがあります。
また、NFSやiSCSIなどのPOSIX準拠のファイルシステムと blobfuseでは、以下のような違いや制限事項もあります。(以下のドキュメントからの抜粋・抄訳を簡単に記載します)
- 複数のノードからの同時書き込み処理が発生した場合、同時書き込み処理の制御は無く、最後の書き込みのみが有効になります。以前の書き込みはすべて失われます。
- chmod および chown コマンドはサポートしていません。BLOB Storage では、オブジェクト毎のパーミッションやACLをサポートしません。 デフォルトのオプションでマウントした場合は、ファイルに 770 の権限が与えられ、Blobfuse を使用してマウントされたユーザーのみアクセス可能です。(他のユーザーにアクセス権限を付与する場合は、"-o allow_other"オプションを付加してマウントする必要があります)
- パフォーマンス上の観点で、ハードリンクはサポートしていません。
- アトミックな名前変更操作は、BLOB Storage ではサポートされていません。単一のファイル名の変更は、実際にはコピーと元のファイルの削除の2つの操作が必要になります。ディレクトリ名の変更については、ディレクトリ内のすべてのファイルを再帰的に列挙し、それぞれの名前を変更することになります。
前置きが長くなりましたが(汗)...具体的に設定方法をご説明します。
[事前作業]
- ストレージアカウントとBLOB Storage、およびファイルシステムとしてマウントするためのコンテナーを作成します。
- 作成したストレージアカウントのキー情報も事前にメモしておきます。
- ファイルシステムとしてマウントするLinuxマシンを用意します。(今回は、Red Hat Enterprise Linux 7.2 の Azure 仮想マシンからマウントすることにしました)
[設定手順]
1. Microsoft パッケージ リポジトリの構成
$ sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
2. blobfuseのインストール
※冒頭の公式ドキュメント上は、blobfuseのみ記載されていますが、fuseのインストールが必要でした。
※fuseをインストールする前に出ていたエラーメッセージ:
"fuse: failed to exec fusermount: No such file or directory"
3. blobfuse用のRAMディスクの作成 (以下の例だと 32GB)
$ sudo mount -t tmpfs -o size=32g tmpfs /mnt/ramdisk
$ sudo mkdir /mnt/ramdisk/blobfusetmp
$ sudo chown <ユーザー名> /mnt/ramdisk/blobfusetmp
4. ストレージアカウントの資格情報ファイルの作成
$ vi /home/jm555/fuse_connection.cfg
cfgファイルには、以下の3行を記載して、パーミッションを 700 に変更します。
---
accountName <ストレージ アカウント名>
accountKey <アクセス キー>
containerName <コンテナー名>
---
$ chmod 700 fuse_connection.cfg
5. マウント用のディレクトリの作成
$ mkdir /home/jm555/blobfuse
6. blobfuse でマウント
$ blobfuse ~/blobfuse --tmp-path=/mnt/ramdisk/blobfusetmp --config-file=~/fuse_connection.cfg -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120
マウント後、df コマンドで確認してみましょう。
$ df -h
---<<抜粋>>---
tmpfs 32G 0 32G 0% /mnt/ramdisk
blobfuse 32G 0 32G 0% /home/jm555/blobfuse
---<<ここまで>>---
<必要に応じて>
7. OSを再起動しても自動でマウントするように、/etc/fstab に追記
まずマウント用スクリプトを作成しておきます。
$ vi mount.sh
---
#!/bin/bash
/usr/bin/blobfuse $1 --tmp-path=/mnt/ramdisk/blobfusetmp -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 -o allow_other -o uid=1000 -o gid=1000 --config-file=/home/jm555/fuse_connection.cfg
---
$ vi /etc/fstab
---<<一番下に次の1行を追加>>---
/home/jm555/mount.sh /home/jm555/blobfuse fuse _netdev
---
ちなみに、アンマウントする場合は、以下のコマンドを使います。
$ fusermount -u /home/jm555/blobfuse
blobfuse 自体は無料で使えるツールですし、 もし使用上差し支えないようでしたら、ぜひ試してみてください!
※ご参考
https://cloud.google.com/storage/docs/gcs-fuse?hl=ja