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

私の所属する流体研では、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の印刷スプーラの概要

[Warning] SVR4の印刷スプーラについて、私の理解しているところを述べようと思います。実は今までSVR4の印刷スプーラの全体的な流れを説明した参考書やウェブページは見たことが無いので、自分の理解が正しいのかどうか、全く自信がありません。間違っていたらごめんなさい。間違いに気づいた方は、金野に御連絡下さい。よろしくお願いします。

全体に、SVR4の印刷スプーラはBSD系の印刷スプーラ(LPD)よりも柔軟です。「複雑だ」という人もいますし、確かにそういう部分もあるのですが、利用者のストレスをできるだけ減らせるるよう、いろいろ工夫されていると感じます。私は気に入っています。

なお、この節は以下の参考書から多くの知識を得ています。

Æleen Frisch著、榊 正憲 訳、UNIXシステム管理入門、アスキー出版局、1995.

* SVR4の印刷の流れ

さて、SVR4の印刷の流れは以下のようになっているようです。

  1. 利用者が印刷ジョブを投入する。(lpコマンドなど)
  2. lpschedがジョブを受け取り、どのプリンタに送る かを判断する。
  3. 印刷先がリモートプリンタの場合(つまり 自ホストに繋がったプリンタでない場合)は、そのマシン/プリンタに ジョブを転送する。(このページではリモートプリンタの設定について は、ごく基礎的な内容しか触れていません。)
  4. 印刷先がローカルプリンタのときは、印刷スプーラは入力を変換するよ う登録されているかどうかを調べる。変換が必要なら、 フィルタプログラムを起動して入力の変換を行う。 入力ファイルをプリンタが印刷できる形式に変換するのは、フィルタプ ログラムの仕事である。
  5. 変換後のデータはインターフェイスプログラムに渡 される。インターフェイスプログラムは、データをプリンタに送るのが 主な仕事である。この他、見出しページの作成や印刷部数の処理なども 行う。

…とまぁこういう感じなんですが、お分かりいただけましたでしょうか。

* フィルタプログラム

フィルタプログラムは標準入力を読み、それをプリンタが解釈できるコード (プリンタの制御コード)に変換して標準出力に書き出すのが仕事です。

ワークステーションに接続されるプリンタはPostScriptプリンタが多いようで、このためSVR4の印刷スプーラは、PostScriptプリンタは簡単に接続できるようになっています。PostScript用のフィルタプログラムも充実しています。 (/usr/lib/lp/postscript/以下にたくさんあります。)

非PSプリンタの場合は、残念ながらフィルタプログラムがほとんど提供されていません。非PSプリンタを接続する時には、フィルタは自分で用意する必要があると覚悟して下さい。ネット上に多くのフィルタプログラムが公開されていますので、それを活用しましょう。いくつかは「フィルタの入手」で紹介しています。

フィルタについて、より詳しい説明

簡単にいうと上に述べた通りなのですが、あとで実際にフィルタを使う場面で困らないように、もう少しきちんと説明します。もしあなたが、SVR4の印刷スプーラについてまったくの初心者でしたら、この項目はいったん読み飛ばして下さって結構です。フィルタプログラムを実際に利用することになってから、戻ってきてください。

さて、フィルタを使うためには印刷スプーラに登録しなければならないのですが、その際に以下の情報を指定します。

  1. 入力タイプ (印刷したいファイルの種類)
  2. 出力タイプ (プリンタが受け付ける入力の種類)
  3. プリンタの種類
  4. プリンタの名前
  5. フィルタプログラムの名前
  6. フィルタプログラムに指定するオプション(もしあれば)

入力タイプ、出力タイプとしては、"simple", "postscript", "raster"などがあります。"simple"が既定値で、それ以外の名前は管理者が自由に決められます。/etc/lp/fd以下にある「フィルタ記述ファイル」を見て下さい。フィルタ記述ファイルについては、フィルタの登録の節で説明しています。

