ITエンジニアによるITエンジニアのためのブログ

Linuxの印刷システム、プロトコルの違いとドライバーの役割

Linuxユーザーであれば、プリンターを追加する際に様々な接続プロトコルからどれを選択すればよいか迷ったり、どのプリンタードライバーを使えば良いのかわからなくなったりした経験があるのではないでしょうか。

本記事では、Linuxの印刷システムであるCUPSの概要と、ドライバーの役割、プリンター追加の際の印刷プロトコルの違いを解説します。また、近年標準となりつつあるドライバーレス方式や、従来のPPD形式からの移行が進む新しいドライバーの仕組みについても紹介します。

目次

  1. Linuxの印刷システムCUPSの概要
  2. CLIからのCUPS操作
  3. CUPSにおけるドライバーの役割
    • 印刷ジョブの流れ
    • ドライバーの追加方法
  4. ドライバーレス印刷
  5. プリンターの追加方法とプロトコル
    • DNS-SD
    • USB
    • IPP
    • LPD/LPR
  6. トラブルシューティング
  7. 【追記】CUPS 3.xとPPDの廃止
  8. まとめ

Linuxの印刷システムCUPSの概要

UNIXにはCUPS (Common Unix Printing Systemの略)、BSD系のlpr、System-V系のlpという3種類の印刷システムがありますが、Linuxのほとんどのディストリビューションはこの中で最も新しいCUPSを採用しています(CUPSはmacOSでも採用されています)。

以下のコマンドで「scheduler is running」と表示されれば、そのPCでCUPSが稼働しています。

lpstat -r

CUPSは、1) スケジューラー/スプーラー、2) フィルター、3) バックエンドの3つの要素で構成されており、それぞれの要素がモジュラー形式になっているため、様々な機能の追加が容易になっています(例えば新しいフィルターやバックエンドを追加するなど)。

CUPSでの印刷処理の大まかな流れは以下の通りです。

  1. アプリケーションがIPP(Internet Printing Protocol)経由でCUPSに印刷リクエストを送信する。CUPSは受け取ったリクエストを印刷ジョブとしてスプーラー(印刷キュー)に一時保存し印刷スケジュールを組む。
  2. CUPSが様々なフィルターを順番に使い、印刷ジョブを個別プリンターが処理できる形式(PostScript、ビットマップなど)に変換する。
  3. CUPSバックエンドがそれぞれのプリンターに適切な接続方式(IPP、LPR/LPD、USBなど)で印刷ジョブをプリンターに送信する。
  4. プリンターが受け取った印刷ジョブを内部処理(例えばPostScriptをビットマップ変換するなど)して紙に印刷する。

