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 件のコメント:
コメントを投稿