トップ «前の日記(2005/01/01) 最新 次の日記(2005/01/08)» 編集

蚊遁鉄句

2003|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|07|08|09|10|11|

2005/01/05

[kurobako]Debian化玄箱HGをプリントサーバに

印刷できるようにはなった。でも印刷済みジョブが消えないー。

KURO-BOX/HG(玄箱HG)の情報は、KURO-BOX に比べて少なめ。プリントサーバにする手順も、KURO-BOX 用の情報がほとんどなので混乱し易い。

# modprobe usb-ohci
# modprobe printer

「とやってモジュールを組み込む」なんて情報があって、modprobe?モジュールって何?というところから始まる。デバイスドライバはカーネルのローダブル・モジュールになっていて、それを modprobe で操作するものと理解。で、usb-ohci.o、printer.o はどこに?

モジュールを作るにはカーネルをコンパイルする必要があるなんて記述を見て、あらら玄人志向にソースを申し込まなきゃいかんの?と思ったら、Debian化キットを作って下さっている玄箱うぉううぉう♪に、「玄箱用モジュール詰め合わせ」を発見。これには usb-ohci.o、printer.o が含まれていた。

Debian化玄箱では、モジュール・ファイルは /lib/modules/2.4.17_kuro-box/ にあり、「玄箱用モジュール詰め合わせ」も同じパスに展開されるもの。しかし、modprobe や depmod を実行すると、/lib/modules/2.4.17_mvl21/ が無いと文句を言う。

モジュール・ファイルの位置を誤魔化しても、バージョンが合わないと言われる。

$ sudo insmod -f usb-ohci.o
Warning: kernel-module version mismatch
        usb-ohci.o was compiled for kernel version 2.4.17_kuro-box
        while this kernel is version 2.4.17_mvl21
Warning: loading usb-ohci.o will taint the kernel: forced load
usb-ohci.o: init_module: No such device
Hint: insmod errors can be caused by incorrect module parameters, including inva
lid IO or IRQ parameters

「玄箱用モジュール詰め合わせ」と一緒に、.o ファイルのバージョン名文字列を HG 用にバイナリ置換する perl スクリプトがあったのを思い出す。でも今見ると玄箱うぉううぉう♪からは消えている。何か問題あったかな?と思ったけれど、同等の ruby スクリプトでまとめて置換。/etc/modules.conf をいじって、depmod などがモジュール・ファイルを探す場所を変更して、depmod -a。

$ sudo depmod -ae
depmod: *** Unresolved symbols in /lib/modules/kuro_modules_2004_12_19/kernel/dr
ivers/block/floppy.o
depmod:     blk_ioctl
depmod:     register_disk
depmod:     __wake_up
<たくさん続く>

KURO-BOX 用モジュールは、パッチしたくらいでは KURO-BOX/HG には使えないらしいとようやく諦める。Debian化キットは非HG玄箱で作られていて、モジュール構成が違うのだ。でもそれで悪影響は?

$sudo lsmod
Module                  Size  Used by    Not tainted

ローダブルモジュールを(今のところ)使ってないから問題ないらしい。

ん?そもそも Debian化直前のバックアップや、最新ファームウェアに該当モジュールがあるはず。と気づいて探す。でも /lib/modules/2.4.17_mvl21/kernel/drivers/usb/ にはこれだけ。usb-ohci.o、printer.o が無い。

-rw-rw-rw-   1 user     group       10804 Oct 19 17:23 acm.o
-rw-rw-rw-   1 user     group       21876 Oct 19 17:23 bluetooth.o
-rw-rw-rw-   1 user     group        7236 Oct 19 17:23 dc2xx.o
-rw-rw-rw-   1 user     group       14440 Oct 19 17:23 mdc800.o
-rw-rw-rw-   1 user     group       15532 Oct 19 17:23 scanner.o
-rw-rw-rw-   1 user     group       27204 Oct 19 17:23 usb-midi.o
-rw-rw-rw-   1 user     group       21320 Oct 19 17:23 usbnet.o

これで USB 接続のプリンタが動く?玄人志向の BBS には動かない事例が。Debian化前に、プリンタをつないでみなかったのが悔やまれた。

プリンタをつないで /var/log/messages を見てみると、ある程度は認識している様子。

Jan  4 17:15:48 ****** kernel: hub.c: new USB device 00:0e.1-1, assigned address2
Jan  4 17:15:48 ****** kernel: printer.c: usblp0: USB Bidirectional printer 
dev 2 if 0 alt 0 proto 2 vid 0x04A9 pid 0x1061

ここに来て、KURO-BOX/HG では USB プリンタ・ドライバなどはローダブル・モジュールではなく、カーネルに内蔵されているのでは?と思い始めた。

