この節では, プリンタ機器やプリンタを使用するためのLPD用ソフ トウェアを設定する方法について述べます. この節の概要は次の通り です.
「 プリンタ機器の設定」では, プリンタをコンピュータに接 続するためのヒントがいくつか書かれています.
「 ソフトウェアの設定」では, LPDのスプーラ設定ファイル /etc/printcap の設定方法について書かれています.
データをプリンタに送るためにシリアルまたは パラレルインタフェー スではなく, ネットワークプロトコルを使用する場合は, 「 ネットワークにおけるデータストリームの インタフェースを持つプリンタ」をご覧くださ い.
この節のタイトルは``プリンタ設定導入編''ですが, 実際の設定は かなり複雑です. プリンタをコンピュータに接続し, LPDスプーラを 起動させることは一番困難な作業です. ヘッダページを出力させたり, 課金したりするオプションの設定は, 一度プリンタがうまく動くよう になれば, とても簡単です.
この節では, プリンタにPCを接続するための様々な方法について 説明しています. ここでは, ポートやケーブルの種類, FreeBSDが プリンタとの通信に必要なカーネルコンフィグレーションについて も言及しています.
もし, プリンタが既に接続されていて, 他のオペレーティングシステ ム上でプリンタからの印字に成功している場合は, 「 ソフトウェアの設定」まで読み飛 ばすことが多分できるでしょう.
最近のPC用のプリンタほとんどには次のインタフェースの一つ もしくは両方がついています.
シリアルインタフェースでは, プリンタにデータを 送信するためにコンピュータにあるシリアルポートが使用され ます. シリアルインタフェースはコンピュータ業界で共通し て使用されています. そのケーブルは容易に手に入り, また, 簡単に自作することもできます. シリアルインタフェースには, 特別なケーブルが必要なことがときどきあり, また, 何か複 雑な通信方式選択の設定が必要になることがあります.
パラレルインタフェースでは, プリンタにデータを 送信するためにコンピュータにあるパラレルポートを使用しま す. パラレルインタフェースはPC業界では共通して使われてい ます. ケーブルの入手は容易ですが, 自作するのはシリアルよ りも難しいです. パラレルインタフェースには通常, 通信方式の選 択はなく, このため, 設定が極めて単純になっています.
パラレルインタフェースは ``セントロニクス''インタフェー スとして知られています. これは, プリンタ用のコネクタタ イプとして採用された後に名付けられました.
シリアルインタフェースはパラレルインタフェースより も普通はデータの伝送速度が遅くなります. パラレルインタフェースで は, 通常, (コンピュータからプリンタへの) 単方向通信のみをおこな うのに対して, シリアルインタフェースは双方向通信をおこないます. 最近のパラレルポートの多くはプリンタ側からデータを受けとる こともできますが, コンピュータ側にデータを送り返すことが必 要となるプリンタはほとんどありません. さらに, FreeBSDでは 双方向のパラレル通信をまだサポートしていません.
通常, プリンタで双方向通信が必要となるのは, プリンタが PostScript 言語に対応しているときだけです. PostScript プリ ンタは非常に冗長に動作させることができます. 事実, PostScript によるジョブでは, プログラムを本当にプリンタ に送信します. このことは, 印字作業を必ずしもする必要がない ことを意味し, また, プログラムの結果をコンピュータに直接返 されるかもしれません. PostScript プリンタでは, 双方向 通信を使って, PostScript プログラムのエ ラーや紙づまりといった問題をコンピュータに報告します. ユー ザはそれらの情報を知りたいと思うかもしれません. さらに, PostScript プリンタで課金作業をもっとも効率よくおこなうため には双方向通信が必要となります. この方法では, まず, プ リンタの現在のページカウント (起動してから今まで何枚の紙を 印字したか) の情報を得ます. 次に, ユーザのジョブをおこない, 終 了後, 再びページカウントを得ます. この2数を差によって, 課 金対象となる紙の枚数を知ることができます.
それでは, どちらのインタフェースを使うべきなのでしょうか.
双方向通信が必要なら, シリアルポートを使ってくださ い. FreeBSDではパラレルポート上での双方向通信はまだサポー トされていません.
双方向通信の必要がなく, パラレルかシリアルかの選 択ができる場合はパラレルインタフェースを使うのが好ましい です. これにより, シリアルポートを他の周辺機器 (端末やモ デムのなど) のために残しておくことができます. また, パラ レルインタフェースの方がほとんどの場合高速であり, 設定も より簡単になっています.
結局のところは 動いてくれるものを使えばよいのです.
プリンタをパラレルインタフェースを使って接続する場合は, セントロニクスケーブルでプリンタと コンピュータをつないでくださ い. 詳しい説明はプリンタ, コンピュータ, あるいは両方に付属す る説明書に書かれているはずです.
その際, どのパラレルポートを使用したかを覚えておいてください. FreeBSDでは最初のポートは /dev/lpt0, 2番目は /dev/lpt1 であ り, 3番目以降も同様に続きます.
シリアルインタフェースを使ってプリンタを使う場合は, 適切 なシリアルケーブルでプリンタ とコンピュータを接続してください. 詳しい説明はプリンタ, コンピュータ, あるいは両方に付属する説 明書に書かれているはずです.
``適切なシリアルケーブル'' がよくわからないときは, 次のどれか を試してみてください.
モデム 用ケーブルでは, それぞれのピンは他方の コネクタの対応するピンと線でつながっています. このタイプ のケーブルは, ``DTE-DCE'' 間ケーブルとしても知られています. (訳注: 日本ではストレートケーブルという名前で売られています)
ヌルモデム 用ケーブルでは, あるピンは対応するピ ント接続していますが, あるピン (例えば, データ送信用とデー タ受信用のピン) が交差して接続したり, いくつかのピンは内部 で短絡していたりします. このタイプのケーブルは, ``DTE-DTE'' 間ケーブルと呼ばれています. (訳注:日本ではクロスケーブル という名前で売られています)
A シリアルプリンタ用ケーブルは, ある特定のプ リンタで必要とされ, ヌルモデムケーブルと似ていますが, 内 部で短絡させる代わりに, ある信号を他方側に送るために使用 しています.
この他に, プリンタ用の通信パラメータを設定する必要がありま す. 通常, プリンタのフロントパネルやDIPスイッチによって制 御します. コンピュータとプリンタの双方で設定できる最高の通 信速度[bps] (ビット/秒. ボーレートと示されているときも ある) を選んでください. そして, データビット (7または8), パリ ティ (偶/奇/なし), ストップビット (1または2) を選んでください. そして, フローコントロールの有無 (制御なし, または XON/XOFF(``イン・バンド'' または ``ソフトウェア''フローコ ントロールとも呼ばれる)) を選びます. 以下に続くソフトウェア の設定のために, ここでの設定を覚えておいてください.
本節では FreeBSD の LPD スプーリングシステムで印字をおこなうために 必要となるソフトウェアの設定について説明しています.
本節の概要は次のようになります.
プリンタで使用するポートのために, 必要があれば, カー ネルの書き変えをおこないます. 「カーネルの変更」で, このためにしなくてはなら ないことを説明しています.
パラレルポートを使用している場合は, パラレルポートの ための通信モードの設定します. 詳細は, 「 パラレルポートの通信モードを設定する 」で説明しています.
オペレーティングシステムからプリンタにデータが送ら れているかをテストします. 「 プリンタとの通信状況を調べる」で, どのように テストするかの提案をいくつかおこなっています.
ファイル/etc/printcapを変更し, LPDの設定を おこないます. 「/etc/printcap ファイル」で, どのように変更するかを 説明しています.
オペレーティングシステムのカーネルの コンパイルをおこなうこと によって, 指定されたのデバイスが機能するようになります. シリ アル, または, パラレルインタフェースをプリンタで使用する場合, 必要なデバイスがこの指定の中に含まれていなくてはなりません. したがって, 必要なデバイスがカーネルに組み込まれていない場合, 追 加のシリアル, または, パラレルポートをサポートするために, カー ネルの再コンパイルが必要となるかもしれません.
シリアルポートが現在使用しているカーネルで サポートされている かどうかを調べるためには, 次のように入力します.
# dmesg | grep sioN
ここで, N はシリアルポートの番号を示し, この番号は0から 始まります. 次のような出力があった場合, カーネルはそのポー トをサポートしています.
sio2 at 0x3e8-0x3ef irq 5 on isa sio2: type 16550A
パラレルポートが現在使用しているカーネルで サポートされている かどうかを調べるためには, 次のように入力します.
# dmesg | grep lptN
ここで, N はパラレルポートの番号を示し, この番号は0から 始まります. 次のような出力があった場合, カーネルはそのポー トをサポートしています.
lpt0 at 0x378-0x37f on isa
上記の出力が得られない場合, プリンタを使うため, オペレーティ ングシステムにパラレル, または, シリアルポートを認識し, 使用 できるようにするためには カーネルを変更する必要があります.
シリアルポートをサポートさせるには, 「 FreeBSDカーネルのコンフィグレーション」の節をご覧く ださい. パラレルポートをサポートさせる場合も, その節と, あ わせて, この節に続く節もご覧ください.
カーネルがシリアル, または, パラレルポートを通じての通 信をサポートしていたとしても, システム上で動いているプログ ラムがデータの送受信をおこなうための ソフトウェアインタフェース がさらに必要になります. そのインタフェースは, /dev ディレクトリにあるエントリに相当します.
/dev エントリにポートを加えるために
su(1) コマンドで root になります. suコマンド でパスワードを聞かれたら, ルート用のパスワードを入力し ます.
/dev ディレクトリに移動します.
# cd /dev
次のように入力します.
# ./MAKEDEV port
ここで, port は, 作成するポート名です. 1番目 のパラレルポートのときは lpt0 に, 2番目のときは lpt1 になり, 以降同様になります. 1番目のシリア ルポートのときは, ttyd0 に, 2番目のときは ttyd1 になり, これも以降同様となります.
次を入力し, デバイスのエントリができたか確認し ます.
# ls -l port
パラレルインタフェースを使用している場合, FreeBSDでは, 割り込み駆動型にするか, プリンタとの通信の状況をカーネルに監 視させるかのいずれかを選択できます.
GENERIC カーネルでは割り込み駆動方式が, デフォルトになっています. この方式では, オペレーティングシ ステムはプリンタがデータを受け付けられるかどうかを調べ るために, IRQ ラインを一つ使用します.
監視方式では, オペレーティングシステムにプ リンタがもっとデータを受け付けられるかどうかを繰り返し 尋ねるように指示します. そして, 受け付けるという応答を 受けたとき, カーネルはさらなるデータを送信します.
割り込み駆動方式は, いくらか高速になりますが, 貴重な IRQ ラインを一つ消費します. うまく機能するものをお使いください.
通信モードを設定するためには2つの方法があります. 1つはカー ネルを変更することで, もう一つは lptcontrol(8) プログラムを使用する方法です.
カーネルを設定することによって, 通信モードを変更する.
カーネルコンフィグレーションファイルを変更しま す. lpt0 のエントリを探すか追加してください. 2番目 のパラレルポートを設定するときは, 代わりに lpt1 を使います. 以下, 3番目のポートは lpt2 となってい きます.
イベント駆動方式にする場合は, irq 指 定を追加します.
device lpt0 at isa? port? tty irq N vector lptintr
ここで, N はパラレルポート用の IRQ 番号で す.
監視方式を使用する場合は, irq を追加 してはいけません.
device lpt0 at isa? port? tty vector lptintr
ファイルをセーブし, config プログラムを起動 し, カーネルの構築, インストールをおこないます. そして, リ ブートしてください. 詳細は, 「 FreeBSDカーネルのコンフィグレーション」を参照 してください.
lptcontrol(8) で通信モードを設定する場合
lptN をイベント駆動方式に設定する場合は, 次のように入力します.
# lptcontrol -i -u N
lptN を監視方式に設定する場合は, 次のように入力します.
# lptcontrol -p -u N
これらのコマンドを /etc/rc.local ファイルに追加 しておくと, システムをブートする度に通信モードを設定する ことができます. 詳細については, lptcontrol(8) をご覧ください.
スプーリングシステムの設定に進む前に, オペレーティング システムがプリンタにデータを送ることに成功しているかどうか を確かめるべきでしょう. これにより, 印字がうまくいかないと き, プリンタとの通信が問題なのか, スプーリングシステムが問 題なのかを分けて調べることがかなり容易になります.
プリンタをテストするためには, プリンタに何かのテキストを送 信してみます. 送信した文字をすぐに印字してくれるプリンタに は, lptest(1) コマンドを使うと有用です. このコマンドは印 字可能な96文字のASCII文字すべてを96行生成します.
PostScript (または他の言語に対応した) プリンタの場合 は, もっと巧妙なテストが必要になります. 次のような, 簡単な PostScript プログラムを使えば十分でしょう.
%!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Is this thing working?) show showpage
Note: このドキュメントでプリンタ用言語を参照するとき は, PostScript のような言語を仮定しており, Hewlett Packard の PCL は考慮していません. PCL は非常に機能的なの ですが, プレインテキストにエスケープシーケンスを混ぜること ができます. PostScript ではプレインテキストを直接印字 することはできません. このような種類のプリンタ言語に対して は, 特別な対応をおこなわなければなりません.
この節では, FreeBSDがパラレルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について説明し ています.
パラレルポートのプリンタをテストするために
su(1) コマンドで root になります.
プリンタにデータを送ります.
プリンタがプレインテキストを印字できる場合, lptest(1) コマンドを使います. 次のように入力してください.
# lptest > /dev/lptN
ここで, N はパラレルポートの番号で, 番号は 0から始まります.
プリンタが PostScript か他のプリンタ 言語を使用している場合, そのプリンタに簡単なプロ グラムを送信してください. 次のように入力します.
# cat > /dev/lptN
そして, 一行一行, プログラムを慎重に入力して 下さい. RETUREN または ENTER キーを入力してしま うと, その行は編集できなくなります. プログラムの 入力が終わったら, CONTROL+Dか, あなたが設定して いるファイル終了のキーを押してください.
もしくは, プログラムを入力したファイルがある 場合は, 次のように入力してください.
# cat file > /dev/lptN
ここで, file はプログラムが格納されていて, プリンタに送信するファイルの名前です.
これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します.
この節では, FreeBSDがシリアルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について述べられ ています.
シリアルポートのプリンタをテストするために
su(1) コマンドで root になります.
/etc/remote ファイルを編集します. 次の エントリを加えてください.
printer:dv=/dev/port:br#bps-rate:pa=parity
ここで, port シリアルポート (ttyd0, ttyd1 など) のデバイスエントリで, bps-rateは プリンタとの通信の転送速度[bit/秒], parityはプリ ンタとの通信で必要とされるパリティ (even, odd, none, zeroのいずれか) を表わしていま す.
次の例は, プリンタをシリアルケーブルでパリティなし, 転送速度 19200bpsで第3番目のシリアルポートに接続した場 合です.
printer:dv=/dev/ttyd2:br#19200:pa=none
tip(1) コマンドでプリンタと接続します. 次のよ うに入力してください.
# tip printer
これがうまくいかなかった場合は, /etc/remoteを 編集して, /dev/ttydN の代わりに /dev/cuaaN を試してみてください.
プリンタにデータを送ります.
プリンタがプレインテキストを印字できる場合, lptest(1) コマンドを使います. 次のように入力してください.
~$lptest
プリンタが PostScript か他のプリンタ 言語を使用している場合, そのプリンタに簡単なプロ グラムを入力します. 一行一行, プログラムを慎 重に入力してください. バックスペースキーや他の編 集用のキーは, プリンタの制御コードに割り当てられ ているかもしれません. プログラムが終了したことを プリンタに伝えるための特別なファイル終了キーを入 力する必要があるかもしれません. PostScript プリンタの場合, CONTROL+Dを入力します.
もしくは, プログラムを入力したファイルがある 場合は, 次のように入力してください.
~>file
ここで, file はプログラムが格納されている ファイル名です. tip(1) コマンドでファイルを送 信した後は, ファイル終了を表わすキーを入力する必要 があります.
これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します.
ここまでで, プリンタはコンピュータに接続され, (必要なら) プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ リンタに送信することができているはずです. これで, LPDにプリ ンタへのアクセスを 制御させる設定をおこなう準備が整いました.
LPDの設定は /etc/printcap を編集することでおこないます. LPDスプーリングシステムはスプーラが使われる毎にこのファイル を参照します. そのため, ファイルを更新するとすぐにその変更が 反映されます.
printcap(5) ファイルの書式は簡単です. /etc/printcap の編集はお好みのテキストエディタをお 使いください. このファイルの書式は, /usr/share/misc/termcap や /etc/remote といった他のケイパビリティファイルと一致しています. この書式 のついての詳細な情報については cgetent(3) をご覧ください.
スプーラの単純な設定法は, 次のステップでおこないます.
プリンタに名前 (と簡単な別名2〜3個) を付け, それを /etc/printcap ファイルに記述します. これについ ては, 「 プリンタに名前を付ける」 を参照してください.
sh の項目を追加することで, ヘッダページの出 力を禁止します (デフォルトは許可). これについては, 「 ヘッダページの印字を禁止する」 を参照してください.
スプール用のディレクトリを作成し, その位置を sd 項目で指定します. これについては, 「 スプーリングディレクトリの作成」 を参照してください.
プリンタを使用するために /dev エントリを 設定し, /etc/printcap の lp 項目でそのエ ントリを指定します. これについては, 「 プリンタデバイスの特定」 を参照してください. プリンタをシリアルポートに接続した場合は, fs, fc, xs, xc の項目を設定する必要があります. こちらについては, 「 スプーラのための通信パラメータの設定」 を参照してください.
プレインテキスト用の入力フィルタのインストールを おこないます. 「 テキストフィルタのインストール」 を参照してください.
lpr(1) コマンドで何かを印字することで設定のテス トをおこないます. 印字してみよう と トラブルシューティング を参照してください.
Note: PostScript プリンタのような, プリンタ言語を 使用しているプリンタには, プレインテキストを直接印字させる ことができません. 上にアウトラインを示し, 以下の節で説明す る簡単な設定方法の説明では, そのようなプリンタを設置してい る場合は, プリンタが認識できるファイルだけを印字の対象とし ているという仮定をしています.
多くの場合, 利用者はシステムに設置されているプリンタすべてでプ レインテキストが印字できることを期待しています. 印字作業を おこなうためにLPDのインタフェースを利用するプログラムでも, 通 常, そのような仮定を置きます. プリンタ言語を使用するプリン タを設置しており, そのプリンタ言語で記述されたジョブと, これに加えて, プレインテキストのジョブも印字できるよ うにしたいならば, 上で示した簡単な設定方法に加えて, さら なる設定をおこなうことを強くお勧めします. すなわち, 原始的なプ レインテキストから PostScript (もしくは, 他のプリンタ 言語) に変換するプログラムをインストールしてください. 「 プレインテキストのジョブを PostScript プリンタで印字する」 で, そ れをどのようにおこなえばよいのかが 説明されています.
Note: 日本語を印字したい場合は, プリンタ言語を使用し ていない「日本語プリンタ」についても, プリンタ固有のエスケー プシーケンスを送る必要があります. また, 漢字コードをプリン タが設定しているものに変換したりする必要があり, 各プリンタ 毎に, 日本語用のフィルタが必要になります.
最初の (簡単な) ステップで, プリンタの名前を考えます. プ リンタには別名をいくつか付けることもできるので, 機能的な名前 でも風変わりな名前でもどちらを選んでもまったく 問題はありません.
少なくとも1つのプリンタには, /etc/printcap の中 で, lp という別名を持たせるべきでしょう. この名前は デフォルトのプリンタ名になっています. ユーザが環境変数 PRINTER を設定しておらず, かつ, LPDコマンドのコマンドラインでプリ ンタの名前が指定されていない場合, lp がデフォルトのプリ ンタ名となり, そのプリンタに出力されます.
それから, これは共通の慣習ですが, プリンタの最後の別名には, メーカーやモデル名を含むプリンタの完全な名称をつけることに なっています.
名前と別名のいくつかを決めたら, /etc/printcap ファ イルに設定します. プリンタ名は一番左のカラムから書き始めま す. 別名はそれぞれ縦棒によって区切られ, 最後の別名の後ろに コロンを置きます.
次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義 されている /etc/printcap のスケルトンを記しています.
# # /etc/printcap for host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
この例では, 最初のプリンタに rattan という名前と別名 として, line, diablo, lp そして Diablo 630 Line Printer が付けられています. 別名とし て lp があるので, このプリンタはデフォルトのプリンタとなっ ています. 2番目は bamboo と名付けられ, 別名として, ps と PS, S, panasonic, Panasonic KX-P4455 PostScript v51.4 が付けられていま す.
LPDスプーリングシステムでは, デフォルトでジョブ毎にヘッ ダページを印字します. ヘッダページにはジョブを要求したユー ザ名, ジョブが送られたホスト名, そして, ジョブの名前が素晴 らしい大きな文字で印字されています. 残念なことに, この余分 なテキストすべてが, 簡単なプリンタ設定法のデバッグの際に紛れ 込んできてしまいます. このため, ヘッダページの出力を禁止し ておきます.
ヘッダページの出力を禁止するには, /etc/printcap にあるプリンタのエントリに sh の項目を追加します. 次 に, sh を加えた /etc/printcap の例を示します.
# # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:
この書式を正しく使うための注意をしておきます. 最初の行は左 端のカラムから始まります. それに続く行は TAB ひとつ分だけ 字下げします. 最後の行以外のすべての行は, 行末にバックスラッ シュを記述します.
スプーラの簡単な設定の次のステップでは, スプーリン グディレクトリを作成します. プリンタに送られるジョブ は, その印字が終了するまでこのディレクトリに置かれます. また, 他のたくさんのスプーラもこのディレクトリにファイ ルを置きます.
様々な事情によりスプーリングディレクトリは, 通常, 慣例 として /var/spool の下に置きます. また, スプーリングディレクトリの内容はバックアップをす る必要はありません. mkdir(1) によってディレクトリを 作るだけでスプーリングディレクトリの復旧は完了します.
スプーリングディレクトリの名前は, これも慣例ですが, 次 のようにプリンタの名前と同じにします.
# mkdir /var/spool/printer-name
しかしながら, ネットワーク上に使用可能なプリンタがたく さんあるならば, LPDで印字するための専用のディレクトリに スプーリングディレクトリを置きたいと思うかもしれません. 例に出てきたプリンタ rattan と bamboo につい て, この方式を採用すると, 次のようになります.
# mkdir /var/spool/lpd # mkdir /var/spool/lpd/rattan # mkdir /var/spool/lpd/bamboo
Note: 各ユーザが印字するジョブのプライバシを守りた いと考えているならば, スプーリングディレクトリを保護し て, これを誰からでもアクセスできないようにしたいと思う かもしれません. スプーリングディレクトリは, deamon ユー ザと daemon グループに所有され, 読み込み, 書き込み, 検 索可能であり, 他からはアクセスできないようにするべきで す. 例題のプリンタに対して, 次のようにすることにしましょ う.
# chown daemon.daemon /var/spool/lpd/rattan # chown daemon.daemon /var/spool/lpd/bamboo # chmod 770 /var/spool/lpd/rattan # chmod 770 /var/spool/lpd/bamboo
最後に, /etc/printcap ファイルで, これらのディ レクトリの位置を LPD に伝える必要があります. スプーリ ングディレクトリのパス名は sd 項目で指定します.
# # /etc/printcap for host rose - added spooling directories # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:
プリンタ名が最初のカラムから始まっており, そのプリンタ に関して記述される他のエントリは TAB で字下げされてい ること, 各行がバックスラッシュで終わっていることに注意 してください.
sd によりスプーリングディレクトリが指定されていな い場合, スプーリングシステムは /var/spool/lpd デフォルト値として使用します.
「ポート用エントリを /dev に追加する」では, FreeBSD でプリン タとの通信に使用される /dev ディレクトリ内の エントリを特定します. そして, LPD にその情報を伝えま す. 印字するジョブを受け取ると, スプーリングシステムは, (プリンタにデータを渡す義務がある) フィルタプログラムに 代わって指定されたデバイスをオープンします.
/etc/printcap ファイルで lp 項目を使って /dev エントリを記入します.
ここでの例では, rattan は1番目のシリアルポートに, bamboo は6番目のシリアルポートに接続されているこ とにしましょう. このとき, /etc/printcap には 次のようになります.
# # /etc/printcap for host rose - identified what devices to use # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:
/etc/printcap でプリンタの lp 項目が指定 されていない場合は, LPD はデフォルトとして /dev/lp を使用します. /dev/lp は, 現在の FreeBSD には存在していません.
設置したプリンタがパラレルポートに 接続されている場合は, 「 テキストフィルタのインストール」 まで読み飛ばしてください. そうでない場合は, 次節の説明に続いてください.
シリアルポートにプリンタを接続した場合, プリンタにデー タを送信するフィルタプログラムに代わり, 通信速度やパリ ティ, その他のシリアル通信パラメータを設定することがで きます. このことによる利点は,
/etc/printcap を編集するだけで, 様々な 通信パラメータを試してみることができます. フィルタプロ グラムを再コンパイルする必要はありません.
スプーリングシステムで, シリアル通信の設定が異 なっているかもしれない複数のプリンタに同じフィルタプロ グラムを使うことが可能になります.
次の /etc/printcap の項目で, lp で指定 されたデバイスのシリアル通信 パラメータを制御できます.
デバイスの通信速度を bps-rate に設定します. ここ で, bps-rate は 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400[bit/秒] のいずれかです.
デバイスをオープンした後で, sgttyb 構造体の clear-bits フラグビットをクリアします.
sgttyb 構造体の clear-bits フラグビットをセッ トします.
デバイスをオープンした後で, ローカルモードビット clear-bits をクリアします.
ローカルモードビット set-bits をセットします.
fc, fs, xc, そして xs のビットに関 する詳しい情報については, /usr/include/sys/ioctl_compat.h を参照してく ださい.
項目 lp で指定されたデバイスを LPD がオープンする とき, LPD は sgttyb 構造体のフラグビットを読み出 します. そして, 項目 fc の全ビットをクリアします. 次に, 項目 fs のビットをセットし, その結果を設定 します. ローカルモードビットに関しても同様におこなわれます.
例題のプリンタで6番目のシリアルポートに接続されたプリ ンタの設定を追加してみましょう. 通信速度は38400bpsに設 定します. フラグビットとして, TANDEM, ANYP, LITOUT, FLUSHO, PASS8 をセットします. ローカルモードビットでは, LITOUT と PASS8 フラグをセットします.
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000c1:xs#0x820:
ここまでで, プリンタにジョブを送るために使うテキストフィ ルタを LPD に設定する準備が整いました. テキストフィ ルタとは, 入力フィルタとしても知られていますが, 印字するジョブがあるときに LPD が起動するプログラムで す. LPD がプリンタのためにテキストフィルタを起動する とき, LPD はフィルタの標準入力からプリントするジョブ を入力し, フィルタの標準出力に項目 lp で指定され たプリンタデバイスを接続します. フィルタは, 標準入力か らジョブを読み込み, プリンタのための必要な変換をおこなった 後, その結果を標準出力に出力する, これにより印字がなさ れることを期待されています. テキストフィルタについての 更に詳しい情報については, 「 フィルタはどのように機能しているか」 をご覧ください.
ここでの簡単なプリンタ設定では, プリンタにジョブを送るため, /bin/cat を実行するだけの簡単なシェルスクリプ トで間に合います. FreeBSD に標準で付属している lpf というフィルタでは, バックスペース文字を使っ た下線引きの動作をおこなう文字ストリームをうまく扱うことが できないプリンタのための代替処理をおこなってくれます. もちろん, 他のどんなフィルタプログラムを使っても構いません. フィルタ lpf については, 「テキストフィルタ lpf」で詳しく説明します.
最初に, 簡単なテキストフィルタであるシェルスクリプト /usr/local/libexec/if-simple を作ってみましょ う. 次のテキストをお好みのテキストエディタでファイルに 書き込んでください.
#!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. /bin/cat && exit 0 exit 2
そして, このファイルを実行可能にします.
# chmod 555 /usr/local/libexec/if-simple
LPD にこのテキストフィルタを使うことを設定するためには, /etc/printcap に if 項目を使って指定しま す. これまでの /etc/printcap の例のプリンタ 2台に, このフィルタを加えてみましょう.
# # /etc/printcap for host rose - added text filter # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\ :if=/usr/local/libexec/if-simple:
簡単な LPD 設定も終わりにたどり着きました. 残念ながら, 設定はこれでおしまいというわけではありません. なぜなら, さらに, 設定をテストし, すべての問題点を解決しなくては ならないからです. 設定をテストするために, 何かを印字し てみましょう. LPD システムで印字をするためには, lpr(1) コマンドを使います. このコマンドは, 印字する ためのジョブを投入する働きをします.
lpr(1) コマンドを 「 プリンタとの通信状況を調べる」で紹介した, あるテスト用のテキストを生成してくれる lptest(1) プログラムと一緒に使うこともできます.
簡単な LPD 設定をテストするために:
次のように入力してください.
# lptest 20 5 | lpr -Pprinter-name
ここで, printer-name は /etc/printcap で指定したプリンタ名 (もしくはその別名) です. デフォルト のプリンタを使用する場合は, -P 引数を付けないで lpr(1) を打ち込んでください. もう一度述べますが, ポス トスクリプトを期待しているプリンタをテストするならば, lptest(1) を使う代わりに PostScript で書かれたプ ログラムをプリンタに送ってください. プログラムを送るた めには, プログラムをファイルに格納して, lpr file と打ち込みます.
PostScript プリンタの場合, 送信したプログラムによ る結果が得られるでしょう. lptest(1) を使った場合は, 以下のような結果が見られるでしょう.
!"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 $%&'()*+,-./01234567 %&'()*+,-./012345678
更にプリンタをテストしたい場合は, (言語ベースのプリン タのための) もっと大きなプログラムを送信するか, 引数を 変えて lptest(1) を実行します. 例えば, lptest 80 60 で それぞれ80文字の行を60 行生成します.
プリンタがうまく動かなかった場合は, 次の節, 「 トラブルシューティング」をご覧ください.
lptest(1) を使った簡単なテストをおこなった結果, 正しい出 力を得られずに, 以下に示すような出力が得られるかもしれ ません.
プリンタは上で示されたような印字を おこなったのですが, しばら くして止まってしまい, 動かなくなってしまいました. 印字 された結果をプリンタから取り出すためには, プリンタにある PRINT REMAINING ボタン, また は, FORM FEED ボタンを押す必要があるようです.
この場合は, おそらくジョブはプリントをする前に更にデー タが送られてこないか待ち続けているのでしょう. この問題を解決するためには, プリンタに FORM FEED 文字 (あるいは特定の必要な文字コード) を 送るテキストフィルタを使ってください. プリンタ内部に残っ たデータをプリンタにすぐに印字させるには, 普通は, これ で十分です. 次のジョブが前のジョブの最終ページの中央の どこかから印字を開始させないためにも, 紙の途中で印字の ジョブが終了したかどうかを確認するのは有益です.
シェルスクリプト /usr/local/libexec/if-simple を次のように変更して, プリンタへジョブを送信した後に FROM FEED 文字を印字させるようにします.
#!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. # Writes a form feed character (\f) after printing job. /bin/cat && printf "\f" && exit 0 exit 2
次のような印字結果が得られた.
!"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456
あなたは「階段効果」 の新たなる犠牲者になってしま いました. この原因は, 改行を表わすべき文字がなんであるか の解釈が混乱していることにあります. UNIX スタイルのオ ペレーティングシステムでは, 改行文字は ASCII コード10 の line feed (LF) の1文字が使われています. MS-DOS や OS/2などは ASCII コード10の LF と, ASCII コード 13の文字 (carriage return または CR) をペアで使います. (訳注:Machintosh では CR のみで表現されています). 大抵のプリンタでは, 改行を表わすために MS-DOS の慣習にしたが います.
FreeBSD で印字する場合, 印字したテキストは LF 文字だけ が使われていました. プリンタでは LF 文字を見つけると, 紙を1行分送り出しました. しかし, 次の文字を印字するた めの紙の水平方向の位置は維持されました. すなわち, CR 文字が意味することは, 次の文字を印字する位置を紙の左端 に動かすことです.
FreeBSD がプリンタに動作をして欲しいと思っている動作を 以下に示します.
プリンタが CR を受け取ったとき | CR 動作 (復帰) をおこなう |
プリンタが LF を受け取ったとき | CR + LF 動作 (復帰, 改行) をおこなう |
このように動作させるための方法が いくつかあります.
これらの文字の解釈を変えるために, プリンタ の設定スイッチかコントロールパネルを操作する方 法. どのようにして設定をするかはプリンタのマニュ アルを参照してください.
Note: FreeBSD 以外のオペレーティン グシステムを切り替えて使う場合, CR と LF 文字 の解釈をそのオペレーティングシステムで使われて いるようにプリンタを 再設定する必要がある かもしれません. 以下に示す解決方法のいずれかを 選ぶのがよいかもしれませんね.
自動的に LF を CR+LF に変換してくれる FreeBSD 用のシリアルドライバを入手する方法. も ちろん, このドライバはプリンタ専用に接続される シリアルポート のみで動作します. この機能 を許可するためには, /etc/printcap ファ イルで対象プリンタの fs 項目で CRMOD ビッ トをセットします.
LF 文字の扱いを一時的に変更するためのエ スケープコードをプリンタに送る方法. プリンタ がサポートしているかもしれないエスケープコード については, プリンタのマニュアルを参照してくだ さい. 適切なエスケープコードが見つかったら, 最 初にそのコードを送り, 次にプリントジョブを送信 するようにテキストフィルタを変更してください.
次に, Hewlett Packard 社の PCL エスケープコー ドに対応しているプリンタのためのテキストフィル タの例を示します. このフィルタでは, プリンタ に LF 文字を LF と CR の2文字として扱わせます. その後に, プリンタにジョブを送ります. 最後に, ジョブの最終ページの紙を排出するため, FROM FEED 文字を送ります. このフィルタは Hewlett Packard 社のほとんどすべてのプリンタで機能するは ずです.
#!/bin/sh # # hpif - Simple text input filter for lpd for HP-PCL based printers # Installed in /usr/local/libexec/hpif # # Simply copies stdin to stdout. Ignores all filter arguments. # Tells printer to treat LF as CR+LF. Writes a form feed character # after printing job. printf "\033&k2G" && cat && printf "\f" && exit 0 exit 2
ホスト orchid にある /etc/printcap の 例を以下に示します. ここには, 一番目のパラレル ポートにプリンタ (Hewlett Packard LaserJet 3Si) が一台接続されており, そのプリンタ名は teak です.
# # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:
Note: 訳注: LF を CR+LF に置き換える cat コマンド を作る方法も当然考えられます. そして, このコマ ンドと, if-simple の cat の部分 を置き換えればよいわけです. 具体的にどのように するかは, 読者への練習問題としましょう.
プリンタは紙送りをまったくしませんでした. テキストすべての行 がある行の上で重ねて印字されてしまいました.
この問題は, 階段現象とは``正反対''な問題で, ほとんどま れにしか起こりません. FreeBSDでは行末として扱われる LF 文字が, 紙の左端に印字位置を復帰しますが, 紙送りはしな い CR 文字として扱われています.
プリンタの設定スイッチかコントロールパネルを 使って, LF と CR の文字を次のような解釈をするようにしてください.
プリンタが受け取ったとき | プリンタがおこなう |
---|---|
CR | CR 動作 (復帰) |
LF | CR + LF (復帰, 改行) |
Note: 訳注: LF を CR+LF に置き換える cat コマンドを作る方法 も当然考えられます. そして, このコマンドと, if-simple の cat の部分を置き換えればよいわけ です. 具体的にどのようにするかは, 読者への練習問題とし ましょう.
印字しているのですが, 各行の2〜3文字が印字されません. プリンタを動かせば動かすほど, もっとたくさんの文字が紛 失されていき, この問題は更に悪くなっていくかもしれませ んでした.
この問題は, シリアルポートを通してコンピュータから送ら れてくるデータの速度に, プリンタがついていけないことに 起因します (この問題は, パラレルポートに接続されたプリ ンタでは発生することはありません). この問題を克服する 方法が2つあります.
プリンタが XON/XOFF のフロー制御をサポート している場合は, 項目 fs で TANDEM ビット をセットして, FreeBSD にこの機能を使用させて ください.
プリンタがキャリアフロー制御をサポートして いる場合は, 項目 fs で MDMBUF ビットをセッ トして下さい. それから, プリンタとコンピュータ を接続しているシリアルケーブルがキャリアフロー 制御用に正しく配線されたものかどうかを確認して ください.
プリンタがフロー制御をまったく サポートしていな い場合は, 項目 fs の NLDELAY と TBDELAY, CRDELAY, VTDELAY, BSDELA のいくつかのビッ トを組み合わせて使い, プリンタへ送るデータの流 れに適当な遅延を加えてください.
プリンタはランダムなゴミのように 見えるものを印字しまし たが, 意図したテキストは印字してくれませんでした.
この問題は, 通常, シリアルポートに接続したプリンタでの 通信パラメータの誤りからくる前項とは別の症状です. br 項目の通信速度と fs と fc 項目のパリ ティビットの設定を共に調べてみてください. また, プリン タでの設定が /etc/printcap ファイルで設定した 内容と一致しているかどうかも確認してください.
Note: 訳注: simple-if のような単純なフィルタだけの状態で, 日 本語を含むテキストを印字しようとした場合にも, シリアル ポート, パラレルポートの使用に関係なく, このような症状 は見られます. 日本語プリンタの場合, 漢字コードそのもの を送信しただけでその漢字を印字してくれるものは, 少なく とも訳者は見たことがありません. 漢字を印字するための制御 コードを別途送信するフィルタが必要となります. また, そ のようなフィルタを使用していても, そのフィルタが想定し てる漢字コードと異なった文書を プリントしようとしたとき もこのような症状は出ます. もちろん, これはプリンタ用の 言語を持たないプリンタの話で, PostScript プリンタ などにプレインテキストを送信しても, 日本語対応, 非対応 に関らず, 意味不明な文字列が印字される (もしくは, 何も 印字されない) ことでしょう.
もしプリンタが何の動作もしないのであれば, ハード的な問 題ではなく, 多分 FreeBSD の中に問題があります. /etc/printcap ファイルで, デバッグしているプ リンタのエントリに (lf 項目で) ログファイルを取るよ うに設定を追加してください. 例えば, プリンタ rattan 用のエントリの項目 lf は次のようになります.
rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple:\ :lf=/var/log/rattan.log
次に, もう一度印字をおこなってみます. そして, 発生したと思 われるエラーメッセージを見るためにログファイル (上記の 例では, /var/log/rattan.log) を調べます. そこ で見られたメッセージを元に, 問題を解決してみてください.
項目 lf が指定されていない場合, LPD はデフォルト のログファイルとして /dev/console を使います.