ここからは、実際の印刷の場面で行われることを説明します。印刷スプーラは、印刷に用いるプリンタの名前から、そのプリンタの種類、そしてプリンタが受け付ける入力タイプ(たとえばPostScriptやLIPSなど。印刷スプーラからみると"出力"にあたる)を得ます。プリンタの登録の際に、これらを指定しています。

印刷のジョブが投入されると、印刷スプーラは入力(印刷されるファイル)のタイプを調べます。印刷スプーラの判断にまかせず、自分で指定することもできます。lp -T postscript filenameの如し。

したがって印刷スプーラは、上に挙げたフィルタの登録情報のうち、1〜4を知っています。そしてこれらの情報をもとに、登録されているフィルタの中から対応するものを探し、それを起動するのです。なお、対応するフィルタがなければ、エラーになり、印刷できません。当たり前ですね。

* インターフェイスプログラム

インターフェイスプログラムは、次のような引数を取ります。

  1. ジョブID
  2. 利用者名
  3. ジョブのタイトル
  4. コピー部数
  5. プリンタ固有のオプション
  6. 印刷するファイル名

また、次の環境変数を与えられます。

TERM
プリンタの種類
CHARSET
選択された文字セット
FILTER
実行すべきフィルタプログラム

これらの情報をもとに、インターフェイスプログラムは見出しページ(banner page)を印刷したり、必要な部数のコピーを生成したりするのです。なお、ローカルプリンタの場合は標準出力がプリンタに繋がっています。

インターフェイスプログラムの雛形のシェルスクリプトが /usr/spool/lp/model/以下に入っています。また、プリンタを買ったときについて来ることもあります。インターフェイスプログラムをいじるのは次のような場合です。

印刷するファイルをプリンタの制御コードに変換する仕事は、インターフェイスプログラムにやらせることも出来るのですが、この仕事は通常、フィルタプログラムの仕事です。

* SVR4系印刷スプーラの利点

最後の「特殊な形式の…」について補足します。SVR4の印刷コマンド lp(1)では、入力ファイルの形式を-Tオプションで指定できます。具体的には、たとえばpngファイルなら以下の如し。

% lp -T png file.png

この場合、入力タイプ"png"を扱えるフィルタが用意されていれば印刷できますし、なければ印刷エラーになります。SVR4の印刷スプーラは、このように任意の入力タイプを指定できるので、応用が効きます。

注意!!:
1999年6月28日に、この節の記述を修正しました。以前は誤って-Tではなく-yオプションを付けた例を紹介していました。-Tオプションと-yオプションとでは意味が異なり、ファイルの種別を指定するのには-Tのほうを指定するのが正当です。詳細はマニュアルlp(1)を参照してください。

東大情報の塙さんに、この件に関してご指摘を受けました。どうもありがとうございました。

さてPNGファイルの印刷はつまらない例ですが、サイトによっては、特殊なファイル形式を印刷したい場合があるでしょう。たとえばCADの出力ファイルなどです。適切なフィルタを用意できれば、それを登録することで、印刷が容易になります。

管理者にとっては面倒な話ではありますが、利用者の利便性が向上します。該当する管理者の方は、機会があればチャレンジしてみてはいかがでしょうか。


* プリンタを繋ごう: PostScriptプリンタ編

Solaris 2.xを対象に、プリンタをなるべく利用しやすいように設定する方法を説明します。目標は、

  1. lpコマンドやlprコマンドで印刷できる。
  2. 漢字の入った文書も印刷できる。
  3. 非PostScriptプリンタであっても、PostScriptファイルを印刷できる。
  4. テキストファイルとPSファイルの違いを意識せずに印刷できる。
  5. プリンタの制御コード(ESC/PやLIPS IIなど)で書かれたファイルをプリ ンタに流し込むことができる。

といったところです。

では、まずはPSプリンタから。

* プリンタをケーブルで繋ぐ

