ConoHaのVMでUbuntu 14.04を使ってs3qlでSwift Object Storageをマウントする

  • 8
    いいね
  • 0
    コメント

追記: この記事はConoHa Advent Calendar 2015の記事となります。

修正1(2015/12/14 18:00): openstack server create ... のコマンドで、instance_name_tag=を指定するところを'"(ダブルクオート)'でくくるように表記を変えました。シングルクオートだと、\u2018 \u2019のunicodeのクオートに表示がなっていたみたいで、紛らわしいので修正。

修正2(2015/12/21 16:00): swiftks storage urlの指定方法について、別記事で指摘がありました。独自ドライバを作らなくても良いみたいですので、こちらを見てstorage urlを設定してみてください。(http://qiita.com/hikaru_uchiyama/items/504b7e5e75f747c12366)

「ConoHaのVMでUbuntu 14.04を使ってs3qlでSwift Object Storageをマウントする」というタイトルなんですけど、なんでs3qlとかいうと、このfuseマウントの特徴は、下記の感じになります。

pros
- 最新版はpython3ベースで動く
- tLarge fileをサポートしている
- 書き込み、読み込みキャッシュをするので基本的にマウントする環境(cache)のdiskの速度に依存する
- 後で中身を実際に見ますが、オブジェクトはs3qlのdata形式で転送されるので、中身はマウントしないとわからない
- マウントしている環境のcacheやencryptの仕組みに依存するので、複数のサーバでのマウントをサポートしていない(自分は未検証、仕組み的に同時に書き込んだりはできないことはわかる)
- マウントした領域をCIFSとかFTPで共有すことでgatewayとして利用できる

cons
- cacheやメタデータの処理をapswとsqlite3に依存しているので、このデータを保存しているホストでしかマウントできない
- (s3ql自体が、複数台構成やHA構成などを考慮していない? メタデータのバックアップ、リストアで復元可能かどうか要検討)

ということで、初日に hironobu_s さんがSwiftFsとは別のメリット、デメリットが有ります。

CIFS領域としてsambaで共有して、ファイルサーバのgatewayとして使うには良いかんじです。
(keystoneとsambaがユーザ情報共有している環境など、工夫して、sambaのユーザのhome dirでpreexecとかすると、ユーザごとにアカウントのswiftをマウントするとかできそうな気もします)

他にもgatewayとしてswiftに対して動作するものはありますが、cacheするopensource実装はほとんど無いですね。s3ql + sambaみたいに使うのは動作の軽さも含めてすごく合理的です。

手前味噌ですが、vmつくるところの詳しくは、gihyo.jpの私の記事とかをみてもらってもいいかも。
http://gihyo.jp/dev/serial/01/conoha/0005
第5回 OpenStack APIを使ったCLI操作をConoHaでやってみる

以下、手順といった感じを記載します。

s3ql環境構築とインストール

べつにCentOS 6.7とかでも良いんですけど、python3の環境を作りやすく、パッケージでインストールしやすいUbuntu 14.04をつかいます。

openstackコマンドでimage listでubuntu 14.04をさがす

OSのイメージファイルの確認をします。

shell
$ openstack image list -f csv 2>/dev/null | grep ubuntu
"ee695cb6-10dc-447d-8c97-f0bc54750e44","vmi-docker-1.8-ubuntu-14.04"
"ae6c182a-27e8-43d4-b36d-fabe2eb016f1","vmi-ubuntu-12.04-i386"
"e31d6093-afe9-41d0-a958-c21da36141fb","vmi-ubuntu-12.04-amd64"
"0477b6db-ef5b-4fa9-8ce7-ce85773425cd","vmi-ubuntu-14.04-i386"
"a87dfe9f-a8a4-4634-9a40-dbeba7ee7013","vmi-ubuntu-14.04-amd64"
"b3b42464-01c0-49bb-b360-ad4f46024775","vmi-drone-0.3-ubuntu-14.04"

ubuntu 14.04の amd64 とか選択します

vmつくるので、flavor list (1gbでいいよね)

作成するプランの確認をします

shell
$ openstack flavor list -f csv 2>/dev/null

"ID","Name","RAM","Disk","Ephemeral","VCPUs","Is Public"
"294639c7-72ba-43a5-8ff2-513c8995b869","g-2gb",2048,50,0,3,True
"3aa001cd-95b6-46c9-a91e-e62d6f7f06a3","g-16gb",16384,50,0,8,True
"62e8fb4b-6a26-46cd-be13-e5bbf5614d15","g-4gb",4096,50,0,4,True
"7eea7469-0d85-4f82-8050-6ae742394681","g-1gb",1024,50,0,2,True
"965affd4-d9e8-4ffb-b9a9-624d63e2d83f","g-8gb",8192,50,0,6,True
"a20905c6-3733-46c4-81cc-458c7dca1bae","g-32gb",32768,50,0,12,True
"c2a97b05-1b4b-4038-bbcb-343201659279","g-64gb",65536,50,0,24,True

さきにセキュリティグループを作っておく

外からは、sshだけで良いのでssh接続を許可するセキュリティ設定を作ります。
コマンドだけ貼ります。

ingress tcp port 22を許可します。

shell
$ neutron security-group-create ssh-works --description "allow ssh connect"

$ neutron security-group-rule-create --direction ingress --ethertype IPv4 \
  --protocol tcp --port-range-min 22 --port-range-max 22 ssh-works -f value

確認(無理にyamlで出力w)

shell
$ neutron security-group-show ssh-works -f yaml
- {Field: description, Value: allow ssh connect}
- {Field: id, Value: 8ac76c8f-f4b6-4cdf-972c-1c01feadef9e}
- {Field: name, Value: ssh-works}
- {Field: security_group_rules, Value: "{\n     \"remote_group_id\": null, \n    \
    \ \"direction\": \"ingress\", \n     \"remote_ip_prefix\": null, \n     \"protocol\"\
    : \"tcp\", \n     \"tenant_id\": \"aefde53ff77d4c8bba639b26ccff55fc\", \n    \
    \ \"port_range_max\": 22, \n     \"security_group_id\": \"8ac76c8f-f4b6-4cdf-972c-1c01feadef9e\"\
    , \n     \"port_range_min\": 22, \n     \"ethertype\": \"IPv4\", \n     \"id\"\
    : \"0c60065e-7ca1-47a3-9d50-4f907cbba0a3\"\n}\n{\n     \"remote_group_id\": null,\
    \ \n     \"direction\": \"egress\", \n     \"remote_ip_prefix\": null, \n    \
    \ \"protocol\": null, \n     \"tenant_id\": \"aefde53ff77d4c8bba639b26ccff55fc\"\
    , \n     \"port_range_max\": null, \n     \"security_group_id\": \"8ac76c8f-f4b6-4cdf-972c-1c01feadef9e\"\
    , \n     \"port_range_min\": null, \n     \"ethertype\": \"IPv4\", \n     \"id\"\
    : \"2eb23b65-e3f7-48bf-bfc4-2ef04d93d014\"\n}\n{\n     \"remote_group_id\": null,\
    \ \n     \"direction\": \"egress\", \n     \"remote_ip_prefix\": null, \n    \
    \ \"protocol\": null, \n     \"tenant_id\": \"aefde53ff77d4c8bba639b26ccff55fc\"\
    , \n     \"port_range_max\": null, \n     \"security_group_id\": \"8ac76c8f-f4b6-4cdf-972c-1c01feadef9e\"\
    , \n     \"port_range_min\": null, \n     \"ethertype\": \"IPv6\", \n     \"id\"\
    : \"887e34da-760a-4739-bdd6-b2bd191dc950\"\n}"}
- {Field: tenant_id, Value: aefde53ff77d4c8bba639b26ccff55fc}

public keyは事前に登録しておいてください

わたしは、ssh public keyは際にConoHaのwebコンパネでさきに登録しています。

ここでは、”my-local-key” を使いますので確認

shell
$ openstack keypair list -f csv 2>/dev/null
"Name","Fingerprint"
"apps-key-2015-06-17-21-00","74:a3:4f:79:92:da:5d:58:a5:0b:50:3f:5f:ed:d5:b8"
"my-local-key","6c:49:66:fa:67:7c:20:e6:b5:e9:75:5a:40:51:b2:5b"

サーバ作成

openstackコマンドだと、サーバ作成はこうなります。

shell
$ openstack server create --image vmi-ubuntu-14.04-amd64 --flavor g-1gb \
  --key-name my-local-key --security-group ssh-works \
  --property "instance_name_tag=s3ql_repos" new-server -f value

実行はこんな感じ

shell
$ openstack server create --image vmi-ubuntu-14.04-amd64 --flavor g-1gb \
  --key-name my-local-key --security-group ssh-works \
  --property "instance_name_tag=s3ql_repos" new-server -f value

MANUAL
nova

cn-a13008.g2.sjc1.v4
sjc1-00004ec4
0
None
building
None
None



Fg@qYejp5
True
2015-12-12T14:12:44Z
g-1gb (7eea7469-0d85-4f82-8050-6ae742394681)

510d823c-8098-4bba-bdf0-caf4d099d2cc
vmi-ubuntu-14.04-amd64 (a87dfe9f-a8a4-4634-9a40-dbeba7ee7013)
my-local-key
163-44-113-90
[]
0
aefde53ff77d4c8bba639b26ccff55fc

もちろん、ConoHaのコンパネから作成してもOKです。

ssh loginしてs3qlのセットアップ

Ubuntu公式からは python 2.7で動く古いs3ql v1.16しか入っていません。
http://www.ubuntuupdates.org/package/core/trusty/universe/proposed/s3ql

s3qlの最新版はpython3のスレッドモデルに最適化されているので、PPAで別物を呼び出します。
その前に、ssh loginして、apt情報更新

shell
$ ssh root@v163-44-112-214.a009.g.sjc1.static.cnode.io

root@163-44-112-214:~# aptitude update

もし、s3ql 1.16とか入っていたら、使ってないなら削除しちゃいます

shell
n-gohko@helium-conoha:~$ dpkg -l s3ql
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                           Version                      Architecture                 Description
+++-==============================================-============================-============================-=================================================================================================
ii  s3ql                                           1.16-1                       amd64                        Full-featured file system for online data storage

n-gohko@helium-conoha:~$ sudo aptitude remove s3ql
The following packages will be REMOVED:
  libcrypto++9{u} libjs-jquery{u} libjs-sphinxdoc{u} libjs-underscore{u} python-apsw{u} python-llfuse{u} python-lzma{u} python-pycryptopp{u} python-support{u} s3ql

PPA登録(ppa:nikratio/s3ql)

個別メンテナーで作っている人がいるので、PPAで利用します
https://launchpad.net/~nikratio/+archive/ubuntu/s3ql

いかのコマンドでPPAを追加します
sudo add-apt-repository ppa:nikratio/s3ql

実際はこんな感じ

shell
n-gohko@helium-conoha:~$ sudo add-apt-repository ppa:nikratio/s3ql
 Ubuntu packages of S3QL (http://code.google.com/p/s3ql/). The PPA also contains backported versions of all dependencies for which the version in the Ubuntu archive is too old for use with S3QL.
 More info: https://launchpad.net/~nikratio/+archive/ubuntu/s3ql
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmpbjizpp9z/secring.gpg' created
gpg: keyring `/tmp/tmpbjizpp9z/pubring.gpg' created
gpg: requesting key 9958C967 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpbjizpp9z/trustdb.gpg: trustdb created
gpg: key 9958C967: public key "Launchpad S3QL" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK
root@163-44-112-214:~#

conoha swift object storage s3ql

s3qlをOpenStack Swiftで使う話は検索すると意外に出てこない
https://dev.cloudwatt.com/en/blog/s3ql-on-cloudwatt-openstack-plateform.html

参照URL (1)

http://www.rath.org/s3ql-docs/manual.pdf

参照URL (2)
なので、とりあえず、インストールしてからソースを見ながら試行錯誤することになる
(swift s3ql Softlayer, swift s3ql Rackspaceなどのキーワードで検索すると、ひょっとしたら出てくるかもしれない)

https://launchpad.net/~nikratio/+archive/ubuntu/s3ql
(Adding this PPA to your system を見て、14.04LTSの場合、Trusty (14.04)をプルダウンから選択)

以下のコマンドを実行

shell
sudo add-apt-repository ppa:nikratio/s3ql

PPAを追加後、インストール

shell
sudo aptitude update && aptitude install s3ql

python3でインストールされる

shell
n-gohko@helium-conoha:~$ sudo aptitude install s3ql
The following NEW packages will be installed:
  libgmp10{a} libjs-jquery{a} libjs-sphinxdoc{a} libjs-underscore{a} python3-apsw{a} python3-chardet{a} python3-crypto{a} python3-defusedxml{a} python3-dugong{a} python3-llfuse{a} python3-pkg-resources{a}
  python3-requests{a} python3-six{a} python3-urllib3{a} s3ql
0 packages upgraded, 15 newly installed, 0 to remove and 27 not upgraded.
Need to get 1445 kB/1611 kB of archives. After unpacking 6698 kB will be used.
Do you want to continue? [Y/n/?] y

確認、2.15が入っていれば大丈夫

shell
n-gohko@helium-conoha:~$ dpkg -l | grep s3ql
ii  s3ql                                                  2.15+dfsg-1~36~ubuntu14.04.1                        amd64        Full-featured file system for online data storage
n-gohko@helium-conoha:~$ mkfs.s3ql --version
S3QL 2.15

openstack client 入れる

shell
sudo apt-get install ubuntu-cloud-keyring

juno指定のpkgの場合、いれる、入れない場合には、ubuntuのリポジトリ内部からopenstack clientを入れることになる

とりあえず、junoのcloud archiveを使います。

shell
echo "deb http://ubuntu-cloud.archive.canonical.com/ubuntu trusty-updates/juno main" > /etc/apt/sources.list.d/cloudarchive-juno.list

swiftのclientは個別に入れる

あとで、swiftコンテナの作成と内容の確認に使います

shell
n-gohko@helium-conoha:~$ sudo aptitude search swiftclient
i   python-swiftclient                                                                                            - Client library for Openstack Swift API.

OSC(OpenStack client)をいれる

さきほどjunoのaptリポジトリを設定したので、junoで入ります。
clientなので、最新を入れてもいいんですけどね。

shell
n-gohko@helium-conoha:~$ sudo aptitude install python-openstackclient
以下の新規パッケージがインストールされます:
  python-cinderclient{a} python-cliff{a} python-cliff-doc{a} python-cmd2{a} python-glanceclient{a} python-json-patch{a} python-json-pointer{a} python-jsonpatch{a} python-jsonschema{a} python-keyring{a} python-mock{a}
  python-novaclient{a} python-openstackclient python-pyparsing{a} python-secretstorage{a} python-warlock{a}
0 個のパッケージを更新、 16 個を新たにインストール、 0 個を削除予定、1 個が更新されていない。
578 k バイトのアーカイブを取得する必要があります。 展開後に 4,707 k バイトのディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] y
取得: 1 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-pyparsing all 2.0.1+dfsg1-1build1 [34.3 kB]
取得: 2 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-cmd2 all 0.6.7-2fakesync1build1 [22.2 kB]
取得: 3 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-json-pointer all 1.0-2build1 [5,158 B]
取得: 4 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-jsonpatch all 1.3-4 [9,088 B]
取得: 5 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-json-patch all 1.3-4 [2,312 B]
取得: 6 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-mock all 1.0.1-3 [23.8 kB]
取得: 7 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-jsonschema all 2.3.0-1build1 [27.2 kB]
取得: 8 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-warlock all 1.1.0-0ubuntu2 [5,278 B]
取得: 9 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main python-cinderclient all 1:1.0.8-0ubuntu2 [72.4 kB]
取得: 10 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-cliff all 1.4.5-1ubuntu2 [16.7 kB]
取得: 11 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-keyring all 3.5-1 [51.8 kB]
取得: 12 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main python-novaclient all 1:2.17.0-0ubuntu1.2 [140 kB]
取得: 13 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-glanceclient all 1:0.12.0-0ubuntu1 [34.1 kB]
取得: 14 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe python-openstackclient all 0.3.0-1ubuntu1 [81.1 kB]
取得: 15 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main python-secretstorage all 2.0.0-1ubuntu1.1 [11.7 kB]
取得: 16 http://jp.archive.ubuntu.com/ubuntu/ trusty/main python-cliff-doc all 1.4.5-1ubuntu2 [40.8 kB]
578 kB を 0秒 秒で取得しました (831 kB/s)
以前に未選択のパッケージ python-pyparsing を選択しています。
(データベースを読み込んでいます ... 現在 321845 個のファイルとディレクトリがインストールされています。)
.../python-pyparsing_2.0.1+dfsg1-1build1_all.deb を展開する準備をしています ...
python-pyparsing (2.0.1+dfsg1-1build1) を展開しています...
以前に未選択のパッケージ python-cmd2 を選択しています。
.../python-cmd2_0.6.7-2fakesync1build1_all.deb を展開する準備をしています ...
<<<<<<<<<<<< snip >>>>>>>>>>>>
man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ...
doc-base (0.10.5) のトリガを処理しています ...
doc-base ファイルを 1 個追加 を処理中...
python-pyparsing (2.0.1+dfsg1-1build1) を設定しています ...
python-cmd2 (0.6.7-2fakesync1build1) を設定しています ...
python-json-pointer (1.0-2build1) を設定しています ...
python-jsonpatch (1.3-4) を設定しています ...
update-alternatives: /usr/bin/jsondiff (jsondiff) を提供するために 自動モード で /usr/bin/python2-jsondiff を使います
update-alternatives: /usr/bin/jsonpatch (jsonpatch) を提供するために 自動モード で /usr/bin/python2-jsonpatch を使います
python-json-patch (1.3-4) を設定しています ...
python-mock (1.0.1-3) を設定しています ...
python-jsonschema (2.3.0-1build1) を設定しています ...
python-warlock (1.1.0-0ubuntu2) を設定しています ...
python-cinderclient (1:1.0.8-0ubuntu2) を設定しています ...
python-cliff (1.4.5-1ubuntu2) を設定しています ...
python-keyring (3.5-1) を設定しています ...
python-novaclient (1:2.17.0-0ubuntu1.2) を設定しています ...
python-glanceclient (1:0.12.0-0ubuntu1) を設定しています ...
python-openstackclient (0.3.0-1ubuntu1) を設定しています ...
python-secretstorage (2.0.0-1ubuntu1.1) を設定しています ...
python-cliff-doc (1.4.5-1ubuntu2) を設定しています ...

n-gohko@helium-conoha:~$

これで、インストールはここまで

s3ql 設定とHack (plugin作成)

ここから設定と、設定のためのカスタマイズ(必要悪)

swiftにアクセスして入れ物のコンテナを作る

tokyoリージョンでswiftコマンドで入れ物を作ります。
後で、内容物を確認します。

この辺りを参考にしてください
https://www.conoha.jp/conoben/archives/2648

shell
n-gohko@helium-conoha:~$ swift list 
expandrive
win-hp-backup

n-gohko@helium-conoha:~$ swift post s3ql_pool

n-gohko@helium-conoha:~$ swift list
expandrive
s3ql_pool
win-hp-backup

"s3ql_pool" という入れ物(コンテナ)を作りました

ローカルコンフィグdir作成

fuseマウントですので、user環境でマウントされます。
rootでマウントする場合には、rootのユーザに設定します。

私は、"n-gohko"でマウントしました。rsyncでのhome directory(Dropboxを含む)のバックアップに使っているので、そのような使い方には通常使っているユーザのほうがよいですね。

configとcacheのディレクトリをマウントするユーザHomeに "~/.s3ql" を作成します。

shell
n-gohko@helium-conoha:~$ mkdir ~/.s3ql && install -b -m 600 /dev/null ~/.s3ql/authinfo2

s3qlでマウントする場所を作っておきます。

shell
$ mkdir -p ~/mnt/s3ql

(うまくいかなかった)s3ql swiftksコンフィグ作成

本来ならば、swiftのコンフィグはswiftksというタイプのstorage-urlで設定するのですが、なんかうまく行きませんでした。

参照URL (1) にある設定では

shell
n-gohko@helium-conoha:~$ cat ~/.s3ql/authinfo2
[swift]
backend-login: <tenant_name>:<username>
backend-password: <password>
storage-url: swiftks://identity.fr1.cloudwatt.com/fr1:<container_s3ql>

という感じで設定されています。

ConoHa swift object storageだと、次のようになるはずなんですけど、うまく動きませんでした。

shell
n-gohko@helium-conoha:~$ cat .s3ql/authinfo2
[swift]
backend-login: gnct59999999:gncu59999999
backend-password: hogenaisho
storage-url: swiftks://identity.tyo1.conoha.io/tyo1/:s3ql_pool

うまくいかなかった内容について調べてみると、swiftks(keystone auth v2.0)の設定を動かしているのは、s3qlのbackendドライバで設定されています。

swiftksでパッケージのファイルを検索すると、下記のファイルが見つかります。

shell
n-gohko@helium-conoha:~$ dpkg -L s3ql | grep swiftks
/usr/lib/s3ql/s3ql/backends/swiftks.py

開くと、次に示す "_pase_storage_url()" のところに正規表現でstorage-urlを分解しているのですが、ここでうまくいかない感じ。

shell
n-gohko@helium-conoha:~$ cat -n /usr/lib/s3ql/s3ql/backends/swiftks.py | head -n 57 | tail -n 31
    27
    28      @copy_ancestor_docstring
    29      def _parse_storage_url(self, storage_url, ssl_context):
    30
    31          hit = re.match(r'^[a-zA-Z0-9]+://' # Backend
    32                         r'([^/:]+)' # Hostname
    33                         r'(?::([0-9]+))?' # Port
    34                         r'/([a-zA-Z0-9._-]+):' # Region
    35                         r'([^/]+)' # Bucketname
    36                         r'(?:/(.*))?$', # Prefix
    37                         storage_url)
    38          if not hit:
    39              raise QuietError('Invalid storage URL', exitcode=2)
    40
    41          hostname = hit.group(1)
    42          if hit.group(2):
    43              port = int(hit.group(2))
    44          elif ssl_context:
    45              port = 443
    46          else:
    47              port = 80
    48          region = hit.group(3)
    49          containername = hit.group(4)
    50          prefix = hit.group(5) or ''
    51
    52          self.hostname = hostname
    53          self.port = port
    54          self.container_name = containername
    55          self.prefix = prefix
    56          self.region = region
    57
shell
n-gohko@helium-conoha:~$ mkfs.s3ql --plain --authfile ~/.s3ql/authinfo2 \
  --debug swiftks://identity.tyo1.conoha.io/tyo1/:s3ql_pool
2015-12-13 04:00:12.492 15887 MainThread s3ql.backends.common.get_ssl_context: Reading default CA certificates.
2015-12-13 04:00:12.493 15887 MainThread root.excepthook: Invalid storage URL

という感じで、うまくいかない、うう。
rackspaceのアカウントではうまくいったので、エラーのstorage urlのところで詰まっているだろうとおもったのです。

いろいろやったのですが、Hackで切り抜けることにします。

(Hack) conohaswiftというstorage URLをrackspaceの複製して作る

ここで、面倒になったので、conohaswiftというstorage pluginを作って使えるようにします。

backendのストレージプラグインはgrepするとbackendsという場所に入っていることがわかります。

shell
n-gohko@163-44-112-214:~$ dpkg -L s3ql | grep backends
/usr/share/doc/s3ql/html/_sources/backends.txt
/usr/share/doc/s3ql/html/backends.html
/usr/lib/s3ql/s3ql/backends
/usr/lib/s3ql/s3ql/backends/gs.py
/usr/lib/s3ql/s3ql/backends/rackspace.py
/usr/lib/s3ql/s3ql/backends/s3.py
/usr/lib/s3ql/s3ql/backends/s3c.py
/usr/lib/s3ql/s3ql/backends/swift.py
/usr/lib/s3ql/s3ql/backends/common.py
/usr/lib/s3ql/s3ql/backends/local.py
/usr/lib/s3ql/s3ql/backends/pool.py
/usr/lib/s3ql/s3ql/backends/__init__.py
/usr/lib/s3ql/s3ql/backends/swiftks.py
/usr/lib/s3ql/s3ql/backends/comprenc.py

rackspace classは、swiftks classをそのまま呼んでいて、"_pase_storage_url()" のところでswiftksの認証を上書きしています。
なので、これに習って、conohaswift.py というドライバファイルを rackspace.py の複製として作って、storage URLのパースをスキップします。

shell
n-gohko@163-44-112-214:~$ pushd /usr/lib/s3ql/s3ql/backends/
/usr/lib/s3ql/s3ql/backends ~

n-gohko@163-44-112-214:/usr/lib/s3ql/s3ql/backends$ sudo cp -avf rackspace.py conohaswift.py
sudo: unable to resolve host 163-44-112-214
[sudo] password for n-gohko:
'rackspace.py' -> 'conohaswift.py'

バツクエンドの中身

shell
n-gohko@163-44-112-214:/usr/lib/s3ql/s3ql/backends$ ls -l
total 180
-rw-r--r-- 1 root root   634 Sep 18 08:42 __init__.py
drwxr-xr-x 2 root root  4096 Dec 12 06:44 __pycache__
-rw-r--r-- 1 root root 22827 Sep 18 08:42 common.py
-rw-r--r-- 1 root root 33419 Sep 28 20:09 comprenc.py
-rw-r--r-- 1 root root  1232 Sep 18 08:42 conohaswift.py
-rw-r--r-- 1 root root  9859 Sep 18 08:42 gs.py
-rw-r--r-- 1 root root 10241 Sep 28 20:09 local.py
-rw-r--r-- 1 root root  1872 Sep 18 08:42 pool.py
-rw-r--r-- 1 root root  1232 Sep 18 08:42 rackspace.py
-rw-r--r-- 1 root root  6270 Sep 18 08:42 s3.py
-rw-r--r-- 1 root root 37709 Sep 28 20:09 s3c.py
-rw-r--r-- 1 root root 19233 Sep 18 08:42 swift.py
-rw-r--r-- 1 root root  4736 Sep 18 08:42 swiftks.py

conohaswift.pyの中身は次のようになります。

/usr/lib/s3ql/s3ql/backends/conohaswift.py
'''
conohaswift.py - this file is part of S3QL.

Copyright © 215 n-gohko

This work can be distributed under the terms of the GNU GPLv3.
'''

from ..logging import logging, QuietError # Ensure use of custom logger class
from . import swiftks
from ..inherit_docstrings import copy_ancestor_docstring
import re

log = logging.getLogger(__name__)

class Backend(swiftks.Backend):
    """A backend to store data in ConoHa swift Object Storage"""

    @copy_ancestor_docstring
    def _parse_storage_url(self, storage_url, ssl_context):

        hit = re.match(r'^conohaswift://' # Backend
                       r'([^/:]+)' # Region
                       r'/([^/]+)' # Bucketname
                       r'(?:/(.*))?$', # Prefix
                       storage_url)
        if not hit:
            raise QuietError('Invalid storage URL', exitcode=2)

        region = hit.group(1)
        containername = hit.group(2)
        prefix = hit.group(3) or ''

        if ssl_context:
            port = 443
        else:
            port = 80
        port = 443

        self.hostname = 'identity.tyo1.conoha.io'
        self.port = port
        self.container_name = containername
        self.prefix = prefix
        self.region = region

backends のロードの設定に追加するために、”__init__.py” ファイルを修正します。

/usr/lib/s3ql/s3ql/backends/__init__.py
'''
backends/__init__.py - this file is part of S3QL.

Copyright © 2008 Nikolaus Rath <Nikolaus@rath.org>

This work can be distributed under the terms of the GNU GPLv3.
'''

from . import local, s3, gs, s3c, swift, rackspace, swiftks, conohaswift

#: Mapping from storage URL prefixes to backend classes
prefix_map = { 's3': s3.Backend,
               'local': local.Backend,
               'gs': gs.Backend,
               's3c': s3c.Backend,
               'swift': swift.Backend,
               'conohaswift': conohaswift.Backend,
               'swiftks': swiftks.Backend,
               'rackspace': rackspace.Backend }

__all__ = [ 'common', 'pool', 'comprenc' ] + list(prefix_map.keys())

(Hack:2) conohaswiftというstorage URLで接続する

書き換えたので、マウントするユーザのディレクトリに戻って、設定ファイルを書き換えます。

shell
n-gohko@163-44-112-214:~$ cat .s3ql/authinfo2
[swift]
backend-login: gnct59999999:gncu59999999
backend-password: hogenaisho
storage-url: conohaswift://tyo1/s3ql_pool

mkfs.s3qlを実行します。”--debug”オプションは動作確認のためなので、
mkfs.s3ql --plain --authfile ~/.s3ql/authinfo2 conohaswift://tyo1/s3ql_poo
みたいな感じで良いです。

shell
n-gohko@163-44-112-214:~$ mkfs.s3ql --plain --authfile ~/.s3ql/authinfo2 --debug conohaswift://tyo1/s3ql_pool
2015-12-13 04:43:17.027 15989 MainThread s3ql.backends.common.get_ssl_context: Reading default CA certificates.
2015-12-13 04:43:17.027 15989 MainThread s3ql.backends.swift._do_request: started with 'GET', '/', None, {'limit': 1}, None, None
2015-12-13 04:43:17.027 15989 MainThread s3ql.backends.swift._do_request: no active connection, calling _get_conn()
2015-12-13 04:43:17.027 15989 MainThread s3ql.backends.swiftks._get_conn: started
<< snip >>
2015-12-13 04:43:21.904 15989 MainThread s3ql.backends.swift.open_write: started with s3ql_seq_no_1
2015-12-13 04:43:21.904 15989 MainThread s3ql.backends.s3c.close: started with s3ql_seq_no_1
2015-12-13 04:43:21.904 15989 MainThread s3ql.backends.swift._do_request: started with 'PUT', '/s3ql_seq_no_1', None, None, CaseInsensitiveDict({'Content-Type': 'application/octet-stream', 'X-Object-meta-002': "'encryption': 'None',", 'X-Object-meta-format': 'raw2', 'X-Object-meta-001': "'compression': 'LZMA',", 'X-Object-meta-003': "'format_version': 2,", 'X-Object-meta-000': "'data': b'eyAgfQ==',", 'X-Object-meta-md5': '1UH6aTHbuVf1fhc0/H8WUA=='}), <_io.FileIO name=6 mode='rb+'>
2015-12-13 04:43:21.905 15989 MainThread s3ql.backends.swift._do_request_inner: started with PUT /v1/nc_aefde53ff77d4c8bba639b26ccff55fc/s3ql_pool/s3ql_seq_no_1
2015-12-13 04:43:21.905 15989 MainThread s3ql.backends.swift._do_request_inner: waiting for 100-continue
2015-12-13 04:43:22.030 15989 MainThread s3ql.backends.swift._do_request_inner: writing body data
n-gohko@163-44-112-214:~$

Hackで作ったあらたなstorage urlでマウントします。
mount.s3ql conohaswift://tyo1/s3ql_pool ~/mnt/s3ql

shell
n-gohko@163-44-112-214:~$ mount.s3ql  conohaswift://tyo1/s3ql_pool ~/mnt/s3ql
Using 4 upload threads.
Autodetected 4052 file descriptors available for cache entries
Using cached metadata.
Setting cache size to 33058 MB
Mounting filesystem...

マウントされていることを確認
```bash:shell

n-gohko@163-44-112-214:~$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 50442940 5542204 42315344 12% /
none 4 0 4 0% /sys/fs/cgroup
udev 497964 12 497952 1% /dev
tmpfs 101748 388 101360 1% /run
none 5120 0 5120 0% /run/lock
none 508736 0 508736 0% /run/shm
none 102400 0 102400 0% /run/user
conohaswift://tyo1/s3ql_pool 1073741824 0 1073741824 0% /home/n-gohko/mnt/s3ql
```

なにもコピーしていない状態

mkfs.s3qlでFormatして、マウントした状態で、swiftコンテナ”s3ql_pool”の中身を確認します。

shell
[n-gohko@163-44-112-214]$ swift list --lh s3ql_pool 2>/dev/null
 120 2015-12-13 12:43:21 s3ql_metadata
 120 2015-12-13 12:43:19 s3ql_metadata_new
  64 2015-12-13 12:43:21 s3ql_seq_no_1
  64 2015-12-13 12:46:15 s3ql_seq_no_2
 368

初期状態では、メタデータファイルだけあります。
mkfs.s3qlを”--plain”オプションを指定したことで、暗号化は無しです。

自分develディレクトリをrsyncする

では、rsyncで書き込んでみましょう。
手元の “~/devel” ディレクトリが 3.7GBぐいらあるので、書き込んでみます。
bash:shell
n-gohko@163-44-112-214:~$ du -hs devel
3.7G devel

rsync中にマウントされたディレクトリは次のように見えます。

shell
[n-gohko@163-44-112-214]$ ls -l ~/mnt/s3ql/
total 0
drwxrwxr-x 1 n-gohko n-gohko 0 Sep 28 20:31 devel
drwx------ 1 n-gohko n-gohko 0 Dec 13 04:43 lost+found

アカウント設定を先ほどおいた “~/.s3ql” ディレクトリの中身を見ると、次のようになります。

shell
[n-gohko@163-44-112-214]$ du -hs ~/.s3ql/*
4.0K    /home/n-gohko/.s3ql/authinfo2
68M     /home/n-gohko/.s3ql/conohaswift:=2F=2Ftyo1=2Fs3ql_pool-cache
1.8M    /home/n-gohko/.s3ql/conohaswift:=2F=2Ftyo1=2Fs3ql_pool.db
4.0K    /home/n-gohko/.s3ql/conohaswift:=2F=2Ftyo1=2Fs3ql_pool.params
4.0K    /home/n-gohko/.s3ql/mount.log
0       /home/n-gohko/.s3ql/mount.s3ql_crit.log

cacheディレクトリは転送のcache、.dbファイルはsqliteファイルです。
実は、この仕組で、ファイルを管理しているのが、このdbなので、このdbをマルチノードで共有アクセスできるようにすれば、複数のノードでアクセスするようにできるのかなと思いました。

shell
[n-gohko@163-44-112-214]$ file ~/.s3ql/conohaswift:=2F=2Ftyo1=2Fs3ql_pool.db
/home/n-gohko/.s3ql/conohaswift:=2F=2Ftyo1=2Fs3ql_pool.db: SQLite 3.x database

パラメータファイル .params はテキストにjsonで書いてあるみたいですね
bash:shell
[n-gohko@163-44-112-214]$ file ~/.s3ql/conohaswift:=2F=2Ftyo1=2Fs3ql_pool.params
/home/n-gohko/.s3ql/conohaswift:=2F=2Ftyo1=2Fs3ql_pool.params: ASCII text, with no line terminators

rsyncの途中で du とかも取れます。
bash:shell
n-gohko@163-44-112-214:~$ du -hs ~/mnt/s3ql/devel
1.7G /home/n-gohko/mnt/s3ql/devel

メタデータとオブジェクトデータに別れてデータが転送される。
データオブジェクト単体では、そのままでは、どれがどれかはわからないですね。
メタデータファイルもあります。

shell
[n-gohko@163-44-112-214]$ swift list --lh s3ql_pool  2>/dev/null | grep -v '_data_'
 120 2015-12-13 12:43:21 s3ql_metadata
 120 2015-12-13 12:43:19 s3ql_metadata_new
  64 2015-12-13 12:43:21 s3ql_seq_no_1
  64 2015-12-13 12:46:15 s3ql_seq_no_2
1.1G

dataファイルはたくさんなので、ちょっとだけ

shell
[n-gohko@163-44-112-214] $ swift list --lh s3ql_pool  2>/dev/null | grep  '_data_' | head -n 3
 116 2015-12-13 12:55:30 s3ql_data_1
746K 2015-12-13 12:55:35 s3ql_data_10
 79K 2015-12-13 12:56:36 s3ql_data_100

s3qlのumountは、次のようにumount.s3ql を使います。
bash:shell
[n-gohko@163-44-112-214]$ umount.s3ql ~/mnt/s3ql
[n-gohko@163-44-112-214]$ ls -l ~/mnt/s3ql/
total 0

次にマウントされた時に、cacheサイズは更新されます。
bash:shell
n-gohko@163-44-112-214:~$ mount.s3ql conohaswift://tyo1/s3ql_pool ~/mnt/s3ql
Using 4 upload threads.
Autodetected 4052 file descriptors available for cache entries
Using cached metadata.
Setting cache size to 33052 MB
Mounting filesystem...
n-gohko@163-44-112-214:~$

いろいろdevelに入れていたので、日本語ファイル含めて転送。
とくに日本語のファイル名もそのまま。

結局、~/.s3ql/ ディレクトリにキャッシュされるので、ローカルディスクの速度が書き込み速度となる。

最後に

とりあえず、mountして、rsyncするところまでですが、組み合わせのインテグレーションや改修の内容はちょっと膨らみます。s3qlの開発の本家がどういう方向性でやっているのかも気になります。

この投稿は ConoHa Advent Calendar 201512日目の記事です。