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

#Blobfuseのインストール

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

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

**参考文献**
・[blobfuse を使用して Blob Storage をファイル システムとしてマウントする方法](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-how-to-mount-container-linux)（公式）
・[BLOB Storage をLinuxファイルシステムとしてマウント - blobfuse (プレビュー)](
http://jm555.hatenablog.jp/entry/2018/04/03/194153)

**今回の環境**
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屋さん)の方は[公式](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-how-to-mount-container-linux)から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関係のライブラリ](https://ja.wikipedia.org/wiki/GnuTLS)
**nettle**   : [暗号関係のライブラリ](http://lfsbookja.osdn.jp/BLFS/svn-ja/postlfs/nettle.html),gnutlsのinstallに必要
**trousers** : [TSSのライブラリ](https://centos.pkgs.org/7/centos-x86_64/trousers-0.3.14-2.el7.x86_64.rpm.html),gnutlsのinstallに必要
※Trusted Computing Group's Software Stack(TSS)らしい。とりあえずはSecurity関連のライブラリのようですね。

下記のインストールログでみていただけるかと思いますが、[①](https://qiita.com/mihomiporin1110/items/177e4f3e2f42ef86becf)で話題に出た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を利用することもできますので詳しくは[公式ページ](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-how-to-mount-container-linux)ご確認ください。


```
$ 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の確認方法**
  ストレージアカウントのメニューより**アクセス キー**をクリックするとストレージアカウント名、キーがそれぞれ表示されますのでメモしますφ(・ω・｀)メモメモ
  ![setting_blog3.png](https://qiita-image-store.s3.amazonaws.com/0/297303/42b02a4d-0358-f71f-596c-07eda0a814cd.png)



- **containerNameの確認方法** 
  ストレージアカウントのメニューより**BLOB**をクリックするとコンテナの名前が記載されているページが開きますので、コンテナ名をメモしますφ(・ω・｀)メモメモ
   ![setting_blog2.png](https://qiita-image-store.s3.amazonaws.com/0/297303/7c0a98f5-1295-8e85-bebb-b44cef97f48e.png)


###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=コンフィグファイルのファイル名 その他オプション```
という感じの構成です。

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

その他のオプションについては詳細は[こちら](https://github.com/azure/azure-storage-fuse)の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
```
マウントできました:heart_eyes:

```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
```


#### 制約事項
[公式ページ](https://github.com/azure/azure-storage-fuse)の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**

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

```
$ 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を設定するとマウントする際にネットワークが開始するまで待ってくれます。
[詳しくはこちら](http://aikotobaha.blogspot.com/2010/08/rhel-netdev.html)

##### 設定確認作業

再起動後に/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ベースの設定でとても便利ですねー。

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