CUPS (Common UNIX Printing System) について
CUPS(カップス、以前の名称はCommon UNIX Printing System)は、
[Unix系]]オペレーティングシステム] 用のモジュール化された印刷システムです。このシステムは、[[Unix系OSが抱えていた印刷機能の遅れを解消し、強力な印刷環境を提供することを目的として開発されました。
CUPSの主な特徴
多様なプリンター対応: CUPSは、Unix系OSで必要だったプリンターごとのデバイスドライバ作成を容易にし、従来のラインプリンターやPostScriptプリンターだけでなく、Macintosh/Windows向けに市販されているほぼ全てのプリンターをUnix系OS上で利用可能にしました。
クライアント/サーバーモデル: CUPSを導入した
コンピュータは印刷
サーバーとして機能し、クライアントからの印刷ジョブを受け付け、適切な
プリンターへ送信します。この際、HTTPの
Basic認証やDigest認証、ローカル認証、128ビットTLS/SSL暗号化などのセキュリティ機能を利用できます。
モジュール構造: CUPSは、Unixの印刷スプーラ、スケジューラ、フィルタシステム、バックエンドシステムから構成されています。フィルタシステムは印刷データをプリンターが解釈できる形式に変換し、バックエンドシステムは変換されたデータをプリンターに送信します。
標準プロトコルの利用: 印刷ジョブの基盤としてIPP (Internet Printing Protocol) を採用し、System V形式やBSD形式のコマンドラインインタフェースもサポートします。また、SMBプロトコルも部分的にサポートしており、Windows環境との連携も可能です。
PPDファイルによる設定: デバイスドライバの設定には、アドビのPPD (PostScript Printer Description) 形式のテキストファイルを使用します。
Webインターフェース: CUPS自身がWebベースの設定インターフェースを提供しており、多くのプラットフォーム向けに様々なユーザーインターフェースが開発されています。ESP Print Proのような商用パッケージから、KUPS、GtkLP、QtKUPS、XPPなどのオープンソースGUIツールまで、選択肢が豊富です。
ライセンス: macOS版はプロプライエタリライセンスですが、その他のOS向けにはApache Licenseで配布されています。
CUPSの歴史
CUPSは、1999年秋にEasy Software Productsのマイケル・スイートとアンドルー・ゼンフトによって開発が開始されました。初期の段階ではlpd (line printer daemon) を使用していましたが、プリンターとの相性問題からIPPもサポートされるようになりました。
CUPSは、Red Hat LinuxなどのLinuxディストリビューションで標準の印刷システムとして採用され、2002年3月にはApple ComputerがMac OS X v10.2のデフォルト印刷システムとして採用しました。2007年2月には、Appleが主要開発者であるマイケル・スイートを雇用し、CUPSのソースコードを取得しています。2019年12月20日、マイケル・スイートはAppleを退職しましたが、2020年にはOpenPrinting organizationでCUPSの開発を継続しています。
当初、CUPSは "Common UNIX Printing System" と呼ばれていましたが、UNIX商標に関する法的な懸念から、CUPS 1.4以降は "CUPS" と短縮されました。
CUPSの動作原理
CUPSは、印刷ジョブをプリンターへ送信するための標準的なメカニズムを提供します。印刷データはまずスケジューラに送られ、スケジューラはジョブをプリンターが理解できる形式に変換するため、フィルタシステムに送ります。その後、フィルタシステムは変換されたデータを、デバイスやネットワークに送信するバックエンドに渡します。
CUPSのシステムは、PostScriptとラスタグラフィックスを最大限に活用して、データをプリンターが理解できる形式に変換します。これにより、多様なプリンターに対応することが可能になっています。
CUPSの利点
CUPSの最大の利点は、標準化され、モジュール化された印刷システムであることです。以前は、市場に出回るプリンターごとに独自の言語や形式があり、標準的な印刷処理システムが存在しませんでした。System Vやバークレーの印刷システムは互換性がほとんどなく、複雑なスクリプトや一時的な手段でデータを変換する必要がありました。また、データ形式を自動的に検出する機能もなかったため、各ワークステーションでデータ変換を行う必要がありました。
CUPSでは、プリンターメーカーやドライバ開発者が専用ドライバを簡単に作成できるようになり、サーバ上で処理することでネットワーク印刷が容易になりました。Sambaを利用すれば、リモートのWindowsコンピュータからPostScriptドライバを使って印刷することも可能です。
CUPSの主要コンポーネント
スケジューラ
CUPSスケジューラは、IPPまたはlpdプロトコルを使用できます。HTTP/1.1リクエストを解釈し、印刷ジョブの管理、サーバー設定、CUPSドキュメントへのWebインターフェースを提供します。
スケジューラには、システムに受け渡されるメッセージを制御する承認モジュールがあります。承認されたパケットはクライアントモジュールに送られ、クライアントモジュールはWebベースのプリンタ、クラス、ジョブ状況のモニタリングと管理のための外部CGIプログラムの実行を処理します。クライアントモジュールがリクエストを処理すると、データはIPPモジュールに送られ、URIの検証を行い、HTTPサーバーのアクセス制限や認証を回避できないようにします。
スケジューラはプリンターをクラスにグループ化できます。ジョブはクラスに送られ、スケジューラはクラス内で最初に利用可能なプリンターを選択してジョブを送ります。ジョブモジュールは、印刷ジョブをフィルタとバックエンド処理に送り、ステータスメッセージを監視します。設定モジュールはCUPSのデータ構造を初期化し、設定ファイルを解析してCUPSプログラムを起動し、処理中はサービスを停止し、完了後に再開します。
ログモジュールは、アクセス、エラー、ログファイルの操作に関するスケジューラのイベントログを記録します。メインモジュールは、タイムアウトとクライアントからのI/Oリクエストを処理し、シグナルを監視し、サーバー設定ファイルの再読み込みや子プロセスのエラーと終了を処理します。
スケジューラで使われるその他のモジュールには、MIME型と変換データベースを扱うMIMEモジュール、PPDファイルを扱うPPDモジュール、デバイスリストを扱うデバイスモジュール、CUPS内のプリンターとPPDを扱うプリンターモジュールがあります。
フィルタシステム
CUPSの大きな利点の一つは、さまざまなデータ形式を印刷サーバーで処理できることです。印刷ジョブは、一連のフィルターを通ってプリンターの最終的な言語と形式に変換されます。この変換はMIME型によって抽象化され、CUPSはmime.typesとmime.convsの2つのMIMEデータファイルを使用します。mime.typesはファイルのMIME型を決定し、mime.convsはあるMIME型を別のMIME型に変換するプログラムを定義します。
例えば、HTMLファイルを検出するためのmime.typesの行は以下のようになります。
text/html html htm \
printable(0,1024) + (string(0,"<HTML>") string(0,"<!DOCTYPE"))
これは、ファイルの拡張子がhtmlまたはhtmであるか、ファイルの最初の1KiBが印刷可能な文字で構成され、かつ<HTML>または<!DOCTYPEで始まる場合に、ファイルがtext/html MIME型であるとみなされることを意味します。
mime.convsファイルは、以下のような行で構成されます。
text/plain application/postscript 50 texttops
1番目と2番目のカラムは、それぞれ変換前のMIME型と変換後のMIME型を表します。3番目のカラムは、ファイルの変換コストを表し、フィルタシステムが変換時にどのフィルターの組み合わせを選択するかを決定する評価基準となります。最後のカラムは、データを変換するためのフィルタープログラムを表します。したがって、text/plain型のファイルは、texttopsフィルターによってコスト50でapplication/postscript型に変換されることになります。
フィルタシステムは、プリンターキューまたは印刷フィルター名、印刷ジョブのジョブ番号、ユーザー名、ジョブ名、部数、その他の印刷オプション、およびファイル名(標準入力からリダイレクトされた場合は不要)を引数として受け取ります。その後、MIMEデータベースを使用して入力データの型と使用されるフィルターを決定します。
画像データであれば特定のフィルターで処理され、HTMLデータであれば別のフィルターで処理されます。これらのデータは、PostScriptデータに変換されるか、直接ラスタデータに変換されます。PostScriptデータに変換された場合は、プレフィルターと呼ばれる追加のフィルターが適用され、印刷ページ範囲の指定やN-Upモード設定などのプリンター固有のオプションを追加するためのPostScript変換プログラムが適用されます。
プレフィルターによる処理後、PostScriptプリンターを使用する場合は、データはCUPSバックエンドに送られ、そうでない場合は別のフィルターやGhostscriptで処理されます。PostScriptは、プリンターに依存しない中間形式のCUPSラスタフォーマット(application/vnd.cups-raster)に変換されます。最後に、この中間ラスタ形式はプリンター固有の形式に変換されます。
このラスタ形式からフィルタリングするデフォルトのCUPSフィルターには、PCL(Printer Command Language)、ESC/PまたはESC/P2、およびDymoがあります。また、CUPSで使用可能な代替フィルターもあります。CUPSの開発元であるEasy Software Productsは、独自のCUPSフィルターをリリースしています。Gimp-Printは、主にインクジェットプリンター向けの高品質なドライバーであり、LinuxのTurbo-Printもさまざまなプリンタードライバーを提供しています。
バックエンド
バックエンドは、プリンターにデータを送信する役割を果たします。CUPSで使用できるバックエンドには、パラレルポート、シリアルポート、USBポートに接続されたプリンターのほか、IPP、JetDirect (AppSocket)、lpd、SMBプロトコルを介したネットワークバックエンドがあります。
互換性
CUPSは、従来の印刷コマンドが使えるように、System VとBSDの両方の形式をサポートしています。CUPSは従来のlpdポートであるポート515を監視し、それをバックエンドとして扱います。CUPSをインストールすると、System Vの印刷システムに対応するlpコマンドとBSDの印刷システムに対応するlprコマンドが互換プログラムとしてインストールされ、既存のアプリケーションとの互換性を最大限に保ちます。
注釈
外部リンク
公式ウェブサイト
GitHub - apple/cups: Apple CUPS Sources
OpenPrinting CUPS
Project: Gimp-Print - Top Quality Printer Drivers: Summary
2ch Linux Beginners 印刷関連FAQ集