この項目は「みんなでプリンタを使おう (BSD 編)」にて詳しく説明しています。そちらを御覧下さい。

-> Sun SPARCstationのパラレルポートとケーブル
(「みんなでプリンタを使おう (BSD編)」 のページ内)

* プリンタを登録する

プリンタを電気的に接続し終えたら、次はシステムにプリンタを登録します。登録には、Xウィンドウベースのadmintool(1M)またはテキストベースのlpadmin(1M)を利用します。

admintoolを使う場合

admintoolを使ってプリンタを登録します。ポイントは以下の通り。

-> 「Admintool: ローカルプリンタの追加」の画面 (JPEG, 29KB)

lpadminを使う場合

lpadminの利用方法は、マニュアルに詳しく書いてあります。しかしあまりに機能が多いので辟易とするかもしれません。ここでは、PSプリンタの登録に必要なオプションについてのみ説明します。

さて、プリンタの登録と利用には、下の3つのコマンドを順番に発行します。

# lpadmin -p printername @BACKSLASH@
	-D "printer description" @BACKSLASH@
	-v /dev/bpp0 -T PS -I postscript
# enable printername
# accept printername

「Admintool: ローカルプリンタの追加」の画面と対比して説明すると、

にそれぞれ対応します。 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

* これでOK!!

プリンタの登録、フィルタの登録(変更)が終われば、これでもうオーケーです。さっそく印刷してみましょう。

% lp -d printername file

うまく印刷できればおなぐさみです。


* プリンタを繋ごう: 非PSプリンタ編

今度はPostScript非対応のプリンタに挑戦します。以下の例では、Canon BJC-600Jというカラーインクジェットプリンタ(バブルジェットプリンタ)を例に挙げています。説明の都合上、前節プリンタを繋ごう: PostScriptプリンタ編にも目を通しておいてください。

BSD系OSでほぼ同じ機能を実現する方法を 「みんなでプリンタを使おう (BSD編)」で述べていますが、SVR4の印刷スプーラの場合は、ファイルの種類を判別して対応するフィルタプログラムを実行する機能が入っているので…決して完全なものではありませんが…BSD系OSの場合よりはいくぶん簡単だと感じています。どうぞお試し下さい。

* 全体の流れ

  1. プリンタをケーブルでワークステーションに繋ぐ。
  2. プリンタの機種をterminfoデータベースに登録する。
  3. プリンタを登録する。
  4. フィルタを入手し、登録する。

PostScriptプリンタとの違いは、まずプリンタの機種の登録が必要なことです。これを次の節で説明します。プリンタの登録の際にも、機種が異なることを意識しながら登録することになります。そして、その機種でテキストファイルなどを正しく印刷するためには、フィルタの登録を行います。

以下、順番に説明します。ただしプリンタをケーブルで繋ぐ方法は、PSプリンタ編と変わらないので割愛します。

* terminfoにプリンタの機種を登録

BSD系のOSでは/etc/printcapにプリンタの設定をしますが、 SVR4ではterminfoというデータベースにプリンタの機種(形式)を登録します。このデータベースには端末の形式(VT100など)も登録されています。

一から作ってもよいのですが面倒です。今まであるデータベースをちょちょいといじって新しいデータを作ることにしましょう。

* プリンタを登録する

プリンタの機種の登録が終わったなら、PSプリンタの場合と同様、システムにプリンタを登録します。プリンタの"機種の登録"とプリンタそのものの登録は異なることに気をつけてください。(同じ機種のプリンタを2台登録することを想像すると、理解できるかな。)

admintoolを使う場合

admintoolを使ってプリンタを登録します。ポイントは以下の通り。

-> 「Admintool: ローカルプリンタの追加」の画面 (JPEG, 29KB)

lpadminを使う場合

# lpadmin -p printername @BACKSLASH@
	-D "printer description" @BACKSLASH@
	-v /dev/bpp0 -T bjc-600j -I bjc-600j
