Vine Linux 6.1で、スキャナ(Epson GT-S600)を使う
またまた、お久な更新となってしまいました。
今回は、表題の通り、Vine Linux 6.1上で、スキャナを使うのが目的。
押し入れを整理していたら、昔使っていたEpson GT-S600というエントリーモデルのスキャナが発掘されたので、LANサーバーであるVine鯖機上でLAN共有できないかなー、と思ったのがきっかけ。
では、さっそく、つらつらと試行錯誤記を綴りたいと思います。
情報収集(参考サイト)
とりあえず、ぐぐって、情報を集める。
- 参考サイト一覧
- <?chocolife> Ubuntu8.10でちょっと古めのスキャナEPSON GT-S600を使う
- Kernel 2.6以降で Image Scan! for Linux をUSB接続でご利用のお客様へ|ニュースリリース|アヴァシス株式会社
- Sane (日本語) - ArchWiki
- EPSON「Image Scan! for Linux」マニュアル(EPSON Download Centerより「GT-S600」で検索してダウンロード)
皆様、ありがとうございます。
libtoolのインストール
いきなり話が前後してしまうが、Saneをソースからビルドするために必要なツールで、apt-getからパッケージインストールすると、Saneビルド時にエラーになってしまうので、このツールもソースからビルドした。
ソースファイルダウンロード
GNU Libtoolから最新版をダウンロード(libtool-2.4.2.tar.gz)」。
展開・ビルド
特に考えることなく、展開、ビルド。
- 展開
# tar xzf libtool-2.4.2.tar.gz
- ビルド
# ./configure # make # make install
Saneのインストール
2013/04/11現在、Vineのapt-getで得られるSaneパッケージバージョンは、
「sane-1.0.21-1vl6.i686.rpm」。
ただ、これだとどうもうまく動かない(もしかしたら何か設定が抜けてるだけかもしれないけど)。
どう動かないか、具体的にメモしておくと、「scanimage -L」コマンドを実行した時に、スキャナが見つからない。
よって、Saneはソースからビルドすることにした。
ソースファイルダウンロード
SANE - Scanner Access Now Easyから、
現在の最新バージョン「sane-backends-1.0.23.tar.gz」をダウンロード。
3つのファイルに分割されているので、すべてダウンロードしてから結合。
結合するためのコマンドラインは、同じところからダウンロード出来るREADME.txtに書いてあるとおり。
# cat sane-backends-1.0.23.tar.gz.[1-3] > sane-backends-1.0.23.tar.gz
展開・ビルド
- 展開
# tar xzf sane-backends-1.0.23.tar.gz
- ビルド
- ちょいとconfigureオプションを加えた。特にsysconfdir指定は、後のエプソン社ドライバと整合を持たせるため。
# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var # make # make install
EPSON製Linuxドライバのインストール
Saneは、単独でもスキャナを駆動してくれるのだが、
EPSONのGTシリーズスキャナは基本未対応。なので、EPSON社製の純正ドライバをインストールする必要がある。
各種ファイルダウンロード
EPSON Download Centerから、「GT-S600」と検索ワードをいれ、OS種別をLinuxにして検索。
すると、iscanパッケージ(Image Scan! for Linuxという純正スキャナソフト&ドライバ)、そして、GT-S600専用プラグインの2種類が候補として挙がる。
今回ダウンロードするものは、iscanパッケージの、
- iscan-2.29.1-5.usb0.1.ltdl7.i386.rpm
- iscan-data-1.22.0-1.noarch.rpm
そして、専用プラグインの
- iscan-plugin-gt-s600-2.1.2-1.i386.rpm
の3つをダウンロードする。なお、64bitOSを使っている場合や、CPUが別の場合などは、対応するファイルを落とすと良い。
インストール
rpmパッケージになっているので、rpmコマンドで楽ちんインストール。
(余談だが、不安定時にどこが悪いか探すのに、これらファイルもソースビルドを試した)
依存関係があるので、インストール順番は大事・・・なんだけど、Saneがソースビルドなので、結局エラーになる。
(rpm自作すれば良いんだろうけどね・・・、やったことないんだよね・・・)
とりあえず、インストールは次の通り。
$ rpm --upgrade iscan-data-1.22.0-1.noarch.rpm $ rpm --upgrade --nodeps iscan-2.29.1-5.usb0.1.ltdl7.i386.rpm $ rpm --upgrade iscan-plugin-gt-s600-2.1.2-1.i386.rpm
- 前述のとおり、iscanをインストールするときのみ、
エラー: 依存性の欠如: sane-backends は iscan-2.29.1-5.usb0.1.ltdl7.i386 に必要とされています
と怒られてしまうので、--nodepsオプションを付けて強制実行。
- この時点で、root権限にて、scanimageコマンドを実行すると、認識しているはず。
# scanimage -L device `epkowa:interpreter:001:002' is a Epson GT-S600/GT-F650 flatbed scanner
各種設定ファイルの編集
Saneドライバ設定ファイル(/etc/sane.d/dll.conf)
GT-S600のみを使用する場合は、「epkowa」以外は使用しない。
なので、他の行は先頭に#をつけてコメントアウトするか、削除してしまう。
(本来、iscan-2.29.1-5.usb0.1.ltdl7.i386.rpmパッケージをインストールした時に、コメントアウトスクリプトが走るのだが、強制インストールのため動かないようだ)
必要ないものが有効になっていても構わないが、余計なドライバを探しに行くため、スキャナを探す時に動作が遅くなることがあるようだ。
Sanedデーモン設定ファイル(/etc/sane.d/saned.conf)
その名の通り、デーモン設定ファイル。
スーパーサーバー(inetd or xinetd)から起動する時のお約束が書いてある。
LAN内からスキャナを共有する場合は、非常に重要な設定ファイル。
1.データ送受信ポート範囲設定
- ここで指定されたポート番号を使って、スキャンしたデータをリアルタイムで送受信する。
- すなわち、このポートがファイアーウォールなどで塞がっていると、ネット経由でスキャン指示をしたとき、スキャナ操作ソフト(Xsaneなど)、スキャナ本体ともに、フリーズする。
- デフォルトでコメントアウトされているので、ファイアーウォールが有効なサーバーにスキャナを接続し、かつLAN共有させたい場合は、アンコメントする。
- 上記の理由は、この設定値がコメントアウト状態、すなわち未定義の場合、ランダムでポート番号が選ばれるため、ファイアーウォールでポートを開けることができなくなるため。
- ここで指定したポート番号は、ファイアーウォール通過できるようにしておくこと。
- 「portrange」という設定項目名の通り、1ポートのみオープンなどはできない模様(例: data_portrange = 10000)。
- んじゃ、「data_portrange = 10000 - 10000」ってやればいいんじゃね?ってやると、Sanedがすぐにポート開放してくれるわけもないので、連続プレビュー・スキャンができない(スキャナ操作ソフト側でI/Oエラーが出る)。
- よって、ある程度のポート番号幅は持たせたほうが良い模様(私自身も模索中)。
## Daemon options # Port range for the data connection. Choose a range inside [1024 - 65535]. # Avoid specifying too large a range, for performance reasons. # # ONLY use this if your saned server is sitting behind a firewall. If your # firewall is a Linux machine, we strongly recommend using the # Netfilter nf_conntrack_sane connection tracking module instead. # #data_portrange = 10000 - 10100 data_portrange = 10000 - 10010
2.アクセス許可設定
- これは特に述べることはない。
- その名の通り、ネットワーク経由でSaneにアクセスできるホスト名, IPアドレスを列挙する。
- ローカルホスト(localhost and/or 127.0.0.1)は、書かなくてもアクセスできるみたい。
- LAN共有をするなら、ここにLAN内のIPアドレスを適当に指定すればOK。
## Access list # A list of host names, IP addresses or IP subnets (CIDR notation) that # are permitted to use local SANE devices. IPv6 addresses must be enclosed # in brackets, and should always be specified in their compressed form. # # The hostname matching is not case-sensitive. 192.168.0.0/24
- [/etc/sane.d/saned.conf]を修正したときは、xinetd等のスーパーサーバーサービスを再起動すると有効になる。
- 本当の余談だが、apt-getでSaneをインストールしたときは、デーモン(/usr/sbin/saned)がインストールされなかった気がする。
xinetdの設定
- 前述のとおり、ネットワーク経由では、スーパーサーバー経由で、Sanedが呼ばれる。
- Vine Linuxでは、現状xinetdが標準でインストールされるはず。
- xinetdの設定ファイル群は、[/etc/xinetd.d/]ディレクトリ以下に各種デーモン用設定ファイルを突っ込む。
- sane用のサンプルファイルが[usr/share/doc/iscan-2.29.1/xinetd.sane]にあるので、[/etc/xinetd.d/]にコピーする。
- サンプルファイルのコメントアウト部にも書いてあるが、サンプルファイルの指定サービス名は「sane」であるのに対し、[/etc/services]で定義されているサービス名は、sane-portである。よって、どちらか編集して、一致させる必要がある。今回は、サンプルファイル側を編集した。
# default: off # description: SANE network scanner daemon # Please note that this service is registered by the IANA under # the name "sane-port". If your /etc/services file only has a # sane-port entry, rename the service in this file to match it. # Alternatively, you can add an alias in /etc/services. service sane-port ←ここをsaneからsane-portに修正 { disabled = no port = 6566 socket_type = stream wait = no user = root server = /usr/sbin/saned }
一般ユーザも使えるようにする
前項目までで、root権限を持つユーザ(xinetd経由はroot権限起動)は、スキャナが使えるはずである。
・・・が、一般ユーザは、多分使えない。scaniamgeコマンドを行うと、次のように出る可能性が高い。
$scanimage -L device `epkowa:interpreter:001:002' is a Epson(unknown model) flatbed scanner
スキャナのモデルが取得できておらず、いかにも怪しい。
これは、権限不足で、スキャナ情報にアクセスできていない。
udevの設定
udevは、デバイス管理を行うツールである。
昔のVineでは、USBデバイスに関しては、murasakiというツールを使っていたようだが、現在はudevにすべてを委ねているらしい。
このudevは、USBデバイスを認識すると、デバイスファイルを生成してマウントしてくれるわけだが、その時にudev設定ファイルに基づいて、デバイスファイルに指定グループの権限を付与する。saneもそのためのサンプルファイルを用意してくれているので、それを用いて設定を行う。
サンプルファイルコピー
- udevのSane用サンプルファイルは[/usr/share/doc/sane-1.0.21/tools/udev/libsane.rules]にある。このファイルを、[/etc/udev/rules.d/]ディレクトリにコピーする。
- なお、udevは、[/etc/udev/rules.d/]以下の設定ファイルを辞書順に読み込むため、読み込み優先順位を付けたければ、設定ファイル名の先頭に数字をつけると良い(既存の他のファイルは、そのような命名規則になってるはず)。
- 上記理由から「65-saned.rules」にリネーム(優先順位番号は特に意味ない)。
一般ユーザに権限を与える
前項まで行えば、スキャナを再接続することによって、udevがサンプル設定ファイルで指定した権限で、マウントを行なってくれるはずである。このサンプル設定ファイルで指定されたグループ権限は、「scanner」というグループである。
実は、saneをソースからビルドする時に、何も指定しないとconfigureオプションに次のオプションが付与される。
--with-group=scanner
なので、サンプル設定ファイルもscannerというグループ権限が設定される。
よって、一般ユーザが使用できるようにするためには、次のような選択肢がある。
- スキャナを使用したい一般ユーザに、scannerグループを付与する。
- 既に、スキャナを使用したい一般ユーザだけに割り当ててる共通グループがあるならば、udevの設定ファイルをいじって、そのグループの権限でデバイスマウントするようにする。
好きな方を選んでもらって問題ないと思う。
どっちも試したが、どちらもうまく行ったので、お好きな方で。
【前者】一般ユーザにscannerグループを追加付与
# usermod -G scanner [付与したい一般ユーザ名]
【後者】スキャナデバイスファイルを別グループ権限で付与
たとえば、「useusb」というグループが、スキャナを使用したい一般ユーザに付与されているとする。
この時、[/etc/udev/rules.d/65-saned.rules]を次のように修正する。
- 772行目付近
# EPSON GT-F650 | EPSON GT-S600 | EPSON Perfection V10 # EPSON Perfection V100 Photo #ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="012d", MODE="0664", GROUP="scanner", ENV{libsane_matched}="yes" ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="012d", MODE="0664", GROUP="useusb", ENV{libsane_matched}="yes"
これでOK。ただ、稀にこれだけだと、権限付与がうまくいかないことがあるので、
もしうまく行かなかったら、次の行も修正すると、うまくいくことがある。
- 1780行目付近(最終行から一つ前)
#ENV{libsane_matched}=="yes", MODE="664", GROUP="scanner" ENV{libsane_matched}=="yes", MODE="664", GROUP="useusb"
ファイルの修正が終わったら、スキャナを再接続する。すると、指定したグループでマウントされているはず。
(マウント場所は、他にスキャナが存在しなければ、[/dev/usb/scanner0]となる)
一般ユーザで確認
次のように、スキャナモデル名が表示されていれば問題ない。
$ scanimage -L device `epkowa:interpreter:001:002' is a Epson GT-S600/GT-F650 flatbed scanner
LAN内の他コンピュータからのアクセス準備
既に、若干リモートアクセスのための設定も行ったが、ネットワーク接続で非常に大事な設定と、
他のパソコンからアクセスするためのクライアント準備。
【サーバー側】ファイアーウォール設定
既に述べたとおり、ポート開放を忘れずに。開けるべきポートは次の通り。なお、ともにプロトコルはTCPのみでOK。
- 「Sanedデーモン設定ファイル(/etc/sane.d/saned.conf)」の[data_portrange]で指定したポート番号
- スーパーサーバー(inetd or xinetd)設定ファイル(/etc/xinetd.d/sane)で指定したポート番号(default: 6566)
【クライアント側】スキャナ操作ソフトダウンロード
- Xsaneが使いやすい。Linux用はXSane - Newsからダウンロードできる。
- Windows用バイナリは、公式サイトに行くとテキストファイルが置いてあり、「トラフィックが多すぎて大変なので、別の場所からダウンロードしてね」と書かれている。「xsane win32」といった検索ワードでぐぐれば、多分すぐ見つかる。
- Windowsで最新版を使いたければ、Cygwinを入れてビルドしてもOK。
【クライアント側】Xsane for Windowsの設定
ネット上で配布されているWindows版バイナリは、ソースファイル群のREADMEに準拠してコンパイルしているので、Cドライブ直下に設置しないと動かない(C:\sane)。別の場所にしたければ、自分でビルドするしか無い。
## saned hosts # Each line names a host to attach to. # If you list "localhost" then your backends can be accessed either # directly or through the net backend. Going through the net backend # may be necessary to access devices that need special privileges. # localhost 192.168.0.1
- [C:\sane\bin\xsane.exe]が本体。実行すれば、あとはスキャンするだけ。
- Linux版のXsaneも/etc/sane.d/net.confを編集すれば、多分つながる(未検証)。
総括
Linuxに、何かしらサーバー機能をもたせるときは、いつも「ファイアーウォールに気をつけろ!」と念じていたのだが、結局またファイアーウォールにハマった。まったく学習しない私である。
今回、一番ハマった点は、[/etc/sane.d/saned.conf]のdata_portrangeの設定である。この設定と、ファイアーウォールの設定を怠ったせいで、ネットワーク経由のスキャン時に、毎回スキャナがフリーズするという謎現象に悩まされたのだった。
今一度、心に。「ファイアーウォールに気をつけろ!」
トラブルシューティング?
- 試行錯誤していた時に、いろいろ見つけた方法のまとめ。
手動でEPSON社製ドライバを登録・削除する
- 登録(GT-S600の場合)
# /usr/sbin/iscan-registry -a interpreter usb 0x04b8 0x012d /usr/lib/iscan/libesint66 /usr/share/iscan/esfw66.bin
- 削除(GT-S600の場合)
# /usr/sbin/iscan-registry -r interpreter usb 0x04b8 0x012d /usr/lib/iscan/libesint66 /usr/share/iscan/esfw66.bin
何度も試行錯誤していると、scanimageを実行した時に、こんな感じになったりする。
$ scanimage -L device `epkowa:interpreter:001:002' is a Epson GT-S600/GT-F650 flatbed scanner device `epkowa:interpreter:001:002' is a Epson GT-S600/GT-F650 flatbed scanner device `epkowa:interpreter:001:002' is a Epson GT-S600/GT-F650 flatbed scanner
- ↑同じスキャナデバイスがなぜか3つ登録されている。
- こういう時に、上記コマンドの削除を行うと、1回実行するごとに、1つ減る。
- もし、当記事の手順で構築後、scanimageに何も表示されなかったら、手動登録を試すのもありかも。
xinetd経由のデーモン起動をrootにさせたくない場合
なんとなく、xinetd経由でroot権限起動させたくないだろう。なので、専用のユーザを作って、その権限でデーモン駆動する方法。
専用ユーザを作る
- "saned"というユーザで駆動させることにする。
- シェルログイン不可、かつ、スキャナデバイスにアクセスできるよう、本記事の本編で作成した一般ユーザ向けのグループ(例: useusb)に所属させる。
useradd -s /bin/false -g useusb saned
xinetd設定ファイル[/etc/xinetd.d/sane]を修正する
# default: off # description: SANE network scanner daemon # Please note that this service is registered by the IANA under # the name "sane-port". If your /etc/services file only has a # sane-port entry, rename the service in this file to match it. # Alternatively, you can add an alias in /etc/services. service sane-port { disabled = no port = 6566 socket_type = stream wait = no user = saned ← rootからsanedへ group = useusb ← 一般ユーザにしたので、一応group指定 server = /usr/sbin/saned }
これだけ。
groupに正しい権限さえ与えていれば、これで問題なくアクセスできるはずである(私の運用は、この形にしてある)。