Chapter 22. CUPS印刷環境のサポート
Prev | Part III. 詳細な設定方法 | Next

## Chapter 22. CUPS印刷環境のサポート

### Kurt Pfeifle

Danka Deutschland GmbH

`<kpfeifle@danka.de>`

### Ciprian Vizitiu

drawings

`<CVizitiu@gbif.org>`

### Jelmer R. Vernooij

drawings
The Samba Team

`<jelmer@samba.org>`

(27 Jan 2004)

## 概要

### 機能と利便性

共通UNIX印刷システム(CUPS)は 現在非常に一般的になってきている。すべての主要なLinuxディストリビューションは 現在既定値の印刷システムとしてこれと導入している。ただ、残念ながら、これは まだ非常に取っつきづらいツールである。ほとんどの場合、これはちゃんと動く。 多くの人は、これが動いている間は、その中身を覗きたくなく、それを “ブラックボックス”として扱う傾向がある。しかし、ひとたび 小さな問題が発生すると、どこからデバッグしていいかということを見つける 困難が生じる。CUPSに関連したより多量の情報もある、 旧式の印刷サポートも参照のこと。

CUPSは固有で強力な機能を持っている。その基本機能は容易に把握でき、 かつそれらは新しい。これは他のものと違い、より現代的な印刷システムであり、 この新しいシステムで印刷することに関する以前の知識を適用しないことが最も良い。 むしろ、最初からCUPSを理解することをすべきである。この文書はCUPSの完全な理解 を手助けする。まず基本的な点から最初に始めよう。

### Overview

CUPSは印刷スプールシステムというもの以上である。これは、新しいインターネット印刷 プロトコル(IPP)に従う完全な印刷管理システムである。IPPは産業製品であり、 ネットワーク印刷に関するInternet Engineering Task Force (IETF)標準である。 この機能の多くはWebブラウザ(CUPS印刷サーバにアクセスするプラットフォーム非依存の アクセスを提供する)経由でリモート(またはローカル)から管理することが出来る。さらに 追加で、伝統的なコマンド行といくつかのより新しいGUIインタフェースを持っている (GUIインタフェースはサードパーティによって開発され、たとえば、KDEのoverwhelming KDEPrintなどである)。

CUPSは、smartプリンタ(すなわち、CUPSがプリンタに対して要求 された時にファイル形式の変換を行う)と同じように、rawプリンタ すなわち、印刷ファイル形式を変換しない)の作成が出来る。多くの手段で、Microsoft Windows 印刷関しシステム同じような機能がCUPSにはある。もちろん、CUPSの推進者ならば、 CUPSの方がもっと良いと言うだろう!多くの場合、Samba経由でMicrosoft Windows印刷 クライアントとの間でCUPSがインタフェースを取るための設定方法を説明しよう。

## 基本的なCUPSサポート設定

Samba-3.0(2.2.xから使える)でのCUPSを使った印刷環境の、最も基本的な`smb.conf`のセットアップはprinting = cupsとprintcap = cupsという2つのパラメータを必要とする。CUPSはprintcapファイルを必要としない。しかし、`cupsd.conf`設定ファイルは、サードパーティアプリケーション(例えば`Printcap /etc/printcap`と`PrintcapFormat BSD`)に便利なように、どのように、CUPSによって自動的に作成され、管理されるファイルを制御する2つの関連するディレクトリを知っている。旧式のプログラムはしばしばprintcapファイルに含まれているプリンタ名が存在することを要求するので、そうでないと印刷を拒否してしまう。CUPSがprintcapファイルを作成して管理するようにしておくこと。詳細は、`man cupsd.conf`と、CUPSWebサイトにある、CUPSサーバそれ自身が提供する、関連する貴重な文書のようなCUPS関連の文書を参照のこと。

### libcups.soを使ったsmbdとのリンク

SambaはCUPSと特別な関係がある。SambaはCUPSライブラリサポート機能を有効にして コンパイルできる。最も最新のバージョンでは、このサポートを有効にしている。 既定値では、CUPSはsmbdとその他のSambaバイナリにリンクされる。もちろん、 `libcups.so`をSambaにリンクしなくてもCUPSを使う事が できるが、要求されるあるいはサポートされる設定にいくつかの違いがある。

Sambaが`libcups`とリンクされ、コンパイルされた時、 printcap = cupsは、プリンタ一覧の表示、 ジョブの投稿、キューの問い合わせなどにCUPS APIを使う。それ以外は、印刷のために、 これらの操作を、`-oraw`オプションを付加して、System Vの コマンドにマップする。Linuxシステムでは、smbdが、libcupsライブラリにリンク されているかを、`ldd`ユーティリティを使う事で知ることが出来る (`ldd`は他のOSプラットフォーム上には無いかもしれないか、 その機能は別のコマンドによって行われるかもしれない):

    root# ldd `which smbd`libssl.so.0.9.6 => /usr/lib/libssl.so.0.9.6 (0x4002d000)libcrypto.so.0.9.6 => /usr/lib/libcrypto.so.0.9.6 (0x4005a000)libcups.so.2 => /usr/lib/libcups.so.2 (0x40123000)[....]

`libcups.so.2 => /usr/lib/libcups.so.2 (0x40123000)` 行は、このバージョンのSambaがCUPSサポートするようにコンパイルされていることを 示している。もしもこの場合で、printing = cupsが設定されている場合、 他の`smb.conf`中にある、手動で設定した印刷関係のコマンドは無視される。 これは重要な点なので覚えておくこと!

### Tip

何らかの理由で、固有の印刷コマンドを設定するために、 printing = sysvを設定することにより、これを行える ようにする事が必要である。しかし、CUPSとSambaを密に統合する利便性のすべてを 失うことになる。これを行う場合、以下のように、印刷システムコマンドを手動で設定しなければ ならない。 (最も重要: print command; other commands are lppause command, lpresume command, lpq command, lprm command, queuepause command and queue resume command).

### CUPSを使う簡単な`smb.conf`の設定

最も簡単な印刷関連の`smb.conf`ファイル に、基本的なCUPSサポートを有効にする、最も簡単な印刷関連の`smb.conf`設定を 要約する:

Example 22.1. 最も簡単な印刷関連のsmb.confファイル

`[global]`
`load printers = yes`
`printing = cups`
`printcap name = cups`
`[printers]`
`comment = All Printers`
`path = /var/spool/samba`
`browseable = no`
`guest ok = yes`
`writable = no`
`printable = yes`
`printer admin = root, @ntadmins, @smbprintadm`

これはCUPSに対する基本的な印刷設定に必要なもののすべてである。Windowsクライアント から投稿されたすべてのグラフィック、PDFとPostscriptファイルは印刷できる。 しかし、ほとんどのWindowsユーザは、GUIアプリケーションを開かないで、印刷する ファイルの種類を送る方法を知らない。Windowsクライアントはインストールされた ローカルのプリンタドライバを持つ傾向があり、GUIアプリケーションの印刷ボタンは、 プリンタドライバを開始する。ユーザは滅多にコマンド行からファイルを送らない。 UNIXクライアントとは違い、グラフィック、テキストあるいはPDFファイルを直接 スプーラに送らない。通常、アプリケーションのネイティブな形式と印刷データ ストリームの間でホックされた“printer driver”を使うGUI アプリケーションから排他的に印刷を行う。もしもバックエンドプリンタが Postscriptデバイスでない場合、印刷データストリームは“バイナリ”で、 対象のプリンタのみが対象である。この問題が引き起こすこととそれを防ぐことを 学ぶために、この先を読み続けること。

### より複雑なCUPS `smb.conf`設定

1台のプリンタ用にグローバルなCUPS設定を上書きする例 は、`smb.conf`用の、やや複雑な印刷関連設定である。これはすべてのプリンタに対して 一般的なCUPS印刷サポートを有効にするが、1台だけ設定が異なるプリンタ共有を定義する。

Example 22.2. 1台のプリンタ用にグローバルなCUPS設定を上書きする

`[global]`
`printing = cups`
`printcap name = cups`
`load printers = yes`
`[printers]`
`comment = All Printers`
`path = /var/spool/samba`
`guest ok = yes`
`writable = no`
`printable = yes`
`printer admin = root, @ntadmins, @smbprintadm`
`[special_printer]`
`comment = A special printer with his own settings`
`path = /var/spool/samba-special`
`printing = sysv`
`printcap = lpstat`
`print command = echo "NEW: `date`: printfile %f" >> /tmp/smbprn.log ; echo " `date`: p-%p s-%s f-%f" >> /tmp/smbprn.log ; echo " `date`: j-%j J-%J z-%z c-%c" >> /tmp/smbprn.log ; rm %f`
`guest ok = no`
`writable = no`
`printable = yes`
`printer admin = kurt`
`hosts deny = 0.0.0.0`
`hosts allow = turbo_xp, 10.160.50.23, 10.160.51.60`

この特別な共有は、テスト目的専用である。これは印刷ジョブをファイルに書かない。 これは、ジョブパラメータをSambaが認識する`/tmp/smbprn.log` ファイルに記録し、ジョブファイルを削除する。さらに、この共有の printer adminは“kurt”で (“@ntadmins”グループではなくて)、ゲストアクセスは許可されず、共有は ネットワークコンピュータに公開されず(そのため、これが共有であることを知っておく 必要がある)、3つのホストのみからアクセスできる。その共有に対して、CUPSが起動し、 印刷ジョブ上で通信をすることを防ぐために、 printing = sysvと printcap = lpstatを設定する必要がある。

## 高度な設定

すべての設定オプションを確認する前に、いくつかの点について明確にする。 ネットワーク印刷は、きちんと計画されて、正しくセットアップされている 必要がある。このことは頻繁には発生しない。旧来のシステムや 小さな業務用LAN環境では、しばしばデザインと良い保守が存在していない。

### 集中スプール対“ピアツーピア”印刷

多くの小規模オフィスや家庭用ネットワークでは、計画がひどい、より大きな環境と 同じように、各クライアントがネットワークプリンタへ直接アクセス出来るように なっている。これは一般的には悪いアイデアである。他のクライアントのジョブが 印刷しているときに、あるクライアントのアクセスを頻繁にブロックしてしまう。 ジョブが終了するのを待っている間、最初のクライアントのアプリケーションは フリーズしてしまうかもしれない。同様に、数多くのジョブが印刷しているとき、 それぞれが異なったページをまぜこぜにしてしまうという苦情もしばしば聞く。 よりよいコンセプトは、プリントサーバを使うことである。これは、すべてのジョブを 集中したシステムに一本化し、即時に反応し、複数の並列したクライアントから ジョブを受け取り、正しい順序でプリンタに転送する。

### 直接印刷機能:Windowsクライアント上のベンダドライバ

ほとんどの現代的に設定されたUNIX印刷サーバは、本当に単純なセットアップを意味する、 SambaのWindowsクライアントのために振る舞う。それらの唯一の業務は、Sambaによって すべてのジョブが扱われる“直接”スプーリングを管理することである。 この試みは、Windowsクライアントが、印刷デバイスに送られる準備が出来た印刷ジョブ ファイルを準備することが期待されるということである。この場合、ネイティブな (ベンダが供給した)Windowsプリンタドライバは、各、およびすべてのクライアントで、 対象デバイスのものをインストールする必要がある。

同様に現代的な、簡単な方法で、CUPS、SambaとWindowsクライアントを設定することは 可能である。CUPSプリンタが直接印刷モード状態で設定されているならば、完全に 印刷ジョブ(ファイル)を描画することは、Sambaクライアントの責任である。ファイルは プリンタに直接配信するのに適した形式で送られる必要がある。クライアントはこれを 行うために、ベンダが提供したドライバを動作させる必要がある。この場合、CUPSは 何ら印刷ファイル形式変換を行わない。

可能な、最も簡単な印刷設定は、直接印刷(raw print-through)である。これは、 Windowsクライアントに物理的に結合されているようにプリンタをインストールする 事によって行える。次に、それをrawネットワーク印刷キューにリダイレクトする。 この手続きは、以下の手順によって行えるだろう:

Procedure 22.1. 直接CUPS印刷サポートのための設定手順

1. `/etc/cups/mime.types`の、ファイルの最後あたりにある 下記の行のコメントを外す:

       #application/octet-...

2. `/etc/cups/mime.convs`に対しても同様に行う。

3. Webインタフェースを使ってrawプリンタを追加する。ブラウザで `http://localhost:631`をクリックする。 Administrationに入り、プロンプトに従ってプリンタを追加する。 ドライバをこれにインストールしてはならない。Rawを選択する。 `Raw Queue`というキュー名を選択する。

4. `smb.conf`ファイル中の`[printers]`セクションに use client driver = Yesを追加し、 `[global]`セクション中に、 printing = CUPSと printcap = CUPSを追加する。

5. ローカルプリンタのようにプリンタをインストールし、結果、印刷先が `LPT1:`となる。

6. Detailタブ下の設定を編集し、上記で設定したrawプリンタ キューを指し示す`local port`を作成する。例: `\\server\raw_q`。ここで、`raw_q` という名前はCUPS環境中で印刷キューに割り当てた名前である。

### Windowsクライアントドライバのインストール

Windowsクライアント上のプリンタドライバは2つの機能的に異なった方法でインストール できる:

- 手動で各クライアント上にドライバを1つずつインストールする。 これは旧式のLanMan形式印刷環境を必要とし、 `\\sambaserver\printershare`タイプの接続を使う。

- プリントサーバ(Samba)上でドライバ(後でダウンロードするための)の準備と配信を 行う。これは、プリンタに最初にアクセスするとき、半自動的にドライバを入手して インストールする“ポイントアンドプリント”をクライアントが使う ことが出来るようになる。この方法を使うと、NT/200x/XPクライアントは、 SPOOLSS/MS-RPCタイプの印刷呼び出しを使う。

二番目の方法は、管理コストの削減と、偶然異なったバージョンのドライバが使われる ことを防ぐのに、最初のものを使うよりも推奨される。

### application/octet-streamのための“raw”印刷を明示的に有効にする

もしも最初のオプション(ドライバはクライアントサイド上でインストールされる)を使う 場合、注意すべき設定が1つある:CUPSに対して、手の込んだ(バイナリ)ファイル形式 である“raw”印刷を許可するように設定する。rawモード印刷を動かす ための、正しい設定する必要があるCUPSファイルは以下の通り:

- `/etc/cups/mime.types`

- `/etc/cups/mime.convs`

両者はRAMモード操作を許可するためにコメントアウトしなければならないエントリ (それぞれのファイルの最後の部分)を含む。`/etc/cups/mime.types` 中では下記の行が存在するようにする:

    application/octet-stream

`/etc/cups/mime.convs`では、この行が存在するようにする:

    application/octet-stream   application/vnd.cups-raw   0   -

もしも、2つのファイルが、Windowsクライアントからの印刷に対して正しく設定されて いない場合、恐ろしい`Unable to convert file 0` というメッセージが、が、CUPSの`error_log`ファイル中に現れる だろう。

### Note

`mime.convs`と`mime.types`ファイルを “raw”印刷を行うことだけを 許可するように編集する。

背景. CUPSは、伝統的な印刷システムが既定値では印刷デバイスに手の込んだ(おそらく バイナリ)のデータを、ユーザに送ることを認めていないと比べて、より セキュリティに気づいている印刷システムである。これは、プリンタに対して、 少なくとも大量の紙とインクを無駄にすることとなる、 “サービス不能”攻撃を引き起こす不正な使い方を簡単に行える。 “不明な”データはCUPSによって、 `MIME type: application/octet-stream`とタグ付けられ、 プリンタに送ることを許可されない。既定値では、他の(既知の)MIMEタイプである “raw”のみを送ることが出来る。“raw”を送ることは、 CUPSがそれらを変換せず、何もさわらないでプリンタに渡すことを意味する。

これが、ベンダドライバをローカルにインストールしたWindowsクライアントによって 準備された“raw”ファイルをCUPS/Sambaの協調印刷で行うときに知っておく 必要があることのすべてである。もしもより詳細なCUPS/Samba印刷についての背景 情報について興味がないならば、この章の残りの部分を読み飛ばせばよいだろう。

### ドライバアップロード手法

この節では、プリンタドライバをアップロードする、3つのなじみやすい方法に、 さらに新しいもの1つについて説明する。

もしも、MS-RPCタイプの印刷を使いたいならば、最初にSambaサーバ上に (`[print$]`共有)ドライバをアップロードしなければならない。 Sambaホスト上からプリンタドライバを配信する方法(結果、Windowsクライアントは “ポイントアンドプリント”経由でダウンロードしそれを利用できる) についての議論は、この資料の 旧式の印刷 の章を参照のこと。 以下は、Sambaサーバ上にクライアントドライバを準備するための3つの方法への 説明又は参照である:

- GUIである“Add Printer Wizard”を使う Windowsクライアントからのアップロード方法。

- コマンドラインの“smbclient/rpcclient”を使う UNIXワークステーションからのアップロード方法。

- Imprintsツールセットを使う方法。

これらの3つの方法は、CUPSに対して同じように適用される。 `cupsaddsmb`ユーティリティは最新で、CUPSを使っている場合、 WindowsドライバをSamba中に起き、提供するより便利な方法である。

`cupsaddsmb`は、この章の後の方でより詳細に説明される。しかし、 まず初めにCUPSフィルタリングシステムを説明し、WindowsとUNIXの印刷アーキテクチャの 違いを比較する。

## Postscriptドライバダウンロードを使う高度に賢い印刷

“dump”プリントサーバをセットアップする方法は分かっているが、それは すなわち、プリントジョブを“raw”でスプールするサーバは、印刷データを 変更しないということである。

よりか指向違法方でCUPSをセットアップする必要があるかもしれない。その理由は いろいろとある:

- もしかしたら、あなたの上司は月次の印刷統計報告を希望しているだろう。 すなわち、どのプリンタがどのくらいページを印刷したか?、印刷における平均的な 時間ピークはどのくらいか?、どの部署がどのくらい印刷したか?

- もしかしたらプリントquotaシステムを設定したかと聞かれるだろう: ユーザが、一定期間内での制限より超えたジョブを印刷出来ないという。

- もしかしたら以前のネットワーク印刷の設定はひどい状態で、 一から再構成しなければならないだろう。

- もしかしたらNT“kernelモード”で動作するあまりデバッグ されていないプリンタドライバに起因する“ブルースクリーン”を、とても たくさん体験しているだろう?

これらのゴールはraw印刷サーバによっては成し遂げることが出来ない。それらの要求に auサーバを構築するためには、最初にどのようにCUPSが動作するかと、どのように それらの機能を有効にするかを学ぶ必要がある。

以下では、WindowsとUNIX印刷環境における、いくつかの基本的なコンセプトの 比較をまず行い、次に、CUPSフィルタリングシステムについて、どのように動作するか、 どのように微調整できるかの説明を行う。

### Windows上でのGDI、UNIX上でのPostScript

ネットワーク印刷は最も複雑でエラーが発生しがちであり、ユーザや管理者が 遭遇しがちである日々の作業の1つである。これはすべてのOSプラットフォーム上で 真実であり、そうなる理由がある。

プリンタに任意のファイルフォーマットを送り込み、それが印刷されることを期待する ことはできない。ファイルフォーマット変換を行う必要がある。問題は、すべての メーカとプリンタタイプに共通の、共通標準印刷ファイルフォーマットがないという ことである。Postscript(Adobeの商標)とその拡張であるPCL(HPの商標)はページ記述言語 (PDL)として使われていることにより、ほぼ公式な“標準”として開発されて いる。しかし、多くのメーカは引き続き“固有のものを使っている” (それらの理由は、プリンタ内蔵のPostscriptインタプリタの、受け入れられないような ライセンス費用などである)。

### Windowsドライバ、GDIとEMF

WindowsOSでは、フォーマット変換ジョブはプリンタドライバによって行われる。 Microsoft Windows OSプラットフォーム上ではすべてのアプリケーションプログラマは、 それらの基盤となるOSそれ自身の一部分、あるいは一区画として、自由に使える 組み込みのAPI、グラフィカルデバイスインタフェース(GDI)を使える。このGDIコアは 絵、フォントと文書を画面上に描画するのと同様に 紙の上に(印刷)する、すべてのWindowsプログラムにある1つの 共通基盤として使える。そのため、プリンタドライバ開発者はよく定義されたGDI出力を 固有のドライバ入力として標準化できる。WYSIWYG(What You See Is What You Get)の 実現は、スクリーン上のグラフィックプリミティブが紙上の描画オブジェクトと同じ ようで、同じソースから来るために、相対的に容易である。このソース、すなわちGDIは、 しばしば拡張メタファイル(EMF)と呼ばれるファイルフォーマットを生成する。EMFは プリンタドライバによって処理され、プリンタ固有のファイルフォーマットに変換される。

### Note

Microsoft Windows中のGDI基盤に対して、Appleは紙と画面出力を、その(BSDUNIXベース なのだがご存じだろうか?)Mac OS XとDarwinオペレーティングシステムという 同じ基盤上に置くことを選んだ。Appleのコアグラフィックエンジン は、すべての表示作業にPDF派生のものを使う。

ローカルプリンタに対するWindowsの印刷中の例は、 ローカルWindows印刷を図示している。

Figure 22.1. ローカルプリンタに対するWindowsの印刷

### UNIX印刷ファイル変換とGUIの基礎

UNIXとLinuxでは、OSカーネルかX(画面表示)サーバ中に、構築された、類似のレイヤは ない。すべてのアプリケーションはそれ自身でその印刷出力を作成することに責任が ある。幸い、大部分がPostscriptを使い、それを何らかの共通基盤としている。 また、悪いことに、同じ文書を画面上に表示することとどのようにそれを紙に 印刷するかを行う、非常にたくさんの(そして何ら共通項がない)方法がある。 これは、数10年前にさかのぼってみると、グラフィカルユーザインタフェースのための UNIX 基盤とプロトコルを設計したX.orgの前身は、幾人かがその時点で要求したように、 “紙出力”についての責任を取るのを拒否し、それ自身を “画面表示のみ”に制限した(何年か後、“Xprint” プロジェクトが開発中で、Xのフレームワーク中に、PostscriptとPCLドライバを含む 印刷サポートを構築することを試みたが、まだ完成していない)。この、余り好ましくない 遺産は、使用しているシステムの、種々の“font”ディレクトリ中で、今も 見ることができる。X表示用と印刷用に使うフォントが分かれている。

背景. Postscriptプログラミング言語はAdobeの“開発物”であるが、その仕様は 広範囲に公開されている。その能力は、その強力なグラフィカルオブジェクト (フォント、シェープ、パターン、行、曲線、と点)を記述する能力、その属性 (色、線の幅)とそれらを操作する(拡大縮小、変形、回転、移動)ことによっている。 その公開された仕様により、能力がある誰でも、固有のPostscriptインタプリタ実装を 作成でき、画面あるいは紙状にPostscriptファイルを表示するのに使える。 ほとんどのグラフィック出力デバイスは “ラスタイメージ”か “ピクセル”(ペンプロッタは特筆すべき例外)というコンセプトを基盤と している。もちろん、テキスト形式でPostscriptファイルを見ることもでき、 ラスタライザによって解釈されるに必要な言語命令であるPostscriptコードを読む ことも出来る。ラスタライザは、ビューワプログラムによって画面上で表示されるか、 プリンタによって印刷されるかする、ピクセルイメージを生成する。

### PostScriptとGhostscript

