CUPSでLinuxのプリンタ (PIXUS) を共有する

(2005.3.23公開。)

(2005.6.25 Fedora Core 4に対応。)

Linux機に接続されたプリンタをWindows機で共有する方法について。

ほかのサイトでもCUPSを使った共有方法について書いているところがあるが、より新しい組み合わせで試してみる。

環境について

Linux機は、Fedora Core 3をベースにしたもので、これにCanon PIXUS iP4100を接続している。

LANには、この機械のほか、Windows機(Windows XP ProとWindows XP Home)が繋がっている。

プリンタを共有する方法

プリンタを共有するには、次の方法がある。

  • Sambaを使う
  • CUPSを使う

Sambaを使う場合は、実際に印刷するために、裏でCUPSを使用する。

以前は、Samba 2.2 + LPRngという組み合わせが主流だった(私の家でもこの組み合わせだった。)が、LPRngからCUPSへの移行が進み、Fedora Coreでは、LPRngは含まれてもいない。

Sambaで共有する

Fedora Core 3には、Samba 3.0が含まれている。しかし、どうやってもプリンタの共有設定ができなかった。CUPS、LPRngの両方で試してみたがダメだった。ファイルサーバとしては順調に動いているが。

クライアントでプリンタを使おうとすると、「選択したプリンタに接続するためのコンピュータへの十分なアクセスがありません。」と出てしまう。サーバのエラーログを見ると、クライアントが拒絶しているようだが、どういうことか。machine <クライアントホスト名> rejected the NetBIOS session request.

CUPSでプリンタを使う

(2005.6.25更新; Fedora Core 4対応)

Linuxで印刷するには、Linux用のドライバが必要。幸いCanonはLinux用ドライバを提供している。

PIXUS iP4100用のフィルタコマンドとCUPS用追加モジュールをダウンロードする。

libglade.so.0, libxml.so.1が求められるので、あらかじめこれらをインストールする。libgladeをインストールすればlibxmlも自動的にインストールされる。

Fedora Core 4では、次のようにすればインストールできる。

# yum install libglade
# rpm --install bjfilter-common-2.50-2.i386.rpm 
# rpm --install bjfilter-pixusip4100-2.50-2.i386.rpm 

次に、CUPSにプリンタを登録する。Canonが配布している印刷ガイドのデバイスURIでは上手くいかなかった。次のように打つといい。

# /usr/sbin/lpadmin -p iP4100 -m canonpixusip4100.ppd -v parallel:/dev/lp0 -E

-pオプションでプリンタ名を、-mオプションでppdファイルを、-vオプションで接続先を指定する。また、-Eオプションでこのプリンタを有効にする。

これだけで設定は完了。この設定は、/etc/cups/printers.conf や、ppds.dat に書き込まれる。

Fedora Core 3には、GUIで設定できるsystem-config-printerコマンドがあるが、lpadminコマンドでの設定を無視するようなのと、ppdファイルを指定する方法が分からなかった。これは使用しないほうがいいだろう。

lpadminで登録した後は、ポート631にWebブラウザでアクセスして、テストページを印刷したり、設定を変更できたりする。ここで一旦、テストページを印刷できるか確認しておいたほうがいい。

プリンタを共有する

サーバ(Linux)の設定

CUPSは、Internet Printing Protocol (IPP) をサポートしている。これは、ネットワークを介して別の機械から印刷するためのもの。ポート631を用いる。

知らない機械どこからでも印刷されては困るので、許可するホストを指定したりする必要がある。

