2月 082011
 

久しぶりに「CPU コレクション」ではないネタですねぇ;-)。

IPv4 の中央在庫が枯渇した。と言うのはあちこちで騒がれているのであります。うちのネットワークは既に随分前から IPv4/IPv6 のデュアルスタクなので、特に気にはしていないのであります。

でもって IPv6 の機器、と言うか、サーバや PC などがたくさんあるので自宅で MRTG などを取得しているのですが、MRTG の取得の際にも IPv6 を利用しているのであります。mrtg.cfg の上のほうに以下の行を追加すれば、Target のホスト情報に FQDN を記述していた場合、FQDN で IPv6 があれば mrtg は IPv6 でアクセスするのであります。

EnableIPv6: yes

 
しかし、あれですな。FreeBSD の ports-current を追いかけていた場合、ある日突然 mrtg は IPv6 で動作しなくなるんですな・・。orz。最新の ports を利用すると以下のメッセージを出力する。

Undefined subroutine &main::AF_UNSPEC called at /usr/local/bin/mrtg line 2248.
Undefined subroutine &main::AF_UNSPEC called at /usr/local/bin/mrtg line 2248.
Undefined subroutine &main::AF_UNSPEC called at /usr/lcoal/bin/mrtg line 2248.

 
でもって EnableIPv6: yes をコメントアウトして実行すると無事に動作する。これは明らかに mrtg の IPv6 回りに問題があるということですね・・。

そもそも、mrtg を ports からインストールすると以下の ports が関連性によりインストールされます。あ。make config は WITH_IPV6=true、WITH_SNMP=true です。

    mrtg-2.17.0,1
    p5-SNMP_Session-1.13
    p5-IO-Socket-INET6-2.65
    p5-Socket6-0.23
    p5-Net-SNMP-6.0.1

この内、バージョンアップして、その後の動作が「怪しいなぁ。」と思うのは p5-Net-SNMP-6.0.1 です。しょーがないのでこの ports の Makefile を編集してバージョンを 5.2.0 に書き換えてから make NO_CHECKSUM=yes install でインストールしなおします。

するとな。mrtg コマンドを実行するとエラーメッセージが変わるのであります。今度出力されたのは以下のメッセージ。

Undefined subroutine &SNMPv1_Session::unpack_sockaddr_in6
called at /usr/local/lib/perl5/site_perl/5.10.1/SNMP_Session.pm line 828.
Undefined subroutine &SNMPv1_Session::unpack_sockaddr_in6
called at /usr/local/lib/perl5/site_perl/5.10.1/SNMP_Session.pm line 828.
Undefined subroutine &SNMPv1_Session::unpack_sockaddr_in6
called at /usr/local/lib/perl5/site_perl/5.10.1/SNMP_Session.pm line 828.
2011-02-08 11:31:34: ERROR: fork 0 has died ahead of time ...

 
ちょっと長いので折り返してありますが、上記のようなメッセージが出力される。んだば unpack_sockaddr_in6 ちゅーのはどこにあるの?と探してみると、どうやら p5-Socket6-0.23 でインストールされる Socket6.pm の中にある。ふむー。 SNMP_Session.pm からは Socket6.pm がみえてなくて、なので「unpack_sockaddr_in6 が無い。」と言われているんだね。

と、言うことで、/usr/local/lib/perl5/site_perl/5.10.1/SNMP_Session.pm を手で変更することに決定・・。

($p1,$a1) = unpack_sockaddr_in6 ($sa1);

 
の部分を以下のように改修します。

($p2,$a2) = &Socket6::unpack_sockaddr_in6 ($sa2);

 
そして更に SNMP_Session.pm の全ての unpack_sockaddr_in6 の部分の頭に “&Socket6::” を追加します。

さて。今度はどうだっ!!?? mrtg を実行すると、おぉっ!! 無事に動作するのでありました。

以上が ports-current で portupgrade -arR した時に IPv6 で動作しなくなった mrtg への対応策です。 MRTG を IPv6 で取得している人はまだまだ少ないとは思いますが、もし IPv6 で MRTG を取得する人がいましたら、上記のようにするのが良いかと思われます。

8月 282010
 

