CUPS(旧称: Common UNIX Printing System )は、 Unix系コンピュータオペレーティングシステム向けのモジュール式印刷システムであり、コンピュータをプリントサーバーとして機能させることができます。CUPSを実行しているコンピュータはホストとして機能し、クライアントコンピュータから印刷ジョブを受け取り、処理して、適切なプリンタに送信します。
CUPSは、印刷スプーラーとスケジューラー、印刷データをプリンタが理解できる形式に変換するフィルタシステム、およびこのデータを印刷デバイスに送信するバックエンドシステムで構成されています。CUPSは、印刷ジョブとキューの管理の基盤としてインターネット印刷プロトコル(IPP)を使用します。また、 System VおよびBerkeley印刷システム用の従来のコマンドラインインターフェイスを提供し、Berkeley印刷システムのラインプリンタデーモンプロトコルと、サーバーメッセージブロック(SMB)プロトコルの限定的なサポートを提供します。システム管理者は、AdobeのPostScriptプリンタ記述(PPD)形式のテキストファイルを編集することで、CUPSが提供するデバイスドライバを構成できます。CUPSを構成できるさまざまなプラットフォーム用のユーザーインターフェイスが多数あり、Webベースのインターフェイスも組み込まれています。CUPSは、Apacheライセンスの下で提供されるフリーソフトウェアです。
Easy Software Products のオーナーであったMichael Sweet は、1997 年に CUPS の開発を開始し、最初のパブリック ベータ版は 1999 年に登場しました。[ 5 ] [ 6 ] CUPS の当初の設計では、ラインプリンタデーモン プロトコル(LPD) が使用されていましたが、LPD の制限とベンダーの非互換性のため、代わりにインターネット印刷プロトコル(IPP) が選択されました。CUPS は当初「The Common UNIX Printing System」と呼ばれていました。UNIX 商標に関する法的懸念のため、CUPS 1.4 以降はこの名前が単に「CUPS」に短縮されました。[ 7 ] CUPS は、ほとんどのLinux ディストリビューションのデフォルトの印刷システムとしてすぐに採用されました。2002 年 3 月、Apple Inc. はMac OS X 10.2の印刷システムとして CUPS を採用しました。[ 8 ] 2007 年 2 月、Apple Inc. はチーフ開発者の Michael Sweet を雇用し、CUPS のソース コードを購入しました。[ 9 ] 2019 年 12 月 20 日、Michael Sweet は自身のブログで Apple を退社したことを発表しました。[ 10 ] [ 11 ] 2020年、OpenPrinting組織がプロジェクトをフォークし、Michael Sweetが作業を継続した。AppleはmacOS、iOS、iPadOS用のビルドを保持し、Apple CUPSの最新リリースは2022年5月25日のバージョン2.3.6である。[ 12 ] [ 13 ] [ 14 ] 2024年、CUPSのリモートコード実行に関する重大な脆弱性が発見され、すべてのGNU/Linuxシステムに影響を与えた。[ 15 ]

