Solaris のシステム管理 (上級編)

LP 印刷サービス

「LP 印刷サービス」とは、ユーザーが作業を続けながらファイルを印刷できるようにするソフトウェアユーティリティの集合です。当初、印刷サービスは LP スプーラと呼ばれていました (LP はラインプリンタの意味ですが、現在ではレーザプリンタなどのさまざまな種類のプリンタも含まれます。スプール (Spool) は、system peripheral operation off-line の頭文字です)。

印刷サービスは、LP 印刷サービスソフトウェア、システム管理者が提供する印刷フィルタ、ハードウェア (プリンタ、システム、およびネットワーク接続) からなっています。

LP 印刷サービスの構造

この節では、LP 印刷サービスのディレクトリ構造、ファイル、ログ、およびコマンドについて説明します。

LP 印刷サービスのディレクトリ

LP 印刷サービスのファイルは、表 8–1 のように 7 つのディレクトリに分散されています。

表 8–1 LP 印刷サービスのディレクトリ

ディレクトリ 

内容 

/usr/bin

LP 印刷サービスのユーザーコマンド 

/etc/lp

LP 構成ファイルの階層 

/usr/share/lib

terminfo データベースディレクトリ

/usr/lib/print

lp 変換スクリプト、in.lpd デーモン、printd デーモン。 printd デーモンは /var/spool/print ディレクトリのすべての保留ジョブを 1 分間に 1 回転送する。 転送するジョブがなくなると終了する

/usr/sbin

LP 印刷サービスの管理コマンド 

/usr/lib/lp

lpsched プログラム、バイナリファイル、PostScript フィルタ、および model ディレクトリ。 model ディレクトリには、標準プリンタインタフェースプログラムが入っている

/var/lp/logs

LP ログファイル。lpsched.n には lpsched からのメッセージが、requests.n には完了した印刷要求に関する情報が含まれる

/var/spool/lp

ファイルが印刷待ち行列に入れられるスプーリングディレクトリ 

/var/spool/print

LP 印刷サービスのクライアント側要求格納域 

LP 印刷サービスの構成ファイル

lpsched デーモンが/etc/lp ディレクトリに格納する構成情報を、次の表に示します。


注意 – 注意 –

表 8–2 の構成ファイルはプライベートインタフェースで、将来のリリースでは変更される可能性があります。現在の場所にあるファイルに依存する、または現在使用している形式のデータに依存するソフトウェアを構築しないようにしてください。


表 8–2 /etc/lp ディレクトリの内容

ファイル 

種類 

説明 

classes

ディレクトリ 

lpadmin -c コマンドで与えたクラスを識別するファイル

fd

ディレクトリ 

既存のフィルタの記述 

filter.table

ファイル 

印刷フィルタ照合テーブル 

forms

ディレクトリ 

各フォームのファイルを格納する場所。最初は、このディレクトリは空になっている 

interfaces

ディレクトリ 

プリンタインタフェースプログラムファイル 

logs

/var/lp/logs へのリンク

印刷動作のログファイル 

model

/usr/lib/lp/model へのリンク

標準プリンタインタフェースプログラム 

printers

ディレクトリ 

各ローカルプリンタのディレクトリ。各ディレクトリには、個々のプリンタの構成情報と警告ファイルが入っている 

pwheels

ディレクトリ 

印字ホイールまたはカートリッジファイル 

これらの構成ファイルは、lpd ベースのプリンタサーバー上の /etc/printcap ファイルと同じ機能を提供します。


注 –

これらのファイルの内容を確認できますが、ファイルを直接編集しないでください。代わりに、lpadmin コマンドを使用して構成を変更します。変更内容は /etc/lp ディレクトリ内の構成ファイルに入力されます。lpsched デーモンは、構成ファイルを管理して構成します。


/etc/lp/printers ディレクトリには、システムに認識されるローカルプリンタごとに 1 つずつサブディレクトリが入っています。次の例は、プリンタ sparc1luna/etc/lp/printers サブディレクトリを示します。


