7.6. 画像スキャナ

寄稿: Marc Fonvieille.

7.6.1. はじめに

FreeBSD では、画像スキャナに対するアクセスは SANE (Scanner Access Now Easy) API によって実現されており、 FreeBSD Ports Collection でも提供されています。 SANE はスキャナのハードウェアにアクセスするために FreeBSD デバイスドライバを使用します。

FreeBSD は SCSI 接続および USB 接続のスキャナのどちらにも対応しています。 設定を始める前に、 SANE がスキャナに対応しているか確認してください。 SANE には スキャナについての情報とその状況がまとめられている 対応デバイスの一覧 があります。FreeBSD 8.X より前のシステムでは、 FreeBSD の uscanner(4) マニュアルページにも対応 USB スキャナの一覧が記載されています。

7.6.2. カーネルのコンフィグレーション

前述のように、FreeBSD はスキャナのインタフェースとして SCSI と USB の両方に対応しています。 スキャナのインタフェースによって、必要となるドライバが異なります。

7.6.2.1. USB インタフェース

GENERIC カーネルにはデフォルトで USB スキャナに対応するためのデバイスドライバが搭載されています。 カスタムカーネルを使用する際には、 以下の行がカーネルコンフィグレーションファイルにあることを 確認してください。

device usb
device uhci
device ohci
device ehci

FreeBSD 8.X より前のシステムでは以下の行も必要となります。

device uscanner

このバージョンの FreeBSD では、uscanner(4) デバイスドライバが USB スキャナへのアクセスを提供しています。 FreeBSD 8.0 以降では、libusb(3) ライブラリが直接提供します。

適切なドライバを組み込んだカーネルで再起動後、 USB スキャナをシステムに接続します。 すると、メッセージバッファ (dmesg(8)) にスキャナが認識されたことを示すメッセージが出力されます。

ugen0.2: <EPSON> at usbus0

FreeBSD 7.X システムでは、 以下のようなメッセージが出力されます。

uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2

これらの例では、使用している FreeBSD のバージョンに応じて、 スキャナが /dev/ugen0.2 または、/dev/uscanner0 デバイスノードを使用していることがわかります。 この例では、EPSON Perfection® 1650 USB スキャナが使われています。

7.6.2.2. SCSI インタフェース

スキャナに付属しているインタフェースが SCSI であれば、 重要なのはどの SCSI ボードを使用すればよいか把握することです。 使用する SCSI チップセットによって、 カーネルコンフィグレーションファイルを調整する必要があります。 GENERIC カーネルは 一般に使用される SCSI コントローラのほとんどに対応しています。 NOTES ファイルを読んで、 適切な行をカーネルコンフィグレーションファイルに追加してください。 また、SCSI アダプタドライバに加えて、 以下の行をカーネルコンフィグレーションファイルに 記述する必要があります。

device scbus
device pass

カーネルを適切にコンパイルしてインストールすると、 システムの起動時にデバイスがメッセージバッファに出力されるはずです。

pass2 at aic0 bus 0 target 2 lun 0
pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device
pass2: 3.300MB/s transfers

システムを起動する際にスキャナの電源を入れてなければ、 camcontrol(8) コマンドを使用して SCSI バスをスキャンし、 以下のように手動でデバイスを検出させることもできます。

# camcontrol rescan all
Re-scan of bus 0 was successful
Re-scan of bus 1 was successful
Re-scan of bus 2 was successful
Re-scan of bus 3 was successful

すると、スキャナは SCSI デバイスの一覧に現れるでしょう。

# camcontrol devlist
<IBM DDRS-34560 S97B>              at scbus0 target 5 lun 0 (pass0,da0)
<IBM DDRS-34560 S97B>              at scbus0 target 6 lun 0 (pass1,da1)
<AGFA SNAPSCAN 600 1.10>           at scbus1 target 2 lun 0 (pass3)
<PHILIPS CDD3610 CD-R/RW 1.00>     at scbus2 target 0 lun 0 (pass2,cd0)

SCSI デバイスについての詳細は、scsi(4) および camcontrol(8) のマニュアルページをご覧ください。

7.6.3. SANE の設定

SANE システムは、 二つの部分、すなわちバックエンド (graphics/sane-backends) とフロントエンド (graphics/sane-frontends) に分割されています。 バックエンドはスキャナそのものに対するアクセスを提供します。 SANE対応デバイスの一覧 には、どのバックエンドが画像スキャナに対応しているかが記載されています。 デバイスを使用するためには、正しいバックエンドを決定するのは必須です。 また、フロントエンドはグラフィカルなスキャニングインタフェース (xscanimage) を提供します。

はじめに、 graphics/sane-backends の port または package をインストールしましょう。 次に、sane-find-scanner コマンドを使用して、 SANE システムで使用するバックエンドを検出します。

# sane-find-scanner -q
found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3

この出力から、 スキャナインタフェースの種類と システムに接続されているスキャナが使用するデバイスノードがわかります。 ベンダ名や製品のモデル名は表示されないかも知れませんが、 重要ではありません。

Note: USB スキャナではファームウェアを読み込む必要がある場合があります。 これはバックエンドのマニュアルページで説明されています。 sane-find-scanner(1)sane(7) のマニュアルページも読んでください。

スキャナがフロントエンドで認識されるか調べてみましょう。 デフォルトでは、SANE のバックエンドには scanimage(1) と呼ばれるコマンドラインツールが付属します。 このコマンドを使用すると、 デバイスの一覧を表示したり画像を取得することができます。 -L オプションを使うと、 スキャナデバイスの一覧が出力されます。

# scanimage -L
device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner

また、Section 7.6.2.1 で使用した USB スキャナの例では、以下の出力が得られるでしょう。