CUPSは、印刷ジョブを標準的な方法でプリンタに送信できるメカニズムを提供します。印刷データはスケジューラ[ 16 ]に送られ、スケジューラはジョブをフィルタシステムに送信し、フィルタシステムは印刷ジョブをプリンタが理解できる形式に変換します[ 17 ] 。フィルタシステムは、データをバックエンド(印刷データをデバイスまたはネットワーク接続に送信する特別なフィルタ)に渡します[ 18 ] 。このシステムは、 PostScriptとデータのラスタライズを多用して、データを宛先プリンタに適した形式に変換します。
CUPSは、プリントサーバー上で多数のデータ形式を処理できる、標準化されたモジュール式の印刷システムを提供します。CUPSが登場する以前は、独自のプリンター言語と形式を使用する多種多様なプリンターに対応できる標準的なプリンター管理システムを見つけるのは困難でした。例えば、System VとBerkeleyの印刷システムは互換性がほとんどなく、プログラムのデータ形式を印刷可能な形式に変換するには、複雑なスクリプトや回避策が必要でした。これらのシステムは、プリンターに送信されるファイル形式を検出できないことが多く、そのためデータストリームを自動的かつ正確に変換することができませんでした。さらに、データ変換は中央サーバーではなく、個々のワークステーションで行われていました。
CUPSを使用すると、プリンターメーカーやプリンタードライバー開発者は、プリントサーバー上でネイティブに動作するドライバーをより簡単に作成できます。処理はサーバー上で行われるため、他のUnix系印刷システムよりもネットワークベースの印刷が容易になります。Sambaがインストールされていれば、ユーザーはリモートのWindowsコンピューター上のプリンターにアクセスでき、汎用PostScriptドライバーを使用してネットワーク経由で印刷できます。
CUPSスケジューラは、 HTTP/1.1上でインターネット印刷プロトコル(IPP)を実装しています。ヘルパーアプリケーション(cups-lpd)は、ラインプリンタデーモンプロトコル(LPD)リクエストをIPPに変換します。スケジューラはまた、印刷ジョブの管理、サーバーの設定、およびCUPS自体のドキュメントのためのWebベースのインターフェースも提供します。[ 16 ]
認証モジュールは、どの IPP および HTTP メッセージがシステムを通過できるかを制御します。[ 19 ] IPP/HTTP パケットが認証されると、それらはクライアントモジュールに送信され、そこで着信接続をリッスンして処理します。クライアント モジュールは、Web ベースのプリンタ、クラス、ジョブ ステータスの監視と管理をサポートするために必要に応じて外部CGIプログラムを実行する責任も負います。 [ 20 ]このモジュールが要求を処理すると、それらをIPPモジュールに送信します。IPP モジュールは、クライアントが HTTP サーバー上のアクセス制御や認証を回避できないように、Uniform Resource Identifier (URI) 検証を実行します。[ 21 ] URI は、ネットワーク上の抽象的または物理的なリソースを参照するために使用できる名前またはアドレスを示すテキストストリングです。
スケジューラはプリンタのクラスを可能にします。アプリケーションはクラス内のプリンタのグループにリクエストを送信でき、スケジューラはそのクラス内で最初に使用可能なプリンタにジョブを振り分けることができます。[ 22 ]ジョブモジュールは印刷ジョブを管理し、最終的な変換と印刷のためにフィルタおよびバックエンドプロセスに送信し、これらのプロセスからのステータスメッセージを監視します。[ 23 ]
CUPSスケジューラは、設定ファイルを解析し、CUPSデータ構造を初期化し、CUPSプログラムを開始および停止する設定モジュールを利用します。設定モジュールは、設定ファイルの処理中にCUPSサービスを停止し、処理が完了したらサービスを再起動します。[ 24 ]
ロギングモジュールは、アクセス、エラー、ページログファイル用のスケジューライベントのログ記録を処理します。メインモジュールは、クライアント接続のタイムアウトとI/Oリクエストのディスパッチ、シグナルの監視、子プロセスのエラーと終了の処理、必要に応じたサーバー構成ファイルの再読み込みを処理します。[ 25 ]
スケジューラで使用されるその他のモジュールには以下が含まれます。