$ ls -l /etc/lp/printers
drwxrwxr-x 2 lp lp 512 Jan 23 23:53 luna
drwxrwxr-x 2 lp lp 512 Jan 11 17:50 sparc1

プリンタ固有の各ディレクトリ内では、次のファイルを使用してプリンタを記述できます。

ファイル名 

説明 

alert.sh

警告に応答して実行するシェル 

alert.vars

警告変数 

configuration

構成ファイル 

users.deny

プリンタアクセスが拒否されるユーザーのリスト 

comment

プリンタ記述 

通常、プリンタ luna の構成ファイル /etc/lp/printers/luna/configuration は、次のようになっています。


Banner: on: Always
Content types: PS
Device: /dev/term/b
Interface: /usr/lib/lp/model/standard
Printer type: PS
Modules: default

terminfo データベース

/usr/share/lib ディレクトリには、terminfo データベースのディレクトリが入っており、そのディレクトリには多数のタイプの端末とプリンタに関する定義が入っています。LP 印刷サービスは、terminfo データベース内の情報を使用してプリンタを初期設定し、選択されたページサイズ、文字ピッチ、行ピッチ、および文字セットを設定し、一連のコードをプリンタに送ります。

各プリンタは、terminfo データベース内で短縮名を使用して識別されます。terminfo データベースの構造については、プリンタタイプを参照してください。 必要であれば、terminfo データベースにエントリを追加できますが、これは煩雑で時間のかかる作業です。詳細は、サポートされていないプリンタの terminfo エントリを追加するを参照してください。

デーモンと LP 内部ファイル

/usr/lib/lp ディレクトリには、表 8–3 に示すような LP 印刷サービスに使用されるデーモンとファイルが入っています。

表 8–3 /usr/lib/lp ディレクトリの内容

ファイル 

種類 

説明 

bin

ディレクトリ 

印刷警告、低速フィルタ、待ち行列管理プログラムを生成するファイルが入っている 

lpsched

デーモン 

LP 印刷要求のスケジューリングを管理する 

model

ディレクトリ 

標準プリンタインタフェースプログラムが入っている 

postscript

ディレクトリ 

LP 印刷サービスで提供されているすべての PostScript フィルタプログラムが入っている。これらのフィルタには、フィルタの特性とその格納場所を LP 印刷サービスに指示する /etc/lp/fd ディレクトリ内の記述子ファイルが含まれる

LP 印刷サービスのログファイル

LP 印刷サービスは、次の 2 組のログファイルを管理します。

ログファイル名 

説明 

syslogd(1M)

/etc/syslog.conflpr.debug を設定して LP 印刷サービスロギングを有効にする

/var/spool/lp

印刷待ち行列に入っている現在の待ち行列のリスト 

/var/lp/logs/requests

進行中の印刷要求の履歴  

印刷待ち行列ログ

各システムのスケジューラは、/var/spool/lp/tmp/ system ディレクトリと/var/spool/lp/requests/ system ディレクトリ内で印刷要求ログを保管します。各印刷要求は、要求に関する情報を含んだファイルを 2 つ (各ディレクトリに 1 つずつ) 持っています。/var/spool/lp/requests/system ディレクトリ内の情報には、スーパーユーザーまたは lp しかアクセスできません。/var/spool/lp/tmp/systemディレクトリ内の情報には、その要求を出したユーザー、スーパーユーザー、または lp しかアクセスできません。

次の例では、/var/spool/lp/tmp/starbug ディレクトリの内容を示します。


$ ls /var/spool/lp/tmp/starbug
5     5-0
# cat 5-0
C 1
D print1
F /etc/profile
P 20
T /etc/profile
t simple
U root
s 0000
v 2

これらのファイルは、印刷要求が待ち行列に入っている限り、そのディレクトリ内に残っています。要求が完了すると、ファイル内の情報は組み合わされ 、/var/lp/logs/requests ファイルに追加されます。このファイルについては、次の節で説明します。

現在待ち行列に入っている印刷要求の状態を追跡したい場合は、/var/spool/lp/logs ディレクトリの情報を使用します。

