9.3. 基本的なセットアップ

LPD スプーリングシステムを用いてプリンタを使用するためには、 プリンタ機器と LPD 用ソフトウェアの両方を準備する必要があります。 本文書では次の二段階のレベルに分けて説明をします。

9.3.1. プリンタ設定導入編

この節では、プリンタ機器やプリンタを使用するための LPD 用ソフトウェアを設定する方法について述べます。 この節の概要は次のとおりです。

データをプリンタに送るためにシリアルまたはパラレルインタフェースではなく、 ネットワークプロトコルを使用する場合は、 ネットワークにおけるデータストリームインタフェースを持つプリンタをご覧ください。

この節のタイトルは “プリンタ設定導入編” ですが、 実際の設定はかなり複雑です。 プリンタをコンピュータに接続し、 LPD スプーラを起動させることは一番困難な作業です。 ヘッダページを出力させたり課金したりするオプションの設定は、 一度プリンタがうまく動くようになればとても簡単です。

9.3.1.1. プリンタ機器の設定

この節では、プリンタに PC を接続するための様々な方法について説明しています。 ここでは、ポートやケーブルの種類、 FreeBSD がプリンタとの通信に必要なカーネルコンフィグレーションについても言及しています。

もしプリンタが既に接続されていて、 他のオペレーティングシステム上でプリンタからの印字に成功している場合は、 ソフトウェアの設定まで読み飛ばすことが多分できるでしょう。

9.3.1.1.1. ポートとケーブル

最近の PC 用のプリンタほとんどには次のインタフェースの一つもしくは両方がついています。

  • シリアルインタフェースでは、 プリンタにデータを送信するためにコンピュータにあるシリアルポートが使用されます。 シリアルインタフェースはコンピュータ業界で共通して使用されています。 そのケーブルは容易に手に入りますし、簡単に自作することもできます。 シリアルインタフェースの場合は時々、 特別なケーブルや何か複雑な通信方式選択の設定が必要になることがあります。

  • パラレルインタフェースではプリンタにデータを送信するために、 コンピュータにあるパラレルポートを使用します。 パラレルインタフェースは PC 業界では良く使われます。 ケーブルの入手は容易ですが、 自作するのはシリアルよりも困難です。 パラレルインタフェースには通常、通信方式の選択はなく、 設定は極めて単純です。

    パラレルインタフェースは “セントロニクス” インタフェースとして知られています。 これは、プリンタ用のコネクタタイプとして採用された後に名付けられました。

シリアルインタフェースはパラレルインタフェースよりも普通はデータの伝送速度が遅くなります。 パラレルインタフェースでは、通常、 (コンピュータからプリンタへの) 単方向通信のみを行なうのに対して、 シリアルインタフェースは双方向通信を行ないます。 FreeBSD でも IEEE1284 準拠のケーブルを使えば、 最近のパラレルポート (EPP や ECP) とプリンタの多くで双方向通信を行なうことができます。

通常、プリンタで双方向通信が必要となるのは、プリンタが PostScript® 言語に対応しているときだけです。 PostScript プリンタからの通信は非常に多くなることがあります。 PostScript ジョブは、実際にはプリンタに送信されるプログラムです。 印字作業を行う必要は必ずしありませんし、 プログラムの結果を直接コンピュータに返してもよいのです。 PostScript プリンタでは双方向通信を使って PostScript プログラムのエラーや紙づまりといった問題をコンピュータに報告します。 ユーザはそれらの情報を知りたいと思うかも知れません。 また、PostScript プリンタで課金作業をもっとも効率よく行なうためには、 双方向通信が必要となります。 この方法ではまず、プリンタの現在のページカウント (起動してから今まで何枚の紙を印字したか) の情報を得ます。 次に、ユーザのジョブを実行し、終了後、再びページカウントを得ます。 この二つの数を差によって、 課金対象となる紙の枚数を知ることができるのです。

9.3.1.1.2. パラレルポート

プリンタをパラレルインタフェースを使って接続する場合は、 セントロニクスケーブルでプリンタとコンピュータを接続してください。 詳しい説明はプリンタやコンピュータに付属する説明書に書かれているはずです。

