[Printer]ネットワークプリンタを使う

SunOS4やFreeBSD、Linuxなどで使われているBSD LPDスプーラから、ネットワークプリンタを利用する方法について説明しています。 「みんなでプリンタを使おう (BSD編)」のページから独立しました。

[Under Construction] 内容はほぼ書き終えていますが、ページの体裁の整備が、まだ不完全です。

[back] みんなでプリンタを使おう (BSD編)
[back] みんなでプリンタを使おう (Solaris編)

日経BP, Find'X(コンピュータ・通信分野の専門検索サイト)に「厳選お薦めサイト」として登録されました。

あなたはだいたい ???人目のお客様です。(1999年4月4日以降)


* ネットワークプリンタの一般論

最近はネットワークインターフェイス(Ethernetインターフェイス)を持つプリンタや、プリンタ用のネットワークインターフェイスカードが増えて来ました。 Windows95やMacOSなど、UNIX以外のプラットフォームも含んだネットワーク環境でプリンタを共有するのに重宝します。

しかしこのようなネットワークプリンタがUNIXのことを考えてくれているとは限りません。特に非ネットワークプリンタに拡張カードを挿したものをUNIXから使おうとすると、ドライバもユーティリティも情報もなく、とても簡単に設定できるとは言えません。そこでこの節では、ネットワークプリンタをUNIXから使う方法について、わかる範囲で説明します。お役に立てば幸いです。

* ネットワークプリンタって?

この節では、ネットワークインターフェイス(Ethernetインターフェイスなど) を持つプリンタや、ネットワークインターフェイスカードを増設したプリンタ、ネットワークプリンタサーバにつながれたプリンタなど、ネットワーク経由で接続・印刷できる(可能性のある)プリンタを、まとめて"ネットワークプリンタ"と呼んでいます。

* 大前提: プリンタの名前

これは大切なことですが、プリンタのネットワーク的な名前の情報が必要です。これが分からないとどうしようもありません。

ネットワーク的な名前というのは、そのプリンタが持っているネットワークインターフェイスに振られたIPアドレス、もしくはそのアドレスに対応する名前、のことです。(こう書くとかえって混乱する人もいるかな。分からない人はネットワーク管理者に聞いてね。)

ネットワーク経由の印刷を、次節で説明する「LPDプロトコル」を用いて行う場合は、プリンタの"LPD的な名前"の情報が必要です。これの説明は長くなりますので、興味の無い方は、下の「解説」は飛ばし読みして下さい。

プリンタの"LPD的な名前"は、プリンタのマニュアルを調べると書いてある、はずです。ところがネットワークプリンタのマニュアルは、どうもドライバのインストール法ばかり書いてある傾向があり、プリンタの"LPD的な名前"を見つけるのはなかなか大変です。たいていのプリンタでは "lp" または "lpd" という名前になっているので、分からない場合はこれを試して下さい。

解説: LPD的な名前とは

LPDプロトコルを用い、ネットワークプリンタで印刷するのは、他のホストにつながっているプリンタ(リモートプリンタ)で印刷するのと、まったく同じ設定をします。リモートプリンタへの印刷には「ホスト名」(またはホストのIP アドレス)とそのプリンタの「プリンタ名」を知る必要があります。プリンタ名は/etc/printcapの、各プリンタごとのエントリの最初に書いてあるはずです。これについては印刷スプーラの設定(「みんなでプリンタを使おう(BSD編)」のページ内)で説明しています。

プリンタの"LPD的な名前"というのは、リモートプリンタで印刷する場合の「プリンタ名」に相当するものです。LPDに対応しているネットワークプリンタであれば、必ず一つはあるはずです。

複数の名前が使える場合もあり、それぞれの名前によって機能を変えていることもあります。例えば漢字コードの変換機能を持つネットワークプリンタでは、 "lp"という名前でコード無変換、"euc"という名前でEUC漢字コードが利用可、などとなっていることがあります。また、複数の口(プリンタポート)を持つネットワークプリンタサーバでは、"lpt1", "lpt2" のように、それぞれの口に対応する名前を持っているはずです。