履歴ログ

LP 印刷サービスは、lpsched requests という 2 つのログファイルに印刷サービスの履歴を記録します。これらのログファイルは、/var/lp/logs ディレクトリに入っています。これらのログ内の情報を使用し、印刷の問題を診断して解決できます。次の例は、/var/lp/logs ディレクトリの内容を示します。


# cd /var/lp/logs
# ls
lpsched.1    requests    requests.2
lpsched     lpsched.2    requests.1
# 

問題の解決に最も重要な 2 つのログファイルは、ローカルの印刷要求に関する情報が入っている lpsched ログと、すでに完了してプリンタの待ち行列にない印刷要求の情報が入っている requests ログです。

requests ログの構造は単純なので、共通の UNIX シェルコマンドを使用してデータを抽出できます。要求は、出力された順番に要求 ID を示す行で区切って表示されます。 = で始まる区切り行より下の各行には、その行に含まれる情報の種類を識別する 1 つの文字が付いています。各文字は、空白文字 1 つでデータと区切られます。

次の例は、requests ログの内容を示しています。


# pwd
/var/lp/logs
# tail requests.2
= print1-3, uid 0, gid 1, size 206662, Wed Nov 14 08:56:30 MST 2001
z print1
C 1
D print1
F /usr/dict/words
P 20
T /usr/dict/words
t simple
U root
s 0x0014
v 2
#

表 8–4 に、文字コードとそれに対応する LP requests ログ内の行を示します。

表 8–4 LP requests ログ内の文字コード

文字 

行の内容 

=

区切り行。ユーザーの要求 ID、ユーザー ID (UID)、グループ ID (GID)、フィルタを通す前のファイルサイズの総バイト数、および要求が待ち行列に入れられた時刻が入っている 

z

プリンタ名 

C

印刷部数 

D

出力先のプリンタかクラス、または any

F

印刷されたファイル名。この行は印刷されたファイルごとに区切られ、ファイルが印刷された順番で表示される 

f

(省略可能) 使用するフォーム名。 

H

(省略可能) 特殊処理。resumehold、または immediate

N

(省略可能) 印刷要求が正常に完了したときに使用された警告のタイプ。ユーザーが電子メールで通知を受けたときは M タイプ、端末へのメッセージで通知を受けた場合は W タイプ

O

(省略可能)プリンタ依存の - o オプション。たとえば、nobanner

印刷要求の優先順位 

p

印刷されたページのリスト 

r

(省略可能) ユーザーが lp -r コマンドを使用してファイルの「raw」処理を要求したときに含まれる 1 文字の行

S

(省略可能) 使用された文字セット、印字ホイール、またはカートリッジ 

T

バナーページに印刷されるタイトル 

t

ファイル内で見つかった内容形式 

U

印刷要求を出したユーザー名 

s

16 進数形式の各ビットの組み合わせで表される要求の結果。印刷サービスの内部では複数のビットが使用される。ビットとその意味については、下表に記載 

x

(省略可能) 印刷要求に使用された低速フィルタ 

Y

(省略可能) 要求の印刷に使用された印刷フィルタの特殊モードのリスト 

z

(省略可能) 要求に使用したプリンタ。 要求がプリンタまたはプリンタクラスの待ち行列に入れられた場合や、要求が別の出力先に移動された場合は、このプリンタは出力先 (D 行) とは異なる

表 8–5 に、LP requests ログ内の結果コードとその説明を示します。

表 8–5 LP requests ログ内の結果コード

結果コード 

説明 

0x0001

要求は保留され再開を待機中 

0x0002

低速フィルタを実行中 

0x0004

低速フィルタを正常に完了 

0x0008

要求はプリンタ上にある 

0x0010

印刷を正常に完了 

0x0020

要求は保留されユーザーによる変更を待機中 

0x0040

要求は取り消し済み 

0x0080

要求は次に印刷される 

0x0100

フィルタ処理または印刷要求に失敗 

0x0200

要求はリモートプリンタに転送中 (現在は使用されない) 

0x0400

ユーザーに通知 

