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

Kurt Pfeifle

Danka Deutschland GmbH

Ciprian Vizitiu

drawings 

Jelmer R. Vernooij

drawings 
The Samba Team

(27 Jan 2004)

Table of Contents

概要
機能と利便性
Overview
基本的なCUPSサポート設定
libcups.soを使ったsmbdとのリンク
CUPSを使う簡単なsmb.confの設定
より複雑なCUPS smb.conf設定
高度な設定
集中スプール対ピアツーピア印刷
直接印刷機能:Windowsクライアント上のベンダドライバー
Windowsクライアントドライバーのインストール
application/octet-streamのためのraw印刷を明示的に有効にする
ドライバーアップロード手法
Postscriptドライバーダウンロードを使う高度に賢い印刷
Windows上でのGDI、UNIX上でのPostScript
Windowsドライバー、GDIとEMF
UNIX印刷ファイル変換とGUIの基礎
PostScriptとGhostscript
Ghostscript: 非Postscriptプリンターに対するソフトウェアRIP
PostScriptプリンター定義(PPD)の仕様
Windows形式のベンダPPDの使用
非PostScriptプリンターのためにCUPSはPPDを使う
CUPSフィルタリングアーキテクチャ
MIMEタイプとCUPSフィルター
MIMEタイプ変換ルール
フィルタリングの概要
Prefilters
pstops
pstoraster
imagetops と imagetoraster
rasterto [プリンター固有]
CUPSバックエンド
cupsomatic/foomaticの役割
完全な図解
mime.convs
Raw印刷
application/octet-stream 印刷
非PostScriptプリンターのためのPostScriptプリンター記述
cupsomatic/foomatic-ripネイティブなCUPS印刷
フィルタリングチェインの例
CUPSドライバー/PPDの提供元
インタフェーススクリプトを伴う印刷
ネットワーク印刷(Windowsのみ)
WindowsクライアントからNT印刷サーバーへ
クライアント上でのドライバーの実行
サーバー上でのドライバーの実行
ネットワーク印刷(WindowsクライアントとUNIX/Samba印刷サーバー)
WindowsクライアントからCUPS/Samba印刷サーバーへ
Sambaによるジョブファイルの受け取りとCUPSへの引き渡し
ネットワーク PostScript RIP
UNIX上の、非PSプリンターのためのPPD
Windows上の非PostScriptプリンターのためのPPD
CUPSクライアントとしてのWindowsターミナルサーバー (WTS)
カーネルモードでのプリンタードライバーの実行は多くの問題を引き起こす
Workarounds Impose Heavy Limitations
CUPS: A Magical Stone?
カーネルモードでもPostScriptドライバーは大きな問題はない
ドライバーダウンロードを行うためのCUPSの設定
cupsaddsmb: 不明なユーティリティ
cupsaddsmb用のsmb.confの準備
Windows NT/200x/XP用のCUPSPostScript Driver
異なったドライバーファイルの認識
ドライバーファイルの入手
Windows NT/200x/XP用のESP Print Pro PostScriptドライバー
考慮すべき警告
WindowsのCUPS PostScriptドライバー対Adobeドライバー
cupsaddsmbの実行(Quiet Mode)
詳細な結果を表示するcupsaddsmbの実行
cupsaddsmbについて理解する
もしもcupsaddsmbが正しく終了した場合、どのように認識するか
Samba PDCににおけるcupsaddsmb
cupsaddsmbフローチャート
クライアント上でのPostScriptドライバーのインストール
クライアント上での危険なPostScriptドライバー設定を防止する
rpcclientを使ったPostScriptドライバーファイルの手動インストール
rpcclientマニュアルページのチェック
rpcclientマニュアルページの理解
Producing an Example by Querying a Windows Box
adddriverとsetdriverを完了させるための要求事項
15ステップでの手動ドライバーインストール
トラブルシューティング再考
印刷関連の*.tdbファイル
Trivial Database Files
バイナリ形式
*.tdbファイルの喪失
tdbbackupの使用
Linuxprinting.orgからのCUPSプリントドライバー
foomatic-rip と Foomaticの説明
foomatic-ripとFoomatic PPDのダウンロードとインストール
CUPSによるページの課金
Quotasの設定
正しいあるいは不正な課金
Windowsクライアント用のAdobeとCUPS PostScriptドライバー
page_logファイルの形式
存在する欠点
将来の構想
他のアカウントツール
追加の材料
CUPSスプールフィルターの自動削除または保存
CUPS構成の設定の説明
準備
手動の設定
Windowsに接続された印刷へのCUPSからの印刷
より詳細なCUPSフィルタリングチェーン
よくあるエラー
Windows 9x/Meクライアントがドライバーをインストール出来ない
cupsaddsmbが、無限にrootパスワードを問い合わせてくる
cupsaddsmbrpcclient addriverがエラーを出す
cupsaddsmbのエラー
クライアントがSambaプリンターに接続できない
Windows 200x/Xpからの新しいアカウント再接続のトラブル
間違ったユーザーでSambaサーバーに接続されるのを防ぐ
AdobeドライバーからCUPSドライバーにアップグレードする
PDCであるSambaサーバー上でcupsaddsmbが使えない
削除されたWindows 200xプリンタードライバーが引き続き表示されている
Windows 200x/XP ローカルセキュリティポリシー
Administratorはすべてのローカルユーザーに対してプリンターをインストールできない
NTクライアント上での印刷の変更、機能の通知
Windows XP SP1
Windows 200x/XP上ですべてのユーザーが印刷オプションを設定出来ない
Windowsクライアント上でのドライバー設定における、多くに共通する失敗
cupsaddsmbが、新しくインストールしたプリンターで動かない
/var/spool/samba/のアクセス許可が、再起動後毎回リセットされる
lpという名前の印刷キューが印刷ジョブを間違って扱ってしまう
cupsaddsmbに対するAdobe PostScriptドライバーファイルの位置
CUPS印刷プロセスの概要

