(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 2.2 + LPRngという組み合わせが主流だった(私の家でもこの組み合わせだった。)が、LPRngからCUPSへの移行が進み、Fedora Coreでは、LPRngは含まれてもいない。
Fedora Core 3には、Samba 3.0が含まれている。しかし、どうやってもプリンタの共有設定ができなかった。CUPS、LPRngの両方で試してみたがダメだった。ファイルサーバとしては順調に動いているが。
クライアントでプリンタを使おうとすると、「選択したプリンタに接続するためのコンピュータへの十分なアクセスがありません。」と出てしまう。サーバのエラーログを見ると、クライアントが拒絶しているようだが、どういうことか。machine <クライアントホスト名> rejected the NetBIOS session request.
(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ブラウザでアクセスして、テストページを印刷したり、設定を変更できたりする。ここで一旦、テストページを印刷できるか確認しておいたほうがいい。
CUPSは、Internet Printing Protocol (IPP) をサポートしている。これは、ネットワークを介して別の機械から印刷するためのもの。ポート631を用いる。
知らない機械どこからでも印刷されては困るので、許可するホストを指定したりする必要がある。
Webブラウザでは設定できないので、いくつかの設定ファイルを手で書き換える。
ファイルの一番下のほう、次の行がコメントアウトされている場合は、これを有効にする(行頭の#を削除する)。
application/octet-stream application/vnd.cups-raw 0 -
これもファイルの一番下のほう、次の行がコメントアウトされている場合がある。そのときは、有効にする。
application/octet-stream
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機では、単にプリンタドライバをインストールすればいい。「プリンタの追加ウィザード」の接続するプリンタを指定するところで、次のURLを入力する。http://で始まるが、実際のプロトコルはHTTPではない。
これだけで印刷できるようになる。
ただ、このままでは、ユーザーによってはプリンタの設定ができなかったりする(プリンタのプロパティで[詳細設定]タブがグレーアウトするなど)。サーバーではなく、Windowsでのセキュリティ(アクセス許可)の設定を変更する必要がある。
Windows XPでは、「印刷」、「プリンタの管理」、「ドキュメントの管理」という権限が出来あいで用意されている。一人で使う場合はEveryoneにすべての許可を、そうでないときは、Administratorsにすべての許可を、Everyoneには印刷の許可を付けるといいと思う。
IPPの仕様はかなり大きい。
さらにアップデートとして、
そのほかの情報として、