ここでは、プリンタハードウェアおよびソフトウェアに最も一般的に発生する問題と、それを解決または回避する方法について説明します。GDIプリンタ、PPDファイル、およびポート設定などのトピックをカバーしています。一般的なネットワークプリンタに関する問題、印刷に問題がある場合、およびキュー処理についても対処しています。
これらのプリンタは、共通のプリンタ言語をサポートしておらず、独自のコントロールシーケンスを使用しないと対処できません。そのため、これらのプリンタは、メーカがドライバを添付した特定のバージョンのオペレーティングシステムでのみ動作します。GDIは、Microsoft*がグラフィックデバイス用に開発したプログラミングインタフェースです。通常、メーカーはWindows用のドライバだけを提供しています。また、WindowsドライバはGDIインタフェースを使用しているため、これらのプリンタは「GDIプリンタ」と呼ばれることもあります。実質的な問題は、このプログラミングインタフェースではなく、これらのプリンタを制御できるのは、各プリンタモデルが採用している独自のプリンタ言語のみという事実にあります。
いくつかのGDIプリンタは、GDIモードと標準的なプリンタ言語のいずれかの間で切り替えることができます。マニュアルがある場合は、プリンタのマニュアルを参照してください。モデルによっては、切り替えを行うために特別なWindowsソフトウェアが必要なこともあります(Windowsから印刷する場合、Windowsプリンタドライバは常にプリンタをGDIモードに切り替える場合があることに注意してください)。他のGDIプリンタでは、標準のプリンタ言語を利用するための拡張モジュールが用意されています。
一部のメーカは、プリンタに独自規格のドライバを提供しています。独自規格のプリンタドライバの欠点は、インストール済みの印刷システムとそのドライバを組み合わせたときに動作するという保証も、さまざまなハードウェアプラットフォームに適しているという保証もないことです。一方、標準的なプリンタ言語をサポートするプリンタは、特殊なバージョンの印刷システムや特殊なハードウェアプラットフォームに依存しません。
独自規格に対応するLinuxドライバを正常に機能させるために時間を費やすより、サポートされているプリンタを購入する方がコスト効率が良いこともあります。この方法により、ドライバの問題を一度だけで、そしてあらゆる状況で解決できます。特殊なドライバソフトウェアのインストールと設定を行う必要はなく、新しい印刷システムの開発に伴ってドライバのアップデートを入手する必要もありません。
manufacturer-PPDsパッケージの中に、特定のPostScriptプリンタに適したPPDファイルが含まれていない場合、プリンタメーカ製のドライバCDに収録されているPPDファイルを使用すること、またはプリンタメーカのWebページから適切なPPDファイルをダウンロードすることができるはずです。
PPDファイルがzipアーカイブ(.zip)または自己展開zipアーカイブ(.exe)の形で提供されている場合、unzipを使用してそのファイルを展開します。最初に、PPDファイルのライセンス(許諾契約)条項を読みます。次にcupstestppdユーティリティを使って、PPDファイルがAdobe PostScript Printer Description File Format Specification, version 4.3
に準拠しているかどうかを確認します。FAIL
ユーティリティから失敗が返された場合は、PPDファイル中のエラーは深刻なもので、問題を引き起こす可能性があります。cupstestppdによって報告された問題点は、取り除く必要があります。必要に応じて、適切なPPDファイルが入手できるかどうかをプリンタメーカに問い合わせることも考えられます。
最も安全なアプローチは、プリンタを最初のパラレルポートに直接接続し、BIOS内で次のパラレルポート設定値を選択することです。
I/Oアドレス:378 (16進)
割り込み:無関係
モード:Normal (通常)、SPP、またはOutput Only (出力専用)
DMA:無効
これらの設定値を使用した場合でも、パラレルポートに接続したプリンタを使用できない場合、BIOS内での設定値に合わせて、I/Oアドレスを0x378という形で/etc/modprobe.conf内に明示的に入力します。2つのパラレルポートが存在し、それぞれのI/Oアドレスが378と278 (16進)に設定されている場合、それらを0x378,0x278という形で入力します。
割り込み(IRQ) 7が空いている場合、例 10-1に示すエントリを使用して、その割り込みを有効にすることもできます。割り込みモードを有効にする前に、/proc/interruptsファイルを参照して、すでに使用中の割り込みを調べます。現時点で使用中の割り込みだけが表示されます。どのハードウェアコンポーネントがアクティブになっているかに応じて、この表示は変化することがあります。パラレルポート用の割り込みは、他のどのデバイスも使用してはなりません。自信がない場合、irq=noneを指定してポーリングモードを使用します。
例 10-1 /etc/modprobe.conf:最初のパラレルポートの割り込みモード
alias parport_lowlevel parport_pc options parport_pc io=0x378 irq=7
プリンタをコンピュータに直接接続します。テストの目的で、そのプリンタをローカルプリンタとして設定します。この方法で動作する場合、問題はネットワークに関連しています。
TCP/IPネットワークと名前解決が正しく機能していることが必要です。
次のコマンドを使用して、host上のlpd (ポート515)に対するTCP接続を確立できるかどうかをテストします。
netcat -z host 515 && echo ok || echo failed
lpdへの接続を確立できない場合、lpdがアクティブになっていないか、ネットワークの基本的な問題があります。
rootユーザで次のコマンドを使用し、リモートhost上のqueueに関するステータスレポート(おそらく、非常に長い)を照会することもできます。これは、該当のlpdがアクティブで、そのホストが照会を受け付けることを前提にしています。
echo -e "\004queue" \
| netcat -w 2 -p 722 host 515
lpdが応答しない場合、それがアクティブになっていないか、ネットワークの基本的な問題が発生している可能性があります。lpdが応答する場合、その応答は、host上にあるqueueを介して印刷ができない理由を示すはずです。例 10-2でこうした応答を受け取った場合、問題はリモートのlpdにあります。
例 10-2 lpdからのエラーメッセージ
lpd: your host does not have line printer access lpd: queue does not exist printer: spooling disabled printer: printing disabled
デフォルトでは、CUPSネットワークサーバはUDPポート}631を使用して、自らのキューを 30秒ごとにブロードキャストします。したがって、次のコマンドを使用して、ネットワーク内にCUPSネットワークサーバが存在しているかどうかをテストすることができます。コマンドを実行する前に、ローカルCUPSデーモンが終了していることを確認します。
netcat -u -l -p 631 & PID=$! ; sleep 40 ; kill $PID
ブロードキャストを行っているCUPSネットワークサーバが存在している場合、出力は例 10-3に示すようになります。
例 10-3 CUPSネットワークサーバからのブロードキャスト
ipp://192.168.2.202:631/printers/queue
IBM System zのイーサネットデバイスが、デフォルトではブロードキャストを受信しないことを考慮してください。
次のコマンドを使用して、host上のcupsd (ポート631)に対するTCP接続を確立できるかどうかをテストすることができます。
netcat -z host 631 && echo ok || echo failed
cupsdへの接続を確立できない場合は、cupsdが有効になっていないか、基本的なネットワークの問題が発生している可能性があります。lpstat -h host -l -tは、host上のすべてのキューに関するステータスレポート(非常に長い場合がある)を返しますが、それぞれのcupsdが有効になっていて、ホストがクエリを受け入れることが前提になります。
次のコマンドを使用して、host上のqueueが、1つのキャリッジリターン(CR、改行)文字からなる印刷ジョブを受け付けるかどうかをテストできます。何も印刷されないのが妥当です。おそらく、空白のページが排出されるはずです。
echo -en "\r" \
| lp -d queue -h host印刷サーバボックス上のスプーラは時々、大量の印刷ジョブを処理する必要が生じた場合、問題を引き起こすことがあります。これは印刷サーバボックス内のスプーラに起因しているので、ほとんどの場合、管理者が実行できる対策はありません。回避策として、印刷サーバボックス内のスプーラを使用することを避け、TCPソケットを使用して、印刷サーバボックスに接続されているプリンタに直接送信できます。詳細については、セクション 10.4, ネットワークプリンタを参照してください。
この方法により、印刷サーバボックスは異なる形式のデータ転送(TCP/IPネットワークとローカルプリンタ接続)間の単純なコンバータになります。この方法を使用するには、印刷サーバボックス内にある、該当するTCPポートについて把握する必要があります。プリンタが印刷サーバボックスに接続されていて、電源がオンになっている場合、印刷サーバボックスの電源をオンにした後、しばらく経過した時点で、nmapパッケージのnmapユーティリティを使用することにより、このTCPポートを特定できます。たとえば、nmap IP-addressは、印刷サーバボックスに関して次のような出力をすることがあります。
Port State Service 23/tcp open telnet 80/tcp open http 515/tcp open printer 631/tcp open cups 9100/tcp open jetdirect
この出力は、印刷サーバボックスに接続されているプリンタが、ポート9100上のTCPソケットを介して使用できることを示します。nmapはデフォルトでは、/usr/share/nmap/nmap-services内でリストされている多数の一般的な既知のポートだけを確認します。可能性のあるすべてのポートをチェックするには、nmap -p from_port-to_portIP-addressコマンドを使用します。これは、ある程度の時間を要することがあります。詳細な情報については、nmapのマニュアルページを参照してください。
次のようなコマンドを入力します。
echo -en "\rHello\r\f" | netcat -w 1 IP-address port cat file | netcat -w 1 IP-address port
これは、このポートを通してプリンタを使用できるかどうかをテストするために、該当のポートへ文字列またはファイルを直接送信します。
印刷システムの観点では、CUPSバックエンドが受信側(プリンタ)へのデータ転送を完了した段階で、印刷ジョブは完了します。受信側でそれ以降の処理が失敗した場合(たとえば、プリンタがそのプリンタ固有のデータを印刷できない)、印刷システムはそのことを検出しません。プリンタがそのプリンタ固有のデータを印刷できない場合、そのプリンタにより適していると考えられる他のPPDファイルを選択します。
受信側へのデータ転送が数回の試行後に完全に失敗した場合、usbやsocketなどのCUPSバックエンドは印刷システム(より正確にはcupsd)にエラーを報告します。データ転送が不可能であると報告する前に、バックエンドは、試行に意味があるかどうか、また何回の試行に意味があるかを判断します。それ以上の試行は無駄に終わる可能性があるので、cupsdは該当のキューへの印刷を無効にします。問題の原因を取り除いた後、システム管理者はcupsenableコマンドを使用して、印刷を再度有効にする必要があります。
CUPSネットワークサーバが参照機能を使用して自らのキューをクライアントホストへブロードキャストし、クライアントホスト側で適切なローカルcupsdがアクティブになっている場合、クライアント側のcupsdはアプリケーションから印刷ジョブを受け付け、サーバ側のcupsdへそれらを転送します。cupsdが印刷ジョブを受け付けた段階で、そのジョブに新しいジョブ番号が割り当てられますBしたがって、クライアントホスト上のジョブ番号は、サーバ上のジョブ番号とは異なっています。印刷ジョブは通常、即座に転送されるので、クライアントホスト上でジョブ番号を使用してそのジョブを削除することはできません。 クライアント側のcupsdは、サーバ側のcupsdへの転送が完了した段階で、その印刷ジョブは完了したと考えるからです。
サーバ上にある印刷ジョブを削除するには、lpstat -h cups.example.com -oなどのコマンドを使用してサーバ上でのジョブ番号を判断します。サーバがまだその印刷ジョブを完了していない(つまり、プリンタへ完全に送信していない)ことが前提条件です。このジョブ番号を使用して、サーバ上にある印刷ジョブを削除できます。
cancel -h cups.example.com queue-jobnnumber
印刷プロセスの実行中に、管理者がプリンタの電源をオフにして再度オンにした場合、またはコンピュータをシャットダウンしてリブートした場合、印刷ジョブはキュー内にとどまっていて、印刷が再開されます。異常な印刷ジョブは、cancelを使用してキューから削除する必要があります。
印刷ジョブが異常な場合、またはホストとプリンタの間で通信エラーが発生した場合、プリンタはデータを正しく処理できなくなるので、文字化けのような大量のページを印刷することがあります。この状態を処理するには、次の処理を実行します。
プリンタの動作を停止するために、インクジェットプリンタの場合、すべての用紙を取り除きます。 レーザープリンタの場合、用紙トレイを開けます。上位機種のプリンタでは、現在のプリントアウトをキャンセルするボタンを用意していることもあります。
この時点で、印刷ジョブはキューに残っている可能性があります。 ジョブがキューから削除されるのは、ジョブ全体をプリンタへ送信した後に限られるからです。lpstat -o(またはlpstat -h cups.example.com -o)を使用して、どのキューが現在印刷に使用されているかを確認します。cancel queue-jobnumber (またはcancel -h cups.example.com queue-jobnumber)を使用して、該当の印刷ジョブを削除します。
印刷ジョブがすでにキューから削除されたにもかかわらず、一部のデータが依然として、プリンタへ送信され続けることもあります。CUPSバックエンドプロセスが、引き続き該当のキューを対象として動作しているかどうかをチェックし、その処理を終了します。たとえば、プリンタがパラレルポートに接続されている場合、fuser -k /dev/lp0コマンドを使用して、引き続きそのプリンタ(より正確に表現すると、パラレルポート)にアクセスしているすべてのプロセスを終了することができます。
ある程度の時間にわたって電源をオフにして、プリンタを完全にリセットします。その後、紙を元に戻し、プリンタの電源をオンにします。
CUPS印刷システムの問題を特定するために、次の一般的な処理を実行してください。
/etc/cups/cupsd.conf内に、LogLevel debugを設定します。
cupsdコマンドを停止します。
/var/log/cups/error_log*を削除して、大規模なログファイルから検索を行うことを避けます。
cupsdを起動します。
問題の原因となったアクションをもう一度実行します。
/var/log/cups/error_log*内のメッセージを確認し、問題の原因を識別します。
Novell Knowledgebase (http://support.novell.com/)では、さまざまな個別の問題のソリューションが紹介されています。CUPSのテキスト検索機能により関連する記事を見つけてください。