2014/11/20 Version 1.0.0
s3fuse¶
概要¶
このページは、IIJオブジェクトストレージサービス を FUSE (Filesystem in Userspace) を用いてファイルシステムとして利用することができる s3fuse について説明したものです。
Note
本ソフトウェアの配布は2021年2月15日をもって終了しました。配布終了以前からご利用のお客さまでパッケージファイルが必要なお客様は弊社営業、もしくはサービスオンラインよりお問い合わせください。
プログラムについて¶
s3fuse は Amazon S3 のストレージサービスやIIJオブジェクトストレージサービス等をファイルシステムとして利用するものです。そのため、設定の一部に Amazon S3 をおもわせる単語が出てくる場合があります。
配布物¶
Note
本ソフトウェアの配布は2021年2月15日をもって終了しました。
インストール¶
以下の手順でインストールしてください。
# yum install libstdc++ openssl gnutls fuse-libs fuse boost libxml2 libcurl
# rpm -ivh s3fuse-0.18-2.el6.x86_64.rpm
設定¶
/etc/s3fuse.confに設定を行います。 設定パラメータは以下の通りです。
パラメータ名 | 説明 | デフォルト値 | 必須パラメータ |
---|---|---|---|
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 |
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>