ちょっと訳あってネットワークに ping6 -w ff02::1%re0 とか打ったのですが、なんとっ!! iPhone4 が応えてくれたんですね。あぁれー。iPhone4 と言うか iPhoneOS と言うか iOS っていつから IPv6 Ready になったのさーっ!!

って驚いていたのですが、iOS4 になったら IPv6 Ready になったのねぇ。Apple はそんなこと一言も言ってない気がする。 Apple にとって、と言うか、ユーザは IPv4 使ってようが IPv6 使ってようが関係ない。と言うことなんでしょうねぇ。

自宅のネットワークは IPv6 ルータ(FreeBSD なんだけど;-)が RA 流していて、無線 LAN 上も IPv6 Ready なワケでして。なので、iPhone4 を無線 LAN 経由で利用して IPv6 なサイトを見るとまぁ;-)。

iOS4_IPv6_1.jpg

iPhone4 の Safari で icmpv6.org なサイトを見ると、このサイトはアクセスして来た IP アドレスを表示してくれるんですけども、iPhone 上の Safari を確認すると、おぉっ!!ちゃんと IPv6 でアクセスしてくれているのでありました。

これはちょっと感激なのであります;-)。

ちなみに iPhone4 上の Opera で試したら IPv4 でのアクセスでした。Opera はまだ IPv6 スタックを持っていないみたいですね。って言うか、Opera mobile って Proxy 側でキャッシュして、そのキャッシュが圧縮されたのを持ってきて表示するんだっけか。すると Proxy までのアクセスなので IPv6 はまるで必要無いのか。

後、その他 ping ユーティリティなど 2,3 で試してみましたが、古いヤツなので IPv6 には対応していませんでした。

Mail App は自宅のサーバに対して imap4 の SSL でアクセスしているのですが、サーバ側の maillog を見たらこれまた IPv6 でアクセスしていました。やるー;-)。

今のところはまだ Apple 謹製のアプリケーションしか対応してないんでしょうかね。

それにしても ping6 -w で応える機器って一体なんの実装使っているのよ?! って話はありますが;-)。

後は iPhone SDK で IPv6 スタックの API がどうなっているか、確認する必要があるかもですねぇ。今後の課題にしたいと思います;-)。

7月 222010
 

僕の自宅にはネットワーク上に 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 に接続した時の「プリンタの管理」の画面です。

cups_printer.png

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 のオプションを付けておきます。

# This file is auto-generated by 'make config'.
# No user-servicable parts inside!
# Options for cups-base-1.4.3
_OPTIONS_READ=cups-base-1.4.3
WITH_GNUTLS=true
WITHOUT_PHP=true
WITHOUT_PYTHON=true
WITHOUT_LIBPAPER=true
WITH_DNSSD=true
WITHOUT_PAM=true
WITHOUT_LDAP=true
WITHOUT_DBUS=true
WITHOUT_LIBUSB=true
WITH_GHOSTSCRIPT=true
WITHOUT_XPDF=true
WITHOUT_XDG_OPEN=true

 
本当に良く分からないのですが WITH_DNSSD=true なのかなぁ。 FreeBSD で簡単にプリンタを使いたければ MacOSX に接続されているプリンタで。って感じでしょうか;-)。

4月 232010
 

今回は 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 の設定。これがちょっと前までしていた設定。

<VirtualHost 192.168.1.1 [2001:200:161:1400::ffff:1]>
    DocumentRoot /pathto/motsuyaki/
    ServerName   kinmiya.com
    ErrorLog     /pathto/log/error.log
    CustomLog    "| /pathto/rotatelogs /pathto/log/access-%Y%m%d.log 604800 540" combined
