![]() |
running-dog.net。しかし、自分が一番落ち着かない。かけまわっている子犬のような状態。そんな毎日をブログで綴ってみました。 FreeBSD・PC・UNIX・プログラム・MacOSX・iPhone3G ネタなど技術的・趣味的なネタについて色々書いてみたいと思います。 また、最近は Microsoft Windows ネタも増えてきたかなぁ。などとも思っておりますが、併せて宜しくお願いします。 |
|
カテゴリー:サーバ・ネットワーク
検索
カテゴリー
フィードを取得
Special Thanks.
Please click now!!
CUPS で FreeBSD から簡単印刷。(MacOSX があればだよ)
僕の自宅にはネットワーク上に FreeBSD 二台、Windows7 二台、MacOSX 一台がクライアント PC として存在してます。でもって自宅にはプリンタがあって ブラザー HL-2040 があるのですが、このプリンター、USB とパラレルポートで接続できるのであります。
HL-2040 のパラレルポートは Windows7 に、USB は MacOSX に接続されているので FreeBSD が動作している PC にはプリンタが接続されていないのであります。
そもそも、FreeBSD ではプリンタが動作するようにする設定はややこしいし、無理して FreeBSD から印刷しなくとも、cupsd が動作していて、ベンダがドライバを用意している MacOSX から印刷すれば綺麗に印刷できるのでそれで良いやー。とか思っていたわけですが・・。
しかし、よくよく調べてみるとブラザーは MacOSX と Linux 用に cups ドライバを用意しているので、それを FreeBSD に持ってきたら FreeBSD でも綺麗に印刷できるではないかい?
とか思い、FreeBSD で cupsd を onestart したわけです。で、その後に http://localhost:631 にアクセスするわけです。そしたら・・。
あぁれぇ? MacOSX に接続しているプリンタが FreeBSD から見えるではありませんかっ!! 以下は cupsd に接続した時の「プリンタの管理」の画面です。