# scanimage -L
device 'epson2:libusb:/dev/usb:/dev/ugen0.2' is a Epson GT-8200 flatbed scanner

これは、FreeBSD 8.X システムでの出力例であり、 'epson2:libusb:/dev/usb:/dev/ugen0.2' から、 使用しているスキャナのバックエンド名 (epson2) とデバイスノード (/dev/ugen0.2) の情報を得ることができます。

Note: 何も出力が得られなかったり、 スキャナが見つからなかったというメッセージが表示されたら、 scanimage(1) はスキャナを認識できなかったのでしょう。 このような場合は、バックエンドの設定ファイルを編集し、 使用するスキャナデバイスを定義する必要があります。 /usr/local/etc/sane.d/ ディレクトリには、 バックエンドが使用するすべての設定ファイルがあります。 このデバイスの認識による問題は、 特定の USB スキャナで発生するものです。

たとえば、 Section 7.6.2.1 で使用した USB スキャナは、 FreeBSD 8.X において正常に認識され動作します。 しかし、それより前のバージョンの (uscanner(4) ドライバを利用する) FreeBSD では、 sane-find-scanner コマンドを実行すると、以下のような情報が得られます。

# sane-find-scanner -q
found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0

スキャナは正しく検出されました。 USB インタフェースを使用し、 /dev/uscanner0 デバイスノードに接続されていることがわかります。 次に、スキャナが正しく認識されているかどうか確認してみましょう。

# scanimage -L

No scanners were identified. If you were expecting something different,
check that the scanner is plugged in, turned on and detected by the
sane-find-scanner tool (if appropriate). Please read the documentation
which came with this software (README, FAQ, manpages).

スキャナが認識されなかったので、 /usr/local/etc/sane.d/epson2.conf ファイルを編集する必要があります。 このスキャナのモデルは EPSON Perfection 1650 なので、 epson2 バックエンドを使用すればいいことがわかります。 バックエンドの設定ファイルに書かれているコメントを必ず読んでください。 設定ファイルを変更するのは非常に簡単です。 使用しているスキャナには不適切なインタフェースをすべてコメントアウトし (今回の場合は、USB インタフェースを使用するので scsi という語で始まる行をすべてコメントアウトします)、 ファイルの末尾に使用するインタフェースとデバイスノードを追加します。 この例では、以下の行を追加しました。

usb /dev/uscanner0

詳細と使用すべき構文は、 バックエンドのマニュアルページはもちろんのこと、 バックエンドの設定ファイルに書かれているコメントも読んでください。 以上の設定で、スキャナが認識されたかどうかを確認できます。

# scanimage -L
device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner

USB スキャナが認識されました。 ブランドやモデルがスキャナに一致しなかったとしても、それほど重要ではありません。 着目すべきは `epson:/dev/uscanner0' という部分で、 バックエンド名とデバイスノードが正しく認識されていることがわかります。

scanimage -L コマンドを実行してスキャナが認識されたことがわかれば、設定は終了です。 デバイスはスキャンする準備ができました。

scanimage(1) コマンドを使用すると コマンドラインから画像を取得することができます。その一方で、 GUI を使用して画像を取得できると一層良いでしょう。 SANE は、簡素ですが役に立つグラフィカルなインタフェース xscanimage (graphics/sane-frontends) を提供しています。

Xsane (graphics/xsane) はもう一つのグラフィカルなスキャニングフロントエンドで、 人気があります。 Xsane には、さまざまなスキャニングモード (写真、FAX など)、 色補正、バッチスキャンなど先進的な機能があります。 これらのアプリケーションの両方とも GIMP のプラグインとして使用することができます。

7.6.4. 他のユーザがスキャナにアクセスすることを許可する

前述の操作には、 すべて root 権限が必要となります。 しかしながら、他のユーザがスキャナに アクセスできるようにすることも可能です。 そのためには、スキャナが使用するデバイスノードへの 読み込み権限と書き込み権限をユーザに与えます。 一例として、USB スキャナが、/dev/ugen0.2 デバイスノードを使用しているものとします。 このデバイスノードは、 /dev/usb/0.2.0 へのシンボリックリンクです (/dev ディレクトリを調べると、 簡単に確認できます)。 シンボリックリンクとデバイスノードは、 それぞれ wheel および operator グループが所有しています。 ユーザ joe を これらのグループに加えると、彼はスキャナを使用できるようになります。 もちろん、ユーザをどんなグループ (特にグループ wheel) に追加する時はいつでも、 セキュリティ上の理由から二度は検討を行うべきです。 良い方法は、USB デバイスを利用するためにグループを作成し、 このグループに対してスキャナデバイスを利用できるようにすることです。

例として、usb という名前のグループを使用します。 まず最初に、pw(8) コマンドを使ってグループを作成します。

# pw groupadd usb

その後、シンボリックリンク /dev/ugen0.2 および、/dev/usb/0.2.0 デバイスノードに対して、 usb グループが利用できるように適切な許可属性 (0660 または 0664) を設定する必要があります。 デフォルトでは、これらのファイルの所有者 (root) のみが書き込み可能です。 /etc/devfs.rules に次の行を追加してください。

[system=5]
add path ugen0.2 mode 0660 group usb
add path usb/0.2.0 mode 0666 group usb

FreeBSD 7.X のユーザは、デバイスノード /dev/uscanner0 に対し、 以下のような行の追加が必要となるでしょう。

[system=5]
add path uscanner0 mode 660 group usb

次に、/etc/rc.conf に以下の行を追加して システムを再起動します。

devfs_system_ruleset="system"

/etc/devfs.rules で設定した内容についての詳細は、devfs(8) のマニュアルページをご覧ください。

最後に、スキャナを利用するユーザを usb グループに追加します。

# pw groupmod usb -m joe

詳細については、pw(8) のマニュアルページをご覧ください。