第19章 プリンタとCUPS

LPIC-1 108.4 相当

GUIが主体の作業に見える印刷も、Linuxではコマンドラインから投入・管理・トラブルシューティングができます。この章では、印刷の仕組みと、その中心となるCUPSを扱います。

印刷の仕組みとCUPSのアーキテクチャ

アプリケーションから印刷を指示すると、データはまずスプーラ(印刷ジョブを一時的に蓄積・順番に処理する仕組み)に渡され、プリンタの機種に応じたフィルタで変換された後、プリンタドライバを通じて実際のデバイスに送られます。現在の主要ディストリビューションでは、この一連の仕組みをCUPS(Common UNIX Printing System)が担っており、中心となるデーモンがcupsdです。

CUPSの設定は、サーバー全体の挙動を決める/etc/cups/cupsd.confと、登録済みプリンタの一覧を保持する/etc/cups/printers.confに分かれています。設定を直接ファイル編集する以外に、ブラウザからhttp://localhost:631にアクセスすることで、CUPSのWebインターフェースを使ってプリンタの追加やジョブの管理を行うこともできます。

印刷ジョブの投入

コマンドラインから印刷ジョブを投入するには、lprまたはlpコマンドを使います。

$ lpr -P office-printer report.pdf         # -P でプリンタを指定
$ lp -d office-printer -n 3 report.pdf      # lpコマンドの場合、部数は -n(lprは -#)
$ lpr -# 3 -o sides=two-sided-long-edge report.pdf   # -o で両面印刷などのオプションを指定

-P(または-d)でプリンタ名、-#(または-n)で部数、-oでその他の印刷オプション(用紙サイズ、両面印刷など)を指定できます。lprとlpはコマンド系統が異なりますが、どちらもCUPSに対して印刷ジョブを投入するという点は共通しています。

ジョブとプリンタの状態確認

コマンド役割
lpq指定したプリンタの印刷待ちジョブ一覧を表示する
lpstatプリンタの状態やジョブの状況を表示する(lpstat -pでプリンタ状態、lpstat -oでジョブ一覧)
lprm投入済みのジョブを取り消す(BSD系の書式)
cancel投入済みのジョブを取り消す(System V系の書式)

lprmとcancelはどちらも印刷ジョブの削除が目的ですが、由来する印刷システムの系統(BSD系/System V系)が異なるだけで、CUPS環境ではどちらのコマンドも使えるようになっています。

プリンタの管理

プリンタそのものの追加・削除・既定プリンタの設定はlpadminで行います。

$ lpadmin -p office-printer -E -v socket://192.168.1.100 -m everywhere   # プリンタを追加
$ lpadmin -d office-printer     # 既定のプリンタに設定
$ lpadmin -x old-printer        # プリンタを削除

ジョブの受け付け可否とプリンタの稼働可否は、別々に制御できます。cupsaccept / cupsrejectは、そのプリンタへの新しいジョブの受け付けを許可・拒否する設定で、cupsenable / cupsdisableは、プリンタ自体が実際に印刷処理を行うかどうかを切り替える設定です。例えば「新しいジョブは受け付けたいが、紙詰まりの間だけ印刷処理を一時停止したい」場合はcupsdisable、「メンテナンスのため、そもそも新しいジョブを受け付けたくない」場合はcupsrejectを使う、という使い分けになります。

よくある間違い: cupsdisableでプリンタを止めても、cupsrejectしていなければジョブは引き続き受け付けられ、キューにどんどん溜まっていきます。プリンタを完全に止めたい場合は、両方を組み合わせて使う必要があります。

PPDファイルとネットワークプリンタ

PPDファイル(PostScript Printer Description)は、そのプリンタが対応している用紙サイズや印刷品質、両面印刷の可否といった機能を記述したファイルで、CUPSが印刷データを生成する際の元になります。近年は、PPDファイルなしでも標準的な印刷機能を提供できるdriverless印刷や、ネットワーク越しに機種情報を自動取得できるIPP(Internet Printing Protocol)対応のプリンタも増えています。

ネットワークプリンタを複数のクライアントで共有する場合、CUPSサーバーを印刷サーバーとして立て、各クライアントはそのCUPSサーバーに向けて印刷ジョブを送る、という構成がよく取られます。この構成では、各クライアント側にプリンタ固有のドライバを個別にインストールする必要がなく、CUPSサーバー側の設定を1か所変更するだけで、全クライアントに変更を反映できるという利点があります。共有するプリンタが複数台ある場合は、印刷が集中しやすい共用機だけを高性能な機種にする、といった運用上の工夫も現場ではよく行われます。

試験対策: 「印刷データがどの段階で変換されるか」(スプーラ→フィルタ→ドライバ→デバイス)という流れと、CUPSの主要な設定ファイルの場所(/etc/cups/cupsd.conf、/etc/cups/printers.conf)は、LPIC-1の106番台で問われやすいポイントです。コマンド名(lpr/lp、lpq/lpstat、lprm/cancel)についても、系統の違い(BSD系/System V系)とセットで覚えておくと混同しにくくなります。

トラブルシューティングの基本

「印刷したのにジョブが滞留したまま進まない」という場合は、まずlpstat -pでプリンタ自体がdisabledになっていないか、lpstat -oで滞留しているジョブの数を確認します。プリンタが有効なのにジョブが進まない場合は、ネットワーク経路の疎通や、CUPSのエラーログ(/var/log/cups/error_logなど)の確認に進む、という順序で切り分けると効率的です。

確認クイズ

Q1. 印刷ジョブを一時的に蓄積し、順番に処理する仕組みを何と呼びますか?

解説: スプーラは印刷ジョブを一時的に蓄積し、順番に処理していく仕組みです。フィルタはプリンタの機種に応じてデータを変換する処理を指します。

Q2. 現在の主要ディストリビューションで、印刷の仕組みの中心を担っているシステムはどれですか?

解説: CUPS(Common UNIX Printing System)が印刷の仕組みの中心を担っており、cupsdというデーモンが処理を行います。

Q3. プリンタを稼働させたまま、新しいジョブの受け付けだけを拒否したい場合に使うコマンドはどれですか?

解説: cupsreject は新しいジョブの受け付けを拒否する設定です。cupsdisable はプリンタ自体の印刷処理を停止する設定で、役割が異なります。

Q4. そのプリンタが対応する用紙サイズや両面印刷の可否などを記述した、CUPSが参照するファイルはどれですか?

解説: PPDファイル(PostScript Printer Description)は、プリンタが対応する機能を記述したファイルで、CUPSが印刷データを生成する際に参照します。