3. スキャナーデバイスを作成しアクセスする

次の項はすべてのハードウェアのタイプに適用されます。 スキャナーインターフェースタイプについて特徴のあるものについては、 この項の最後のところで述べています。

3.1. デバイスファイルシステム

Devfs または'device filesystem' は、2.2 系以降 Linux カーネルでオプションに なっていました。この時点で使っていなかったのなら最新版にされるようお勧 めします。安定しており、デバイスノードの生成に的確にアプローチしますし、 デバイス管理をとても簡単にします。デバイスファイルシステムデーモンであ る devfsd は、ユーザ入力を必要としないで、直接にお使いのシステムでデバ イスを生成、削除します。システムで devfsd が動いているなら、コマンドラ インか xterm 上で ls -f /dev/ を実行すると、 /dev 内のサブディレクトリで、論理的に秩序ある階層 構造のなかにデバイスファイルへのほとんどのシンボリックリンク、または "ノード" を示します。コマンドラインで ps -A で稼働しているプログラムを調べると、devfsd が動いているの も見ることができます。デーモンはとても小さなメモリを使っています。 devfsd/devfs を動かしているなら、デバイスノードを作成する最初の過程は すでになされているでしょうし、/dev で適切なシンボ リックリンクを選ぶことでデバイスを見つけ出すことは簡単ですから、次の項 をスキップできます。

devfs を試そうとしているなら、カーネルのコンフィグレーションの項の 'ファ イルシステム'のところで、'/dev file system' と 'Automatically mount at boot' を使用可能にしなければいけません。すでにそうなっていないなら絶対 にカーネルの再構築をしなければいけません。警告: その他のサポートして いるパッケージだけが 'devfsd'を必要としますから、お使いのディストリビュー ションのベンダーから入手できます。警告: devfs デーモンをインストール していないのに起動時に自動的にマウントするように devicefs を可能にすると、 起動不能になってしまうでしょう。

devfs はユーザによってアクセスするためにデバイスの許可属性を変更する 必要がありません。

もちろん、devfs についての上記の解説は、(数ある人なかでの)私の意見であり、 とりわけあなたが初心者あるいはカーネルをコンパイルする準備ができていな いなら、記述通りにやったほうがよいでしょう。

3.2. デバイス類を手動で作成する

devfs と devfsd を稼働させてない場合に、必要なやり方を解説します。USB スキャナーに libusb を使わないなら、この項をスキップしてSection 4に飛んでください。手動で必要なデバイス類を作成するには ふたつの方法があります。ひとつは MAKEDEV を使うこと で、もうひとつはコマンドラインでデバイスノードを作成することです。

MAKEDEV スクリプトはふたつの方法のうちのより簡単な 方で、/dev、あるいは実行可能のバイナリーを置く場 所である(/bin/sbin など)に 置かれているかもしれません。man MAKEDEV で調べてく ださい、デバイスに特徴的なコマンドオプションに注意することが警告してあ りますから、それであなたはメジャーとマイナーの番号が正しいかどうかを確 認できます。(これについての詳細は次を見てください、なぜそれが重要なこ とかがわかるでしょう。とりわけMAKEDEV が動かないとか、 苦労してやるほうがよいなら)。

デバイスはブロック(ドライブのような)、fifo ( xconsole 上でのファイル の入力出力法あるいはパイプ)あるいはキャラクターデバイスとして作成でき、 別のハードウェアを意味します。それぞれのデバイスはそれが何であるか、そ してどこにアクセスするかをカーネルに伝えるためにメジャーとマイナー番号 を持っています。これらの番号は任意ではありません。

3.2.1. SCSI デバイス類

2.4系のカーネルを使っているなら、SCSI proc interface accessを知っておいたほうがよいでしょう。どのカーネル を使っていても、ここから先を読む前にman sane-scsi を読んだほうがよいでしょう。システムが起動するとき、一般的な SCSI デバ イス類は /dev/sgN にマップされます。N は、ゼロか ら始まる数値です。SCSIデバイスに対するメジャーとマイナーの番号は 21 と それぞれ0,1,2,3... になります。デバイスがすでにロードされているかは、 ls -l /dev/sg* で調べることができ、このような出力に なるはずです。:


crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg0
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg1
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg2
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg3
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg4
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg5

存在するデバイスに (/dev/scanner というシンボリックリンクを 作らないといけません(理由はのちほど明らかにします)。 たとえば、お使いのスキャナーが SCSI ホストデバイスの最初の scsi-bus (と lun と target)に接続されているなら、次のように関連するデバイスに リンクしなければいけません:


#  ln -s /dev/sg0 /dev/scanner

3.2.2. 手動で USB デバイス類を作る

繰り返しますが、libusb を使っているなら、この項を飛ばしてください。USB スキャナーデバイスはメジャー番号 180 とマイナー 48、49 から 63 までを 持っています。最初に お使いのディストリビューションのどのディレクトリ に USB ディレクトリデバイスが置かれているかを調べるために /dev を見ます。/dev/usb とい うディレクトリのなかにusbscanner0, usbscanner1... のような名前で存在するかもしれませんし、あるいは /dev/ディレクトリのなかに usbscanner0, usbscanner1...というような名前で存在するかもしれません。 /dev/ディレクトリのなかにスキャナーデバイスがすで にあるなら、仕事は終わっています。もしないなら、自分で作らないといけま せん。root になって次のようにしてスキャナーに対するキャラクターデバイ スを作成します。:

# mknod /dev/usbscanner0 c 180 48

...あるいはお使いのディストリビューションでは、 '/dev/usb'というサブディレクトリかもしれません。 :

# mknod /dev/usb/scanner0 c 180 48

3.2.3. 手動でパラレルポートデバイスを作成する

次の generic parport デバイスを作成するために、上記項で説明した例を示します。:


crw-------    1 root     root      99,   0 Jun 24 13:47 parport0
crw-------    1 root     root      99,   1 Jun 24 13:47 parport1
crw-------    1 root     root      99,   2 Jun 24 13:47 parport2
crw-------    1 root     root      99,   3 Jun 24 13:47 parport3
crw-r-----    1 root     root       1,   4 Jan  1  1970 port

お使いになる予定のバックエンドによって、/dev/port と(または)/dev/parport を作らないといけないかも しれませんので、アプリケーションがそれを必要とするなら、前のステップに 戻って用意してください。

3.3. グループと許可属性

いったんすべてのモジュールがロードされ、ノードが生成されたら、あなたの ユーザアカウントがデバイスにアクセスできるかを確かめるのはよいことです。 ほとんどのセキュリティについての考え方では、固有のグループにスキャナー アクセスを追加するというようにします。私のシステムでは、'video' というグループのメンバーにスキャナーとその他画像デバイスの使用を許可 しています。このようにする方法は(root で) /devでデバイスの所有者を変更することです。:


# chown root.video /dev/usb/scanner*

...root.videoはデバイスが新しく所属する所有者と グループです。 言うまでもなく具体的なコマンドで、SCSI スキャナーが /dev/sg*になるかどうかなどはお使いのシステムとデ バイスのタイプによって違ってきます。シンボリックリンクでないデバイスノー ドそれ自体の所有者を変更するのは重要なことです。; シンボリックリンクの 所有者は親デバイスあるいは、それらが示すファイルを変更するだけで変わり ます。

あなたのユーザアカウントがグループのメンバーであるかどうかを調べるには、 root になり次のようなコマンドを使ってください。: grep -e video /etc/group。 次に示すようなものが表示されるはずです。


video:x:44:

'44' がグループナンバーです。'video'グループの最後のコロンに続くメン バーがないので加えることができますから、コマンドで 'jhs' というユー ザを加えましょう。


# adduser jhs  video

このあとで、デバイスの件でユーザに読み書きを許可するのは簡単です。


# chmod g+rw /dev/usb/scanner0

... g+rw というのは、 group(グループ)に対して、read (読み) と write(書き)アクセスを加えるという意味です。 chmod のマニュアルを見てください(もっと詳しい情報はman chmod または info chmod)。