DebianでAirPrint

環境: Debian 7.0 wheezy、初代iPad、iPhone5

DebianでAirPrintを使う

アップルのiPhoneやiPadは、ネットワークに接続した機器の提供するサービスを設定なしで使うための、Bonjourという規格で通信をすることができます(*1)。昔のMacは他のMacや周辺機器との接続にAppleTalkというプロトコルが使われていて、つなげばすぐに使えるというのが売りでした。WindowsのSMBとともに、独自の規格のため、たとえば、Linuxで両者を使うには、AppleTalkにはNetatalk、SMBにはSambaというソフトウェアを使わなければなりませんでした。その後、ローカルなネットワークでもインターネット・プロトコル(TCP/IP)が使われるようになり、AppleではTCP/IPでもAppleTalkと同じ機能が使える規格としてBonjourを開発した、ということのようです。一方、AppleTalkは段階的に廃止する方針のようです(*2)

  1. アップルのサイトにあるBonjourのページからOverviewやテクニカルドキュメントを参照することができます。
  2. AndroidがJelly Bean(4.1.x, 4.2.x)からmDNS、DNS-SDをサポートし始めたそうです。How to use the new android.net.nsd package for Zeroconfを参照。

ネットワークに接続したiPhoneやiPadは、Bonjour語を話していますから、それを理解できるプリンタなら何もせずにAirPrintが使えることになります。AirPrint対応プリンタというのはBonjour語を話せるプリンタということなわけです。それなら、TCP/IPは話せるけれども、Bonjour語は話すことができないプリンタはどうればよいのか、ということになります。TCP/IPもBonjourも話せる機器が間に入れば、両者の通訳をすることができるはずです。もちろん、Linuxがその通訳を務めます。

AirPrint、CUPS、Avahiなどのキーワードで検索をすると、この仕組みを利用したHOWTOがたくさんヒットします。遅ればせながら、わが家もDebian wheezyを使って、AirPrintできるようにしましたので、やりかたを書いておきます。このページでしか知ることのできない情報というのは——たぶんありません。:-) また、GNOMEもKDEも入っていませんので、それらに付属の設定ツールを利用したやり方は書いてありませんので、他のサイトをお探しください。

CUPSとCanon MG6130ドライバ設定

インストールのときにCUPSは入れてあるので、Canonのgs用フィルタをインストールします。Canonはプリンタや複合機のLinux用ドライバを昔から配布していて、わが家のMG6130用ドライバもIJ Printer Driver Ver.3.40 for Linuxからダウンロードできます。ファイル名は、cnijfilter-mg6100series-3.40-deb.tar.gzとなっていました。以前は「ドライバ」ではなくて、「フィルタ」と呼んでいた記憶があるのですが、ファイル名は今でも「フィルタ」なのですね。説明に従ってインストールします。

$ tar zxvf cnijfilter-mg6100series-3.40-deb.tar.gz
$ cd cnijfilter-mg6100series-3.40-deb
$ sudo ./install.sh

あとはこのスクリプトが、CUPSデーモンを止めるところから、ドライバのインストール、設定ファイルの作成、デーモンの再起動まですべて面倒を見てくれます。Canonがgsのフィルタを配布し始めた頃は、/etc/printcapを編集した記憶がありますが、今では/etc/printcapファイルそのものが存在しません。自分が完全にout of dateになってしまっていることが実感できます。どこにどんなファイルが入ったかは、下のコマンドで見ることができます(/etc/cups以下の設定ファイルはリストされません)。

$ dpkg -L cnijfilter-mg6100series

CUPS用設定ファイルが、/etc/cups以下のディレクトリに作られています。

/etc/cups/ppd/MG6130.ppd
/etc/cups/printers.conf

Stateはプリンタの初期状態を指定するのですが、Stoppedになっていたので、Idleに変更しました。また、ErrorPolicyはプリンタ・エラーの時の動作を指定するところですが、stop-printerとなっていたので、abort-jobに変更しました。

$ man printers.conf

で、それぞれの項目に設定できる値を見ることができます。

これで設定は終了ですが、GNOMEもKDEも動いていませんので、外からブラウザでお手軽にプリンタの状態を見ることができるように、cupsデーモンの設定を少し変更しておきます。

CUPSの設定ファイルは、Apacheと似ているようで、微妙に違いがあるようです。1行にまとめては書けないようなので、2行に分けて許可するアドレスを指定しました。ウェブで検索すると、"ServerAlias *"を書き加えている方が多いようですが、そのままのホスト名でアクセスするので、指定していません。これで、他のPCからブラウザで設定画面を見ることができます。この、cupsd.confにもマニュアル・ページがありますので、下のコマンドで読むことができます。

$ man cupsd.conf

これで、本体からでも他のPCからブラウザを通してでも、テストプリントができればCUPSの設定は終了です。

CUPS HOME

Avahi設定

さて、今度は、DebianがBonjourを話せるように設定しましょう。Linux側で旧Netatalkにかわるものは、Avahiといいます。

インストールのときにネットワーク関連は一通り入れたので、SambaもAvahiもすでにインストール済みです。本体はavahi-daemonといいます。インストールされていない場合は、

