‘Amazon S3’ タグのついている投稿

FUSEインストールからs3fsを使うまで(後編)

Amazon S3をマウントできるs3fsをちょっとカーネルバージョンが古いRHEL5で使う方法。後編。
前編はCentOS 5で試したので、ここからが本番。
でもCentOS 5の方はカーネル最新なんですよね。
あ、このサーバ、x86_64なんでコピペしようとする人は注意。いないだろうけど。

前回と同じようにwgetしてインストール。

# wget http://dl.atrpms.net/all/fuse-2.7.4-8_10.el5.x86_64.rpm
# wget http://dl.atrpms.net/all/fuse-libs-2.7.4-8_10.el5.x86_64.rpm
# wget http://dl.atrpms.net/all/fuse-devel-2.7.4-8_10.el5.x86_64.rpm
# wget http://dl.atrpms.net/all/fuse-kmdl-2.6.18-128.1.10.el5-2.7.4-8_10.el5.x86_64.rpm
# rpm -ivh fuse-2.7.4-8_10.el5.x86_64.rpm fuse-kmdl-2.6.18-128.1.10.el5-2.7.4-8_10.el5.x86_64.rpm fuse-devel-2.7.4-8_10.el5.x86_64.rpm fuse-libs-2.7.4-8_10.el5.x86_64.rpm
エラー: 依存性の欠如:
        /boot/vmlinuz-2.6.18-128.1.10.el5 は fuse-kmdl-2.6.18-128.1.10.el5-2.7.4-8_10.el5.x86_64 に必要とされています

あー、カーネルモジュールのバージョンを合わせないとダメなのね。

RHEL5のカーネルは2.6.18-92だったのでfuse-kmdl-2.6.18-92.1.10.el5-2.7.4-8_10.el5.x86_64.rpmというファイルが必要か。

が、fuse-kmdl-2.6.18-92.1.10.el5-2.7.4-8_10.el5.x86_64.rpmで検索すると、以前はあったらしい痕跡がうかがえるのだけど、ミラーも含めてどこにもない様子。

ということは、

ATrpms – by Distribution > Red Hat Enterprise Linux 5 > fuse

の最下段にあるSRPMからこの環境で作り直さないとダメってことね。

ではとりあえずダウンロード。

# wget http://dl.atrpms.net/all/fuse-2.7.4-8_10.src.rpm

で、rpmbuildでリビルド。

ちなみにもしrpmbuildがインストールされていなければyumでインストール。

# yum install rpm-build
# rpmbuild --rebuild fuse-2.7.4-8_10.src.rpm

何かエラーでリビルド失敗。(ログ取り忘れた…)

調べてみたら、どうやらSPECで使用するマクロが足りてないらしい。

で、そのマクロがどこにもない、と。

色々探していたら、そのものズバリではないけれど、そこそこ近いマクロを発見。

Re: Re: unable to compile srpms: msg#00034 linux.redhat.rpm.atrpms.devel

ここにあったMacroセットを適当に

# vim /etc/rpm/macros.fuse

で流し込んだ。ファイル名は適当に新規作成。macros.*ならいいらしいです。

ちなみにところどころ変な改行が入っているので注意。(マクロファイルは文末に添付します)

# rpmbuild --rebuild fuse-2.7.4-8_10.src.rpm
fuse-2.7.4-8_10.src.rpm をインストール中です。
警告: InstallSourcePackage: ヘッダ V4 DSA signature: NOKEY, key ID ********
エラー: 59 行目: 依存性を表す語は英数字か、'_'、'/' で始まらなければなりません: BuildRequires: %_kernelcompiler_rh5Server

む。%_kernelcompiler_rh5Serverがないって。では追加!

# vim /etc/rpm/macros.fuse
%_kernelcompiler_rh5Server /usr/bin/gcc

ちなみにCentOSではこっちが必要。

%_kernelcompiler_rh5 /usr/bin/gcc

このまま実行するとkernel-module-fuse-2.6.18-92.1.13.el5-2.7.4-8_10.x86_64.rpmとかいうファイル名になってしまうので、先にマクロを修正。

_oldとしてコメントアウトされていたのでそっちを使うように書き換え

