2008年8月9日土曜日

Unable to connect to CUPS server localhost:631

新しく稼働したfileserver。
/var/log/messagesを見ていると、

Aug 8 01:36:19 foobar smbd[4982]: [2008/08/08 01:36:19, 0] printing/print_cups.c:cups_connect(69)
Aug 8 01:36:19 foobar smbd[4982]: Unable to connect to CUPS server localhost:631 - 接続を拒否されました


同類のエラーメッセージがsanbaを走らせると出るようになった。
サービスの設定ではどう見てもCUPSを切ってあるのだけれども・・・切ってあるから拒否なのか?
先生にお伺いを立てると、samba-jpに以下の記述を発見。

http://cgi.samba.gr.jp/pipermail/samba-jp/2007-June/000770.html

> 一応smb.conf上でもCUPS周りの設定は無効にしているのですが、何故でしょうか?

どうやって無効にしたのですか?
無効にした、という証拠のsmb.confをつけましょう。

# testparm -v | grep cups
とすると表示されませんか?

最近のSambaはデフォルトがCUPSで、コンパイル時にライブラリがリンクされて
います。
なので、明示的に無効にしないと有効になってしまいます。

例えば[global]で
printing = bsd
とかにしておくとエラーはでないはずです。


ええと・・・多分この質問者は僕と同じ事を説明しようとしたんだなあ・・・。

サービスとしてのCUPSは切ってあるけど、sambaのCUPSは有効にされていた、というオチ。

対処法は上記の通り、
smb.confのglobal設定に、
printing = bsd
を追記する。
これでエラーメッセージは出なくなる。
このbsdというのは、freebsdとかのbsdなんだろうけれども、何故ここで出るのか不明。
命令系統にbsd命令が入ってるから?
それもおかしな話だなあ・・・。
因みにOSはCentOSです。

testparmはsambaの命令で、smb.confの設定が正しいかどうかを判断してくれる。
-vはバーバス(おしゃべり)オプション。

追記
http://slashdot.jp/~ribbon/journal/422877

に、原因と説明があった。なるほど・・・半分くらいしか分からない僕は俄管理者・・・。

更に追記
ribbonさんの投稿から3年経っているので、
有益な情報として内容を引用させていただいときます。消えると多分誰も分からなくなりそうだし・・・。

最近Sambaでプリンタを使う機会は少なくなった。そのため、printers の
指定やprintersセクションを省略することが多い。しかし、そのままでは
起動時にCUPSのエラーが出る。この現象は printing = bsd にすれば直る
のだが、それもなんか変な話。調べてみると下記のような原因だった。

pcapはCUPS/SYSV/AIX用のprintcap解析ルーチン。コンパイル時に CUPSを
使えるようにしていると、このルーチンに入った場合、必ずCUPSに接続
しにいく。

理由は、 include/includes.h 内で

811 #ifndef DEFAULT_PRINTING
812 #ifdef HAVE_CUPS
813 #define DEFAULT_PRINTING PRINT_CUPS
814 #define PRINTCAP_NAME "cups"
815 #elif defined(SYSV)
816 #define DEFAULT_PRINTING PRINT_SYSV
817 #define PRINTCAP_NAME "lpstat"
818 #else
819 #define DEFAULT_PRINTING PRINT_BSD
820 #define PRINTCAP_NAME "/etc/printcap"
821 #endif
822 #endif

と定義されていて、既定値のPRINTCAP_NAME が cups になっている。
この状態において、param/loadparm.c のlp_princapname() 内で、
グローバルパラメータの、printcap name が未定義か、空っぽの場合、
かつ、printing が bsd以外の場合、既定値のprintcap 名を返す。
これは、 pcap_cache_reload の冒頭部分で、

const char *pcap_name = lp_printcapname();

として設定されるため、cupsサーバがあろうがなかろうが、printer
パラメータで、bsdを指定しない以外、必ず、caps_cache_reload() ⇒
caps_connect() を呼び、cups サーバに繋ぎにいく。そのため、

[2007/11/29 11:08:33, 3] printing/pcap.c:pcap_cache_reload(117)
reloading printcap cache
[2007/11/29 11:08:33, 5] printing/print_cups.c:cups_cache_reload(71)
reloading cups printcap cache
[2007/11/29 11:08:33, 10] printing/print_cups.c:cups_server(51)
cups server left to default localhost
Unable to connect to CUPS server localhost - 接続を拒否されました

というようなエラーが出る。

後おまけ。

[2007/11/29 11:08:33, 7] param/loadparm.c:lp_servicenumber(5121)
lp_servicenumber: couldn't find printers

これは、[printers]セクションがない時に出力される。
param/loadparm.c:lp_survicenumber()において、すべてのサービスを
検索し、見付からないとこのエラーが出る。

0 件のコメント:

コメントを投稿