その際、 どのパラレルポートを使用したかを覚えておいてください。 FreeBSD では最初のポートは /dev/ppc0、 二番目 /dev/ppc1 であり、 三番目以降も同様に続きます。 プリンタのデバイス名にも同じ形式が使われており、 最初のパラレルポートに接続されたプリンタは /dev/lpt0 などとなります。

9.3.1.1.3. シリアルポート

シリアルインタフェースを使ってプリンタを使う場合は、 適切なシリアルケーブルでプリンタとコンピュータを接続してください。 詳しい説明はプリンタ、コンピュータ、あるいは両方に付属する説 明書に書かれているはずです。

“適切なシリアルケーブル” が良くわからないときは、 次のどれかを試してみてください。

  • モデム 用ケーブルでは、 それぞれのピンは他方のコネクタの対応するピンと線でつながっています。 このタイプのケーブルは “DTE-DCE” 間ケーブルとしても知られています (訳注: 日本ではストレートケーブルという名前で売られています)。

  • ヌルモデム 用ケーブルでは、 あるピンは対応するピンとを接続していますが、 あるピン (たとえば、データ送信用とデータ受信用のピン) が交差して接続したり、 いくつかのピンは内部で短絡していたりします。 このタイプのケーブルは、 “DTE-DTE” 間ケーブルと呼ばれています (訳注: 日本ではクロスケーブルという名前で売られています)。

  • A シリアルプリンタ用ケーブルは、 ある特定のプリンタで必要とされるものです。 ヌルモデムケーブルと似ていますが、 内部で短絡させる代わりに、 ある信号を他方側に送るために使用しています。

この他に、 プリンタ用の通信パラメータを設定する必要があります。 通常、プリンタのフロントパネルや DIP スイッチによって制御します。 コンピュータとプリンタの双方で設定できる最高の通信速度 [bps] (ビット/秒、 ボーレートと示されているときもある) を選んでください。そして、データビット (7 または 8)、 パリティ (偶/奇/なし)、ストップビット (1 または 2) を選んでください。 そして、フローコントロールの有無 (制御なし、または XON/XOFF (“イン・バンド” または “ソフトウェア” フローコントロールとも呼ばれる)) を選びます。 以下に続くソフトウェアの設定のために、 ここでの設定を覚えておいてください。

9.3.1.2. ソフトウェアの設定

本節では FreeBSD の LPD スプーリングシステムで印字をおこなうために 必要となるソフトウェアの設定について説明しています。

本節の概要は次のようになります。

  1. プリンタで使用するポートのために、必要があれば、 カーネルの書き変えをおこないます。「カーネルの変更」で、 このためにしなくてはならないことを説明しています。

  2. パラレルポートを使用している場合は、 パラレルポートのための通信モードを設定します。 詳細は、 「 パラレルポートの通信モードを設定する」 で説明しています。

  3. オペレーティングシステムからプリンタにデータが送ら れているかをテストします。「プリンタとの通信状況を調べる」で、 どのようにテストするかの提案をいくつかおこなっています。

  4. ファイル/etc/printcapを変更し、 LPD の設定をおこないます。 この節で、どのように変更するかを説明しています。

9.3.1.2.1. カーネルの変更

オペレーティングシステムのカーネルの コンパイルをおこなうことによって、 指定されたデバイスが機能するようになります。シリアル、 または、パラレルインタフェースをプリンタで使用する場合、 必要なデバイスがこの指定の中に含まれていなくてはなりません。 したがって、 必要なデバイスがカーネルに組み込まれていない場合、 追加のシリアル、または、パラレルポートをサポートするために、 カーネルの再コンパイルが必要となるかもしれません。

シリアルポートが現在使用しているカーネルで サポートされているかどうかを調べるためには、 次のように入力します。

# grep sioN /var/run/dmesg.boot

ここで、N はシリアルポートの番号を示し、この番号は 0 から始まります。 次のような出力があった場合、 カーネルはそのポートをサポートしています。

sio2 at port 0x3e8-0x3ef irq 5 on isa
 sio2: type 16550A