* ネットワークプリンタが理解できるプロトコル

ネットワークプリンタを利用するためには、当然ながらネットワーク経由でプリンタに印刷データを送らなければなりません。このとき重要になるのが「ネットワークプロトコル」です。(プロトコルとは通信手順のことです。)

ネットワークプリンタあるいはプリンタ用のネットワークカードの広告やマニュアルを見ると、どのようなプロトコルに対応しているかが分かります。例えば次のように書いてあるでしょう。

Appletalk, IPX/SPX, TCP/IPに対応

でもUNIXから印刷するためにはこの情報だけでは不足です。比較的詳しい広告には次のように書いてあります。

対応プロトコル: LPD FTP TELNET PING FINGER

このへんまでの情報が分からないと苦労します。

さて、TCP/IP対応を謳っているプリンタは、たいていは以下のプロトコルのどれかをサポートしています。複数のプロトコルが利用できるものも珍しくありません。

最近のネットワークプリンタのほとんどは、LPDプロトコルを利用して印刷できます。 また、FTPで印刷したいファイルをputすると印刷できるものも多く、重宝します。まだプリンタの設定が済んでないうちから「はやく使わせろ」とせっつかれたときなどに「FTPして下さい」と答えればよいので、特にもう、はい、役に立ちますです :-P

下の2つ、ポート9100とポート35は馴染みが無いでしょう。TCPポート9100はHP のネットワークプリンタで使われているものです。聞くところによるとHPの古いネットワークプリンタは、ポート9100しか使えなかったそうです。ポート35 はRFC1700 "Assigned Numbers" に any private printer server と書いてあるように、由緒正しい(?)ポートです。たとえばQMSのネットワークプリンタが使っています。

これらのポートの特徴は、印刷したいデータをただ流し込むだけで印刷できる、ということです。ですからプリンタのフィルタプログラムの中で、いったんデータを変換してからプリンタに送りたいときには、これらのポートが適しています。

* どのポートが使えるかな?

使えるポートを調べるには、安直ですが、そのポートに繋いでみるのが一番です。実際、私は情報の少ないネットワークプリンタを相手に、ポート1番から 10000番までに順にTCP接続を試みて、利用できるポートを調べたことがあります。そこまでしなくとも、次の3つのポートは試す価値があります。

"Connected to printername" と言われたら使えるでしょうし、 "Connection refused" と言われたら使えないというわけです。

* えっ! TCP/IPに対応していないの?

そうです、あるんです、そういうプリンタもたくさん。Appletalk(Ethertalk) にのみ対応しているネットワークプリンタやプリンタ用Ethernetインターフェイスカードがあり、特にEthernetインターフェイスカードでは珍しくありません。Appletalkはもともとネットワークプリンタを視野に入れて設計されたのだそうです。IPX(Netwareのプロトコル)にのみ対応しているものもあるそうです。"マルチプロトコル対応"を謳っているプリンタやインターフェイスカードはたいていTCP/IPにも対応しています。

不幸にしてあなたがTCP/IPに対応していないプリンタに当たったら、あるいはマックやWindowsにつながっているプリンタをUNIX環境から利用しようと思っているのなら、私には経験が無いので残念ながらお手伝いできませんが、次のリンクがきっと参考になるでしょう。

-> The Linux Printing HOWTO


* ネットワークプリンタを使うには (BSD LPD編)

この節以降、各ネットワークプロトコル(ポート)ごとに、そのインターフェイスをBSD LPDから利用する方法を説明します。ただしFTP編はありません。…だってFTPだけしか使えないプリンタって聞いたことが無いもん。 SolarisなどのSVR4の印刷スプーラから利用する方法は、下のリンクをたどってください。

[back] みんなでプリンタを使おう (Solaris編)

