Shino's Bar

お家で使うLinux Tux

デジカメを扱う (gPhoto2編)

26 Apr 2007 (初出: 22 Jun 2002)

最近のデジタルカメラはUSBでパソコンと接続するとハードディスクなどと同じようにマウントできてJPEG形式の画像ファイルが取り出せるようになっているものが多く、 その場合はマウントするだけ。 しかしカメラの機種によりうまくいかないこともあります。 たとえばOlympusのC-3040Z/4040Zは usb-storageドライバで扱えますが兄弟モデルのC-3030Zはそうはいかないらしい。 そういう場合でもlibusbとgPhoto2でOKかも。

gPhoto2の導入

必要なソフトは次の2つです。 この順番に導入します。

  1. Downloadgphoto2-2.3.1-0.nosrc.rpm ... source(libgphoto2-2.3.1.tar.bz2, gphoto2-2.3.1.tar.bz2) from gPhoto2
  2. Downloadgtkam-0.1.14-0.nosrc.rpm source gtkam from gPhoto2

当サイトからダウンロードできるRPMはいずれもテストパッケージです。動作報告を募集しています。 (RPM / nosrc.rpmからの導入法は説明ページ)

Vine (2.5 以降)の 場合は /etc/sources.listで VinePlus が有効にされていると
# apt-get install gtkam
でこれら必要なパッケージがインストールされます。

この他にGQviewは画像の一覧表示ができて便利です。VinePlusにあります。

See 古いバージョン

udev下でのUSBデバイス所有者の変更

一般ユーザー権限でUSBデバイスを扱うためにはデバイスファイル所有者の変更が必要です。 Vine Linux 3.x では murasaki がUSBデバイスの脱着を監視していましたが、 Vine Linux 4.x では udevがそれを行っています。 Vine Linux 4.xなど udevを用いるシステムでUSBデバイスを扱いやすくするためには、次のソフトを導入してください。

Downloadusb-owner-0.1.tar.gz

ダウンロードしたディレクトリで、次のコマンドで 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によるUSBデバイス所有者の変更(gphoto2-2.0-0.3 パッケージに組込み済)

この章は 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のしくみ

murasakiの設定ファイル群は /etc/murasakiディレクトリ以下にあります。 このうち murasaki.usbmap, murasaki.depend, murasaki.call が今回関係するファイルです。 USB機器が接続されるとmurasakiは機器のVendorIDとProductIDを取得して、まずmurasaki.usbmapを参照します。 必要ならば murasaki.depend も参照し必要なモジュールをロード、 このあと murasaki.callに 記載されたプログラムを起動します。 USBデバイスのパーミッションを変更するスクリプトを用意してmurasaki.callに登録しておけば目的の動作ができるはず。

murasaki.usbへの追記

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を更新します。このスクリプトでは重複行を避けるようにしています。

murasaki.callへの追記あるいは作成

/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機器の番号を調べ、その所有者を そのときのコンソールの所有者に一致させます。

USB-IDを調べる法 (参考)

カメラを接続し電源を入れるとピッと音がします。
$ 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 などを参照しても分かります。

Links

ご意見、お問い合わせは Linux掲示板またはE-mail で マスターまで
Shino's Bar goto [シノバー店内案内] [MPEG最前線!] [お家で使うLinux]