0x0800

通知が動作中 

0x1000

リモートシステムが要求を受け付け済み (現在は使用されない) 

0x2000

管理者が要求を保留した 

0x4000

プリンタのフィルタを変更しなければならなかった 

0x8000

要求は一時的に停止された 

スプーリングディレクトリ

印刷待ち行列に入れられたファイルは、印刷されるまで /var/spool/lp ディレクトリに格納されますが、それがわずか数秒の場合があります。表 8–6 は、 /var/spool/lp ディレクトリの内容を示します。

表 8–6 /var/spool/lp ディレクトリの内容

ファイル 

種類 

説明 

SCHEDLOCK

ファイル 

スケジューラのロックファイル。スケジューラが停止し、再起動されない場合は、このファイルをチェックする 

admins

ディレクトリ 

/etc/lp へのリンク

bin

ディレクトリ 

/usr/lib/lp/bin へのリンク

logs

リンク 

完了した印刷要求のログが記録される ../lp/logs へのリンク

model

リンク 

/usr/lib/lp/model へのリンク

requests

ディレクトリ 

印刷要求が印刷されるまで記録される構成済みプリンタごとのサブディレクトリが入ったディレクトリ。ユーザーはこのログにアクセスできない 

system

ディレクトリ 

システムの印刷状態ファイル 

temp

リンク 

スプールされた要求が入っている /var/spool/lp/tmp/ hostname へのリンク

tmp

ディレクトリ 

印刷要求が印刷されるまでログが記録される構成済みの各プリンタのディレクトリ。既存の印刷要求を変更した場合も、このログに記録される 

LP 印刷サービスのコマンド

表 8–7 に、頻繁に使用する LP 印刷サービスのコマンドを示します。(1M) のコマンドを使用するには、スーパーユーザーまたは lp になるか、同等の役割になる必要があります。

表 8–7 LP 印刷サービスコマンド早見表

コマンド 

マニュアルページ 

作業 

enable

enable(1)

プリンタを使用可能にする 

cancel

cancel(1)

印刷要求を取り消す 

lp

lp(1)

1 つ以上のファイルをプリンタに送る 

lpstat

lpstat(1)

LP 印刷サービスの状態を出力する 

disable

enable(1)

1 台以上のプリンタを無効にする 

accept

accept(1M)

印刷要求を特定の出力先の待ち行列に入れられるようにする 

reject

accept(1M)

印刷要求が特定の出力先の待ち行列に入れられないようにする 

lpadmin

lpadmin(1M)

プリンタの構成を設定または変更する 

lpfilter

lpfilter(1M)

フィルタの定義を設定または変更する 

lpforms

lpforms(1M)

あらかじめ印刷されたフォームを設定または変更する 

lpadmin

lpadmin(1M)

フォームを取り付ける 

lpmove

lpmove(1M)

ある出力先から別の出力先に出力要求を移動する 

lpsched

lpsched(1M)

LP 印刷サービススケジューラを起動する  

lpshut

lpshut(1M)

LP 印刷サービススケジューラを停止する 

lpusers

lpusers(1M)

デフォルトの優先順位と、LP 印刷サービスのユーザーが要求できる優先順位の制限を設定または変更する 

LP 印刷サービスの機能

LP 印刷サービスは、次の機能を実行します。

LP によるファイルの管理とローカル印刷要求のスケジューリングの方法

LP 印刷サービスには、lpsched というスケジューラデーモンが組み込まれています。スケジューラデーモンは、プリンタの設定と構成に関する情報を使用して LP システムファイルを更新します。

また、lpsched デーモンは、ユーザーが要求をアプリケーションから出すかコマンド行から出すかに関係なく、図 8–1 のように、プリンタサーバー上のすべてのローカル印刷要求をスケジュールします。さらに、スケジューラはプリンタとフィルタの状態を追跡します。プリンタが要求を印刷し終わると、プリンタサーバー上の待ち行列に残っているものがあれば、スケジューラは次の要求をスケジュールします。

図 8–1 lpsched デーモンによるローカル印刷要求のスケジューリング方法