パラレルポートが現在使用しているカーネルで サポートされているかどうかを調べるためには、 次のように入力します。

# grep ppcN /var/run/dmesg.boot

ここで、N はパラレルポートの番号を示し、この番号は 0 から始まります。 次のような出力があった場合、 カーネルはそのポートをサポートしています。

ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/8 bytes threshold

上記の出力が得られない場合、プリンタを使うため、 オペレーティングシステムにパラレル、または、 シリアルポートを認識し、使用できるようにするためには カーネルを変更する必要があります。

シリアルポートをサポートさせるには、「 FreeBSDカーネルのコンフィグレーション」の節をご覧く ださい。パラレルポートをサポートさせる場合も、その節と、 あわせて、 この節に続く節もご覧ください。

9.3.1.3. ポート用エントリを /dev に追加する

Note: FreeBSD 5.0 には、必要に応じてデバイスノードを自動的に作成する devfs が採用されています。 devfs を有効にした FreeBSD を実行しているのなら、 この節を読み飛ばしても問題ありません。

カーネルがシリアル、または、パラレルポートを通じての通信をサポートしていたとしても、 システム上で動いているプログラムがデータの送受信をおこなうための ソフトウェアインタフェースがさらに必要になります。 そのインタフェースは、/dev ディレクトリにあるエントリに相当します。

/dev エントリにポートを加えるために

  1. su(1) コマンドで root になります。 パスワードを聞かれたら、root 用のパスワードを入力します。

  2. /dev ディレクトリに移動します。

    # cd /dev
    
  3. 次のように入力します。

    # ./MAKEDEV port
    

    ここで、port は作成するポート名です。 1 番目のパラレルポートに接続されているプリンタには lpt0, 2 番目のパラレルポートに接続されているプリンタには lpt1 を使い、以下同様にしてください。 1 番目のシリアルポートには ttyd0, 2 番目のシリアルポートには ttyd1 を使い、 以下同様にしてください。

  4. 次を入力し、デバイスのエントリができたか確認します。

    # ls -l port
    

9.3.1.3.1. パラレルポートの通信モードを設定する

パラレルインタフェースを使用している場合、FreeBSD では、 割り込み駆動型にするか、 プリンタとの通信の状況をカーネルに監視させるかのいずれかを選択できます。 FreeBSD 4.X と 5.X の汎用プリンタデバイスドライバ (lpt(4)) は ppbus(4) システムを利用しています。 これは ppc(4) ドライバを使ってパラレルポートのチップセットを制御します。

  • GENERIC カーネルでは割り込み駆動方式がデフォルトになっています。 この方式では、 オペレーティングシステムはプリンタがデータを受け付けられるかどうかを調べるために、 IRQ ラインを一つ使用します。

  • 監視方式では、 オペレーティングシステムにプリンタがもっとデータを受け付けられるかどうかを繰り返し尋ねるように指示します。 そして、受け付けるという応答を受けたとき、 カーネルはさらなるデータを送信します。

割り込み駆動方式は一般的にいくらか高速になりますが、貴重な IRQ ラインを一つ消費します。 HP の新しいプリンタの一部には、明らかに何かしらのタイミングの問題 (まだ正確にはわかっていません) で割り込みモードでは正常に動作しないものがあると言われています。 これらのプリンタにはポーリングモードが必要になります。 どちらかうまく機能する方を使ってください。 一部のプリンタはどちらの方式でも動作しますが、 割り込みモードでは苦痛を感じるほど低速です。

通信モードを設定するためには 2 つの方法があります。 1 つはカーネルを変更することで、もう一つは lptcontrol(8) プログラムを使用する方法です。