%kmdl_name kernel-module-%{_kpkgname}-%{_kernel}
%kmdl_nameof() kernel-module-%1-%{_kernel}
%kmdl_namepure kernel-module-%{_kpkgname}
%kmdl_namepureof() kernel-module-%1
#_kmdl_name_old %{_kpkgname}-kmdl-%{_kernel}
#_kmdl_nameof_old() %1-kmdl-%{_kernel}
#_kmdl_name_old %{_kpkgname}-%{_kname3}-%{_kversion}
#_kmdl_nameof_old() %1-%{_kname3}-%{_kversion}
#_kmdl_namepure_old %{_kpkgname}-kmdl
#_kmdl_namepureof_old() %1-kmdl
↓
#%kmdl_name kernel-module-%{_kpkgname}-%{_kernel}
#%kmdl_nameof() kernel-module-%1-%{_kernel}
#%kmdl_namepure kernel-module-%{_kpkgname}
#%kmdl_namepureof() kernel-module-%1
#_kmdl_name_old %{_kpkgname}-kmdl-%{_kernel}
#_kmdl_nameof_old() %1-kmdl-%{_kernel}
%kmdl_name %{_kpkgname}-%{_kname3}-%{_kversion}
%kmdl_nameof() %1-%{_kname3}-%{_kversion}
%kmdl_namepure %{_kpkgname}-kmdl
%kmdl_namepureof() %1-kmdl

カーネルモジュールのビルドにはソースコードが必要らしいので、kernel-develパッケージが入っていない場合は入れておく必要あり。

# yum install kernel-devel
Package kernel-devel-2.6.18-92.1.13.el5.x86_64 installed and not available
Package kernel-devel-2.6.18-92.1.6.el5.x86_64 installed and not available
Package kernel-devel-2.6.18-92.1.10.el5.x86_64 installed and not available
Nothing to do

あれ…

# yum list installed |grep kernel
kernel.x86_64                              2.6.18-92.1.6.el5           installed
kernel.x86_64                              2.6.18-92.1.10.el5          installed
kernel.x86_64                              2.6.18-92.1.13.el5          installed
kernel-devel.x86_64                        2.6.18-92.1.6.el5           installed
kernel-devel.x86_64                        2.6.18-92.1.10.el5          installed
kernel-devel.x86_64                        2.6.18-92.1.13.el5          installed
kernel-doc.noarch                          2.6.18-92.1.13.el5          installed
kernel-headers.x86_64                      2.6.18-92.1.13.el5          installed
kernel-xen.x86_64                          2.6.18-92.1.6.el5           installed
kernel-xen.x86_64                          2.6.18-92.1.10.el5          installed
kernel-xen.x86_64                          2.6.18-92.1.13.el5          installed
kernel-xen-devel.x86_64                    2.6.18-92.1.6.el5           installed
kernel-xen-devel.x86_64                    2.6.18-92.1.10.el5          installed
kernel-xen-devel.x86_64                    2.6.18-92.1.13.el5          installed

入ってた。

一応確認。

# ll /usr/src/kernels/
合計 24
drwxr-xr-x 18 root root 4096  9月 17  2008 2.6.18-92.1.10.el5-x86_64
drwxr-xr-x 18 root root 4096  9月 17  2008 2.6.18-92.1.10.el5-xen-x86_64
lrwxrwxrwx  1 root root   29 11月 10  2008 2.6.18-92.1.10.el5xen-x86_64 -> 2.6.18-92.1.10.el5-xen-x86_64
drwxr-xr-x 18 root root 4096 10月 21  2008 2.6.18-92.1.13.el5-x86_64
drwxr-xr-x 18 root root 4096 10月 21  2008 2.6.18-92.1.13.el5-xen-x86_64
lrwxrwxrwx  1 root root   29 11月 10  2008 2.6.18-92.1.13.el5xen-x86_64 -> 2.6.18-92.1.13.el5-xen-x86_64
drwxr-xr-x 18 root root 4096  7月 18  2008 2.6.18-92.1.6.el5-x86_64
drwxr-xr-x 18 root root 4096  7月 18  2008 2.6.18-92.1.6.el5-xen-x86_64
lrwxrwxrwx  1 root root   28 11月 10  2008 2.6.18-92.1.6.el5xen-x86_64 -> 2.6.18-92.1.6.el5-xen-x86_64

では、FUSEをrpmbuild

# rpmbuild --rebuild fuse-2.7.4-8_10.src.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/fuse-kmdl-2.6.18-92.1.13.el5-2.7.4-8_10.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/fuse-debuginfo-2.7.4-8_10.x86_64.rpm

完了した。

できたRPMを作業ディレクトリに移動。

# mv /usr/src/redhat/RPMS/x86_64/fuse-kmdl-2.6.18-92.1.13.el5-2.7.4-8_10.x86_64.rpm .

では改めてゴー。

