2006年6月20日火曜日

(FreeBSD)Netatalkのpapを使ってlprで印刷できない ――― waiting for プリンタ名 to become ready (offline?)

lprで印刷して、lpqでステータスを確認すると、いつまでたっても、

waiting for プリンタ名 to become ready (offline?)

と表示されるだけで、ぜんぜん印刷がはじまらない、というトラブルを目にしました。



(この問題の背景)



プリンタは、某E社のレーザープリンタ(やや古い)で、なぜかlpdプロトコルで印刷すると、プリンタがハングアップしてしまうので、しかたなく、Netatalkを使ってEtherTalkのプロトコルにて印刷をしていました。Netatalkを動かすマシンを、FreeBSD4のマシンから、別のFreeBSD5のマシンに変えたところ、なぜかatalkdが動きだしたあたりで、まったくネットワークの通信ができない状態になってしまうというトラブルが発生し(そうなったり、ならなかったりする、といういやな状況。たぶんドライバの不具合だと思われる)、仕方ないので、またまた別のFreeBSD6なマシンでNetatalkを動かすことにしました。



(症状)



一通りセットアップが終わり、ためしにlprで印刷してみようとすると、



waiting for プリンタ名 to become ready (offline?)



で印刷できない。しかし、papコマンドでPSファイルをプリンタへ送ると、ちゃんと印刷できる。



・・・なんでだろう?1時間弱、悩みました。



(調査結果)



原因は、nullデバイスでした。printcapの書き方次第なので、厳密に言えば、netatalkとは、無関係でした。



Netatalk付属のマニュアルで、psfコマンドのマニュアルを読むと、/etc/printcapでは、たとえば以下のように記述するように説明されています。

プリンタ名|ほげほげ LaserWriter:\
:sh:mx#0:\
:lp=/var/spool/output/プリンタ名/null:\
:sd=/var/spool/output/プリンタ名:\
:lf=/var/log/lpd-errs.:\
:of=/usr/local/libexec/ofpap:\
:if=/usr/local/libexec/ifpap:\
:tf=/usr/local/libexec/tfpap:\
:df=/usr/local/libexec/dfpap:

「lp=~」では、通常、プリンタへデータを出力するためのデバイス名を指定しますが、NetatalkでLaserWriterへ出力するときは、フィルタがプリンタへデータを送信してしまいます(ofとかで呼び出され、psfを経由して、最終的にはpapで送信される)。



よって、lpに指定するものがないので、nullデバイスを指定します。man psfを読むと、netatalkで印刷するプリンタが1台だけの場合なら/dev/nullを指定してもいいけど、2台以上の場合は、プリンタごとにmknodコマンドでnullデバイス作って指定しなさい、みたいに記述されています。



それにしたがって、mknodで「/var/spool/output/プリンタ名/null」というのを作ったのですが、そのとき実行したコマンドが間違っていました。



FreeBSD5のときにセットアップしたときは

# mknod null c 2 2

とやってたので、このまんまFreeBSD6でもやってたのですが、これ、FreeBSD6の場合はダメです。nullデバイスのメジャー番号、マイナー番号が違うんですね・・・



だから、lpで指定されたデバイスをopenして、データを書き込もうとしても、メジャー/マイナーがぜんぜん間違っていますから、openやwriteができず、「waiting for ...」となったわけですね。ああ、納得できた。



てゆーか、FreeBSD6だから番号が違うってわけじゃなくて、いろいろ見てみると、FreeBSDマシンごとに、てんでばらばらです・・・

% ls -l /dev/null
crw-rw-rw-  1 root  wheel    0,  24 Jun 19 22:39 /dev/null



% ls -l /dev/null
crw-rw-rw-  1 root  wheel    0,  23 Jun 19 22:42 /dev/null



% ls -l /dev/null
crw-rw-rw-  1 root  wheel    0,  15 Jun 19 22:42 /dev/null

0,24だったり、0,23だったり、0,15だったり・・・



FreeBSD5から、devfsというのが導入されていて、/dev以下は、自動的に作成されるような仕組みになったので、メジャー番号、マイナー番号は、固定されていないんですかね。



で、どうしたかっていうと・・・やっちゃダメって書かれていた方法、つまり、printcapのほうで、「lp=/dev/null」と指定することにしました。



だいたい、なぜ/dev/nullを指定してはいけないのか、理由がよくわかりません。/dev/nullをlockするんでしょうか?それで、複数のプリンタで並行して印刷できるはずのジョブが、1つずつ順番に印刷されるようになってしまうとか?ん~、/dev/nullで、そんなことおきるのかなぁ。ぜんぜんわかりません。



これで問題になるかどうか、しばらく様子見です。



/etc/devfs.rulesというファイルを作って、/dev以下に出現するデバイスファイルをコントロールできるみたいなんですが・・・ナナメ読みしただけでは、ハナモゲラで理解できなかったので、まだやってません(rulesetのあたりが、すぐには理解できなかった)。



0 件のコメント:

コメントを投稿