カーネルを設定することによって、 通信モードを変更する。

  1. カーネルコンフィグレーションファイルを変更します。 ppc0 のエントリを探してください。 2 番目のパラレルポートを設定するときは、代わりに ppc1 を使います。 以下、3 番目のポートは ppc2 となっていきます。

    • 割り込み駆動方式にする場合は、FreeBSD 4.X では irq 指定を追加します。

      device ppc0 at isa? irq N
      

      ここで、N はパラレルポート用の IRQ 番号です。

      FreeBSD 5.X では、/boot/device.hints ファイルの以下の行を編集して、 N を適切な IRQ 番号に置き換えてください。

      hint.ppc.0.irq="N"
      

      カーネルの設定ファイルには ppc(4) ドライバも入れなければなりません。

      device ppc
      
    • 監視方式を使用する場合は、 irq を追加してはいけません。

      FreeBSD 4.X では、カーネルコンフィグレーションファイルで以下の行を使用してください。

      device ppc0 at isa?
      

      FreeBSD 5.X では、/boot/device.hints ファイルの以下の行を削除するだけです。

      hint.ppc.0.irq="N"
      

      FreeBSD 5.X では、 場合によってはこれだけではポートをポーリングモードにするには十分ではありません。 多くの場合これは acpi(4) ドライバと併せて動作します。 これはデバイスのプローブとアタッチを行うので、 プリンタポートへのアクセスモードを制御できます。 問題を修正するために acpi(4) の設定を確認してください。

  2. ファイルをセーブし、config プログラムを起動し、 カーネルの構築、インストールをおこないます。そして、 リブートしてください。詳細は、「 FreeBSDカーネルのコンフィグレーション」を参照 してください。

lptcontrol(8) で通信モードを設定する場合

  1. lptN をイベント駆動方式に設定する場合は、 次のように入力します。

    # lptcontrol -i -d /dev/lptN
    
  2. lptN を監視方式に設定する場合は、次のように入力します。

    # lptcontrol -p -d /dev/lptN
    

これらのコマンドを /etc/rc.local ファイルに追加 しておくと、システムをブートする度に通信モードを設定する ことができます。詳細については、 lptcontrol(8) をご覧ください。

9.3.1.3.2. プリンタとの通信状況を調べる

スプーリングシステムの設定に進む前に、オペレーティング システムがプリンタにデータを送ることに成功しているかどうか を確かめるべきでしょう。これにより、印字がうまくいかないと き、プリンタとの通信が問題なのか、スプーリングシステムが問 題なのかを分けて調べることがかなり容易になります。

プリンタをテストするためには、 プリンタに何かのテキストを送 信してみます。送信した文字をすぐに印字してくれるプリンタに は、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

上の PostScript コードはファイルに保存し、 以降の節で例として示されているように利用することができます。

Note: このドキュメントでプリンタ用言語を参照するときは、 PostScript のような言語を仮定しており、Hewlett Packard の PCL は考慮していません。PCL は非常に機能的なの ですが、 プレインテキストにエスケープシーケンスを混ぜること ができます。PostScript ではプレインテキストを直接印字 することはできません。 このような種類のプリンタ言語に対しては、 特別な対応をおこなわなければなりません。

9.3.1.3.2.1. パラレルポートのプリンタとの接続を調べる

この節では、FreeBSD がパラレルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について説明し ています。

パラレルポートのプリンタをテストするために

  1. su(1) コマンドで root になります。

  2. プリンタにデータを送ります。

    • プリンタがプレインテキストを印字できる場合、 lptest(1) コマンドを使います。 次のように入力してください。

      # lptest > /dev/lptN
      

      ここで、N はパラレルポートの番号で、番号は 0 から始まります。

    • プリンタが PostScript か他のプリンタ 言語を使用している場合、そのプリンタに簡単なプロ グラムを送信してください。次のように入力します。

      # cat > /dev/lptN
      

      そして、一行一行、 プログラムを慎重に入力して 下さい。RETUREN または ENTER キーを入力してしま うと、その行は編集できなくなります。プログラムの 入力が終わったら、CONTROL+D か、あなたが設定して いるファイル終了のキーを押してください。

      もしくは、プログラムを入力したファイルがある 場合は、次のように入力してください。

      # cat file > /dev/lptN
      

      ここで、file はプログラムが格納されていて、 プリンタに送信するファイルの名前です。

これで何かがプリントされることでしょう。 印字されたテキ ストがおかしくても心配しなくても構いません。それについ ては、後で修正します。