# enable printername
# accept printername

PSプリンタのときと、内容は同じです。ポイントは、

のところです。-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編)」 のページ内)

私は次のようなフィルタを使っています。

* フィルタの登録

さきほど、プリンタbjcが "bjc-600j" というなぞの形式のファイルしか受け付けなくしましたが、その理由は、「テキストファイルやPostScriptファイルをそのプリンタで印刷するには、ファイルの形式を変換するために、専用のフィルタが必要だ」ということを、Solarisの印刷スプーラに認識させるためです。どのフィルタを使えばよいかを印刷スプーラに覚えさせるためには、 フィルタ記述ファイルというものを作り、これを専用のコマンド "lpfilter" を使って印刷スプーラに登録します。

注意: フィルタ記述ファイルは、どのフィルタを使うかを決めるためのものです。フィルタそのものではありません!

/etc/lp/fd/にシステム付属のフィルタ記述ファイルがありますので、それらやlpfilter(1M)のオンラインマニュアルを参考にして、適当なフィルタ記述ファイルを作ります。

私は以下のようなフィルタ記述ファイルを使っています。

どちらの例でも、ポイントはOutput typesにbjc-600jを指定していることです。テキストファイルの場合はInput types: simple、PostScriptファイルの場合はInput types: postscript とします。

フィルタ記述ファイルにはもっといろいろ細かく指定してプリンタの動作を規定することが出来るのですが、この例では最低限の設定だけをしています。

フィルタ記述ファイルを作ったら、そのファイルを/etc/lp/fd/ にコピーしておき、さっき出て来たlpfilter(1M)を使ってフィルタを登録します。例えば上の例のようにbjcsimple.fdbjcpost.fdを登録するのならば、

# cd /etc/lp/fd
# lpfilter -f bjcsimple -F bjcsimple.fd
# lpfilter -f bjcpost -F bjcpost.fd

のようにしてフィルタを登録できます。

* Let's try!

私の所属する流体研では、この程度の設定でCanon BJC-600Jへの印刷が出来るようになりました。皆さんもどうぞお試し下さい。

* 不安なこと: Solaris 7で動かない!?

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の代替機能をご存知の方は、ぜひ金野に教えて下さい。代替機能が見つかった場合には、この節の記述を改めるかもしれません。

* SVR4印刷スプーラの印刷データ識別

BSD系の印刷スプーラLPDは、印刷するファイルの種類を識別する機能がありません。種類の識別は利用者が行い、それをlprコマンドに与えるオプションでシステムに伝える、という仕組みになっています。

SVR4の印刷スプーラは、印刷するファイルの種類をシステム側で識別する機能が入っています。といっても完全なものではないようで、設定を間違えるとバイナリファイルをPSファイルだと思い込んだりします。BSD lprと同じように利用者がlpコマンドにオプションを指定して制御することも出来ます。

テキストファイルとPSファイルの識別を間違われた経験はありませんが、プリンタ制御コードを含むファイルを印刷できるようにするのにはある設定が必要です。これをしないとPSファイル用のフィルタが動き出してエラーを起こします。プリンタ制御コードで書かれたファイルを変換せずにプリンタに流し込みたい場合は、そのための設定を行う必要があります。

なぜプリンタ制御コードを印刷できると嬉しいかは、以下のリンクをたどって読んで下さい。

-> プリンタ制御コードを含むファイルを印刷できるようにする理由
(「みんなでプリンタを使おう (BSD編)」 のページ内)

* 設定方法

さてその方法ですが、実際のプリントフィルタの前に、テキストファイルとバイナリファイルを識別するプログラムを噛ませることにします。このプログラムの機能は次の通りです。

上に述べた機能を持つプログラム "simple-filter"を作りました。以前はCで書いたプログラムを使っていましたが、Perl5のスクリプトを使って置き換えました。このスクリプトは、対象となるプリンタによって、起動するフィルタプログラムを変える機能を持っています。Perlでかかれているので拡張も容易です。