ならば他に必要なものは?まずはプリンティング・システムが入ってない。オリジナルの玄箱には lprng が入っていた事がわかり、これを入れる。/etc/samba/smb.conf をいじって、Windows マシンからプリンタドライバをインストールできるようになった。しかしジョブ一覧窓のタイトルに「lp (***** 上)アクセス拒否 - 接続できません」と表示される。プリンタのプロパティ・ダイアログが出て来るまでが異常に遅い。プリンタウインドウに「アクセス拒否」と表示されるという事例を見つけるが、「印刷自体は正常に行なわれます。」とある。ここでは印刷はできていない。

玄箱ローカルの印刷ジョブはキューに投入できているので、そこからプリンタまでの間がつながっていないらしい。その辺りを司っているものは?名前からはさっぱり何だかわからなかった murasaki が関係ありそうだと思い始め、槻ノ木隆のPC実験室 Gigabit Ethernet対応「玄箱」(Part2)〜USBを使えるようにするで学習。ここから開発者のページ Murasaki (another HotPlug) にもたどり着いた。

知識を得た上でオリジナル玄箱のディレクトリ・ツリーを調べてみると、/etc/murasaki/murasaki.preload というファイルに、usb-ohci、printer の記載が見つかった。/var/log/messages にもこれらの名前が現れているのが見えてくる。

Jan  5 13:40:49 ****** kernel: usb-ohci.c: USB OHCI at membase 0xc9006000, IRQ 19
Jan  5 13:40:49 ****** kernel: usb-ohci.c: usb-00:0e.1, NEC Corporation USB (#2)
 
Jan  5 13:40:49 ****** kernel: printer.c: v0.11: USB Printer Device Class driver

そこで apt-get install murasaki。/etc/murasaki/ の下をオリジナル玄箱と見比べて、オリジナルの内容をそっくりコピーすれば良さそうと判断。

プリンタの USB ケーブルを抜差しして /var/log/daemon.log を観察。

抜いたとき:
Jan  5 15:35:10 ****** murasaki.usb[281]: device is removed
Jan  5 15:35:10 ****** murasaki.usb[281]: vendor:0x4a9 product:0x1061 Dclass:0x0
Dsubclass:0x0 Dprotocol:0x0 Iclass:0x7 Isubclass:0x1 Iprotocol:0x2
Jan  5 15:35:10 ****** murasaki.usb[281]: MATCH(printer) -> match_flags:0x80 vend
or:0x0 product:0x0 Dclass:0x0 Dsubclass:0x0 Dprotocol:0x0 Iclass:0x7 Isubclass:0
x0 Iprotocol:0x0
挿したとき:
Jan  5 15:36:21 ****** murasaki.usb[282]: device is added
Jan  5 15:36:21 ****** murasaki.usb[282]: vendor:0x4a9 product:0x1061 Dclass:0x0
Dsubclass:0x0 Dprotocol:0x0 Iclass:0x7 Isubclass:0x1 Iprotocol:0x2
Jan  5 15:36:21 ****** murasaki.usb[282]: MATCH(printer) -> match_flags:0x80 vend
or:0x0 product:0x0 Dclass:0x0 Dsubclass:0x0 Dprotocol:0x0 Iclass:0x7 Isubclass:0
x0 Iprotocol:0x0
Jan  5 15:36:21 ****** modprobe: modprobe: Can't locate module printer

「Can't locate module printer」って言ってる。

/var/log/daemon.log にこんなのが出ていた。char-major-6 のデバイスってパラレルポートだってよ?

Jan  5 15:36:21 ****** modprobe: modprobe: Can't locate module printer
Jan  5 15:49:50 ****** modprobe: modprobe: Can't locate module char-major-6

ああ、この事なのね。

現状の lp デバイス。
crw-rw----    1 root     lp         6,   0  4月 25  2004 /dev/lp0
 
Debian化前。
drwxr-xr-x root/root         0 2003-05-12 17:38:57 dev/usb/
crw-rw-rw- root/lp       180,0 2002-04-11 23:25:15 dev/usb/lp0
$ sudo mkdir /dev/usb
$ sudo mknod /dev/usb/lp0 c 180 0
$ sudo chown root:lp /dev/usb/lp0
$ sudo chmod 660 /dev/usb/lp0

これに合わせて /etc/printcap を修正。テストページ印刷ができるようになった。

今の悩みは、印刷済みジョブが削除されない事。/etc/samba/smb.conf で、print command を明示して lpr に -r を指定しているのだけど。

print command = /usr/bin/lpr -Plp -r %s

と思ったら、どんどん印刷していると、古い印刷済みジョブは消えている。1〜2個消え残るという現象らしい。