また、CUPSスケジューラーはウェブインターフェースも提供しており、ブラウザーからでもプリンターや印刷ジョブの管理ができるようになっています。(IPP標準ポートである631でアクセス。例:https://engineerjutsu.com:631

CUPSウェブインターフェース

CLIからのCUPS操作

CUPSはプリンター設定画面やウェブインタフェースに加え、CLIからの操作も可能です。代表的なコマンドは以下の通りです。

lpr / lp: ファイルもしくは標準入力から印刷ジョブを送信。

lpr your_doc.pdf
lp your_doc.pdf

lpq: 印刷キューのステータスを表示します。

lpq
# 出力例
プリンター名 は準備ができており印刷しています
ランク  所有者  ジョブ  ファイル                        合計サイズ
active  username   187     your_doc.pdf 235520 バイト

lprm: 印刷ジョブをキャンセルします。

lprm 187

lpadmin: CUPSプリンターやキュー設定用のコマンドです。

# プリンター追加
lpadmin -p printername ...

lpstat: プリンター、クラス、ジョブについてのステータス表示

lpstat -t

lpoptions: 印刷設定を表示

lpoptions -l

CUPSにおけるドライバーの役割

CUPSにおけるドライバーの役割は、従来の印刷システムとは異なり、主に「フィルター」と「PPDファイル」という二つの要素に分担され、印刷ジョブをプリンターが理解できる形式に変換することです。

1. フィルター(Filters)

フィルターは、前述の通り印刷ジョブのデータを段階的に変換していくプログラムです。

  • 役割: アプリケーションから送られてきたデータ(PostScript、PDF、画像ファイルなど)を読み取り、最終的にプリンター固有のページ記述言語(Page Description Language。例:PCL、PostScript、または専用のラスタ形式)に変換します。
  • 処理の流れ: CUPSは、入力されたファイル形式に基づいて、適切なフィルターをチェーン状に呼び出します。 例えば、PDFをPostScriptに変換するフィルター、PostScriptをCUPS独自のCUPS Raster形式に変換するフィルターなどが順に実行されます。 最後に、Raster Driver(ラスタドライバー)と呼ばれるフィルターが、汎用的なCUPS Raster形式を特定のプリンターモデルが要求する最終的なデータ形式に変換し、バックエンドに渡します。

2. PPDファイル (PostScript Printer Description file)

PPDファイルは、特定のプリンターの機能とオプションを記述したテキストファイルです。

  • 機能記述: プリンターの解像度、使用できる用紙サイズ、給紙トレイの種類、両面印刷やステープラーなどのオプション機能をCUPSに伝えます。
  • 設定適用: ユーザーが選択した印刷オプション(例: 用紙サイズA4、両面印刷、高品質)に基づいて、フィルターシステムが適切にデータを処理するための制御情報を提供します。

PPDは元々AdobeのPostScriptプリンター向けに考案されましたが、CUPSではPostScriptプリンターでない場合でも、その構造を利用してプリンターの機能記述に広く使われています。 プリンター追加画面でドライバーをファイルシステムから手動で選択する際は、PPDファイルを選択します。

印刷ジョブの流れ

CUPS環境における印刷ジョブの流れは以下のようになり、ドライバーが重要な役割を担っています。

  1. ジョブの送信: ユーザーがPCで印刷を指示すると、アプリケーションが印刷ジョブ(通常はPDFまたはPostScript)をCUPSサーバーに送信します。
  2. PPDの参照: CUPSは、対象プリンターに設定されているPPDファイルを参照し、プリンターの機能やユーザーが選択した設定を確認します。
  3. フィルター処理: CUPSスケジューラーは、PPDの情報と入力データ形式に基づき、一連のフィルター(ドライバー機能)を実行します。このプロセスでデータが段階的に変換されます。
  4. 最終変換: 最後に、ラスタドライバーフィルターがデータをプリンター固有の最終形式(PCLやラスタデータ)に変換します。
  5. バックエンドへの転送: 変換された最終データは、バックエンド(ローカルポート、LPR、またはIPPプロトコルなど)を通じて物理的なプリンターに送信されます。

要するに、従来のCUPSのプリンタードライバーは「PPDファイル」でプリンターの能力を定義し、「フィルター」でその能力を実現するためのデータ変換処理を行っています。

ドライバーの追加方法

まず、各プリンターメーカーのウェブサイトからLinux用ドライバー(deb, rpmパッケージ、PPDファイルなど)をダウンロードします。 Debian/Ubuntuの場合、パッケージは以下のコマンドでインストールできます。

# Debian/Ubuntuの場合
sudo dpkg -i --force-all drivername.deb

インストールの成功とパッケージ名を確認します。

dpkg -l | grep Brother

インストールされたファイル、特にPPDファイル(.ppd)の場所を確認します。

dpkg -L package_name | grep ppd

ドライバーレス印刷

近年では、個別のプリンタードライバーをインストールしなくても印刷が可能なドライバーレスと呼ばれる方式が普及しています。この方式に対応しているプリンターでは、Linuxにプリインストールされている汎用ドライバーを使って印刷が可能です。

ドライバーレスには以下の3種類の方式があります。

  1. AirPrint: iOS、iPad、macOSからドライバーレス印刷するためにAppleが開発した方式です。サポートしているページ記述言語はApple Raster/URF、JPEG、 PDFです。
  2. Mopria: AndroidやWindowsデバイスからドライバーレス印刷するための方式です。サポートしているページ記述言語はPCLm, PWG Raster、PDFです。
  3. IPP Everywhere: ISTOのPrinter Working Groupによって開発された、オープン・スタンダードのドライバーレス方式です。サポートしているページ記述言語はPWG Raster、JPEG、PDFです。

メーカーサイトの製品ページでいずれかの表示があればLinuxでのドライバーレス印刷が可能です。また、OpenPritingのウェブサイトでもドライバーレス印刷をサポートしている製品を確認できます。

いずれの方式でも、DNS-SD、IPP、ラスタ形式ページ記述言語が使われ、以下の流れで印刷が行われます。

  1. プリンターがDNS-SDを使って自身の存在と主要機能をネットワーク上に配信します。
  2. クライアント(PCやスマートフォン)がDNS-SDでプリンターを検出します。
  3. クライアントがIPPリクエストを使って、プリンターの全ての機能(印刷用紙のサイズ、マージンなど)を取得します。
  4. CUPSがそのプリンター用のPPDファイルと印刷キューを生成します。
  5. ユーザーが印刷ジョブを作成すると、CUPSフィルターによっていずれかのラスタ形式のページ記述言語に変換され、IPP経由でプリンターに送信されます。

プリンターの追加方法とプロトコル

プリンター追加は、Linuxのプリンター設定画面、CUPSのウェブ管理画面、もしくはコマンドラインで行います。いずれの方法でも以下の2つの情報が必要です。

  • プリンターURI(USB、ネットワークURI)
  • ドライバー(PPDファイル または ドライバーレス設定)

プリンターURIは、USBのような直接接続と、ネットワーク接続する方法の2種類に分類されます。直接接続にはシリアルポート、パラレルポート、FireWireなども含まれますが、現在はほとんどのプリンターがUSB方式なので、USB以外は割愛します。

プリンターURIは、USBのような直接接続と、ネットワーク接続する方法の2種類に分類されます。直接接続にはシリアルポート、パラレルポート、FireWireなども含まれますが、現在はほとんどのプリンターがUSB方式なので、USB以外は割愛します。

Ubuntuのプリンター追加メニュー(設定 -> プリンター)では、「URIを入力する」でプロトコル含め全て手動で入力することもできますが、プロトコルを選択するとURIの最初のプロトコル名を自動入力してくれます。

製造元(メーカー)を選択

ドライバーを選択

プリンター名、説明、場所を入力します(デフォルトで入力される値のままでも大丈夫です)。

次の項目では、プリンター追加の際に選択する代表的なプロトコルについて解説します。

DNS-SD

DNS-SD (DNSサービスディスカバリー)及びmDNS (マルチキャストDNS)は、プリンターなどのネットワーク上のサービスを自動検出するためのプロトコルです。LinuxではAvahi、macOSではBonjourがこれらのプロトコルを実装したサービスとなります。

URIを自動検出してくれるため、手動でホスト名やIPアドレスを追加する必要はありません。DNS-SDは「検出」の仕組みであり、実際の印刷データの転送(接続)にはIPPやLPDが使われます。 接続方式の選択画面が表示される場合、最新のプリンターであればIPP、レガシープリンターでIPPをサポートしていない場合のみLPDを選択すれば良いでしょう。

DNS-SDで検出されたプリンターの接続方式選択画面

DNS-SDで検出されたプリンターURIは、dnssd://[DNSラベル].local/ のようにDNS-SDプロトコルで記載され、.localドメインを持ちます。DNSラベルは自動設定されますが、プリンター名や接続方式が記載されることが多いです(例:dnssd://[メーカー名][型番]._ipp._tcp.local/)。

なお、プリンターがドライバーレス印刷をサポートしていれば、Driverless IPPが接続方式で表示されることがあります。この場合、ドライバーの手動選択は不要になります。

USB

USBでPCとプリンターを直接接続する場合は、大抵はOSが自動検知してくれるためURIの手動入力は不要です。デバイスURIは “usb://製造元/” で始まる文字列になります。

Internet Printing Protocol(IPP)

Internet Printing Protocol (インターネット印刷プロトコル、IPP)は、インターネット上でプリンターやプリントサーバーと通信するためのプロトコルでHTTPを拡張する形で仕様が定められています。標準ポートは631です。

IPPでプリンターを追加する場合、手動で ipp://ip_address もしくは ipp://hostname のように指定します。 例:ipp://192.168.0.1

CUPSウェブインターフェースでのIPPの選択

プリンターのIPアドレスは、通常はプリンターのメニューボタンでプリンターディスプレイに表示することができます。 ドライバーは手動で選択する必要がありますので、前述の通り各プリンターメーカーのウェブサイトからダウンロード・インストールしておきます(またはドライバーレス対応であれば、IPP Everywhere用の汎用ドライバーを選択します)。

LPD/LPR

Line Printer Daemon Protocol (LPD)、及びLine Printer Remote Protocol(LPR)は、IPP以前に使われていたプリントジョブをネットワーク上で送信するためのプロトコルです。IPPをサポートしていないレガシープリンターを使用する際に選択します。


LPD/LPRを使ってプリンターを追加するには、ホスト名とキュー名を指定する必要があります。ホスト名にはプリンターのIPアドレスもしくはホスト名を入力します。キュー名はプリンター製品によって異なりますが lpprint などが一般的です。 ※メーカーによっては PASSTHRU など特定のキュー名を指定しないと動作しない場合があるため、マニュアルの確認が必要です。

LPD/LPRを使った時のプリンターURIは、lpd://hostname/queue_name のようになります。(例:lpd://192.168.0.2/lp

ドライバーは自動検出機能にまかせるとGutenprintなどの汎用ドライバーが選択されることが多いですが、ローカルドライバーを選択してメーカー配布の専用ドライバーを選択した方が確実です。

トラブルシューティング

以下では代表的な印刷トラブルと、その解決策を記載します。

プリンターと通信できない

プリンターがネットワークに接続されているか、プリンター自体のメニューを使って液晶パネルで確認してみましょう。 また、プリンターがネットワークに接続されていても、クライアントとプリンターが同じネットワークに接続していないと、印刷ジョブを送信することはできません。それぞれのネットワーク設定を確認し、pingコマンドを使って、プリンターと通信できるか確認します。

ping printer_ip_address

PDFをPCでは表示できるが、印刷すると文字が空白になる

PDFドキュメントにフォントが埋め込まれておらず、PCでは指定フォントがなくても代替フォントを使って表示できますが、プリンターはフォント情報を正しく理解できていない可能性があります。

このような場合、印刷ジョブをラスタ形式(画像データ)に変換してからプリンターに送信すると、解決することが多いです。 システムダイアログの印刷詳細画面、もしくはアプリケーションの印刷画面などから、「画像として印刷する」、「ラスターデータとして処理する」などのオプションを有効にします。

例:Chromeブラウザーの印刷設定で「画像として印刷する」を有効化。

【追記】CUPS 3.xとPPDの廃止

本記事でCUPSでのドライバーの役割や専用ドライバーのインストール方法を解説しましたが、これは現在の最新バージョンであるCUPS 2.xにおける方法です。

現在開発中ではありますが、CUPS 3.xでは、長年使用されてきたPPD(PostScript Printer Description)ファイルに基づく従来のドライバーモデルは非推奨(廃止予定)となっています。

PPDモデルの課題

従来のドライバーは、PPDファイルと独自のフィルタープログラムで構成され、これらをシステムの特定の場所にインストールする必要がありました。しかし、これはOSのバージョンアップやライブラリの依存関係によって壊れやすく、セキュリティ上の課題もありました。

CUPS 3.xの仕組み

CUPS3.xでは、すべてのプリンターはIPP(ドライバーレス方式)で通信すべきという思想を採用しています。そのため、以下の2通りの仕組みが用意されています。

1. 最新のプリンター(ドライバーレス対応機)の場合

プリンター本体の中に、高度な処理機能(IPPサーバー)が内蔵されています。PC(Linux/CUPS)はプリンターと直接 IPP で会話できるため、間にソフトウェア(後述のPrinter Application)を挟む必要がありません。

2. 古いプリンター(レガシー機)の場合

プリンター本体は IPP を理解できません(USB接続や、古いLPRプロトコルしか話せません)。そこで、PC上で「Printer Application」というソフトを動かします。これが「通訳」となり、OSからの IPP 命令を受け取り、古いプリンターが理解できる言葉に変換して流します。

  • Printer Applicationとは: 新しい方式では、プリンタードライバー自体が独立した小さな「IPPプリントサーバー」として動作します。OSのシステムディレクトリにファイルをばら撒くのではなく、一つのアプリケーションとして動作し、CUPS本体とはIPP(ネットワークプロトコル)で会話します。
  • メリット:
    • 壊れにくい: ドライバーがOSから切り離されるため、OSをアップデートしてもドライバーが動かなくなるリスクが激減します。
    • Snap/Flatpak対応: ドライバーをコンテナ形式(Snapなど)で配布しやすくなり、どのLinuxディストリビューションでも同じドライバーが動作しやすくなります。
    • レガシー機器の救済: IPPに対応していない古いプリンターも、Printer Applicationが仲介することで、OSからは「最新のIPP対応プリンター」として扱えるようになります。

現在では、「PostScript Printer Application」や「Ghostscript Printer Application」などが提供されており、古いPPDベースのドライバーをこの新しい形式に変換して利用することも可能になっています。

プリンターの種類特徴Printer Application接続イメージ
最新プリンター
(AirPrint/Mopria/IPP Everywhere対応)
本体がIPPを理解できる不要PC (CUPS) <==IPP==> プリンター
古いプリンター
(専用ドライバーが必要だった機種)
本体はIPPを理解できない必要PC (CUPS) <==IPP==> [Printer App] <==USB/LPR==> プリンター

まとめ

Linuxにおける印刷では、CUPSが様々なページ記述言語や接続プロトコルをサポートしており、様々なメーカーのプリンターを使うことができます。

特に2025年現在では、ドライバーレス印刷(IPP Everywhere)の普及や、新しいPrinter Application形式への移行により、Linuxでの印刷設定はかつてないほど簡単かつ堅牢になっています。「Linuxだから印刷できない」という問題は、過去のものとなりつつあります。