Edited at

blobfuseつかってみた②~blobfuseインストール&設定~


Blobfuseのインストール

ということで①でざっくり概要はつかみましたがblobfuseのインストールを進めていきましょう。

参考にさせていただいたのはこちらのサイトです。

参考文献

blobfuse を使用して Blob Storage をファイル システムとしてマウントする方法(公式)

BLOB Storage をLinuxファイルシステムとしてマウント - blobfuse (プレビュー)

今回の環境

HW: Azure VM

OS: CentOS7.5を利用しました

$ cat /etc/redhat-release

CentOS Linux release 7.5.1804 (Core)

$ uname -a
Linux blobtestvm1 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux


インストール


1. Microsoft パッケージ リポジトリの構成

$ sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm



まずはMSのパッケージリポジトリを構成します。オープンソースではあるのですがリポジトリはMSなんですねー。

私の環境ではCentOS7.5なので同じ系統のRHEL7のリポジトリ/rhel/7/を利用していますが、apt民(Ubuntu屋さん)の方は公式からpkg情報&インスココマンド確認してくださいね。

$sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

Retrieving https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
warning: /var/tmp/rpm-tmp.0Gr872: Header V4 RSA/SHA256 Signature, key ID be1229cf: NOKEY
Preparing... ################################# [100%]
Updating / installing...


2. yumコマンド実行

$ sudo yum install blobfuse fuse

yumで blobfuseとfuseをインストールします。

今回AzureのMarketPlaceからVMを作成したのですが、オプション設定していないので依存関係があるパッケージもインストールされました。


3.インストールされたPKGの確認

blobfuse : blobfuse  

fuse : fuse  

fuse-libs : fuseのライブラリ

gnutls : SSL関係のライブラリ

nettle : 暗号関係のライブラリ,gnutlsのinstallに必要

trousers : TSSのライブラリ,gnutlsのinstallに必要

※Trusted Computing Group's Software Stack(TSS)らしい。とりあえずはSecurity関連のライブラリのようですね。

下記のインストールログでみていただけるかと思いますが、で話題に出たlibfuseというfuseのライブラリも依存関係で読み込んでいますね。(libfuse.so.2ってやつです。)

$ sudo  yum install blobfuse fuse

Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
: 中略
Resolving Dependencies
--> Running transaction check
---> Package blobfuse.x86_64 0:1.0.2-1 will be installed
--> Processing Dependency: libfuse.so.2(FUSE_2.8)(64bit) for package: blobfuse-1.0.2-1.x86_64
--> Processing Dependency: libgnutls.so.28(GNUTLS_1_4)(64bit) for package: blobfuse-1.0.2-1.x86_64
--> Processing Dependency: libfuse.so.2(FUSE_2.6)(64bit) for package: blobfuse-1.0.2-1.x86_64
--> Processing Dependency: libfuse.so.2(FUSE_2.5)(64bit) for package: blobfuse-1.0.2-1.x86_64
--> Processing Dependency: libgnutls.so.28(GNUTLS_2_10)(64bit) for package: blobfuse-1.0.2-1.x86_64
--> Processing Dependency: libfuse.so.2()(64bit) for package: blobfuse-1.0.2-1.x86_64
--> Processing Dependency: libgnutls.so.28()(64bit) for package: blobfuse-1.0.2-1.x86_64
---> Package fuse.x86_64 0:2.9.2-10.el7 will be installed
--> Running transaction check
---> Package fuse-libs.x86_64 0:2.9.2-10.el7 will be installed
---> Package gnutls.x86_64 0:3.3.26-9.el7 will be installed
--> Processing Dependency: trousers >= 0.3.11.2 for package: gnutls-3.3.26-9.el7.x86_64
--> Processing Dependency: libnettle.so.4()(64bit) for package: gnutls-3.3.26-9.el7.x86_64
--> Processing Dependency: libhogweed.so.2()(64bit) for package: gnutls-3.3.26-9.el7.x86_64
--> Running transaction check
---> Package nettle.x86_64 0:2.7.1-8.el7 will be installed
---> Package trousers.x86_64 0:0.3.14-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
Package Arch Version Repository Size
========================================================================================================================
Installing:
blobfuse x86_64 1.0.2-1 packages-microsoft-com-prod 225 k
fuse x86_64 2.9.2-10.el7 base 86 k
Installing for dependencies:
fuse-libs x86_64 2.9.2-10.el7 base 93 k
gnutls x86_64 3.3.26-9.el7 base 677 k
nettle x86_64 2.7.1-8.el7 base 327 k
trousers x86_64 0.3.14-2.el7 base 289 k