</VirtualHost>
<VirtualHost 192.168.1.1 [2001:200:161:1400::ffff:1]> DocumentRoot /pathto/motsuyaki/ ServerName www.kinmiya.com ErrorLog /pathto/log/error.log CustomLog "| /pathto/rotatelogs /pathto/log/access-%Y%m%d.log 604800 540" combined </VirtualHost>

 
以前は rotatelogs を利用していなかったのだけど、利用するようになったら応答速度ががた落ちしたような気がします。でもって motsuyaki.org の場合、ドメインがたくさんあるし、頭に www が付いていたり付いてなかったりするし、IPv4 と IPv6 の設定(以前は IPv4 と IPv6 でも VirtualHost を分けていた。上のような書き方が出来るとは知らなかった(^^;;)があるしでこのような設定をしていると結構応答速度が遅い感じがしてウンザリ・・。

各 VirtualHost の設定で rotatelogs が起動するんだけど、吐き出すログは一つにしているので、実は「良くログファイルがぶっ壊れないなぁ。」と関心していたのでありました(^^;;。

多分、遅いのはログ出力時のロックの問題で遅くなっているんだろう・・。みたいな・・。

で、見直した設定がこれ。これをドメインの数だけ記述します。ドメインはこの他に motsuyaki.org
もつ焼き.jp ホッピー.jp なので計四つか。今までは一個のドメインに付き四つの VirtualHost の設定を書いていたと言うことか・・。orz。

<VirtualHost 192.168.1.251 [2001:200:161:1400::ffff:1]>
    DocumentRoot /pathto/motsuyaki/
    ServerName   www.kinmiya.com
    ServerAlias  kinmiya.com
    ErrorLog     /pathto/log/error.log
    CustomLog    "| /pathto/rotatelogs /pathto/log/access-%Y%m%d.log 604800 540" combined
</VirtualHost>

 
ServerAlias を設定したので一個のドメイン名で www 有り/無し IPv4/IPv6 の全てでアクセスできる設定となりました。他にもドメインがたくさんあって、同一ログファイルに出力しているのですが、rotatelogs が頑張ってくれているみたいでログはつぶれないので多分大丈夫たろう。みたいな感じでいますf(^^;;。

rotatelogs のプロセス数は随分と少なくなりました。でもってアクセスすると、以前よりは早く表示してくれるようになったような気がします。

気がするだけで実際には細かいベンチマークテストとかしてないです。気分的な問題f(^^;;。

後、rotatelogs もいつかはソースコード読んでみたいものだと思っているのですが、複数のプロセスが起動して一個のログファイルに出力するのにどういう制御しているのだろう?とか。

本当はドメインごとにログファイルを分ければ良いとは思うのですが、ログ解析する時には一個にまとまっていてくれると嬉しいなぁ。みたいな・・。

ログの制御とか解析の辺りって、僕が apache の運用している時はあまり重要では無かったしねぇ。確か、SunOS には 200MB のカベがあって、それ以上はログが蓄積されなくなっていて、一週間に一度 httpd を再起動してログを手で名前かえて再起動。なんてしていたし・・。あ。けど、その後に rotatelogs が登場したかな?みたいな・・。

やはり一度 rotatelogs のソース、追ってみないとあかんかいのぉ。

3月 272010
 

いやぁ。知らなかった・・。samba がいつの間にか IPv6 に対応していたのねぇ・・。

そもそも気がついたのは FreeBSD のファイルサーバ上で netstat -a をたたいたら、あれれれれ?なんじやこれは?となったのでありました。

tcp4   0   0 *.139    *.*    LISTEN
tcp6   0   0 *.139    *.*    LISTEN
tcp4   0   0 *.445    *.*    LISTEN
tcp6   0   0 *.445    *.*    LISTEN

 
あれまぁ。いつの間に port 139 と 445 の口が IPv6 でも開いているとな?

で、考えてみると Windows7 のネットワークコンピュータからファイルサーバへのアクセスはホスト名からはできていなかった。「ネットワークの設定を見直してねー。」って感じで怒られていた。なので、しょうがないので IPv4 アドレスでアクセスしていたのでありました。

一応、ファイルサーバ側でパケットをキャプチャしてみると、ふむ。Windows7 は確かに IPv6 で port 445 を叩いている。ちゅーことは smb.conf の設定すれば samba に対して IPv6 でアクセスできる。ちゅーことすな。

しかし、man smb.conf しても IPv6 に関する記述はどこにも無いでござるよ。一休どぉーん。

で、自分の smb.conf を見直してみるのですが、引っかかるのは一点だけ。hosts allow だけなんですね。ここに IPv6 のプレフィックスを追加してあげれば良いだけなのであました。

hosts allow  = 192.168.1.0/255.255.255.0 2001:c90:609::/64

 
これを書いて samba をリスタートしてあげます。

でもってパケットをキャプチャしつつ Windows7 上からファイルサーバに対してホスト名でアクセスしてみると。おやまぁ。ちゃんとアクセスできるじゃありませんかー。パチパチパチ。でもってキャプチャを見るとパケットは IPv6 で飛んでいるようです。すばらしいですねぇ;-)。

Windows は XP から Vista を飛び越えて 7 にしたので samba サーバに対して IPv6 でアクセスしている。というのを私は知らなかっただけ。と言うことになるのかなぁ?f(^^;;

けどもまぁ、Windows7 からファイルサーバに対してホスト名でアクセスできるようになって良かったであります。ちなみに FreeBSD 上の samba のバージョンは samba34-3.4.5_1 になります。

3月 152010
 

NFS サーバが時々以下のメッセージを出力していて非常に「ウザい」と感じていた。調べてみると「NFS クライアントが見つからないので接続できないよー。」って言う感じのメッセージで実害は無いみたいです。ほっといても良い感じはするんだけど、/var/log/messages が汚れるので美しくは無いですわなー。

hostanme rpc.statd: Failed to contact host remote-host: \
RPC: Port mapper failure - RPC: Timed out

 
上記メッセージは長いので改行していますけども・・。

で、このメッセージが出力されるのは NFS サーバ側です。NFS サーバは NFS クライアントが見えなくなるとこのメッセージを出力するようになります。

今まで動作していた NFS クライアントが(物理的に)いなくなっても延々と出続けるのでちっとウザい。と言うか、確かにウザい。そんな時は以下のファイルの中を覗いてみましょう。

cat /var/db/statd.status

この中に記述されている NFS クライアントに対して上記のメッセージが出力されていることが解ります。うふっ。

と、言うことでこのファイルの当該の行を消した後に /etc/rc.d/statd restart すれば以降はメッセージが出力されなくなります。んー。良かった。

ちなみに、ほっといてもあるタイミングで /var/db/statd.status の中身は更新されるみたいなんだけど、そのタイミングが解らないので、そんな時はサクっと手でこのファイルを編集してしまうのであります。

3月 112010
 

最近の 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(^^;;。

2月 032010
 

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 の起動は一般ユーザ権限で問題ありません。

$ VBoxManage list vms
VirtualBox Command Line Management Interface Version 3.1.2_OSE
(C) 2005-2009 Sun Microsystems, Inc.
All rights reserved.
"Windows7 Profetional" {0ee9ff0d-8885-4e30-801d-fbc255515d6c}

 
認識したみたいですね。続いて以下のコマンドはどうでしょう?

$ VBoxManage showvminfo "Windows7 Profetional"
:

 
たくさん出力されるので詳細は割愛しますが、Windows7 Profetional と VirtualBox の詳細が表示されます。他にも VBoxManage には色々なオプションがあるので -h で確認してみてください。

$ VBoxManage modifyvm --audio none

 
などすると オーディオデバイスがオフにできたりします。

では次に Windows7 を VirtualBox 経由で起動してみることにしましょう。

$ VBoxHeadless -s "Windows7 Profetional"

 
ふふふ。コマンドラインから起動できました。ネットワークの設定はブリッジなので 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 の止め方を書いてなかったですね。以下のコマンドで停止します。オプションは色々あるので好きなのを選んでください。

$ VBoxManage controlvm "Windows7 Profetional" poweroff

 
かしこ。

12月 252009
 

以前は 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 サーバを特定してそこにパケットを投げますよ。みたいな感じです。

では早速設定を見ていきましょう。今回のネットワーク構成はこんな感じにしてみました。

ipv6_faith.png

以下にちょっと箇条書きにしてみます。

  • 今回ターゲットとなる cvsupd は IPv4/IPv6 のデュアルスタックなサーバ上で動作します。
  • IPv4 ルータは PPPoE などでグローバルあドレスが付きますがサーバは NAT されています。ポート 5999 は cvsupd サーバにポートフォワードされています。
  • IPv6 ルータは外部のグローバル IPv6 ネットワークに接続しています。
  • cvsupd へは rtadvd により IPv6 のグローバルアドレスを払い出しています。
  • IPv4 は 192.168.0/24 です。
  • IPv6 は 2001:200:161:1400::/64 です。
  • トランスレータ用のプレフィックスは 2001:200:161:1400:5999::/96 です。

さてと。これだけでほぼ準備が整いました;-)。

まず、cvsupd サーバでの設定ですが、 faith0 インターフェースに飲み込まれる IPv6 プレフィックスを route(8) で設定します。その後、faithd を起動して特定のポートを faith0 に飲み込むようにします。

起動スクリプトは以下になります。rcNG ではなくて申しわけないですが(^^;;。

#!/bin/sh
#
# faithd start
#
HOME=/
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin/:/usr/local/bin
export HOME PATH
faith_ipv6='2001:200:161:1400:5999::' faith_ipv6_prefix='96'
case $1 in 'start' ) if [ -f /usr/sbin/faithd ]; then sysctl -w net.inet6.ip6.accept_rtadv=0 sysctl -w net.inet6.ip6.forwarding=1 sysctl -w net.inet6.ip6.keepfaith=1 ifconfig faith0 create ifconfig faith0 up route add -inet6 $faith_ipv6 -prefixlen $faith_ipv6_prefix ::1 route change -inet6 $faith_ipv6 -prefixlen $faith_ipv6_prefix -ifp faith0
/usr/sbin/faithd 5999 fi echo 'faithd 5999 Start.' ;; 'stop' ) killall faithd
route delete -inet6 $faith_ipv6 -prefixlen $faith_ipv6_prefix sysctl -w net.inet6.ip6.accept_rtadv=0 sysctl -w net.inet6.ip6.forwarding=0 sysctl -w net.inet6.ip6.keepfaith=0
ifconfig faith0 down ifconfig faith0 destroy
echo 'faithd Stop.' ;; 'restart' ) /usr/local/etc/rc.d/faithd stop /usr/local/etc/rc.d/faithd start ;; * ) echo "usage : faithd {start|stop|restart}" ;; esac

 
まず最初に 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 が起動しているサーバのリンクローカルアドレスに向けて上げます。

# route add -net -inet6 2001:200:161:1400:5999:: -prefixlen 96 fe80::2ae:90ff:fe11:a85%bge0

 
これで設定は全て完了です。外部の 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 というのもまたアリかなぁ。と言う感じがあるのであります;-)。

