自由気ままなITメモログ

パソコン、サーバー、モバイル関連等の情報・Tipsを、不定期で綴るメモ集です。

Vine Linux 6.1で、スキャナ(Epson GT-S600)を使う

またまた、お久な更新となってしまいました。

今回は、表題の通り、Vine Linux 6.1上で、スキャナを使うのが目的。
押し入れを整理していたら、昔使っていたEpson GT-S600というエントリーモデルのスキャナが発掘されたので、LANサーバーであるVine鯖機上でLAN共有できないかなー、と思ったのがきっかけ。
では、さっそく、つらつらと試行錯誤記を綴りたいと思います。

情報収集(参考サイト)

とりあえず、ぐぐって、情報を集める。

皆様、ありがとうございます。

集めた情報をまとめると・・・

  1. スキャナを扱うための「sane」というツールをインストール・設定する。
  2. EPSON公式サイトから、Linux用ドライバをダウンロード・インストールする。
  3. ネットワーク共有するなら、スーパーサーバー(inetd、もしくはxinetd)の設定をする。

と言った流れ。いろいろ試行錯誤したので、失敗談などは、各項目で書くことにする。

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

EPSONLinuxドライバのインストール

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パッケージをインストールした時に、コメントアウトスクリプトが走るのだが、強制インストールのため動かないようだ)

必要ないものが有効になっていても構わないが、余計なドライバを探しに行くため、スキャナを探す時に動作が遅くなることがあるようだ。

/etc/sane.d/epkowa.conf(任意)

usb
scsi
  • 上記2行のみ、アンコメントされている。scsiは必要ないので、コメントアウトする。
usb
#scsi

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もそのためのサンプルファイルを用意してくれているので、それを用いて設定を行う。

サンプルファイルコピー

  1. udevのSane用サンプルファイルは[/usr/share/doc/sane-1.0.21/tools/udev/libsane.rules]にある。このファイルを、[/etc/udev/rules.d/]ディレクトリにコピーする。
    • なお、udevは、[/etc/udev/rules.d/]以下の設定ファイルを辞書順に読み込むため、読み込み優先順位を付けたければ、設定ファイル名の先頭に数字をつけると良い(既存の他のファイルは、そのような命名規則になってるはず)。
  2. 上記理由から「65-saned.rules」にリネーム(優先順位番号は特に意味ない)。

一般ユーザに権限を与える

前項まで行えば、スキャナを再接続することによって、udevがサンプル設定ファイルで指定した権限で、マウントを行なってくれるはずである。このサンプル設定ファイルで指定されたグループ権限は、「scanner」というグループである。
実は、saneをソースからビルドする時に、何も指定しないとconfigureオプションに次のオプションが付与される。

 --with-group=scanner

なので、サンプル設定ファイルもscannerというグループ権限が設定される。
よって、一般ユーザが使用できるようにするためには、次のような選択肢がある。

  1. スキャナを使用したい一般ユーザに、scannerグループを付与する。
  2. 既に、スキャナを使用したい一般ユーザだけに割り当ててる共通グループがあるならば、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に正しい権限さえ与えていれば、これで問題なくアクセスできるはずである(私の運用は、この形にしてある)。