Transaction Summary
========================================================================================================================
Install 2 Packages (+4 Dependent packages)
: 中略
Installed:
blobfuse.x86_64 0:1.0.2-1 fuse.x86_64 0:2.9.2-10.el7

Dependency Installed:
fuse-libs.x86_64 0:2.9.2-10.el7 gnutls.x86_64 0:3.3.26-9.el7 nettle.x86_64 0:2.7.1-8.el7
trousers.x86_64 0:0.3.14-2.el7

Complete!


続いて設定作業


4. RAMディスク作成

マウントの前にRAMディスクとblobfuse用のディレクトリの作成をしていきます。

ここではmount -t tmpfsコマンドを利用してRAMを作成しています。

SSDを利用することもできますので詳しくは公式ページご確認ください。

$ sudo mkdir /mnt/ramdisk

$ sudo mount -t tmpfs -o size=32g tmpfs /mnt/ramdisk
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 30G 1.6G 28G 6% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 9.0M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 497M 81M 417M 17% /boot
/dev/sdb1 16G 45M 15G 1% /mnt/resource
tmpfs 797M 0 797M 0% /run/user/1000
tmpfs 32G 0 32G 0% /mnt/ramdisk

/mnt/ramdiskが32Gで作成されました。

この設定で32GBのファイルまでオープンできるようになります。

(実メモリを超えた場合の動作が気になりますがとりあえず進めていきます。)


5. blobfuse用のディレクトリ作成

作成したRAMディスクの中にblobfuse用のディレクトリを作成して、

オーナーを変更します。

$ sudo mkdir /mnt/ramdisk/blobfusetmp

$ sudo chown user1 /mnt/ramdisk/blobfusetmp
$ ls -l /mnt/ramdisk/
total 0
drwxr-xr-x. 2 user1 root 40 Dec 10 07:40 blobfusetmp

※ user1はuser名です。


5. blobストレージのアクセス情報の確認

つづいてblobfuseの設定ファイル作成に入っていきます。

blobfuseでblobストレージにアクセスするためには下記の情報が必要です。


  • accountName : Azureのblobストレージアカウント名

  • accountKey : ストレージアカウントのキー

  • containerName : コンテナ名

それぞれAzurePortalから取得できます。

確認方法はどちらもAzureのリソースグループより該当のストレージアカウントをクリックすると確認が可能です。



  • accountName,accountKeyの確認方法

    ストレージアカウントのメニューよりアクセス キーをクリックするとストレージアカウント名、キーがそれぞれ表示されますのでメモしますφ(・ω・`)メモメモ




  • containerNameの確認方法

    ストレージアカウントのメニューよりBLOBをクリックするとコンテナの名前が記載されているページが開きますので、コンテナ名をメモしますφ(・ω・`)メモメモ




5. blobfuse設定ファイルの作成

$ sudo mkdir /var/etc

$ sudo chown user1 /var/etc

$ sudo vi /var/etc/fuse_connection.cfg
下記記載します。
accountName ストレージアカウント名
accountKey ストレージアカウントキー
containerName コンテナ名

※小文字と大文字を識別するのでだとエラーがでます。(ContainerNameなどはNG)

ファイル内容を確認して設定ファイルのパーミッションを変更します。

$ cat  /var/etc/fuse_connection.cfg

accountName ストレージアカウント名
accountKey ストレージアカウントキー
containerName コンテナ名
$ chmod 700 /var/etc/fuse_connection.cfg
$ ls -l /var/etc/fuse_connection.cfg
-rwx------. 1 user1 root 153 Dec 10 07:35 fuse_connection.cfg


6. マウント用のディレクトリ作成

作成場所はどこでもよいのですが、今回は/var/dataに作成してみました。

※Permission関連でNGな場合はsudoまたは/home/username配下でお試しくださいませ。

$ sudo mkdir /var/data

$ sudo mkdir /var/data/blobfuse
$ chmod 755 data
$ sudo chown user1 data
$ sudo chown user1 data/blobfuse
$ chmod 755 data
$ chmod 755 data/blobfuse

$ ls -la /var/data/
total 4
drwxr-xr-x. 3 root root 22 Dec 10 07:45 .
drwxr-xr-x. 22 user1 root 4096 Dec 10 07:44 ..
drwxr-xr-x. 2 user1 root 6 Dec 10 07:45 blobfuse


実行


7. マウントの前にオプション確認

サンプルコマンドとしては下記のようなコマンドになります。

こちらを修正して実行コマンド作成していきます。


コマンドとしては

