s3fuse
概要
このサイトは、IIJ IoTサービス を FUSE (Filesystem in Userspace) を用いて ファイルシステムとして利用することができる s3fuse について説明したものです。
プログラムについて
s3fuse は Amazon S3 のストレージサービスやIIJ IoTサービス等をファイルシステムとして利用するものです。 そのため、設定の一部に Amazon S3 をおもわせる単語が出てくる場合があります。
![]() |
この項目の機能は廃止を予定しています。 |
環境
s3fuseは以下の環境で動作を確認しています。
- CentOS 6.9(64bit)
- CentOS 7.2(64bit)
配布物
以下の配布物をダウンロードする必要があります。
- CentOS 6系(64bit): s3fuse-0.18-1.el6.x86_64.rpm
- CentOS 7系(64bit): s3fuse-0.18-1.el7.centos.x86_64.rpm
インストール
以下の手順でインストールしてください。
# yum install libstdc++ openssl gnutls fuse-libs fuse boost libxml2 libcurl |
# rpm -ivh s3fuse-0.17-2.el6.x86_64.rpm |
設定
/etc/s3fuse.conf に設定を行います。 設定パラメータは以下の通りです。
表. GET Object リクエストパラメータ一覧
| パラメータ名 | 説明 | デフォルト値 | 必須 |
|---|---|---|---|
| service | サービスのタイプを指定します。 iijgioを指定してください。 |
○ | |
| bucket_name | バケット名を指定します。 | ○ | |
| iijgio_secret_file | 認証情報を記述したファイルのパスを指定します。 (1) | ○ | |
| iijgio_service_endpoint | IIJ IoTサービス のエンドポントを指定します。 | s3api.iot.iij.jp | |
| iijgio_use_ssl | SSLの使用有無を指定します。 | true | |
| iijgio_ssl_skip_verify | SSL使用時にサーバ証明書の検証を行わないようにします。 | false | |
| tmp_path | テンポラリファイルを置くパスを指定します。(2) | /tmp | |
| fuse_single_thread | fuseをsingle threadで動かします。 (3) | false | |
| stats_file | 統計情報を出力するファイルを指定します。 | - | |
| default_uid | プロセスの実効user idのデフォルト値を指定します。 | 自動的に決定します | |
| default_gid | プロセスの実効group idのデフォルト値を指定します。 | 自動的に決定します | |
| default_mode | パーミッションのモードが設定されていない時のデフォルト値を指定します。 | 0755 | |
| default_cache_control | デフォルトのCache-Controlヘッダーの値を指定します。 | - | |
| object_acls | 特定のディレクトリに対してACL設定をするためのファイルを指定します。 | - | |
| cache_expiry_in_s | キャッシュが失効するまでの時間を秒で指定します。 | 180 | |
| cache_directories | ディレクトリのリストをキャッシュするかどうかを指定します。 | false | |
| max_objects_in_cache | キャッシュに保持するobjectの最大数を指定します。 | 1000 | |
| precache_on_readdir | readdir が呼ばれたときにディレクトリのコンテンツのメタデータを事前にキャッシュするか指定します。(3) | true | |
| dns_cache | DNSをキャッシュする時間を秒で指定します。 | 10 | |
| default_content_type | content-typeのデフォルト値を指定します。 | binary/octet-stream | |
| auto_detect_mime_type | ファイルの拡張子から自動的に content-type を判別します。(4) | false | |
| download_chunk_size | マルチパートのダウンロードチャンクサイズをbyteで指定します。 | 131072 | |
| upload_chunk_size | マルチパートのアップロードチャンクサイズをbyteで指定します。 | 5242880 | |
| max_transfer_retries | 最大リトライ回数を指定します。 | 5 | |
| transfer_timeout_in_s | データ転送時のタイムアウト時間を秒で指定します。 | 300 | |
| max_parts_in_progress | 一度に何個のチャンクデータを送受信するかを指定します。 | 4 | |
| verbose_requests | libcurlの処理のログを出すようにします。 | false | |
| request_timeout_in_s | HTTPリクエストのタイムアウト時間を秒で指定します。 | 30 | |
| timeout_retries | リクエストがタイムアウトした際のリトライ回数を指定します。 | 5 | |
| max_inconsistent_state_retries | 矛盾がある状態が発生した場合にオペレーションをリトライする回数を指定します。 | 10 | |
| remove_expext_header | リクエスト時にExpectヘッダを付与しないようにします。(5) | false |
iijgio_secret_fileで指定した認証情報を記述したファイルのパーミッションはfuseを実行するユーザしか読み書きできないモード(600)にしてください。
大きなファイルを扱う場合は、テンポラリパスにファイルサイズ以上の十分な容量が確保されている必要があります。
ファイルを作成したが、削除できなかったり、glob等でファイルを削除したにも関わらず、ファイルが存在しているような事象が発生した場合は、fuse_single_threadを有効にして、precache_on_readdirを無効にして試してみてください。
ファイルの拡張子からcontent-typeを自動で決定する機能を有効にした場合、起動時に以下の順で定義ファイルを探してキャッシュします。
/etc/httpd/mime.types
/private/etc/apache2/mime.types
/etc/mime.types
~/.mime.types
プロキシサーバを通して接続する際に”417 Expectation Failed”の応答で入出力エラーが発生する場合は,有効にして試してみてください。
認証情報を記述するファイルは以下のようにAccessKeyIdとSecretAccessKeyをスペース区切りで記述してください。
# vi /etc/s3fuse/iijgio.key |
<AccessKeyId> <SecretAccessKey> |
特定のディレクトリに対してACL設定をするためのファイルは以下のようにディレクトリパスとACLをスペース区切りで記述してください。 また、指定できる値は以下のものになります。
- private
- public-read
- public-read-write
- authenticated-read
- bucket-owner-read
- bucket-owner-full-control
# vi /etc/s3fuse/iijgio.acls |
public public-read |
この例では、マウントポイントの下にある public というディレクトリ内のファイルにpublic-readが付与されます。
設定例
必要最低限の設定は以下になります。
# vi /etc/s3fuse.conf |
service=iijgio |
bucket_name=MyBucket |
iijgio_secret_file=/etc/s3fuse/iijgio.key |
# mkdir /etc/s3fuse |
# vi /etc/s3fuse/iijgio.key |
accesskeyid secretaccesskey |
起動
起動方法は2つ方法があります。
- コマンドを直接実行する。
- /etc/fstabに記述してマウントする。
コマンドを直接実行する場合の使い方は以下のとおりです。
s3fuse [オプション] <マウントポイント> |
オプション |
-h: ヘルプを表示します。 |
-V: バージョン情報を出力します。 |
-f: フォアグラウンドで起動します。 |
-v: 標準エラー出力にログを出すようにします。 |
-o <FUSEオプション> |
FUSEオプション |
allow_other: マウントしたファイルシステムに他のユーザがアクセスすることを許可します。 |
allow_root: マウントしたファイルシステムにrootがアクセスすることを許可します。 |
config: コンフィグファイルを指定します。 |
直接コマンドを実行する場合の実行例
# mkdir /mnt/iijgio |
# s3fuse -oallow_other,config=/etc/s3fuse.conf /mnt/iijgio |
/etc/fstabに記述してマウントする場合のフォーマットは以下のようになります。
s3fuse <mountpoint> fuse <マウントオプション、FUSEオプション> 0 0 |
/etc/fstabに記述してマウントする場合の実行例
# vi /etc/fstab |
s3fuse /mnt/iijgio fuse defaults,noauto,allow_other,config=/etc/s3fuse.conf 0 0 |
# mount /mnt/iijgio |
以下のようにすると、proxyを指定することができます。
# all_proxy=http://<host>:<port> s3fuse -oallow_other,config=/etc/s3fuse.conf /mnt/iijgio |
# all_proxy=http://<host>:<port> mount /mnt/iijgio |
注意事項
CentOS の標準の curl ライブラリは SSL の処理に NSS を使用しており、証明書関連の処理でメモリリークするバグを含んている可能性があります。 メモリリークを起こしている場合は、 SSL の処理に OpenSSL を使用するように curl ライブラリを新たに作成し s3fuse 起動時に、作成した curl ライブラリを使うように指定することで、問題を回避することが可能です。
作成方法
# yum -y install git automake libtool openssl-devel |
# git clone https://github.com/curl/curl.git |
# cd curl |
# git checkout refs/tags/<version> # versionを指定したい場合は実行する |
# autoreconf -i |
# ./configure --prefix=/usr/local/curl-ssl --with-ssl --without-nss --without-gnutls --enable-ipv6 --enable-manual |
: |
Install prefix: /usr/local/curl-ssl # /usr/local/curl-ssl になっていることを確認する |
Compiler: gcc |
SSL support: enabled (OpenSSL) # OpenSSL になっていることを確認する |
: |
# make |
# make install |
OpenSSL の確認
# /usr/local/curl-ssl/bin/curl --version |grep OpenSSL |
curl 7.54.1-DEV (x86_64-unknown-linux-gnu) libcurl/7.54.1-DEV OpenSSL/1.0.1e zlib/1.2.3 |
起動方法
# LD_LIBRARY_PATH=/usr/local/curl-ssl/lib ./s3fuse -oallow_other,config=/etc/s3fuse.conf /mnt/iijgio |
デバッグ情報の取得方法
以下の方法で詳細なログを標準エラー出力に出力することができます。
- 設定ファイルs3fuse.confのverbose_requestsの値をtrueにします。
- マウント時には以下のように,”-v7”オプションと”debug”オプションを指定します。
指定例:
# s3fuse -v7 -oallow_other,config=/etc/s3fuse.conf,debug /mnt/iijgio |
出力例:
curl_easy_handle::pre_init: ssl version: NSS/3.19.1 Basic ECC |
* About to connect() to storage-dag.iijgio.com port 80 (#0) |
* Trying 210.128.49.20... * connected |
* Connected to storage-dag.iijgio.com (210.128.49.20) port 80 (#0) |
> GET /iij-test?prefix=/&marker=&max-keys=1 HTTP/1.1 |
User-Agent: s3fuse 0.17 (b4e9a3f) |
Host: storage-dag.iijgio.com |
Accept: */* |
Authorization: IIJGIO <AccessKeyId>:OMerq2VmkrVNl9WaPcsONAEGjuw= |
Date: Fri, 22 Apr 2016 09:03:41 GMT |
< HTTP/1.1 200 OK |
< Date: Fri, 22 Apr 2016 09:04:46 GMT |
< Server: dag.iijgio.com |
< x-iijgio-id-2: 07FD8F31F97F4C08981ABE4B39153028 |
< x-iijgio-request-id: 07FD8F31F97F4C08981ABE4B39153028 |
< x-iijgio-version-id: null |
< Content-Type: application/xml |
< Content-Length: 269 |
< Connection: close |
< |
* Closing connection #0 |
* About to connect() to storage-dag.iijgio.com port 80 (#0) |
* Trying 210.128.49.20... * connected |
* Connected to storage-dag.iijgio.com (210.128.49.20) port 80 (#0) |
> HEAD /iij-test/%24s3fuse%24_bucket_test_b20b7bcd7636df838efa1c72cf25dab9 HTTP/1.1 |
User-Agent: s3fuse 0.17 (b4e9a3f) |
Host: storage-dag.iijgio.com |
Accept: */* |
Authorization: IIJGIO <AccessKeyId>:Ck/4ohgEzY5QnRd544O4KG30yEw= |
Date: Fri, 22 Apr 2016 09:03:41 GMT |
< HTTP/1.1 404 Not Found |
< Date: Fri, 22 Apr 2016 09:04:46 GMT |
< Server: dag.iijgio.com |
< x-iijgio-request-id: FC11CCD1E2EA4243ACABB9FB986CDFBF |
< x-iijgio-id-2: FC11CCD1E2EA4243ACABB9FB986CDFBF |
< Content-Type: text/html; charset=ISO-8859-1 |
< Cache-Control: must-revalidate,no-cache,no-store |
< Connection: close |
< |
* Closing connection #0 |
* About to connect() to storage-dag.iijgio.com port 80 (#0) |
* Trying 210.128.49.20... * connected |
* Connected to storage-dag.iijgio.com (210.128.49.20) port 80 (#0) |
- 設定ファイルs3fuse.confのstats_fileの値にログの出力先パスを指定することで出力先パスに統計情報を出力します。
- 既に同名のファイルが出力先パスに存在する場合は上書きされます。
- s3fuseをアンマウントした際に統計情報を出力します。
出力例:
thread pool_PR_REQ_0: |
respawn_counter: 38 |
thread pool_PR_REQ_1: |
respawn_counter: 10 |
http requests: |
count: 213699 |
total time: 67668.32 s |
avg time per request: 316.653 ms |
bytes: 63353902 |
throughput: 0.936 kB/s |
curl failures: 0 |
request failures: 1 |
timeouts: 48 |
aborts: 0 |
hook retries: 0 |
rewinds: 0 |
common service base: |
"internal server error": 0 |
"service unavailable": 0 |
"RequestTimeout": 0 |
"bad request": 1 |
common single-part downloads: |
failed: 0 |
succeeded: 321 |
common multi-part downloads: |
succeeded: 0 |
failed: 0 |
chunks failed: 0 |
common single-part uploads: |
succeeded: 6927 |
failed: 0 |
common multi-part uploads: |
succeeded: 0 |
failed: 0 |
thread pool request workers: |
total request time: 67692.063 s |
total function time: 67719.584 s |
request wait: 99.96 % |
reposted items: 48 |
google storage multi-part uploads: |
chunks failed: 0 |
google storage service: |
token refreshes due to request failure: 0 |
token refreshes due to expiry: 0 |
iijgio multi-part uploads: |
chunks failed: 0 |
aws multi-part uploads: |
chunks failed: 0 |
objects: |
precondition failed during commit: 0 |
new etag on commit: 0 |
commit failures: 1 |
precondition failed rescues: 0 |
abandoned commits: 0 |
files: |
sha256 mismatches: 0, md5 mismatches: 0, no hash checks: 0 |
non-dirty flushes: 6977 |
reopens: 0 |
encrypted files: |
non-empty file that isn't intact: 0 |
init without iv or metadata: 0 |
init errors: 0 |
open without key: 0 |
directories: |
internal objects skipped in list: 0 |
rename retries (copy step): 0 |
rename retries (delete step): 0 |
object cache: |
size: 4 |
hits: 106522 (53.09 %) |
misses: 71308 (35.54 %) |
expiries: 22833 (11.38 %) |
get failures: 26467 |
operations (exceptions): |
reopen attempts: 0 |
reopens rescued: 0 |
reopens failed: 0 |
rename attempts: 0 |
renames failed: 0 |
operation failed: 0 |
operations (modifiers): |
create: 6645 |
mkdir: 6526 |
mknod: 0 |
open: 422 |
rename: 5 |
symlink: 3 |
truncate: 0 |
unlink: 13173 |
operations (accessors): |
getattr: 100184 |
readdir: 6581 |
readlink: 9 |
strict_check_retry: 0 |
Tips
s3fuse は、環境要因によりプロセスが意図せず終了してしまう可能性があります。 万一 s3fuse プロセスが意図せず終了した場合は、以下の方法で復旧をお試し下さい。
# umount <mountpoint> |
# mount <mountpoint> // もしくは # s3fuse -oallow_other,config=/etc/s3fuse.conf /mnt/iijgio |
上記の umount コマンドで “Device or resource busy” エラーが発生した場合は、マウントポイント配下のディレクトリやファイルを操作しているプロセスを洗い出し、プロセスを終了させてから再度上記復旧コマンドをお試し下さい。 なおマウントポイント配下のディレクトリやファイルを操作しているプロセスは、以下のコマンドで確認することができます。
# lsof | grep <mountpoint> |
