最近のデジタルカメラはUSBでパソコンと接続するとハードディスクなどと同じようにマウントできてJPEG形式の画像ファイルが取り出せるようになっているものが多く、 その場合はマウントするだけ。 しかしカメラの機種によりうまくいかないこともあります。 たとえばOlympusのC-3040Z/4040Zは usb-storageドライバで扱えますが兄弟モデルのC-3030Zはそうはいかないらしい。 そういう場合でもlibusbとgPhoto2でOKかも。
必要なソフトは次の2つです。 この順番に導入します。
当サイトからダウンロードできるRPMはいずれもテストパッケージです。動作報告を募集しています。 (RPM / nosrc.rpmからの導入法は説明ページ)
Vine (2.5 以降)の 場合は /etc/sources.listで VinePlus が有効にされていると# apt-get install gtkamでこれら必要なパッケージがインストールされます。
この他にGQviewは画像の一覧表示ができて便利です。VinePlusにあります。
一般ユーザー権限でUSBデバイスを扱うためにはデバイスファイル所有者の変更が必要です。 Vine Linux 3.x では murasaki がUSBデバイスの脱着を監視していましたが、 Vine Linux 4.x では udevがそれを行っています。 Vine Linux 4.xなど udevを用いるシステムでUSBデバイスを扱いやすくするためには、次のソフトを導入してください。
ダウンロードしたディレクトリで、次のコマンドで usb-owner-0.1-0.noarch.rpmが作られます。
$ rpmbuild -tb usb-owner-*.tar.gz
「書き込み中:/home/tako/rpm/RPMS/i386/usb-owner-*.noarch.rpm」などというメッセージを見つけ、 これを root権限でインストールします。
$ su $ (パスワードを入力) # rpm -Uvh /home/tako/rpm/RPMS/i386/usb-owner-*.noarch.rpm
usb-ownerをインストールしていると、USB機器が接続されると自動的に、そのデバイスファイル(/dev/bus/usb/00?/00? など)の所有者を現在コンソールを使用しているユーザーに一致させます。
この章は murasakiを使った場合なので、 Vine Linux 4.xなど murasakiを使っていないシステムでは不要です。
ふつう一般ユーザー権限ではUSBデバイスを直接扱えません。 camera接続の後、root権限で
# chmod a+w /proc/bus/usb/001/*
とすればいちおうユーザー権限でも使えるようになるのですが…。 USBにカメラを接続したときこれが自動的に行えるよう工夫します。 実はgphoto2にはhotplugというデーモンを使う方法が考慮されています。 しかしHotPlugマネージャとして murasakiを採用する Vine Linux(2.5以降)では一工夫必要です。 上記 gphoto2-2.0-0.1.nosrc.rpmではhotplugとともにmurasakiにも対応していますが、 その仕組みについてちょっと解説します。
murasakiの設定ファイル群は /etc/murasakiディレクトリ以下にあります。 このうち murasaki.usbmap, murasaki.depend, murasaki.call が今回関係するファイルです。 USB機器が接続されるとmurasakiは機器のVendorIDとProductIDを取得して、まずmurasaki.usbmapを参照します。 必要ならば murasaki.depend も参照し必要なモジュールをロード、 このあと murasaki.callに 記載されたプログラムを起動します。 USBデバイスのパーミッションを変更するスクリプトを用意してmurasaki.callに登録しておけば目的の動作ができるはず。
OLYMPUSのVendorIDは0x07b4, C-3030ZのProductIDは0x0100です。これを例にとって説明します。
/etc/murasaki/murasaki.usbmapに次の行があります。
# E-10 [Olympus]
alias-sd 0x0003 0x07b4 0x0102 0x0 0x0 0x0 0x0 0x0 0x00 0x00 0x00 0x00000000
これをコピーして追加、次のように変更します
# C-3030Z [Olympus] usbcam 0x0003 0x07b4 0x0100 0x0 0x0 0x0 0x0 0x0 0x00 0x00 0x00 0x00000000
これをいろいろなカメラについて行えばよいのですが、
$ gphoto2 --print-usb-usermap
というコマンドにより、
gphoto2が対応するカメラすべてについて必要な行を出力してくれます。
これをそのままmurasaki.usbmap に追記すれば良いのですが、
そのためのスクリプトを作りました。
root権限で
# gphoto2 --print-usb-usermap | gphoto2-addmap /etc/murasaki/murasaki.usbmap
というコマンドでmurasaki.usbmapを更新します。このスクリプトでは重複行を避けるようにしています。
/etc/murasaki/murasaki.callに次の行を追記、あるいはmurasaki.callが存在しなければ新しく作成します。
usbcam: /etc/murasaki/bin/change_owner
これでスクリプト/etc/murasaki/bin/change_owner が起動される準備ができました。 このスクリプトはさきのようにUSBデバイスをすべて誰からでも書き込みできるよう設定するよう
#!/bin/bash
chmod a+w /proc/bus/usb/001/*
でも良いのですが、 もう少し凝ったスクリプトを用意しました。
murasakiはこのスクリプトをUSB機器が接続されたとき start 、外したときにstop を第1パラメーターにして呼出します。 chanege_owner start の形で呼ばれたとき、 接続されたUSB機器の番号を調べ、その所有者を そのときのコンソールの所有者に一致させます。
カメラを接続し電源を入れるとピッと音がします。
$ dmesg
...
usb.c: USB new device connect, assigned device number 2
usb.c: USB device 2 (prod/vend 0x7b4/0x100) is not claimed by any active driver.
とあって、OLYMPUSのVendorIDは0x07b4, 3030ZのProductIDは0x0100であることが分かります。
この他に
# tail /var/log/messages (root権限が必要です)
でmurasakiなどの出力や、
$ cat /proc/bus/usb/devices
などを参照しても分かります。