Webブラウザでは設定できないので、いくつかの設定ファイルを手で書き換える。

  1. /etc/cups/mime.convs

    ファイルの一番下のほう、次の行がコメントアウトされている場合は、これを有効にする(行頭の#を削除する)。

    application/octet-stream	application/vnd.cups-raw	0	-
    
  2. /etc/cups/mime.types

    これもファイルの一番下のほう、次の行がコメントアウトされている場合がある。そのときは、有効にする。

    application/octet-stream
    
  3. /etc/cups/cupsd.conf

    CUPSサーバの設定ファイル。書式はApacheの設定ファイルに似ている。CUPSは、次の仮想的なディレクトリを持っていて、それぞれにアクセスを許可するホストなどを設定できる。

    Location 意味
    / すべての操作
    /admin プリンタの追加、設定変更など。
    /classes 複数のプリンタを束ねるためのクラス。
    /jobs 印刷ジョブ。
    /printers すべてのプリンタ
    /printers/<プリンタ名>特定のプリンタ。

    少なくとも/printers/<プリンタ名>にはクライアントからアクセスできなければならないことが分かる。単純に、次のようにして、LAN内の機械からはすべてのディレクトリに対してアクセスできるようにするのがいい。

    <Location />
    Order Deny,Allow
    Deny From All
    Allow From 127.0.0.1
    Allow From 192.168.0.*
    </Location>
    

    scheduler/ipp.cを読むと、adminディレクトリに対するアクセス許可で可能になるコマンドは、次のとおり。/adminはローカルホストに限定するようにしてもいい。

    accept_jobs (IPP_ENABLE_PRINTER), add_class (CUPS_ADD_CLASS), add_printer (CUPS_ADD_PRINTER), cancel_all_jobs (IPP_PURGE_JOBS), delete_printer (CUPS_DELETE_PRINTER), reject_jobs (IPP_DISABLE_PRINTER), set_default (CUPS_SET_DEFAULT), start_printer (IPP_RESUME_PRINTER), stop_printer (IPP_PAUSE_PRINTER)

以上でクライアント(Windows機)から印刷できるようになるが、これだけだと自分の印刷ジョブをキャンセルできない。キャンセルしようとすると、「アクセスが拒否されました」と出る。印刷開始はできるので悩むところ。

サーバのエラーログを見ると、cancel_job: "anonymous" not authorized to delete job id 19 owned by "<ユーザ名>"! となっている。(または、Unable to open /etc/cups/passwd.md5 というメッセージ。) 印刷を開始するときはユーザ名があるが、キャンセルしようとするときはユーザ名がないみたい。RFC 2911によるとクライアントがユーザ名を指定することになっているので、Windowsに問題があるようだ。

この問題を本質的に解決する方法は分からなかった。お茶を濁すようだが、常にあるユーザとみなすようにして回避する。

<Location /jobs>
AuthClass Group
AuthType BasicDigest
AuthGroupName sys
</Location>

lppasswdコマンドでユーザを追加する。パスワードは(実際には使われないので)何でもいい。

# lppasswd -g sys -a anonymous

-aオプションは、新しいユーザーを追加する。

クライアント(Windows)の設定

クライアントのWindows機では、単にプリンタドライバをインストールすればいい。「プリンタの追加ウィザード」の接続するプリンタを指定するところで、次のURLを入力する。http://で始まるが、実際のプロトコルはHTTPではない。

  • http://<サーバのホスト名>:631/printers/<プリンタ名>

これだけで印刷できるようになる。

ただ、このままでは、ユーザーによってはプリンタの設定ができなかったりする(プリンタのプロパティで[詳細設定]タブがグレーアウトするなど)。サーバーではなく、Windowsでのセキュリティ(アクセス許可)の設定を変更する必要がある。

Windows XPでは、「印刷」、「プリンタの管理」、「ドキュメントの管理」という権限が出来あいで用意されている。一人で使う場合はEveryoneにすべての許可を、そうでないときは、Administratorsにすべての許可を、Everyoneには印刷の許可を付けるといいと思う。

仕様など

IPPの仕様はかなり大きい。

  • RFC 2567, Design Goals for an Internet Printing Protocol. F. Wright. April 1999. (Status: EXPERIMENTAL)
  • RFC 2568, Rationale for the Structure of the Model and Protocol for the Internet Printing Protocol. S. Zilles. April 1999. (Status: EXPERIMENTAL)
  • RFC 2569, Mapping between LPD and IPP Protocols. R. Herriot, Ed., T. Hastings, N. Jacobs, J. Martin. April 1999. (Status: EXPERIMENTAL)
  • RFC 2910, Internet Printing Protocol/1.1: Encoding and Transport. R. Herriot, Ed., S. Butler, P. Moore, R. Turner, J. Wenn. September 2000. (Obsoletes RFC2565) (Updated by RFC3380, RFC3381, RFC3382, RFC3510, RFC3995) (Status: PROPOSED STANDARD)
  • RFC 2911, Internet Printing Protocol/1.1: Model and Semantics. T. Hastings, Ed., R. Herriot, R. deBry, S. Isaacson, P. Powell. September 2000. (Obsoletes RFC2566) (Updated by RFC3380, RFC3382, RFC3996, RFC3995) (Status: PROPOSED STANDARD)
  • RFC 3196, Internet Printing Protocol/1.1: Implementor's Guide. T. Hastings, C. Manros, P. Zehler, C. Kugler, H. Holst. November 2001. (Obsoletes RFC2639) (Status: INFORMATIONAL)

さらにアップデートとして、

  • RFC 3380, Internet Printing Protocol (IPP): Job and Printer Set Operations. T. Hastings, R. Herriot, C. Kugler, H. Lewis. September 2002. (Updates RFC2910, RFC2911) (Status: PROPOSED STANDARD)
  • RFC 3381, Internet Printing Protocol (IPP): Job Progress Attributes. T. Hastings, H. Lewis, R. Bergman. September 2002. (Updates RFC2910) (Status: PROPOSED STANDARD)
  • RFC 3382, Internet Printing Protocol (IPP): The 'collection' attribute syntax. R. deBry, T. Hastings, R. Herriot, K. Ocke, P. Zehler. September 2002. (Updates RFC2910, RFC2911) (Status: PROPOSED STANDARD)
  • RFC 3510, Internet Printing Protocol/1.1: IPP URL Scheme. R. Herriot, I. McDonald. April 2003. (Updates RFC2910) (Status: PROPOSED STANDARD)
  • RFC 3995, Internet Printing Protocol (IPP): Event Notifications and Subscriptions. R. Herriot, T. Hastings. March 2005. (Updates RFC2911, RFC2910) (Status: PROPOSED STANDARD)
  • RFC 3996, Internet Printing Protocol (IPP): The 'ippget' Delivery Method for Event Notifications. R. Herriot, T. Hastings, H. Lewis. March 2005. (Updates RFC2911) (Status: PROPOSED STANDARD)

そのほかの情報として、

  • RFC 3239, Internet Printing Protocol (IPP): Requirements for Job, Printer, and Device Administrative Operations. C. Kugler, H. Lewis, T. Hastings. February 2002. (Status: INFORMATIONAL)
  • RFC 3997, Internet Printing Protocol (IPP): Requirements for IPP Notifications. T. Hastings, Ed., R. K. deBry, H. Lewis. March 2005. (Status: INFORMATIONAL)
  • RFC 3998, Internet Printing Protocol (IPP): Job and Printer Administrative Operations. C. Kugler, H. Lewis, T. Hastings, Ed.. March 2005. (Status: PROPOSED STANDARD)