Oracle Cloud上で運用しているファイルサーバのディスク使用率がいつのまにか96%を超えていた。
え?と思って調べてみたら、外部コンテンツを取り込む際に、コンテンツのバージョンも残しておこうと軽い気持ちで設定したgitが容量を使っていた。
遅くてもいいや、ということで、使っていない50GBのオブジェクトストレージ領域をs3fsでファイルシステムとして使うこととした。
参考文献 ・s3fs配布元 ・Oracle Cloud Infrastructure Blog「Mounting an Object Storage Bucket as File System on Oracle Linux 」 ・Oracle Cloud Infrastructureドキュメント「Amazon S3互換API 」 ・Cloudii「Oracle Cloud オブジェクトストレージをOracle Linuxのファイルシステムとして直接マウントする方法。 」
基本的には、Oracle Cloud Infrastructure Blogの記述通りにやるだけなのだが、いろいろ勘違いしていて上手くいかなかった。
手順0: Oracle Cloud上でバケット作成
Oracle blog上では手順に書かれていないので手順0として書きます。
オブジェクトストレージにてバケットの作成を行います。
バケット作成後にバケットの詳細を確認し、一般のところにある「ネームスペース」もあとで使用します。
手順1: s3fs-fuseをインストール
epelを有効にしている状態であれば、「yum install s3fs-fuse」を実行するだけでインストール完了。
# yum install s3fs-fuse
読み込んだプラグイン:langpacks, ulninfo
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ s3fs-fuse.x86_64 0:1.91-1.el7 を インストール
--> 依存性の処理をしています: fuse >= 2.8.4 のパッケージ: s3fs-fuse-1.91-1.el7.x86_64
--> 依存性の処理をしています: fuse-libs >= 2.8.4 のパッケージ: s3fs-fuse-1.91-1.el7.x86_64
--> 依存性の処理をしています: libfuse.so.2(FUSE_2.2)(64bit) のパッケージ: s3fs-fuse-1.91-1.el7.x86_64
--> 依存性の処理をしています: libfuse.so.2(FUSE_2.5)(64bit) のパッケージ: s3fs-fuse-1.91-1.el7.x86_64
--> 依存性の処理をしています: libfuse.so.2(FUSE_2.6)(64bit) のパッケージ: s3fs-fuse-1.91-1.el7.x86_64
--> 依存性の処理をしています: libfuse.so.2(FUSE_2.8)(64bit) のパッケージ: s3fs-fuse-1.91-1.el7.x86_64
--> 依存性の処理をしています: libfuse.so.2()(64bit) のパッケージ: s3fs-fuse-1.91-1.el7.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ fuse.x86_64 0:2.9.4-1.0.9.el7 を インストール
---> パッケージ fuse-libs.x86_64 0:2.9.4-1.0.9.el7 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
===================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
===================================================================================================================================
インストール中:
s3fs-fuse x86_64 1.91-1.el7 ol7_developer_EPEL 257 k
依存性関連でのインストールをします:
fuse x86_64 2.9.4-1.0.9.el7 ol7_latest 88 k
fuse-libs x86_64 2.9.4-1.0.9.el7 ol7_latest 97 k
トランザクションの要約
===================================================================================================================================
インストール 1 パッケージ (+2 個の依存関係のパッケージ)
総ダウンロード容量: 442 k
インストール容量: 1.1 M
Is this ok [y/d/N]: y
Downloading packages:
<略>
インストール:
s3fs-fuse.x86_64 0:1.91-1.el7
依存性関連をインストールしました:
fuse.x86_64 0:2.9.4-1.0.9.el7 fuse-libs.x86_64 0:2.9.4-1.0.9.el7
完了しました!
#
手順2: 認証情報の設定
Oracle Cloudにログインした状態で右上のユーザアイコンから[プロファイル]-[ユーザー設定]を選択します。
画面が変わって、下の方にある[リソース]-[顧客秘密キー]を選択します。
この「顧客秘密キー」がS3 compatibleとして使う場合の認証情報となります。
「秘密キーの生成」をクリックして、何か名前を決めて作成します。
次の画面で表示される「生成されたキー」は「SECRET_ACCESS_KEY」として使いますので、かならず「コピー」してください。
これを忘れた場合は再作成する必要があります。
なお、キーはこんな感じですね。
で・・・Oracle blogだとACCESS_KEY_IDは何を使えばいいのかハッキリ書いていないので、しばらく名前として設定したs3-accessを使ってアクセスを試みていました。
正しくは上記の「アクセスキー」のところの文字列を使います。
Oracle blogでは下記の様に個人ユーザのディレクトリに認証情報を配置しています。
$ echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3fs
$ chmod 600 ${HOME}/.passwd-s3fs
今回は個人用ではなく起動時から使えるような形にしたいので /etc/passwd-s3fs として設定しました。
# echo ~b66e06:KZyW~~~BDho= > /etc/passwd-s3fs
# chmod 600 /etc/passwd-s3fs
#
手順3: マウントする
Oracle blogでは個人権限でマウントするための下記が書かれています。
$ s3fs [bucket] [destination directory] -o endpoint=[region] -o passwd_file=${HOME}/.passwd-s3fs -o url=https://[namespace].compat.objectstorage.[region].oraclecloud.com/ -onomultipart -o use_path_request_style
最初はアクセスできることを検証するため、このコマンドで実行します。
各要素は以下のようになっています。
[bucket]=手順0で作成したバケット名 [destination directory]=ローカルLinuxのマウントポイント [namespace]=手順0で作成したバケットの詳細で確認できるネームスペース
テストとしてホームディレクトリ内にあるs3fsというディレクトリにマウントするべく実行
$ s3fs tw~t ./s3fs -o endpoint=us-phoenix-1 -o passwd_file=/etc/passwd-s3fs -o url=https://ax~b7.compat.objectstorage.us-phoenix-1.oraclecloud.com -onomultipart -o use_path_request_style
fuse: failed to exec fusermount: Permission denied
$
これはfusermountに権限がないためマウントできないというもので、下記で対処します。
$ sudo chmod a+x /usr/bin/fusermount
$
再実行
$ s3fs tw~t ./s3fs -o endpoint=us-phoenix-1 -o passwd_file=/etc/passwd-s3fs -o url=https://ax~b7.compat.objectstorage.us-phoenix-1.oraclecloud.com -onomultipart -o use_path_request_style
$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 460M 0 460M 0% /dev
tmpfs 486M 380K 486M 1% /dev/shm
tmpfs 486M 19M 467M 4% /run
tmpfs 486M 0 486M 0% /sys/fs/cgroup
/dev/sda3 39G 37G 2.0G 95% /
/dev/sda1 200M 7.4M 193M 4% /boot/efi
tmpfs 98M 0 98M 0% /run/user/0
tmpfs 98M 0 98M 0% /run/user/993
tmpfs 98M 0 98M 0% /run/user/1001
$
マウントされていない??/var/log/messages を確認すると認証情報の関連でマウントに失敗していました。
Jul 9 23:07:06 oralinux s3fs[22545]: s3fs version 1.91(unknown) : s3fs -o endpoint=us-phoenix-1 -o passwd_file=/etc/passwd-s3fs -o url=https://ax~fb7.compat.objectstorage.us-phoenix-1.oraclecloud.com -onomultipart -o use_path_request_style twsearch-git ./s3fs
Jul 9 23:07:06 oralinux s3fs[22545]: Loaded mime information from /etc/mime.types
Jul 9 23:07:06 oralinux s3fs[22546]: init v1.91(commit:unknown) with OpenSSL
Jul 9 23:07:06 oralinux s3fs[22546]: s3fs.cpp:s3fs_check_service(3572): Failed to connect by sigv4, so retry to connect by signature version 2.
Jul 9 23:07:06 oralinux s3fs[22546]: s3fs.cpp:s3fs_check_service(3584): Bad Request(host=https://ax~fb7.compat.objectstorage.us-phoenix-1.oraclecloud.com) - result of checking service.
これは /etc/passwd-s3fsに書いた access-key定義が誤っていた場合のログです。
修正して再実行すると今度はマウントできました。
$ s3fs tw~t ./s3fs -o endpoint=us-phoenix-1 -o passwd_file=/etc/passwd-s3fs -o url=https://ax~b7.compat.objectstorage.us-phoenix-1.oraclecloud.com -onomultipart -o use_path_request_style
$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 460M 0 460M 0% /dev
tmpfs 486M 400K 486M 1% /dev/shm
tmpfs 486M 19M 467M 4% /run
tmpfs 486M 0 486M 0% /sys/fs/cgroup
/dev/sda3 39G 37G 1.9G 96% /
/dev/sda1 200M 7.4M 193M 4% /boot/efi
tmpfs 98M 0 98M 0% /run/user/0
tmpfs 98M 0 98M 0% /run/user/993
tmpfs 98M 0 98M 0% /run/user/1001
s3fs 16E 0 16E 0% /home/users/s3fs
$
成功した場合は /var/log/messagesは下記の様な感じでした
Jul 9 23:30:18 oralinux s3fs[23933]: s3fs version 1.91(unknown) : s3fs -o endpoint=us-phoenix-1 -o passwd_file=/etc/passwd-s3fs -o url=https://ax~fb7.compat.objectstorage.us-phoenix-1.oraclecloud.com -onomultipart -o use_path_request_style twsearch-git ./s3fs
Jul 9 23:30:18 oralinux s3fs[23933]: Loaded mime information from /etc/mime.types
Jul 9 23:30:18 oralinux s3fs[23936]: init v1.91(commit:unknown) with OpenSSL
Jul 9 23:30:26 oralinux systemd: Configuration file /etc/systemd/system/oracle-cloud-agent.service is marked executable. Please remove executable permission bits. Proceeding anyway.
ただ、この設定だとs3fsを実行したユーザだけがアクセスでき、他のユーザではアクセスできません。
これは「allow_other」というオプションをつけることでアクセスできるようになります。
手順4: /etc/fstab に書く
再起動してもマウントされるようにするには /etc/fstab に書きます。 (/etc/rc.local とかに書く、という手順は不適切です)
上記で使った例であれば /etc/fstab に下記の様に書きます。
tw~it /home/users/s3fs fuse.s3fs use_path_request_style,url=https://axd~fb7.compat.objectstorage.us-phoenix-1.oraclecloud.com,use_path_request_style,_netdev,allow_other
これで、再起動してもマウントされるようになりました。