UNIXは紙への印刷と画面上への表示についての共通基盤が欠けている。UNIXの、好ましく ない遺産にもかかわらず、自由に使えるPostscriptプリンタを持っている場合、基本的な 印刷はかなり簡単である。その理由は、それらのデバイスは、ラスタイメージプロセッサ (RIP)と呼ばれる内蔵PostScript言語“インタプリタ”を持っているという (それにより、他のタイプのプリンタよりも値段が高い)ことである。それに向けて PostScriptを送り込むと、印刷したページを出力する。RIPは紙の上で見る事ができる、 ビットマップの絵にPostScript描画コマンドを変換するすべての大変な仕事をこなし、 プリンタによってそれを処理してしまう。これは、Windows上からPostScript印刷を 行うのと何ら違いはない。

### Note

一般的なUNIXプログラムと印刷システムが、PostScriptを使っている間は、主にPPDを 認識していない。PPDは“PostScriptプリンタ記述”ファイルである。これは プリンタがサポートしているすべてのオプションを指定し、制御する事を可能にする。 そのオプションとは、たとえば、両面印刷、ステープル留めと穴空けである。そのため、 WindowsかAppleユーザとは違って、たくさんのサポートされたデバイスとジョブ オプションを、UNIXユーザは長い時間選択できなかった。しかし、今では、CUPSがある。 PostScriptプリンタによる印刷で図示されているように。

Figure 22.2. PostScript Printerによる印刷

しかしながら、それ以外のタイプのプリンタもある。それらはどのようにPostscriptを 印刷するかが分からない。それらは、しばしばメーカ固有のPDLを使う。それらに対して 印刷を行う事の注文はもっと多い。利用しているUNIXアプリケーションはほとんどの 場合、Postscriptを生成し、それらのデバイスはPostscriptを理解しないので、 それに対してデータを送る前に、ホスト上で使用しているプリンタに合わせた印刷 ファイルのフォーマット変換を行う必要がある。

### Ghostscript: 非Postscriptプリンタに対するソフトウェアRIP

ここからGhostscriptの説明を始める。Ghostscriptは、UNIXプラットフォームで 使われている、伝統的な(そしてとても強力な)Postscriptインタプリタである。 これはソフトウェアによるRIPであり、ソフトウェアファイルフォーマットと同様、 非常に広範囲のハードウェアデバイスへの、たくさんのファイル変換を行う能力がある。 Ghostscript技術とドライバは非PostscriptハードウェアでPostscript印刷を実行 できるようにするものである。これについては 非Postscriptプリンタに対するRIPとしてのGhostscript に説明がある。

Figure 22.3. 非Postscriptプリンタに対するRIPとしてのGhostscript

### Tip

使用しているGhostscriptバージョンの内蔵“デバイス”すべてを確認する ために、“gs -h”コマンドを使う。もしも、使用しているGhostscriptの コマンド行に`-sDEVICE=png256`というパラメータを指定した ならば、入力をPNGファイルに変換するように、Ghostscriptに指定する。コマンド行上の “device”の名前指定は、入力をどのように描画するかを正確に Ghostscriptに指示するのに最も重要な単一パラメータである。新しいGhostscriptの バージョンは、現在artofcode LCCにおいて、通常かなり間隔を空けてリリースされる。 通常最初は“AFPL”ライセンスで提供されるが、次のAFPLバージョンが リリースされると、すぐにGNU GPLライセンスで再リリースされる。GNU Ghostscript はおそらくほとんどのSambaシステム上にインストールされているバージョンである。 しかし、いくつかの違いがある。 そのため、ESP Ghostscriptは、たくさんのバグ修正、追加のデバイスと改善がある、 GNU Ghostscriptの拡張として開発されている。これは、CUPS, Gutenprint, MandrakeSoft, SuSE, Red Hatと Debianからの開発者によって一緒に保守されている。それには “cups”デバイス(CUPSから非PSプリンタに印刷する基本部分)を含む。

### PostScriptプリンタ定義(PPD)の仕様

Postscriptの本質がデバイス非依存の方式でページレイアウトを表現するための PDLである間は、実世界での印刷上部は常時デバイス固有の機能を持ったハードウェア 上で最終的に出力される。ハードウェアの違いに気を遣うことと、機能改善を図るため、 Adobeは文法とPostscriptプリンタ定義(PPD)ファイルのファイルフォーマットを定義 してきた。すべてのPostscriptプリンタはそれらのファイルの1つを同梱して出荷されて いる。

PPDは、そのプリンタに割り当てられた一般的および特別な機能についてのすべての情報を 含んでいる。扱える異なった解像度は何か?両面印刷ユニットがあるか?ペーパートレイは いくつあるか?メディアのタイプとサイズは何が使えるか?それぞれの要素について、 プリンタに送られる特別なコマンド文字列を、それを有効にするために指定する事が 出来る(ほとんどの場合、Postscriptファイル中に)。

PPDからの情報はプリンタドライバによって考慮されることを意味する。そのため、 与えられたプリンタのための、Windows PostScriptドライバの一部としてインストール されるものはプリンタのPPDである。それが意味をなす場合、PPD機能は、印刷 オプションをユーザに選択されるために表示される、ドライバのユーザインタフェース ダイアログ中で提供される。最後に、ユーザの選択は、ドライバによって作成された PostScriptファイル中に(特別なPostScript、PJL、JCLあるいはベンダ固有のコマンド 形式として)何らかの形で書かれる。

### Warning

特定の印刷ジョブ出力を行うために、デバイス固有のコマンドを含んで作成された 特定のマシン上のPostScriptファイルは期待通りには印刷出来ないかもしれなく、 すべてのモデル上で印刷可能ではないかもしれない。それはソフトウェアによる 追加処理に適さないかもしれない(すなわち、PDF抽出プログラムによって)。

### Windows形式のベンダPPDの使用

CUPSはそのPostScriptモデルのための、開発元によって供給された、すべての仕様に 従っているPPDを扱うことが出来る。もしもベンダがマニュアルとパンフレットに 使用しているOSについての言及がなかったとしても、それらを安全に信用できる: もしも、Windows NTバージョンのPPDを入手したならば、CUPS中で変更なしに利用でき、 その結果、Windows NTユーザが出来るように使用するプリンタのすべての能力に アクセスできる。

### Tip

オンラインでどのようなPPDの仕様遵守状態を確認するためには、 http://www.cups.org/testppd.php に行き、PPDをアップロードする。すぐにその結果を見ることができる。バージョン 1.1.19以降のすべてのバージョンのCUPSは、よりずっと厳しい内蔵PPD解析と検査 コードが有効になっている。印刷トラブルが起きたら、このオンラインリソースを 最初に調べる場所としてほしい。

### Warning

実際のPostScriptプリンタのためには、Linuxprinting.orgからの FoomaticかcupsomaticPPDを 使ってはならない。それらのデバイスには、オリジナルの ベンダが提供したPPDが常時最初の選択肢となる。

### Tip

もしも、特定のデバイスに対するオリジナルのベンダ提供PPDを捜していて、LAN上の NT4マシン(あるいは他の任意のWindowsマシン)がインストールされているPostScript プリンタを持っている場合、すべてのプリンタドライバが格納されているWindows ディレクトリにアクセスするために、 `smbclient //NT4-box/print\$ -U username`を使用する。 最初に、捜しているPPDのために、`W32X86/2`サブディレクトリを 捜してみる。

### 非PostScriptプリンタのためにCUPSはPPDを使う

CUPSは非PostScriptプリンタを扱うために、特別に作成されたPPDをも使う。それらの PPDは通常ベンダから供給されない(そして、同じモデル名のPostScriptプリンタ用の PPDファイルを使うことが出来ず、非PostScriptバージョンが動くことを期待することも 同じである)。非PostScriptプリンタに対してPPDがどのように適用されるかを知るため には、最初にCUPSフィルタリングとファイルフォーマット変換アーキテクチャについて 深く言及する必要がある。引き続き読み続けること。

## CUPSフィルタリングアーキテクチャ

CUPSフィルタリングシステムの中核は、Ghostscriptによっている。Ghostscriptを追加する事で、CUPSはそれ自身固有のフィルタ以外のいくつかを使う。あなた自身(あるいはベンダ)はさらにフィルタを追加しても良い。CUPSはすべてのデータファイルフォーマットを種々のMIMEタイプのラベル配下で取り扱う。入力された各印刷ファイルは、最初に行われる自動タイプわけに基づいて扱われる。自動タイプわけにより、MIMEタイプが決定する。与えられたMIMEタイプは、選択された対象プリンタに、0またはそれ以上の、フィルタリングチェーンが自動的に(暗黙のうちに)設定される。この節では、どのようにMIMEタイプ認識と変換ルールが相互に作用するかについて説明する。それらは、与えられた入力データフォーマットに対する、動作させるフィルタリングチェーンを自動的に設定するために、CUPSによって使われる。

もしもCUPSがネイティブにビットマップにPostScriptファイルをラスタライズするならば、それは以下の2つのステージで行われる:

- 最初のステージでは、“cups”という名前のGhostscriptデバイスを使い (これは、バージョン1.15以降)、“CUPS raster”と呼ばれる一般的な ラスタ形式を生成する。

- 第二のステージでは、標準的なCUPSラスタをデバイス固有のラスタに変換する、 “ラスタドライバ”を使う。