9.3.1.3.2.2. シリアルポートのプリンタとの接続を調べる

この節では、FreeBSDがシリアルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について述べられ ています。

シリアルポートのプリンタをテストするために

  1. su(1) コマンドで root になります。

  2. /etc/remote ファイルを編集します。次のエントリを加えてください。

    printer:dv=/dev/port:br#bps-rate:pa=parity
    

    ここで、port シリアルポート (ttyd0ttyd1 など) のデバイスエントリで、 bps-rateは プリンタとの通信の転送速度[bit/秒]、 parityはプリ ンタとの通信で必要とされるパリティ (evenoddnonezeroのいずれか) を表わしていま す。

    次の例は、 プリンタをシリアルケーブルでパリティなし、転送速度 19200 bps で第 3 番目のシリアルポートに接続した場 合です。

    printer:dv=/dev/ttyd2:br#19200:pa=none
    
  3. tip(1) コマンドでプリンタと接続します。 次のように入力してください。

    # tip printer
    

    これがうまくいかなかった場合は、 /etc/remoteを編集して、 /dev/ttydN の代わりに /dev/cuaaN を試してみてください。

  4. プリンタにデータを送ります。

    • プリンタがプレインテキストを印字できる場合、 lptest(1) コマンドを使います。 次のように入力してください。

      % $lptest
      
    • プリンタが PostScript か他のプリンタ言語を使用している場合、 そのプリンタに簡単なプログラムを入力します。 一行一行、プログラムを慎重に入力してください。 バックスペースキーや他の編集用のキーは、 プリンタの制御コードに割り当てられているかもしれません。 プログラムが終了したことをプリンタに伝えるための特別なファイル終了キーを 入力する必要があるかもしれません。 PostScript プリンタの場合、 CONTROL+D を入力します。

      もしくは、プログラムを入力したファイルがある場合は、 次のように入力してください。

      % >file
      

      ここで、file はプログラムが格納されているファイル名です。 tip(1) コマンドでファイルを送信した後は、 ファイル終了を表わすキーを入力する必要があります。

これで何かがプリントされることでしょう。 印字されたテキ ストがおかしくても心配しなくても構いません。 それについては、後で修正します。

9.3.1.4. スプーラに許可を与える: /etc/printcap ファイル

ここまでで、プリンタはコンピュータに接続され、(必要なら) プリンタと通信できるようにカーネルを変更し、 簡単なデータをプリンタに送信することができているはずです。 これで、LPD にプリンタへのアクセスを 制御させる設定をおこなう準備が整いました。

LPD の設定は /etc/printcap を編集することでおこないます。 LPD スプーリングシステムは スプーラが使われる毎にこのファイルを参照します。 そのため、ファイルを更新するとすぐにその変更が反映されます。

printcap(5) ファイルの書式は簡単です。 /etc/printcap の編集はお好みのテキストエディタをお 使いください。このファイルの書式は、 /usr/share/misc/termcap/etc/remote といった他のケイパビリティファイルと一致しています。 この書式 についての詳細な情報については cgetent(3) をご覧ください。

スプーラの単純な設定法は、 次のステップでおこないます。

  1. プリンタに名前 (と簡単な別名 2 〜 3 個) を付け、それを /etc/printcap ファイルに記述します。 これについては、「 プリンタに名前を付ける」 を参照してください。

  2. sh の項目を追加することで、 ヘッダページの出力を禁止します (デフォルトは許可)。 これについては、「 ヘッダページの印字を禁止する」 を参照してください。

  3. スプール用のディレクトリを作成し、その位置を sd 項目で指定します。これについては、 「 スプーリングディレクトリの作成」 を参照してください。

  4. プリンタを使用するために /dev エントリを設定し、/etc/printcaplp 項目でそのエントリを指定します。 これについては、「 プリンタデバイスの特定」 を参照してください。 プリンタをシリアルポートに接続した場合は、 ms# の項目を設定する必要があります。こちらについては、 「 スプーラのための通信パラメータの設定」 を参照してください。

  5. プレインテキスト用の入力フィルタのインストールをおこないます。 「テキストフィルタのインストール」 を参照してください。

  6. lpr(1) コマンドで何かを印字することで設定のテストをおこないます。 印字してみようトラブルシューティング を参照してください。