$ blobfuse /var/data/blobfuse/ --tmp-path=/mnt/ramdisk/bloobfusetmp --config-file=/var/etc/fuse_connection.cfg -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 -o allow_other

blobfuse マウント先 --tmp-path=RAM Diskのblobstrage用ディレクトリ --config-file=コンフィグファイルのファイル名 その他オプション

という感じの構成です。


その他のオプションについて

その他のオプションについては詳細はこちらのMountOptionに記載しています。

その他のオプションで重要なオプションとしては-o allow_otherです。

blobではACLこのオプションなしで実行するとオーナーのみが利用可能なので、ほかの人が利用できませんのでご注意を!


8. いざ実行!マウントしちゃいます!

$ blobfuse /var/data/blobfuse/ --tmp-path=/mnt/ramdisk/bloobfusetmp --config-file=/var/etc/fuse_connection.cfg -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 -o allow_other

$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 30929148 1332816 29596332 5% /
devtmpfs 4066508 0 4066508 0% /dev
tmpfs 4078652 0 4078652 0% /dev/shm
tmpfs 4078652 9164 4069488 1% /run
tmpfs 4078652 0 4078652 0% /sys/fs/cgroup
/dev/sda1 508580 82188 426392 17% /boot
/dev/sdb1 16381756 45084 15481484 1% /mnt/resource
tmpfs 815732 0 815732 0% /run/user/1000
tmpfs 33554432 0 33554432 0% /mnt/ramdisk
blobfuse 33554432 0 33554432 0% /var/data/blobfuse

マウントできました

blobfuse 33554432 0 33554432 0% /var/data/blobfuse

$ ps aux|grep blobfuse

mimatsuo 37462 0.0 0.0 112704 972 pts/1 S+ 12:35 0:00 grep --color=auto blobfuse
root 81932 1.8 0.1 496932 12800 ? Ssl Dec10 27:11 /usr/bin/blobfuse /var/data/blobfuse --tmp-path=/mnt/ramdisk/blobfusetmp -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 --file-cache-timeout-in-seconds=0 -o allow_other -o uid=1000 -o gid=1000 --config-file=/var/etc/fuse_connection.cfg

psで確認してもプロセスがあがっていますね。


エラーになったときは・・

もしうまくいかないよーという方がいるかもしれないので、一応私が体験した実行エラー例と回避を記載しときます。

よくある実行エラー例①設定ファイル間違い

No config file found at ~/etc/fuse_connection.cfg.



->原因は設定ファイルの記載ミス。大文字小文字間違いないか確認。

よくある実行エラー例②すでにファイルがある場合

fuse: mountpoint is not empty

fuse: if you are sure this is safe, use the 'nonempty' mount option


->原因はblobfuseのディレクトリ内にファイルがあるため。noemptyオプションを設定ファイルに記載するか、ファイルを削除すれば解決


動作確認

本格的な動作の確認は別途まとめようと思いますが、インストールが正常にできたかまずは確認です。


9. 動作確認


基本動作

取り急ぎlsとecho mkdirなどを試しましたが問題なく動いていました。

$ cd /var/data/blobfuse/

$ ls -l
total 0
-rwxrwxrwx. 1 user1 user1 1228800 Dec 11 02:32 fio
drwxrwxrwx. 2 user1 user1 4096 Jan 1 1970 test

$ echo "heloworld">test.txt
$ ls -l test.txt
-rwxrwxrwx. 1 user1 user1 10 Dec 11 12:39 test.txt
$ cat test.txt
heloworld

$ mkdir testdir
$ ls -la|grep testdir
drwxrwxrwx. 2 user1 user1 4096 Jan 1 1970 testdir


制約事項

公式ページのCurrentLimitationによるとlinkやchownなど対応していないそうなので軽く動作確認します。

・リンク

ハードリンクサポートしていないということなのでためしてみると機能がないよと怒られました。

$ ln test.txt test.ln

ln: failed to create hard link ‘test.ln’ => ‘test.txt’: Function not implemented
$ ln -s testdir testdirlink
ln: failed to create symbolic link ‘testdirlink’: Function not implemented

・chown

実行してみましたが、エラーもでず存在を無視されましたw

$ ls -la test.txt

-rwxrwxrwx. 1 user1 user1 10 Dec 11 12:39 test.txt
$chown user2 test.txt
$ ls -la test.txt
-rwxrwxrwx. 1 user1 user1 10 Dec 11 12:39 test.txt


(おまけ1)自動起動


11. 自動起動の設定

さきほどはコマンドラインから実行しましたが、自動起動する設定をしていきます。


まずは起動用のshellを作成します。