# rpm -ivh fuse-2.7.4-8_10.el5.x86_64.rpm fuse-kmdl-2.6.18-92.1.13.el5-2.7.4-8_10.x86_64.rpm fuse-devel-2.7.4-8_10.el5.x86_64.rpm fuse-libs-2.7.4-8_10.el5.x86_64.rpm
警告: fuse-2.7.4-8_10.el5.x86_64.rpm: ヘッダ V4 DSA signature: NOKEY, key ID ********
エラー: 依存性の欠如:
        fuse-kmdl-2.7.4-8_10.el5 は fuse-2.7.4-8_10.el5.x86_64 に必要とされています
        atrpms-kmdl-helper は fuse-kmdl-2.6.18-92.1.13.el5-2.7.4-8_10.x86_64 に必要とされています

orz

何だ?ファイル名合わせただけではいかんのか…

# rpm -qip fuse-kmdl-2.6.18-92.1.13.el5-2.7.4-8_10.x86_64.rpm
Name        : fuse-kmdl-2.6.18-92.1.13.el5  Relocations: (not relocatable)
Version     : 2.7.4                             Vendor: (none)
Release     : 8_10                          Build Date: 2009年06月17日 19時45分41秒
Install Date: (not installed)               Build Host: ***********
Group       : System Environment/Kernel     Source RPM: fuse-2.7.4-8_10.src.rpm
Size        : 829588                           License: GPL
Signature   : (none)
URL         : http://fuse.sf.net
Summary     : fuse kernel module.
Description :
With FUSE it is possible to implement a fully functional filesystem in a
userspace program. This package contains the FUSE kernel module.

This package contains the fuse-kmdl-2.6.18-92.1.13.el5 kernel modules for the Linux kernel package:
kernel-2.6.18-92.1.13.el5.x86_64.rpm.

おおおおお

Nameが違うYo…

めどい。直接Name固定しよう。

# vim /etc/rpm/macros.fuse
%kmdl_name %{_kpkgname}-kmdl-2.7.4-8_10.el5

再度rpmbuild。

# rpmbuild --rebuild fuse-2.7.4-8_10.src.rpm

で、結果。

# rpm -qip /usr/src/redhat/RPMS/x86_64/fuse-kmdl-2.7.4-8_10.el5-2.7.4-8_10.x86_64.rpm
Name        : fuse-kmdl-2.7.4-8_10.el5     Relocations: (not relocatable)
Version     : 2.7.4                             Vendor: (none)
Release     : 8_10                          Build Date: 2009年06月17日 21時02分15秒
Install Date: (not installed)               Build Host: ***********
Group       : System Environment/Kernel     Source RPM: fuse-2.7.4-8_10.src.rpm
Size        : 829588                           License: GPL
Signature   : (none)
URL         : http://fuse.sf.net
Summary     : fuse kernel module.
Description :
With FUSE it is possible to implement a fully functional filesystem in a
userspace program. This package contains the FUSE kernel module.

This package contains the fuse-kmdl-2.7.4-8_10.el5 kernel modules for the Linux kernel package:

おk

で、あとはatrpms-kmdl-helperとやらを入れればいいのか。

Re: atrpms-kmdl-helper error: msg#00013 linux.redhat.rpm.atrpms.general

atrpmsパッケージの中に入っているという話。

というわけでダウンロードしてインストール。

ATrpms – by Distribution > common > atrpms

# wget http://dl.atrpms.net/all/atrpms-73.1-1.noarch.rpm
# rpm -ivh atrpms-73.1-1.noarch.rpm

で、改めて。

# rpm -ivh fuse-2.7.4-8_10.el5.x86_64.rpm fuse-kmdl-2.7.4-8_10.el5-2.7.4-8_10.x86_64.rpm fuse-devel-2.7.4-8_10.el5.x86_64.rpm fuse-libs-2.7.4-8_10.el5.x86_64.rpm
準備中...                ########################################### [100%]
   1:fuse-libs              ########################################### [ 25%]
   2:fuse-kmdl-2.7.4-8_10.el########################################### [ 50%]
/var/tmp/rpm-tmp.52302: line 2: /usr/lib64/atrpms/addcustomkmdl: そのようなファイルやディレクトリはありません
   3:fuse                   ########################################### [ 75%]
   4:fuse-devel             ########################################### [100%]

…ん?大丈夫かな…?