Note: PostScript プリンタのような、 プリンタ言語を使用しているプリンタには、 プレインテキストを直接印字させることができません。 上にアウトラインを示し、 以下の節で説明する簡単な設定方法の説明では、 そのようなプリンタを設置している場合は、 プリンタが認識できるファイルだけを印字の対象としているという 仮定をしています。

多くの場合、 利用者はシステムに設置されているプリンタすべてで プレインテキストが印字できることを期待しています。 印字作業をおこなうために LPD のインタフェースを利用するプログラムでも、 通常、そのような仮定を置きます。 プリンタ言語を使用するプリンタを設置しており、 そのプリンタ言語で記述されたジョブと、 これに加えて、 プレインテキストのジョブも印字できるようにしたいならば、 上で示した簡単な設定方法に加えて、 さらなる設定をおこなうことを強くお勧めします。すなわち、 自動的にプレインテキストから PostScript (もしくは、 他のプリンタ言語) に変換するプログラムをインストールしてください。「 プレインテキストのジョブを PostScript プリンタで印字する」 で、それをどのようにおこなえばよいのかが説明されています。

訳注: 日本語を印字したい場合は、プリンタ言語を使用し ていない「日本語プリンタ」についても、 プリンタ固有のエスケープシーケンスを送る必要があります。 また、漢字コードをプリン タが設定しているものに変換したりする必要があり、 各プリンタ毎に、日本語用のフィルタが必要になります。

9.3.1.4.1. プリンタに名前を付ける

最初の (簡単な) ステップで、プリンタの名前を考えます。 プリンタには別名をいくつか付けることもできるので、 機能的な名前 でも風変わりな名前でもどちらを選んでもまったく 問題はありません。

少なくとも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 という名前と別名として、linediablolp そして Diablo 630 Line Printer が付けられています。別名とし て lp があるので、このプリンタはデフォルトのプリンタとなっ ています。2 番目は bamboo と名付けられ、 別名として、psPSSpanasonicPanasonic KX-P4455 PostScript v51.4 が付けられています。

9.3.1.4.2. ヘッダページの印字を禁止する

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 ひとつ分だけ字下げします。最後の行以外のすべての行は、 行末にバックスラッシュを記述します。

9.3.1.4.3. スプーリングディレクトリの作成

スプーラの簡単な設定の次のステップでは、 スプーリングディレクトリを作成します。 プリンタに送られるジョブは、 その印字が終了するまでこのディレクトリに置かれます。また、 他のたくさんのスプーラもこのディレクトリにファイルを置きます。

様々な事情によりスプーリングディレクトリは、通常、慣例 として /var/spool の下に置きます。 また、スプーリングディレクトリの内容は バックアップをする必要はありません。 mkdir(1) によってディレクトリを 作るだけでスプーリングディレクトリの復旧は完了します。

スプーリングディレクトリの名前は、これも慣例ですが、 次のようにプリンタの名前と同じにします。

# mkdir /var/spool/printer-name

しかしながら、ネットワーク上に使用可能なプリンタがたく さんあるならば、LPD で印字するための専用のディレクトリにスプーリングディレクトリを置きたくなるかもしれません。 例に出てきたプリンタ rattanbamboo について、この方式を採用すると、 次のようになります。

# mkdir /var/spool/lpd
# mkdir /var/spool/lpd/rattan
# mkdir /var/spool/lpd/bamboo

Note: 各ユーザが印字するジョブのプライバシを守りた いと考えているならば、スプーリングディレクトリを保護し て、これを誰からでもアクセスできないようにしたいと思う かもしれません。スプーリングディレクトリは、daemon ユー ザと 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 をデフォルト値として使用します。

9.3.1.4.4. プリンタデバイスの特定

ポート用エントリを /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 には存在していません。

設置したプリンタがパラレルポートに 接続されている場合は、 「 テキストフィルタのインストール」 まで読み飛ばしてください。 そうでない場合は、次節の説明に続いてください。