$ sudo vi /var/etc/mount.sh

下記記載
/usr/bin/blobfuse $1 --tmp-path=/mnt/ramdisk/blobfusetmp -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 --file-cache-timeout-in-seconds=0 -o allow_other -o uid=1000 -o gid=1000 --config-file=/var/etc/fuse_connection.cfg

$ chown user1 /var/etc/mount.sh

$ cat /var/etc/mount.sh
/usr/bin/blobfuse $1 --tmp-path=/mnt/ramdisk/blobfusetmp -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 --file-cache-timeout-in-seconds=0 -o allow_other -o uid=1000 -o gid=1000 --config-file=/var/etc/fuse_connection.cfg


続いて/etc/fstabを編集します

/var/etc/mount.sh /var/data/blobfuse fuse _netdev



を/etc/fstabへ記載します。

※/etc/fstabの記載をミスすると起動してこなくなってしまうのでお気をつけください><

$sudo vi /etc/fstab

上のコマンドを追記します

$cat /etc/fstab

# /etc/fstab
# Created by anaconda on Wed Aug 15 19:30:54 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=12907c8a-6b2f-4981-b94c-f3cd772270a7 / xfs defaults 0 0
UUID=fa2f8157-21c9-43b6-85e3-ff04422dfa00 /boot xfs defaults 0 0
/var/etc/mount.sh /var/data/blobfuse fuse _netdev

_netdevを設定するとマウントする際にネットワークが開始するまで待ってくれます。

詳しくはこちら


設定確認作業

再起動後に/etc/fstabのエラーが発生するとVMが起動しなくなってしまうので、

コマンドラインで動作するかを確認します。

まずは、アンマウントします。

fusermount -u /var/data/blobfuse/

$ df -h

Filesystem Size Used Avail Use% Mounted on
/dev/sda2 30G 2.9G 27G 10% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 26M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 497M 81M 417M 17% /boot
/dev/sdb1 16G 45M 15G 1% /mnt/resource
tmpfs 797M 0 797M 0% /run/user/1000
blobfuse 30G 2.9G 27G 10% /var/data/blobfuse

$ sudo fusermount -u /var/data/blobfuse/
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 30G 2.9G 27G 10% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 26M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 497M 81M 417M 17% /boot
/dev/sdb1 16G 45M 15G 1% /mnt/resource
tmpfs 797M 0 797M 0% /run/user/1000

コマンドラインから/etc/fstabの内容でマウントします。

エラーが出なければOKです。

$sudo mount -a

$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 30929148 2958060 27971088 10% /
devtmpfs 4066508 0 4066508 0% /dev
tmpfs 4078652 0 4078652 0% /dev/shm
tmpfs 4078652 25680 4052972 1% /run
tmpfs 4078652 0 4078652 0% /sys/fs/cgroup
/dev/sda1 508580 82188 426392 17% /boot
/dev/sdb1 16381756 45084 15481484 1% /mnt/resource
tmpfs 815732 0 815732 0% /run/user/1000
blobfuse 30929148 2958060 27971088 10% /var/data/blobfuse


(おまけ2)アンマウント方法

前項でも記載していますがアンマウントしたい場合のアンマウント方法は下記です。

$ df

Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 30929148 2957856 27971292 10% /
devtmpfs 4066508 0 4066508 0% /dev
tmpfs 4078652 0 4078652 0% /dev/shm
tmpfs 4078652 25684 4052968 1% /run
tmpfs 4078652 0 4078652 0% /sys/fs/cgroup
/dev/sda1 508580 82188 426392 17% /boot
/dev/sdb1 16381756 45084 15481484 1% /mnt/resource
tmpfs 815732 0 815732 0% /run/user/1000
blobfuse 30929148 2957856 27971292 10% /var/data/blobfuse

$ fusermount -u /var/data/blobfuse
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 30929148 2957856 27971292 10% /
devtmpfs 4066508 0 4066508 0% /dev
tmpfs 4078652 0 4078652 0% /dev/shm
tmpfs 4078652 25684 4052968 1% /run
tmpfs 4078652 0 4078652 0% /sys/fs/cgroup
/dev/sda1 508580 82188 426392 17% /boot
/dev/sdb1 16381756 45084 15481484 1% /mnt/resource
tmpfs 815732 0 815732 0% /run/user/1000


まとめ

今回はblobfuseをインストールして書き込みと読み込みができることを確認しました。

多少blobfuse特有の設定はあったものの、かねがねLinuxベースの設定でとても便利ですねー。

次回③はもう少し細かく動作検証を進めていきたいと思います。