$ sudo apt-get install avahi-daemon avahi-utils

で、必要なライブラリもインストールされるはずです。ユーティリティが必要ない場合は、avahi-daemonだけ指定します。

設定ファイルは、/etc/avahi以下にまとめられています。

  • /etc/avahi/avahi-daemon.conf
  • /etc/avahi/hosts

それぞれのファイルは、インストールした段階で、以下のようになっています。

設定できる項目は、マニュアル・ページに詳細な説明があります。下の表では簡単な説明をつけましたが、実際のマニュアルを参照してください。。

SECTION [SERVER]
host-name avahiデーモンがLANに登録するホスト名。省略すると、システムのホスト名が使われる。
domain-name デフォルトのドメイン名。省略すると、.localが使われる。
browse-domains ブラウズするドメインをカンマで区切ったリスト。
use-ipv4 yesまたはno。名前のとおり。
use-ipv6 yesまたはno。名前のとおり。
allow-interfaces avahiデーモンが利用するネットワーク・インターフェイス。カンマ区切りで複数指定できる。
deny-interfaces avahiデーモンが無視するネットワーク・インターフェイス。allow-interfacesより優先される。
check-response-ttl yesまたはno。yesなら、追加のセキュリティチェックをする。新しいmDNSとは非互換なので、デフォルトでnoになっている。
use-iff-running yesまたはno。ネットワークドライバのIFF_RUNNINGフラグをモニタする。サポートしないドライバが多いので、デフォルトno。
enable-dbus yes、noまたはwarn。yesでD-Busに接続する。コンパイルオプションに–enable-dbusがついていれば使える。warnは接続に失敗しても起動する。
disallow-other-stacks yesまたはno。yesとすると、他のプロセスはUDPポート5353に接続できない。
allow-point-to-point yesまたはno。インターフェイスにPOINTTOPOINTフラグをセットする。セキュリティ・ホールになる可能性があるので、デフォルトno。
cache-entries-max 符号なし整数でキャッシュの大きさを指定する。
clients-max 符号なし整数で、D-Busを共有できるクライアント数を指定する。
objects-per-client-max 符号なし整数で、1度にD-Busクライアントが登録できるオブジェクト数を指定する。
entries-per-entry-group-max 符号なし整数で、1度にD-Busクライアントが登録できるエントリ数を指定する。
ratelimit-interval-usec 符号なし整数で、インターフェイス毎のパケット転送率制限の間隔を指定する。
ratelimit-burst 符号なし整数で、一定時間にavahiデーモンが生成するパケット数の上限をコントロールする。
SECTION [WIDE-AREA]
enable-wide-area yesまたはno。有効にすると、.localで終わるドメインだけがmDNSで解決され、他は全てユニキャストDNSを通して解決されるようになる。
SECTION [PUBLISH]
disable-publishing yesまたはno。yesにすると、avahiは何もパブリッシュしない。デフォルトno。
disable-user-service-publishing yesまたはno。yesにすると、avahiはアドレスをパブリッシュするが、他のユーザ・アプリケーションはサービスをパブリッシュできない。
add-service-cookie yesまたはno。yesにすると、ローカルに登録されたサービスにTXTエントリが追加される。デフォルトno。
publish-addresses yesまたはno。yesにすると、avahiデーモンは全てのローカルIPアドレスに対するmDNSアドレスの記録を登録する。デフォルトyes。
publish-hinfo yesまたはno。yesにすると、avahiデーモンは、全てのインターフェイスについて、OSとCPUの情報を登録する。
publish-workstation yesまたはno。yesにすると、avahiデーモンは、_workstation._tcpのサービスを登録する。デフォルトyes。
publish-domain yesまたはno。yesにすると、avahiデーモンはローカルで使われているドメイン名を通知する。デフォルトyes。
publish-dns-servers ユニキャストDNSサーバのIPアドレス。カンマ区切りで複数指定できる。mDNSを通してDNSサーバを通知できる。
publish-resolv-conf-dns-servers yesまたはno。yesにすると、publish-dns-serversで指定した以外に、/etc/resolv.confのDNSサーバも通知する。デフォルトno。
publish-aaaa-on-ipv4 yesまたはno。yesにすると、avahiデーモンは、IPv4を通してIPv6のAAAAレコードを送信する。IPv6のアドレスがIPv4のトランスポートを使って解決できる。use-ipv4=trueとともに使うこと。デフォルトyes。
publish-a-on-ipv6 yesまたはno。yesに設定すると、avahiデーモンは、IPv6を通してIPv4のレコードを送信する。上の逆。use-ipv6=trueで使うこと。デフォルトno。
SECTION [REFLECTOR]
enable-reflector yesまたはno。yesにすると、avahiデーモンは、受け取ったmDNSリクエストを全てのローカル・ネットワーク・インターフェイスに返す。デフォルトno。
reflect-ipv yesまたはno。これがyesで、enable-reflectorが有効なら、IPv4とIPv6の間でmDNSがフォワードされる。推奨されない。デフォルトno。
SECTION [RLIMITS]
rlimit-as プロセスの仮想メモリ上限。バイト値。
rlimit-core コアファイルの上限。バイト値。デバッグしないなら0でも安全。
rlimit-data プロセスのデータセグメント上限。バイト値。システムに依存する。
rlimit-fsize プロセスが作るファイルサイズの上限。avahiデーモンはディスクにファイルを書き込まないので、0にしても安全。
rlimit-nofile オープンするファイルディスクリプタ数。avahiデーモンは15から20を越えてファイルを必要とするべきではない。
rlimit-stack プロセス・スタックの上限。バイト値。システムに依存する。
rlimit-nproc ユーザ・プロセス数。avahiデーモンはchroot(2)ができるところでは、補助プロセスをフォークするので、2より小さくしてはいけない。

