Zeroconf
そろそろネットワーク周りのところに差し掛かってきたので、Zeroconfについて計画を練らないと。
VIVERはローカルエリアネットワークがターゲット、と決めてしまっているので、Zeroconfは極めて便利。極めて便利。便利なんです。
Zeroconfと総称してしまうと微妙だけど、Zeroconf = DNS-SD(DNS Service Discovery) + mDNS(Multicast DNS) + Auto-IP の総称。
VIVER本体での利点は3つ。
- DNS-SDでNBDサーバー(あるいは、ブートパラメータサーバーのようなモノ)を自動検出できる
- mDNSでクライアントマシンの名前解決が出来る
- Auto-IPでIPアドレスをDHCP無しでうまく振れる
DNS-SDは、要するにDNSのSRVレコードやTXTレコードに入れる情報を規格化して、DNSを使ってサービスを検出してやろうという話らしい。
SRVレコードに入れるサービスタイプ一覧
たとえばSRVレコードに_nfs._tcpと入れて、TXTレコードにpath=/home/viver/FileServerなどと入れる。クライアントはDNSの問い合わせをしたときに、NFSのファイル共有サービス発見!となる。
mDNSは、DNSをマルチキャストと上手なキャッシュでやりくりする技術らしい。
ネットワークに接続されたマシンがmDNS応答デーモンを動かしておいて、「あんた誰だ!」要求(←マルチキャスト)が飛んできたら、「名前は***でIPは***でSRVレコードは***でTXTレコードは***だ!」みたいな応答をマルチキャストする。そしてうまいことキャッシュ。そんな簡単な話ではないらしい。でも基本的な流れはこれで合っているはず。
これでDNSサーバー無しでお互いの名前解決が出来るようになる。
重要なのはDNS-SDとの組み合わせで、"サーバー"無しでネットワークの中に提供されているサービスを検出できる。
Auto-IPは、DHCPサーバー無し衝突しないIPアドレスを振る。
169.254.0.0/16の中から適当にIPアドレスを選んで、ARPで問い合わせてみる。衝突していないようなら、そのIPアドレスを採用。
たとえば今はNBDサーバーをブートパラメータで指定しないといけないので、TFTPサーバーとなったマシンは、NBDサーバーのIPアドレスを知っていないといけない。自分がNBDサーバーなら良いが、そうでないと困る。(困りはしないけど、ユーザーが設定しないといけない)
あるいはPXEなしで起動したときは、起動時に自分でNBDサーバーのIPアドレスを指定しないといけない。
VIVER本体でNBDサーバーのIPアドレスをDNS-SDで検出できれば、指定しなくて良くなる。
ディスクから起動したとき、DHCPサーバーが無いかもしれない。そのときにどんなIPを振るか?10.0.0.1か?Auto-IPか?と言ったら、後者の方が良い気がする。
PXEを使うならDHCPを起動しないといけないのだけど、使わないならそのまま全部Auto-IPでも良い。(PXEを使わないというのは、PXEにはセキュリティの問題が大いにあるので、使わない方法も採れるようにしたい。ディスクイメージの暗号化かVPNが必要になるけど、まだ考えていない…)
プラグインでやるレベルまで行くとさらにいろいろ考えられるけど、とりあえず今はいい。
自宅のネットワークではMac入手前からmDNSを全面採用していて、これが非常に便利。VMを作るときにも必ずmDNS応答デーモンと、Name Service SwitchでmDNSを使うためのモジュールをインストールすることにしている。VMを何台コピー/削除しても、(←MACアドレスが変わるのでDHCPで振られるIPアドレスが変わる)いつも名前解決が出来る。mDNS導入前はifconfigがお友達だったものの、今ではほとんど叩かない。
で、Zeroconfを使うのは良いとして、どうやって実装しようかなぁ…
考えた方法は以下。
- 全部自分で作る
- Appleのフリーな実装Bonjour(←フリーでもない部分があるらしいので、要調査)を使う
- freedesktop.orgのフリーな実装Avahiを使う
- howlを使う
さてどうしよう…