‘Linux’ カテゴリーのアーカイブ

FON2202でスナップショットを撮影する

La Fonera 2.0、FON2202を使ってUVCのデバイスからスナップショットをキャプチャする企画完結編。

一連のエントリは以下。

  1. FON2202にDEVELOPERファームを入れてSSHアクセスできるようにする
  2. FON2202に、Webカメラを複数接続する

まずUVCからスナップショットを撮る目的のプログラムを探してみると、そのままずばりなuvccaptureというソフトを発見。

ソースを見てみると、結構簡単。これなら動かすのに修正が必要でも何とかなるかな、と。

あ、ちなみにストリーミング配信したいだけなら、パッケージがすでにあるのでfonera.beから探してください。

今回はそこそこ綺麗な画質で数秒おきに画像が撮りたいニーズなんで、上記のuvccaptureを使うことに。

使ったのはuvccapture-0.5.tar.bz2

で、uvccaptureをFonera本体でコンパイルすればいいかなーとか思ってたのだけれども、どうにも開発環境がどこに入ったのかわからない。

あ、上記のfonera.beからgccとか入れてみたんですけれどもね?

じゃあということで、VirtualPC 2007上に構築したDebian(lenny)でクロスコンパイルすることに。

Debian上には、以前OpenWRTをmake worldしようとして途中で失敗して放置しっぱなしの環境が。

でもmips-linux-gccとかはディスク上に見つかったので、どうやらこれで行けるっぽい。

ここまで構築したい人は以下のサイト参照。

build fon-ng

色々やってよくわからなくなったetchと、これのために新規にインストールしたlennyで試してみたけど、どちらも成功しませんでした。

etchの方はlibdigest-crc-perlが古かったらしく、CPANからDigest::CRCをインストールしたらもう少し進んだけど。

ちなみに隣にいたUbuntu使いに頼んでやってみてもらったら全部通ったらしいです。謎。

確認してないけど、svnからcheckoutしてくればいいだけの気がする。

で、さっそくuvccaptureのクロスコンパイル開始。

とりあえず基礎知識を仕入れる。Makefileの環境変数の意味だけ確認しておこう。

porting_0_lesson2 – PukiWiki

作業用のディレクトリを作成

$ cd ~/fonera/trunk/openwrt/
$ mkdir test
$ cd test/

FON用のgccはここに入ってる。

trunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2/bin/mips-linux-gcc

uvccaptureにはlibjpegが必要になるので、aptitudeで…と言いたくなるのですが、mips-linux-gcc用にインストールしないといけないので、今回はソースから。

参考にしたサイトはLinkStation-Debianテストサイト::2008年12月10日の、libjpegの項。

ほぼそのまんまですけど一応書いておきます。

あ、PATHを通すのを忘れずに。

$ export PATH=~/fonera/trunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2/bin:$PATH
$ wget ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
$ tar xvzf jpegsrc.v6b.tar.gz
$ cd jpeg-6b/
$ ./configure –build=i686-linux –host=mips-linux –enable-shared –prefix=~/fonera/trunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2/

で、できあがったMakefileを手で修正。

$ vi Makefile

CC=mips-linux-gcc
AR=mips-linux-ar rc
の2行だけ直せばOK。これってconfigure時点で設定できないのかなぁ。わからんけど。

その後の手順も参考サイトの通りに

$ make CC=mips-linux-gcc
$ make install

でOK。make installするのにsudoする必要はなし。

これでtrunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2/lib/にlibjpeg関連のファイルが一通り入る。

というところでuvccaptureのmakeに移る。

$ cd ~/fonera/trunk/openwrt/test/
$ wget http://staticwave.ca/source/uvccapture/uvccapture-0.5.tar.bz2
$ tar xjf uvccapture-0.5.tar.bz2
$ cd uvccapture-0.5/

こちらはすでにMakefileがあるので、書き換えてやるところから。

CC=mips-linux-gcc
PREFIX=~/fonera/trunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2

CPP書き換えるの忘れたままコンパイルしちゃったけど、通ったので問題なし。

書き換えるなら多分CPP=mips-linux-g++かな。

installしないので、PREFIXとか書き換える必要あるのか不明。

で、

$ make

成功すればuvccaptureというファイルが同じところに作成される。

で、これをFON本体に転送する。面倒なので、Apache起動してHTTP経由で転送する。

$ sudo aptitude install apache2
$ sudo cp uvccapture /var/www/

併せてlibjpeg.so.62というファイルが実行に必要なので、それもコピーする。

$ sudo cp ../../staging_dir/toolchain-mips_gcc4.1.2/lib/libjpeg.so.62 /var/www/