7月 232009
 

まさか三回目を書くとは思いもしませんでした・・。apache ベースで作成したキャッシュ用 Proxy サーバですが、設定に問題があり無事に動作していたのは約一ヶ月半ほど・・。あまりにも情けないので、ちょっと書いておくことにします。

今回は第一回目のネタを参照する 必要があります。第二回目の掲載はこちら

さて、二回目にまとめたことで apache の Proxy サーバは mod_cache を利用してディスク上にキャッシュして行くことができたのだけど、運用してしばらくしたら error.log に以下のメッセージが出力されるようになってきた。しかも大量に・・。orz (長いので改行しています)

[warn] (2)No such file or directory: disk_cache:
rename tempfile to hdrsfile failed:
/data/httpd/cache/aptmp6ac9NS -> /data/httpd/cache/ASm@m/8xF@v/7XxKH/X8yCPfQ.header

 
よくよく調べてみると、サブディレクトリがもう作れない状態になっているらしい。なので、これ以上はディクス上にデータをキャッシュをできない状態になっている。と言うメッセージが延々と error.log に出力されている状態。

/data/httpd/cache の下にディレクトリが 32,000 個できている。と言う状態なんですねー。Linux では一つのディレクトリの下には 32,000 個しかディレクトリが作れないそうです。 /usr/include/linux/ext3_fs.h の以下の行がまさしくそれ。

#define EXT3_LINK_MAX           32000

 
でもって 32,000 個のサブディレクトリのあるディレクトリで mkdir すると Too many links. mkdir: cannot create directorys と言われて怒られる。うひー。

と、言うことで、僕はこの上限 32,000 と言う値を知らなかったのでありました。

愕然としつつ httpd.conf の設定を見直します。第一回目に書いた設定では以下のように記述していました。抜粋です。

<IfModule mod_disk_cache.c>
:
    CacheDirLevels      3
    CacheDirLength      5
</IfModule>

 
ディレクトリの深さは三階層、ディレクトリの文字列は五文字。この「五文字」と言うのは簡単に 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 個があふれてしまう。今後はこれを頭の片隅に入れておきたいと思います。