Avahi絡みで恐ろしく手間取ったことがあったのでメモしておく。
もともと自分の環境では、プリンター(EPSONのインクジェットPX-101)をApple製のNAS(と言って良いのか知らんが)であるTimeCapsuleにつないで「Bonjour(Apple製Zeroconf)」経由で、いくつかのホストPCから印刷していた。
ホストPCはMacとWindowsで、Macの場合はほとんど何もせずに、Windowsの場合は「Bonjour for windows」というApple謹製のアプリがあるので、それを使って問題なく印刷できていた。
ここに、あらたにUbuntu 14.04LTSを搭載したホストPCを追加しようとしたのが事の発端である。 以下に手順をまとめておく。
TimeCapsuleのUSBポートに接続したプリンターの電源を入れておく。
Ubuntuトップメニュー右端の歯車メニューから「システム設定...」を選択。
「ハードウェア」内にある「プリンター」をクリック。
「ネットワークプリンター」の行を展開し、しばらく待つとTimeCapsuleに接続したプリンタ名が表示される(例: Epson PX-101...など)。 ここで表示されなければ、TimeCapsuleとの接続が疑わしい。もしくはプリンターの電源が入ってないとか。
表示されたプリンター名をクリックして「進む」ボタンをクリック。
「ドライバーを検索中」ダイアログが表示されて、ドライバのインストールが開始する。 余程マイナーなプリンタでない限り、ここで見つかるだろう。
「プリンターの説明」ウィンドウが表示されるので、適当に入力して「適用」をクリック。
「テストページを印刷しますか?」というダイアログが表示されるので「テストページの印刷」をクリック。 「送信しました」というダイアログが表示される。 この時にプリンターでテストページの印刷が始まればお目出度う。この後の設定は不要です。
プリンターのプロパティダイアログの「プリンターの状態」で「処理中 - プリンターが応答していません。」と出ていた場合は、私が被った問題と同じことが起きていると思われる。
TimeCapsule自体には当然IPアドレスがあるが、そのUSBポートにつながっているプリンターにも「それとは別の」IPアドレスが割り当てられる。 ただし、このIPアドレスは一般的なローカルIPアドレス(例: 192.168.*.*など)ではなく、リンクローカルアドレス(169.254.*.*/16)が使われている。
「プリンターが応答していません」と出た場合は、ubuntuから送信されたリンクローカルアドレスが、ちゃんとTimeCapsuleに届いていない可能性が考えられる。
自分のネットワーク環境では、TimeCapsuleをブリッジとして使用しており、WANにはBuffalo製のルーターを使っている。UbuntuをインストールしたホストPCは、このプリンター宛リンクローカルアドレス(169.254.*.*)へのデータ送信をBuffaloルーターへ投げていた。
Buffaloルーターにとっては、こんなアドレスを知る由もなく、データは無視され、結局先の現象となっていた。
とりあえず、リンクローカルアドレスへの送信は、すべてTimeCapsuleに投げる事にする。
この静的ルーティングの設定は/etc/network/if-up.d/へstatic-routesを作り(既にあれば追記)、以下のような行を追加すれば良い。 忘れずに実行属性(chmod +x)を付けておくこと。
#!/bin/sh /sbin/route add -net 169.254.0.0 gw <TimeCapsuleのIPアドレス又はAvahi名> netmask 255.255.0.0 dev <eth0などのIF名>
自分のように、TimeCapsuleをブリッジとして使っている場合は、IPアドレスをDHCPで割り当てると思うので、Avahi名を使った方が良いと思う。 Avahi名は、ベースステーション名(AirMacユーティリティを起動した時に表示される名前)に「.local」を付けたものだ。自分は「TimeCapsule」と名づけたので「TimeCapsule.local」がAvahi名になる。
また、インターフェース(IF)名は、無線LANの場合はwlan0あたりになるだろう。この点はifconfigで調べれば良い。