ここまででdebian側の作業は終了!

FONのSSHに戻って作業を続けます。あと少し。

FON側からはDebianのIP指定してファイルをwgetで取ってくればOK。

# cd ~
# wget http://192.168.0.x/uvccapture
# wget http://192.168.0.x/libjpeg.so.62
# mv libjpeg.so.62 /lib/

で、

# ./uvccapture

で、
snap.jpgができたー!ヽ(´ー`)ノ

# ./uvccapture -h

でヘルプ出せます。

2台目のカメラにアクセスしたいときは/dev/video1を指定してやればOK。

# ./uvccapture -d/dev/video1 -osnap1.jpg -x960 -y720

とかすれば、2台目のカメラから960×720でスナップショットを撮影して、snap1.jpgというファイルに保存できます。

思ったより処理も遅くないので使えそう。

ちなみに960×720よりも大きい解像度で撮影しようとすると、YUYVフォーマットに変更するらしいのだけど、試しに1280×960にしてみたら問答無用でFONが落ちたのでもうやりません。

YUYVフォーマットモードは-mオプションでも指定可能。YUYVにするだけなら落ちない。-qオプションでJPEG圧縮率変更するとYUYVになります。

以下は全滅の例。

# ./uvccapture -d/dev/video1 -osnap1.jpg -x1280 -y960 -q60
# ./uvccapture -d/dev/video1 -osnap1.jpg -x1600 -y1200 -m -q30
# ./uvccapture -d/dev/video1 -osnap1.jpg -x2304 -y1728 -q30 -v

あとuvccapture、便利なことにインターバル撮影機能も付いてます。撮影したあとに指定したコマンドも実行できるという。

これでファイルPOSTすればいいってことですな。uvccaptureをふたつ起動してしまうと同期取れないのでその辺はちょっとこれから改造。

しかしこれは結構遊べるなぁ。コンセント差すだけで動くリモートWebカメラを作りたい。


FON2202に、Webカメラを複数接続する

前回( FON2202にDEVELOPERファームを入れてSSHアクセスできるようにする )の続き。

複数のカメラをFONに接続して、定期的に写真を撮ってサーバにPOSTするというのをやりたかったので、まずは複数のカメラを認識するのか調べるところからスタート。

FON2202のUSBポートはひとつなので、ハブを繋げてみることにする。

使ったUSBハブはサンワサプライの2ポートの小型USB2.0ハブ。USB-HUB213

で、カメラはLogicool Qcam 9000 Proを2台。まぁ、いつもの。

このカメラはUVC(USB Video Class)対応なので、特別なドライバがなくても認識するのね。

ではまぁ、さくっとやっちゃいましょう。接続するだけなので。

接続してちょっと待ってから、SSHでデバイスをチェック。

# ls /dev/

リストの中に
video0
video1
とあったので成功!あとはここから画像キャプチャするだけ!



FON2202にDEVELOPERファームを入れてSSHアクセスできるようにする

La Fonera 2.0ことFON2202で何かするシリーズ第一弾。

とりあえずSSHでアクセスできるようにするべく、OpenWRTをインストール。

…と行きたかったが、どうにもkamikazeのbuildもうまく行かず、時間もないので、とりあえず開発版のFONのファームウェアを入れることにした。

方法は以下のサイト参照。

Narururuのにっき: La Fonera 2.0 DEVELOPER

今回入れたのは、20090421_FON2202_2.2.5.0_Flipper_DEVELOPER.tar.gz

プラグインのところ、本気で気付かなくて、3回もファームウェア転送してしまった…あぁ…1時間半…

しかもとにかく再起動に時間がかかるのね。

で、めでたく緑色の管理画面が見られるようになったらSSHでアクセス。

PuTTYでもいいし、WinSCPでSCPも使えるよ。SFTPは使えないのでそこだけ注意。

2009-08-11 追記

ファームウェアを転送後、30分のカウントが終わった後、強制的に電源を抜いてリセットしたりしないで、そのまま管理画面トップページを再度開けばいいだけだった模様。そうすると、Internet側の接続が何かとか(もしかしたらInternet側が繋がってなかったために聞かれたのかも)、新しいパスワードを入力しろとかが、緑の画面上で出てきます。ちなみに新しいパスワードは8文字以上で、数字が含まれていないとSSHがオープンにならないと言われます。

で、ウィザード形式で答えていくと、パスワード入力画面が出て管理画面に入れます。この時点ではまだSSHにアクセスできないので、Settings→System→Rebootと進めば電源なんか一度も触らずにSSH開放まで行けます。


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
できた━(∀゚ )━(゚∀゚)━━━!!