2014/11/20 Version 1.0.0

s3fuse

概要

このサイトは、IIJオブジェクトストレージサービス を FUSE (Filesystem in Userspace) を用いてファイルシステムとして利用することができる s3fuse について説明したものです。

プログラムについて

s3fuse は Amazon S3 のストレージサービスやIIJオブジェクトストレージサービス等をファイルシステムとして利用するものです。そのため、設定の一部に Amazon S3 をおもわせる単語が出てくる場合があります。

環境

s3fuseは以下の環境で動作を確認しています。

  • CentOS 6.9(64bit)
  • CentOS 7.2(64bit)

配布物

以下の配布物をダウンロードする必要があります。

インストール

以下の手順でインストールしてください。

# 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オブジェクトストレージサービス のエンドポントを指定します。 storage-dag.iijgio.com  
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  
  1. iijgio_secret_fileで指定した認証情報を記述したファイルのパーミッションはfuseを実行するユーザしか読み書きできないモード(600)にしてください。

  2. 大きなファイルを扱う場合は、テンポラリパスにファイルサイズ以上の十分な容量が確保されている必要があります。

  3. ファイルを作成したが、削除できなかったり、glob等でファイルを削除したにも関わらず、ファイルが存在しているような事象が発生した場合は、fuse_single_threadを有効にして、precache_on_readdirを無効にして試してみてください。

  4. ファイルの拡張子からcontent-typeを自動で決定する機能を有効にした場合、起動時に以下の順で定義ファイルを探してキャッシュします。
    • /etc/httpd/mime.types
    • /private/etc/apache2/mime.types
    • /etc/mime.types
    • ~/.mime.types
  5. プロキシサーバを通して接続する際に”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>

ソースコード

githubで公開しています。

ページ先頭へ