概要

機能と利便性

共通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 = cupsprintcap = cupsという2つのパラメーターを必要とする。 CUPSはprintcapファイルを必要としない。しかし、cupsd.conf設定ファイルは、 サードパーティアプリケーション(例えばPrintcap /etc/printcapPrintcapFormat BSD)に便利なように、どのように、CUPSによって 自動的に作成され、管理されるファイルを制御する2つの関連するディレクトリを知っている。 旧式のプログラムはしばしばprintcapファイルに含まれているプリンター名が存在することを 要求するので、そうでないと印刷を拒否してしまう。CUPSがprintcapファイルを作成して管理する ようにしておくこと。詳細は、man cupsd.confと、 CUPS Webサイトにある、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 adminkurtで (@ntadminsグループではなくて)、ゲストアクセスは許可されず、共有は ネットワークコンピューターに公開されず(そのため、これが共有であることを知っておく 必要がある)、3つのホストのみからアクセスできる。その共有に対して、CUPSが起動し、 印刷ジョブ上で通信をすることを防ぐために、 printing = sysvprintcap = 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 = CUPSprintcap = 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.convsmime.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システムを設定したかと聞かれるだろう: ユーザーが、一定期間内での制限より超えたジョブを印刷出来ないという。

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

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

これらのゴールは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の印刷

ローカルプリンターに対する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 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

非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からの FoomaticcupsomaticPPDを 使ってはならない。それらのデバイスには、オリジナルの ベンダが提供した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    texttops
text/plain              application/postscript   33    texttops

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

フィルタリングの概要

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

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

pstops

pstopsは、application/postscriptapplication/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から中間ラスタ形式への変換ダイアグラム

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

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

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

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ラスタ形式に変換する流れ

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

rasterto [プリンター固有]

CUPSはCUPSラスタを処理するための非常に数多くのラスタドライバーを提供している。 筆者の環境では、/usr/lib/cups/filter/配下に rastertoalps,rastertobj, rastertoepson,rastertoescp, rastertopcl,rastertoturboprint, rastertoapdk,rastertodymo, rastertoescp, rastertohprastertoprinterがあった。これよりドライバーの数が少なくても 心配することはない。上記のいくつかは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.convsmime.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.ppdlabelプリンター
epson9.ppdエプソン9-ピンインパクトプリンターとその互換
epson24.ppdエプソン 24-ピンインパクトプリンターとその互換
okidata9.ppdOkidata 9-ピンインパクトプリンターとその互換
okidat24.ppdOkidata 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の図

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ファイルのすべてのページを表示する)を生成する pdftopsprefilterに、最初に渡さねばならない。

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

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

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

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

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

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

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

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

  • ファイルは、最初に、 PostScript MIMEタイプapplication/postscriptを 生成するpdftopsprefilterに渡されなければならない (ここでのプレビューは引き続きオリジナルの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チェーン

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.

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 commandlppause command)は無視される。その代わりSambaは、SambaがCUPS ライブラリ(libcups)をサポートするようにコンパイルされているとき、CUPS APIを通してCUPSと 直接やりとりする。他の印刷コマンドが設定されていない場合、印刷は、-orawオプションを 自動的に付けてパススルーする、System VAT&Tコマンドセットを 使う(もし、コンパイル時にCUPSサポートをするようしたSambaサーバーで動作するよう、個別に 定義した印刷コマンドを使いたい場合、単に classicalprinting = sysvを使う)。これは CUPS/Sambaサーバー経由での印刷ダイアグラムで図示されている。

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

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 PostScript Driver 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用のCUPSPostScript 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.gz
cups-samba.install
cups-samba.license
cups-samba.readme
cups-samba.remove
cups-samba.ss

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