cupsd で既に認識されているので、後はアプリから使えるのか確認するだけです。まずは GTK アプリの代表格 Firefox からですが、「印刷」を選択するとちゃーんと MacOSX に接続されたプリンターが見えていて、印刷もちゃんとできました。
次は僕がメインで利用しているデスクトップ環境の KDE4 の konqueror で印刷してみましたが、これまたプリンタがちゃんと見えていてちゃんと印刷ができたのでありました。日本語も文字化けせずに綺麗に印刷されております(@_o)。
す、すげーな。って感じなのてありました。
さてと。ここからはただの観測でしかなくて、全くウラは取ってないのですが、MacOSX と、後、KDE4 を利用した僕のデスクトップ環境では mDNS やら avahi やら hald などがガシガシ動いている環境です。なので、MacOSX 上の samba でファイル共有とプリンタ共有がオンになっていると Apple 謹製の cupsd はサクっとお互いを認識しあえるのかなぁ(サクっと認識されたのは多分 mDNS の影響だと、僕は思うのでありますが)。などと思った次第です。
MacOSX に接続され、ネットワーク共有されているプリンタはサクっと利用できると言うことなのでしょうなぁ。
それにしても上のほうに書いた通り HL-2040 のパラレルポートは Windows7 に接続しています。で、Windows7 に接続しているプリンタもネットワーク共有しているのですが、こいつは cupsd からは見ることが出なかったのでありました。
cupsd 同士、後、mDNS などの親和性がすごーく良い。と言うことなんでしょうかねぇ。
最後にですが FreeBSD 上で make した cups-base の make config のオプションを付けておきます。
|
本当に良く分からないのですが WITH_DNSSD=true なのかなぁ。 FreeBSD で簡単にプリンタを使いたければ MacOSX に接続されているプリンタで。って感じでしょうか;-)。
httpd のバーチャネルホスト設定。
今回は httpd の VirtualHost のお話です。
その昔、僕は日本で初めてバーチャネルホスティングのサービスを開始した会社にいて、当時の社長はアメリカから apache の VirtualHost の文化(この場合"技術"と言うのか)を持ってきた。当初は SunOS 4.1.4(だったかな?)に apache をインストールして IP アドレスをたくさんつけてサービスをしていた。
当時の SunOS は バーチャルホストを実現するために libc を置き換える必要があった(libc.so.2 だったかな?から libc.so.101 とか言うとんでも無いバージョンがついたものができ上がる;-)んだけど、再構築に失敗すると SunOS が起動しなくなったのよ。再インストール。今とは考えられない;-)。
で、最近はめっきりそのような環境(サーバ運用)とは関係のない仕事をしているので「昔取ったなんとか」みたいな感じで、当時の設定(と、その後、ちと学習した情報)の記憶のみで自宅のサーバを運用していたのでありました・・。
はっきり言って、うちのウェブサーバは応答が遅いっ!! どうしてか? とか思い色々と調べるわけです。サーバのハードウェア自体は Athlon X2 4600+、メモリ 4GB なのでそんなに過負荷とは感じないし・・。
で、思ったのが apache の VirtualHost の設定。これがちょっと前までしていた設定。
|
以前は rotatelogs を利用していなかったのだけど、利用するようになったら応答速度ががた落ちしたような気がします。でもって motsuyaki.org の場合、ドメインがたくさんあるし、頭に www が付いていたり付いてなかったりするし、IPv4 と IPv6 の設定(以前は IPv4 と IPv6 でも VirtualHost を分けていた。上のような書き方が出来るとは知らなかった(^^;;)があるしでこのような設定をしていると結構応答速度が遅い感じがしてウンザリ・・。
各 VirtualHost の設定で rotatelogs が起動するんだけど、吐き出すログは一つにしているので、実は「良くログファイルがぶっ壊れないなぁ。」と関心していたのでありました(^^;;。
多分、遅いのはログ出力時のロックの問題で遅くなっているんだろう・・。みたいな・・。
で、見直した設定がこれ。これをドメインの数だけ記述します。ドメインはこの他に motsuyaki.org
もつ焼き.jp ホッピー.jp なので計四つか。今までは一個のドメインに付き四つの VirtualHost の設定を書いていたと言うことか・・。orz。
|
ServerAlias を設定したので一個のドメイン名で www 有り/無し IPv4/IPv6 の全てでアクセスできる設定となりました。他にもドメインがたくさんあって、同一ログファイルに出力しているのですが、rotatelogs が頑張ってくれているみたいでログはつぶれないので多分大丈夫たろう。みたいな感じでいますf(^^;;。
rotatelogs のプロセス数は随分と少なくなりました。でもってアクセスすると、以前よりは早く表示してくれるようになったような気がします。
気がするだけで実際には細かいベンチマークテストとかしてないです。気分的な問題f(^^;;。
後、rotatelogs もいつかはソースコード読んでみたいものだと思っているのですが、複数のプロセスが起動して一個のログファイルに出力するのにどういう制御しているのだろう?とか。
本当はドメインごとにログファイルを分ければ良いとは思うのですが、ログ解析する時には一個にまとまっていてくれると嬉しいなぁ。みたいな・・。
ログの制御とか解析の辺りって、僕が apache の運用している時はあまり重要では無かったしねぇ。確か、SunOS には 200MB のカベがあって、それ以上はログが蓄積されなくなっていて、一週間に一度 httpd を再起動してログを手で名前かえて再起動。なんてしていたし・・。あ。けど、その後に rotatelogs が登場したかな?みたいな・・。
やはり一度 rotatelogs のソース、追ってみないとあかんかいのぉ。
rpc.statd: Failed to contact。
NFS サーバが時々以下のメッセージを出力していて非常に「ウザい」と感じていた。調べてみると「NFS クライアントが見つからないので接続できないよー。」って言う感じのメッセージで実害は無いみたいです。ほっといても良い感じはするんだけど、/var/log/messages が汚れるので美しくは無いですわなー。
|
上記メッセージは長いので改行していますけども・・。
で、このメッセージが出力されるのは NFS サーバ側です。NFS サーバは NFS クライアントが見えなくなるとこのメッセージを出力するようになります。
今まで動作していた NFS クライアントが(物理的に)いなくなっても延々と出続けるのでちっとウザい。と言うか、確かにウザい。そんな時は以下のファイルの中を覗いてみましょう。
cat /var/db/statd.status
この中に記述されている NFS クライアントに対して上記のメッセージが出力されていることが解ります。うふっ。
と、言うことでこのファイルの当該の行を消した後に /etc/rc.d/statd restart すれば以降はメッセージが出力されなくなります。んー。良かった。
ちなみに、ほっといてもあるタイミングで /var/db/statd.status の中身は更新されるみたいなんだけど、そのタイミングが解らないので、そんな時はサクっと手でこのファイルを編集してしまうのであります。
tacacs+ + MySQL な ports。
最近の tacacs+ は x86_64 対応ってのが(あんまり)無いのねぇ。その昔の tacacs+ のコードってのは x86 向けなので x86_64 上でコンパイルすると、随分色々なソースのコードを書き換えなければならない。
幸いにして FreeBSD には ports で net/tac_plus-libradius ってのがあるのですが、こいつは tac_plus.F5.0.0.alpha.tar.gz と言うソースコードを使っていて、このバージョンのソースコードは色々問題もあるんだけど、radius・LDAP、そして MySQL に対応している。なおかつ、FreeBSD/amc64 でも make が通るので非常に嬉しいのであります;-)。
書き出しの「x86_64 対応ってのが(あんまり)無いのねぇ。」ってのは外部のツールを使って管理する tacacs+ のソースコード。って意味です;-)。
net/tac_plus-libradius な tacacs+ は radius サーバと連携するように特化されているみたいなので、MySQL サーバに接続できる版の ports を作ってみました。以下の URL に転がしておきます。
http://www.icmpv6.org/Prog/FreeBSD_ports/ports-tac_plus-mysql-20100311.tgz
make install ができて、デーモンが起動したことは確認していますが、激しく使い込んではいないのでもしかしたら何かあるかもしれません。その場合はソースコードを見直してください(^^;;。
後、上にも書きましたが、そもそも元祖となる tacacs+ のコードは x86_64 に対応してないので随分と改修が必要です。Linux で make する時は随分苦労するでしょうねぇ。と、言うことで Linux 版のパッチも書いておきました。
http://www.icmpv6.org/Prog/Linux_x86_64-tac_plus.F5.0.0.alpha.patch.bz2
Centos5.4 ですけど、こちらも一応 make は通るようにて、起動までは確認しました。 Linux の x86_64 で tacacs+ と MySQL を連携したシステムを構築してみたい方、試してみてください。色々動かない場合はソースコードを見直して頂ければと思います(^^;;。
あ。見直して更新したソースコードは是非頂けると嬉しいです。宜しくお願いしますf(^^;;。
virtualbox-ose-3.1.2 を X11 無しで利用する。
FreeBSD の ports current を追いかけていると virtualbox が oes 3.1.2 にバージョンアップしました。でもってこれを make すると X11 有り/無し が選択できるようです。
デスクトップに FreeBSD がある場合には WITH_X11=true で make したほうが全然良いのであります。しかし、WITHOUT_X11=true で make するのはどんな時かなぁ?と、悩むのですが、おぉ。自宅のサーバは FreeBSD/amd64 で運用していて、こいつはサーバなので X11 無しだよー。
ってことは、FreeBSD で稼働しているサーバ上では WITHOUT_X11=true で make して virtualbox をバックグラウンドで起動すれば、Windows 2008 R2 が FreeBSD 上で動作するんでないかい?などと思ってしまうのであります。ハードウェアは一台なんだけど、サーバは FreeBSD と WindowsServer の両方が動作する自宅の環境ができあがるわけです;-)。
#どんな「自宅だっ!!??」って突っ込みは無し。と言うことで;-P。
と、言うことで早速トライしてみましょう。今回用意するものは以下になります。
・FreebSD/amd64 7.3-PRERELEASE X11 がインストールされているデスクトップ機
・FreeBSD/amd64 7.3-PRERELEASE もしくは FreeBSD/amd64 8.0-RELEASE がインストールされているサーバマシン。こちらは X11 が入っていません。
デスクトップ機では WITH_X11=true で emulators/virtualbox-ose を make してインストールします。サーバマシンでは WITHOUT_X11=true で emulators/virtualbox-ose をインストールします。準備は整いました;-)。
まず、デスクトップ機で VirtualBox を起動します。KDE4 の場合、[「K」メニュー] -> [システム] にあります。
過去に一回でも VirtualBox を起動していると $HOME/.VirtualBox/ と、言うディレクトリが存在しているのでこれを一旦 mv ~/.VirtualBox ~/.VirtualBox.save としてから VirtualBox を起動しましょう。
起動後は 新しいバーチャルマシンを作成します。今回はライセンスの関係で Windows7 Profesional x86 を利用しました。バーチャルマシンの「設定」はサーバマシンのハードウェアに合わせます。フロッピーとかサウンドカードが無い場合にはどんどんオフにしたり削除します。
で、Windows の CD イメージをマウントしてインストール作業。インストールができたらデスクトップ機側の作業は完了です。なお、Windows7 の設定は今のうちに色々やっておいたほうがラクチンです。僕の場合は、ネットワークの設定を行いました。ブリッジにしてネットワークは自宅 LAN 内の固定アドレスを指定しています。ネットマスクは 255.255.255.0 です。
・デスクトップ機 192.168.10.110
・サーバマシン 192.168.10.3
・Windows7(ブリッジ) 192.168.10.7
設定ができたら Windows7 をシャットダウンしましょう。あ。ちなみに僕のデスクトップ機とサーバマシンでは共に NIC が re0 なのでラクチンなのであります;-)。
続いてサーバ側で Windows7 を起動するための準備をします。まず、デスクトップ機の ~/.VirtualBox をサーバ側に持っていきます。次に、やはりデスクトップ機でインストールした Windows7 のディクスイメージもサーバ側に持っていきます。この時に、デスクトップの VirtualBox の環境とまるっきり同じにします。
準備ができたらサーバ側で早速 Windows7 を起動してみましょう;-)。起動するためにちゃんと認識しているか確認します。なお、 VirtualBox の起動は一般ユーザ権限で問題ありません。
|
認識したみたいですね。続いて以下のコマンドはどうでしょう?
|
たくさん出力されるので詳細は割愛しますが、Windows7 Profetional と VirtualBox の詳細が表示されます。他にも VBoxManage には色々なオプションがあるので -h で確認してみてください。
|
などすると オーディオデバイスがオフにできたりします。
では次に Windows7 を VirtualBox 経由で起動してみることにしましょう。
|
ふふふ。コマンドラインから起動できました。ネットワークの設定はブリッジなので 192.168.10.7 に対して ping など打ってみます。Windows7 の起動時のログは以下に出力されます。確認すると良いでしょう。
cat $HOME/.VirtualBox/Machines/Windows7 Profetional/Logs/VBox.log
ログには色々な情報が出力されますが、その中に
00:00:46.408 Guest Log: VBoxService.exe: Started. Verbose level = 0
と、表示されたら Windows7 が起動したことになります。おーーっ。ぱちぱちぱち。
後は、rdc クライアントで接続っと;-)。
で、試したのですが、ポートは開いているみたいですが、黒い画面で接続できませんでした。orz。RDC プロトコルはライセンスの問題があると言うのだけどねぇ。その影響で画面が表示されないのかしらねぇ・・。
ちなみに、デスクトップ機で VirtualBox を利用せず VBoxHeadless コマンドで Windows7 を起動した場合はちゃんと RDC プロトコルで接続できるんですけどねぇ。X11 が無いと接続できないのはちょっとおかしくね?って感じなのです・・。
しゃーないので、デスクトップ機で再度 Windows7 を起動して VNC サーバをインストールします。再起動後に VNC サーバが有効になっていることを確認したらシャットダウンで再度、サーバマシンに持っていってトライっ!!
って感じでやれば、X11 が無い環境でも Windows7 がブートするのであります。今回はデスクトップ機側で設定した VirtualBox の設定をそのままづるづると引きずるすごい簡単な方法です。環境を準備するのが大変なことがあるかと思います。その場合は VBoxManage をコマンドラインから実行することになるので、ドキュメントとか読んで頑張ることになるのでありますぁ;-)。
あ。Windows のアクティベーションの事には触れていませんが、ディスクイメージがあってあちこちでバーチャルな環境を起動した場合、僕はどうなるか知りません。ライセンスはちゃんと守るのが良いかと思われます。私の場合、これは「検証」です;-)。
更に、あぁ。っ!!。 Windows7 の止め方を書いてなかったですね。以下のコマンドで停止します。オプションは色々あるので好きなのを選んでください。
|
かしこ。
cvsupd を faithd を使って IPv6 化。
以前は cvsup(net/cvsup-without-gui) を利用していたのだけど、最近は csup(1) を利用して ports とか STABLE の最新のソースを持ってくるようになった。
csup(1) は IPv6 に対応しているのだけど、 cvsupd(net/cvsup-mirror) が IPv6 に対応していないくて、IPv4 でしか応えてくれないので、csup の一発目は必ずエラーになる。
あ。僕は自宅のサーバに cvsupd を起動しているので cvsup3.jp.freebsd.org とかから定期的に持ってきているので、自宅の FreeBSD は自宅で起動している cvsupd なサーバから持ってきています。cvsup.icmpv6.org がそれになるわけですけども;-)。
で、自宅のネットワークには IPv6 があってウェブとかメールサーバは IPv6 に対応しているのに cvsupd が IPv6 に対応していないのは非常に悲しいので、今回 cvsupd を IPv6 に対応させてみたいと思います。ただ、net/cvsup-mirror のソースコードを改変して IPv6 対応するのは非常に大変なので、今回はネットワーク的に IPv6 への到達性を確保します。IPv6->IPv4 トランスレータ機能を利用します。お題目は以下です;-)。
faith0 インターフェースと faithd を利用して cvsupd を IPv6 対応にしてみましょう。
まぁ、まずは何はなくとも man faithd と叩いてみましょう。そこから始まりますが、man を読んで解った事は、アドレスプレフィックス部分の /96 と IPv4 アドレス部分の /32 に分かれていて、IPv4 部分で IPv4 サーバを特定してそこにパケットを投げますよ。みたいな感じです。
では早速設定を見ていきましょう。今回のネットワーク構成はこんな感じにしてみました。