サービスの設定ファイルは、/etc/avahi/services以下にまとめられています。udisksがすでにファイルを作っていて、MG6130用のものを追加して、下のようになりました。

  • /etc/avahi/services/udisks.service
  • /etc/avahi/services/AirPrint-MG6130.service

ファイルの中身です。

AirPrint-MG6130.serviceの方は、スクラッチから書くのは難しいので、airprint-generate.pyに作ってもらいました。ダウンロードして実行するだけです。できたファイルは下のようになっていました(改行を入れて読みやすくしてあります)。

このファイルの形式には、Appleの文書Bonjour Printing Specificationがあります。サービスのタイプは、DNS SRV (RFC 2782) Service Typesでも説明されています。それによると、「_<サービス>._<プロトコル>.<ドメイン>」という形で、ドメインは.localが追加されるようです。上の例なら、_ipp._tcp.localとなります。Appleの文書では、下のように示されています。

プロトコル サービス・タイプ
LPR _printer._tcp
IPP _ipp._tcp
AppSocker
PhaserPort
JetDirect
Port 9100
_pdl-datastream._tcp

TXT recordは付加情報のことで、Appleの文書で説明されているのは次のものでした。

TXT Record Keys
txtvers TXT recordのバージョン番号。
rp キューの名前。ユーザに表示される名前ではない。IPP TXT recordで使われる場合は、特定のプリント・キューに対するIPP URLのフルパスになる。上の例では、ipp://:/printers/MG6130となる。ポート番号が9100のときはこれを指定してはいけない。
note プリンタの場所を指定する。プリンタをセットアップするときにこの文字列が表示される。
qtotal この値はキューの合計数を指定する。よって、特定のポートを使うプロトコルに登録されたTXT recordの合計数ともなる。
priority 0-99の間で指定する。数字の小さい方が優先順位が高い。デフォルトのプロトコルとキューを指定することができる。
ty プリンタのベンダとモデルを記述する。ユーザが読める形式の記述がよい。
product ポストスクリプト・プリンタでも非ポストスクリプト・プリンタでも、CUPSを使うものは、PPDの中で"Product"の値となっているものと同じでなければならない。あるいは、開き括弧、製造者名、スペース、モデル名、閉じ括弧の形になっていなければならない。
pdl この値は、プロトコルあるいはキューでサポートされるページ記述言語のMIMEタイプをカンマ区切りで指定しなければならない。カンマで終わってはならない。
adminurl プリンタまたはキューの環境設定ページのURLを指定する。
usb_MFG プリンタの1284ディバイスIDから取得できる製造者の値。
usb_MDL プリンタの1284ディバイスIDから取得できるモデル名。
Printer Protocol TXT Record Keys
Transparent プリント・キューが00-1F文字コードを受け取ることができるなら、"T"を指定する。指定がない場合は、"F"と同じになる。
Binary プリント・キューが80-FF文字コードを受け取ることができるなら、"T"。8ビット・バイナリを示すのに、Transparentキーとともに使うことができる。
TBCP プリント・キューがTagged Binary Communication Protocolを受け取ることができるなら、"T"を指定する。指定がない場合は、"F"と同じになる。
Printer Feature TXT Record Keys
Color カラー印刷
Copies 高速印刷
Duplex 両面印刷。T, T, U
PaperCustom カスタム用紙サイズ。T, F, U
Bind 縁をつける。T, F, U
Collate 丁合を取る。T, F, U
Sort 並べ替え。T, F, U
Staple ホチキスどめ。T, F, U
Punch パンチ穴。0, 2, 3, 4, U
PaperMax 最大用紙サイズ。

最低限、名前とポートとサービス・タイプがあれば十分のようですが、今回はそのまま使うことにしました。設定ファイルの編集が済んだら、サーバを再起動します。

$ sudo /etc/init.d/avahi-daemon restart

$ avahi-browse -a
+    ra0 IPv4 Canon MG6100 series _773CC32BA1B7
+    ra0 IPv6 AirPrint MG6130 @ debian
+    ra0 IPv6 debian
+    ra0 IPv4 AirPrint MG6130 @ debian
+    ra0 IPv4 debian

これで、やっとAirPrintが使えるようになりました。iPad、iPhoneどちからも印刷できます。

One thought on “DebianでAirPrint

  1. Pingback: avahi をセットアップする | Meaningless Notebook

Leave a Reply