root# tar tv cups-samba.ss
cupsdrvr.dll
cupsui.dll
cups.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 Software Webサイトで、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/にマップされ、WIN40W32X86という枝を持つサブディレクトリを含む)中に、ドライバーが 配置できるようになる。これは、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, these are the most important items that weigh in favor of CUPS:

  • Adobe EULAに縛られない。

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

  • Adobe ドライバー(sれに関連するプリンターのPPD要求において)はしばしば印刷ファイルの メイン部分の先頭にPJLヘッダーを置く。そのため、印刷ファイルは %!PSの代わりに<1B>%-12345X<escape>%-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_IS2027
Password for root required to access localhost via Samba: ['secret']

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

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

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

root# cupsaddsmb -U root -v infotec_2105
Password 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.0
Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]
NT_STATUS_OBJECT_NAME_COLLISION making remote directory \W32X86
putting file /var/spool/cups/tmp/3e98bf2d333b5 as \W32X86/infotec_2105.ppd
putting file /usr/share/cups/drivers/cupsdrvr.dll as \W32X86/cupsdrvr.dll
putting file /usr/share/cups/drivers/cupsui.dll as \W32X86/cupsui.dll
putting 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 printername
root# cupsaddsmb -H SAURON -U MIDEARTH\\root -v printername
root# cupsaddsmb -H SAURON -U MIDEARTH\\root -h cups-server -v printername

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

cupsaddsmbフローチャート

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

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

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 Samba version 2.2.4, or later. If it does not work, or if the automatic printer driver download to the clients does not succeed, you can still manually install the CUPS printer PPD on top of the Adobe PostScript driver on clients. 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, adddriversetdriverは最も興味があるものである。 rpcclientはMS-RPCプロトコルの重要な一部を実装している。 これをWindows NT(か200x/XP)に問い合わせ(とコマンド)を行うのにも使える。MS-RPCは Windowsクライアントによって使われ、とりわけ、ポイントアンドプリント機能に適合する ために使われる。Sambaは今、同様にこれをまねることが出来る。

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

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

adddriver <arch> <config>は、サーバー上でプリンタードライバー 情報をインストールするために、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 <printername> <drivername>は、インストール されたプリンターに関連するプリンタードライバーをアップロードするために、 SetPrinter()コマンドを実行する。プリンタードライバーはプリンターサーバー 上にあらかじめ正しくインストールされている必要がある。

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

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

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

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

マニュアルページが示すものは、実際に存在する3つのコロンで分離されたフィールド中の、 単純な<config>キーワードである。最後のフィールドは、 複数の(あまり尋常でない場合では、異なった20のもの)ファイルである。これは、最初は 混乱するように見えるかもしれない。LongPrinterNameとマニュアルページが 呼んでいるものは、実際ではドライバー名と呼ばれるべきである。これは 自由に名前を付けられ、後でrpcclient ... setdriverコマンド中で この名前を使える。実用的な理由で、多くはプリンターと同じ名前をドライバーに付ける。 What the man pages denote as a simple <config> keyword in reality consists of eight colon-separated fields. The last field may take multiple (in some very insane cases, even 20 different additional) 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 it anything 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 Monitor File in each case? For an answer, you may want to have a look at how a Windows NT box with a shared printer presents the files to us. Remember that this whole procedure has to be developed by the Samba Team by listening to the traffic caused by Windows computers on the wire. We may as well turn to a Windows box now and access it from a UNIX workstation. We will query it with rpcclient to see what it tells us and 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 Linux workstation 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 these would go into the last field ListOfFiles,Comma-separated. For the CUPS PostScript drivers, 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サブコマンド (adddriversetdriver)は、成功させるために、 以下の前提条件を準備する必要がある:

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

  • 要求されたドライバーを\\SAMBA\print$\w32x86\\SAMBA\print$\win40に、適切にすべてコピーする。 これらは、その後最終的に02という サブディレクトリで終わる。現時点では、それらをそこに 置いてはならない。それらは自動的に 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によってプリンターが認識されているかを調べるには、 rpcclientenumprintersサブコマンドを 使うことが出来る。長く存在しているバグが、各smbdプロセスがSIGHUPを受け取るか、 再起動するまで、プリンター一覧の適切な更新を阻害している。ごく最近CUPSプリンターを 作成して問題が発生した場合、Sambaを再起動することを覚えておいてほしい。

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