9.3.1.4.5. スプーラのための通信パラメータの設定

シリアルポートにプリンタを接続した場合、 LPD は、プリンタにデータを送信するフィルタプログラムに代わり、 通信速度やパリティ、 その他のシリアル通信パラメータを設定することができます。 このことによる利点は、

  • /etc/printcap を編集するだけで、 様々な通信パラメータを試してみることができます。 フィルタプログラムを再コンパイルする必要はありません。

  • スプーリングシステムで、 シリアル通信の設定が異なっているかもしれない複数のプリンタに 同じフィルタプログラムを使うことが可能になります。

次の /etc/printcap の項目で、 lp で指定された デバイスのシリアル通信パラメータを制御できます。

br#bps-rate

デバイスの通信速度を bps-rate に設定します。 ここで、bps-rate は 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200 [bit/秒] のいずれかです。

ms#stty-mode

デバイスをオープンした後にターミナルデバイスのオプションを設定します。 利用できるオプションについては stty(1) を参照してください。

lp で指定されたデバイスをオープンするとき、 LPDms# で指定されたデバイスの特性を設定します。 特に関係があるのは、parenb, parodd, cs5, cs6, cs7, cs8, cstopb, crtscts, ixon モードです。 これらは stty(1) のマニュアルページで説明されています。

例題のプリンタで6番目のシリアルポートに接続された プリンタの設定を追加してみましょう。 通信速度は 38400bps に設定します。 モードとして、-parenb でパリティ無し、 cs8 で 8 ビットキャラクタ、 clocal でモデム制御無し、 そして crtscts でハードウェアフロー制御を設定します。

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:

9.3.1.4.6. テキストフィルタのインストール

ここまでで、 プリンタにジョブを送るために使うテキストフィルタを 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/printcapif 項目を使って指定します。これまでの /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:ms#-parenb cs8 clocal crtscts:\
        :if=/usr/local/libexec/if-simple:

9.3.1.4.7. LPD の起動

lpd(8)lpd_enable 変数に従って /etc/rc から実行されます。この変数の デフォルト値は NO です。まだ そうしていなかったならば

lpd_enable="YES"

の行を /etc/rc.conf に追加して 計算機を再起動するか、そのまま lpd(8) を 起動してください。

# lpd

9.3.1.4.8. 印字してみよう

簡単な LPD 設定も終わりにたどり着きました。 残念ながら、設定はこれでおしまいというわけではありません。 なぜなら、さらに、設定をテストし、 すべての問題点を解決しなくてはならないからです。 設定をテストするために、 何かを印字してみましょう。 LPD システムで印字をするためには、 lpr(1) コマンドを使います。このコマンドは、 印字するためのジョブを投入する働きをします。

lpr(1) コマンドを 「 プリンタとの通信状況を調べる」で紹介した、 あるテスト用のテキストを生成してくれる lptest(1) プログラムと一緒に使うこともできます。

簡単な LPD 設定のテスト

次のように入力してください。

# lptest 20 5 | lpr -Pprinter-name

ここで、printer-name/etc/printcap で指定したプリンタ名 (もしくはその別名) です。デフォルト のプリンタを使用する場合は、 -P 引数を付けないで lpr(1) を打ち込んでください。もう一度述べますが、 PostScript を期待しているプリンタをテストするならば、 lptest(1) を使う代わりに PostScript で書かれた プログラムをプリンタに送ってください。 プログラムを送るためには、プログラムをファイルに格納して、 lpr file と打ち込みます。

PostScript プリンタの場合、 送信したプログラムによる結果が得られるでしょう。 lptest(1) を使った場合は、 以下のような結果が見られるでしょう。

!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678

更にプリンタをテストしたい場合は、 (言語ベースのプリンタのための) もっと大きなプログラムを送信するか、 引数を変えて lptest(1) を実行します。たとえば、lptest 80 60 で、それぞれ 80 文字の行を 60 行生成します。

プリンタがうまく動かなかった場合は、次の節、「 トラブルシューティング」をご覧ください。