[Down] simple-filter.pl (Perlスクリプト)

以前使っていたプログラムも残しておきます。 lprpsに含まれているpsifというプログラムを元にしています。このプログラムはテキストファイル用のフィルタとして esc-if を起動します。

[Down] 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プロトコル簡易編(データ変換無し)

上記の「リモートプリンタの設定」は、BSD LPR/LPDプロトコルに対応しているネットワークプリンタにも、そのまま応用できます。印刷サーバの欄にそのプリンタのネットワーク的な名前と、対象となるプリンタのLPD的な名前("lp" や"lpd"が多い)を"!"で挟んで指定します。たとえば ml903ps2f!lp の如し。

"LPD的な名前"と言われてもぴんと来ない、など、ネットワークプリンタに関する基礎知識に不安のある方は、以下のページをご覧下さい。また、お使いのネットワークプリンタがどのようなプロトコルに対応しているか分からない場合も、お役に立つと思います。

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

* ネットワークプリンタの設定: BSD LPD非対応のプリンタ and/or データ変換あり

最近のネットワークプリンタはたいてい、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以降でのプリンタの設定

Solaris 2.6以降では/etc/printers.confというファイルがあり、これを設定することで、プリンタやその別名の登録を簡便に行えるようです。便利そうなので使ってみたいのですが、現時点では、私はこの方法をまだ理解していないので、紹介するにとどめます。将来は解説文を書きたいですね。


* プリンタを繋ごう: ネットワークプリンタ編(非PS)

実例があった方が分かりやすいでしょうから、以下は実際にネットワークプリンタを利用するまでを説明します。

私の所属するサイトでは、EPSONがプリンタのオプションとして販売しているEPSONインターフェイスカード(タイプBマルチプロトコルEthernetインターフェイスカード)を、EPSON MJ-5100Cに取り付けて使っています。型番: PRIF8N というものです。 このインターフェイスカードについての詳細は おまけ: EPSON PRIF8Nを UNIXから使う(「ネットワークプリンタを使う」のページ内)で説明しています。簡単に説明すると、 LPDポート(515)、HPネットワークプリンタ互換ポート(9100)が使えるインターフェイスカードです。

* 全体の流れ

  1. プリンタのネットワークに関する設定を行う。
  2. プリンタの機種をterminfoデータベースに登録する。
  3. プリンタを登録する。
  4. フィルタを入手し、登録する。
  5. ネットワーク経由で印刷するために、インターフェイスプログラムを調 整する。

作業内容は、一部を除き「プリンタを繋ごう: 非PSプリンタ編」と変わりません。しかしせっかく新しいプリンタの接続に挑戦するのですから、多少は高度な設定も試してみましょう。

以下、順番に説明します。ただしプリンタのネットワーク的な設定は、各プリンタによって異なるので、プリンタ付属のマニュアルをご覧下さい。

*terminfoにプリンタの機種を登録

「プリンタを繋ごう: 非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プリンタ編」で登録したフィルタはいったん登録を抹消し、以下のようなフィルタ記述ファイルを用いて、新たなフィルタを登録し直しました。

フィルタの登録抹消と、新たな登録は、以下のコマンドで行います。

# 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用フィルタの補足

上に挙げたPostScript用フィルタ記述ファイルでは、最後の2行は次のようになっていました。

Command: /usr/local/sbin/postraster.filter
Options: TERM * = -T *

"Options: TERM * = -T *"の部分に注目してください。TERMにはプリンタタイプが渡されるので、フィルタプログラムは次のように起動されることになります。

Canon BJC-600Jの場合
/usr/local/sbin/postraster.filter -T bjc-600j
EPSON MJ-5100Cの場合
/usr/local/sbin/postraster.filter -T epson-mj