以下にちょっと箇条書きにしてみます。
さてと。これだけでほぼ準備が整いました;-)。
まず、cvsupd サーバでの設定ですが、 faith0 インターフェースに飲み込まれる IPv6 プレフィックスを route(8) で設定します。その後、faithd を起動して特定のポートを faith0 に飲み込むようにします。
起動スクリプトは以下になります。rcNG ではなくて申しわけないですが(^^;;。
|
まず最初に sysctl で必要な mib のステータスを変更します。 ifconfig faith0 up した後に route add してから route change します。この時、プレフィックスは /96 です。残りの /32 は IPv4 アドレスになります。
今回の cvsupd サーバは 192.168.1.2 が付いているので、それを IPv6 に直すと以下になります。
2001:200:161:1400:5999::c0a8:102
この IPv6 アドレスを DNS に登録します。すると、csup コマンドを叩いた時に supfile の *default host 行に FQDN を書けば IPv6 でアクセスが可能になります。
と、思いきや・・。外部の FreeBSD からだとアクセスできないですね。 IPv6 ルータは 2001:200:161:1400::/64 ではルーテイングが設定してあるのですが、2001:200:161:1400:5999::/96 のルーティングができていないので IPv6 ルータに対して route add コマンドで 2001:200:161:1400:5999::/96 を cvsupd が起動しているサーバのリンクローカルアドレスに向けて上げます。
|
これで設定は全て完了です。外部の IPv6 機器から接続できるか確認してみましょう。
トラブルシューティングですが、まず、cvsupd サーバのローカルホストから telnet cvsup.icmpv6.org 5999 などと FQDN で指定し cvsupd に接続できるか確認してみましょう。
そこで問題があれば、指定したプレフィックスが /96 になっているか、IPv4->IPv6 の変換時の IP アドレスや DNS の設定、faithd 、sysctl mib などを見直してみましょう。
外部から接続ができない場合、DNS のアドレスの設定の確認と、IPv6 ルータでの /96 のルーティングの設定を確認しょう。
今回は faith0 と faithd の設定を見てきましたが、これらは tcp しか通過できません。 udp には対応していないんですね。そもそも faithd は KAME のリファレンスコードなので「tcp は実装するけど、他のプロトコルは自分で書いてね。」的要素が強いのかな?などと、僕個人的には思っています。
tcp しか通らないので、当然 ping や traceroute も通りません。tcping は IPv4 にしか対応していないし・・。とわいえ、ume さん が tcping の IPv6 対応パッチを書いてくださったのでそれを適用した tcping を利用すると良いかと思われます。以下の URL にパッチを転がしておきます;-)。ports の net/tcping で利用してください。
http://icmpv6.org/Prog/FreeBSD_ports/tcping-ipv6.diff
さてと。これで cvsupd サーバは IPv6 Ready になりました。このサーバ上で IPv4 にしか対応していない色々なデーモンを起動すればなんでも IPv6 Ready になります。では、IPv4 にしか対応していないデーモンは一体何が?とハタと考えた場合、古いソースコード(バージョン)で運用しているデーモンとか位しか思い浮かばなかったのですが、DSS(net/DarwinStreamingServer) なんかは IPv4 にしか対応してないので、こう言ったものを IPv6 Ready にすることが可能です。その場合、必要なポートを指定して faithd を起動する必要があります。DSS であれば以下のように感じでしょうか。上記のスクリプトに加筆します。
/usr/sbin/faithd 554
/usr/sbin/faithd 5000
/usr/sbin/faithd 5100
などなど、必要そうなポートにたいして faithd を起動するとそのポートに来たパケットは faith0 に突っ込んでくれるようになります;-)。
で、ここでまた、ハタと考えた・・。Apple 謹製の QiuckTime Player は IPv6 に対応しているのかぁ? あぁ。multimedia/mplayer で試せば良いかぁ。みたいな(^^;;。
大体こんな感じで faith0 と faithd を使えば比較的楽に楽しく利用できるかなぁ。と思った次第です。本来であれば IPv6->IPv4 トランスレータとして、dns/totd と組み合わせて使う大掛かりなルータってイメージがあるんだけど、ローカルホストのために利用する faith0 と faithd というのもまたアリかなぁ。と言う感じがあるのであります;-)。
apache で Proxy を作ってみた。(3)
まさか三回目を書くとは思いもしませんでした・・。apache ベースで作成したキャッシュ用 Proxy サーバですが、設定に問題があり無事に動作していたのは約一ヶ月半ほど・・。あまりにも情けないので、ちょっと書いておくことにします。
今回は第一回目のネタを参照する 必要があります。第二回目の掲載はこちら。
さて、二回目にまとめたことで apache の Proxy サーバは mod_cache を利用してディスク上にキャッシュして行くことができたのだけど、運用してしばらくしたら error.log に以下のメッセージが出力されるようになってきた。しかも大量に・・。orz (長いので改行しています)
|
よくよく調べてみると、サブディレクトリがもう作れない状態になっているらしい。なので、これ以上はディクス上にデータをキャッシュをできない状態になっている。と言うメッセージが延々と error.log に出力されている状態。
/data/httpd/cache の下にディレクトリが 32,000 個できている。と言う状態なんですねー。Linux では一つのディレクトリの下には 32,000 個しかディレクトリが作れないそうです。 /usr/include/linux/ext3_fs.h の以下の行がまさしくそれ。
|
でもって 32,000 個のサブディレクトリのあるディレクトリで mkdir すると Too many links. mkdir: cannot create directorys と言われて怒られる。うひー。
と、言うことで、僕はこの上限 32,000 と言う値を知らなかったのでありました。
愕然としつつ httpd.conf の設定を見直します。第一回目に書いた設定では以下のように記述していました。抜粋です。
|
ディレクトリの深さは三階層、ディレクトリの文字列は五文字。この「五文字」と言うのは簡単に 32,000 を超えてしまうのですね。
ディレクトリにランダムに利用される文字は A-Z,a-z,0-9 と一部の特殊文字で約 80 個位と想定した場合、五文字と言うのは 80^5 通りあるので、こらー簡単に 32,000 個を超えてしまいます。 32,000 個以内に抑えるのは CacheDirLength は 2 を指定しなければならない。3 を指定したとしても 80*80*80=512,000 個のディレクトリが作成されることになります。あれー・・。
/data/httpd/cache の下には 80*80=6,400 個にしてその下の階層を深くしたほうが良いと言うことなんですねぇ・・。
ディレクトリを自動生成してくれるアプリケーションの場合、ディレクトリ長は二文字にしないと簡単に 32,000 個があふれてしまう。今後はこれを頭の片隅に入れておきたいと思います。
net-snmpd+mrtg の IPv6 化とその他もろもろ。
FreeBSD で net-snmp のデーモンを起動して、別のマシンから MRTG でデータを取得してグラフを表示させる。なんてのは google で検索するとゴマンと出てくるので、ここではもっと局所的な情報を書いてみたいと思います。
まず、net-snmpd ですが、起動時に以下のオプションを付加すると IPv6 対応になります。 以下は rc.conf.local への書き方です。udp6:161 と udp:161 で待っているよ。ってオプションを追加します。
|
|
けど、FreeBSD の ports からインストールした場合、これだけではまともに mrtg が動作しません。p5-SNMP_Session(この中の SNMP_util.pm を mrtg が利用します) も併せてインストールしてあげる必要があります。この p5-SNMP_Session は mrtg の関連性でインストールされないので明らかに mrtg の ports の問題だと思われます。 send-pr ネタです;-)。
後、mrtg の ports にはもう一個問題と言うか気になる点が有って Cisco などのルータやスイッチの 10G インターフェースをグラフに表示しようとすると桁あふれしてまともなグラフになりません。10Gbps なインターフェースは 32bit int では足りなくて 64bit int が必要と言うことですね。そんな時は p5-Math-BigInt と p5-Math-BigInt-GMP を併せてインストールしてあげます。これも mrtg の port において関連性を是非付けてもらいたいものです。
# 10G インターフェースあるルータの MRTG なんざとらねぇよ。って声が聞こえてきそうですが・・;-)。
さてと。これでようやっとインストールが完了しました。これで mrtg を起動しますが、その前に mrtg.cfg を用意して上げます。今回は cfgmaker で作成してもしなくとも良いです。mrtg.cfg はこんな感じになりました。IPv6 アドレスでアクセスしたいぜぃ。って感じです。
|
MRTG 2.16.2 configuration reference
この辺りを見ても全然ダメなので MRTG_lib.pm に直接手を加えるしか無いかも・・。そもそも、 "&", ":", "@" とか " " を "\" で修飾しなさい。ってんだけど、IPv6 アドレスに ":" があるのでマトモに動作しないんだろうなぁ。と勝手に思っているのですが・・。
あぁ。ちなみに nopublic@ の後に IPv6 アドレスでなく FQDN を書いた場合は無事に動作します。ただ、MRTG の仕様として IPv6->Ipv4 へのフェイルオーバーはしない。と言っているのでその点をどう考えるかですね。
後、ルータやスイッチなどのネットワーク機器は基本的に DNS へは登録しないので FQDN だと OK よ。って言われてもいまいち説得力ないですよねぇ・・。
今の段階の MRTG ではこれが限界なのかな。新しいバージョンに大いに期待することにしましょう。
この後、話は rrdtool にまで及ぶのでしょうか? 既に ":" がある IPv6 アドレスを DEF: とかに記述した段階で動いていないのですが、まだそこまで手は回っていません;-)
この記事のつづきを書きました。
BUFFALO WLR-UC-G を FreeBSD で使う。
渋谷に新しくヤマダ電気が出来たのだけど、そこの特売で今はディスコンのバッファロー(FreeBSD 的には MELCO)の WLR-UC-G が 1,480yen で売っていた。
USB 接続の無線 LAN アダプタで、WindowsXP 上では AOSS と言うソフトウェアルータを利用して無線アクセスポイントになれる。と言うヤツ。
Windows 専用のアプリケーションをインストールすると無線アクセスポイントになれるんだけど、これを FreeBSD に接続してフツーに無線 LAN アダプタに利用できないかなぁ。と思い、購入。まぁ、FreeBSD で動かなければ WindowsXP で iPod Touch 用に利用すれば良いかな。とも思ったんだけど。
で、FreeBSD に早速接続してみた。kldload if_* とかした後で。けど、かわいくないなぁ。ugen0 に落ちてしまった。しくしく。
さてと。格闘はここから。まず、WLR-UC-G はどんなチップが乗っているのか? google で探すのだけど、どうも解らない。Linux 方面での実績を調べてみたのだけど、それも無いみたい・・。あらら。結局どんなチップを使っているのか google では解らなかったので、しょーがない。Windows に付属の CD からドライバをインストールして調べてみた。すると、Ralink Technology Corp. と言う所のドライバを利用しているみたい。ふぅ。
ちなみに FreeBSD に接続した時の usbdevs -v はこんな感じ。
| port 5 addr 2: high speed, power 300 mA, config 1, WLR-UC-G(0x0119), Buffalo(0x0411), rev 0.01 |
ただ、こいつ、しゃらくさいことにプロダクト ID を二つ持っている。AP モードにした場合は 0x0119、クライアントモードにした場合は 0x0116 となる。これを覚えておいてと。
これ位の情報が手に入ると後は簡単。FreeBSD で Ralink Technology Corp. 用のカーネモジュールが無いか調べてみたら if_rum と言うのがあるじゃーん。と、言うことで最新の 7.1-STABLE のソースコードを持ってきてエントリを追加します。
でもって出来たパッチはこの辺りにおいておきます。
http://www.icmpv6.org/Prog/FreeBSD_patches/MELCO_WLR-UC-G.patch
プロダクト ID を二つ登録したので AP モードでもクライアントモードでもどっちでも 無線 LAN アダプタとして利用可能です。けど、クライアントモードで利用したほうが安心かも;-)。
実際に利用するするためには色々なカーネルモジュールをロードする必要がありまずが、ここでは割愛させていただきます;-)。 僕が試した感じでは ifconfig rum0 up して、ssid 付けて dhcp でアドレスが付きました。後 ifconfig rum0 scan も利用できました。
FreeBSD において AP モードは利用できないけど、ハードウェア自体は利用できるようになりました。めでたしめでたし。と言うことにしましょう;-)。
IPv6 ソースアドレスの選択。
新しい BB ルータを買ったら、IPv6 閉域網のアドレスが降ってきて、FreeBSD の rtsol で付くようになってしまった。と言うのは前回書いた 。
この時は「ip6addrctl より先ににまずはルーティングだよねぇ。」って書いたんだけど、いよいよ ip6addrctl が必要になってきた。と、言うのも、僕の場合、/etc/hosts には以下のように書いている。
|
# google 2001:4860:0:2001::68 www.google.com |
そー。ipv6.google.com と、言うのがあるんだけど、これを default で見に行くように設定しているのでした。
この設定をした場合、ipv6.google.com に対してアクセスするとき、僕が持っている IPv6 グローバルアドレスである、2001:200:: より、 NTT の Flet's v6 (以降「IPv6 閉域網」と記述)の 2001:c90:: のほうが「デスティネーションと同じかより大きなスコープのアドレスが優先」されると言う法則により、ソースアドレスの IPv6 アドレス、つまり、自分のマシンのソースアドレスが IPv6 閉域網のアドレスになるので ipv6.google.com にはアクセスできない。と言う事態が発生してしまうのでした。
こらーもう /etc/ip6addrctl.conf 書くしかねぇべや。と言うことで当初書いていたのがこんな感じ。
|
::ffff:0:0/96 50 0 ::1/128 40 1 ::/0 30 2 2002::/16 20 3 ::/96 10 4 2001:200::/35 10 100 2001:c90::/32 1 101 |
これでもーたいじょーぶだべ。とか思って、しばらく利用していたんだけど、どうもおかしい。やはり、ipv6.google.com にアクセスできない場合がある。で、どういう時にアクセスできないのか?と、言うと ifconfig でインターフェースについている IPv6 アドレスのうち、一番上についているアドレスがソースアドレスとして動作している。と言うことが解りました。
つまり、IPv6 閉域網のルータ通知デーモンと、自宅の rtadvd が動作しているルータから rtsol で IPv6 アドレスを取得した場合、NTT 側のルータが先に反応すると IPv6 閉域網の IPv6 アドレスが一番先に付いてしまうので ifconfig した時に一番上に来てしまう。その状態で ipv6.google に ping6 してもソースアドレスが IPv6 閉域網のものであるために到達性が無い。と言うことですね。
それにしても ip6addrctl の設定ファイルを書いてもなんでじゃー!?どうしてじゃー!?状態に陥るのでこざいました・・。
で、とある有識者、FreeBSD と IPv6 に詳しい人にお尋ねしたところ、自分が利用したい IPv6 は /etc/ip6addrctl.conf に書く必要はないので消せば良いでしょう。ちゃんと RFC3484 読もうねぇ。と言われつつ教えていただきました。
なので、正しい /etc/ip6addrctl.conf の書き方は以下のようになりますねー。
|
::ffff:0:0/96 50 0 ::1/128 40 1 ::/0 30 2 2002::/16 20 3 ::/96 10 4 2001:c90::/32 1 101 |
自分が利用したいアドレスである 2001:200::/35 を削除するのが正解なのでした。この設定を有効にした状態でなおかつ IPv6 閉域網のアドレスが ifconfig で見たときに一番上に来ていても、2001:200:: のアドレスをソースアドレスとして ipv6.google に到達できるようになりました。
良かった良かった。そして、ありがとうございました。
なお、その他の設定の意味については以下の URL を参照すれば大丈夫だと思われます。
http://www.imasy.or.jp/~ume/presentation/CBUG-20031129/text0.html
それにしてもこのドキュメントが書かれたのは 2003 年 11 月ですか・・。
ありがとうございました。 ume さん。
ちなみに MacOSX Leopard には ip6addrctl コマンドがありません。そして、やはり ifconfig で一番上に付いた IPv6 アドレスがソースアドレスになってしまうようです。
ただ、もしかしたら rtsol の時に何かしているのかもしれません。FreeBSD とは違って、IPv6 閉域網の IPv6 が、グローバル IPv6 アドレスより先に付くことは無いですね。ネットワークの設定の所でどっちをメインの IPv6 に使うか設定があったかなぁ?今手元に MacOSX が無いので良くわからないのですけど・・。
フレッツ・スクウェア v6 と グローバル IPv6。
Aterm WR8500N を購入した 。と言うのは前回のブログに書きました。こいつには IPv6 ブリッジ機能があって、フレッツ・スクウェア v6 の IPv6 アドレスが rtsol で取得できる。WindowsXP もフレッツ・スクウェアの IPv6 アドレスが取得できる。
けど、うちにはグローバルな IPv6 も存在するのでこの時点で一つのノードは二つの prefix を持つことになる。
自宅にはグローバル IPv6 のルータが存在して、これは dtcpc で /54 を持ってて、家の中では /64 を利用している。でもって、WR8500N で IPv6 ブリッジ機を有効にするとヒサンな目に遭う。
何が悲惨かと言うと、IPv6 の default gateway がフレッツ・スクウェア v6 のアドレスに設定されてしまって、全ての IPv6 パケットは NTT の閉域網に流れてしまう。
rtsol を実行したときに rtadvd が二か所で動いているとどう言うルールで default gateway を乗っ取るのだろう?どちらかメインのほうを決めることとか出来ないのだろうか・・。
実はできる。自宅の IPv6 ルータで起動している rtadvd の設定ファイルである /etc/rtadvd.conf において raflags の 3,4bit 目を 01 にすると自宅の IPv6 サーバの rtadvd のほうが優先順位が高くなり、default gateway として設定される。ただ、NTT 側の rtadvd に相当するものが同じような設定をしていた場合にはどっちも優先順位が一緒なのでまたまた泥沼にはまるけど;-|。
しかし、ルーティングの設定については FreeBSD において /etc/rc.conf で設定ができるみたいです。
以下は例ですが、ipv6_defaultrouter でグローバル IPv6 網宛ての default gateway を設定して、フレッツ・スクウェア v6 は /32 で static route にしましょう。と言う感じです。ともにリンクローカルアドレスを gateway として設定します。
|
ipv6_defaultrouter="fe80::20d:bff:fe48:ef52%re1" ipv6_static_routes="flets" ipv6_route_flets="2001:c90::/32 fe80::217:fff:fe1c:501a%re1" |
うちの環境ではフレッツ・スクウェア v6 の IPv6 アドレスは 2001:c90:609:42a6/64 が降ってきますが、NTT 東日本側では 2001:c90::/32 が利用されているため、その static route を設定します。
さて、これではイマイチ動作が見えないので、手動でルートを設定するスクリプトを書いてみました。こんな感じ。
http://www.icmpv6.org/Prog/IPv6Route.sh.sample
まずは詳細についてですが、上の部分でネットワークの設定を行います。
この二つの設定は v6tunaddr でグローバル IPv6、v6tunprefix はその prefixlength。fletsaddr はフレッツ・スクウェア v6 の アドレスで fletsprefix はその prefixlength。
|
v6tunaddr="3ffe:505:1411::" fletsaddr="2001:c90::" v6tunprefix="-prefixlen 64" fletsprefix="-prefixlen 32" |
リンクローカルアドレスに必要な NIC 名 は netstat から取得します。
以下は gateway となるリンクローカルアドレスの設定。v6tungw はグローバル IPv6 の gateway、下は NTT 側。
|
v6tungw="fe80::20d:bff:fe48:ef52%${llif}" fletsgw="fe80::217:fff:fe1c:501a%${llif}" |
これらの値を自分の家の設定にして、後はコマンドを実行するだけ。そーすると、route コマンドをバババと打ってくれてネットワークの到達性を確保してくれます。
普段から ra に慣れていると、IPv6 の route コマンドって難しいよねぇ。FreeBSD と Linux では全然違うし、MacOSX Leopard では "/32" とかが使えないので -prefixlen と指定しなければならなかったり。
と、言うことで上記のコマンドは FreeBSD と MacOSX Leopard で動作確認済みです。実行後は ping6 してちゃんと到達で来ているかも確認します;-)。
さてと。route の設定が終わってから初めて ip6addrctl のお話に移れるわけだねぇ。ソースアドレスセレクションについてですが、詳細は以下の URL に詳しいと思います。なので僕は書きましぇん;-)。
http://karl0204.at.webry.info/200804/article_44.html
と、言うことで、グローバル IPv6 を持っている人が、NTT フレッツの IPv6 をブリッジする BB ルータを手に入れたとき、一番気にする必要があるのは route だと言うとこですねぇ;-)。
FreeBSD で Csico VPN。
iPod Touch で Cisco VPN やって、それだけで満足しているのもまた変な話でして。FreeBSD でもきっちりと Cisco VPN を使えるようにしましょう。
まぁ、iPod Touch で Cisco VPN の所でも書いたのだけど、Cisco ルータ側をいじる権限は僕には無いので何を利用しているのか全然解らないのです。ただ、単にアカウント情報をもらっただけ。
Windows 用のクライアントはあるみたいですが、今回は FreeBSD でやります。
それらしい ports は無いかしら?とか調べていたら /usr/ports/security/vpnc と言うのがありました。早速 make してインストールして起動してみましょう。あぁ。インストールのオプションはフルオプションつけたほうが良いかもしれません。認証のためのオプションだと思うのですけどねぇ。
/usr/local/etc/vpnc.conf に設定ファイルがあるのでこちらにアカウント情報を記述します。設定内容は書きませんが;-)。設定寺の問題点と言うか、難儀した所。 IKE Authmode hybrid と言う設定があると Cisco 側と無事に接続できないみたいです。なので、この行をコメントアウトしました。Cisco ルータとの認証にまつわる設定だと思うのだけどねぇ。この行があるとうまく接続できませんでした。
そして、VPNなんてのはずっと接続しておく必要は無いので、必要な時のみデーモンを起動するだけで十分でしょ。となるので、/usr/local/etc/rc.d/vpnc onestart とかして起動します。なんか、簡単に Cisco に接続してアドレスが降って来てしまいました(^^;;。
VPN が成功すると tun0 インターフェースが生えて来ます。ここに網内の IPv4 アドレスが付加されました。それにしても DNS が降ってこないのでやはり /etc/hosts に必要なホスト名は記述する必要はありますが、まぁ、いとも簡単に利用できてめでたしめでたし。と言う感じでしょうか;-)。
あー。一点。 /usr/local/etc/rc.d/vpnc onestop とかして vpncd を停止させるんだけど、tun0 が削除されないです。この後、もう一回 vpncd を起動すると tun1 を利用するようになってしまいます。なので、デーモンを停止した後は ifconfig tun0 destroy して、インターフェースを削除したほうが良いですねぇ。
if_bge ってすごいねぇ。
ちょっとワケ有って二台の PC の間の速度計測などをしてみた。投入した PC は HP DL320G5p。OS は FreeBSD/amd64 7.0-RELEASE と FreeBSD/amd64 6.3-RELEASE。
DL320G5p は Broadcom の BCM5715C 10/100/100 PCIe Ethernet Controller が付いている。 if_bge ドライバで認識します。
この二台のサーバ間のトラフィックを計測する。と言うのが今回の検証。検証ツールとしては ports/net/pchar を使用。 pathchar もあるのだけど、こいつは amd64 では make できないのである。
と、言うことで行った検証は以下の通り。
1. 二台のサーバをクロスケーブルで接続し、その間を pchar で調べる。
2. 二台のサーバの間に Cisco1812J を設置し、サーバ間を pchar で調べる。
と、言うことで早速 pchar の結果を見ることにしてみましょう。
まずは 1. の結果から。
---
root@nws02:/etc > pchar 192.168.1.2
pchar to 192.168.1.2 (192.168.1.2) using UDP/IPv4
Using raw socket input
Packet size increments from 32 to 1500 by 32
46 test(s) per repetition
32 repetition(s) per hop
0: 192.168.1.1 (192.168.1.1)
Partial loss: 0 / 1472 (0%)
Partial char: rtt = 0.183149 ms, (b = 0.000007 ms/B), r2 = 0.031532
stddev rtt = 0.004488, stddev b = 0.000006
Partial queueing: avg = 0.000099 ms (14933 bytes)
Hop char: rtt = 0.183149 ms, bw = 1203200.000000 Kbps
Hop queueing: avg = 0.000099 ms (14933 bytes)
1: 192.168.1.2 (192.168.1.2)
Path length: 1 hops
Path char: rtt = 0.183149 ms r2 = 0.031532
Path bottleneck: 1203200.000000 Kbps
Path pipe: 27545 bytes
Path queueing: average = 0.000099 ms (14933 bytes)
Start time: Tue Jun 24 12:29:09 2008
End time: Tue Jun 24 12:35:18 2008
---
クロスケーブルで接続した場合 1.2Gbps の速度が出ているとこが伺えます。 NIC がすごいのか、はたまた if_bge のデバイスドライバがすごいのか。驚きの速度です。まぁ、うのみにはしていないのですけどね(^^;;。
続いて 2. の試験結果です。
---
root@nws02:/etc > pchar 10.0.0.2
pchar to 10.0.0.2 (10.0.0.2) using UDP/IPv4
Using raw socket input
Packet size increments from 32 to 1500 by 32
46 test(s) per repetition
32 repetition(s) per hop
0: 10.0.0.1 (10.0.0.1)
Partial loss: 0 / 1472 (0%)
Partial char: rtt = 0.178801 ms, (b = 0.000176 ms/B), r2 = 0.691920
stddev rtt = 0.014302, stddev b = 0.000018
Partial queueing: avg = 0.000092 ms (524 bytes)
Hop char: rtt = 0.178801 ms, bw = 45464.442570 Kbps
Hop queueing: avg = 0.000092 ms (524 bytes)
1: 10.0.0.2 (10.0.0.2)
Path length: 1 hops
Path char: rtt = 0.178801 ms r2 = 0.691920
Path bottleneck: 45464.442570 Kbps
Path pipe: 1016 bytes
Path queueing: average = 0.000092 ms (524 bytes)
Start time: Tue Jun 24 12:38:55 2008
End time: Tue Jun 24 12:45:04 2008
---
Cisco1812J は 100Mbps のポートなので 1G はでないとしても半分の 50Mbps も出ていないと言う結果になりました・・。
サーバ側でのクロスケーブル接続って重要なんだなぁ。と解った瞬間なのでした・・。まぁ、pchar の値が的確な数値ではないとしても 1812J、もう少しがんばれー。と、声援を送りたくなるのも事実ですが;-P。
次回は 3750 を投入した値が掲載できれば良いな。と思ったりもしていますが;-)。
DSS-6.0.3 サーバは FreeBSD で動いています。
ports-current を追いかけていたら DSS が 6.0.3 になっていた。
過去のこのブログでも「動画配信。」と「DSS-5.5.4 の使い方。」と、二回ほど取り上げてきた。今回はその三回目で最新版についてお届けして参りましょう。
まずは、実際にストリーミングをご覧ください。既に YS-11 のストリーミングは無いので新しいのを用意しました。どこの線路が解るかしら?コメントに路線名を書いていただいても結構です;-)。
-> 電車からの風景 -> rtsp://qtss.icmpv6.org/train.sdp
この動画は大体二ヶ月位は配信できるように頑張ってみます。
さてと。ここに用意したサンプルのストリーミングですが、現在、MacOSX の QuickTime7 でしか、素直に再生できません。 WindowsXP 上の QuickTime でも再生できません。
コンテンツ自体は デジタルカメラで撮ったものを QuickTime7.5 の Pro でストリーミング用に変換したものです。Video Codec は H264。 Audio Codec は AAC と言う、標準的なもので、それぞれ ffmpeg と faad で再生はできるはずです。
FreeBSD 上の mplayer で再生を試みましたが、とあるオプションを指定しなければ見ることができませんでした。mplayer をお使いの方はコマンドラインから以下を実行してみてください。
| mplayer -fps 15 -rtsp-stream-over-tcp rtsp://qtss.icmpv6.org/train.sdp |
"-fps" と言うオプションと -rtsp-stream-over-tcp と、言うオプションを付加しなければ再生できない。と、言うことが解りました。このオプションをつけると無事に再生できるようになります。
そもそも、RTP って UDP だったかなぁ?オプション的には TCP で流すぜぃ。って雰囲気っぽいんだけど・・。
DSS-5.4 ではこれらのオプションが無くとも再生できていたので DSS が 6.0.3 になってから色々と変わったのだろうとは思うのですが、まだ調査していません。暇をみつけて色々確認してみたいと思います。
ちなみに、コンテンツのほうは特に指定はありません。けど、DSS サーバの設定にもこれといったものは無いのです・・。余計な設定が無い(できない)というのはいかにも Apple らしいのですけど;-)。
最後にですが、DSS-6.0.3 の日本語メッセージを「ここ」に置いておきます。
最新版の DSS-6.0.3 ですが、もう少し調査が必要なことだけは確かです。
後、僕は Windows ユーザではないので Windows 上の QuickTime でどうして再生できないのかを深く追うことはしないと思います。あしからずご了承ください。
net-snmp-5.3.2 と /etc/hosts.allow。
FreeBSD の ports を cvsup したら net-mgmt/net-snmp が 5.3.1_7 から 5.3.2 になった。
snmpd を再起動して、リモートのマシンもしくは localhost から snmpwalk で接続しても REFUSED され、接続できなくなってしまった。 cat /var/log/snmpd.log してみると接続してくれない状態が良く解るのであるが大体以下のログを出力している。
| Connection from UDP: [0.0.0.0]->[192.168.100.1]:-6568 REFUSED |
ちなみに、 /etc/hosts.allow の設定は 5.3.1_7 の時からしていたのと変更はない。snmpd : ALL : allow はコメントアウトして、snmpd : ALL : deny を付けている。後はアクセスを許可するネットワークやホスト、ドメイン名を allow している設定をしている。
でもって 5.3.2 にした途端に接続できなくなってしまった・・。何回か試行錯誤を繰り返した結果、以下の行を記述すれば接続できることを発見。
| snmpd : 0.0.0.0 : allow |
しかし、なぜに NULL アドレスを設定せねばならんのじゃ? snmpd が IP アドレスを正しく取れていないバクであることは明白であるような気がしてならない・・。とほほ・・。
かくして、自宅サーバは SNMP の取得が復活したでした。ふぅ。
bfe0 と ifconfig の alias。
自宅のサーバは FreeBSD 6.2-STABLE なんだけど、ドメインを都合三個取ったので、IPv4 はバーチャルドメインにしようと思ったのだけど、IPv6 は腐るほどあるのでサブドメインに対して一個づつアドレスを消費しよう。と思い以下のコマンドをばばばと 80 個位打ったわけですよ。
| ifconfig bfe0 inet6 2001:240:e9:ffff::1003:n alias |
そしたら、いきなり通信ができなくなってしました。あれぇ?と言うことで -alias しながら調べてみると bfe0 はどうやら 60 個しか alias ができないみたいです。ひどーー。
| ifconfig bfe0 | grep inet | wc |
で付いているアドレスの数が60個まではOKだけど、61個目のアドレスを付けた瞬間に通信ができなくなります。-alias で 60 個に戻すと通信が復活します。インターフェースが down したわけではありません。パケットを受け付けてくれなくなる感じです。
ちなみに rl0 と fxp0、そして bge0 で試しましたがこれらの NIC は alias の 60 個制限はありませんでした。と、言う事で、明らかに bfe0 のバグと言うか仕様?のようです。
bfe0 をお使いの皆様、お気をつけ下さい。