# cd ~/s3fs
# make
g++ -ggdb -Wall -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse  -pthread -L/lib64 -lfuse -lrt -ldl    -L/usr/kerberos/lib64 -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz   -I/usr/include/libxml2 -lxml2 -lz -lm -lcrypto s3fs.cpp -o s3fs
s3fs.cpp: In function ‘std::string calc_signature(std::string, std::string, std::string, curl_slist*, std::string)’:
s3fs.cpp:426: 警告: value computed is not used
s3fs.cpp: In function ‘int put_local_fd(const char*, headers_t, int)’:
s3fs.cpp:759: 警告: format ‘%llu’ expects type ‘long long unsigned int’, but argument 4 has type ‘__off_t’
s3fs.cpp: In function ‘int s3fs_readlink(const char*, char*, size_t)’:
s3fs.cpp:852: 警告: 符合付きと符合無しの整数式同士の比較です
s3fs.cpp: At global scope:
s3fs.cpp:440: 警告: ‘size_t readCallback(void*, size_t, size_t, void*)’ defined but not used
ok!

よっしゃぁぁ!!

まぁ待て、まだあわてるほどじゃない。

# make install
g++ -ggdb -Wall -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse  -pthread -L/lib64 -lfuse -lrt -ldl    -L/usr/kerberos/lib64 -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz   -I/usr/include/libxml2 -lxml2 -lz -lm -lcrypto s3fs.cpp -o s3fs
s3fs.cpp: In function ‘std::string calc_signature(std::string, std::string, std::string, curl_slist*, std::string)’:
s3fs.cpp:426: 警告: value computed is not used
s3fs.cpp: In function ‘int put_local_fd(const char*, headers_t, int)’:
s3fs.cpp:759: 警告: format ‘%llu’ expects type ‘long long unsigned int’, but argument 4 has type ‘__off_t’
s3fs.cpp: In function ‘int s3fs_readlink(const char*, char*, size_t)’:
s3fs.cpp:852: 警告: 符合付きと符合無しの整数式同士の比較です
s3fs.cpp: At global scope:
s3fs.cpp:440: 警告: ‘size_t readCallback(void*, size_t, size_t, void*)’ defined but not used
ok!
cp -f s3fs /usr/bin

よし、では実行…

# cd /mnt/
# mkdir s3
# s3fs ***** -o accessKeyId=******************** -o secretAccessKey=**************************************** /mnt/s3
# cd s3/
# ll

合計 82577
---------- 1 root root  298359 12月 23  2007 0223279e4a09010bf1d55aed45de8b46.dat
---------- 1 root root  307441 12月 21  2007 02d452b8ee0809e601297e77e0d14fca.jpg
---------- 1 root root   64051  1月  4  2008 03739992ce7b38979b7fd71bfbdf5d30.zip

できた━(∀゚ )━(゚∀゚)━━━!!

せっかくなので使ったマクロファイルをアップしておきます。Name固定されてるので注意。
誰が使うんだって感じですけど。

macros.fuse


FUSEインストールからs3fsを使うまで(前編)

Amazon S3をファイルシステムとしてマウントできるという、s3fsを使ってみたくなったので挑戦。
http://code.google.com/p/s3fs/
対象のOSは

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.3 (Tikanga)

しかも2.6.18-92.1.13.el5(2009年6月12日現在で最新は2.6.18-128.1.10.el5)でx86_64。
この記事誰得…debianとかCentOSの人や、カーネルを最新にできる環境の人は多分さくっとaptだのyumだのすればいいかと。

いきなり本番サーバをいじるのは怖いので、同じ環境を構築しようとしたのですが、RHEL5とか手に入れようにも…
というわけで、テストはCentOS 5で。ちなみに、CentOSにはFUSEのyumが用意されてるらしいです。今回は使わないけど。

書いてたら長くなったので2エントリに分けます。
前編はCentOS 5にインストールしたメモ。あまり意味はないです。
後編はRHEL5にインストールしたメモ。本命です。

まずは目的のs3fsをダウンロード。

# wget http://s3fs.googlecode.com/files/s3fs-r177-source.tar.gz
# tar xvzf s3fs-r177-source.tar.gz
# cd s3fs
# make
s3fs.cpp:23:18: error: fuse.h: そのようなファイルやディレクトリはありません

FUSEがないと言われます。

rpmfindからRedHat EL5用のRPMを落としてきます。
FUSEを入れます。(※ここは失敗なのでやらないでください)

# wget ftp://rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/fuse-2.7.4-1.el5.rf.i386.rpm
# rpm -ivh fuse-2.7.4-1.el5.rf.i386.rpm
警告: fuse-2.7.4-1.el5.rf.i386.rpm: ヘッダ V3 DSA signature: NOKEY, key ID ********
準備中…                ########################################### [100%]
   1:fuse                   ########################################### [100%]

あ、ATrpmsに新しいのがあったのでアンインストール。