以下ではEPSON MJ-5100Cというインクジェットプリンタに、EPSON PRIF8NというEthernetインターフェイスカードを挿したものを例に採っています。

* LPDプロトコル編その1 (データ変換無し)

すでに対象のプリンタが理解できるコード(ESC/Pなど)に変換されているファイルだけを印刷するのであれば、LPDプロトコルを使い、リモートプリンタの設定と同じように設定して使うのが簡単です。BSD系のUNIXの場合は、 /etc/printcapに次のような行を付け加えます。

# EPSON MJ-5100C through Ethernet I/F Card
mj-5100c|mj5100c|prif8n|EPSON MJ-5100C through PRIF8N:@BACKSLASH@
       :lp=:@BACKSLASH@
       :rm=mj-5100c:rp=lp:@BACKSLASH@
       :sd=/usr/spool/lpd/mj-5100c:@BACKSLASH@
       :lf=/var/adm/lpd-errs:@BACKSLASH@
       :mx#0:

"rm=mj-5100c"と書いているところがリモートホスト(この場合はプリンタ)のホスト名、つまりプリンタの"ネットワーク的な名前"になります。"rp=lp"の「lp」のところは、プリンタの"LPD的な名前"です。これに関しては大前提: プリンタの名前で説明しています。

上記の設定で印刷できるのは、あくまでもプリンタが理解できるコードで書かれたファイルだけです。ネットワークPostScriptプリンタを買い、PSファイルだけを印刷するのであれば、このような設定で十分に使えます。

しかしテキストファイルをそのまま流し込んでも印刷できるようにしたいのでしたら、この設定ではうまく行きません。フィルタを用意して、印刷データをプリンタが理解できる形式に変換してから送る必要があります。2つ先の節で説明します。

* ポート35 or 9100編

プリンタスプーラから起動されるフィルタからネットワーク経由で印刷するときには、LPDプロトコルを使うよりも、ポート9100またはポート35を使うのが簡単です。何せ単にデータを流し込むだけで印刷できますから。

以下の例ではポート9100を例に採っていますが、ポート35でも同様です。

Linuxで使われている(らしい)プリンタスプーラ、PLP-LPDのキットの中に、こういうポートにデータを流し込む目的で作られたツール tcp-lpが入っているので、これを使うのが便利です。使い方は、

tcp-lp hostport

のようにします。標準入力を読んで指定したホストの指定したポートに送ってくれます。

PLP-LPDはLinuxのソースと一緒に配布されていますが、Linux専用ではなく、多くのプラットフォームで使えるプリンタスプーラです。

実際に私が使っている設定を簡単に説明します。このページの上の方で説明した設定の延長です。まず例によって/etc/printcapの設定をしなければなりません。例えばこんな感じです。

# EPSON MJ-5100C through Ethernet I/F Card
mj-5100c|mj5100c|prif8n|EPSON MJ-5100C through PRIF8N:@BACKSLASH@
	:lp=/dev/null:@BACKSLASH@
	:sd=/usr/spool/lpd/mj5100c:@BACKSLASH@
	:lf=/var/adm/lpd-errs:@BACKSLASH@
	:if=/usr/local/lib/lp/prif-if:@BACKSLASH@
	:mx#0:@BACKSLASH@
	:sh:@BACKSLASH@
	:rw:

ポイントはlp=/dev/nullのところで、パラレルポートなどプリンタが接続されるべきポートではなく、nullデバイスを出力先に指定しています。ネットワーク経由で印刷するので、シリアルポートやパラレルポートは使わないのです。

次に、フィルタを用意します。詳細はpsif利用の具体例 を参照して下さい。

/usr/local/lib/lp/prif-if
psifのコピー
/usr/local/lib/lp/prif-if-text
テキストファイル用フィルタ(後述)
/usr/local/lib/lp/prif-if-ps
PSファイル用フィルタ

2番目のprif-if-textは、テキストファイルをプリンタ制御コードに変換してから、ネットワーク越しにプリンタに送るためのプログラムです。私は次のようなシェルスクリプトを使っています。