lpsched が、デフォルトプリンタ、フィルタ、フォーム、およびクラスの構成情報を確認したあと、ローカル印刷要求を待ち行列に加え、要求が印刷されます。

各プリンタサーバーは、LP スケジューラを 1 つだけ実行していなければなりません。スケジューラは、システムのブート時に (または実行レベル 2 を入力すると)、制御スクリプト /etc/rc2.d/S80lp によって起動されます。システムを再起動しなくても、/etc/init.d/lp stop コマンドを使用してスケジューラを停止し、/etc/init.d/lp start コマンドを使用して再起動できます。各システムのスケジューラは、lp コマンドによってシステムに出された要求を管理します。

ネットワーク印刷要求のスケジューリング

各印刷クライアントは、ネットワーク経由で直接、プリンタサーバーと通信します。通信は、要求コマンド (lplpstat cancellprlpq、または lprm) とプリンタサーバー上の印刷サービス間で行われます。これによって、クライアント専用システムにおける印刷システムのオーバーヘッドが軽減され、その結果、拡張性、パフォーマンス、およびデータの正確性が向上します。

プリンタサーバーは、現在、インターネットサービスデーモン (inetd) で印刷要求を待機します。ネットワークから印刷サービスへ要求があると、inetd デーモンは「プロトコルアダプタ」と呼ばれるプログラム (in.lpd) を起動します。プロトコルアダプタは、印刷要求を翻訳して、印刷スプーラに送信し、その結果を要求依頼元に戻します。このプロトコルアダプタは、要求の発生時に起動し、ネットワーク要求の処理が完了すると終了します。このプロセスによって、印刷のためのアイドル状態のシステムのオーバーヘッドが解消されます。また、Solaris の以前の印刷機能にあった、ネットワークに接続された印刷サポート用の余分なシステム構成が不要になります。

印刷ファイルにフィルタを適用する

印刷フィルタは、待ち行列内のファイルの内容をある形式から別の形式に変換するプリンタサーバー上のプログラムです。

印刷フィルタは、必要に応じて簡単なものでも複雑なものでもかまいません。SunOS リリースの場合は、出力先プリンタが PostScript 形式へのデータ変換を必要とするほとんどの PostScript 印刷状況に対応する印刷フィルタが、/usr/lib/lp/postscript ディレクトリに組み込まれています。PostScript 以外のプリンタ用のフィルタが必要な場合は、そのフィルタを作成し、目的のシステムに追加しなければなりません。

一連の「印刷フィルタ記述子ファイル」が /etc/lp/fd ディレクトリに用意されています。これらの記述子ファイルは、フィルタの特性 (高速フィルタや低速フィルタなど) を記述し、フィルタプログラム (/usr/lib/lp/postscript/postdaisy など) を指します。

プリンタインタフェースプログラムの機能

LP 印刷サービスは、オペレーティングシステムの他の部分と情報をやり取りします。また、標準プリンタインタフェースプログラムを使用して、次の作業を実行します。

LP 印刷サービスは、別のプログラムが指定されなければ、標準インタフェースプログラム ( /usr/lib/lp/model ディレクトリに入っています) を使用します。独自のインタフェースプログラムを作成することもできますが、独自のプログラムがプリンタへの接続を終了させないことや正しいプリンタの初期設定を妨げないことを確認しなければなりません。

lpsched デーモンによる印刷ジョブ状態の確認

lpsched デーモンは、処理する各印刷要求のログを保持し、印刷処理中に発生したエラーを記録します。 このログは /var/lp/logs/lpsched ファイルに保管されます。毎晩、lp cron ジョブは /var/lp/logs/lpsched ファイルを新しい lpsched.n ファイル名に変更し、新しいログファイルを開始します。エラーが発生したり、印刷待ち行列からジョブが消えたりした場合は、ログファイルを使用して lpsched デーモンで実行された印刷ジョブへの処理を判別できます。

ログファイルの消去