つまり"-T"オプションのあとにプリンタタイプを指定した形で、フィルタが起動されるのです。したがってフィルタプログラム側で、このオプションを読み取ることで、複数のプリンタに対応できます。実際、上で登録しているフィルタpostraster.filter(シェルスクリプト)では、オプション解析をして、 Ghostscriptのドライバを選択しています。

-> postraster.filter

念のために補足しますが、この機能は濫用すべきではありません。非常によく似た機能を持つプリンタで、わずかな違いをフィルタ側で吸収したいときに、利用するとよいでしょう。フィルタの中でオプションの解析をするほうが楽なら、この機能を使えばよいでしょうし、もう一つ新たなフィルタを作った方が楽なら、それに合わせてフィルタ記述ファイルをもう一つ作り、登録するべきでしょう。うまいことやってください。

* インターフェイスプログラムをいじる

この節は、「プリンタを繋ごう: 非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以降でのプリンタの設定

前節でも述べましたが、Solaris 2.6以降では /etc/printers.confというファイルがあり、これを利用してプリンタの別名をつけることもできるようです。現時点では、私はこの方法をまだ理解していないので、紹介するにとどめます。


* 見出しページを省略するには

Solarisの印刷スプーラを使って印刷をすると、標準では「見出しページ」 (banner page)を1ページつけます。見出しページの扱いは次のように分類されます。

  1. 必ず見出しページをつける。(印刷スプーラの既定値)
  2. 標準では見出しページをつけるが、つけないことも出来る。
  3. 標準では見出しページをつけない。

1.はSolarisの印刷スプーラの既定値で、何も設定しなければ必ず見出しページをつけるはずです。2.の方法は簡単なので、興味のある方はlpadmin(1M)を参照して下さい。3.の設定方法はマニュアルには書いていないのでちょっと工夫が必要です。

さて大学の研究室など小規模のサイトでは、印刷する人も少ないでしょうから、見出しページが無くとも困らないと思います。そこで3.の見出しページをつけない設定をするにはどうするかを説明します。

この文書のはじめのSVR4の印刷スプーラの概要で述べたように、見出しページ(banner page)の印刷はインターフェイスプログラムが行なっていますので、見出しページをつけないインターフェイスプログラムを用意して、既存のものと置き換えればよいのです。このためには以下のようにします。
(とても簡単なので、詳細の説明は省かせて下さい。)

  1. cd /usr/spool/lp/model
  2. cp standard localまたは cp jstandard local
  3. エディタで"local"というファイルを開き、332行目(jstandardなら43 行目)の nobanner="no" という行を nobanner="yes" に書き換える。
  4. lpadmin -p プリンタ名 -m local

* SVR4の印刷スプーラ: その他の選択肢

どうしてもSVR4の印刷スプーラに慣れないときには、思い切って他の印刷スプーラに乗り換えるのもひとつの手です。主にBSD系の印刷スプーラを拡張したものなどが手に入ります。私の知っている範囲で、選択肢を挙げますので参考にして下さい。

注意: 私は以下に挙げるソフトウェアを使ったことがありませんので、質問には答えかねます。動くかどうかすら知らない^^;;

SunSoft Print Client
Solaris 2 Migration Kit Version 1.1の一部で、上記ページから ダウンロードできます。SunOS 4.1.3以上で利用できるそうです。プリ ンタの設定ファイル(BSD系スプーラのprintcapに相当するもの)をNIS、 NIS+で共有できます。(Solaris 2.6以降では、標準で利用できるようで す。)
Solaris 2.X LPD
4.3BSD renoのlpdをSolaris 2.xに移植したものです。公式ページは Doug Page2で、ここから最新版をダウンロードできます。
LPRng
BSD系印刷スプーラLPRを拡張したものです。
Common UNIX Printing System (CUPS)
特にネットワークプリンタを有効活用するための、新しいプリンタスプ ーラシステムの提案です。金野はまだ詳細を知りませんが、注目してい ます。

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

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

金野 祥久  konno@researchers.jp

Last modified: Wed Dec 7 13:22:09 JST 2011