すべての要求されたコマンドを実行して、手動で、プリンタードライバーをインストールしてみる。 最初、これは複雑なプロセスなように見えるという理由で、手順を1つずつ、やらなければ ならない、単一のアクションアイテム毎に説明する。 We are going to install a printer driver now by manually executing all required commands. Because this may seem a rather complicated process at first, we go through the procedure step by step, explaining every single 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 mysmbtstprn
    flags:[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 driv
    
    servername:[\\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 669
    drwxr-sr-x    2 root     ntadmin       532 May 25 23:08 2
    drwxr-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"' \
      localhost
    Printer Driver mydrivername successfully installed.
    

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

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

    root# ls -l /etc/samba/drivers/W32X86/
    total 1
    drwxr-sr-x    2 root     ntadmin       532 May 25 23:22 2
    drwxr-sr-x    2 root     ntadmin       670 May 16 03:15 3
    
    root# ls -l /etc/samba/drivers/W32X86/2
    total 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 mydrivername
    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]
    

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

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

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

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

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

    root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \
      | grep driver
    drivername:[mydrivername]
     
    root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \
      | grep -C4 driv
    servername:[\\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.tdbntdrivers.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] <fname...>
 
 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.tdb
printing.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 ドライバーに対してお金を払わなければ ならない場合、最初に見に行く所は、 Linuxprinting Webサイト上にあるデータベースにすべきである。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, 96 are partially perfect, and 46 are paperweights. Keeping in mind that most of these are non-PostScript models (PostScript printers are automatically supported by CUPS to perfection by using their own manufacturer-provided Windows PPD), and that a multifunctional device never qualifies as working perfectly if it does not also scan and copy and fax under GNU/Linux then this is a truly astonishing achievement! Three years ago the number was not more than 500, and Linux or UNIX printing at the time wasn't anywhere 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 a distro maintainer and have used the previous version of Foomatic, you may want to give the new one a spin, but remember 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 following the 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 PPD associated with a print queue and modify the print job according to the user selections. Together with this comes the 100% compliance of the new Foomatic PPDs with the Adobe spec. Some innovative features of the Foomatic concept may surprise users. It will support custom paper sizes for many printers and will support printing on media drawn from different paper trays within the same job (in both cases, even where there is no support 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ジェネレータ プログラムを使う選択が出来る。

  • 正確なモデルを選択し、DownloadDisplay 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.13
tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 2 3 #marketing 10.160.50.13
tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 3 3 #marketing 10.160.50.13
tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 4 3 #marketing 10.160.50.13
Dig9110 boss 402 [22/Apr/2003:10:33:22 +0100] 1 440 finance-dep 10.160.51.33

これはジョブID401で、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は、単なる媒体 である。すなわち、通常ネイティブなCUPSpstorasterフィルターが 起動される、CUPSフィルタリングチェーン中のそのステージで、Ghostscriptコマンドラインを 実行する。cupsomaticpstorasterを バイパスし、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である。

(MaxJobsPerUserMaxJobsPerPrinterという 追加の設定もある)。

準備

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

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

  • Sambaのsmb.confprinting = cups を設定する。

  • Sambaのsmb.confprintcap = cups も設定する。

Note

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

手動の設定

すべてを手動で行いたいならば、printing = cupsprinting = 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 253
drwxr-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 epson
lrwxrwxrwx    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 pdfdistiller
lrwxrwxrwx    1 root   root      25 Apr 30 19:04 ptal -> /usr/sbin/ptal-cups
-rwxr-xr-x    1 root   root    6284 Apr 20 17:01 scsi
lrwxrwxrwx    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 usb

root# 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フィルタリングチェーン

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

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

フィルタリングチェーン1

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

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ディレクトリを作成するのを忘れている。

cupsaddsmbrpcclient addriverがエラーを出す

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

cupsaddsmbのエラー

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

CUPS上でプリンター共有を有効にしていないだろうか?これは、 cupsaddsmbが動いているホストからのアクセスを拒否する、 CUPSサーバーのcupsd.conf中に、 <Location /printers>....</Location> があるということである。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では、ポイントアンドプリントの制限ポリシーが導入された(この制限は、 AdministratorPower 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印刷のダイアグラム概要

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