/var/lp/logs ディレクトリ内の lpsched および requests ログファイルは、情報が追加されるにつれて大きくなります。LP 印刷サービスは、デフォルトの cron ジョブを使用してログファイルを消去します。lp cron ジョブは /var/spool/cron/crontabs/lp ファイルに入っています。このジョブはログファイルの内容を定期的に移動します。ログの内容は log.1 に移動され、log.1 の内容は log.2 に移動されるというようになります。log.2 が上書きされると、その内容は失われます (つまり、前の log.1 の内容が代わりに書き込まれます)。

プリンタ要求のログの交換間隔を変更する方法

Solaris 2.6 リリースより、プリンタサーバー上の requests ログファイルは、毎日ではなく、毎週交換されることになりました。プリンタサーバーの使用頻度が高い場合は、交換間隔を毎日に再設定できます。

  1. プリンタサーバー上でスーパーユーザーまたは lp になります。

  2. EDITOR 環境変数を設定します。


    # EDITOR=vi
    # export EDITOR
    
  3. lpcrontab ファイルを編集します。


    # crontab -e lp
    
  4. requests ログファイルの交換間隔を指定するファイルの先頭行を、毎日曜日 (0) から、毎日を示すアスタリスク (*) に変更します。


    13 3 * * * cd /var/lp/logs; if [ -f requests ]; then if
    [ -f requests.1 ]; then /bin/mv requests.1 requests.2; fi; /usr/bin/cp 
    requests requests.1;>requests; fi
  5. ファイルを保存して、終了します。

ローカル印刷の処理スケジュール

印刷要求は、クライアントとサーバーが異なるシステムにある場合と同じ経路をたどります。要求は常に同じ経路をたどり、クライアントからサーバーに流れます。

次の図に、ユーザーがローカルプリンタ上に PostScript ファイルを印刷する要求を出したときに実行される処理を示します。ローカルプリンタとは、ユーザーのシステムに接続されたプリンタです。ローカルシステム上の lpsched デーモンがすべての処理を実行します。これらの処理には、プリンタと内容形式の照合、デフォルトプリンタの特定、要求のフィルタ処理、指定されたプリンタインタフェースプログラムの起動などが含まれます。

プリンタインタフェースプログラムは、次のことを行います。

図 8–2 ローカルでの印刷処理

この図については前の本文中で説明しています。

リモート印刷の処理スケジュール

次の図は、Solaris 印刷クライアントのユーザーが lpd ベースのプリンタサーバーに印刷要求を出したときに実行される処理を示します。このコマンドは、直接プリンタサーバーと接続して、自身の通信を処理します。

図 8–3 Solaris 印刷クライアントと lpd ベースのプリンタサーバー間の印刷

Solaris 印刷クライアントが lpd ベースのプリンタサーバーへ印刷要求を送ると、サーバーは要求を受け付け、スプールに入れ、スケジュールして、印刷します。

次の図は、lpd ベースの印刷クライアントが Solaris プリンタサーバーに印刷要求を出す様子を示しています。 lpd デーモンは、印刷要求のローカル部分とプリンタサーバーへの接続を処理します。プリンタサーバー上の inetd プロセスは、ネットワーク印刷要求を待って、プロトコルアダプタを起動して要求を処理します。プロトコルアダプタは lpsched デーモンと通信し、このデーモンがプリンタサーバー上で要求を処理します。

図 8–4 lpd ベースの印刷クライアントと Solaris プリンタサーバー間の印刷

この図については前の本文中で説明しています。

次の図は、Solaris 印刷クライアントのユーザーが Solaris プリンタサーバーに印刷要求を出したときに実行される処理を示します。印刷クライアント上の印刷コマンドは、プリンタサーバーと直接通信することにより、各印刷要求のローカル部分を処理します。

プリンタサーバー上の inetd プロセスは、ネットワーク上の印刷要求を監視し、プロトコルアダプタを起動して、プリンタサーバー上の lpsched デーモンと通信します。このデーモンが印刷要求を処理します。

図 8–5 Solaris 印刷クライアントと Solaris プリンタサーバー間の印刷

この図については前の本文中で説明しています。