CUPSはプリントサーバー上でさまざまなデータ形式を処理できます。一連のフィルタを介して印刷ジョブデータをプリンタの最終的な言語/形式に変換します。[ 30 ] [ 31 ]ファイル形式を識別するためにMIMEタイプを使用します。
CUPSシステムが印刷ジョブをスケジューラに割り当てた後、CUPSフィルタシステムに渡されます。これにより、データがプリンタに適した形式に変換されます。起動時に、CUPSデーモンは2つのMIMEデータベースをロードします。1つはmime.typesCUPSがデータを受け入れることができる既知のファイルタイプを定義するもので、もう1mime.convsつは各MIMEタイプを処理するプログラムを定義するものです。[ 32 ]
ファイルmime.typesには以下の構文が含まれています。
mimetype { [file-extensions] | [pattern-match] }
例えば、HTMLファイルを検出するには、以下のエントリが適用できます。
text/html html htm \
printable(0,1024) + (string(0,"<HTML>") string(0,"<!DOCTYPE"))2行目では、ファイル内の最初の1キロバイトのテキストに印刷可能な文字が含まれており、それらの文字にHTMLマークアップが含まれていることを判定することで、ファイルの内容を指定されたMIMEタイプに照合します。上記のパターンが一致する場合、フィルタシステムはファイルをMIMEタイプtext/htmlとしてマークします。[ 33 ]
ファイルmime.convsには以下の構文が含まれています。
source destination cost program
ソースフィールドは、ファイルを検索して決定された MIME タイプを指定しmime.types、宛先フィールドは要求された出力タイプをリストし、使用するプログラムを決定します。これも から取得されますmime.types。コストフィールドは、ファイルを変換する際のフィルタ セットの選択に役立ちます。最後のフィールドであるプログラム は、データ変換を実行するために使用するフィルタ プログラムを決定します。[ 34 ]
いくつかの例を挙げます。
text/plain application/postscript 50 texttops application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster image/* application/vnd.cups-postscript 50 imagetops image/* application/vnd.cups-raster 50 imagetoraster
フィルタリング処理は、6つの引数で事前にフォーマットされた入力データを受け取ることで機能します。
次に、MIMEデータベースを使用して、入力されているデータの種類と使用するフィルタを決定します。たとえば、画像データは特定のフィルタで検出および処理され、HTMLデータは別のフィルタで検出および処理されます。
CUPS は、提供されたデータをPostScriptデータまたはラスター データに直接変換できます。PostScript データに変換される場合、プリフィルタと呼ばれる追加のフィルタが適用されます。プリフィルタは、PostScript データを別の PostScript コンバータに通して、印刷するページ範囲の選択、nアップ モードの設定、その他のデバイス固有の設定など、プリンタ固有のオプションを追加します。[ 35 ]プリフィルタ処理が完了すると、PostScript プリンタを使用している場合はデータを CUPSバックエンドに直接送信するか、linuxprinting.orgのFoomaticなどの別のフィルタに渡すことができます。あるいは、 PostScript を中間的なCUPS ラスター形式に変換するGhostscriptに渡すこともできます。[ 36 ]中間的なラスター形式は、ラスター データをプリンタ固有の形式に変換する最終フィルタに渡されます。CUPS に含まれるデフォルトのフィルタは次のとおりです。
2009年現在GDIやSPL(Samsung Printer Language)などの他の独自言語は、ラスターからSPLへの変換ツールであるSplixによってサポートされています。[ 37 ]
しかし、CUPSと連携できる代替手段は他にもいくつかあります。HPLIP (以前はHP-IJSとして知られていました)はHPプリンター用のLinux+CUPSドライバーを提供し、Gutenprint(以前はGimp-Printとして知られていました)は(主に)インクジェットプリンター用の高品質なプリンタードライバー群であり、 Linux用のTurboPrintは幅広いプリンターに対応した高品質なプリンタードライバー群を提供しています。
バックエンドとは、CUPSがプリンターにデータを送信する方法です。CUPSには、パラレル、シリアル、USBポート、cups-pdf [ 38 ] PDF仮想印刷、 IPP、JetDirect(AppSocket)、ラインプリンターデーモン(「LPD」)、SMBプロトコルを介して動作するネットワークバックエンドなど、いくつかのバックエンドが用意されています。
mdnsCUPS 1.4 の新しいバックエンドでは、 Bonjour ( DNS-SD ) ベースのプリンタ検出が提供されています。[ 39 ] CUPS 1.6 では、Avahiを使用した Bonjour プリンタ検出と共有もサポートされています。[ 40 ]
CUPSはSystem VとBerkeleyの印刷コマンドの両方を提供するため、ユーザーはCUPS経由で従来どおりのコマンドを使用して印刷を続けることができます。CUPSは標準IPPポートであるポート631(TCPおよびUDP)を使用し、オプションでinetd、launchd、Solarisサービス管理機能、またはcups-lpdヘルパープログラムを使用してLPD印刷をサポートするxinetdによってポート515も使用します。CUPSをインストールすると、lpSystem V印刷システムコマンドとlprBerkeley印刷システムコマンドが互換プログラムとしてインストールされます。これにより、CUPSへの標準インターフェースが実現し、これらの印刷システムに依存する既存のアプリケーションとの互換性が最大限に高まります。
CUPSの設定を支援するツールはいくつか存在する。


CUPSはすべてのプラットフォームで、ポート631で動作するWebベースの管理インターフェースを備えています。[ 41 ]これは特に、印刷ジョブを監視したり、印刷キューやプリンターをリモートで追加したりする必要がある組織に役立ちます。
CUPS 1.0は、Webブラウザ向けに、クラス、ジョブ、およびプリンタ監視のためのシンプルなインターフェースを提供しました。
CUPS 1.1では、このインターフェースが強化された管理インターフェースに置き換えられ、ユーザーはクラス、ジョブ、プリンタの追加、変更、削除、設定、制御を行うことができるようになりました。
CUPS 1.2以降では、読みやすさとデザインが向上し、プリンターの自動検出に対応し、システムログや詳細設定へのアクセス性が向上した、刷新されたWebインターフェースが提供されます。

GNOME 3 以降、 GNOMEではCUPS 印刷はGNOME Core Applicationsの一部である設定アプリケーションで処理されるようになりました。GUI では、CUPS プリンタを追加したり、CUPS プリンタとキューを管理したりできます。[ 42 ] GNOME 3 より前は、これらのタスクを実行するためにGNOME印刷設定 (以前は CUPS マネージャと呼ばれていました) が使用されていました。[ 43 ]
GNOMEのウィジェットツールキットであるGTK+は、2006年にリリースされたバージョン2.10で、CUPSに基づいた統合印刷サポートを組み込んだ。

KDE用の KDEPrint フレームワークには、CUPS のフロントエンドとして機能し、クラス、印刷キュー、印刷ジョブの管理を可能にするさまざまなGUIツールが含まれています。また、新しいプリンタの追加を支援するプリンタ ウィザードなどの機能も含まれています。[ 44 ] KDEPrint は KDE 2.2 で初めて登場しました。
KDEPrintは複数の異なる印刷プラットフォームをサポートしており、CUPSはその中でも最もサポートが充実しているものの1つです。これはKDEの以前の印刷サポートであるqtcupsに取って代わり、KDEのこのモジュールとの下位互換性があります。2009年現在kprinterはダイアログボックス形式のプログラムで、印刷ジョブを印刷デバイスに送信する主要なツールとして機能します。コマンドラインからも起動できます。KDEPrintには、CUPSにジョブを渡す前にジョブを事前にフィルタリングしたり、 PDFへのファイル変換など、ジョブを単独で処理したりするシステムが含まれています。これらのフィルタは、Desktop/ XMLファイルで定義されています。
KDEPrintの主な構成要素は以下のとおりです。
Mac OS X 10.5では、プリンタの設定はシステム環境設定の「プリントとファクス」パネル、およびプリンタ設定後にプリントキューを表示して追加設定を行うことができるプリンタプロキシアプリケーションで行います。以前のバージョンのMac OS Xにはプリンタ設定ユーティリティも含まれており、以前のバージョンの「プリントとファクス」環境設定パネルにはなかった設定オプションを提供していました。
PrinterSetupシステムはCUPSキューを管理できます。このシステムは、各印刷キューを記述するテキストファイルを割り当てる方式を採用しています。これらの「PrinterSetupFiles」は、「PrinterSetupLists」と呼ばれる他のテキストファイルに追加できます。これにより、プリンターを論理的にグループ化できます。2009年現在PrinterSetupプロジェクトはまだ初期段階にある。[ 45 ]

Red Hat Linux 9以降、Red HatはCUPSをベースとした統合プリントマネージャーをGNOMEに統合しました。これにより、 Microsoft Windowsと同様のユーザーインターフェースを介してプリンターを追加できるようになりました。新しいプリンターは、プリンター追加ウィザードを使用して追加でき、インストール済みのプリンター一覧が表示されるウィンドウで既定のプリンタープロパティを変更することもできます。また、プリントマネージャーを使用して印刷ジョブを開始および停止したり、プリンターアイコンを右クリックしたときに表示されるコンテキストメニューを使用してプリンターを一時停止したりすることもできました。
エリック・レイモンドはこのシステムを「無知の贅沢」という記事で批判した。レイモンドはFedora Core 1のプリントマネージャを使ってCUPSをインストールしようとしたが、直感的ではないと感じた。彼はインターフェース設計者がユーザーの視点を考慮せずに設計したことを批判した。ユーザーがローカルコンピュータ上にキューを作成するが、実際にはこれらのキューはCUPSサーバー上に作成されるため、プリンタキューの概念が分かりにくいと感じた。
彼はまた、ネットワーク CUPS (IPP)、ネットワーク Unix ( LPD )、ネットワーク Windows ( SMB )、ネットワーク Novell ( NCP )、ネットワークJetDirectなど、キュータイプのオプションが多数あることにも戸惑いを覚えた。ヘルプ ファイルは全く役に立たず、ユーザーのニーズにはほとんど関係がないと感じた。レイモンドは CUPS を一般的なトピックとして用い、Linux デスクトップのユーザー インターフェイス デザインは再考とより慎重な設計が必要であることを示した。彼は次のように述べている。[ 46 ]
ここでの根本的な問題は、設定ウィザードが承認された手順(標準化されたクリック可能なボタンを備えたGUI、ブラウザにポップアップ表示されるヘルプなど)をすべて実行しているにもかかわらず、それらが本来達成すべき中心的な属性である「発見性」を備えていないことです。つまり、インターフェース上のあらゆる箇所に、次に何をすべきかを学習できるようなプロンプトとアクションが付随しているという特性です。あなたのプロジェクトには、この特性が備わっていますか?
CUPS のオリジナル開発者であるEasy Software Products はGUI を作成し、多くのプリンタのサポートを提供し、PostScript RIPを実装しました。ESP Print Pro は Windows、UNIX、Linux で動作しましたが、現在は入手できず、この製品のサポートは 2007 年 12 月 31 日に終了しました。[ 47 ]