私の所属する流体研では、Solaris 2.5.1の動くSun SPARCstationにCanon
BJC-600Jというカラーインクジェットプリンタ(バブルジェットプリンタ)を接続し、カラーPostScriptプリンタもどきとして使っています。BSD系の印刷スプーラ(LPD)で/etc/printcap
をいじる方法は雑誌の記事などによく出ていますが、SVR4の印刷スプーラをいじる方法はなかなか見つかりません。そこで私がどうやってプリンタを繋いだかを説明します。
lbp-ifのウェブサイト移転に対応(2011-12-07)
BSD系の印刷スプーラ(LPD)の設定方法については、 「みんなでプリンタを使おう (BSD編)」で述べています。こちらも参考にして下さい。
日経BP, Find'X(コンピュータ・通信分野の専門検索サイト)に「厳選お薦めサイト」として登録されました。
あなたはだいたい 人目のお客様です。(1997年10月26日以降)
SVR4の印刷スプーラについて、私の理解しているところを述べようと思います。実は今までSVR4の印刷スプーラの全体的な流れを説明した参考書やウェブページは見たことが無いので、自分の理解が正しいのかどうか、全く自信がありません。間違っていたらごめんなさい。間違いに気づいた方は、金野に御連絡下さい。よろしくお願いします。
全体に、SVR4の印刷スプーラはBSD系の印刷スプーラ(LPD)よりも柔軟です。「複雑だ」という人もいますし、確かにそういう部分もあるのですが、利用者のストレスをできるだけ減らせるるよう、いろいろ工夫されていると感じます。私は気に入っています。
なお、この節は以下の参考書から多くの知識を得ています。
Æleen Frisch著、榊 正憲 訳、UNIXシステム管理入門、アスキー出版局、1995.
さて、SVR4の印刷の流れは以下のようになっているようです。
…とまぁこういう感じなんですが、お分かりいただけましたでしょうか。
フィルタプログラムは標準入力を読み、それをプリンタが解釈できるコード (プリンタの制御コード)に変換して標準出力に書き出すのが仕事です。
ワークステーションに接続されるプリンタはPostScriptプリンタが多いようで、このためSVR4の印刷スプーラは、PostScriptプリンタは簡単に接続できるようになっています。PostScript用のフィルタプログラムも充実しています。
(/usr/lib/lp/postscript/
以下にたくさんあります。)
非PSプリンタの場合は、残念ながらフィルタプログラムがほとんど提供されていません。非PSプリンタを接続する時には、フィルタは自分で用意する必要があると覚悟して下さい。ネット上に多くのフィルタプログラムが公開されていますので、それを活用しましょう。いくつかは「フィルタの入手」で紹介しています。
簡単にいうと上に述べた通りなのですが、あとで実際にフィルタを使う場面で困らないように、もう少しきちんと説明します。もしあなたが、SVR4の印刷スプーラについてまったくの初心者でしたら、この項目はいったん読み飛ばして下さって結構です。フィルタプログラムを実際に利用することになってから、戻ってきてください。
さて、フィルタを使うためには印刷スプーラに登録しなければならないのですが、その際に以下の情報を指定します。
入力タイプ、出力タイプとしては、"simple", "postscript", "raster"などがあります。"simple"が既定値で、それ以外の名前は管理者が自由に決められます。/etc/lp/fd
以下にある「フィルタ記述ファイル」を見て下さい。フィルタ記述ファイルについては、フィルタの登録の節で説明しています。
ここからは、実際の印刷の場面で行われることを説明します。印刷スプーラは、印刷に用いるプリンタの名前から、そのプリンタの種類、そしてプリンタが受け付ける入力タイプ(たとえばPostScriptやLIPSなど。印刷スプーラからみると"出力"にあたる)を得ます。プリンタの登録の際に、これらを指定しています。
印刷のジョブが投入されると、印刷スプーラは入力(印刷されるファイル)のタイプを調べます。印刷スプーラの判断にまかせず、自分で指定することもできます。lp -T postscript filenameの如し。
したがって印刷スプーラは、上に挙げたフィルタの登録情報のうち、1〜4を知っています。そしてこれらの情報をもとに、登録されているフィルタの中から対応するものを探し、それを起動するのです。なお、対応するフィルタがなければ、エラーになり、印刷できません。当たり前ですね。
インターフェイスプログラムは、次のような引数を取ります。
また、次の環境変数を与えられます。
これらの情報をもとに、インターフェイスプログラムは見出しページ(banner page)を印刷したり、必要な部数のコピーを生成したりするのです。なお、ローカルプリンタの場合は標準出力がプリンタに繋がっています。
インターフェイスプログラムの雛形のシェルスクリプトが
/usr/spool/lp/model/
以下に入っています。また、プリンタを買ったときについて来ることもあります。インターフェイスプログラムをいじるのは次のような場合です。
印刷するファイルをプリンタの制御コードに変換する仕事は、インターフェイスプログラムにやらせることも出来るのですが、この仕事は通常、フィルタプログラムの仕事です。
最後の「特殊な形式の…」について補足します。SVR4の印刷コマンド lp(1)では、入力ファイルの形式を-Tオプションで指定できます。具体的には、たとえばpngファイルなら以下の如し。
% lp -T png file.png
この場合、入力タイプ"png"を扱えるフィルタが用意されていれば印刷できますし、なければ印刷エラーになります。SVR4の印刷スプーラは、このように任意の入力タイプを指定できるので、応用が効きます。
注意!!:
1999年6月28日に、この節の記述を修正しました。以前は誤って-Tではなく-yオプションを付けた例を紹介していました。-Tオプションと-yオプションとでは意味が異なり、ファイルの種別を指定するのには-Tのほうを指定するのが正当です。詳細はマニュアルlp(1)を参照してください。
東大情報の塙さんに、この件に関してご指摘を受けました。どうもありがとうございました。
さてPNGファイルの印刷はつまらない例ですが、サイトによっては、特殊なファイル形式を印刷したい場合があるでしょう。たとえばCADの出力ファイルなどです。適切なフィルタを用意できれば、それを登録することで、印刷が容易になります。
管理者にとっては面倒な話ではありますが、利用者の利便性が向上します。該当する管理者の方は、機会があればチャレンジしてみてはいかがでしょうか。
Solaris 2.xを対象に、プリンタをなるべく利用しやすいように設定する方法を説明します。目標は、
といったところです。
では、まずはPSプリンタから。
この項目は「みんなでプリンタを使おう (BSD 編)」にて詳しく説明しています。そちらを御覧下さい。
Sun SPARCstationのパラレルポートとケーブル
(「みんなでプリンタを使おう (BSD編)」
のページ内)
プリンタを電気的に接続し終えたら、次はシステムにプリンタを登録します。登録には、Xウィンドウベースのadmintool(1M)またはテキストベースのlpadmin(1M)を利用します。
admintool
を使ってプリンタを登録します。ポイントは以下の通り。
/dev/bpp0
を選ぶ。これがパラレルポ
ートである。
「Admintool: ローカルプリンタの追加」の画面 (JPEG, 29KB)
lpadmin
の利用方法は、マニュアルに詳しく書いてあります。しかしあまりに機能が多いので辟易とするかもしれません。ここでは、PSプリンタの登録に必要なオプションについてのみ説明します。
さて、プリンタの登録と利用には、下の3つのコマンドを順番に発行します。
# lpadmin -p printername @BACKSLASH@ -D "printer description" @BACKSLASH@ -v /dev/bpp0 -T PS -I postscript # enable printername # accept printername
「Admintool: ローカルプリンタの追加」の画面と対比して説明すると、
-p printername
が「プリンタ名」
-D "printer description"
が「備考欄」
-v /dev/bpp0
が「プリンタポート」
-T PS
が「プリンタタイプ」
-I postscript
が「ファイルの形式」
にそれぞれ対応します。
lpadmin
のオプションのうち、-T
と
-D
は省略しても問題ありません。
このプリンタをデフォルトプリンタ(注)にしたい場合は、さらにもう一つ、
# lpadmin -d printername
というコマンドを実行します。
注: デフォルトプリンタ
正確にはデフォルトデスティネーション。lpコマンドで"-d"オプションを指定せずに印刷したときに使われる、出力先の既定値
BSD LPDプロトコルに対応していないネットワークプリンタを利用したい場合や、データ変換を行ってからネットワークプリンタにデータを送りたい場合には、ここで述べたadmintoolを利用する方法は使えないはずです。そのかわりにlpadminコマンドを利用して、プリンタとそのインターフェイスプログラムを登録します。詳しくはリモートプリンタ、ネットワークプリンタの節で説明します。
ここまでの設定で、すでにPostScriptファイルと、日本語を含まないテキストファイルは、印刷できるようになっているはずです。この小節では、日本語を含むテキストファイルを印刷する方法を説明します。日本語を含むテキストファイルを、印刷する予定がないのでしたら、この小節は読み飛ばしてください。
さて、少なくともSolaris 2.5.1以降では、日本語のテキストファイルを扱うためのフィルタが、すでに用意されています。印刷スプーラの既定の設定では、このフィルタは使われませんが、登録するだけで使えるようになります。
テキストファイルのファイルタイプは "simple" です。"simple"→ "postscript"の変換フィルタは、すでにpostprintが登録されていますが、これをjpostprintに置き換えます。jpostprint用のフィルタ記述ファイルも用意されているので、これを使います。
# cd /etc/lp/fd # lpfilter -f postprint -F jpostprint.fd
プリンタの登録、フィルタの登録(変更)が終われば、これでもうオーケーです。さっそく印刷してみましょう。
% lp -d printername file
うまく印刷できればおなぐさみです。
今度はPostScript非対応のプリンタに挑戦します。以下の例では、Canon BJC-600Jというカラーインクジェットプリンタ(バブルジェットプリンタ)を例に挙げています。説明の都合上、前節プリンタを繋ごう: PostScriptプリンタ編にも目を通しておいてください。
BSD系OSでほぼ同じ機能を実現する方法を 「みんなでプリンタを使おう (BSD編)」で述べていますが、SVR4の印刷スプーラの場合は、ファイルの種類を判別して対応するフィルタプログラムを実行する機能が入っているので…決して完全なものではありませんが…BSD系OSの場合よりはいくぶん簡単だと感じています。どうぞお試し下さい。
PostScriptプリンタとの違いは、まずプリンタの機種の登録が必要なことです。これを次の節で説明します。プリンタの登録の際にも、機種が異なることを意識しながら登録することになります。そして、その機種でテキストファイルなどを正しく印刷するためには、フィルタの登録を行います。
以下、順番に説明します。ただしプリンタをケーブルで繋ぐ方法は、PSプリンタ編と変わらないので割愛します。
BSD系のOSでは/etc/printcap
にプリンタの設定をしますが、
SVR4ではterminfoというデータベースにプリンタの機種(形式)を登録します。このデータベースには端末の形式(VT100など)も登録されています。
一から作ってもよいのですが面倒です。今まであるデータベースをちょちょいといじって新しいデータを作ることにしましょう。
/usr/share/lib/terminfo/
の下を探して、繋ごうとして
いるプリンタに近いプリンタを探す。私はCanon BJC-600Jを接続した
のですが、このプリンタはESC/Pコードを理解するのでEPSONプリンタ
の仲間と言えないこともありません(とりあえずそういうことにしてお
いて下さい :-)。そこでEPSON VP5085(epson-vp5085)を元にすること
にしました。
/usr/share/lib/terminfo/
の下に入っているファイルは
バイナリファイルなので、そのままでは"ちょちょいといじる"という
わけにはいきません。そこで、データベースをテキストファイルに直
します。
bjc-600j
というファイルが出来ます。
cols#136
という部分はプリンタの横幅(横方向に印刷で
きる文字数)を表しているので、BJC-600Jに合わせて
cols#80
にしておきます。(もっといじりたいですか?
:-)
プリンタの機種の登録が終わったなら、PSプリンタの場合と同様、システムにプリンタを登録します。プリンタの"機種の登録"とプリンタそのものの登録は異なることに気をつけてください。(同じ機種のプリンタを2台登録することを想像すると、理解できるかな。)
admintool
を使ってプリンタを登録します。ポイントは以下の通り。
/dev/bpp0
を選ぶ。これがパラレルポ
ートである。
bjc-600j
を登録した。プルダウンメニューには出て来
ないので"other"を選んで登録すること。
「Admintool: ローカルプリンタの追加」の画面 (JPEG, 29KB)
# lpadmin -p printername @BACKSLASH@ -D "printer description" @BACKSLASH@ -v /dev/bpp0 -T bjc-600j -I bjc-600j # enable printername # accept printername
PSプリンタのときと、内容は同じです。ポイントは、
-T 機種名
でプリンタの機種を登録する。
-I ファイルの形式
のところです。-T
オプションでは、先ほどterminfoに登録したプリンタの機種名を指定します。-I
オプションでは、bjc-600j
という「なぞの形式」のファイルを受け付けるように設定します。なぜになぞの形式を指定するのかは、下の方で説明しています。
プリンタ名は適当に決めて下さい。私は"bjc"を選びました。
PostScriptプリンタならadmintoolで設定するだけで動いてくれるのですが、相手はインクジェットプリンタなので使いはじめるまでにもう少し努力が必要です。
注意: この設定はadmintoolでプリンタを登録した場合にのみ必要です。lpadminを用いてプリンタを登録した場合には、すでにこの設定は済んでいます。(もう一度やってもかまいません。)
以下、プリンタ名として"bjc"を選んだこととします。rootの権限で
# lpadmin -p bjc -I bjc-600j
というコマンドを実行し、プリンタbjcが受け付けるファイルフォーマットを bjc-600jという形式(なぞの形式)だけにします。(詳しくはlpadmin(1M)を参照)
わざと今まで無かった形式のフォーマットを指定するところがポイントです。これによって、プリンタbjcでテキストファイルやPSファイルを印刷しようとしても「そんなファイル形式は知らないから印刷できない」と言い張るようになるはずです。 (なぜわざわざこのようにするのかは、もう少し後で説明します。)
もちろんこのまま放っておいては役に立ちません。プリンタの調教が必要です。
テキストファイルやPostScriptファイルを、Canon BJC-600Jで印刷できる形式に直すフィルタを、どこかから手に入れます。
フィルタを用意する
(「みんなでプリンタを使おう (BSD編)」
のページ内)
私は次のようなフィルタを使っています。
lbp-ifとesc-ifのページ
(作者である伊藤 高一氏による)
お知らせ: 1997年11月3日に、上記シェルスクリプトを入れ替えました。以前は Ghostscript-2.6.2にBJC-600J用ドライバを入れて使っていましたが、 Ghostscript-5.03 j1.40をインストールし、付属の "uniprint" ドラ イバを使う設定に変えました。
さきほど、プリンタbjcが "bjc-600j" というなぞの形式のファイルしか受け付けなくしましたが、その理由は、「テキストファイルやPostScriptファイルをそのプリンタで印刷するには、ファイルの形式を変換するために、専用のフィルタが必要だ」ということを、Solarisの印刷スプーラに認識させるためです。どのフィルタを使えばよいかを印刷スプーラに覚えさせるためには、 フィルタ記述ファイルというものを作り、これを専用のコマンド "lpfilter" を使って印刷スプーラに登録します。
注意: フィルタ記述ファイルは、どのフィルタを使うかを決めるためのものです。フィルタそのものではありません!
/etc/lp/fd/
にシステム付属のフィルタ記述ファイルがありますので、それらやlpfilter(1M)のオンラインマニュアルを参考にして、適当なフィルタ記述ファイルを作ります。
私は以下のようなフィルタ記述ファイルを使っています。
bjcsimple.fd
)# bjcsimple.fd # filter description for Canon BJC-600J to print simple ASCII files. Input types: simple Output types: bjc-600j Printer types: bjc-600j Printers: any Filter type: fast Command: /usr/local/sbin/esc-if # Options: MODES catv_filter = -c注意!: テキストファイルだけでなく、プリンタ制 御コードを含んだファイルを印刷したいときには、ちょっと違う設定 が必要です。 「プリンタ制御コードで書かれたファイルを印刷 する」を参照して下さい。
bjcpost.fd
)
# bjcpost.fd # filter description for Canon BJC-600J to print PostScript files. Input types: postscript Output types: bjc-600j Printer types: bjc-600j Printers: any Filter type: slow Command: /usr/local/sbin/bjc.psfilter
/usr/local/sbin/bjc.psfilter
というのが、PSファイル
をプリンタの制御コードに変換するフィルタです。
どちらの例でも、ポイントはOutput typesにbjc-600jを指定していることです。テキストファイルの場合はInput types: simple、PostScriptファイルの場合はInput types: postscript とします。
フィルタ記述ファイルにはもっといろいろ細かく指定してプリンタの動作を規定することが出来るのですが、この例では最低限の設定だけをしています。
フィルタ記述ファイルを作ったら、そのファイルを/etc/lp/fd/
にコピーしておき、さっき出て来たlpfilter(1M)を使ってフィルタを登録します。例えば上の例のようにbjcsimple.fd
と
bjcpost.fd
を登録するのならば、
# cd /etc/lp/fd # lpfilter -f bjcsimple -F bjcsimple.fd # lpfilter -f bjcpost -F bjcpost.fd
のようにしてフィルタを登録できます。
私の所属する流体研では、この程度の設定でCanon BJC-600Jへの印刷が出来るようになりました。皆さんもどうぞお試し下さい。
Solaris 7(デスクトップライセンス)のワークステーションが研究室に入ったので、試しに上と同じ設定をしてみたのですが、印刷するファイルの判定に失敗し、生のままプリンタに送られます。原因はまだ分かりません。Solaris 7 って印刷スプーラまわりで何か変わったのかなぁ。
97年10月23日〜24日に、この節の記述を全面的に変更しました。 以前は "catv_filter" を使う方法で説明していたのですが、この方法はLPR/LPDプロトコルを定めたRFC 1179に適合しないとのことで、バグ扱いされていることが分かりました。Solarisの "lp patch" を当てるとこの機能は使えなくなります。(Solaris 2.5.1の場合はバグ番号1263675、パッチ 103959-0xがそれに当たります。) この "lp patch" はSolarisの "Recommended Patches" の一つです。
代替機能は現時点では見つかっていませんので、テキストファイルとバイナリファイルを識別するプログラムを噛ませる方法に書き改めました。以前の説明内容を知りたい方は、以下のリンクをたどって下さい。
catv_filterオプションを使う方法 (以前の説明内容)
お願い: catv_filterの代替機能をご存知の方は、ぜひ金野に教えて下さい。代替機能が見つかった場合には、この節の記述を改めるかもしれません。
BSD系の印刷スプーラLPDは、印刷するファイルの種類を識別する機能がありません。種類の識別は利用者が行い、それをlprコマンドに与えるオプションでシステムに伝える、という仕組みになっています。
SVR4の印刷スプーラは、印刷するファイルの種類をシステム側で識別する機能が入っています。といっても完全なものではないようで、設定を間違えるとバイナリファイルをPSファイルだと思い込んだりします。BSD lprと同じように利用者がlpコマンドにオプションを指定して制御することも出来ます。
テキストファイルとPSファイルの識別を間違われた経験はありませんが、プリンタ制御コードを含むファイルを印刷できるようにするのにはある設定が必要です。これをしないとPSファイル用のフィルタが動き出してエラーを起こします。プリンタ制御コードで書かれたファイルを変換せずにプリンタに流し込みたい場合は、そのための設定を行う必要があります。
なぜプリンタ制御コードを印刷できると嬉しいかは、以下のリンクをたどって読んで下さい。
プリンタ制御コードを含むファイルを印刷できるようにする理由
(「みんなでプリンタを使おう (BSD編)」
のページ内)
さてその方法ですが、実際のプリントフィルタの前に、テキストファイルとバイナリファイルを識別するプログラムを噛ませることにします。このプログラムの機能は次の通りです。
上に述べた機能を持つプログラム "simple-filter"を作りました。以前はCで書いたプログラムを使っていましたが、Perl5のスクリプトを使って置き換えました。このスクリプトは、対象となるプリンタによって、起動するフィルタプログラムを変える機能を持っています。Perlでかかれているので拡張も容易です。
simple-filter.pl (Perlスクリプト)
以前使っていたプログラムも残しておきます。 lprpsに含まれているpsifというプログラムを元にしています。このプログラムはテキストファイル用のフィルタとして esc-if を起動します。
simple-filter.c (Cソースコード)
前節の続きで、Canon BJC-600Jを例にとって説明します。まず、上のsimple-filterをコンパイルし、/usr/local/sbin/simple-filter として置いて下さい。同じディレクトリにテキストファイル用のフィルタ esc-if も置いて下さい。
ここまで用意できればあとは簡単で、 テキストファイル用のフィルタ記述ファイルで、
Command: /usr/local/sbin/esc-if
という行を、
Command: /usr/local/sbin/simple-filter
に置き換えて登録します。これでOKです。
この節で言うリモートプリンタとは、他のマシン(UNIXワークステーション)を経由して印刷するプリンタを、そしてネットワークプリンタとは、ネットワークインターフェイスを持っていて、どのマシンにも直結されずに、ネットワークに接続して利用するプリンタを言います。詳しくは以下を参照して下さい。
プリンタの接続形態による分類
(「みんなでプリンタを使おう (BSD編)」
のページ内)
最近はプリンタも安くなって、研究室や職場に複数のプリンタがあることも、珍しくなくなりました。飯島直子の宣伝も効いたのでしょうか? 私の周りの様子を聞くと、ネットワークプリンタも、かなり普及しているようです。これはUNIXワークステーションから利用するためというより、PC(Windows)やマックから共有しての利用を簡単にするためらしい。
私はリモートプリンタの設定は、admintoolを使って片付けています。簡単です。
以上でたいていは大丈夫だと思います。
「Admintool: プリンタへのアクセス」の画面 (JPEG, 16KB)
上記の「リモートプリンタの設定」は、BSD LPR/LPDプロトコルに対応しているネットワークプリンタにも、そのまま応用できます。印刷サーバの欄にそのプリンタのネットワーク的な名前と、対象となるプリンタのLPD的な名前("lp" や"lpd"が多い)を"!"で挟んで指定します。たとえば ml903ps2f!lp の如し。
"LPD的な名前"と言われてもぴんと来ない、など、ネットワークプリンタに関する基礎知識に不安のある方は、以下のページをご覧下さい。また、お使いのネットワークプリンタがどのようなプロトコルに対応しているか分からない場合も、お役に立つと思います。
最近のネットワークプリンタはたいてい、BSD LPR/LPDプロトコルに対応していますので、上記の設定で大丈夫ですが、もしもこれに対応しておらず、TCP プロトコルで直接流し込みたい場合や、ローカルホストでいったん前処理を行ってからプリンタに送りたい場合には、異なる処置が必要です。
このうち「いったん前処理」の部分は、このページの上の方の プリンタを繋ごうで解説していますので、ここではプリンタに流し込む方法だけを簡単に説明します。データ変換を行う場合の具体的な作業としては、プリンタを繋ごうの節の"プリンタを登録する" の作業を行うかわりに、以下で説明する作業を行います。
「SVR4の印刷スプーラの概要」の節で説明しましたが、ネットワークプリンタにデータを送る作業はインターフェイスプログラムの仕事です。したがって、ネットワークを利用できるようにインターフェイスプログラムをいじる必要があります。
Solaris 2.6以降の場合は、ネットワークを利用するためのインターフェイスプログラムの雛形が、はじめから用意されています。ですからそれを利用するだけでOKです。以下のリンクを辿って下さい。
Solaris 2 FAQ Question 3.12)
ネットワークプリンタはどのようにして使えますか?
(Solaris 2
FAQ)
BSDプリントクライアントとして設定したばあいは、データの変換はプリンタサーバが行いますので、ローカルで変換できません。上記の方法でリモート印刷する場合には、いったん変換を行ってから送ることができます。
Solaris 2.5.1以前の場合は、ネットワークプリンタ用のインターフェイスプログラムが標準ではついて来ないので、自分で作る必要があります。ただしプリンタの付属プログラムとして、提供される場合もあります。
Solaris 2.6以降では/etc/printers.conf
というファイルがあり、これを設定することで、プリンタやその別名の登録を簡便に行えるようです。便利そうなので使ってみたいのですが、現時点では、私はこの方法をまだ理解していないので、紹介するにとどめます。将来は解説文を書きたいですね。
実例があった方が分かりやすいでしょうから、以下は実際にネットワークプリンタを利用するまでを説明します。
私の所属するサイトでは、EPSONがプリンタのオプションとして販売しているEPSONインターフェイスカード(タイプBマルチプロトコルEthernetインターフェイスカード)を、EPSON MJ-5100Cに取り付けて使っています。型番: PRIF8N というものです。 このインターフェイスカードについての詳細は おまけ: EPSON PRIF8Nを UNIXから使う(「ネットワークプリンタを使う」のページ内)で説明しています。簡単に説明すると、 LPDポート(515)、HPネットワークプリンタ互換ポート(9100)が使えるインターフェイスカードです。
作業内容は、一部を除き「プリンタを繋ごう: 非PSプリンタ編」と変わりません。しかしせっかく新しいプリンタの接続に挑戦するのですから、多少は高度な設定も試してみましょう。
以下、順番に説明します。ただしプリンタのネットワーク的な設定は、各プリンタによって異なるので、プリンタ付属のマニュアルをご覧下さい。
「プリンタを繋ごう: 非PSプリンタ編」で説明した内容と同じです。前回はbjc-600jという機種を登録しましたが、今回は
epson-mj
という機種を登録しました。
これも「プリンタを繋ごう: 非PSプリンタ編」で説明した内容と同じです。ただし一つだけ違いがあります。
ネットワークプリンタの場合は、プリンタポートは/dev/null
を選んでください。ネットワークプリンタの場合は、その名の通りネットワーク越しにデータのやり取りをするので、対応する「ポート」は存在しないのです。したがってダミーのポートとして、ヌルデバイスを指定します。
またまたこれも「プリンタを繋ごう: 非PSプリンタ編」 で説明した内容と同じです。
以下、プリンタ名として"mj-5100c"を選んだこととします。rootの権限で
# lpadmin -p mj-5100c -I epson-mj
というコマンドを実行し、プリンタbjcが受け付けるファイルフォーマットを epson-mjという形式(なぞの形式)だけにします。(詳しくはlpadmin(1M)を参照)
しつこいようですが、これも「プリンタを繋ごう: 非PSプリンタ編」で説明した内容と同じでいいんです。EPSON MJ-5100CはESC/P コードを受け付けますし、Ghostscriptのuniprintドライバも対応しています。次の節でもう少し詳しく説明します。
ここの部分も、突き詰めると「プリンタを繋ごう: 非PSプリンタ編」で説明した内容と同じでよいはずです。しかし、ほとんど同じフィルタを2種類登録するのは、ちょっと馬鹿らしいですね。今後のメンテナンスが楽になるように、工夫をしましょう。
私の場合は、具体的には、上で述べたCanon BJC-600Jの場合のフィルタと、フィルタ記述ファイルを共用します。「プリンタを繋ごう: 非PSプリンタ編」で登録したフィルタはいったん登録を抹消し、以下のようなフィルタ記述ファイルを用いて、新たなフィルタを登録し直しました。
escpsimple.fd
)
# escpsimple.fd # filter description for Canon BJC-600J to print simple ASCII files. Input types: simple Output types: any Printer types: bjc-600j,epson-mj Printers: any Filter type: fast Command: /usr/local/sbin/simple-filterこのフィルタ記述ファイルの利点は、ESC/Pプリンタコードを受け付け るプリンタであれば、"Printer types:" に書き加えていくだけで、ど のプリンタにでも応用が効く点です。ESC/Pコードを受け付けるプリン タはたくさんあるので、いろんな局面で役に立つと思います。
postraster.fd
)
# postraster.fd # filter description for InkJet Printer(s) to print PostScript files. Input types: postscript Output types: any Printer types: bjc-600j,epson-mj Printers: any Filter type: slow Command: /usr/local/sbin/postraster.filter Options: TERM * = -T *
/usr/local/sbin/postraster.filter
というのが、PSファ
イルをプリンタの制御コードに変換するフィルタです。このフィルタ記
述の利点は、テキストファイル用のフィルタと同じく、Ghostscriptが
対応しているプリンタであれば使い回しが効く点です。(詳しくは後述)
フィルタの登録抹消と、新たな登録は、以下のコマンドで行います。
# cd /etc/lp/fd # lpfilter -f bjcsimple -x # lpfilter -f bjcpost -x # lpfilter -f escpsimple -F escpsimple.fd # lpfilter -f postraster -F postraster.fd
上の2行が登録抹消、下の2行が新たな登録です。簡単ですね。
上に挙げたPostScript用フィルタ記述ファイルでは、最後の2行は次のようになっていました。
Command: /usr/local/sbin/postraster.filter Options: TERM * = -T *
"Options: TERM * = -T *"の部分に注目してください。TERMにはプリンタタイプが渡されるので、フィルタプログラムは次のように起動されることになります。
つまり"-T"オプションのあとにプリンタタイプを指定した形で、フィルタが起動されるのです。したがってフィルタプログラム側で、このオプションを読み取ることで、複数のプリンタに対応できます。実際、上で登録しているフィルタpostraster.filter(シェルスクリプト)では、オプション解析をして、 Ghostscriptのドライバを選択しています。
念のために補足しますが、この機能は濫用すべきではありません。非常によく似た機能を持つプリンタで、わずかな違いをフィルタ側で吸収したいときに、利用するとよいでしょう。フィルタの中でオプションの解析をするほうが楽なら、この機能を使えばよいでしょうし、もう一つ新たなフィルタを作った方が楽なら、それに合わせてフィルタ記述ファイルをもう一つ作り、登録するべきでしょう。うまいことやってください。
この節は、「プリンタを繋ごう: 非PSプリンタ編」ではする必要がなかった設定です。相手がネットワークプリンタだから必要なのです。さて、この節のはじめで述べたように、対象のプリンタはTCPポート
9100番にデータを流し込めばよいので、次のようにインターフェイスプログラムを設定します。
注意: この設定はSolaris 2.6以降で有効です。
それ以前のSolarisの場合、あるいはSolaris以外のSVR4マシンの場合は、異なる設定が必要です(このページ内では説明していません)。
# lpadmin -p mj-5100c -m netstandard -o protocol=tcp -o dest=host:9100
これはHPネットワークプリンタ互換ポートを利用できる場合です。最近のほとんどのネットワークプリンタは、LPDプロトコルに対応しているので、下のような設定の方が一般的かもしれません。
# lpadmin -p mj-5100c -m netstandard -o protocol=bsd -o dest=host
どちらの設定でも、hostの部分にプリンタのホスト名(ネットワーク的な名前)を入れます。
この節では「デバイスクラス」というものを簡単に説明し、このクラスの機能を使って、プリンタ(群)に別名をつける方法を解説します。
複数のプリンタが利用できるとします。WindowsやMacintosh(MacOS)で、それらの中から使いたいプリンタを選択する方法は、非常に簡単です。選択肢が提示されて、その中から選べばよい。
それに対してUNIXのlp(1)やlpr(1)コマンドでは、プリンタの名前を指定してやる必要があります。これはプリンタの名前を覚えておく必要があるので面倒です。プリンタを選ぶという作業は、本来は有限の選択肢の中から一つを選ぶことなのに、プリンタの"名前"という無限にある選択肢の一つを示さなければならないのですから、WindowsやMacのアプローチに比べて、面倒なのは明らかです。(必要以上に難しい話になっていますね。斜めに読んで下さい。)
この面倒な選択を多少なりとも助けてくれるのが、プリンタに別名をつける機能です。たとえばCanon BJC-600Jの場合、"bjc", "bjc600j", "bjc-600j"のどの名前でも利用できるように設定できます。こうすれば、プリンタ名をうろ覚えでも使えるわけで、非常に便利です。
また、以前使っていたプリンタが壊れて、そのかわりに新しいプリンタを購入した場合に、新しいプリンタの別名として、以前使っていたプリンタの名前をつけておくなど、応用が効きます。
あなたの会社の専務が、飯島直子秘書に「うちは2台目入れるもんねっ!」と宣言し :-)、2台目のレーザープリンタが入ったとしましょう。どちらも同じプリンタで、2台並んでおいてあります。つまり、どっちを選んでも一緒だから、賢いあなたとしては、空いている方のプリンタを利用したい、と考えるでしょう。そう考えたことにしておいて下さい :-)
さて、どちらのプリンタが空いているのかを、人間がいちいちチェックして印刷するのは面倒です。このへんは印刷スプーラが気をきかせてやってくれるように設定しましょう。このためには、2つのプリンタを1つのグループとして登録し、利用者はそのグループに向けて印刷ジョブを送るように設定します。
前置きが長くなりましたが、デバイスクラスとはこの「グループ」のことです。実例を示した方が分かりやすいでしょうから、2つのプリンタ "laser1", "laser2"をデバイスクラス"laser"として使えるようにする方法を示します。
# lpadmin -p laser1 -c laser # lpadmin -p laser2 -c laser # accept laser
"-p"でプリンタ名を、"-c"でクラス名を指定します。簡単ですね。1、2行目は、それぞれのプリンタを"laser"というデバイスクラスの仲間に入れます。対応するデバイスクラスがまだ無いときは、自動的に作られます。3行目で、そのデバイスクラスが印刷を受け付けるようにします。これ以上の詳しい情報はlpadmin(1M)を参照して下さい。
この作業以降は、利用者が
% lp -d laser somefile
と指定することで、laser1かlaser2のどちらか空いている方に、印刷ジョブが回されます。
もしこのデバイスクラス"laser"を「デフォルトプリンタ」 (注)にしたいのであれば、そのための設定を行います。これも簡単です。
# lpadmin -d laser
当然ながら、各プリンタを指定して印刷することも、これまで通りできます。 laser1の方で印刷したい場合は、lp -d laser1 ...と指定すればよい。
機能や性能が似通っているプリンタが複数台あるのなら、この"デバイスクラス"を使うことで、人間と機械の両方のストレスを軽減できます。上手に使えば便利な機能だと思います。
注: デフォルトプリンタ
正確にはデフォルトデスティネーション。lpコマンドで"-d"オプションを指定せずに印刷したときに使われる、出力先の既定値
さて、本来デバイスクラスは上記の例のように、複数のプリンタをグループ化するための機能なのですが、プリンタに別名をつけるために、これを利用できます。その方法は、…もうだいたい類推できるんじゃないでしょうか。別名をデバイスクラスとして登録するのです。
# lpadmin -p bjc -c bjc600j # accept bjc600j # lpadmin -p bjc -c bjc-600j # accept bjc-600j
上記の方法で、プリンタbjcの別名としてbjc600j, bjc-600jが使えるようになります。
いろいろ調べたのですが、SVR4の印刷スプーラを利用して、プリンタに別名をつける場合、もっとも簡単で分かりやすいのはこの方法でした。これ以外の方法では、同じ出力先を持つプリンタを複数登録する、という手もあるようです。
前節でも述べましたが、Solaris 2.6以降では
/etc/printers.conf
というファイルがあり、これを利用してプリンタの別名をつけることもできるようです。現時点では、私はこの方法をまだ理解していないので、紹介するにとどめます。
Solarisの印刷スプーラを使って印刷をすると、標準では「見出しページ」 (banner page)を1ページつけます。見出しページの扱いは次のように分類されます。
1.はSolarisの印刷スプーラの既定値で、何も設定しなければ必ず見出しページをつけるはずです。2.の方法は簡単なので、興味のある方はlpadmin(1M)を参照して下さい。3.の設定方法はマニュアルには書いていないのでちょっと工夫が必要です。
さて大学の研究室など小規模のサイトでは、印刷する人も少ないでしょうから、見出しページが無くとも困らないと思います。そこで3.の見出しページをつけない設定をするにはどうするかを説明します。
この文書のはじめのSVR4の印刷スプーラの概要で述べたように、見出しページ(banner page)の印刷はインターフェイスプログラムが行なっていますので、見出しページをつけないインターフェイスプログラムを用意して、既存のものと置き換えればよいのです。このためには以下のようにします。
(とても簡単なので、詳細の説明は省かせて下さい。)
どうしてもSVR4の印刷スプーラに慣れないときには、思い切って他の印刷スプーラに乗り換えるのもひとつの手です。主にBSD系の印刷スプーラを拡張したものなどが手に入ります。私の知っている範囲で、選択肢を挙げますので参考にして下さい。
注意: 私は以下に挙げるソフトウェアを使ったことがありませんので、質問には答えかねます。動くかどうかすら知らない^^;;
リンクはご自由に。でもメールをくれると嬉しいな。
金野 祥久 konno@researchers.jpLast modified: Wed Dec 7 13:22:09 JST 2011