# rpm -e fuse-2.7.4-1.el5.rf

FUSEをインストールするのに参考にしたサイト:SysAdmin’s Diary : Simple Steps To Mount NTFS In RHEL 5

で、目的の最新のFUSEはここ。
ATrpms – by Distribution > Red Hat Enterprise Linux 5 > fuse

# wget http://dl.atrpms.net/all/fuse-2.7.4-8_10.el5.i386.rpm
# wget http://dl.atrpms.net/all/fuse-libs-2.7.4-8_10.el5.i386.rpm
# wget http://dl.atrpms.net/all/fuse-devel-2.7.4-8_10.el5.i386.rpm
# wget http://dl.atrpms.net/all/fuse-kmdl-2.6.18-128.1.10.el5-2.7.4-8_10.el5.i686.rpm
# rpm -ivh fuse-2.7.4-8_10.el5.i386.rpm
警告: fuse-2.7.4-8_10.el5.i386.rpm: ヘッダ V4 DSA signature: NOKEY, key ID ********
エラー: 依存性の欠如:
        fuse-kmdl-2.7.4-8_10.el5 は fuse-2.7.4-8_10.el5.i386 に必要とされています

あ、いっぺんにインストールしないとダメなのね。

# rpm -ivh fuse-2.7.4-8_10.el5.i386.rpm fuse-kmdl-2.6.18-128.1.10.el5-2.7.4-8_10.el5.i686.rpm fuse-devel-2.7.4-8_10.el5.i386.rpm fuse-libs-2.7.4-8_10.el5.i386.rpm

で、FUSEのインストールは成功。

改めてs3fsをmake&make install

# make
g++ -ggdb -Wall -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse  -pthread -L/lib -lfuse -lrt -ldl    -L/usr/kerberos/lib -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz   -I/usr/include/libxml2 -L/usr/lib -lxml2 -lz -lm -lcrypto s3fs.cpp -o s3fs
s3fs.cpp:440: 警告: ‘size_t readCallback(void*, size_t, size_t, void*)’ defined but not used
ok!
# make install
g++ -ggdb -Wall -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse  -pthread -L/lib -lfuse -lrt -ldl    -L/usr/kerberos/lib -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz   -I/usr/include/libxml2 -L/usr/lib -lxml2 -lz -lm -lcrypto s3fs.cpp -o s3fs
s3fs.cpp:440: 警告: ‘size_t readCallback(void*, size_t, size_t, void*)’ defined but not used
ok!
cp -f s3fs /usr/bin

…何か単純なmakeだな。
とりあえず成功。

では続いてマウントを実行。

# mkdir /mnt/s3
# s3fs ***** -o accessKeyId=******************** -o secretAccessKey=**************************************** /mnt/s3

成功も失敗も出ないけど、成功しているらしい。
最初の*****はバケット名ね。

# cd /mnt/s3
# ll
ls: reading directory .: 入力/出力エラーです
合計 0

ん、何も出ない…

エラーの詳細も何も出ないので他のツールで試してみることに。
s3cmdというのを試してみる。
s3cmdのあとに続けてlsだのコマンドを打つことでバケットにアクセスできるツールらしい。

参考にしたサイトはこちら。
ks: Amazon S3用のコマンドラインツールs3cmd
http://ks.typepad.jp/blog/2009/01/amazon-s3s3cmd-.html

# cd /etc/yum.repos.d/
# wget http://s3cmd.org/repo/CentOS_5/s3tools.repo
# yum install s3cmd
# s3cmd –configure

ここで諸々設定を行う。まぁ、アクセスキーと秘密アクセスキーとか以外はすごい勢いでハイハイ言っておけばOK。
で、設定できたので実行。

# s3cmd ls

あー、ローカルの時間が違いすぎるみたいなことを言われた(ログ取るの忘れた)のでntpで時間合わせ

# date
2009年  6月 12日 金曜日 18:09:57 JST
# ntpdate 192.168.0.1
12 Jun 17:54:37 ntpdate[4372]: step time server 192.168.0.1 offset -956.022080 sec
# s3cmd ls

で、s3cmdの方は成功。

つまりそういうことか。

# cd /mnt/s3
# ll

合計 82577
———- 1 root root  298359 12月 23  2007 0223279e4a09010bf1d55aed45de8b46.dat
———- 1 root root  307441 12月 21  2007 02d452b8ee0809e601297e77e0d14fca.jpg
———- 1 root root   64051  1月  4  2008 03739992ce7b38979b7fd71bfbdf5d30.zip
できた━(∀゚ )━(゚∀゚)━━━!!