使用するGhostscriptのバージョンが“cups”デバイスをコンパイルしてあるようにしておくこと(これは`gs -h |grep cups`で調べられる。それ以外だと、CUPS CUPS error_logファイルに`Unable to convert file 0`というエラーメッセージが表示されるだろう。使用しているGhostscript中にデバイスとして“cups”が含まれるようにするには、GNU Ghostscriptにパッチを当てて再コンパイルするか、ESP Ghostscriptを使う必要がある。良い代替はESP Ghostscriptである。これはCUPSサポートだけではなく、300もの他のデバイス(GNU Ghostscriptがおおよそ180くらいしかサポートしないのに対して)をサポートする。この広範囲なデバイスサポートがあるという理由で、ESC Ghostscriptは非CUPSスプーラ用の、最初の選択肢としても使える。すべてのスプーラに対して、Linuxprinting.orgによって現在は推奨されている。

CUPSプリンタは外部レンダリングパスを使うように設定しても良い。最も共通的なものは、Linuxprinting.orgからのFoomatic/cupsomaticコンセプトによって提供されるものである。これは古いGhostscriptを用いて、すべてを1ステップで処理する。これは“cups”デバイスを使わないが、その他の多くを使う。しかし、Foomatic/cupsomaticの使用にもかかわらず、最も良い解と広範囲のプリンタモデルのサポートはESC Ghostscriptによって提供される(Foomatic/cupsomaticについての詳細、現在foomatic-ripと呼ばれている、特に新しいバージョンについては、以下を参照)。

### MIMEタイプとCUPSフィルタ

CUPSは`/etc/cups/mime.types`(と、同じディレクトリ中にある、 すべての`*.types`ファイル)を起動時に読み込む。これらの ファイルはCUPSがそのautotyping機能を動かしているときに適用されるMIMEタイプ 認識ルールを含む。ルールの文法は`mime.types`のマニュアル ページと`mime.types`ファイルそれ自身のコメントセクションに 記述されている。簡単なルールは以下の通りである:

    application/pdf         pdf string(0,%PDF)

これは、もしファイル名に`.pdf`という拡張子が付いているか、 あるいは、マジック文字列%PDFがファイルそれ自身の先頭の 正しいところ(開始時点からオフセット0)にある場合、それはPDFファイルである (`application/pdf`)。その他のルールは以下の通り:

    application/postscript  ai eps ps string(0,%!) string(0,<04>%!)

もしも、ファイル名が`.ai`, `.eps`, `.ps`という拡張子のどれかを持つか、ファイルそれ自身が %!か<04>%!という文字列の どれかで始まるならば、それは一般的なPostScriptファイルである (`application/postscript`)。

### Warning

使用するシステムが、`/etc/cups/`ディレクトリ中のどれかを 使うかもしれない、他のmime.typesファイルと混同しないこと。

### Note

CUPS中の2つの似たようなMIMEタイプとの間で、重要な違いがある。1つは `application/postscript`で、もう一つは `application/vnd.cups-postscript`である。 `application/postscript`がデバイス非依存を意味するので、 ファイルのジョブオプションは引き続きPSファイルの内容の外側にあり、CUPSによって コマンドラインか環境変数中に埋め込まれ、 `application/vnd.cups-postscript`は、PostScriptそれ自身 中に埋め込まれるジョブオプションがあるかもしれない(適用可能ならば)。一般的な PostScript(`application/postscript`)の、デバイス固有の バージョン(`application/vnd.cups-postscript`)への変換は、 CUPSの`pstops`フィルタの責任である。pstopsは変換を行う ためにPPD中に含まれる情報を使う。

CUPSはASCIIテキスト,HP-GL, PDF, PostScript, DVIと多くの画像イメージ形式 (GIF, PNG, TIFF, JPEG, Photo-CD, SUN-Raster,PNM, PBM, SGI-RGBやその他)と それらに関連したMIMEタイプとそのフィルタを扱うことが出来る。

### MIMEタイプ変換ルール

CUPSは`/etc/cups/mime.convs`(と、同じディレクトリ中にある、 その他の`*.convs`というファイルも)を起動時に読み込む。 それらのファイルには入力MIMEタイプ、出力MIMEタイプ、入力タイプから出力を生成 できるフォーマット変換フィルタとその変換に関連する仮想のコストを意味する行を 含む。その1つの例は以下のようになる:

    application/pdf         application/postscript   33   pdftops

これは、`pdftops`フィルタが入力として `application/pdf`を取り、出力として `application/postscript`を生成する。この操作の仮想コストは 33 CUPS-$である。次のフィルタはより高価で、66 CUPS-$かかる:

    application/vnd.hp-HPGL application/postscript   66   hpgltops

これは、HP-GLプロッタファイルをPostScriptへ変換処理する `hpgltops`である。

    application/octet-stream

さらに2つの例である:

    application/x-shell     application/postscript   33    texttopstext/plain              application/postscript   33    texttops

最後の2つの例は`application/x-shell`上と同じように `text/plain`で動作する`texttops` フィルタを意味する(ヒント:この違いは、`texttops`の 特筆すべき機能の文法のために必要とされる)。

### フィルタリングの概要

`mime.convs`という名前の、よりたくさんの組み合わせがある。 しかし、あらかじめ定義してあるもの以外を使うことに制限はない。好みの、CUPS フレームワークに対する任意のフィルタを追加できる。それは最小限の要求に適合 するか、させねばならない。もしも、ある種の効果的なフィルタを見つける(か書くか) 場合、CUPSの要求が要求するものに従い、適切な行を`mime.types`と `mime.convs`に書く。そうするとCUPS内部でシームレスに動作する。

#### フィルタの要求

フィルタに対する“CUPSの要求”は単純である。入力としてファイル名か `標準入力`を取り、`標準出力`に出力する。 これはまた下記の引数を持つ:

printer

  プリンタキューの名前(通常これは動かすフィルタの名前である)。

job

  印刷するジョブのジョブID値(数字)。

user

  オリジナルのユーザ名属性からの文字列。

title

  ジョブ名属性からの文字列。

copies

  コピー数属性からの数値。

options

  ジョブのオプション。

filename

  (オプション)印刷を要求するファイル(もしも指定されなければ、 フィルタは`標準入力`からのデータ供給を 仮定する)。ほとんどの場合、CUPSで動作するようにさせるための 存在するフィルタを囲む単純なラッパプログラムを書くことは 簡単である。

### Prefilters

以前に説明したように、PostScriptは、任意のUNIXベースの印刷システムにおいて 中核となるファイル形式である。PostScriptから、非PostScriptプリンタに送る ためのラスタデータを、CUPSは生成する。

しかし、印刷するためにサポートされた非PSフォーマットのどれかを送る時に何が起きる のだろうか?次にCUPSはPostScriptを最初に生成するために、それらの入力上で “prefilters”を動かす。これは、ASCIIテキスト,PDF, DVI,かHP-GLから PostScriptを生成するためのprefilterである。それらのフィルタからの出力は常時 `application/postscript`というMIMEタイプである (これは任意のデバイス固有のオプションはCUPSによってまだPostScriptに埋め込まれて おらず、呼ばれる次のフィルタはpstopsであることを意味する)。その出力は常時 `application/vnd.cups-postscript`というMIMEタイプである (application/postscriptではない)場合、プリントオプションはすでにファイルに 埋め込まれている事を意味する。これは、 PostScriptを整形するためのCUPS内のprefiltering で説明されている。

Figure 22.4. PostScriptを整形するためのCUPS内のprefiltering

### pstops

pstopsは、`application/postscript`を `application/vnd.cups-postscript`に変換するために使われる フィルタである。以前に説明したように、このフィルタはすべてのデバイス固有の印刷 オプション(両面印刷やstanpingと穴あけなどをプリンタに指示するコマンド)を、 PostScriptファイル中に挿入する。その例は、 デバイス固有印刷オプションの追加に例示されている。

Figure 22.5. デバイス固有印刷オプションの追加

これがすべてではない。これにより行われるその他の処理は以下の通り:

- 印刷ページ範囲を指定する(すなわち、“3, 6, 8-11, 16と19-21” か、偶数ページのみ印刷することを選べる)。

- 1枚に2枚あるいはそれ以上のページを配置する(“数値-up” 機能と呼ばれる)。

- `/var/log/cups/page_log`に、 課金情報を記録するための、ジョブのページ数をカウントする。

### pstoraster

`pstoraster`はCUPSフィルタリングシステムの中核である。 これは、ラスタライズ処理の最初のステージに対して責任がある。その入力は application/vnd.cups-postscriptというMIMEタイプである。その出力は、 application/vnd.cups-rasterである。この出力形式はまだ印刷可能にはなっていない。 その目的は、デバイス固有印刷データの生成を有効にする、より特殊化した ラスタデバイスのための汎用入力形式として提供することである。 これについては、 PostScriptから中間ラスタ形式への変換ダイアグラム を参照のこと。

Figure 22.6. PostScriptから中間ラスタ形式への変換ダイアグラム

CUPSラスタは強力な機能を持つ汎用ラスタフォーマットである。これは、ページ単位 情報、色のプロファイルなど、下位のラスタドライバで使われるものを含むことが 出来る。そのMIMEタイプはIANAに登録されていてその仕様はもちろん完全に公開されて いる。それを作るのはとても簡単で、選択したものに対応すべきプリンタモデル用に、 LinuxとUNIXラスタドライバを製造元が作成するために、費用がかからないように 設計されている。CUPSは常時ラスタライズする最初のステージに注意を払っているので、 ベンダはGhostscript互換について注意を払う必要はない(実際、CUPSラスタドライバの 開発の資金調達を行っている、1つ以上のベンダが現在存在する)。これは、 Ghostscriptを使うCUPSラスタ生成の図解 に図示している。

Figure 22.7. Ghostscriptを使うCUPSラスタ生成の図解

バージョン1.1.15より前のCUPSバージョンでは、バイナリ(あるいはソースコードで)、 `pstoraster`という名前の独立フィルタを提供していた。 `pstoraster`はGNU Ghostscript 5.50由来で、代替インストール 可能で、競合なしにGNUあるいはAFPL Ghostscriptパッケージに追加される。

バージョン1.1.15以降、この機能は変更された。このフィルタの機能は、Ghostscriptに 統合された(現在はGNU Ghostscript バージョン 7.05をベースとしている)。 `pstoraster`フィルタは現在`-sDEVICE=cups` パラメータを付けた`gs`を呼び出す単純なシェルスクリプトである。 もしも、`gs -h |grep cups`を実行したときにGhostscriptがエラーに なるならば、印刷は出来ないので、Ghostscriptをアップデートする必要がある。

### imagetops と imagetoraster

prefiltersについての節において、イメージ形式からPostScriptを生成するprefilter について言及した。`imagetoraster`フィルタは中間PostScript ステージなしにイメージからラスタに直接変換するために使われる。これは以前に 言及したprefilterよりもより頻繁に使われる。イメージファイルのフィルタリングに ついての要約フローチャートは イメージ形式をCUPSラスタ形式に変換する流れである。

Figure 22.8. イメージ形式をCUPSラスタ形式に変換する流れ

### rasterto [プリンタ固有]

CUPSはCUPSラスタを処理するための非常に数多くのラスタドライバを提供している。 筆者の環境では、/usr/lib/cups/filter/配下に `rastertoalps`,`rastertobj`, `rastertoepson`,`rastertoescp`, `rastertopcl`,`rastertoturboprint`, `rastertoapdk`,`rastertodymo`, `rastertoescp`, `rastertohp`と `rastertoprinter`があった。これよりドライバの数が少なくても 心配することはない。上記のいくつかはCUPSに対する商用アドオンであり (`rastertoturboprint`のような)、その他 (`rastertoprinter`のような)は、可能な限りCUPSと協調する ことを望んでいるサードパーティドライバ開発プロジェクトに由来する (たとえばGutenprint)。 ラスタからプリンタ固有形式への変換図 を参照。

Figure 22.9. ラスタからプリンタ固有形式への変換図

### CUPSバックエンド

CUPSフィルタリングチェーンについての最後の部分はバックエンドである。 バックエンドは、最終的なデバイスに印刷可能なファイルを送るための、特別な プログラムである。ネットワーク経由でと、すべてのローカルなインタフェースに 印刷ジョブを送るための、任意の異なった分離されたバックエンドプログラムが ある。すべてのCUPS印刷キューは、それに関連づけられているCUPS “device-URI”を持つ必要がある。device URIは、その送付先にジョブを 送るときに使われる、バックエンドをエンコードする方法である。以下で一覧表示 されているもので分かるように、ネットワークdevice URLは記述の中に2つの スラッシュ(斜線)を使い、ローカルdevice URLは1つのみを使う。ローカル インタフェース名は、OSがLinux以外の場合、筆者の例では非常に自由度があっても よいことを心にとめておくこと:

usb

  このバックエンドはUSB接続のプリンタに印刷ファイルを送る。使用する CUPS device URIの例は以下の通り。 `usb:/dev/usb/lp0`

serial

  このバックエンドはシリアル接続したプリンタに印刷ファイルを送る。使用する CUPS device URIの例は以下の通り。 `serial:/dev/ttyS0?baud=11500`

parallel

  このバックエンドはパラレルポートに接続したプリンタに印刷ファイルを送る。使用する CUPS device URIの例は以下の通り。 `parallel:/dev/lp0`

SCSI

  このバックエンドはSCSIインタフェースに接続されたプリンタに印刷ファイルを送る。使用する CUPS device URIの例は以下の通り。 `scsi:/dev/sr1`

lpd

  このバックエンドはLPR/LPDで接続されたネットワークプリンタに印刷ファイルを送る。使用する CUPS device URIの例は以下の通り。 `lpd://remote_host_name/remote_queue_name`

AppSocket/HP JetDirect

  このバックエンドはAppSocket(別名JetDirect)で接続されたネットワークプリンタに 印刷ファイルを送る。使用するCUPS device URIの例は以下の通り。 `socket://10.11.12.13:9100`

ipp

  このバックエンドはIPPで接続されたネットワークプリンタ(か他のCUPSサーバ)に 印刷ファイルを送る。使用するCUPS device URIの例は以下の通り。 `ipp:://192.193.194.195/ipp` (多くのHPプリンタ用)と `ipp://remote_cups_server/printers/remote_printer_name`

http

  このバックエンドはHTTPで接続されたプリンタにファイルを送る (http:// CUPSバックエンドはipp://バックエンドの単なるシンボリックリンクである)。 CUPS device URIの例は以下の通り。 `http:://192.193.194.195:631/ipp` (多くのHPプリンタ用)と `http://remote_cups_server:631/printers/remote_printer_name`

smb

  このバックエンドはWindowsホストによって共有されているプリンタに印刷ファイルを送る。 CUPS device URIの例は以下の通り。

  `smb://workgroup/server/printersharename`
  `smb://server/printersharename`
  `smb://username:password@workgroup/server/printersharename`
  `smb://username:password@server/printersharename`

  The smb:// backendはSambaユーティリティ`smbspool` (CUPSによって提供されていない)へのシンボリックリンクである。もしも CUPSバックエンドディレクトリ中にシンボリックリンクがない場合、root ユーザになって、 `ln -s `which smbspool' /usr/lib/cups/backend/smb` を実行してこれを作ること。

CUPS印刷システムに対して任意の変更又は拡張の必要性がある場合、シェル又はPerl スクリプトで固有のバックエンドを書くことは簡単である。印刷ジョブをメールとして (“mailto:/”バックエンド経由で)送る、PDFに変換する (“pdfgen:/”バックエンド経由で)、あるいは“/dev/null”に ダンプするというような“特別な”プリンタを作成したいというような 希望が理由としてあげられる(実際、システム全体での既定値のプリンタとして、 devnull:/バックエンドに接続するプリンタを用意している)。とても多くの人が、 プリンタを指定しないでジョブを送信したり、スクリプトとプログラムがプリンタを 指定しない。システム全体での既定値はジョブを削除し、$USERに、 正しいプリンタ名を常時指定するようにという丁寧なメールを送る)。

説明したバックエンドすべて以外が使用しているシステム上にあるか、利用可能に (ハードウェア設定に依存する)なっていてもよい。すべての有効なCUPSバックエンドを 調べる1つの方法はlpinfoとして提供されている。これを `-v`を付けて付こうと、すべての有効なバックエンドを下記のように 表示する:

    	$ lpinfo -v

### `cupsomatic/foomatic`の役割

`cupsomatic`フィルタはCUPSをインストールするときに最も広く 使われているだろう。これらはCUPS開発者によって開発されたものではないということを 明確にする必要がある。これらはCUPSに対するサードパーティアドオンである。これらは CUPSのためにジョブをレンダリングする従来のGhostscriptデバイスを使う。 問題が発生したときの調査時にはその違いを知っておく必要がある。ここでは1ステージで すべてのレンダリングプロセスがGhostscript内部で、対象のプリンタに適したデバイスを 使って行われる。`cupsomatic`は、Linuxprinting.orgにある Foomaticプリンタドライバデータベースから生成されたPPDを使う。

You can recognize these PPDs from the line calling the `cupsomatic` filter:

    *cupsFilter: "application/vnd.cups-postscript  0  cupsomatic"

PPDファイルの最初の40かそのあたりで、この行を見つけるかもしれない。 もしも、そのような、インストールされたPPDがあるならば、プリンタは `foomatic`の名前部分に`foomatic`が 表示されたCUPS Webインタフェース中で表示される。 `cupsomatic`は、選択されたPPDとプリントジョブに与えられた コマンドラインオプションから自動的に構成された、すべての複雑なコマンドライン オプションを付けたGhostscriptを実行させるPerlスクリプトである。

しかし、`cupsomatic`は現在廃止されている。そのPPD(特に 最初に生成したものは、そこで引き続き頻繁に使用される)は、Adobeの仕様に適合して いない。Windowsクライアントに“ポイントアンドプリント”でそれらを ダウンロード仕様とするときに困難に遭遇するかもしれない。よりよい、かつ 強力な解決方法は現在提供されている。それは、`foomatic-rip` と呼ばれる。CUPSでフィルタとして`foomatic-rip`を使うために、 似たようだが異なった行を持つ、新しいタイプのPPDが必要である:

    *cupsFilter: "application/vnd.cups-postscript  0  foomatic-rip"

Linuxprinting.orgにあるPPD生成エンジンは修正された。新しいPPDはAdobeの仕様に 従っている。これらは異なった品質レベル(高解像度の写真、通常の色、グレースケールと ドラフトモード)をシングルクリックで、5つまたはそれ以上の異なった選択(メディア タイプ、解像度、インク種別とディザリングアルゴリズム)を要求できる新しい方法を 提供する。ビルトインされた固有のサイズのメディアサポートもある。ジョブの中間で、 ページ毎に印刷オプションを切り替えることのサポートもある。さらに、最もすばらしい ことは、新しい`foomatic-rip`は、印刷時にPPDを使うための アクセスに対するサポートを、すべての旧式なスプーラ(LPRng,BSD-LPD, PDQ, PPRなど) に対してもシームレスに動作するということである。

### 完全な図解

すべてのフィルタの概要とどのようにそれらが関連するかを知りたい場合、 パズルの完全な図解はこの章の最後にある。

### `mime.convs`

CUPSは与えられたMIMEタイプとインストールされたすべてのプリンタに対する可能な すべてのフィルタリングチェーンパスを自動構築する。しかし、どのようにして 優先するものや特定の選択肢を決めるのであろうか(2つ以上の、同じターゲット プリンタに対するフィルタリングチェーンが存在するような場合があるだろう)? 簡単である。mime-convファイルの3番目のカラム中にある数字に気がついたかも しれない。それはこのフィルタに割り当てられている仮想コストを表現している。 すべての可能なフィルタリングチェーンは全体の“フィルタコスト” として集計される。CUPSは最も“コストの小さい”ルートを選ぶ。

### Tip

`cupsd.conf`中で`FilterLimit 1000`を 設定すると、仮想フィルタコストが合計1000を消費するより多く、フィルタが同時に動く ことを許可しない。これは適切な“FilterLimit”値を設定することにより CUPSサーバの負荷を制限する効率的な方法である。200というFilterLimitの値はおおよそ 一度に1つのジョブを許可し、FilterLimitを1000にするとおおよそ最大5つのジョブが 同時に動作する。

### “Raw”印刷

CUPSに対して任意の“raw”ファイルを印刷(ほとんど)させることが出来る。 “raw”はフィルタされないことを意味する。CUPSは、プリンタがそれを理解 できる時に、思い悩まずに“そのまま”プリンタに対してファイルを送る。 ユーザは賢明なデータ形式のみをそれらに送る事について注意を払う必要がある。raw 形式の印刷は、もしも“`-o raw`”オプションが コマンド行上で指定されたときにどのキューにおいても発生する。任意のPPDを単に関連 づけない事によってrawのみのキューを設定することも出来る。以下のように行う:

    $ lpadmin -P rawprinter -v socket://11.12.13.14:9100 -E

これは、“rawprinter”という“socket”プロトコル (別名“HP JetDirect”)経由で接続してポート9100のIPアドレス 11.12.1.3.14のデバイスに接続するように設定する(もしもこのコマンド行に `-P /path/to/PPD`を付けたPPDを追加したならば、 “通常の”印刷キューとしてインストールされる。

CUPSは、もしもキューに関連づけられるPPDを見いだせない場合、自動的に各ジョブを “raw”と見なしてキューに送るように扱う。しかし、CUPSは既知の MIMEタイプ(CUPSが持つmime.typesファイルで定義されている)のみを送り、それ以外は 拒否する。

### application/octet-stream 印刷

`/etc/cups/mime.types`ファイル中にルールがない任意のMIME タイプは、unknownか`application/octet-stream`と 見なされ、送信されない。既定値で不明なMIMEタイプの印刷をCUPSが拒否するので、 Windowsクライアント由来の印刷ジョブが印刷されないということを経験するかも しれない。以下のようなエラーメッセージがCUPSログファイル中に見つかるかもしれない:

`Unable to convert file 0 to printable format for job`

`application/octet-stream`の印刷を有効にするためには、以下の 2つのファイルを編集する:

- `/etc/cups/mime.convs`

- `/etc/cups/mime.types`

両方とも`application/octet-stream`のためのrawモード操作を 有効にするためにコメントアウトしなければならないエントリ(それぞれのファイルの 最後の所)を含む。下記の行が`/etc/cups/mime.types`に存在する ようにすること:

    application/octet-stream

自動タイプルールセットが指定されていないこの行は、他の行で `application/octet-stream`のメンバが自動タイプされていない 限り、全てのファイルを作成する。`/etc/cups/mime.convs`中では 以下のような行になる:

    application/octet-stream   application/vnd.cups-raw   0   -

この行はCUPSに、`application/octet-stream`上で (“-”で示される、何もしない)Null Filter を使うことを指示し、`application/vnd.cups-raw`として 結果をタグづける。この最後の部分は、プリンタに接続しファイルを送信するための バックエンドに向けてCUPSスケジューラがいつでも今あるファイルを引き渡せるように している。

### Note

`mime.convs`と`mime.types`ファイルの編集は “raw”印刷を強制せず、それを 許可するのみである。

Background. そのCUPSは従来のものよりセキュリティに気を払っている印刷システムで、既定値では、 印刷デバイスに対して手の込んだ(おそらくバイナリ)データを送ることを誰にも許可して いない(これは、使用しているプリンタに対してサービス不能攻撃をかける不正使用が 簡単にでき、少なくとも大量の紙とインクが無駄になることが発生する)。 “不明な”データはCUPSによって、MIMEタイプ application/octet-streamと見なされる。 “raw”形式でデータを送ることができる場合、 それらのMIMEタイプは、CUPSとそれによって許可された、既知のもののどれかでなければ ならない。`/etc/cups/mime.types`というファイルはCUPSが どのようにMIMEタイプを認識するかの“規則”を定義する。 `/etc/cups/mime.convs`というファイルはどのファイル変換 フィルタがそのMIMEタイプに適用されるかを定義する。

### 非PostScriptプリンタのためのPostScriptプリンタ記述

オリジナルのPPDはPostScriptプリンタのみに使われることを意図していた。それらは ジョブファイルを処理する、RIPのためのデバイス固有のコマンドと設定を送るための 手助けとなる。CUPSはPPDに対するこのスコープを拡張し、非PostScriptプリンタにも カバーするようにした。これが標準化されたファイル形式のために、これを行うのは 難しくない。その方法は論理的でもある:CUPSはPostScriptを取り扱い、ジョブファイルを 処理するためにPostScript RIP(Ghostscript)を使う。唯一の違いはPostScriptプリンタは RIPを内蔵していて、その他のタイプのプリンタはホストコンピュータ上でGhostscript のRIPを動かすと言うことである。

非PostScriptプリンタに対するPPDはCUPS固有のいくつかの行を持っている。最も 重要なものは下記と似たようなものである:

    *cupsFilter: application/vnd.cups-raster  66   rastertoprinter

これが CUPS フィルタリングの最後の難所のひとつである。この行では、CUPSデーモンに 対して、`rastertoprinter`を最後のフィルタとして使うように 設定している。このフィルタは `application/vnd.cups-raster` というMIMEタイプのファイルが入力の際に用いられることになる。CUPSは指定されたMIME タイプを最終的な出力とするようなフィルタのチェインを自動的に生成する。 次にこれは指定された`rastertoprinter`フィルタのための入力と なる。最後のフィルタが処理を終えた後(`rastertoprinter`は Gutenprintフィルタである)、ファイルは、出力デバイスに送信を行うバックエンドに 送られる。

CUPSが提供しているPPDは数少ないが、プリンタモデルは数多くある。異なった紙の トレイや指定されたモデルがサポートしているよりもより大きなマージンを取ることが 出来ないかもしれない。要約は表21.1“CUPSに同梱されているPPD”を参照。

Table 22.1. CUPSに同梱されているPPD

PPDファイル | プリンタタイプ
--- | ---
deskjet.ppd | 古いHP inkjetプリンタとその互換
deskjet2.ppd | 新しいHP inkjetプリンタとその互換
dymo.ppd | labelプリンタ
epson9.ppd | エプソン9-ピンインパクトプリンタとその互換
epson24.ppd | エプソン 24-ピンインパクトプリンタとその互換
okidata9.ppd | Okidata 9-ピンインパクトプリンタとその互換
okidat24.ppd | Okidata 24-ピンインパクトプリンタとその互換
stcolor.ppd | 古いエプソン Stylusカラープリンタ
stcolor2.ppd | 新しいエプソン Stylusカラープリンタ
stphoto.ppd | 古いエプソン Stylus Photoプリンタ
stphoto2.ppd | 新しいエプソン Stylus Photoプリンタ
laserjet.ppd | すべての PCL プリンタ

### cupsomatic/foomatic-rip 対 ネイティブなCUPS印刷

ネイティブなCUPSラスタライズ作業は2つのステップに分かれている:

- 最初のものは、`pstoraster`ステップである。これは、 ESP Ghostscript 7.05.xからの特別なCUPSデバイスを、そのツールとして使う。

- 二番目のものは`rasterdriver`ステップである。これは、 種々のデバイス固有のフィルタを使う。このステップに対して良い品質をもつ フィルタを提供するいくつかのベンダがある。それらのいくつかはフリー ソフトウェアであり、いくつかはシェアウェアであり、いくつかは商用製品である。

しばしばこれは、その他の方法よりもより良い品質のものを生成する(そして、 いくつかのより優位な点がある)。これについては cupsomatic/foomaticの処理対ネイティブなCUPSの図 に図解がある。

Figure 22.10. cupsomatic/foomaticの処理対ネイティブなCUPSの図

1つの他の方法は、`cupsomatic/foomatic-rip`によるものである。 `cupsomatic`は、決してCUPS開発者によって 作られたものではないということに注意。これは、印刷環境に 対する独立した貢献であり、Linuxprinting.orgの人々によって作られたものである。 [6] `cupsomatic`はもはや開発、メンテナンス、サポートされいない。 これは現在 `foomatic-rip`によって置き換えられている。 `foomatic-rip`は古い`cupsomatic`の アイデアを完全に書き換えたものであるが、とても改善され、他の(非CUPS)スプーラに 対して汎用化されている。 `foomatic-rip`へのアップグレードは、 特にもしも最新バージョンのCUPSにアップグレードするならば強く推奨される。

古い`cupsomatic`のように、(新しい)Linuxprinting.orgが使う 現代的なGhostscript印刷処理からの`foomatic-rip`は、すべてを 単一のステップで行う。従ってそれはGhostscript中に組み込まれる他のすべての デバイスに依存する。他のスプーラでのGhostscriptのレンダリングと同じくらい 品質は良い(あるいは悪い)。優位点は、この方法は、より最新のCUPSによる方法によって (まだ)サポートされていない、たくさんのプリンタモデルをサポートするということで ある。

もちろん、あるシステムで並列に両方の手法を使うことが出来(もしも異なったキューを 設定するならば1つのプリンタに対しても)、どれが一番うまく動作するかを見いだせる。

`cupsomatic`は印刷ファイルを `application/vnd.cups-postscript`ステージ後に捕まえ、 システム全体でインストールされたGhostscriptである、CUPS-externalを通してそれを 横取りする。その結果、印刷ファイルは`pstoraster`フィルタ をバイパスする(さらにCUPSラスタドライバ`rastertosomething`も バイパスする)。Gostscriptがラスタライズ処理を終えた後、 `cupsomatic`はレンダリングされたファイルディレクトリをCUPS バックエンドに渡す。 cupsomatic/foomaticの処理対ネイティブなCUPS にはネイティブなCUPSレンダリングと`Foomatic/cupsomatic`手法の 違いについて図解している。

### フィルタリングチェインの例

以下は、CUPSの動作を図解するための、よくあるフィルタリングチェインの例である。

HP JetDirect接続のPostScriptプリンタにPDFファイルを印刷しようとしていることを 仮定するが、ページ3-5,7と11-13のみを印刷したく、更にそれを“2アップ” と“両面印刷”にしたいとする:

- 使用する印刷オプション(要求されたページの選択、2アップ、両面印刷) は、コマンドライン上でCUPSに渡される。

- (完全な)PDFファイルがCUPSに送られ、 `application/pdf`として自動タイプされる。

- その結果ファイルはPostScript MIMEタイプである `application/postscript`(ここでのプレビューは引き続き オリジナルのPDFファイルのすべてのページを表示する)を生成する `pdftops`prefilterに、最初に渡さねばならない。

- ファイルは次にコマンドラインオプションを適用する `pstops`フィルタに渡される:これはページ2-5,7と11-13を 選択し、“1枚のページ上に2つのページ”という合成されたレイアウトを 作成し、正しい“両面印刷”コマンド(プリンタのPPD中で定義されている) を、新しいPostScriptファイルに挿入する。ファイルはこの時点でPostScript MIME タイプ`application/vnd.cups-postscript`となる。

- ファイルは、プリンタにジョブを転送する `ソケット`バックエンドに送られる。

フィルタリングチェーンの結果は以下の PDFからソケットへのチェーンの模式図のようになる。

Figure 22.11. PDFからソケットへのチェーン

CUPS`stphoto2.ppd`をインストールした、USB接続の Epson Stylus Photo Printerに同じフィルタで印刷したいと仮定しよう。最初の いくつかのフィルタリングステージはおおよそ同じである:

- 印刷オプション(要求されたページの選択、2アップ、両面印刷)は、 コマンドラインでCUPSに渡される。

- (完全な)PDFファイルはCUPSに送られて、 `application/pdf`と自動タイプされる。

- ファイルは、最初に、 PostScript MIMEタイプ`application/postscript`を 生成する`pdftops`prefilterに渡されなければならない (ここでのプレビューは引き続きオリジナルのPDFのすべてのページを表示する)。

- ファイルは次にコマンドラインオプションを適用する“pstops” フィルタに送られる。ここでページ2-5,7と11-13を選択し、 “一枚の紙の上に2ページを”合成し、正しい“両面印刷” コマンド(おっと、このプリンタとPPDは両面印刷をサポートしていないので、 このオプションは無視される)を新しいPostScriptファイルに挿入する。 ファイルはこの時点でPostScript MIMEタイプ `application/vnd.cups-postscript`となる。

- ファイルは次に`pstoraster`ステージに送られ、MIME タイプが`application/cups-raster`となる。

- 最後に、`rastertoepson`フィルタは、その処理を行い (プリンタのPPD中で示されるように)、プリンタ固有のラスタデータを生成し、 ユーザが選択した任意の印刷オプションを、印刷データストリーム中に 埋め込む。

- ファイルは、ジョブをプリンタに転送する`usb` バックエンドに送られる。

フィルタリングチェーンの結果は PDFからUSBチェーンへの模式図のようになる。

Figure 22.12. PDFからUSBチェーン

### CUPSドライバ/PPDの提供元

インターネット上でたくさんのCUPS-PPDファイルを(それに適したフィルタと一緒に)、 たくさんの言語環境で、1000以上の非PostScriptモデル用をサポートしているものを 見つけることが出来る。

- ESP PrintPro (商用、自由ではない)は、3000以上のPPDをパッケージしていて、 Linux, Mac OS X, IBM-AIX,HP-UX, Sun-Solaris, SGI-IRIX, Compaq Tru64, Digital UNIXと他の商用UNIX上での“外部ドライバ”として使える (これは、CUPS開発者それ自身で書かれていて、その売り上げは 開発者を食べさせるという形で、将来のCUPS開発費用を助ける)。

- Gutenprint Project (GPL、フリーソフトウェア)は140ほどのPPDを提供し(おおよそ400のプリンタを サポートしていて、多くは写真品質出力を提供する)、Gutenprint CUPS ドライバと共に使われる。

- TurboPrint (シェアウェア、自由ではない)は、とても良い品質で、おおよそ、プリンタの数と 同じくらいのサポートがある。

- OMNI (LGPL、自由)は、IBMによって作られたパッケージで、現在400以上のプリンタ サポートを含み、IBM OS/2のノウハウの遺産をLinux上に移植している (CUPSサポートは現在β状態である)。

- HPIJS (BSD系のライセンス、自由) は、おおよそ150のHP製プリンタをサポートし、優れた印刷品質をも提供する (現在Foomaticパス経由でのみ有効)。

- Foomatic/cupsomatic (LGPL、自由)は、Linuxprinting.orgからのもので、(Omni、GunenprintとHPIJS を含む)世界中に知られているほとんどすべての各Ghostscriptフィルタ用の PPDを提供する。

### インタフェーススクリプトを伴う印刷

CUPSはまたSystemV AT&T印刷システムからとして知られている “interface scripts”の使用もサポートしている。それらはしばしば PCL印刷ジョブを生成するアプリケーションから、PCLプリンタにおいて使われる。 interface scriptsはプリンタモデルに特化している。これらはPostScriptプリンタの ためのPPDと同様の役割を持っている。interface scriptsは、たとえば、もしも ユーザが特定のペーパートレイを選択したか、紙の方向を変更したかA3用紙を しようするような場合、印刷データストリーム中に要求されたESCシーケンスを 追加してもよい。interface scriptsはLinux領域ではほとんど知られていない。 HP-UXプラットフォームでは、もう少し使われている。動作する任意の interface scriptsをCUPS上で一緒に使うことも可能である。以下のように、 `-i`を使ってインストールする:

    root# lpadmin -p pclprinter -v socket://11.12.13.14:9100 \          -i /path/to/interface-script

interface scriptsは多くの人にとって“未知の動物”かもしれない。 しかし、これは、CUPSと共に使うことで、ある特定の印刷キューに対する、固有の、 専用として記述した、フィルタリングスクリプトやプログラムを組み込む最も簡単な 方法を提供する(現代的なinterface scriptsの使い方に関するいくつかの情報は、 http://playground.sun.com/printing/documentation/interface.htmlにある)。

## ネットワーク印刷(Windowsのみ)

ネットワーク印刷は多くの分野をカバーしている。Windowsクライアントのために印刷するときSamba上で何が起こるかを正確に理解するために、まず初めに、Windows NTサーバと共に使うWindowsクライアントという、“Windowsのみ”の設定を見てみよう。

### WindowsクライアントからNT印刷サーバへ

WindowsクライアントからNTベースの印刷サーバへの印刷は、2つのオプションがある。それらは以下の2つである:

- ドライバをローカルに実行し、GDI出力(EMF)を、使用している プリンタに対するプリンタ固有の形式に描画する。

- プリンタ固有の出力に描画するためにドライバが実行されたときに、 GDI出力(EMF)をサーバに送る。

両方の印刷パスはクライアント上での印刷ドライバの実行とサーバ上での印刷ドライバの実行というフローチャートで図示されている。

### クライアント上でのドライバの実行

最初の場合、印刷サーバはraw形式でファイルをスプールせねばならない。これはジョブファイルにさわらず、何らの方法での変換もしないことを意味する。これは、現代的なUNIXベースの印刷サーバが同じように行えることでもあり、NT印刷サーバよりもよりよいパフォーマンスとより信頼性がある。これは、おそらくほとんどのSamba管理者が慣れ親しんでいるものである。この設定の1つの利点は、この“スプールのみ”の印刷サーバが、UNIX用のドライバがない場合にも使えるかもしれないと言うことである。これは、有効なWindowsクライアントドライバがあり、クライアントにインストールされていれば十分である。これはクライアント上での印刷ドライバの実行ダイアグラムで図示されている。

Figure 22.13. クライアント上での印刷ドライバの実行

### サーバ上でのドライバの実行

他のパスはサーバ上でプリンタドライバを実行する。クライアントはサーバにEMF形式で印刷ファイルを送る。サーバはPostScript, PCL, ESC/Pか他のドライバを、EMFファイルをプリンタ固有の言語に変換するために使う。同じ事はUNIX上ではできない。現在、プリンタが理解できるものに、UNIXサーバ上でWindowsクライアントのGDI出力を変換するプログラムか手法はない。これはサーバ上での印刷ドライバの実行ダイアグラムで図示されている。

Figure 22.14. Print Driver Execution on the Server.

しかし、似たようなものはCUPSで可能なので、引き続き読むこと。

## ネットワーク印刷(WindowsクライアントとUNIX/Samba印刷サーバ)

UNIX印刷サーバがそのプラットフォーム上でWin32プログラムコードを実行できないので、絵は若干異なる。しかしながら、これは、それほど選択権を制限するものではない。それどころか、他では不可能な印刷機能を実装することができるかもしれない。

### WindowsクライアントからCUPS/Samba印刷サーバへ

Windowsネットワーク印刷クライアントに対する、CUPSの強力な機能の利点をどのように利用するかを示す簡単なレシピである:

- WindowsクライアントにPostScriptをCUPSサーバに送らせる。

- CUPSサーバにPostScriptをドライバ固有のラスタフォーマットに変換させる。

これは、クライアントにPostScriptドライバ(プリンタが非PostScriptモデルであっても。CUPSサーバ上でのドライバがあることも要求する)を使うことを要求する。

最初に、Samba経由でのCUPSベースの印刷を有効にするため、以下のオプションを`smb.conf`ファイルの`[global]`セクションに設定すべきである:

`printing = cups`
`printcap = cups`

これらのパラメータが指定されると、`smb.conf`中の(Sambaそれ自身と同様)、すべての手動設定した印刷ディレクティブ(たとえばprint commandかlppause command)は無視される。その代わりSambaは、SambaがCUPSライブラリ(libcups)をサポートするようにコンパイルされているとき、CUPS APIを通してCUPSと直接やりとりする。他の印刷コマンドが設定されていない場合、印刷は、-orawオプションを自動的に付けてパススルーする、System VAT&Tコマンドセットを使う(もし、コンパイル時にCUPSサポートをするようしたSambaサーバで動作するよう、個別に定義した印刷コマンドを使いたい場合、単にclassicalprinting = sysvを使う)。これはCUPS/Sambaサーバ経由での印刷ダイアグラムで図示されている。

Figure 22.15. CUPS/Sambaサーバ経由での印刷

### Sambaによるジョブファイルの受け取りとCUPSへの引き渡し

Sambaはそれ固有のスプールディレクトリ(path = /var/spool/sambaに類似したもので設定される)を、`smb.conf`の`[printers]`か`[printername]`セクション中で使わなければならない。Sambaは固有スプール空間にジョブを受け取り、CUPSのスプールディレクトリ(CUPSのスプールディレクトリは、既定値が`RequestRoot /var/spool/cups`である、`RequestRoot`ディレクティブ行で設定される)中に渡す。CUPSはそのスプールディレクトリのアクセス権限を検査し、毎回の再起動に備えて適切な値にそれをリセットする。SambaとCUPSで共通のスプール空間を使う例は滅多に見たことがなく、何週間もこの“問題”と苦闘してきた。

WindowsユーザはSambaでのみ認証する(構成されるどんな手段でも)。もしもSambaがCUPSと同じホストで動作しているならば、印刷においては“localhost”のみ許可しなければならない。もしも異なったマシンで動作しているならば、CUPSで印刷できるように、Sambaホストがアクセス権を得られるようにしておかねばならない。

## ネットワーク PostScript RIP

この節では、クライアントがCUPS-PPDと一緒にPostScriptドライバを使うようにさせる、サーバの設定上でのCUPSフィルタの使い方について議論する。

PPDはすべての印刷デバイスオプションを制御できる。もしも、固有のPostScriptプリンタを持っているならば、すなわちこれらは通常開発元によって提供される。PPDファイルは、つねに、Microsoft WindowsまたはApple Mac OSシステム上でのPostScriptプリンタドライバのコンポーネントである。それらはユーザが選択できる印刷オプション、適切なPostScriptへのマッピング、対象プリンタ用のPCLあるいはPJLコマンドを含むASCIIファイルである。プリンタドライバGUIダイアログはこれらのオプションを“その場で”ユーザが選択できる、ボタンとドロップダウンリストに変換する。

CUPSは、何らの変換なしに、任意のWindows(NTが推奨される)PostScriptドライバからのPPDファイルロードでき、それらのオプションを扱える。印刷オプションのためのWebブラウザインタフェース(http://localhost:631/printers/を選択し、そこにあるConfigure Printerボタンをクリック)か、コマンドラインインタフェース(`man lpoptions`か、システム上にあるならば、`lphelp`を参照)がある。これらはユーザへのPPDオプションを提供出来るLinux/UNIX上のGUIフロントエンドとは若干異なる。PPDオプションは通常、実際ののPostScriptプリンタ上のPostScript RIPによって評価される事を意味する。

### UNIX上の、非PSプリンタのためのPPD

CUPSはそのPPDの使用にあたっては“実際の”PostScriptプリンタだけにに制限されない。CUPS開発者は非PostScriptプリンタに対してもCUPS-PPDを使って有効なデバイスとドライバオプションを記述するPPDコンセプトの範囲を拡張した。

CUPSは完全なPostScriptインタプリタ(RIP)を含んでいるため、これは合理的である。RIPはGhostScriptをベースにしている。これはクライアントからすべてのPostScript(と更に追加で、その他のファイル形式)を受け取り処理できる。すべてのCUPS-PPDは、キーワード`*cupsFilter`で始まる追加の行を含んでいると非PostScriptプリンタにギアを切り替える。この行はCUPS印刷システムに、受け取ったPostScriptを解釈するためのプリンタ固有のフィルタを使うように告げる。そのため、そのプリンタに対してPostScript RIPとして振る舞うことが出来るため、そのクライアントに対してPostScriptデバイスとしてそのすべてのプリンタを見せるようにし、受け取ったPostScriptコードを適切なラスタ印刷形式に処理する。

### Windows上の非PostScriptプリンタのためのPPD

Windowsクライアントでは“中核の”PostScript ドライバに加えて CUPS-PPD も利用可能である。（ただし現在は CUPS PostScriptDriver for Windows NT/200x/XP が推奨されている。これを使うと、制限付きながら Adobe のドライバが利用できる）。CUPS-PPD を使う場合、他のスプーラではできない機能のいくつかを CUPS が利用できるようになる。

- 統一した方法で、すべてのクライアントプラットフォームから、ネットワーク対応の 印刷ファイルを扱うPostScript RIPとして振る舞う。

- すべてのファイルがpstopフィルタを通し、その結果`page_log`に 記録されるため、CUPSの集中アカウント件請求サーバとして振る舞う。 注意:これは、常時定義毎にフィルタなしが存在するため、 “raw”印刷ジョブでは該当しない。

- たくさんの異なった対象プリンタがあっても、クライアントが、単一のPostScript ドライバに集約することが出来るようになる。

Windowsクライアント上のCUPS PPDを使うと、すべての印刷ジョブ設定をUNIXクライアントが出来るように制御する事が出来るようになる。

## CUPSクライアントとしてのWindowsターミナルサーバ (WTS)

この設定は、WTS環境で大きな問題を体験している人にとって、特別な興味を引くかもしれない。WTSはしばしば、そのクライアントの数多くのプリンタモデルを動かすために､多数の非PostScriptプリンタドライバをインストールする必要がある。これはしばしば非常に不安定性を増大させる。

### “カーネルモード”でのプリンタドライバの実行は多くの問題を引き起こす

“カーネルモード”で動作するWindows NTプリンタドライバは、ドライバが安定せず、よくテストされていない場合には、システムの安定性にとって高いリスクとなる。そして、できの悪いドライバはたくさんあるのである!特に、悪名高いものは、ジョブの終了時にサウンドカード経由でユーザに通知を行う追加のサウンドモジュールが動くものを持っているPCLドライバが例である。通常使っていて、“ブルースクリーン”をこれが出してしまうと言うことを言う必要があるだろうか?

PostScriptドライバは一般的によくテストされている。カーネルモードで動作したとしても、それらが何かの問題を引き起こすことは知られていない。これは2つの異なったPostScriptドライバが現在存在しているという事によるのかもしれない。1つはAdobeのものであり、もう1つはMicrosoftのものである。両方ともよくテストされ、Windows上で想像できるように安定している。CUPSドライバはマイクロソフトのもの由来である。

### Workarounds Impose Heavy Limitations

回避方法として、サイト管理者は、WTS上にインストールされる許可されたドライバを、1つの汎用PCLと1つのPostScriptドライバだけに制限するという方針を選んだ。しかしこれは、クライアントが使う事が出来るたくさんの印刷オプションを制限することになる。異なったドライバによって制御される場合、そのデバイスはより良い動作が出来るはずが、しばしば、1つの標準ペーパトレイでの単純な印刷よりも複雑なことが出来なくなる!

### CUPS: A “Magical Stone”?

PostScriptドライバを使い、CUPS-PPDを有効にすることは、すべてのこれらの欠点を解決するとてもエレガントな方法に見える。これらは使用するWindows OSバージョンに依存する、最大3つの異なったドライバ、すなわちAdobe、MicrosoftとCUPS PostScriptドライバが現在有効である。WTS上で大きな安定性の問題を引き起こすことは、上記3つのどれも知られていない(たとえ、たくさんの異なったPPDを使ったとしても)。クライアントは(再度)ペーパトレイ、両面印刷やその他の設定を選択できる。しかし、確かな代価もある:そのクライアントに対して、CUPSサーバはPostScript RIPとして振る舞い、“raw スプール”デバイスとして振る舞うよりもよりCPUとメモリを必要とする。更に、この設定は、最初のフィードバックがとても有望ではあるが、広範囲にはテストされていない。

### カーネルモードでもPostScriptドライバは大きな問題はない

より新しいW200xとに同梱されているXPプリンタドライバでは、Windows NTとは異なり、カーネルモードでは動作しない。ただし、両OS共に、引き続き、カーネルモードで動作するドライバを使う事は可能である(端的に言って、サブディレクトリ“W32X86”中の“2”にあるドライバが、“古い”ものかだと思って良いだろう)。以前に説明したように、AdobeのものはMicrosoft PostScriptドライバのように安定している。CUPSドライバはMicrosoftベースである。これは次のような理由による。Visual Studioのライセンスを持つ人が無償で使える、Windows NT用のMicrosoftのDDK(Device Development Kit)は、Microsoftがライセンスを持つドライバのソースコードが含まれる。Visual Studioのライセンスを持つ人は、自分が作るドライバの開発作業に、そのコードを使用し、変更する事が許可されている。CUPSではこのように開発されている。しかし、Microsoftのライセンスは、(DDKの部分を含む)ソースコード全体を公開することは許可していない。しかし、CUPSは、GPL配下で“差分”をリリースしている。そのため、もしも“MS DDK for Windows NT”のライセンスを持っていれば、差分コードを使い、ドライバを自分自身で調べる事が出来る。

## ドライバダウンロードを行うためのCUPSの設定

前に説明したように、ダウンロードのためにSambaサーバ上でクライアントプリンタドライバを準備するためと、Windowsワークステーションの利便性のためのポイントアンドプリントのための、すべての以前に知られている方法も、CUPS上で動作する。これらの方法は旧式の印刷サポートで説明されている。実際は、これは真のSambaビジネスで、Samba-Windowsクライアントの連携にのみ関連している。

### cupsaddsmb: 不明なユーティリティ

`cupsaddsmb`ユーティリティ(現在すべてのCUPSバージョンに同梱)は、Sambaの`[print$]`共有中に、プリンタドライバを転送する別の解である。思い出してほしいのは、この共有は、クライアントが、ドライバが配布されると期待し、ダウンロードとインストールのためにセットアップする場所であるということである。これは、とても簡単に、任意の(か全部の)インストールされたCUPSプリンタの共有が出来るようになる。`cupsaddsmb`は、Adobe PostScriptドライバを、最近開発されたWindows NT/200x/XP用のCUPS PostScriptドライバと同様に使うことが出来る。`cupsaddsmb`は、ベンダプリンタドライバと一緒に動作することはできず、そのマニュアルページ中に名前があるドライバと同じもののみ動作する。

CUPSプリンタドライバはCUPSダウンロードサイトにある。そのパッケージ名は`cups-samba-[version].tar.gz`である。これには以下のような数多くの利点があるので、Adobeドライバよりも好まれる:

- より正確なページ印刷情報をサポートする。

- すべてのプリンタで、バナーページとページラベルをサポートする。

- 数多くのジョブのIPP属性の設定をサポートする (たとえば、ジョブの優先度、ページラベルとジョブの費用請求など)

しかし、現在Windows NT,2000とXPのみがCUPSドライバによってサポートされている。もしも、Windows95、98とMEクライアントのサポートが必要ならば、Adobe Driverのそれぞれの部分を入手する事も必要である。

### `cupsaddsmb`用の`smb.conf`の準備

`cupsaddsmb`を走らせる前に、cupsaddsmb使用のための`smb.conf`で示されるように、`smb.conf`を設定する必要がある。

Example 22.3. cupsaddsmb使用のためのsmb.conf

`[global]`
`load printers = yes`
`printing = cups`
`printcap name = cups`
`[printers]`
`comment = All Printers`
`path = /var/spool/samba`
`browseable = no`
# setting depends on your requirements
`guest ok = yes`
`writable = no`
`printable = yes`
`printer admin = root`
`[print$]`
`comment = Printer Drivers`
`path = /etc/samba/drivers`
`browseable = yes`
`guest ok = no`
`read only = yes`
`write list = root, @smbprintadm`

### Windows NT/200x/XP用のCUPS“PostScript Driver”

CUPSユーザはhttp://www.cups.org/software.htmlから正確に同じパッケージを入手できる。これは、CUPSベースのソフトウェアファイルから分離されたパッケージで、CUPS 1.1.x Windows NT/200x/XP Printer Driver for Samba (tar.gz,192k)とタグづけられている。ダウンロードするファイル名は`cups-samba-1.1.x.tar.gz`である。tar.gzファイルを解凍後、以下のファイルが展開される:

    root# tar xvzf cups-samba-1.1.19.tar.gzcups-samba.installcups-samba.licensecups-samba.readmecups-samba.removecups-samba.ss

これらはESPメタパッケージャソフトウェアEPMでパッケージ化されている。`*.install`と`*.remove`ファイルは簡単なシェルスクリプトで、`*.ss`のtarファイルを展開したものである(`*.ss`は、“tar”によって回答できる、tarアーカイブ以外の何者でもない)。次に、これは内容物を`/usr/share/cups/drivers/`に置く。この内容物は以下のファイルを含む:

    root# tar tv cups-samba.sscupsdrvr.dllcupsui.dllcups.hlp

`cups-samba.install`シェルスクリプトは簡単に扱える:

    root# ./cups-samba.install[....]Installing software...Updating file permissions...Running post-install commands...Installation is complete.

スクリプトは`/usr/share/cups/drivers/`ディレクトリ中にドライバファイルを自動的に置く:

    root# cp /usr/share/drivers/cups.hlp /usr/share/cups/drivers/

### Warning

バグのために、ある最近のCUPSリリースでは、`cups.hlp`ドライバファイルを`/usr/share/cups/drivers/`の代わりに`/usr/share/drivers/`中に置いてしまう。これを直すためには、手動で正しい場所にファイルをコピー/移動する(`./cups-samba.install`スクリプト実行後)。

この新しいCUPS PostScriptドライバは現在バイナリのみである。しかし、無料で使える。(まだ)完全なソースコードは提供されていない。その理由は、Microsoft DDKの手助けを得てMicrosoft Visual Studio 6でコンパイルしつつ、開発されているからである。ドライバ開発者はフリーソフトウェアとしてソースコード全体を配布する許可を得ていない。しかし、CUPS開発者はGPL配下でソースコードの“差分”をリリースしているので、Visual StudioとDDKのライセンスを持つ人は誰でも自分自身でコンパイルすることが出来る。

### 異なったドライバファイルの認識

CUPSドライバは古いWindows 95/98/Meをサポートせず、Windows NT/2000/XPクライアントのみサポートする。

Windows NT, 2000と XPは以下でサポートされる:

- cups.hlp

- cupsdrvr.dll

- cupsui.dll

古いWindows 95/98/MeのためのAdobeドライバはWindows NT/2000/XPクライアントと同じように提供されている。ファイルの組み合わせは異なったプラットフォームでは異なる。

Windows 95, 98と MEは以下でサポートされる:

- ADFONTS.MFM

- ADOBEPS4.DRV

- ADOBEPS4.HLP

- DEFPRTR2.PPD

- ICONLIB.DLL

- PSMON.DLL

Windows NT, 2000, と XPは以下でサポートされる:

- ADOBEPS5.DLL

- ADOBEPSU.DLL

- ADOBEPSU.HLP

### Note

もしも、Windows NT/2000/XPサポート用の、AdobeドライバファイルとCUPSドライバファイルの両方がサーバ上に現在インストールされているならば、Adobeファイルは無視されCUPSファイルが使われる。もしも理由がなんであれ、Adobeのみのドライバを使いたいと思うのであれば、3つのCUPSドライバをどこかに移動すること。Windows 9x/Meクライアントはどんな場合にもAdobeのドライバを使う。

### ドライバファイルの入手

Adobeドライバファイルの入手は、多くのユーザにとって予想外に難しいように見える。それらはAdobe Webサイトに1つのファイルとして見えているわけではなく、自己解凍か自動インストールを行うWindows-.exeファイルを見つけるのも難しい。おそらく内蔵されたネイティブなインストーラを使用しなければならず、クライアント上で一回はインストールプロセスを動かすことが必要である。これは、クライアント上ローカルにドライバ(と1つの汎用PostScriptプリンタ)をインストールする。それらがインストールされた後、汎用PostScriptプリンタを共有する。この作業後、クライアントの`[print$]`共有は、CUPSホストからsmbclientで入手可能なAdobeファイルを保持する。

### Windows NT/200x/XP用のESP Print Pro PostScriptドライバ

ESP Print ProソフトウェアのユーザはAdobe PostScriptドライバの代替として、ESCプリントドライバパッケージをインストールすることが出来る。これを行うために、Easy SoftwareWebサイトで、ESC Print Proソフトウェアの通常のダウンロード領域からドライバファイルを検索できる。Download Printer Drivers for ESP Print Pro 4.x領域の間で“SAMBA”と名前が付いたリンクを探し、パッケージをダウンロードする。一度インストールすると、Printer Manager GUI中の中のメニューの、Export Driver...を選択して、プリンタを単にハイライトさせることによって任意のドライバを準備できる。もちろん、ドライバファイルを扱うために、あらかじめ準備されたSambaが必要である。すなわち、`[print$]`共有を設定することなどである。ESP Print ProパッケージにはWindows 95/98/Meクライアントファミリ用の(ライセンスされた)Adobeドライバ一式と同様にCUPSドライバファイルが含まれている。

### 考慮すべき警告

一度インストールスクリプト(と、`/usr/share/cups/drivers/`への`cups.hlp`ファイルの手動での移動)を実行すると、ドライバはSambaの`[print$]`共有(これはしばしば`/etc/samba/drivers/`にマップされ、WIN40とW32X86という枝を持つサブディレクトリを含む)中に、ドライバが配置できるようになる。これは、`cupsaddsmb`を動かすことによって行える(CUPSリリース1.1.16以降では`man cupsaddsmb`も参照)。

### Tip

`smbpasswd`を動かしてrootをsmbpasswdファイル中に格納する必要があるかもしれない。もしも、全体の手順を最初に動かすときに、これは、特に重要であり、Windowsドメインコンピュータでのシングルサインオン用にすべてが設定されている環境中では動かない。

いったんドライバファイルが`[print$]`共有に置かれ、初期化されると、それらはダウンロード可能になり、Windows NT/200x/XPクライアントによってインストールされる。

### Note

Windows 9x/MeクライアントはCUPS PostScriptドライバでは動かない。それらには前述の通り、`ADOBE*.*`ドライバを使うことが引き続き必要である。

### Note

もしも、`/usr/share/cups/drivers/`ディレクトリ中に以前のインストールによる`ADOBE*.*`ドライバファイルが引き続きあるならば、それは無害である。

### Note

使用しているWindowsクライアントが、Adobe PostScriptドライバ用の古い`ADOBE*.*`ファイルがインストールされていると、新しいWindows NT/200x/XP用のCUPS PostScriptドライバのダウンロードとインストールは最初に失敗する。最初にクライアントから古いドライバを消し去る必要がある。もしも、プリンタを再インストールしようとしたときのために、ドライバファイルはクライアントによって引き続き保存され、再利用されることによりプリンタを“削除”するだけでは十分ではない。クライアント上のAdobeドライバファイルを完全に取り除くためには、まずプリンタフォルダを開き(おそらくスタート -> 設定 -> コントロールパネル ->プリンタ)、フォルダの背景を右クリックし、ドライバタブを選択する。一覧表示上で削除したいドライバを選択し、削除ボタンをクリックする。これは1つも特定のドライバを使うプリンタが残っていないときに動作する。まず初めにプリンタフォルダ中でこのドライバを使うすべてのプリンタを“削除”する必要がある。これを行うには管理者権限が必要である。

### Note

一度クライアントにCUPS PostScriptドライバをダウンロードすると、旧式の印刷サポートで説明したような手続きで、すべてのプリンタを簡単に切り替えることが出来る。プリンタのプロパティダイアログを動かすことか、`setdriver`サブコマンドを指定した`rpcclient`を使うことのどちらかで、存在するプリンタのドライバを切り替えられる。

### WindowsのCUPS PostScriptドライバ対Adobeドライバ

CUPSとAdobe PostScriptドライバの比較に興味があるだろうか?我々の目的のために、Are you interested in a comparison between the CUPS and the Adobe PostScript drivers? For our purposes, theseare the most important items that weigh in favor of CUPS:

- Adobe EULAに縛られない。

- “ADOBE*.*ドライバファイルをダウンロードできる所はどこか?” という質問に縛られない。

- Adobe ドライバ(sれに関連するプリンタのPPD要求において)はしばしば印刷ファイルの メイン部分の先頭にPJLヘッダを置く。そのため、印刷ファイルは `%!PS`の代わりに`<1B>%-12345X`か `%-12345X`で始まる。これはCUPSデーモンが入力 ファイルを印刷可能なファイルと自動タイプすることをさせるようにし、 `pstops`フィルタ経由で初期化しない(もう少し技術的に言うと、 これは一般的なMIMEタイプ `application/postscript`と見なされないが、より特別な MIMEタイプである `application/cups.vnd-postscript`とみなす)ので、 `/var/log/cups/page_log`中におけるページの計数は正確な ページ数を受け取れない。その代わりに標準的な設定では、ダミーのページ数 “1”が記録される。

- Adobeドライバは、それによって生成するPostScriptを間違って 設定するいくつかのオプションがある (CUPSがそれを処理することが出来ないようにしてしまう、 Optimize for Speedを、 Optimize for Portabilityの代わりに、うっかりして 設定してしまう)。

- WindowsクライアントによるCUPSサーバへのCUPS PostScriptドライバの 出力は、汎用MIMEタイプ`application/postscript`として 自動タイプされ、CUPS `pstops`フィルタに渡され、会計と quota目的のために`page_log`中に正しいページ数を記録する。

- CUPS PostScriptドライバは、Windows NT/200x/XPクライアントによる、追加の標準(IPP) 印刷オプションを送信することをサポートする。そのような追加印刷オプションは、 CUPS標準バナーページ(かカスタムなもので、ドライバは ダウンロード時点でインストールされるべき)と名前を付けられ、CUPSページラベル オプションを使い、ジョブのプライオリティを設定し、(将来、追加の便利な IPPジョブ属性をサポートするオプションで)印刷予定時間を設定する。

- CUPS PostScriptドライバは、PostScriptファイルの先頭に、新しい `*cupsJobTicket`コメントの挿入をサポートする (これは、将来、すべての種類のCUPS上での便利な拡張のために使われるが、 これがコメントとして扱われ、単に無視されるため、任意の他の アプリケーションのじゃまをしない)。

- CUPS PostScriptドライバは、近々リリースされる、 Windows NT/200x/XP用の完全なCUPS IPPクライアントの心臓部である (おそらく最初のCUPS 1.2のβリリースと一緒に)。

### cupsaddsmbの実行(Quiet Mode)

`cupsaddsmb`コマンドは、必要とされるファイルを`[print$]`共有にコピーする。さらに追加で、このプリンタに関連づけられているPPDは、`/etc/cups/ppd/`から`[print$]`にコピーされる。これらファイルはポイントアンドプリント経由でWindowsクライアントのインストールの都合のために待機している。コマンドを正しく実行できる前に、Sambaに対して認証を行っておく必要がある。小さなネットワーク環境では、おそらくユーザレベルのセキュリティ(security = user)を使っているだろう。

以下は、正しく動く`cupsaddsmb`コマンドの例である:

    root# cupsaddsmb -U root infotec_IS2027Password for root required to access localhost via Samba: ['secret']

すべてのプリンタとドライバを共有するために、プリンタ名の代わりに`-a`パラメータを使う。`cupsaddsmb`がプリンタドライバをSambaに“エクスポート”してから、CUPSドライバに関連づけられているキューのみ動作することは明白になるべきである。

### 詳細な結果を表示するcupsaddsmbの実行

おそらく何が起きているかを見たいのだと思う。より詳細な出力は、`-v`パラメータを使う。可読性向上のために下記の出力には手を入れてある。すべての行末の“\”は手動で入れてあり、そのほかにインデントもしている:

    root# cupsaddsmb -U root -v infotec_2105Password for root required to access localhost via GANDALF:Running command: smbclient //localhost/print\$ -N -U'root%secret' \    -c 'mkdir W32X86; \    put /var/spool/cups/tmp/3e98bf2d333b5 W32X86/infotec_2105.ppd; \	put /usr/share/cups/drivers/cupsdrvr.dll W32X86/cupsdrvr.dll; \    put /usr/share/cups/drivers/cupsui.dll W32X86/cupsui.dll; \    put /usr/share/cups/drivers/cups.hlp W32X86/cups.hlp'added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]NT_STATUS_OBJECT_NAME_COLLISION making remote directory \W32X86putting file /var/spool/cups/tmp/3e98bf2d333b5 as \W32X86/infotec_2105.ppdputting file /usr/share/cups/drivers/cupsdrvr.dll as \W32X86/cupsdrvr.dllputting file /usr/share/cups/drivers/cupsui.dll as \W32X86/cupsui.dllputting file /usr/share/cups/drivers/cups.hlp as \W32X86/cups.hlp  Running command: rpcclient localhost -N -U'root%secret'    -c 'adddriver "Windows NT x86"   \   "infotec_2105:cupsdrvr.dll:infotec_2105.ppd:cupsui.dll:cups.hlp:NULL: \    RAW:NULL"'cmd = adddriver "Windows NT x86" \   "infotec_2105:cupsdrvr.dll:infotec_2105.ppd:cupsui.dll:cups.hlp:NULL: \	RAW:NULL"Printer Driver infotec_2105 successfully installed.  Running command: smbclient //localhost/print\$ -N -U'root%secret' \-c 'mkdir WIN40; \    put /var/spool/cups/tmp/3e98bf2d333b5 WIN40/infotec_2105.PPD; \	put /usr/share/cups/drivers/ADFONTS.MFM WIN40/ADFONTS.MFM;   \    put /usr/share/cups/drivers/ADOBEPS4.DRV WIN40/ADOBEPS4.DRV; \    put /usr/share/cups/drivers/ADOBEPS4.HLP WIN40/ADOBEPS4.HLP; \    put /usr/share/cups/drivers/DEFPRTR2.PPD WIN40/DEFPRTR2.PPD; \	put /usr/share/cups/drivers/ICONLIB.DLL WIN40/ICONLIB.DLL; \	put /usr/share/cups/drivers/PSMON.DLL WIN40/PSMON.DLL;'  added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0  Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]  NT_STATUS_OBJECT_NAME_COLLISION making remote directory \WIN40  putting file /var/spool/cups/tmp/3e98bf2d333b5 as \WIN40/infotec_2105.PPD  putting file /usr/share/cups/drivers/ADFONTS.MFM as \WIN40/ADFONTS.MFM  putting file /usr/share/cups/drivers/ADOBEPS4.DRV as \WIN40/ADOBEPS4.DRV  putting file /usr/share/cups/drivers/ADOBEPS4.HLP as \WIN40/ADOBEPS4.HLP  putting file /usr/share/cups/drivers/DEFPRTR2.PPD as \WIN40/DEFPRTR2.PPD  putting file /usr/share/cups/drivers/ICONLIB.DLL as \WIN40/ICONLIB.DLL  putting file /usr/share/cups/drivers/PSMON.DLL as \WIN40/PSMON.DLL    Running command: rpcclient localhost -N -U'root%secret' \   -c 'adddriver "Windows 4.0"      \   "infotec_2105:ADOBEPS4.DRV:infotec_2105.PPD:NULL:ADOBEPS4.HLP: \   PSMON.DLL:RAW:ADOBEPS4.DRV,infotec_2105.PPD,ADOBEPS4.HLP,PSMON.DLL, \    ADFONTS.MFM,DEFPRTR2.PPD,ICONLIB.DLL"'	cmd = adddriver "Windows 4.0" "infotec_2105:ADOBEPS4.DRV:\	infotec_2105.PPD:NULL:ADOBEPS4.HLP:PSMON.DLL:RAW:ADOBEPS4.DRV,\	infotec_2105.PPD,ADOBEPS4.HLP,PSMON.DLL,ADFONTS.MFM,DEFPRTR2.PPD,\	ICONLIB.DLL"  Printer Driver infotec_2105 successfully installed.    Running command: rpcclient localhost -N -U'root%secret'  \   -c 'setdriver infotec_2105 infotec_2105'  cmd = setdriver infotec_2105 infotec_2105  Successfully set infotec_2105 to driver infotec_2105.

### Warning

出力結果上ではSambaアカウントのためのrootパスワードが表示されている。

もし、しっかり見た場合、ネットワーク上で暗号化されていないrootパスワードが転送されていることを発見するはずなので、注意するように。また、もしもさらによく見てみると、出力中にNT_STATUS_OBJECT_NAME_COLLISIONというようなエラーメッセージを見つけるだろう。これは、WIN40とW32X36というディレクトリが(以前のドライバインストールにより)すでに`[print$]`というドライバダウンロード共有中に存在している時に発生する。これらは問題のないエラーメッセージである。

### cupsaddsmbについて理解する

何が起きたのか?`cupsaddsmb`は何をしたのか?手順には5つのステージがある:

1. IPP経由でCUPSサーバを呼び出し、その名前のプリンタ用のドライバファイルとPPDファイルを要求する。

2. ローカルのTEMPDIR中(`cupsd.conf`で定義されている)に、 ファイルを一時的に格納する。

3. smbclient経由でSambaサーバの`[print$]`共有に 接続し、共有のWIN40(Windows 9x/Me用)とW32X86(Windows NT/200x/XP用)サブディレクトリ 中にファイルを書き込む。

4. rpcclient経由でSambaサーバに接続し、正しいパラメータで`adddriver` コマンドを実行する。

5. rpcclient経由でSambaサーバにもう一度接続し、`setdriver`コマンドを実行する。

### Note

1番目のリモートホストとしてSambaホストを、2番目のリモートホストとしてCUPSホストを指定するためのパラメータを付けて`cupsaddsmb`ユーティリティを実行できる。特に、もしもより深く理解したい場合、何が起きたかをより明快にするためにテストしてみるのは良いことである(実際には、ほとんどの人はCUPSとSambaサーバを同じホストで動作させている):

    root# cupsaddsmb -H sambaserver -h cupsserver -v printer

### もしもcupsaddsmbが正しく終了した場合、どのように認識するか

もしもユーティリティがすべてのフィールドで正しく終わった場合、常時検査をしなければならない。少なくとも出力中の、以下の3つのメッセージをチェックする必要がある:

1. Printer Driver infotec_2105 successfully installed. # (for the W32X86 == Windows NT/200x/XP architecture).

2. Printer Driver infotec_2105 successfully installed. # (for the WIN40 == Windows 9x/Me architecture).

3. Successfully set [printerXPZ] to driver [printerXYZ].

これらのメッセージはおそらく一般的な出力中では簡単に認識できない。もしも(ダウンロードのための、すべての有効なプリンタドライバを準備しようとする)`-a`オプションを付けて`cupsaddsmb`を動かした場合、もしも個々のプリンタドライバに、正しくにインストールすることに関して問題がある場合、失敗するかもしれない。出力のリダイレクトは、結果を解析することを手助けする。

もしも下記のメッセージが出た場合:

    SetPrinter call failed!result was WERR_ACCESS_DENIED

これは、このプリンタに対してuse client driver = yesという設定がされているかもしれないということを意味する。この設定を“no”にすると、この問題が解決する。`smb.conf`マニュアルページ中の、`use client driver`についての説明を参照のこと。

### Note

もしも、verboseモードで`cupsaddsmb`を動かしていないと、何らかの診断出力を得るのは不可能である。そのため、既定値であるquietモードを使わないことを強く推奨する。quietモードを使うと、発生するかもしれない何らかの問題を隠してしまうだろう。

### Samba PDCににおけるcupsaddsmb

Samba PDC上で動かすために、標準の`cupsaddsmb`コマンドは動かないのか?認証のためにパスワードを繰り返し聞かれ、コマンドは全く起動しないのか?以下にある応用のどれかを試してみてほしい:

    root# cupsaddsmb -U MIDEARTH\\root -v printernameroot# cupsaddsmb -H SAURON -U MIDEARTH\\root -v printernameroot# cupsaddsmb -H SAURON -U MIDEARTH\\root -h cups-server -v printername

(2つのバックスラッシュに注意:最初のものは二番目のものに対する“escape”である)。

### cupsaddsmbフローチャート

cupsaddsmbフローチャートは、`cupaddsmb`の処理手順、コマンドフローとデータフローを示すチャートである。再度注意:cupsaddsmbはraw印刷キューと一緒に動かないし、そういうことを意図してもいない!

Figure 22.16. cupsaddsmbのフローチャート

### クライアント上でのPostScriptドライバのインストール

`cupsaddsmb`の完了後、ドライバは、クライアントから使えるようになる。以下は、ポイントアンドプリント経由でダウンロードしインストールするために行わなければならない手順である。Windowsクライアントから、CUPS/Sambaサーバをブラウズする:

- ネットワークコンピュータ中のSambaのプリンタ共有を開く

- 問い合わせ(question)中のプリンタを右クリックする

- 開いたコンテキストメニューから下記を選択する インストール... あるいは 接続... (使用しているWindowsのバージョンに依存する)

数秒後、クライアントのローカルプリンタフォルダ中に新しいプリンタが現れる。Windows XP上では、Sambaサーバ上のプリンタ名という名前が付けられている(現在多くの場合kde-bitshop上のinfotec_2105のようになる)。もしもMicrosoft Wordのようなアプリケーションから、テストと最初のジョブを送りたい場合、有効なプリンタ一覧のドロップダウンリスト中に、`\\SambaServer\PrinterName`というエントリで新しいプリンタが現れる。

`cupsaddsmb`はCUPSバージョン1.1.15以上とSamba バージョン2.2.4以降でのみ確実に動作する。もしも動かない場合か、クライアントへの自動プリンタダウンロードが成功しないばあい、クライアント上でAdobe PostScriptドライバのtop ofのCUPSプリンタPPDを手動でインストールトーすすることができる。次に、UNCタイプの接続のために、クライアントのプリンタキューをSambaプリンタ共有に指定する:`cupsaddsmb` will only reliably work with CUPS version 1.1.15 or higher and with Sambaversion 2.2.4, or later. If it does not work, or if the automatic printer driver download to the clients doesnot succeed, you can still manually install the CUPS printer PPD on top of the Adobe PostScript driver onclients. Then point the client's printer queue to the Samba printer share for a UNC type of connection:

    C:\> net use lpt1: \\sambaserver\printershare /user:ntadmin

これは、CUPSでネットワークされたPostScript RIP機能を使用することが出来るようになる(ユーザ“ntadmin”はプリンタ共有にアクセスするための必要な権限を持つ有効なSambaユーザである必要がある)。これは、従来からのLanManによる方法(MS-RPCを使わない)でプリンタの接続を設定する。

### クライアント上での危険なPostScriptドライバ設定を防止する

印刷が動作するが、まだ問題があるとする。ほとんどのジョブは正しく印刷するが、いくつかは全く印刷できない。いくつかのジョブは、とても良いとは見えないフォントの問題を抱えている。いくつかのジョブは速やかに処理されるが、いくつかはとても遅い。これらの問題の多くは、いくつかのガイドラインに従うことで、劇的に軽減できるか、完全になくなる。思い出してほしいが、もしも使用している印刷デバイスがPostScriptが有効でない場合、使用しているクライアントドライバの設定が生成する出力を使って、CUPSホスト上でのGhostscriptインストールを取り扱ているはずである。以下のようにうまく処理するようにする:

- Optimize for Speedという設定のPostScript出力オプションを抑制する。その代わりに Optimize for Portabilityを使用する(Adobe PostScriptドライバ)。

- Page Independenceを使わない:設定なしにする。その代わりに、Page Independence: YES とする(CUPS PostScriptドライバ)。

- 推奨はTrue Typeフォントダウンロードオプション:Native True Type over Automatic and Outline である。なんとしてもBitmapを避けるべきである(Adobe PostScriptドライバ)。

- True Typeフォントを選択する:Download as Softfont into Printer over the default Replace by Device Font (Adobeにおいては、各国のフォントは、出力を得るためにそれを戻す必要があるかもしれない。

- 時には、PostScript言語レベルを選択することが出来る:問題が発生した場合は 3のかわりに2を試してみる(Adobeにおいては、最新のESP Ghostscriptパッケージは レベル3のPostScriptをとてもうまく扱える)。

- PostScriptエラーハンドラにYesと答える(Adobe)。

## rpcclientを使ったPostScriptドライバファイルの手動インストール

もちろん、1つずつ、cupsaddsmbという便利なユーティリティ中に埋め込まれているすべてのコマンドを動かすことと、アップロードと、将来のクライアントダウンロードのためにドライバファイルを準備することは出来る。

1. Sambaを準備する(そこにあるべきプリンタの名前を使うCUPSプリントキュー。 ドライバを提供している。)

2. `[print$]`にファイルをコピー。

3. `rpcclient adddriverを動かす` (サポートしたい各クライアントアーキテクチャ毎に)。

4. Run `rpcclient setdriver.`

今これを行おうとしよう。最初に、最初の案を得るために、`rpcclient`のマニュアルを読む。印刷に関連するすべてのサブコマンドを見る:`enumprinters`,`enumdrivers`,`enumports`, `adddriver`と`setdriver`は最も興味があるものである。`rpcclient`はMS-RPCプロトコルの重要な一部を実装している。これをWindows NT(か200x/XP)に問い合わせ(とコマンド)を行うのにも使える。MS-RPCはWindowsクライアントによって使われ、とりわけ、ポイントアンドプリント機能に適合するために使われる。Sambaは今、同様にこれをまねることが出来る。

### rpcclientマニュアルページのチェック

最初に、`rpcclient`マニュアルページをチェックしよう。個々には2つの読むべきな文節がある:

`adddriver` は、サーバ上でプリンタドライバ情報をインストールするために、`AddPrinterDriver()`RPCを実行する。ドライバファイルは`getdriverdir`によって返されるディレクトリ中にすでに存在すべきである。`arch`が取れる値は`getdriverdir`コマンドのものと同じである。`config`パラメータは以下のように定義される:

    Long Printer Name:\Driver File Name:\Data File Name:\Config File Name:\Help File Name:\Language Monitor Name:\Default Data Type:\Comma Separated list of Files

任意の空白のフィールドは“NULL”という文字列を入力すべきである。

Sambaはプリントモニタというコンセプトをサポートする必要がないので、通信のために双方向リンクを使うことが出来るドライバがあるローカルプリンタのためにのみそれらは適用される。このフィールドは“NULL”にすべきである。リモートNT印刷サーバ上で、ドライバに対する印刷モニタはドライバを追加する前にすでにインストールされていなければならない。そうしないと、RPCは失敗する。

`setdriver` は、インストールされたプリンタに関連するプリンタドライバをアップロードするために、`SetPrinter()`コマンドを実行する。プリンタドライバはプリンタサーバ上にあらかじめ正しくインストールされている必要がある。

インストールされたプリンタとドライバの一覧を得るための、`enumprinters`と`enumdrivers`コマンドも参照のこと。

### rpcclientマニュアルページの理解

正確なフォーマットはマニュアルページによって明快にはならないので、空白を含むパラメータを扱う必要がある。以下は、それに対するもう少しわかりやすい説明である。ここではコマンドを改行し、改行は“\”で示している。通常、改行なしに1行でコマンドを記述するだろう:The exact format isn't made too clear by the man page, since you have to deal with someparameters containing spaces. Here is a better description for it. We have line-broken the command andindicated the breaks with “\”. Usually you would type the command in one line without the linebreaks:

    adddriver "Architecture" \   "LongPrinterName:DriverFile:DataFile:ConfigFile:HelpFile:\   LanguageMonitorFile:DataType:ListOfFiles,Comma-separated"

マニュアルページが示すものは、実際に存在する3つのコロンで分離されたフィールド中の、単純な``キーワードである。最後のフィールドは、複数の(あまり尋常でない場合では、異なった20のもの)ファイルである。これは、最初は混乱するように見えるかもしれない。“LongPrinterName”とマニュアルページが呼んでいるものは、実際では“ドライバ名”と呼ばれるべきである。これは自由に名前を付けられ、後で`rpcclient ... setdriver`コマンド中でこの名前を使える。実用的な理由で、多くはプリンタと同じ名前をドライバに付ける。What the man pages denote as a simple `` keyword in reality consists ofeight colon-separated fields. The last field may take multiple (in some very insane cases, even 20 differentadditional) files. This might sound confusing at first. What the man pages call the“LongPrinterName” in reality should be called the “Driver Name”. You can name itanything you want, as long as you use this name later in the `rpcclient ... setdriver`command. For practical reasons, many name the driver the same as the printer.

これは全く単純ではない。“どのファイルがドライバファイルをどうやったら分かるか”、各“データファイル”, “構成ファイル”, “ヘルプファイル”と“Language Monitorファイルの場合は?”という質問があるだろう。答えのために、共有プリンタを持つWindows NTがそれらのファイルをどのように提供しているかを見てみるのもよいかもしれない。覚えておいてほしいが、この全体の手続きはネットワーク上でWindowsコンピュータが発生させたトラフィックをモニタすることによってSambaチームにより開発されねばならなかったと言うことである。Windowsマシンに切り替えて、UNIXワークステーションからうまくアクセスしても良い。それが何を送っているかを見るために、`rpcclient`で問い合わせてもよく、より明快にするために、マニュアルページの理解を試みても良い。It isn't simple at all. I hear you asking: “How do I know which files are Driver File”,“Data File”, “Config File”, “Help File” and “Language MonitorFile in each case?” For an answer, you may want to have a look at how a Windows NT box with a sharedprinter presents the files to us. Remember that this whole procedure has to be developed by the Samba Team bylistening to the traffic caused by Windows computers on the wire. We may as well turn to a Windows box now andaccess it from a UNIX workstation. We will query it with `rpcclient` to see what it tells usand try to understand the man page more clearly.

### Producing an Example by Querying a Windows Box

We could run `rpcclient` with a `getdriver` or a`getprinter` subcommand (in level 3 verbosity) against it. Just sit down at a UNIX or Linuxworkstation with the Samba utilities installed, then type the following command:

    root# rpcclient -U'user%secret' NT-SERVER -c 'getdriver printername 3'

結果から、どれがどれであるか明快になるべきである。以下はインストールの例である:

    root# rpcclient -U'Danka%xxxx' W200xSERVER \    -c'getdriver "DANKA InfoStream Virtual Printer" 3'    cmd = getdriver "DANKA InfoStream Virtual Printer" 3 [Windows NT x86] Printer Driver Info 3:         Version: [2]         Driver Name: [DANKA InfoStream]         Architecture: [Windows NT x86]         Driver Path: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRIPT.DLL]         Datafile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\INFOSTRM.PPD]         Configfile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRPTUI.DLL]         Helpfile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRIPT.HLP]          Dependentfiles: []         Dependentfiles: []         Dependentfiles: []         Dependentfiles: []         Dependentfiles: []         Dependentfiles: []         Dependentfiles: []          Monitorname: []         Defaultdatatype: []

いくつかのプリンタドライバは`Dependentfiles`というラベルで、追加のファイルを一覧表示し、それらは最後のフィールドである`ListOfFiles,Comma-separated`中に押し込まれる。CUPS PostScriptドライバ用には、それらは不要で(Adobe PostScriptドライバも)、それゆえ、フィールドには“NULL”が入るだろう。Some printer drivers list additional files under the label `Dependentfiles`, and thesewould go into the last field `ListOfFiles,Comma-separated`. For the CUPS PostScriptdrivers, we do not need any (nor would we for the Adobe PostScript driver); therefore, the field will get a“NULL” entry.

### adddriverとsetdriverを完了させるための要求事項

マニュアルページから(と上記の`cupsaddsmb`の引用された出力から)、手動でのアップロードとドライバファイルの初期化を成功させるために、一定の状態を用意する必要があることが明確になる。2つの`rpcclient`サブコマンド(`adddriver`と`setdriver`)は、成功させるために、以下の前提条件を準備する必要がある:

- printer adminかroot(これはNTの “Printer Operators”グループではないが、 `smb.conf`の`[global]`セクションで定義されている printer adminグループ)で接続する。

- 要求されたドライバを`\\SAMBA\print$\w32x86` と`\\SAMBA\print$\win40`に、適切にすべてコピーする。 これらは、その後最終的に“0”と“2”という サブディレクトリで終わる。現時点では、それらをそこに 置いてはならない。それらは自動的に `adddriver`サブコマンドによって使われる(もしも共有中にドライバ ファイルを置くために、`smbclient`コマンドを使うならば、 “$”をエスケープする必要があることに注意。たとえば、 `smbclient //sambaserver/print\$ -U root.`)。 Copy all required driver files to `\\SAMBA\print$\w32x86` and `\\SAMBA\print$\win40` as appropriate. They will end up in the “0” respective “2” subdirectories later. For now, do not put them there; they'll be automatically used by the `adddriver` subcommand. (If you use `smbclient` to put the driver files into the share, note that you need to escape the “$”: `smbclient //sambaserver/print\$ -U root.`)

- 接続しているユーザは`[print$]`共有に 書き込みとサブディレクトリの作成が出来ねばならない。

- Windowsクライアント用に設定しようとしているプリンタは、 CUPSによってすでにインストールされている必要がある。

- CUPSプリンタはSambaによって認識されねばならない:さもないと、 `setdriver`サブコマンドは、NT_STATUS_UNSUCCESSFULというエラーで 失敗する。Sambaによってプリンタが認識されているかを調べるには、 `rpcclient`で`enumprinters`サブコマンドを 使うことが出来る。長く存在しているバグが、各smbdプロセスがSIGHUPを受け取るか、 再起動するまで、プリンタ一覧の適切な更新を阻害している。ごく最近CUPSプリンタを 作成して問題が発生した場合、Sambaを再起動することを覚えておいてほしい。

### 15ステップでの手動ドライバインストール

すべての要求されたコマンドを実行して、手動で、プリンタドライバをインストールしてみる。最初、これは複雑なプロセスなように見えるという理由で、手順を1つずつ、やらなければならない、単一のアクションアイテム毎に説明する。We are going to install a printer driver now by manually executing allrequired commands. Because this may seem a rather complicated process atfirst, we go through the procedure step by step, explaining everysingle action item as it comes up.

Procedure 22.2. 手動でのドライバインストール

1. CUPS上でのプリンタのインストール

       	root# lpadmin -p mysmbtstprn -v socket://10.160.51.131:9100 -E \				-P canonIR85.ppd

   これは、CUPSシステムに`mysmbtstprn`という名前のプリンタを インストールする。プリンタはソケット(JetDirectかDirect TCP/IPとして知られる) 接続経由で接続される。このステップはrootで行う必要がある。

2. (オプション)Sambaによってプリンタが認識されているかを調べる。

       root# rpcclient -Uroot%xxxx -c 'enumprinters' localhost \  | grep -C2 mysmbtstprnflags:[0x800000]name:[\\kde-bitshop\mysmbtstprn]description:[\\kde-bitshop\mysmbtstprn,,mysmbtstprn]comment:[mysmbtstprn]

   これは、一覧中にプリンタを表示する。層でなければ、Sambaデーモン(smbd)をいったん 止めて再起動するか、HUPシグナルを送る:

       root# kill -HUP `pidof smbd`

   再度チェックする。成功するまでトラブルシュートを繰り返し行う。 “description”行中に、2つのカンマの間に“空白”の フィールドがあることに注意。すでに1つ存在していれば、ドライバ名はここに現れる。 このステップと、この後のステップのほとんどのために、rootのSambaでのパスワード (`smbpasswd`コマンドによって設定される)を知っておく必要がある。 代わりに、`[print$]`に対して`smb.conf`中で “write list”として定義されているユーザからの1つで認証する事が出来る。

3. (オプション)プリンタに対するドライバをSambaが認識しているかを調べる。

       root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2'\ localhost | grep driver drivername:[]root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' \ localhost | grep -C4 drivservername:[\\kde-bitshop]printername:[\\kde-bitshop\mysmbtstprn]sharename:[mysmbtstprn]portname:[Samba Printer Port]drivername:[]comment:[mysmbtstprn]location:[]sepfile:[]printprocessor:[winprint] root# rpcclient -U root%xxxx -c 'getdriver mysmbtstprn' localhost result was WERR_UNKNOWN_PRINTER_DRIVER

   上記で示されている3つのコマンドのどれもドライバを表示しない。このステップはこの条件をデモンストレーションする目的で行われた。このステージにおけるプリンタへの接続の試みは、“The server does not have the required printer driver installed.”という行を表示する。

4. すべての要求されたドライバファイルをSambaの[print$]に置く。

       root# smbclient //localhost/print\$ -U 'root%xxxx' \	-c 'cd W32X86; \	put /etc/cups/ppd/mysmbtstprn.ppd mysmbtstprn.PPD; \ 	put /usr/share/cups/drivers/cupsui.dll cupsui.dll; \	put /usr/share/cups/drivers/cupsdrvr.dll cupsdrvr.dll; \	put /usr/share/cups/drivers/cups.hlp cups.hlp'

   (このコマンドは、単一の長い行で入力すべきである“\”によって示される改行と行末は可読性向上のために挿入されている)。このステップは、次のものを成功させるために必要とされる。これは、ドライバファイルを物理的に`[print$]`共有中に存在させるようにする。しかし、それらをSambaはまだドライバファイルとして扱えないので、クライアントはまだそれらをインストールできない。クライアントがドライバについて問い合わせると、引き続き“not installed here”というメッセージが表示される。

5. 現在どこにドライバファイルがあるかを検査する。

       root# ls -l /etc/samba/drivers/W32X86/total 669drwxr-sr-x    2 root     ntadmin       532 May 25 23:08 2drwxr-sr-x    2 root     ntadmin       670 May 16 03:15 3-rwxr--r--    1 root     ntadmin     14234 May 25 23:21 cups.hlp-rwxr--r--    1 root     ntadmin    278380 May 25 23:21 cupsdrvr.dll-rwxr--r--    1 root     ntadmin    215848 May 25 23:21 cupsui.dll-rwxr--r--    1 root     ntadmin    169458 May 25 23:21 mysmbtstprn.PPD

   ドライバファイルは現在`[print$]`を“root”とするW32X86アーキテクチャにある。

6. Sambaにそれらがドライバファイルであると告げる(`adddriver`)。

       root# rpcclient -Uroot%xxxx -c 'adddriver "Windows NT x86" \	"mydrivername:cupsdrvr.dll:mysmbtstprn.PPD: \  cupsui.dll:cups.hlp:NULL:RAW:NULL"' \  localhostPrinter Driver mydrivername successfully installed.

   これが失敗してもこのステップを繰り返すことはできない。これは単なるtypoの結果であったとしても失敗する。それは、たいていの場合、ドライバファイルの一部を“2”サブディレクトリ中に移動してしまっただろう。もしもこのステップが失敗したならば、このステップを再度実行する前に、4番目のステップに戻り、繰り返す必要がある。このステップ中で、ドライバの名前を選択する必要がある。プリンタの名前として使うものと同じ名前を使うことはよい方法である。しかし、大量にインストールする場合、明確に異なった名前の、数多くのプリンタに対するドライバを使っても良い。そのため、ドライバの名前は決定されない。

7. 現在ドライバファイルがどこにあるかを調べる。

       root# ls -l /etc/samba/drivers/W32X86/total 1drwxr-sr-x    2 root     ntadmin       532 May 25 23:22 2drwxr-sr-x    2 root     ntadmin       670 May 16 03:15 3root# ls -l /etc/samba/drivers/W32X86/2total 5039[....]-rwxr--r--    1 root     ntadmin     14234 May 25 23:21 cups.hlp-rwxr--r--    1 root     ntadmin    278380 May 13 13:53 cupsdrvr.dll-rwxr--r--    1 root     ntadmin    215848 May 13 13:53 cupsui.dll-rwxr--r--    1 root     ntadmin    169458 May 25 23:21 mysmbtstprn.PPD

   どのようにステップ6が適切なサブディレクトリ中にドライバファイルを移動したかに注目。ステップ5の後の状態と今の状態を比較する。

8. (オプション)Sambaが現時点でドライバを認識しているかを確認する。

       root# rpcclient -Uroot%xxxx -c 'enumdrivers 3' \	localhost | grep -B2 -A5 mydrivernamePrinter Driver Info 3:Version: [2]Driver Name: [mydrivername]Architecture: [Windows NT x86]Driver Path: [\\kde-bitshop\print$\W32X86\2\cupsdrvr.dll]Datafile: [\\kde-bitshop\print$\W32X86\2\mysmbtstprn.PPD]Configfile: [\\kde-bitshop\print$\W32X86\2\cupsui.dll]Helpfile: [\\kde-bitshop\print$\W32X86\2\cups.hlp]

   思い出してほしいが、このコマンドはステップ6で選択したドライバの名前を検索する。このコマンドは次のステップに行く前に成功しなければならない。

9. どのプリンタがこのドライバファイルを使うかをSambaに告げる(`setdriver`)。

       root# rpcclient -Uroot%xxxx -c 'setdriver mysmbtstprn mydrivername' \	localhostSuccessfully set mysmbtstprn to driver mydrivername

   任意のプリンタ名(プリンタキュー)を任意のドライバに結合できるので、これは同じドライバを使う数多くのキューを設定するのに便利な方法である。これを成功させるために、setdriverコマンドに対する以前のステップのすべてを繰り返す必要はない。やらなければならない唯一の準備は、`enumdrivers`がドライバを見つけられねばならないと言うことと、`enumprinters`がプリンタを見つけられねばならないと言うことである。

10. (オプション)この結合をSambaが認識しているかを調べる。

        root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \  | grep driverdrivername:[mydrivername] root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \  | grep -C4 drivservername:[\\kde-bitshop]printername:[\\kde-bitshop\mysmbtstprn]sharename:[mysmbtstprn]portname:[Done]drivername:[mydrivername]comment:[mysmbtstprn]location:[]sepfile:[]printprocessor:[winprint] root# rpcclient -U root%xxxx -c 'getdriver mysmbtstprn' localhost[Windows NT x86]Printer Driver Info 3:     Version: [2]     Driver Name: [mydrivername]     Architecture: [Windows NT x86]     Driver Path: [\\kde-bitshop\print$\W32X86\2\cupsdrvr.dll]     Datafile: [\\kde-bitshop\print$\W32X86\2\mysmbtstprn.PPD]     Configfile: [\\kde-bitshop\print$\W32X86\2\cupsui.dll]     Helpfile: [\\kde-bitshop\print$\W32X86\2\cups.hlp]     Monitorname: []     Defaultdatatype: [RAW]     Monitorname: []     Defaultdatatype: [RAW] root# rpcclient -Uroot%xxxx -c 'enumprinters' localhost \	| grep mysmbtstprn     name:[\\kde-bitshop\mysmbtstprn]     description:[\\kde-bitshop\mysmbtstprn,mydrivername,mysmbtstprn]     comment:[mysmbtstprn]

    ステップ2と3からの結果とこの結果を比較する。上記のコマンドの1つ1つはインストールされたドライバを表示する。たとえ`enumprinters`コマンドが“description”行上のドライバを一覧表示するとしても。

11. (オプション)正しいデバイスモードにドライバを修正する

    クライアント上にドライバをどのようにインストールするかについては確実に知っているはずである。特にWindowsに慣れていない場合、簡単なやり方がある:ネットワークコンピュータをブラウズし、Sambaサーバを選び、共有を捜す。すべての共有されたSambaプリンタが見えるはずである。質問(question)中の1つをダブルクリックする。ドライバが得られてインストールされて、ネットワーク接続が設定される。別の方法は、プリンタとFAXフォルダを開き、質問(question)中のプリンタを右クリックし、接続又はインストールを選択する。その結果、クライアントのローカルのプリンタとFAXフォルダ中に新しいプリンタが現れ、それにはSambahostname上のprintersharenameのような何らかの名前が付いている。

    このステップをSambaのprinter admin(`smb.conf`中で定義)として実行することは重要である。これをWindows XP上で行う別の手法がある。これは、“DOSプロンプト”内で、以下のようにコマンドラインを使う(要求された時に、rootのsmbpassordを入力する):

        C:\> runas /netonly /user:root "rundll32 printui.dll,PrintUIEntry \	/in /n \\sambaserver\mysmbtstprn"

    任意のプリンタの設定を一回変更し、(縦方向を横方向になど)適用をクリックし、設定を元に戻す。

12. クライアント上でプリンタをインストールする(ポイントアンドプリント)。

        C:\> rundll32 printui.dll,PrintUIEntry /in /n "\\sambaserver\mysmbtstprn"

    もしもこれが動かない場合、`[print$]`共有のアクセス許可問題かもしれない。

13. (オプション)テストページを印刷する。

        C:\> rundll32 printui.dll,PrintUIEntry /p /n "\\sambaserver\mysmbtstprn"

    次に5回[タブ]を入力し、[ENTER]を二回入力し、[TAB]を1回、そして再度[ENTER]を入力しプリンタの所に行く。

14. (推奨)テストページを調査する。

    今は、プリンタのインストールについてすべてを知っていて、そこに書いてあることを読む必要はない。額縁にこれを入れて、"初めてRPCCLIENTでインストールしたプリンタ"というタイトルを付けて壁に貼ろう。でも、やはり捨てるよね。Hmmm. Just kidding! By now you know everything about printer installations and you do not need to read a word.Just put it in a frame and bolt it to the wall with the heading "MY FIRST RPCCLIENT-INSTALLED PRINTER" why not just throw it away!

15. (義務)飛び上がって成功を喜ぼう。

        root# echo "Cheeeeerioooooo! Success..." >> /var/log/samba/log.smbd

### トラブルシューティング再考

もしもSambaが、キューがそこにないと考えた場合、setdriverコマンドは失敗する。インストールが成功すると以下の頼もしいメッセージが表示される:

    Printer Driver ABC successfully installed.

この後、`adddriver`部分の手続きが続く。しかし、以下のような期待はずれのメッセージが出るかもしれない:`result was NT_STATUS_UNSUCCESSFUL`

CUPS中のキューを見ることができるだけでは十分ではないので、`lpstat -p ir85wm`コマンドを使う。最も最近のSambaのバージョンでは、適切なキュー一覧の更新を妨害するというバグがある。Sambaを再起動するか、すべてのsmbdプロセスにHUPを送るまで、新しくインストールしたCUPSプリンタの認識に失敗する。なぜSambaが`setdriver`コマンドを正しく実行しないかという理由がこれかと言うことを検証するために、Sambaがプリンタを“認識している”かを調べる:

    root# rpcclient transmeta -N -U'root%xxxx' -c 'enumprinters 0'|grep ir85wm        printername:[ir85wm]

別のコマンドでのやり方もある:

    root# rpcclient transmeta -N -U'root%secret' -c 'getprinter ir85wm'         cmd = getprinter ir85wm        flags:[0x800000]        name:[\\transmeta\ir85wm]        description:[\\transmeta\ir85wm,ir85wm,DPD]        comment:[CUPS PostScript-Treiber for Windows NT/200x/XP]

所で、上記のコマンドに、さらにいくつかを使うことが出来、もちろん、リモートのWindows NT印刷サーバにもインストールできる!

## 印刷関連の`*.tdb`ファイル

すべてのSambaをインストールした環境にある、tdbという拡張子を持った、一連のファイルは謎であろう。それらは、`connections.tdb`, `printing.tdb`,`share_info.tdb`, `ntdrivers.tdb`, `unexpected.tdb`,`brlock.tdb`, `locking.tdb`, `ntforms.tdb`,`messages.tdb` , `ntprinters.tdb`, `sessionid.tdb`,と`secrets.tdb`である。これらの目的はなんであるか?

### Trivial Database Files

Windows NT(印刷)サーバは、Windowsレジストリ中にエントリを格納することによって、そのクライアントに対して、その作業を提供するのに必要なすべての情報を記録する。クライアントの問い合わせはレジストリを読み取ることによって回答が行われ、Administratorかユーザの構成設定はレジストリ中に書き込むことで保存される。SambaとUNIXは明らかにこのようなレジストリを持っていない。Sambaはその代わりに、一連の`*.tdb`ファイルにすべてのクライアントに関連する情報を保存する(TDBはtrivial data baseの省略形である)。これらはたいてい`/var/lib/samba/`か`/var/lock/samba/`にある。印刷関連のファイルは、`ntprinters.tdb`, `printing.tdb`,`ntforms.tdb`と`ntdrivers.tdb`である。

### バイナリ形式

`*.tdb`は人間に可読なファイルではない。それらはバイナリ形式である。“なぜASCIIでないのか?”と質問するかもしれない。“結局の所、ASCII設定ファイルは、便利でUNIXでの伝統である。”Sambaチームによって、デザインがこうなった理由は、主に性能である。Sambaは高速で動作する必要がある。ある環境では数千にもなる、各クライアントの接続毎に分離された`smbd`プロセスが動く。これらのいくつかは、同じ時間に同じ`*.tdb`ファイルをそれら`smbd`プロセスが書き込みアクセスをする必要があるかもしれない。Sambaの`*.tdb`ファイル形式は、これを提供できる。多くのsmbdプロセスは同じ時間に同じ`*.tdb`ファイルに書き込みができる。これは純粋なASCIIファイルでは不可能である。

### `*.tdb`ファイルの喪失

すべての`*.tdb`ファイルはすべての読み取りと書き込みアクセス間で整合性を保持することはとても重要である。しかし、これらのファイルが壊れることがあるかもしれない(書き込み処理中に、`kill -9 `pidof smbd'`を実行すると、ダメージを与えることになる。そのほか、急な電源断など)。このようなトラブルの場合、古い印刷関係の`*.tdb`ファイルを削除するのが唯一の解である。その後、その時点で`*.tdb`ファイルをバックアップから戻さない限り、すべての印刷関連の設定を再作成する必要がある。

### `tdbbackup`の使用

Sambaは、システム中にある`*.tdb`ファイルをバックアップする、rootユーザを手助けする小さなユーティリティを同梱している。もしも引数なしでそれを動かすと、以下のメッセージが表示される:

    root# tdbbackup Usage: tdbbackup [options]   Version:3.0a   -h            this help message   -s suffix     set the backup suffix   -v            verify mode (restore if corrupt)

以下は`printing.tdb`ファイルをどのようにバックアップするかの例である:

    root# ls.              browse.dat     locking.tdb     ntdrivers.tdb printing.tdb..             share_info.tdb connections.tdb messages.tdb  ntforms.tdbprinting.tdbkp unexpected.tdb brlock.tdb      gmon.out      namelist.debug  ntprinters.tdb sessionid.tdb root# tdbbackup -s .bak printing.tdb printing.tdb : 135 records root# ls -l printing.tdb* -rw-------    1 root     root        40960 May  2 03:44 printing.tdb -rw-------    1 root     root        40960 May  2 03:44 printing.tdb.bak

## Linuxprinting.orgからのCUPSプリントドライバ

CUPSはHP LaserJetタイプのプリンタに対する良いサポートがある。以下のように汎用ドライバをインストールできる:

    root# lpadmin -p laserjet4plus -v parallel:/dev/lp0 -E -m laserjet.ppd

`-m`スイッチは、CUPSが通常`/usr/share/cups/model`中に格納する、まだインストールされていないPPDのための標準リポジトリから`laserjet.ppd`を検索する。代替として、`-P /path/to/your.ppd`を使っても良い。

しかし、汎用`laserjet.ppd`は、各LaserJet五巻も出るの各特別なオプションをサポートしない。すべてのモデルの、一連の“最小の共通項”が構成要素である。もしもある理由で、商用のESP Print Pro ドライバに対してお金を払わなければならない場合、最初に見に行く所は、LinuxprintingWebサイト上にあるデータベースにすべきである。Linuxprinting.orgは、各プリンタに対して使える最適のドライバがどれか、ということについて、優れた推奨情報を提供している。そのデータベースは、`foomatic-rip`ユーティリティの主要な著者でもある、MandrakesoftのTill Kamppeterの精力的な仕事によって、現在保持されている。

### Note

前者の`cupsomatic`コンセプトは現在新しい優れたものにより置き換えられ、より強力な `foomatic-rip`が提供されている。`cupsomatic`はもはやメンテナンスされていない。新しいデータベースへのURLはFoomatic-3.0である。もしも`foomatic-rip`にアップグレードする場合、Foomaticで制御されるプリンタ用の、新しい形式のPPDもアップグレードすることも忘れないこと。foomatic-ripは古い`cupsomatic`で生成したPPDでは動かない。新しい形式のPPDはAdobe PPDの仕様と100％互換である。これらはまたSambaとcupsaddnmbユーティリティによってWindowsクライアントのためにドライバを提供するために、代わりに使われる!

### foomatic-rip と Foomaticの説明

最近、ほとんどのLinuxディストリビューションは、(すべてのUNIXとMac OS XとDarwinでも動く)印刷関連のソフトウェアを作成するために、Linuxprinting.orgからのユーティリティに頼っている。このサイトからのユーティリティは、サポートしているすべてのモデル、すべてのスプーラ、すべてのOSとすべてのパッケージ形式(それらがないので)に対して、ドライバとPPDの簡単な更新が出来る、エンドユーザにとてもわかりやすいインタフェースを持っている。その歴史は、数年前にさかのぼる。

最近、Foomaticは、対応プリンタモデルが1,000を超えるという驚くべきマイルストーンに到達した。Linuxprinting.orgは、プリンタドライバ、サポートするモデルと、Foomaticデータベース中で有効な種々のドライバ/プリンタの組み合わせに対するオプションについての、すべての重要な要素を保持している。現在、そのデータベース中には、245のドライバが存在する。多くのドライバは種々のモデルをサポートし、多くのモデルは、異なったドライバで動作するかもしれない。これはあなたが選択するものである!

#### 690の“完璧な”プリンタ

現在、690ものドライバが完全に動作することが分かっている:181はほとんど完全で、96は 部分的に完全で、46は文鎮(paperweight)である(???)。これらの大半は、非PostScriptモデルであり(PostScriptプリンタは、CUPSによって、固有の製造元が提供したWindows PPDを使うことによって、完璧にサポートされる)、多機能デバイスは、GNU/Linux配下で、スキャンとコピーとFAXが出来ないならば、決して完全に動くとは見なされないということを心にとめておいておくこと。これは本当に驚くべき結果である!3年前、数は500以下であり、その時点でのLinuxかUNIX印刷は、現在の品質には到達していなかった。At present, there are 690 devices dubbed as working perfectly: 181 are mostly perfect, 96are partially perfect, and 46 are paperweights. Keeping in mind that most of these arenon-PostScript models (PostScript printers are automatically supported by CUPS to perfection by using theirown manufacturer-provided Windows PPD), and that a multifunctional device never qualifies as working perfectlyif it does not also scan and copy and fax under GNU/Linux then this is a truly astonishingachievement! Three years ago the number was not more than 500, and Linux or UNIX printing at the time wasn'tanywhere near the quality it is today.

#### どのように印刷HOWTOが始まったか

数年前、Grant Taylorが作業を開始した。現在のLinuxprinting.orgの大元は、彼が書いた最初のLinux Printing HOWTOである。多数のLinuxユーザと管理者に、この複雑で繊細な設定の最初のステップをガイドするために提供された、この文書の関連プロジェクトとして(科学者にとって、印刷とは“紙の基盤の上に、インクかトナーの微片による明白なパターンによる構造化した堆積物を付けたものである”)、その時点でのLinux印刷を補う、ハードウェアとドライバについての情報集積を行う小さなPostgresデータベースの構築を開始した。このデータベースは、現在における、Foomaticの、ツールとデータの集合体のコアコンポーネントになった。その途中で、データをXML表記に変更した。

#### Foomaticの奇妙な名前

“なぜこんな奇妙な名前なのか?”2000年の春頃に、これが軌道に乗ったときに、CUPSは現在よりもかなり知名度が亡く、ほとんどのシステムはLPD、LPRng、か、あるいはPDQを印刷に使用していた。CUPSはごくわずかの汎用ドライバ(100くらいの少数の異なったプリンタモデルにのみ対応)しか提供できていなかった。デバイス固有のオプションのサポートも出来ていなかった。CUPSは固有の組み込みラスタライズフィルタ(Ghostscript由来の`pstoraster`)も提供していた。他方、CUPSは、標準化され、きちんと定義されているPPDファイルを使って、すべての印刷オプションの制御をきちんとサポート出来た。さらに、CUPSは簡単に拡張できるように設計されていた。

Taylorはすでに、より多くのプリンタと、それと共に動くGhostscript“ドライバ”について、良くできた動作状況一覧を、彼のデータベース中に用意していた。彼のアイデアは、データベース情報からPPDを作成するためと、CUPSで動作する標準Ghostscriptドライバを生成するために、それがうまく動くことを検証することであった。また、それは一石数鳥でもあった:

- これは、CUPSで有効な現在と将来のすべてのGhostscript フィルタ開発を行う。

- CUPSユーザにたくさんの追加プリンタモデルを有効にさせる (しばしば、伝統的なGhostscriptによる印刷は、1つのみが有効であるという理由で)

- これは、Ghostscriptフィルタを使う事を望んでいる(あるいは 必要としている)ユーザに、すべての詳細CUPSオプションを提供する(Web インタフェース、GUIドライバの組み合わせで)

#### cupsomatic, pdqomatic, lpdomatic, directomatic

CUPSはcupsomaticという名前が付いた、簡単に作成されたフィルタスクリプトを経由して動作する。cupsomaticはGhostscript経由でprintflieを動かし、必要とされる、どちらかというと複雑なコマンドラインを自動的に構築する。これは、それが動くようにするために、CUPSシステム中にコピーされる必要がある。cupsomatic制御がGhostscript病がプロセスを制御する方法を構築するために、CUPS-PPDが必要である。このPPDはデータベースの内容から直接生成される。CUPSとそれぞれのプリンタ/フィルタの組み合わせのために、CUPS-O-Maticという名前の、他のPerlスクリプトがPPDを生成する。これが動作した後、Taylorは2つの他のスプーラのために、類似のことを数日で実装した。config-generatorスクリプトのために選ばれた名前は、(PDQ用には)PDQ-O-Maticと(推測したとおり、LPD用に)LPD-O-Maticであった。ここでの構成はPPDを使用しなかったが、他のスプーラ固有のファイルは使った。

その年の夏の終わり頃に、Till Kamppeterは作業をデータベース中に格納し始めた。Kamppeterはその印刷システムをCUPSに変更するために、新たにMandrakesoftに雇われ、その後FLTKベースのXPP(CUPS lpコマンドに対するGUIフロントエンド)が出来た。彼は、大量の新しい情報と新しいプリンタを追加した。また、PPR (ppromatic経由), GNUlpr,とLPRng (存在するlpdomatic経由両方)とスプーラなしの印刷(directomatic)のような他のスプーラに対するサポートも開発した。

そのため、あなたの質問に答えるために、“Foomatic”は、“*omatic”スクリプトに隠れたコードとデータをすべて上書きする汎用の名前である。Foomaticは、バージョン2.0.xまで、CUPS用のLinuxprinting.orgのPPDに結合する(ひどい)Perlデータ構造を要求していた。異なったプリンタ設定ファイルのように、すべてのスプーラに対して異なった“*omatic”スクリプトがある。

#### すばらしい統一の達成

これは、Foomatic バージョン 2.9(β)中と“安定版”3.0としてリリースされたものですべて変更された。これは現在、すべての*omaticスクリプトの集合として到達して、さらにこれはfoomatic-ripと呼ばれている。foomatcic-rip はすべての異なったスプーラと同様によって使われ、それがPPD(オリジナルPostScriptプリンタのPPDとLinuxprinting.orgが作成したもの両方)を読むことが出来るという理由で、すべてのサポートされているスプーラは突然自由にPPDの機能を使えるようになる。ユーザはシステムにfoomatic-ripを組み込む必要があるだけである。ユーザ用に、改良されたメディア対湯とソースのサポートがある。それは、紙のサイズとトレイが簡単に設定できるものである。

また、新しい世代のLinuxprinting.org PPDは、もはやPerlデータ構造を含まない。もしも、あなたがディストリビューションメンテナで、以前のバージョンのFoomaticを使用しているのであれば、..................しかし、新しいfoomatic-db-engine経由で新しいバージョンのPPDセットを生成することを覚えておいてほしい!個々のユーザは、Foomaticチュートリアル中で概要が説明されている以下のステップか、この章によって、使用しているモデルのための、特定の、新しい単一PPDを生成することが必要である。この新しい開発版は全く驚くべきものである。Also, the new generation of Linuxprinting.org PPDs no longer contains Perl data structures. If you are adistro maintainer and have used the previous version of Foomatic, you may want to give the new one a spin, butremember to generate a new-version set of PPDs via the new foomatic-db-engine!.Individual users just need to generate a single new PPD specific to their model by followingthe steps outlined in the Foomatic tutorial or in this chapter. This new development is truly amazing.

foomatic-ripは、異なった文法、オプション、デバイスの選択、あるいは異なる各プリンタまたはスプーラのためのフィルタを使うGhostscriptを動かすために必要な、とても巧妙なラッパーである。同時に、これはプリントキューに関連づけられているPPDを読み、ユーザの選択に従って、印刷ジョブを変更する。これを一緒にすると、Adobeのspecに対し、新しいFoomatic PPDは100％準拠となる(ここ怪しい)。Foomaticのコンセプトにおける、いくつかの革新的な特徴は、ユーザを驚かせるだろう。これは、多くのプリンタに対する、個別の紙サイズのサポートや同じジョブ内での、異なったペーパトレイを使う印刷のサポートができる(両方の場合において、Windowsベースのベンダプリンタドライバがこれをサポートしていなかったとしても)。foomatic-rip is a very clever wrapper around the need to run Ghostscript with a different syntax, options,device selections, and/or filters for each different printer or spooler. At the same time, it can read the PPDassociated with a print queue and modify the print job according to the user selections. Together with thiscomes the 100% compliance of the new Foomatic PPDs with the Adobe spec. Some innovative features of theFoomatic concept may surprise users. It will support custom paper sizes for many printers and will supportprinting on media drawn from different paper trays within the same job (in both cases, even where there is nosupport for this from Windows-based vendor printer drivers).

#### ドライバ開発の外側

ほとんどのドライバ開発それ自身は、Linuxprinting.org中では発生しない。ドライバは独立したメンテナによって書かれる。Linuxprinting.orgはすべての情報を蓄え、そのデータベース中に格納するだけである。さらに、今知られている、任意の最新式(あるいは旧来の)印刷システム中にたくさんのドライバを統合する、Foomaticという糊も提供する。

異なったドライバ開発グループについて話すと、仕事のほとんどは、それらのプロジェクトにおいて、現在ほとんど終わっている:

- Omni IBMによるフリーソフトウェアプロジェクトで、良くできたOS/2時代のプリンタ ドライバの知識を、Linux/UNIXに対する、最新の、モジュラーなユニバーサルドライバ アーキテクチャに変換することを試みている(今だβ)。これは現在437モデルを サポートしている。

- HPIJS HPによるフリーソフトウェアプロジェクトで、自分自身のモデルの領域における サポートを提供する(とても自然ではあるが、ほとんどの場合の印刷は、完璧なもので、 真の写真品質も提供している)。これは現在369モデルをサポートしている。

- Gutenprint フリーソフトウェアの取り組みであり、(CUPSの主要開発者としても知られている) Michael Sweetによって開始され、現在驚異的な写真レベルの品質に到達した Robert Krawitzによって指揮されている(多くのエプソンユーザは、その品質は、 Microsoftプラットフォーム向けのEpsonによって提供されたベンダドライバよりも 良いと断言している)。現在522モデルをサポートしている。

#### フォーラム、ダウンロード、チュートリアル、HOWTO(Mac OS Xと商用UNIX用も)

Linuxprinting.orgは現在プリンタドライバのダウンロードを行うためのとりまとめ窓口である。プリンタ情報を探し、チュートリアルか、プリンタの問題について、よく知られているフォーラムで解決してみよう。このフォーラムは、GNU/Linuxユーザに限ったものではなく、商用UNIXシステムの管理者もここに来ていて、相対的に新しいMac OS Xフォーラムは、ここ数週間で最も利用度の高いフォーラムの一つである。

Linuxprinting.orgとGhostscriptを囲むFoomaticドライバラッパはすべての重要なディストリビューション上で印刷のための標準ツール(tool-chain)である。それらのほとんどは、基盤としてCUPSを使っている。ここ数年の間、ほとんどのプリンタに関するデータは、Kamppeterによって追加され、多くの追加コードが、SuSE、Red Hat、Conectiva、Debianやその他の技術者から寄贈された。ベンダ中立はFoomaticプロジェクトの重要なゴールである。MandrakeとConectivaは統合されて現在Mandrivaと呼ばれている。

### Note

MandrakesoftのTill Kamppeterは彼の空き時間にLinuxprinting.orgとFoomaticをメンテナンスするという優れた仕事を行っている。そのため、それをしばしば使うのであれば、あなたが感謝しているという事を送ってほしい。

#### Foomaticデータベースが生成したPPD

Foomaticデータベースはそれ自身だけで驚くべき工夫の1つである。プリンタとドライバ情報を保存しているだけではなく、その内部XMLベースのデータベースから、その場でPPDファイルを生成できる。それらPPDがAdobe仕様のPPDにモデル化される間、Linuxprinting.org/Foomatic-PPDは普通ではPostScriptプリンタを制御できない。それらは、Eposn Stylus inkjet、HP Photosmart、あるいは持っているプリンタ上で鳴らすことや吹くことが出来る、すべてのベルと笛を記述するのに使われる。その主要仕掛けは小さな追加の1行であり、PPDの仕様によって予測されたものではなく、`*cupsFilter`というキーワードで始まる。これはCUPSデーモンに、どのようにPostScript印刷ファイルを処理するかを告げる(旧形式のFoomatic-PPDはcupsomaticフィルタスクリプトと名前が付けられ、新しい形式のPPDはfoomatic-ripと呼ばれる)。このフィルタスクリプトはホストシステム上でGhostscriptを呼び出し(推奨する別バージョンはESP Ghostscript)、レンダリング作業を行う。foomatic-ripは、PostScriptジョブを、対象デバイス用のラスタフォーマットに変換する、Ghostscriptから問い合わせを行う、フィルタか内部デバイス設定がどれかを知っている。この、非PostScriptプリンタのオプションを記述するPPDの使用法は、CUPS開発者の発明である。その結果は簡単である。GUIツール(すばらしいKDEのkprinterか、GNOMEのgtklp xppとCUPSのWebサイト)はPPDを読み取り、その情報を直感的な面ふー選択として、ユーザに対し、有効な設定を提供するための情報として使う。

### foomatic-ripとFoomatic PPDのダウンロードとインストール

以下はfoomati-ripで制御される、CUPSでのLaserJet 4Plus互換プリンタインストール手順である(SuSE、UnitedLinuxとMandrakeにおける最新ディストリビューションではFoomatic-PPDの完全なパッケージと`foomatic-rip`ユーティリティを同梱している。Linuxprinting.orgに直接行くと最新のドライバ/PPDファイルを入手できる)。

- inuxprinting.orgのプリンタ一覧ページ をブラウザで開く。

- データベース 中の完全なプリンタ一覧をチェックする。

- 使用しているモデルを選択しそのリンクをクリックする。

- このモデルに対して動作可能なすべてのドライバの一覧ページが表示される (すべてのプリンタに、必ず1つ推奨ドライバがある。まず初めにそれを試す)。

- この例の場合(HP LaserJet 4 Plus)、 HP-LaserJet 4 Plus という既定値のドライバになる。

- 推奨ドライバはljet4である。

- いくつかのリンクがここで提供されている。Linuxprinting.orgに 不慣れならば、それらすべてを見てみるべきである。

- ljet4 に対するデータベースページへのリンクがある。ドライバのページ上には、種々の有効な スプーラでそのドライバをどのように使うかについての重要かつ詳細な情報がある。

- 他のリンクは、ドライバの著者のホームページを示しているだろう。

- CUPS に関するセットアップ手順のヒントを提供する重要なリンクがある: PDQ; LPD, LPRng, と GNUlpr); 同様にPPR または“spoolerless” printing.

- このリンク経由でブラウザ中でPPDを閲覧できる: http://www.linuxprinting.org/ppd-o-matic.cgi?driver=ljet4&printer=HP-LaserJet_4_Plus&show=1

- 最も重要なことは、 PPD を生成しダウンロードできると言うことである。

- PPDは使用するモデルとドライバが使うときに必要なすべての情報を 含む。一度インストールすると、これはユーザに対して透過的に動作する。その後は Webベースのメニューか、印刷ダイアログGUIか、コマンドラインから、解像度、 紙のサイズなどのみを指定する必要がある。

- もしもドライバ ページ で作業を終わるならば、“PPD-O-Matic”オンラインPPDジェネレータ プログラムを使う選択が出来る。

- 正確なモデルを選択し、Downloadか Display PPD fileのどちらかをチェックし、 Generate PPD fileをクリックする。

- もしもブラウザビューからPPDファイルをセーブした場合、 カットアンドペーストは使わないこと(行末やタブ情報を欠落する可能性があるため、 PPDファイルが壊れてしまう可能性が高くなる)。代わりに、 ブラウザメニュー中のファイル名を指定して保存を 使う(WebページからのDownloadオプションを使うのが 最も良い)。

- 各ドライバページ上にある、他の興味深い部分は、 Show execution detailsである。もしも使用している プリンタモデルを指定し、そのボタンをクリックすると、完全なGhostscript コマンドラインが表示され、そのドライバとプリンタモデルの組み合わせに対して 有効なすべてのオプションをエミュレートする。これは “それを行うことでGhostscriptを学ぶ”優れた方法である。 また、忌々しい印刷スクリプトのための、優れたコマンドラインを再構築することを 必要とするすべての経験者のための、優れた一覧表(cheat sheet)でもある。 しかし、それは正確な文法を思い出すことはできない。

- 時々、Linuxprinting.orgを見ている間に、ハードディスクの `/path/to/my-printer.ppd`のような、適当な位置にPPDを セーブする(CUPS Webインタフェースの助けを借りて使用しているプリンタを インストールすることを好むならば、PPDを `/usr/share/cups/model/`というパスにセーブし、 cupsdを再起動する)。

- 次に、以下のようなコマンドラインでプリンタをインストールする:

      	root# lpadmin -p laserjet4plus -v parallel:/dev/lp0 -E \		-P path/to/my-printer.ppd

- Linuxprinting.orgからの、新しい形式の“Foomatic-PPDs” 用には、foomatic-ripと呼ばれる特別なCUPSフィルタも必要である。

- foomatic-rip Perlスクリプトそれ自身もいくつか興味深い 読み物 を作る。なぜならば、Kamppeterによるインラインコメントによってよく文書化されて いるからである(非Perlハッカーが、それを読むことで印刷について多少勉強できる)。

- `/usr/lib/cups/filter/foomatic-rip`か 他の$pathのどちらかにfoomatic-ripを保存する(そして、それを誰でも実行できる ようにするのを忘れないこと)。繰り返すが、コピーアンドペーストでセーブしない こと。適切なリンクを使うか、ブラウザ中の ファイル名を指定して保存を使うこと。

- もしも固有の$PATHにfoomatic-ripを保存したならば、シンボリックリンクを作る:

      	root# cd /usr/lib/cups/filter/ ; ln -s `which foomatic-rip'

  CUPSはcupsdを再起動後起動時に有効なこの新しいフィルタを検索する。

一度Foomatic PPDで設定された印刷キューに印刷すると、CUPSは適切なコマンドを挿入し、結果のPostScriptファイル中にコメントを挿入する。foomatic-ripはそれを読み、それらに対して処理を行うことが出来、さらに、ジョブファイル中に埋め込まれている、特別にエンコードされたFoomaticコメントのいくつかを使う。それらは順に(ユーザにとっては透過的に)どのように結果のラスタデータを見えるようにすべきかと、どのプリンタコマンドを、データストリーム中に埋め込むかを、正確に、プリンタドライバに指示する、複雑なGhostscriptコマンドを組み立てるのに使われる。以下が必要である:

- “foomatic+なにか” PPD しかし、 CUPSで印刷するためには、これだけでは不十分である(これは単に 1つの重要な要素である)。

- `/usr/lib/cups/filters/`中の `foomatic-rip`フィルタスクリプト(Perl)。

- foomatic-ripを動かすためのPerl

- 使用しているプリンタが受け取れる形に適合したラスタデータを 生成するためのGhostscript(これが主要な仕事を行うため、PPD/foomatic-ripの組で 制御される)

- Ghostscriptは(ドライバ/モデルに依存するが)使用しているモデルに 対する選択されたドライバを表す特定のデバイスに対するサポートを 含んでいなければならない(`gs -h`によって 確認できる)。

## CUPSによるページの課金

しばしば、日、週、月単位に、一定のページ数かデータ量を超えて、Sambaユーザ(すなわちWindowsクライアント)が、印刷が出来ないようにする、印刷quotaに関連する質問がある。この機能は、使用している実際の印刷サブシステムに依存する。Sambaはクライアントから常にジョブファイルを受け取り(フィルタされるか否か、この印刷サブシステムに渡す。

もちろん、使用している人固有のスクリプトで、これをハックすることは出来る。しかし、CUPSがある。CUPSは、ジョブのサイズやページ数やその両方をベースとできるquotaをサポートし、それを行いたいときにはいつでも橋渡しをすることが出来る。

### Quotasの設定

CUPSで印刷quotaをrootがどのように設定するかのコマンド例であり、存在するプリンタが“quotaprinter”であることを仮定している:

    root# lpadmin -p quotaprinter -o job-quota-period=604800 \	-o job-k-limit=1024 -o job-page-limit=100

これは個々ののユーザに対して、604800秒(=一週間)で、100ページまたはデータが1024KBでの制限を行う(どちらか小さい方)。

### 正しいあるいは不正な課金

CUPSで正しく計測するために、印刷ファイルはCUPSpstopsフィルタに送られる必要がある;そうでない場合、ダミーのカウント“1”を使う。いくつかの印刷ファイルはそれに送られないが(例えば画像ファイル)、それらはほとんど1ページのジョブである。これはまた、それらのファイルを“raw”(すなわちそれらに何も変更をせず、フィルタリングもしない)すぷーすする、クライアントコンピュータとCUPS/Samba上で動いている、対象プリンタ用のプロプラエティなドライバは、1ページとして計測するということでもある!

課金を行える機会を得るために、それらのクライアントからPostScriptで送る必要がある(すなわち、そこでPostScriptドライバを動かす)。もしも、プリンタが非PostScriptモデルならば、対象のプリンタ用に印刷可能な形式にファイルを変換するためのジョブを、CUPSで行わせる必要がある。Linuxprinting.orgにはドライバのリストがある。

### Windowsクライアント用のAdobeとCUPS PostScriptドライバ

CUPS 1.1.16より前は、Windowsクライアント上でAdobe PostScriptドライバを使うことが出来るのみであった。このドライバの出力は、CUPS/Sambaサイド上の`pstops`フィルタに常時渡されるわけではなく、そのため、正しく計測出来なかった(その理由は、それがしばしば使用されるPPDに依存するからであり、CUPSに`pstops`をスキップさせる真のPostScriptの直前にPJL-ヘッダが書かれ、直接`pstoraster`ステージに行くからである)。

CUPS 1.1.16とそれ以降のリリースから、Windows NT/200x/XPクライアント用のCUPS PostScriptドライバを使うことが出来る(これは`cups-samba-1.1.16.tar.gz`というパッケージとして`http://www.cups.org/`のダウンロード領域中にタグされている)。これはWindows 9x/Meクライアントでは動かないが以下は保証される:

- PJL-ヘッダを書かない。

- 固有の意味を持つドライバPPD中に名前があるすべての PJL-オプションを、引き続き読み取りサポートする。

- CUPS/Sambaサーバ上の`pstops`フィルタに ファイルが渡される。

- 印刷ファイルのページカウントが正しくなる。

この組み合わせによる設定についてのより詳細は、`cupsaddsmb`のマニュアルページで読むことが出来る(これはCUPSがインストールされている所でのみに存在し1.1.16以降で有効である)。

### page_logファイルの形式

ジョブの各ページに対する`page_log`中のCUPSログの項目は以下の通り:

- プリンタ名(Printer name)

- ユーザ名(User name)

- ジョブID(Job ID)

- 印刷時間(Time of printing)

- ページ数(Page number)

- 印刷部数(Number of copies)

- 課金情報文字列(A billing information string) (オプション)

- ジョブを送り出したホスト(The host that sent the job) (バージョン1.1.19以降)

以下は項目を含む形式の図示を行うための、CUPSサーバの`page_log`ファイルから抜き出したものである:

    tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 1 3 #marketing 10.160.50.13tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 2 3 #marketing 10.160.50.13tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 3 3 #marketing 10.160.50.13tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 4 3 #marketing 10.160.50.13Dig9110 boss 402 [22/Apr/2003:10:33:22 +0100] 1 440 finance-dep 10.160.51.33

これはジョブID`401`で、`tec_IS2027`上でユーザ`kurt`によって印刷され、64ページのジョブで三部印刷され、`#marketing`に請求が行き、IPアドレス`10.160.50.13.`から送られた。次のジョブはIDが`402`であり、ユーザ`boss`によって、`10.160.51.33`というIPアドレスから送られ、1ページ、440部印刷され、`finance-dep`に請求が行った。

### 存在する欠点

何か問題か欠点がこのquotaシステムにあるだろうか?

- The ones named above (プリンタハードウェアが壊れたなどの場合に 間違ってジョブが記録される)。

- 実際、CUPSは、物理的にプリンタデバイスから出て行った紙の代わりに ソフトウェアで処理されたジョブのページをカウントする (すなわち、RIPを使って)。そのため、もしも1000ページ印刷中に五枚目でジャムが 発生し、ジョブがプリンタによって中断した場合、そのジョブに対しては1000ページ 印刷していると引き続き表示される。

- すべてのquotaはすべてのユーザに対して同じであり(事務員よりも 管理者の方により大きなquotaを割り当てるような自由度がない)、グループの サポートもない。

- 現在のバランス(current balance??)と、現在のquotaに関する “使い切った”分を読む方法がない。

- quotaが100で99まで使ったユーザは、まだ1000ページのジョブを 送信し印刷できる。

- quotaの制限に引っかかっりジョブが拒否されたユーザは、 CUPSから“client-error-not-possible”という意味のあるメッセージを 受け取れない。

### 将来の構想

これは現在使えるものの中で最も優れたシステムであり、CUPS 1.2にむけて大量の改善が行われている:

- ページカウントはバックエンドに移行する(それらはプリンタと 直接通信し、実際の印刷処理に計数が同期する)。そのため、5枚目でジャムが発生した 場合、カウントを中断する)

- quotaはより自由度が向上する。

- おそらく前もって、使用しているアカウントについてユーザが 問い合わせる機能をサポートする。

- おそらく、このトピックの周辺にあるような他のツールのいくつかを サポートするだろう。

### 他のアカウントツール

使用できる他のアカウントツールは以下のものが含まれる:PrintAnalyzer, pyKota, printbill, LogReport。これらのツールについての詳細はググること。

## 追加の材料

PPDを使わない、それに関係する印刷キューは、“raw”プリンタで、スプーラが受け取ったすべてのファイルはそのまま直接送られる。例外は、パススルー機能を有効とすることが必要とされる`application/octet-stream`ファイルタイプである。“raw”キューはフィルタリングを全く行わない。それはCUPSバックエンドに直接送られる。このバックエンドはデバイスにデータを送る事に責任がある(“device URI”として、例えば`lpd://, socket://, smb://, ipp://, http://, parallel:/, serial:/, usb:/`など)。

cupsomatic/FoomaticはネイティブなCUPSドライバではなく、CUPSには同梱されない。これらはLinuxprinting.orgで開発されたサードパーティアドオンである。同様に、すべてのモデルで、CUPS経由でも動くようにさせる、優れたハックであり(伝統的なスプーラで、Ghostscriptドライバ/フィルタによって動作する)、他のスプーラでの品質と(良くも悪くも)同じである。`cupsomatic`は、単なる媒体である。すなわち、通常ネイティブなCUPS`pstoraster`フィルタが起動される、CUPSフィルタリングチェーン中のそのステージで、Ghostscriptコマンドラインを実行する。`cupsomatic`は`pstoraster`をバイパスし、CUPSからの印刷ファイルを横取りし、Ghostscriptにリダイレクトする。CUPSは、関連するcupsomatic/foomatic-PPDが以下のように指定するのでこれを許可する:

    *cupsFilter:  "application/vnd.cups-postscript 0 cupsomatic"

この行は、かつてMIMEタイプ`application/vnd.cups-postscript`にうまく変換した`cupsomatic`に対してファイルを扱わせることをCUPSに指示する。この変換は、その場で、`/etc/cups/mime.types`中の変更に一致する、`application/octet-stream`に自動タイプされたWindowsから来たジョブに対しては起こらない。

CUPSは、関連するフィルタリング機能を含め、広範囲に設定が出来、自由度が高い。いくつかの状況に置ける他の問題は、`/etc/cups/mime.types`に以下のようなエントリがある場合である:

    application/postscript           application/vnd.cups-raw  0  -application/vnd.cups-postscript  application/vnd.cups-raw  0  -

これは、すべてのPostScriptファイルをフィルタされないようにする(というよりは、“-”で指定された仮想のnullfilterに渡す)。これは、PostScriptプリンタのみに便利である。もしも、非PostScriptプリンタにPostScriptコードを印刷したい場合(ASCCテキスト印刷のサポートを提供している)、以下のエントリは便利である:

    */*           application/vnd.cups-raw  0  -

そして、さらなる処理をせずにすべてのファイルを効率的にバックエンドに送るだろう。

以下のエントリを使用しても良い:

    application/vnd.cups-postscript application/vnd.cups-raw 0 \	my_PJL_stripping_filter

PostScriptを解析する(シェルスクリプトであり得る)`my_PJL_stripping_filter`を書き、望まないPJLを取り除く必要があるかもしれない。これはCUPSフィルタデザインに従う必要がある(主に、printername,job-id,username, jobtitle, copies, print optionsと可能ならばファイル名パラメータを受け渡す)。これは`/usr/lib/cups/filters/`中に誰でも実行できるようにインストールされ、MIMEタイプ`application/vnd.cups-postscript`が来た場合には、CUPSによって呼び出される。

CUPSは`-o job-hold-until=indefinite`を扱える。これは、キュー中にジョブを保存しておく。プリンタ操作者によって手動で解放されるときにのみ印刷される。これは、誰も直接アクセスできないいくつかの大きなマシン上で、数百人のユーザのジョブを、少数のオペレータが管理する、多くの集中印刷センタからの要求である(これは、ダイレクトメール発送のためなどに要求される10000ページのジョブを動かす前に、オペレータが適切な紙を設置する必要がしばしばある場合など)。

## CUPSスプールフィルタの自動削除または保存

Sambaは2つのスプールディレクトリ経由で印刷ファイルを渡す。1つはSambaによって管理される入力ディレクトリである(`smb.conf`中の`[printers]`セクション中のpath = /var/spool/sambaディレクティブで設定される)。もう1つは、UNIX印刷システムのスプールディレクトリである。CUPS用には、通常それは`/var/spool/cups/`であり、`cupsd.conf`中のディレクティブ`RequestRoot /var/spool/cups`によって設定される。

### CUPS構成の設定の説明

CUPS設定ファイル`cupsd.conf`中で設定される、いくつかの重要なパラメータは以下の通り:

PreserveJobHistory Yes

  これは、cupsdに、いくつかのジョブの詳細を保存させる(すなわち、c12345,c12346の ように、旧形式であるBSD-LPD制御ファイルのような同等のジョブとして処理し、 CUPSスプールディレクトリ中のファイルに)。既定値は“Yes”に 設定される。

PreserveJobFiles Yes

  これは、ジョブファイルそれ自身をcupsdが保存するようにさせる(d12345,d12346 などで、CUPSスプールディレクトリ中にファイルされる)。CUPSの既定値は “No”である。

“MaxJobs 500”

  このディレクティブは、メモリ中に保持されるジョブの最大数を制御する。この 制限値にジョブが到達すると、新しいもののために、最も古いものが自動的にシステム からパージされる。もしも既存のすべてのジョブが、引き続きペンディングか アクティブならば、新しいジョブは拒否される。値を0に設定するとこの機能が無効に なる。既定値の設定は0である。

(`MaxJobsPerUser`と`MaxJobsPerPrinter`という追加の設定もある)。

### 準備

すべてをきちんと動くようにするために、以下の3つを行う必要がある:

- `libcups`を指定してSambaのsmbdをコンパイルする (Linuxでは`ldd `which smbd'`を動かすことで確認)。

- Sambaの`smb.conf`でprinting = cups を設定する。

- Sambaの`smb.conf`でprintcap = cups も設定する。

### Note

この場合、他の手動で設定する印刷関係のコマンド(print command, lpq command, lprm command, lppause command, とlpresume commandのようなもの)は無視され、通常印刷に関してはなんの影響も与えなくなる。

### 手動の設定

すべてを手動で行いたいならば、printing = cupsをprinting = bsdに置き換える。そうすると手動で設定したコマンドが動作し(テストはしていないが)、print command = lp -d %P %s; rm %sが期待通りの事を行うだろう。

## Windowsに接続された印刷へのCUPSからの印刷

時々、SambaからWindowsに接続されたプリンタに印刷をするにはどうしたらいいか、という質問が来ることがある。通常Windowsホストからプリンタへのローカル接続はUSBまたはパラレルケーブルで行われるが、これはSambaにとっては重要ではない。ここから、Windowsホストに対してSMB接続でオープンする事のみが必要である。もちろん、プリンタはまず共有されねばならない。今まで学習してきたように、CUPSはプリンタや他のサービスと通信するバックエンドを使える。Windowsで共有されたプリンタと通信するには、(驚くべき事だが)`smb`バックエンドを使う必要がある。まず`smb`ファイルをそこで捜す必要がある。それは`smbspool`へのシンボリックリンクであり、ファイルは存在して実行可能でなければならない:

    root# ls -l /usr/lib/cups/backend/total 253drwxr-xr-x    3 root   root     720 Apr 30 19:04 .drwxr-xr-x    6 root   root     125 Dec 19 17:13 ..-rwxr-xr-x    1 root   root   10692 Feb 16 21:29 canon-rwxr-xr-x    1 root   root   10692 Feb 16 21:29 epsonlrwxrwxrwx    1 root   root       3 Apr 17 22:50 http -> ipp-rwxr-xr-x    1 root   root   17316 Apr 17 22:50 ipp-rwxr-xr-x    1 root   root   15420 Apr 20 17:01 lpd-rwxr-xr-x    1 root   root    8656 Apr 20 17:01 parallel-rwxr-xr-x    1 root   root    2162 Mar 31 23:15 pdfdistillerlrwxrwxrwx    1 root   root      25 Apr 30 19:04 ptal -> /usr/sbin/ptal-cups-rwxr-xr-x    1 root   root    6284 Apr 20 17:01 scsilrwxrwxrwx    1 root   root      17 Apr  2 03:11 smb -> /usr/bin/smbspool-rwxr-xr-x    1 root   root    7912 Apr 20 17:01 socket-rwxr-xr-x    1 root   root    9012 Apr 20 17:01 usbroot# ls -l `which smbspool`-rwxr-xr-x    1 root   root  563245 Dec 28 14:49 /usr/bin/smbspool

もしもシンボリックリンクがなければそれを作成する:

    root# ln -s `which smbspool` /usr/lib/cups/backend/smb

`smbspool`は、CUPS関係者のMike Sweetによって書かれた。これは、Sambaに同梱されている。これはまた、CUPS以外の印刷サブシステムで使われ、Windowsプリンタ共有のためにジョブをスプールする。CUPS上で`winprinter`プリンタを設定するためには、そのためのドライバが必要である。本質的に、これは、プリンタが理解できる(Windowsホストは、送ったファイルを形式変換する能力はない)ファイル形式用に、CUPS/Sambaホスト上で、印刷データを変換することを意味する。これはまた、使用しているSamba/CUPSホストに直接繋がっている場合、プリンタに対して印刷出来るべきであると言うことを意味する。トラブルシューティングのために、一連の手続きのその部分が順番になっている場合、これが、何をすべきかを決定すべきかということである。次に、Windowsホストに対する接続/認証を修正することなどを行う。

バックエンドがCUPSの`smb`を使うプリンタをインストールするために、以下のコマンドを使う:

    root# lpadmin -p winprinter -v smb://WINDOWSNETBIOSNAME/printersharename \  -P /path/to/PPD

PPDは、そのターゲットモデルのために、印刷データを生成するために、直接CUPSを管理する必要がある。PostScriptプリンタのためには、Windows NT PostScriptドライバを使うPPDを使う。しかし、パスワードがないとプリンタにアクセスできない場合、一体何が出来るだろうか?あるいは、もしもプリンタのホストが他のワークグループのだった場合は?これには以下の方策がある:以下のように、`smb://`デバイスURIの一部として、要求されたパラメータを含めることが出来る:

- `smb://WORKGROUP/WINDOWSNETBIOSNAME/printersharename`

- `smb://username:password@WORKGROUP/WINDOWSNETBIOSNAME/printersharename`

- `smb://username:password@WINDOWSNETBIOSNAME/printersharename`

ログファイルに書かれる前に、ユーザ名とパスワードが削除されたとしても、デバイスURLはSambaサーバ上のプロセス一覧で見えてしまうことに注意(すなわち、誰かが、Linux上で`ps -aux`コマンドを使うと)。これは、本質的に脆弱性のあるオプションである。しかし、これが唯一の解である。パスワードを保護したい場合、これを使わないこと。パスワードを要求しないプリンタの共有の方が優れている!印刷は、NetBIOS名前解決が起動し、動作している時にのみ動く。これはCUPSの機能であり、smbdを動かす必要はないことに注意。

## より詳細なCUPSフィルタリングチェーン

フィルタリングチェーン1とcupsomaticを使うフィルタリングチェーン中のダイアグラムは、どのようにCUPSが印刷ジョブを扱うかを示している。

Figure 22.17. フィルタリングチェーン1

Figure 22.18. cupsomaticを使うフィルタリングチェーン

## よくあるエラー

### Windows 9x/Meクライアントがドライバをインストール出来ない

Windows 9x/Me用クライアント用には、最大8文字までのプリンタ名を必要とする (あるいは、“8文字に3文字の拡張子”)。そうでないと、 Sambaからそれらをダウンロードするときに、ドライバファイルが転送できない。

### “cupsaddsmb”が、無限にrootパスワードを問い合わせてくる

security = userを設定したか? Sambaアカウントのrootとして`smbpasswd`を使ったか? アカウントを作成するために、`smbpasswd -a root`を使い、 最初の質問にパスワードを入れる。あるいは、Enterを二回入力することで、 ループを終了する(パスワードを入力しないで)。

もしも、エラーが“Tree connect failed: NT_STATUS_BAD_NETWORK_NAME” ならば、`/etc/samba/drivers`ディレクトリを作成するのを忘れている。

### “cupsaddsmb”か“rpcclient addriver”がエラーを出す

もしも`cupsaddsmb`か`rpcclient addriver`が、 WERR_BAD_PASSWORDというエラーメッセージを出す場合は、 the previous common errorを参照すること。

### “cupsaddsmb”のエラー

“cupsaddsmb”を使うと、PPDが存在する間、 “No PPD file for printer...”というメッセージが出る。 この問題の理由は?

CUPS上でプリンタ共有を有効にしていないだろうか?これは、 “cupsaddsmb”が動いているホストからのアクセスを拒否する、 CUPSサーバの`cupsd.conf`中に、 `....` があるということである。cupsaddsmbをリモートで使っているか、 `-h`パラメータを付けて: `cupsaddsmb -H sambaserver -h cupsserver -v printername` として使っている場合、これは問題となりえる。

`cupsd.conf`中の`TempDir` ディレクティブが正しい値に設定されているだろうか?またそれは書き込み可能だろうか?

### クライアントがSambaプリンタに接続できない

Sambaの観点からどのユーザであるかを、`smbstatus`を 使って調べる。`[print$]`共有に対して書き込み許可が あるだろうか?

### Windows 200x/Xpからの新しいアカウント再接続のトラブル

ひとたび間違ったユーザ(たとえば、map to guest = bad userを設定した場合、しばしば発生する`nobody`など)で接続すると、Windowsエクスプローラは異なったユーザで再度接続する試みを受け付けない。Sambaに対しては全くデータ転送が出来ないが、Sambaがアクセスを拒否したと考えられる不可解なメッセージが表示され続ける。有効な接続の状態を`smbstatus`で確認すること。そして、当該のプロセス(PID)をKillする。まだ再接続は出来なく、接続しようとすると、`You can't connect with a second account from the same machine`というメッセージがすぐに出る。再説俗を試みても、、まだ1バイトもSambaには届かない(ログを見ること。“ethereal”を使う)。Windows上のすべてのエクスプローラを閉じる。 これは確立した接続としてメモリ中にキャッシュされたものを、Windowsに捨てさせる。次に正しいユーザで接続する。一番良い方法は、DOSターミナルウィンドウを使い、最初に `net use z: \\GANDALF\print$ /user:root`を行う。異なったアカウントで接続されたと言うことを、`smbstatus`で確認する。この後、プリンタフォルダを開き(Sambaサーバ上のネットワークコンピュータで)、質問中のプリンタ上で右クリックし、接続....を選択する。

### 間違ったユーザでSambaサーバに接続されるのを防ぐ

nobodyとして接続されていることを`smbstatus` で確認するが、本当はrootかprinter adminにしたい。これは、おそらく、正しくないユーザ名(たぶん何らかのミス)を指定した時に、黙ってguest accountとする、map to guest = bad userのせいであろう。これを防ぐためには、map to guestを取り除く。

### AdobeドライバからCUPSドライバにアップグレードする

この情報は、Microsoft Windows NT/200x/XPクライアント上で、AdobeドライバからCUPSドライバにアップグレードした時、それに関連した問題の体験を、メーリングリスト上に投稿されたものによっている。

最初に、すべての古い、Adobeが使っているプリンタを削除する。次に、すべとの古いAdobeドライバを削除する(Windows 200x/XP上では、プリンタフォルダの背景部分で右クリックし、Server Properties...を選択し、ドライバタブを選択し、ここで削除する)。

### PDCであるSambaサーバ上で“cupsaddsmb”が使えない

“そのままの”rootユーザ名を使っていないか?以下の方法を試してみよう:`cupsaddsmb -U `DOMAINNAME`\\root -v `printername``>(2つのバックスラッシュ:最初のものは二番目のものを“エスケープ”する事に注意)。

### 削除されたWindows 200xプリンタドライバが引き続き表示されている

クライアント上のプリンタの削除は、ドライバも一緒に削除はしない(それを確かめるために、プリンタフォルダの白い背景部分で右クリックし、サーバーのプロパティを選択し、ドライバタブをクリックする)。これら同じ古いドライバは、同じ名前でプリンタをインストールする時に再度使われる。もしも、新しいドライバにアップデートしたい場合は、古いものを最初に削除する。削除は、同じドライバを使う他のプリンタが無い場合にのみ可能である。

### Windows 200x/XP ローカルセキュリティポリシー

ローカルセキュリティポリシーは、未署名のドライバのインストールを許可しないようにもできる。“ローカルセキュリティポリシー”は全くプリンタドライバのインストールを許可しないようにしてもよい。

### Administratorはすべてのローカルユーザに対してプリンタをインストールできない

Windows XPは“ユーザ単位に”SMBプリンタを扱うことが出来る。これは、すべてのユーザは自分自身でプリンタをインストールする必要があることを意味する。すべてのユーザに対してプリンタを有効にするためには、Windows XPにおける内蔵IPPクライアントの機能を使う事になるかもしれない。`http://cupsserver:631/printers/printername`という印刷パスでプリンタを追加する。これについては引き続き調査中である。おそらく、すべてのユーザに対して自動的にプリンタのインストールが出来るログオンスクリプトかもしれない。

### NTクライアント上での印刷の変更、機能の通知

印刷の変更のために、NT++クライアント上でその機能に通知する。これらは最初に`サーバ`サービスを動かす必要がある(XP中では`File & Print Sharing for MS Networks`に名前が変わっている)。

### Windows XP SP1

Windows XP SP1では、ポイントアンドプリントの制限ポリシーが導入された(この制限は、“Administrator”か“Power User”グループのユーザには適用されない)。グループポリシーオブジェクトエディタ中で、ユーザの設定 -> 管理テンプレート -> コントロールパネル -> プリンタに行く。ポリシーは自動的に`有効`に設定され、`ユーザはそのフォレスト中のマシンに対してのみポイントアンドプリント`が使える。おそらく、`無効`か、ドライバのダウンロードをSambaから出来るように、`ユーザはそれらのサーバに対してのみポイントアンドプリントが使える`それを変更する必要がある。

### Windows 200x/XP上ですべてのユーザが印刷オプションを設定出来ない

何をしているのだろうか?間違っているに違いない(しかし、これを発見するのは容易ではない)。すべてを設定するように見えるダイアログを表示するための、3つの異なった方法がある。それら3つのダイアログは、同じように見えるが、そのうちの1つのみが意図しているものである。これをすべてのユーザに対して行うために、AdministratorかPrint Administratorである必要がある。XP上でどのようにやるかは以下の通り:

1. 最初の間違った方法:

   1. Printersフォルダを開く。

   2. プリンタ(cupshost上のremoteprinter) を右クリックし、コンテキストメニュー 印刷のプリファレンスを選択する。

   3. 細かくこのダイアログを見、なりが見えるかを覚えておく。

2. 二番目の間違った方法:

   1. プリンタフォルダを開く

   2. プリンタ(cupshost上のremoteprinter) を右クリックし、コンテキストメニュープロパティ を選択する。

   3. 全般タブをクリックする。

   4. 印刷のプリファレンスボタンを クリックする。

   5. 新しいダイアログが開く。このダイアログを開いたままにし、 親のダイアログに戻る。

3. 三番目の正しい方法:

   1. プリンタフォルダを開く。

   2. プリンタ(cupshost上のremoteprinter) を右クリックし、コンテキストメニュープロパティ を選択する。

   3. 詳細タブをクリックする (もしもすべてが“灰色になっていて入力できないならば”、 十分な権限を持つユーザとしてログインしていない)。

   4. プリンタの既定値ボタンを クリックする

   5. 2つの新しいタブのどちらかで、 詳細ボタンをクリックする。

   6. 新しいダイアログが開く。これを、 “B.5” または "A.3"で同様のものと比べてみる。

違いがわかるだろうか?私にはわからない。しかし、“C.1. から C.6.”の手順で到達した最後のもののみ、任意の設定を恒久的に保存し、新しいユーザの既定値となる。もしも、すべてのユーザに同じ既定値を設定したいならば、これらのステップをas Administrator(`smb.conf`中でprinter adminであるもの)で、クライアントが、(クライアントが、以下の手順AまたはB)によって、各固有の、ユーザ単位の既定値を設定出来る)ドライバをダウンロードする前に行う必要がある。

### Windowsクライアント上でのドライバ設定における、多くに共通する失敗

`Optimize for Speed`を使わずに、代わりに、`Optimize for Portability`を使う(Adobe PSドライバの場合)。`Page Independence: No`を使わない。常時、`Page Independence: Yes`を使う(Windows NT/200x/XP用の、Microsoft PDドライバとCUPS PSドライバ)。もしもフォントに問題がある場合には、`Download as Softfont into printer`を使う(Adobe PSドライバの場合)。TrueType Download Optionsオプション用に、`Outline`を選択する。もしも、非PSプリンタでトラブルがあるか、選択できる場合はPostScript Level 2を使う。

### `cupsaddsmb`が、新しくインストールしたプリンタで動かない

以下と同様: `cupsaddsmb`の最後のコマンドが完全に終わっていない。もしも、`cmd = setdriver printername printername`の結果がNT_STATUS_UNSUCCESSFULの場合、おそらくプリンタがまだSambaによって認識されていない。ネットワークコンピュータ中に表示されているだろうか? `rpcclient hostname -c `enumprinters'`で表示されるだろうか?smbdを再起動(か、`smbstatus`で一覧表示されるすべてのプロセスに対して`kill -HUP`を行う)し、再度試してみる。

### `/var/spool/samba/`のアクセス許可が、再起動後毎回リセットされる

同じ位置へのCUPSスプールディレクトリの設定で、以前に何か問題が起きなかったか?(`cupsd.conf`中の`RequestRoot /var/spool/samba/`か、その逆:`[printers]`セクション中で、`/var/spool/cups/`をpath>として設定しているか)?これらは`異なってなければならない`。`cupsd.conf`中の`RequestRoot /var/spool/cups/`と`smb.conf`の`[printers]`セクション中のpath = /var/spool/sambaを設定する。それ以外は、cupsdは再起動後毎回そのスプールディレクトリのアクセス許可を整理するので、印刷は確実にうまくいかない。

### “lp”という名前の印刷キューが印刷ジョブを間違って扱ってしまう

この場合、“lp”という名前の印刷キューが、間欠的にジョブを取りこぼし、送られたものとは完全に違うものを出力する。

プリンタに対して“lp”という名前を付けるのは好ましくない。これは、伝統的なUNIXにおける既定値のプリンタである。CUPSは暗黙のクラスを自動的に作成する事を行うように設定されているかもしれない。これは、デバイスをプールするために同じ名前のすべてのプリンタをグループ化するためと、ラウンドロビン方式でジョブのロードバランスを取るということである。誰かが“lp”という名前のプリンタを持っている場合にもこれがあり得る。その人のジョブを受け取り、無意識にその人のデバイスに自分のジョブを送っているかもしれない。プリンタ名に対して厳密の制御をするためには、巨大なネットワーク環境において起こるかもしれない事に対する、より良い制御を行う、`BrowseShortNames No`を設定する。

### “cupsaddsmb”に対するAdobe PostScriptドライバファイルの位置

共有されたPostScriptプリンタを持つWindowsマシンに繋ぐために、`smbclient`を、`smbclient //windowsbox/print\$ -U guest`のように使う。`W32X86/2`サブディレクトリに移動でき、`mget ADOBE*`し、あるいは`WIN40/0`で、同じ事をやる。他のオプションは、Adobe Webサイトから`*.exe`をダウンロードする。

## CUPS印刷プロセスの概要

CUPS印刷プロセスの完全な概要は、CUPS印刷のダイアグラム概要にある。

Figure 22.19. CUPS印刷のダイアグラム概要

[6] http://www.cups.org/cups-help.html

を参照。

Prev | Up | Next
Chapter 21. 旧式の印刷サポート | Home | Chapter 23. スタッカブルVFSモジュール