#! /bin/sh
# prif-if-text --- send data through TCP/IP connections
PATH=/usr/local/lib/lp:$PATH
export PATH
RHOST=mj-5100c
RPORT=9100

esc-if $* | tcp-lp $RHOST $RPORT
# eof

対象がEPSON MJ-5100Cなので、テキストファイルをプリンタコードへ変換するのにesc-ifを使っています。そしてその出力をtcp-lpを使ってプリンタに流し込んでいます。RHOST=mj-5100cという部分がプリンタのホスト名です。
(PSファイル用のフィルタについての説明は割愛します。)

* LPDプロトコル編その2 (データを変換する)

[CAUTION!!] 実は私はこの節にあるような、データを変換してからLPDプロトコルで送る、という設定を行ったことがありません。その必要が無かったからです。この節では私の知識の範囲内で説明を試みますが、実際の経験に基づかない不確かなものだということを御理解下さい。

LPDシステムがいったんデータを変換してから、LPDプロトコルでネットワークプリンタ(あるいは他のマシン)へ送るのは、簡単のように思えますが、実は上のインターフェイスの利用法・ポート35 or 9100編と同じような調整が必要です。この節ではこの方法を説明します。

ポート35 or 9100編ではtcp-lpというツールを使いましたが、LPDプロトコルではこのツールは使えません。これのかわりにrlprというツールが使えるでしょう。使い方は、

rlpr -Hhost -Pprinter

のようにします。標準入力を読んで、指定したホストの指定したプリンタに送ってくれます。

あとは上のtcp-lpの場合と同じように設定すれば、動くはずです。

rlprを使わずに出来ないか?

たぶん出来ると思います。一つのネットワークプリンタに対して、2つの printcapエントリを作るのです。一方はインターフェイスの利用法・LPDプロトコル編その1 (データ変換無し)で説明したような、データ変換を行わない設定にしておきます。もう一方はデータ変換を行い、データ変換後に(データ変換を行ったシェルスクリプトなどから)、lprコマンドでデータ変換無しのプリンタに対して流し込む、という方法です。

私自身は試したことがないので、これ以上は説明できません。必要に迫られた方は工夫してみて下さい。心配なのは、一回の印刷で2度の印刷処理が行われるため、印刷記録が2重になる可能性があること、そして2段目のlprコマンドがrootの権限で実行されるため、2段目の印刷はすべてrootが行ったものだと認識されることです。印刷に課金を行っている場合は特に問題となるでしょう。気をつけて下さい。

* おまけ: EPSON PRIF8NをUNIXから使う

上にも述べましたが、私の所属する流体研では EPSONがプリンタのオプションとして販売しているEPSONインターフェイスカード(タイプBマルチプロトコル Ethernetインターフェイスカード)を、EPSON MJ-5100Cに取り付けて使っています。型番: PRIF8N というものです。このインターフェイスカードはWindows NTからTCP/IPで印刷できることになっているのですが、TCP/IPの本家UNIXからの利用方法はマニュアルには記載されておらず、エプソンインフォメーションセンターに問い合わせても「使えない」の一点ばりです。

実際には、UNIXからでも印刷できます。PRIF8Nは以下の4つのTCPポートを読んでいます。

21 FTP
139 NetBIOS Session Service
515 LPD
9100 データを直接流し込む (HPネットワークプリンタ互換?)

ポート番号139(NetBIOS Session Service)は使ったことが無いので分かりませんが、その他のポートは全て実際に使うことができます。たとえばプリンタ制御コードで書かれたファイルをFTPでプリンタに送ると印刷されます。

注意: IPアドレスはWindows NTから設定します。NT以外のOSから設定する方法は分かりません。


<- トップページ
工学院大学機械工学科流体研

リンクはご自由に。でもメールをくれると嬉しいな。

金野 祥久  konno@researchers.jp

Last modified: Wed Dec 7 13:40:01 JST 2011