<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3548910209670789438</id><updated>2011-09-21T23:05:35.090+09:00</updated><title type='text'>Network Autonomy</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-1419513308246977414</id><published>2010-12-24T18:11:00.007+09:00</published><updated>2010-12-24T18:54:42.664+09:00</updated><title type='text'>App Inventorを使ってみた</title><content type='html'>Google Japan Developer Relations BlogでApp Inventorが公開βになったと紹介されていたので使ってみました。ちょうど、最近ブログの更新もさぼっていたし。&lt;br /&gt;&lt;br /&gt;とりあえず、加速度センサーの値を表示させるアプリを作ってみます。iPhoneでも昔作ったけど、まぁそれなりに手間のかかるコーディングが必要でした。App Inventorでは、なるほど広告通り、あっという間にアプリが出来上がります。一昔前に流行った（いや、流行り損ねた？）Java Beansを彷彿とさせるプログラミング。&lt;br /&gt;&lt;br /&gt;まず手元のコンピュータに必要なツール類をインストールする必要があります。ツールは&lt;a href="http://appinventor.googlelabs.com/learn/setup/"&gt;App Inventor Setupページ&lt;/a&gt;からダウンロードしましょう。今のところ、Mac、Linux、Windowsをサポートしているようです。あと、Java環境も必要です。SetupページにJava環境のチェックができるページへのリンクが張られているので、手元のコンピュータのJava環境を整備しておきます。&lt;br /&gt;&lt;br /&gt;次にAndroid端末の設定をします。エミュレータも提供されているようですが、ちょうど手元にNexus Oneがあるので、これを使うことにします。端末側の設定としては、「提供元不明のアプリ」を許可し、「USBデバッグ」モードをオン、「スリープモードにしない」をオンに設定するだけです。なお、コンピュータと接続中にUSBストレージモードになっているとうまく動作しないため、接続直後にストレージモードになる設定をしている場合は、コンピュータに接続後に手動でストレージモードをオフにする必要があります。&lt;br /&gt;&lt;br /&gt;あとは、&lt;a href="http://appinventor.googlelabs.com/"&gt;App Inventorホーム&lt;/a&gt;でプログラム開始です。とりあえず加速度センサーの値が表示されればいいので、以下のような画面をデザインしました。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_suhEXi-tWT4/TRRn38JFsWI/AAAAAAAAAdo/Kd4DjEXXM2I/s1600/AppInventorDesign.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_suhEXi-tWT4/TRRn38JFsWI/AAAAAAAAAdo/Kd4DjEXXM2I/s320/AppInventorDesign.png" alt="" id="BLOGGER_PHOTO_ID_5554178451189379426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;テーブルビューを配置して、その中にラベルを6つはめ込んだだけです。あと、不可視コンポーネントとしてAccelerometerSensor1を追加しています。&lt;br /&gt;&lt;br /&gt;次に、これらの間の関係を定義するために、画面右上の（ちょっと切れていますが）Open the Blocks Editorをクリックしてブロックエディタを起動します。ここでビジュアルにプログラムするのですが、途中は省略して、最終的に以下のようなブロックダイアグラムを作ります。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_suhEXi-tWT4/TRRo76fxXrI/AAAAAAAAAdw/GSOo9j3Vxyg/s1600/AppInventorProgram.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 153px;" src="http://3.bp.blogspot.com/_suhEXi-tWT4/TRRo76fxXrI/AAAAAAAAAdw/GSOo9j3Vxyg/s320/AppInventorProgram.png" alt="" id="BLOGGER_PHOTO_ID_5554179618978750130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;AccelerometerSensor1.AccelerationChangedは、加速度センサーの値が変更されたときに実行されるモジュールですので、その中で、センサーの値を表示している3つのラベル（X、Y、Z軸）に各軸のセンサーの値を設定するだけです。&lt;br /&gt;&lt;br /&gt;コンピュータに実端末を接続している場合は、ブロックエディタでConnect to Deviceをクリックすると、自動的にプログラムが走り始めます。&lt;br /&gt;&lt;br /&gt;プログラムに問題がなければ、App Inventorのページに戻って、Package for Phoneをクリックすると、今作ったプログラムが端末に転送、インストールされます。&lt;br /&gt;&lt;br /&gt;まぁ、とても簡単なのですが、果たしてこれ、どれくらいまで細かい内容をプログラムできるのか、もうちょっと遊んでみないと分からないですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-1419513308246977414?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/1419513308246977414/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=1419513308246977414' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1419513308246977414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1419513308246977414'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2010/12/appinventor.html' title='App Inventorを使ってみた'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_suhEXi-tWT4/TRRn38JFsWI/AAAAAAAAAdo/Kd4DjEXXM2I/s72-c/AppInventorDesign.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-5050480953413964451</id><published>2010-04-13T20:22:00.008+09:00</published><updated>2010-04-13T21:29:18.387+09:00</updated><title type='text'>IPv4 to IPv6, IPv6 to IPv4 translator</title><content type='html'>ちょっとした必要に迫られて、IPv4とIPv6のプロトコル変換プログラムを作りました。動作は至ってシンプルで、あるひとつのIPv6アドレスを、別のユニークなIPv4アドレスに変換（また、その逆変換）を行うものです。最近流行っている、NAT64のような、複数のIPv6ノードがひとつのIPv4アドレスを共有して通信するものとは異なります。&lt;br /&gt;&lt;br /&gt;そもそもの目的は、IPv6のみを使って構築運用されているネットワークの内部ノードを、外部に公開することでした。もちろん、IPv6を使えば、普通に外部からアクセスできるのですが、まだまだIPv6の利用が一般的ではない現在、IPv4での公開も考えなければなりません。こうした目的の場合、一般的にはIPv4とIPv6のデュアルスタック環境にするところです。しかしながら、必ずしもすべてのIPv6ノードがIPv4でアクセスできる必要はありません。運用されているIPv6ノードの中で、サーバとして公開されるものは極わずかであり、多くのノードはそのサーバのサポートをしているだけだからです。そのようなノードに、貴重なIPv4アドレスを割り当てるのはもったいないですし、またデュアルスタックにすることで運用のコストも大きくなりかねません。&lt;br /&gt;&lt;br /&gt;そこで、公開サーバの数を収容するために必要十分なIPv4アドレスを用意して、単純に1対1で対応させてしまおう、ということになります。言ってみれば、IPv6への移行が完了するまでの、つなぎの技術ですね。&lt;br /&gt;&lt;br /&gt;仕組み自体はNAT64とDNS64のものとほとんど変わりません。違いはトランスポート層のポート番号の変換処理が必要かどうかです。アドレスを1対1で対応させる場合、ポート番号を処理する必要がないので、変換サーバがNATのような状態を持つ必要がなくなります。状態を持たなくてよいので、負荷分散あるいは耐障害性の向上のために、簡単に多重化できるという利点があります。欠点はNAT64に比べてたくさんのIPv4アドレスが必要になることです。なにせ1対1対応ですから。&lt;br /&gt;&lt;br /&gt;実装はtunデバイスを使っています。最近のOSなら標準でサポートしているものも多いのではないでしょうか。tunデバイスを使えば、read(2)システムコールとwrite(2)システムコールで生のIPパケットを読み書きできるので、今回のような目的にぴったりです。ユーザ空間で実装できるので、開発やデバッグも簡単になります。当然、転送速度は遅くなると思いますが、開発の簡単さ、もともとの目的がつなぎの技術であることを考えると、そう悪い選択でもないでしょう。&lt;br /&gt;&lt;br /&gt;動作はちょっと複雑です。まず、IPv6ノードがIPv4ノードにアクセスする場合から考えてみます。IPv6ノードはIPv4アドレスを持っていないため、まずIPv4アドレスとIPv6アドレスの対応を定義します。ここでは例として、IPv6ネットワークのプレフィックスを2001:db8:0:0::/64、IPv4グローバルアドレス空間を192.0.2.0/24と仮定しましょう。以下のようなアドレスの対応を定義します。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;192.0.2.1 &lt;=&gt; 2001:db8:0:0::100&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;つまり、外部のIPv4ノードが2001:db8:0:0::100と通信したいと思ったときは、192.0.2.1に対して接続すればよいということになります。192.0.2.1に届いたIPv4パケットは、IPv6に変換されて2001:db8:0:0::100に転送されます。このとき、変換後のIPv6パケットの始点アドレスには、通信相手のIPv4アドレスが識別できるよう、IPv6アドレスの一部にIPv4アドレスを埋め込んでおきます。始点アドレスとして使うIPv6プレフィックスはなんでもよいのですが、仮に64::/64を使うとしましょう。外部のIPv4ノードのアドレスが202.214.86.196だった場合、変換後の始点アドレスは64::cad6:56c4となります。IPv4アドレス4バイト分が、IPv6アドレスの下4バイトに埋め込まれた形になります。&lt;br /&gt;&lt;br /&gt;逆方向の通信には、上記の手順を逆に適用します。2001:db8:0:0::100から64::cad6:56c4に対してパケットを送信すると、変換サーバでIPv6宛先アドレスの下4バイトからIPv4宛先アドレス202.214.86.196を取り出します。また、あらかじめ定義されたIPv4とIPv6アドレスの対応表から、始点アドレスとして使うIPv4アドレス（この場合は192.0.2.1）を取り出し、IPv4パケットとして転送するのです。&lt;br /&gt;&lt;br /&gt;コードはgithubで公開しています。興味のある方は &lt;a href="http://github.com/keiichishima/map646"&gt;http://github.com/keiichishima/map646&lt;/a&gt; にアクセスしてみてください。forkも大歓迎です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-5050480953413964451?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/5050480953413964451/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=5050480953413964451' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/5050480953413964451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/5050480953413964451'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2010/04/ipv4-to-ipv6-ipv6-to-ipv4-translator.html' title='IPv4 to IPv6, IPv6 to IPv4 translator'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-6838688811156624230</id><published>2009-11-20T14:02:00.006+09:00</published><updated>2009-11-20T14:44:11.255+09:00</updated><title type='text'>自分で作るネットワークストレージ (2)</title><content type='html'>&lt;div&gt;ファイルシステムを作ると言っても、OSネイティブのファイルシステムを作るのは大変です。しかしながら、最近は&lt;a href="http://fuse.sourceforge.net/"&gt;FUSE (Filesystem in Userspace)&lt;/a&gt;を使って手軽にファイルシステムを試作できるようになりました。以前だったら躊躇していたところですが、気軽に試せそうです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;FUSEはOS内部で発生したファイルシステムイベントをユーザー空間のプログラムに通知し、そこで必要な操作を代行させることでOSネイティブのファイルシステムと同様の操作性をファイルシステム利用者に提供しています。イベントの処理といっても、実際はイベントに対応したコールバック関数を記述する形になりますから、特に実装が複雑なわけではありません。FUSEでは様々なイベントに対応するコールバック関数が定義されていますが、すべての関数を実装しなければならないわけではありません。たとえば、シンボリックリンクをサポートしないのであれば、シンボリックリンクに関係する関数を実装する必要はありません。とりあえず今回対応するのは以下の関数です。試作にMacOS XのXcodeテンプレートを使うので、関数名がCocoa APIっぽく書かれていますが、簡単に読み替えることができると思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;ディレクトリ一覧 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;contentsOfDirectoryAtPath:error:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;opendir(2)&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;readdir(2)&lt;/span&gt;など)&lt;/li&gt;&lt;li&gt;ファイル情報取得 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;attributesOfItemAtPath:userData:error:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;stat(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ファイル情報設定 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;setAttributes:ofItemAtPath:userData:error:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;chmod(2)&lt;/span&gt;など)&lt;/li&gt;&lt;li&gt;ファイルオープン (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;openFileAtPath:mode:userData:error:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;open(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ファイルクローズ (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;releaseFileAtPath:userData:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;close(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ファイル読み込み (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;readFileAtPath:userData:buffer:size:offset:error:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;read(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ファイル書き込み (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;writeFileAtPath:userData:buffer:size:offset:error:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;write(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;新規ディレクトリ作成 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;createDirectoryAtPath:attributes:error:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mkdir(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;新規ファイル作成 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;createFileAtPath:attributes:userData:error:&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;open(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ファイル移動 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;moveItemAtPath:toPath:error:&lt;span class="Apple-style-span"  style="font-family:Georgia,serif;"&gt;, &lt;/span&gt;rename(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ディレクトリ削除 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;removeDirectoryAtPath:error:&lt;span class="Apple-style-span"  style="font-family:Georgia,serif;"&gt;, &lt;/span&gt;rmdir(2)&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ファイル削除 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;removeItemAtPath:error:&lt;span class="Apple-style-span"  style="font-family:Georgia,serif;"&gt;, &lt;/span&gt;unlink(2)&lt;/span&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;FUSEで読み書き可能なファイルシステムを作る場合、上記の関数を実装すればとりあえず動きます。あとは、これらのイベントの裏で、適切に版管理システムと連携させてあげればよいわけです。版管理システムが提供するインターフェースは以下のようなものになるでしょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;チェックアウト (checkout)&lt;/li&gt;&lt;li&gt;更新 (update)&lt;/li&gt;&lt;li&gt;追加 (add)&lt;/li&gt;&lt;li&gt;複製 (copy)&lt;/li&gt;&lt;li&gt;移動 (move)&lt;/li&gt;&lt;li&gt;削除 (delete)&lt;/li&gt;&lt;li&gt;コミット (commit)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回、版管理システムとして&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;を念頭に置いています。ですが、Subversionと同様の概念で構築されているシステムであれば、上記のような抽象化された版管理インターフェースと実際の動作を対応させることで、差し替えもできるのではないかと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;FUSEが提供するファイル操作と、版管理システムが提供するファイル操作をじっと見比べてみると、お互いの機能が似ていることがわかります。FUSE側に存在せず、版管理側に存在する操作としてチェックアウトとコミット、逆にFUSEには存在し、版管理システムに存在しない操作としてはファイルのオープンやクローズ、ファイル情報の操作などがあります。これらの差を埋めれば二つのシステムが相互に繋がりそうです。Subversionを前提にがっつり実装してもよいのですが、将来の拡張性を考えて、版管理抽象層を定義し、以下のAPIを版管理抽象層からFUSEファイルシステム側に提供することにしました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;初期化 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlSetup:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;チェックアウト (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlSetup:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;追加 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControllAdd:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;削除 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlRemove:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;複製 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlCopy:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;更新 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlUpdate:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;コミット (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlCommit:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;タッチ (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlTouch:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;終了処理 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlCleanup:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;実パス名取得 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlRealPathForPath:&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;制限ファイル名取得 (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;revisionControlNameIsReservedAtPath:&lt;/span&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;いくつか、版管理システムの操作一覧にないAPIを追加しています。初期化と終了処理はよいとして、タッチ、実パス名取得、制限ファイル名取得は、手元の作業コピーでの操作と版管理されているデータを結びつけるために必要となります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回、版管理システムを基礎としてファイルシステムを構築するので、ファイルへの操作はオリジナルのファイルではなく、手元に作られた作業コピーに対して行われます。作業結果は、最終的に版管理システムにコミットしなければならないので、どのファイルが操作されたのか履歴を記録しておく必要があります。タッチAPIは、作業コピーで修正されたファイルを版管理抽象層に通知します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;実パス名取得APIは、版管理システム内で使われているパス名を、作業コピー上でのパス名に変換するためのAPIです。今回の試作では、版管理システム内のディレクトリ構造を、手元のPCの特定ディレクトリにマウントして使うことを想定しています。FUSEから通知されるパスはマウントされたディレクトリからの総体パスになりますが、実際に操作できるファイルは作業コピーとして取り出したファイルパスになります。作業コピーを取り出した場所は版管理抽象層しか知らないので、実際のファイルパス名を知りたい場合に抽象層に問い合わせるAPIが必要になります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;制限ファイル名取得APIは、ファイルシステムとして利用できないファイル名を判断するためのAPIです。たとえば、版管理システムとしてSubversionを使う場合、&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;.svn&lt;/span&gt;という名前のファイル名、ディレクトリ名は使えません。このAPIを通じて、後ろで使われている版管理システムで禁止されているファイル名を取得します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とりあえずFUSE関数を上述の版管理抽象層APIで実装してみると、以下のようになります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;(FUSE初期化関数)&lt;/li&gt;&lt;ul&gt;&lt;li&gt; 初期化&lt;/li&gt;&lt;li&gt;チェックアウトあるいは更新&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ディレクトリ一覧&lt;/li&gt;&lt;ul&gt;&lt;li&gt;更新&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ファイル情報取得&lt;/li&gt;&lt;ul&gt;&lt;li&gt;(作業コピーのファイル情報を取得)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ファイル情報設定&lt;/li&gt;&lt;ul&gt;&lt;li&gt;(作業コピーのファイル情報を取得)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ファイルオープン&lt;/li&gt;&lt;ul&gt;&lt;li&gt;タッチ&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ファイルクローズ&lt;/li&gt;&lt;ul&gt;&lt;li&gt;コミット&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ファイル読み込み&lt;/li&gt;&lt;ul&gt;&lt;li&gt;(作業コピーのファイルを読み込み)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ファイル書き込み&lt;/li&gt;&lt;ul&gt;&lt;li&gt;(作業コピーのファイルに書き込み)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;新規ディレクトリ作成&lt;/li&gt;&lt;ul&gt;&lt;li&gt;(作業コピーにディレクトリ作成)&lt;/li&gt;&lt;li&gt;追加&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;新規ファイル作成&lt;/li&gt;&lt;ul&gt;&lt;li&gt;(作業コピーにファイル作成)&lt;/li&gt;&lt;li&gt;追加&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ファイル移動&lt;/li&gt;&lt;ul&gt;&lt;li&gt;(移動元を移動先に)複製&lt;/li&gt;&lt;li&gt;(移動元を)削除&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ディレクトリ削除&lt;/li&gt;&lt;ul&gt;&lt;li&gt;削除&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ファイル削除&lt;/li&gt;&lt;ul&gt;&lt;li&gt;削除&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;(FUSE終了関数)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;コミット&lt;/li&gt;&lt;li&gt;終了処理&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まぁ、いろいろと問題はあるのですが、一応動くものにはなります。&lt;a href="http://sourceforge.net/projects/rcbfs/"&gt;ソースコード&lt;/a&gt;を&lt;a href="http://sourceforge.net/"&gt;sourceforge&lt;/a&gt;に公開していますので、興味のある人は覗いてみてください。sourceforgeに登録しているコードは、上記以上の機能も実装していますが、それはまた別の機会に。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次回に続きます。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-6838688811156624230?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/6838688811156624230/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=6838688811156624230' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/6838688811156624230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/6838688811156624230'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2009/11/2.html' title='自分で作るネットワークストレージ (2)'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-4168089380296294676</id><published>2009-11-11T18:03:00.008+09:00</published><updated>2009-11-20T14:03:16.773+09:00</updated><title type='text'>自分で作るネットワークストレージ (1)</title><content type='html'>ネットワークストレージという考え方は昔からありましたが、それが単体サービスとして有償で提供されるようになったのはここ数年でしょうか。Dropboxなどに代表されるネットワークストレージサービスには一定の利用者がいるようで、解説記事もよく見るようになりました。&lt;br /&gt;&lt;br /&gt;データをサーバに保持しておいて、ネットワーク経由でどこからでもアクセスするという考え方は新しいものではありません。ただ、そういったサービスを構築するには、高度なサーバ設定、ネットワーク設定の知識が必要だったため、一般の人が手軽に始めるというわけにはいきませんでした。近年のネットワークストレージサービスは、サーバ設定をサービス提供者側に分離し、クライアントとネットワークの設定を専用アプリケーションにすることでその敷居を下げ、技術者以外の利用者の取り込みに成功したのだと思います。&lt;br /&gt;&lt;br /&gt;さて、特に昔からコンピュータネットワークを使っている人には共感してもらえると思いますが、自分のデータを自分の管理の行き届かない場所に預けるのは心配なものです。便利なネットワークストレージサービスですが、大切なデータをそこに保存しても大丈夫なのかどうか、つい考えてしまいます。そうはいっても便利なサービスは使いたい、ということで、自分で運用できないものかと考えるのは技術者として自然なことです。&lt;br /&gt;&lt;br /&gt;では、自分にとってネットワークストレージサービスに必要な機能は何か、と考えてみると、以下のような要求がでてきました。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;自分で運用できる&lt;/li&gt;&lt;li&gt;ファイルシステムとして操作できる&lt;/li&gt;&lt;li&gt;ネットワークに接続していなくてもある程度操作できる&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;要求1は、そもそもの発端なので当然です。要求2は利便性を確保するために重要です。ネットワーク上にデータを保存できても、それを直接ローカルアプリケーションで操作できなければ面倒です。OSのファイルシステムの一部として見えている、もしくは同等の操作性が提供されている必要があります。要求3も、現実の環境を考えると必須といえます。ネットワーク環境は日々向上しているものの、ネットワークに接続できない場所は必ずあるものです。その間、フル機能ではないにせよ、ある程度の操作ができないと使い勝手が落ちてしまいます。&lt;br /&gt;&lt;br /&gt;これらの条件を満たすもので、現状一番近いものは版管理システムです。旧くはRCSや&lt;a href="http://www.nongnu.org/cvs/"&gt;CVS&lt;/a&gt;、その後現れた&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;、最近使われる事が多い&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;などが有名です。これらの版管理システムは一種のファイルシステム機能を提供しています。ただ、元々プログラムのソースコードの改変履歴を記録する目的で設計されたシステムですから、OSのファイルシステムと同様には操作できません。ファイルを更新しようとした場合、まず版管理システムに保存されているデータを、通常のファイルシステム上に複製（チェックアウト）し、その複製に対して編集を行い、編集完了後に書き戻し（チェックイン）といった、通常のファイル操作とは異なる粒度でのファイル操作が必要になります。&lt;br /&gt;&lt;br /&gt;それならば、その部分をうまく隠蔽し、通常のOSレベルでのファイル操作と同等のインターフェースを提供できれば、自分の欲しいネットワークストレージになるのではないか、しかも版管理機能のおまけ付き、という考えが浮かびます。&lt;br /&gt;&lt;br /&gt;実際、そういう試みは過去にありました。かなり古いプロジェクトですが、CVSサーバをNFSマウントする&lt;a href="http://sourceforge.net/projects/vcfs/"&gt;Virtual CVS Filesystem&lt;/a&gt;というソフトウェアがsourceforgeに登録されています。ただし、プロジェクトが活動停止してからかなり時間が経っているようです。また、&lt;a href="http://fuse.sourceforge.net/"&gt;FUSE&lt;/a&gt;を用いたSVNレポジトリアクセス用ファイルシステム&lt;a href="http://www.jmadden.eu/index.php/category/tech/software/svnfs/"&gt;SvnFS&lt;/a&gt;というのもあります。こちらは開発が継続しているようです。ただ、どちらも読み取り専用ファイルシステムで、ネットワークストレージとしては中途半端な状態です。ここはやはり、読み書きできるストレージシステムが欲しいところではないでしょうか。&lt;br /&gt;&lt;br /&gt;ということで次回に続きます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-4168089380296294676?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/4168089380296294676/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=4168089380296294676' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/4168089380296294676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/4168089380296294676'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2009/11/blog-post.html' title='自分で作るネットワークストレージ (1)'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-526537206678540743</id><published>2009-07-22T11:19:00.010+09:00</published><updated>2009-07-22T17:18:10.374+09:00</updated><title type='text'>FUSEオペレーションの可視化</title><content type='html'>&lt;div&gt;&lt;a href="http://fuse.sourceforge.net/"&gt;FUSE (Filesystem in Userspace)&lt;/a&gt; はvfs/vnode APIをユーザ空間のプログラムから利用できるようにするための機構で、OSでサポートされないファイルシステムを容易に追加できます。sshサーバ上のディレクトリにアクセスするためにsshfs-fuseを使っている人も多いのではないでしょうか。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;vfs/vnodeアクセスがユーザ空間から見えるので、それを利用すればファイルシステムへのアクセスの様子が見えるはず、ということで&lt;a href="http://ubietylab.net/ubigraph/"&gt;UbiGraph&lt;/a&gt;を使ってsshfs-fuseのアクセスを可視化してみました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;まずは、sshfs-fuseでマウントしたディレクトリ上で、次のスクリプトを実行してみました。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cd /sshfs&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;for i in 0 1 2 3 4 5 6 7 8 9 10&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;do&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mkdir $i&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cd $i&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;for j in a b c d e f g&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;do&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mkdir $j&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;done&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;done&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sleep 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', fantasy;"&gt;cd /sshfs&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rm -rf 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-74e72285b82f0099" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v12.nonxt4.googlevideo.com/videoplayback?id%3D74e72285b82f0099%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330333078%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D329EA1013B97F409658259C7642095209D68F43C.84CFB9E61A2A0419D6C894D935C395A2B0A8CD%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D74e72285b82f0099%26offsetms%3D5000%26itag%3Dw160%26sigh%3DtdG24Cdq7pY8mbfMVtA2Ezn1K-w&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v12.nonxt4.googlevideo.com/videoplayback?id%3D74e72285b82f0099%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330333078%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D329EA1013B97F409658259C7642095209D68F43C.84CFB9E61A2A0419D6C894D935C395A2B0A8CD%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D74e72285b82f0099%26offsetms%3D5000%26itag%3Dw160%26sigh%3DtdG24Cdq7pY8mbfMVtA2Ezn1K-w&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;11レベルの階層ディレクトリを作り、それぞれの階層に7個のディレクトリを作成した後、すべてのディレクトリを削除しています。各ノードは、ファイル/ディレクトリの実体に最初にアクセスされた段階で描画されます。ですから、初期状態では、トップディレクトリにあるオブジェクトしか見えていません。グラフのノードはファイルかディレクトリを表しており、緑色のノードがディレクトリ、青いノードがファイルです。アクセスされたオブジェクトは、色が赤くなるとともに、そのオブジェクトのファイル名/ディレクトリ名が表示されます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;続いて、sshfs-fuseでマウントしたディレクトリ上で、wgetをコンパイルしてみました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cd work&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;tar zxf wget-1.11.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cd wget-1.11&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sh configure&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;make&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;make distclean&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cd ..&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rm -rf wget-1.11&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;wget-1.11.tar.gzを展開すると、ファイルの生成に合わせてディレクトリ木が徐々に伸びていくのが分かります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-331bbe68186a69d7" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v12.nonxt5.googlevideo.com/videoplayback?id%3D331bbe68186a69d7%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330333078%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D408189617198BBA4D365204EAB1082E4791D8B1.848336C6D082B4848E59B3A4F0A5D4868600FFEF%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D331bbe68186a69d7%26offsetms%3D5000%26itag%3Dw160%26sigh%3DNc-6ZggKONpcmu_wk4py24QSlEk&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v12.nonxt5.googlevideo.com/videoplayback?id%3D331bbe68186a69d7%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330333078%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D408189617198BBA4D365204EAB1082E4791D8B1.848336C6D082B4848E59B3A4F0A5D4868600FFEF%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D331bbe68186a69d7%26offsetms%3D5000%26itag%3Dw160%26sigh%3DNc-6ZggKONpcmu_wk4py24QSlEk&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;configureの過程ではwget-1.11を展開したディレクトリ直下のファイルが頻繁にアクセスされており、makeが始まると進み具合に応じて各ディレクトリのファイルが順次アクセスされていくのが見えます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;単にアーカイブを展開、コンパイル、削除しただけですが、可視化することでまた違った感じがします。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-526537206678540743?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=331bbe68186a69d7&amp;type=video%2Fmp4' length='0'/><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=74e72285b82f0099&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/526537206678540743/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=526537206678540743' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/526537206678540743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/526537206678540743'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2009/07/fuse.html' title='FUSEオペレーションの可視化'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-8364356447094004960</id><published>2009-06-12T21:55:00.007+09:00</published><updated>2009-06-12T22:14:35.210+09:00</updated><title type='text'>Xen Guest OSのOfflink Migration</title><content type='html'>&lt;span style="font-size:130%;"&gt;Live Migrationの課題&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ライブマイグレーションは、移動元と移動先のHost OSが、同一のサブネットワークに接続されていることを前提としています。なぜならば、Guest OSが利用するネットワーク環境はHost OSのネットワーク環境に依存しているため、Host OSとInternetとの接続状態が変更されると、それに応じてGuest OSのネットワーク設定を変更しなければなりません。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Network Mobility Basic Support (NEMO BS)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;NEMO BSはIPv6モバイルルータを実現するプロトコルで、RFC3963として標準化されています。NEMO BSを実装したモバイルルータは、自身が抱えるネットワークに固定のアドレスを提供しつつ、任意のネットワークに自由に接続できるようになります。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Host OSのモバイルルータ化&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Live Migrationの問題である、Host OSのネットワーク環境の変化は、NEMO BSを組み合わせることで解決できます。Guest OSが接続するネットワークを、NEMO BSの機能として提供される固定ネットワークにすることで、NEMO BSの設定情報を共有するHost OS間で、Host OSの物理的な位置に関わらずGuest OSをMigrationできます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Interop Tokyo 2009での実験&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_suhEXi-tWT4/SjJR-OAUYBI/AAAAAAAAADc/v-2VNEL_QVQ/s1600-h/interop2009-figure.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer; width: 227px; height: 240px;" src="http://1.bp.blogspot.com/_suhEXi-tWT4/SjJR-OAUYBI/AAAAAAAAADc/v-2VNEL_QVQ/s320/interop2009-figure.png" alt="" id="BLOGGER_PHOTO_ID_5346425836995371026" border="0" /&gt;&lt;/a&gt;Interop Tokyo 2009では、NEMO BS機能を追加したXenサーバを2台作成し、それぞれのサーバを異なるサブネットワークに配置しました。Guest OSは、いずれかのXenサーバで動作します。&lt;br /&gt;&lt;br /&gt;Guest OSのMigrationは、通常のXen Guest OSのMigrationと同様の手順で実施されます。異なっている点は、Migration先のXenサーバが、同一サブネットワークではなく、異なるサブネットワーク上に配置してある点です。通常、このような構成ではGuest OSのMigrationは成功しません。Guest OSが他方のXenサーバに移動した時点で、ネットワークから切り離されてしまうためです。&lt;br /&gt;&lt;br /&gt;本実験では、Guest OSをMigrationすると同時に、移動元のXenサーバ上で動作しているモバイルルータ機能を停止し、他方のXenサーバでモバイルルータ機能を開始します。Guest OSが接続しているネットワークには、モバイルルータによって固定のネットワークが提供されています。このネットワークは実際にはInterop Tokyo 2009のShowNetネットワーク内に配置されたホームエージェントによって管理されており、論理的にはShowNetネットワークの一部になります。&lt;br /&gt;&lt;br /&gt;Gust OSは二つのモバイルルータ間を移動しますが、モバイルルータが提供するネットワークアドレスは変化しないため、Guest OSはHost OSが接続したネットワークが変わったことを意識する必要が無くなります。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;トラフィックのグラフ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_suhEXi-tWT4/SjJTIpxgyBI/AAAAAAAAADk/7qe1b4B_3gc/s1600-h/traffic.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 192px;" src="http://3.bp.blogspot.com/_suhEXi-tWT4/SjJTIpxgyBI/AAAAAAAAADk/7qe1b4B_3gc/s320/traffic.jpg" alt="" id="BLOGGER_PHOTO_ID_5346427115759781906" border="0" /&gt;&lt;/a&gt;実験では、Guest OSから定常的なストリーミングトラフィックを送信しながら、5分間隔でふたつのHost OSの間をMigrationさせています。それぞれのXenサーバのインターフェースのトラフィックを示します。グラフからGuest OSがふたつのXenサーバの間を移動していたことがわかります。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;謝辞&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;本実験の実施に際して、ShowNet NOCメンバーのみなさまに多大なご支援をいただきました。ここに感謝いたします。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-8364356447094004960?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/8364356447094004960/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=8364356447094004960' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/8364356447094004960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/8364356447094004960'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2009/06/xen-guest-osofflink-migration.html' title='Xen Guest OSのOfflink Migration'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_suhEXi-tWT4/SjJR-OAUYBI/AAAAAAAAADc/v-2VNEL_QVQ/s72-c/interop2009-figure.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-1097224872903554633</id><published>2009-06-11T17:24:00.008+09:00</published><updated>2009-06-11T18:14:50.032+09:00</updated><title type='text'>Xenカーネルの再構築</title><content type='html'>&lt;a href="http://www.xen.org/"&gt;Xen&lt;/a&gt;のLive Migrationで遊ぶために、LinuxのインストールやNFS rootの設定やらに四苦八苦しつつも、なんとか基本的なMigrationまではできる環境を構築できた。本当にやりたかったことは、このLive Migrationを、異なるふたつのネットワークセグメントに配置されているXenサーバ間で実行することだったりする。&lt;br /&gt;&lt;br /&gt;アイデアとしてはシンプルで、XenサーバをNetwork Mobility (NEMO) 機能を持ったモバイルルータとし、Guest OSが接続するネットワークをMobile Networkとして運用するというものだ。ふたつのXenサーバを用意して、それぞれを同じモバイルルータとして設定しておく。Guest OSのMigrationと同時に、元のHost OSのモバイルルータ機能を停止し、Migration先のHost OSのモバイルルータ機能を有効化すれば、Guest OSからみるとネットワーク的には移動していないように見える。&lt;br /&gt;&lt;br /&gt;ところが、Xenを導入したDebianでNetwork Mobilityのプログラム (&lt;a href="http://software.nautilus6.org/NEPL-UMIP/index.php"&gt;NEPL&lt;/a&gt;) を起動させようとしてみたところ、動作しないことが判明した。どうやら、NEPLが必要としているカーネル機能が組み込まれていないことが原因らしい。最近のLinuxは多くの機能が動的にロードされるモジュールとなっているが、中には動的モジュールとして分離できない拡張機能も少ないながら存在する。今回問題になったのはxfrmのポリシー拡張機能 (&lt;span style="font-family:courier new;"&gt;CONFIG_XFRM_SUB_POLICY&lt;/span&gt;) だった。この機能がカーネルに組み込まれていないと、そもそもMobile IPv6やNEMOの機能を利用することができない。しかし、カーネルのモジュールディレクトリには、Mobile IPv6やNEMOの基本部分を実装した&lt;span style="font-family:courier new;"&gt;mip6.ko&lt;/span&gt;が収められており、一見Mobile IPv6/NEMOを利用できるかのように見えてしまう。これはまぎらわしい。&lt;br /&gt;&lt;br /&gt;ともかく、カーネルの再構築が必要なので、その作業を進めることにする。XenのHost OSサポートはまだLinuxカーネルのメインラインに取り込まれていないので、再構築の際にはXenパッチを適用する必要がある。今回、Xen Host OSカーネルは&lt;a href="http://apt-rpm.org/"&gt;APT&lt;/a&gt;を使ってバイナリパッケージをインストールしているが、APTにはパッケージをソースから再構築する手段も提供されている。&lt;br /&gt;&lt;br /&gt;今回使ったバイナリパッケージは&lt;span style="font-family: courier new;"&gt;linux-image-2.6.26-2-xen-686&lt;/span&gt;なので、まずはこのパッケージをソースから再構築するために必要なツール群をインストールする。これもAPTを利用すれば簡単だ。APT便利だなぁ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# apt-get build-dep linux-image-2.6.26-2-xen-686&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;これで必要なツール群がインストールされる。続いて、カーネルパッケージのソースを入手する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# apt-get source linux-image-2.6.26-2-xen-686&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;カレントディレクトリにソースと必要なパッチが展開されるので、それを使ってパッケージの再構築をおこなう。単に再構築するだけならば、ここからさらに次のコマンドを実行するだけでよい。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# dpkg-buildpackage&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;これで、バイナリパッケージとして配布されている物と同じパッケージを再構築できる。もちろん、今回の目的はカーネルの組み込み機能を変更することなので、そのまま構築するだけでは意味がない。パッケージ構築時に参照されるカーネルスイッチは、ソースが展開されたディレクトリにある&lt;span style="font-family: courier new;"&gt;linux-2.6-2.6.26/debian/config/config&lt;/span&gt;ファイルに列挙してある。なるほど確かに、先のオプションスイッチ (&lt;span style="font-family:courier new;"&gt;CONFIG_XFRM_SUB_POLICY&lt;/span&gt;) は定義されていない。このスイッチを有効化して、パッケージを再構築するが、単に&lt;span style="font-family: courier new;"&gt;dpkg-buidpackage&lt;/span&gt;コマンドで再構築すると、カーネルABIの一貫性チェックで失敗するので、&lt;span style="font-family: courier new;"&gt;linux-2.6-2.6.26/debian/abi/2.6.26-2/&lt;/span&gt;ディレクトリの名前を変更 (あるいは削除) しておく。このディレクトリには、コンパイルされたカーネルのシンボル情報とアドレス情報が記述されており、実際に構築されたカーネルがこの情報と一致しない限りパッケージは作成されない。&lt;br /&gt;&lt;br /&gt;これでようやくXen + NEMOカーネルが完成した。ソースを展開したディレクトリに、&lt;span style="font-family: courier new;"&gt;.deb&lt;/span&gt;パッケージができているはずなので、これをdpkgコマンドでインストールし、ようやく準備完了。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# dpkg -i linux-headers-2.6.26-2-common-xen_2.6.26-15lenny2_i386.deb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# dpkg -i linux-headers-2.6.26-2-xen-686_2.6.26-15lenny2_i386.deb&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;&lt;br /&gt;# dpkg -i linux-image-2.6.26-2-xen_2.6.26-15lenny2_i386.deb&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;&lt;br /&gt;# dpkg -i linux-modules-2.6.26-2-xen_2.6.26-15lenny2_i386.deb&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-1097224872903554633?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/1097224872903554633/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=1097224872903554633' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1097224872903554633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1097224872903554633'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2009/06/xen.html' title='Xenカーネルの再構築'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-1843726991423068283</id><published>2009-06-02T18:18:00.012+09:00</published><updated>2009-06-02T21:44:24.210+09:00</updated><title type='text'>NFS rootによるXen Guest OS</title><content type='html'>&lt;a href="http://www.xen.org/"&gt;Xen&lt;/a&gt;には、あるHost OSから、同一セグメント上にある別のHost OSにGuest OSを移動させる機能があり、migrationと呼ばれている。今回はmigration可能なGuest OSを作成するときの手順をメモしておく。&lt;br /&gt;&lt;br /&gt;Migrationといっても、Guest OSのすべてのコンポーネントがHost OS間を移動するわけではない。移動するのはGuest OSのメモリイメージである。すなわち、ストレージに関してはmigration前後で同じ物を参照しておかなければならない。結果として、ストレージをすべてネットワークの向こう側に配置することになるのだけれど、一点注意しておかなければならないことがある。それは、Guest OSの起動に使われるrootパーティションもネットワークストレージに置いておかなければならないと言う点だ。&lt;br /&gt;&lt;br /&gt;今回はネットワークストレージとしてNFSを使うこととし、以下の手順でNFS rootパーティションから起動するGuest OSを準備した。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;通常のXen Guest OSイメージを作成する。&lt;/li&gt;&lt;li&gt;作成したイメージをNFS公開ディレクトリに展開する。&lt;/li&gt;&lt;li&gt;NFS機能を組み込んだkernelを作成する。&lt;/li&gt;&lt;li&gt;作成したkernelでGuest OSを起動する。&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt;には&lt;a href="http://www.xen-tools.org/software/xen-tools/"&gt;xen-tools&lt;/a&gt;の&lt;a href="http://apt-rpm.org/"&gt;APT&lt;/a&gt;パッケージが用意されており、簡単にDebianのXen Guest OSを作成することができる。&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;# xen-create-image --hostname=guest --ip=10.0.0.64 --netmask=255.255.255.0 --gateway=10.0.0.1 --dir&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:courier new;"&gt;--hostname&lt;/span&gt;、&lt;span style="font-family:courier new;"&gt;--&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;ip&lt;/span&gt;、&lt;span style="font-family:courier new;"&gt;--&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;netmask&lt;/span&gt;、&lt;span style="font-family:courier new;"&gt;--&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;gateway&lt;/span&gt;はそれぞれ、作成されるGuest OSのノード情報となる。&lt;span style="font-family:courier new;"&gt;--dir&lt;/span&gt;スイッチを指定するとGuest OSのディスクイメージが&lt;span style="font-family:courier new;"&gt;/home/xen/domains/&lt;/span&gt;ディレクトリの下に作成される。&lt;a href="http://sourceforge.net/projects/evms/"&gt;evms&lt;/a&gt;や&lt;a href="http://www.tldp.org/HOWTO/LVM-HOWTO/"&gt;lvm&lt;/a&gt;といったボリューム管理システムを使っている場合は、オプションスイッチで新しいボリュームにGuest OSイメージを作成することもできる。他にも多くのスイッチがあるので、細かく制御したい方はマニュアルページを参照のほど。&lt;br /&gt;&lt;br /&gt;作成されるディスクイメージは単一ファイル (上記の例の場合は &lt;span style="font-family:courier new;"&gt;/home/xen/domains/guest/disk.img&lt;/span&gt;) になっているので、ループバックマウントしてNFS公開ディレクトリにコピーする。&lt;br /&gt;&lt;br /&gt;続いてGuest OS用のkernelを再構築する。通常、Host OSにXenをインストールした時点で、Guest OSのkernelとして利用できるkernelイメージが&lt;span style="font-family:courier new;"&gt;/boot/&lt;/span&gt;ディレクトリにインストールされている。しかし、このイメージはrootパーティションをNFS上に置く場合は利用できない。Debian kernel では (おそらく他の多くのDistributionでも)、NFS機能はダイナミックモジュールとして提供されるのが普通である。そのため、rootパーティションがNFS上にあると、NFS機能を有効化するためのダイナミックモジュールを読み込むことができなくなる。よって、NFS機能をモジュールとしてではなく、kernel組み込み機能として作成しておかなければならない。また、NFSをrootパーティションとしてマウントするための特別なkernelスイッチも有効にする必要がある。&lt;br /&gt;&lt;br /&gt;Linux kernel再構築の詳細は省略するが、以下のスイッチ、および関連スイッチを調整することでNFS機能をkernelに組み込むことができる。&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;CONFIG_NFS_FS=y&lt;br /&gt;CONFIG_ROOT_NFS=y&lt;br /&gt;&lt;/pre&gt;スイッチには依存関係があるので、&lt;span style="font-family:courier new;"&gt;make menuconfig&lt;/span&gt;を使って依存関係を壊さないように調整するようにしよう。少なくとも、僕は依存関係を手動で調整するのはあきらめた。今回はさらに、NFS関連設定に加え、XenのGuest OSとして動作するためのスイッチも有効化することを忘れないように。&lt;br /&gt;&lt;br /&gt;作成したカーネルを適当な位置にコピーし、Xen Guest OSの設定ファイルを作成する。&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;kernel = '/boot/bzImage'&lt;br /&gt;memory = '128'&lt;br /&gt;root = '/dev/nfs'&lt;br /&gt;nfs_server = '10.0.0.2'&lt;br /&gt;nfs_root = '/export/xen/domains/guest'&lt;br /&gt;extra = 'ip=10.0.0.64:10.0.0.2:10.0.0.1:255.255.255.0::eth0:'&lt;br /&gt;name = 'guest'&lt;br /&gt;vif = [ '10.0.0.64',mac=00:16:3E:E2:0A:2F' ]&lt;br /&gt;on_poweroff = 'destroy'&lt;br /&gt;on_reboot = 'restart'&lt;br /&gt;on_crash = 'restart'&lt;br /&gt;&lt;/pre&gt;通常のGuest OSの設定ファイルと異なるのは、&lt;span style="font-family:courier new;"&gt;root&lt;/span&gt;ディレクティブに&lt;span style="font-family:courier new;"&gt;/dev/nfs&lt;/span&gt;が指定されること、&lt;span style="font-family:courier new;"&gt;nfs_server&lt;/span&gt;ディレクティブでNFSサーバのIPアドレスを指定する必要があること、&lt;span style="font-family:courier new;"&gt;nfs_root&lt;/span&gt;ディレクティブでNFSサーバのマウントポイントを指定する必要があること、&lt;span style="font-family:courier new;"&gt;extra&lt;/span&gt;ディレクティブにNFSのrootパーティションから起動するためのkernelスイッチを指定する必要があるあたりだろうか。kernelスイッチに関しては、Linuxのソースを展開したディレクトリにある、&lt;span style="font-family:courier new;"&gt;Documentation/filesystems/nfsroot.txt&lt;/span&gt;に詳しい説明が書かれている。それによれば、&lt;span style="font-family:courier new;"&gt;ip=&lt;/span&gt;スイッチの意味は&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;ip=[client-ip]:[server-ip]:[gw-ip]:[netmask]:[hostname]:[device]:[autoconf]&lt;/span&gt;&lt;/pre&gt;とのことだ。&lt;span style="font-family:courier new;"&gt;hostname&lt;/span&gt;は今回利用しないので空欄にしてある。&lt;span style="font-family:courier new;"&gt;autoconf&lt;/span&gt;については、&lt;span style="font-family:courier new;"&gt;dhcp&lt;/span&gt;、&lt;span style="font-family:courier new;"&gt;bootp&lt;/span&gt;、&lt;span style="font-family:courier new;"&gt;rarp&lt;/span&gt;などを指定することでIPアドレスを自動設定できるようだが、今回は静的にアドレスをつけているので、ここも空欄にしてある。&lt;br /&gt;&lt;br /&gt;後は、NFSサーバで適切に公開設定を行い、通常の手順でXen Guest OSを作成する。設定に問題がなければ、Guest OSの設定ファイルで指定したkernelを読み込み、起動した後、NFSサーバ経由でrootパーティションがマウントされ、通常のブートプロセスが開始する。&lt;br /&gt;&lt;br /&gt;さて、現在のところ、LinuxのNFS実装は、まだIPv4しかサポートしていないようだ。少なくとも、Debianの通常のNFSサポートではIPv6アドレスを指定してNFSマウントすることができない。もちろん、NFS rootパーティションをIPv6経由でマウントすることもできない。少しGoogleしてみたところ、NFSのIPv6サポートを進めている開発者は存在するようで、2008年のLinux Storage &amp;amp; Filesystems Workshopにて&lt;a href="http://oss.oracle.com/%7Ecel/LSF-08-NFS-IPv6.pdf"&gt;IPv6 support for Linux NFSという発表&lt;/a&gt;が行われていたようだ。2008年後半を目標に開発を進めると書かれていたので、近いうちにIPv6サポートが利用できるようになるのかもしれない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-1843726991423068283?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/1843726991423068283/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=1843726991423068283' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1843726991423068283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1843726991423068283'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2009/06/nfs-rootxen-guest-os.html' title='NFS rootによるXen Guest OS'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-7153042475913195644</id><published>2009-05-30T16:37:00.017+09:00</published><updated>2009-06-02T21:43:35.639+09:00</updated><title type='text'>Xenのインストールに苦労する</title><content type='html'>仮想化が注目されるようになって久しいが、ようやく&lt;a href="http://www.xen.org/"&gt;Xen&lt;/a&gt;に手をつけてみた。かなり流行に乗り遅れた感があるけれども、いろいろとはまったところもあるので、メモ代わりに記録を残す事にする。知っている人にとっては当たり前の内容だが、自分自身が後でまた同じ苦労をしそうなので、未来の自分に向けてはまった点を書いておこう。&lt;br /&gt;&lt;br /&gt;はまった理由は、Linuxの知識の少なさに由来する部分も大きい。ずっとBSD系のOSを使ってきたので、Linux世界の暗黙の前提が分からない事も多く、Linux使いの同僚や知り合いにたくさん質問をするはめになってしまった。おかげで、多少なりともLinuxの使い方が上手になったかもしれない。&lt;br /&gt;&lt;br /&gt;Xenは、Host OSとして&lt;a href="http://www.kernel.org/"&gt;Linux&lt;/a&gt;と&lt;a href="http://www.netbsd.org/"&gt;NetBSD&lt;/a&gt;をサポートしている。今回は、Xenと平行してLinuxのMobile IPv6スタック (&lt;a href="http://software.nautilus6.org/NEPL-UMIP/index.php"&gt;NEPL&lt;/a&gt;) を利用する予定にしているので、ホストOSとしてLinuxを選択した。&lt;br /&gt;&lt;br /&gt;今回使うDistributionは&lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt;。まわりのLinuxカーネル開発者の多くが使っているので、それに倣ってみた。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Debian testingリリース (2009年5月時点)&lt;/li&gt;&lt;li&gt;Xen 3.2.1&lt;/li&gt;&lt;/ul&gt;Debianは現時点での最新開発リリース (testing) を使ったけれども、実際はstableでもよいはずだ。NEPLが前提とするカーネル機能が、比較的新しいLinuxカーネル (2.6.23以降) にしか入っていないため、それに合うリリースを使う。stableリリースのカーネルも、十分条件を満たしているのだけれど、なんとなくtestingを使ってカーネル最前線を楽しんでみる。&lt;br /&gt;&lt;br /&gt;Xenの最新バージョンは3.4 (2009年5月時点) だが、インストール作業などをざっくり省略したかったので、&lt;a href="http://apt-rpm.org/"&gt;APT&lt;/a&gt;パッケージとして準備してある3.2.1を利用することにした。&lt;br /&gt;&lt;br /&gt;最初の問題は、DebianやXenのインストールは問題なく完了しているにもかかわらず、実際にXenを使おうとするとうまく動作していないことだった。この、「何もしていないのに動かない」系の問題は、作業をしている本人が本当に何も分かっていない場合、特に始末が悪い。Googleで同じ問題を経験した人を探してみるものの、全くそういう報告が見当たらない。これは逆にめずらしい。つまり、普通の人なら、絶対にやらない間違いをやっているということになる。&lt;br /&gt;&lt;br /&gt;調べてみると、どうやらGuest OSを接続するためのブリッジインターフェースの作成と、Host OSが実際のネットワークと接続する物理インターフェースの作成に失敗しているようだった。&lt;br /&gt;&lt;br /&gt;Xenサービスが起動する際、Host OSのネットワークインターフェースは、だいたい以下の手順で操作される。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Guest OSを収容するためのブリッジインターフェース (&lt;span style="font-family:courier new;"&gt;tdev&lt;/span&gt;) を作成する。&lt;/li&gt;&lt;li&gt;Host OSが、Xenサービス開始前に利用していたインターフェース (通常は&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;) のネットワーク情報 (IPアドレス、経路情報など) を、1.で作成した&lt;span style="font-family:courier new;"&gt;tdev&lt;/span&gt;インターフェースに移動する。&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;インターフェースを&lt;span style="font-family:courier new;"&gt;peth0&lt;/span&gt;に名称変更する。&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;tdev&lt;/span&gt;インターフェースを&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;に名称変更する。&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;peth0&lt;/span&gt;インターフェースをブリッジインターフェース (この時点では&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;) のスレーブとして追加する。&lt;/li&gt;&lt;/ol&gt;この操作の結果、Host OS上に&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;というブリッジインターフェースが新規に作成され、もともと&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;という名前だったインターフェースは&lt;span style="font-family:courier new;"&gt;peth0&lt;/span&gt;に名前を変えることになる。なぜこのような複雑な手順が必要かというと、Host OS上で動作するアプリケーション群から、インターフェース名の変更を隠蔽するためだろう。Xenサービス開始前と後では、&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;の構成状態が異なる (通常のインターフェースからブリッジインターフェースに変更されている) が、アプリケーションからみるとXenサービス開始前と同様、&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;のままアクセスできる。&lt;br /&gt;&lt;br /&gt;問題なさそうだが、最初にXenを使おうとした時は、なぜか&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;と&lt;span style="font-family:courier new;"&gt;peth0&lt;/span&gt;に同じネットワーク情報が重複して設定されるという状態に陥っていた。さんざん悩んだ挙句、問題は&lt;a href="http://projects.gnome.org/NetworkManager/"&gt;NetworkMmanager&lt;/a&gt;と呼ばれるソフトウェアとの競合にあることが分かった。NetworkManagerは、ネットワークインターフェースの設定を半自動化するアプリケーションソフトウェアのようだ。ネットワークインターフェースのup/downに応じて、設定ファイルに記述された情報を元にアドレスを構成する。Xenの場合、前述したブリッジインターフェースの構成の途中で、インターフェースのup/downが発生する。このとき、すでにアドレスを取り除かれた&lt;span style="font-family:courier new;"&gt;eth0&lt;/span&gt;インターフェースが、&lt;span style="font-family:courier new;"&gt;peth0&lt;/span&gt;に名称変更される前にup/downが行われ、結果NewtorkManagerによって再び (不要に) アドレスが構成されていた。&lt;br /&gt;&lt;br /&gt;当然、この問題はNetworkManagerがインストールされていなければ発生しない。どうやら原因は、Debianのインストールの際に、なにも考えずにDesktop環境を構成したことにあったようだ。NetworkManagerは、GUI統合環境のタスクバーから簡単にネットワークインターフェースを設定するために使われる事が多く、今回インストールしてしまっていたDesktop環境でも利用されていた。&lt;br /&gt;&lt;br /&gt;あらためてDebianをCUIインターフェースのみの構成でインストールし直してみると、なんの問題もなくXenサービスが起動した。普通Xenなぞを使おうと思うような人は、Desktop環境をインストールすることもないだろうから、誰も問題に遭遇していないのだろう。&lt;br /&gt;&lt;br /&gt;ともかく、これでようやく下準備ができた。問題はさらに続く。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-7153042475913195644?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/7153042475913195644/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=7153042475913195644' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/7153042475913195644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/7153042475913195644'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2009/05/xen.html' title='Xenのインストールに苦労する'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-3204940128436418403</id><published>2008-08-03T13:22:00.003+09:00</published><updated>2008-11-13T10:21:48.262+09:00</updated><title type='text'>横にならないブラウザ</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_suhEXi-tWT4/SJUzCnUQeoI/AAAAAAAAADI/3orJX6l9duY/s1600-h/photo.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_suhEXi-tWT4/SJUzCnUQeoI/AAAAAAAAADI/3orJX6l9duY/s320/photo.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5230142662267402882" /&gt;&lt;/a&gt;iPhoneのSafariブラウザはよく落ちる。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まぁ、不安定な初物というのは別に珍しくないので気長に構えることにする（もちろん、普通の利用者にとっては大きな問題だろうから、早急に安定させて欲しいが）。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;それより、個人的に問題なのは加速度センサーによるportrait - landscape自動検知だ。行儀が悪いので、ついゴロゴロしながらウェブ閲覧などしているのだけど、縦画面で見たいのに、ちょっと姿勢を変えた拍子に横画面になってしまう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ということで、UIWebViewを使って横にならないブラウザを試しに作ってみた。CocoaのWebKit Frameworkをちょっとでも使ったことのある人なら、あっという間に作れるはず。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とりあえず、表示はできるようになったけど、一番見たかったGoogle Readerはクリック時にページを別ウインドウで開くため、単純にUIWebViewだけでは済まないことが（当然予測できてしかるべきではあるが）判明。ちょっと作業が必要だなぁ。その前に、誰かが作ってApp Storeに登録しそうではあるが。。。&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-3204940128436418403?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/3204940128436418403/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=3204940128436418403' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/3204940128436418403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/3204940128436418403'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/08/blog-post.html' title='横にならないブラウザ'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_suhEXi-tWT4/SJUzCnUQeoI/AAAAAAAAADI/3orJX6l9duY/s72-c/photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-5552559289662659833</id><published>2008-07-24T21:05:00.003+09:00</published><updated>2008-11-13T10:21:48.445+09:00</updated><title type='text'>iPhoneでWiFi</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_suhEXi-tWT4/SIhwj3T0XnI/AAAAAAAAADA/nTRDGvz9DfQ/s1600-h/wifimonitor.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_suhEXi-tWT4/SIhwj3T0XnI/AAAAAAAAADA/nTRDGvz9DfQ/s320/wifimonitor.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5226551129008266866" /&gt;&lt;/a&gt;お祭り騒ぎになった7月11日から1週間が過ぎた頃、ようやくiPhoneを入手できた。たまたま運良く早朝販売で購入することができたけれど、まだまだ入荷量は不安定のようだ。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;さて、iPhone Dev Programにはしばらく前から登録されており、これまでtouchを使って遊んでいたのだけど、iPhone実機が手に入ったので、作りかけていたWiFiモニターをiPhoneで動かしてみた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;キーノートで話題になっていたCoreLocationサービスを使うのだけど、WiFiしか使えないtouchですら、かなり正確に場所を示してくれていた。iPhoneにはGPSも搭載されているので、より正確な位置に加え、高さも取得できる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;もともと、WIDEプロジェクトのWiL用アクセスポイントデータをiPod touch/iPhoneで収集しようとして作りかけたもので、あとは登録部分さえ作れば、それなりに使えるものになりそう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;問題はむしろ、これをどうやって配布するかということになる。App Storeで配布できるのかなぁ。一応、作ってはならないアプリケーションの条件には合致しないと思うのだけど。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;残念なのは、プログラムのソースコードを公開できないこと。詳細を述べることはできないが、締結したNDAに抵触する行為となる。Xcodeを用いた、Mac用のソフトウェアには、このような制限はないようなので、いずれNDAの内容が更新されることを期待したい。情報交換ができる方が、開発者のスキルも向上するし、よりよいソフトウェアが作られると思うから。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-5552559289662659833?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/5552559289662659833/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=5552559289662659833' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/5552559289662659833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/5552559289662659833'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/07/iphonewifi.html' title='iPhoneでWiFi'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_suhEXi-tWT4/SIhwj3T0XnI/AAAAAAAAADA/nTRDGvz9DfQ/s72-c/wifimonitor.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-9111659095562588630</id><published>2008-06-18T19:16:00.003+09:00</published><updated>2008-11-13T10:21:48.676+09:00</updated><title type='text'>Global HAHA</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_suhEXi-tWT4/SFjg0SY4FXI/AAAAAAAAACg/-yy1DiET43c/s1600-h/P1040310.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_suhEXi-tWT4/SFjg0SY4FXI/AAAAAAAAACg/-yy1DiET43c/s320/P1040310.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5213163757575345522" /&gt;&lt;/a&gt;どうにかInterop Tokyo 2008での実験を完了。(実験の詳細は&lt;a href="http://www.mobileip.jp/interop2008/Top.html"&gt;こちら&lt;/a&gt;)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ホームエージェントは、コントリビュータさん提供の1U PCを2台。1台をホール123に設営された主NOCに、もう1台をホール45に設営されたサテライトNOCに置かせてもらった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ホームエージェント切り替え対応は、NetBSD + SHISAにホームエージェントスイッチメッセージを拡張実装したものを利用。モバイルノードからのBinding Updateが、別のホームエージェントからトンネルされてくるタイミングで、モバイルノードにスイッチメッセージを送る。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;モバイルノードは、NetBSD + SHISA (ノートPC)、およびUbuntu Linux + UMIP (USAGI MIP) (Virtual Machine) の2種類を用意。それぞれ、ホームエージェントから送られるスイッチメッセージに従って、より近いと判断されたホームエージェントに再登録する仕組みを拡張実装した。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回、ホームエージェントを広域に分散した訳ではないため、実際役に立ったかと言われると、まぁたぶん役に立ってはいないのだけれども、スイッチメッセージが正しく動作し、モバイルノードがホール間を移動したタイミングで、登録ホームエージェントが切り替わる動作が確認できたことが、一番の収穫だ。次は、本当のインターネットでの実験かな。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-9111659095562588630?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/9111659095562588630/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=9111659095562588630' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/9111659095562588630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/9111659095562588630'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/06/global-haha.html' title='Global HAHA'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_suhEXi-tWT4/SFjg0SY4FXI/AAAAAAAAACg/-yy1DiET43c/s72-c/P1040310.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-1682923801273421056</id><published>2008-06-01T17:32:00.002+09:00</published><updated>2008-06-01T17:42:33.711+09:00</updated><title type='text'>INTEROP TOKYO</title><content type='html'>INTEROP TOKYO 2008でMobile IPv6のホームエージェント分散運用の実験をするためにホットステージに参加している。INTEROP関連に関わるのは、IPv6 Show Case以来なのでかなり久しぶり。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;残念ながら、今回の実験は一般のユーザの方が体験できる環境ではなく、NOCメンバにMobile IPv6端末を使ってもらうという形になる。ホームエージェントの台数は2台で、会場に設営されるNOCを間借りして運用。それぞれのホームエージェントをネットワーク的に離れたNOCに収容し、Mobile IPv6のホームネットワークへの経路をanycastとして広報することで、移動ノードを経路的に近いホームエージェントに収容する仕組みだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今日までにインストールを完了し、接続テストとかしている予定だったのに、順調に遅れている。明日くらいにテストできるといいんだけど。。。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-1682923801273421056?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/1682923801273421056/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=1682923801273421056' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1682923801273421056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1682923801273421056'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/06/interop-tokyo.html' title='INTEROP TOKYO'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-1420006123080216609</id><published>2008-04-25T21:30:00.007+09:00</published><updated>2008-11-13T10:21:49.020+09:00</updated><title type='text'>フラグメントと効率</title><content type='html'>パケットを送信する際、パケット長が長ければ長いほど送信に失敗する確立が高くなる。そのため、ビットエラーの発生率が高い無線リンクなどでは、短いパケットなら届くのに、長いパケットだと届かないという状況に出合うことがある。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;パケットを短くすれば良いのは明らかだけれども、アプリケーションレベルでは（なるべく）パケットサイズを気にしたりしたくないし、TCPのように、そもそもアプリケーションレベルでパケットサイズの調整が困難な場合もある。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そこで、単純に大きなパケットを送信する際にリンク層で分割するだけで、多少なりとも効率があがったりはしないのか、と考えたくなる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:none; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_suhEXi-tWT4/SBHSw5CK2wI/AAAAAAAAACY/UGl7B49PuaE/s320/efficiency.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5193163582720367362" /&gt;&lt;div&gt;エラー発生時の再送などを考慮しつつ、思い切り通信モデルを単純化して、1500バイトのパケットを送信する際のフラグメントサイズと、通信効率の関係をプロットしてみたところ、上のようなグラフになった。通信路のビットエラー率は10&lt;sup&gt;-4&lt;/sup&gt;を仮定している。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;フラグメントサイズが40のときが最も効率が良いらしい。うーん。本当だろうか。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-1420006123080216609?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/1420006123080216609/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=1420006123080216609' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1420006123080216609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/1420006123080216609'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/04/blog-post.html' title='フラグメントと効率'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_suhEXi-tWT4/SBHSw5CK2wI/AAAAAAAAACY/UGl7B49PuaE/s72-c/efficiency.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-5455267677798845991</id><published>2008-04-06T17:48:00.003+09:00</published><updated>2008-04-06T17:56:20.913+09:00</updated><title type='text'>iPhone SDKとInterface Builder</title><content type='html'>iPhone SDKが更新されて、Interface Builderが付属するようになった。早速試してみようと思ったところ、どうやらまだXcodeとの統合が完全ではなく、新規プロジェクトを作成するときに自動的に適切なixbファイルを作ったりはしてくれないようだ。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ウェブで先達の知恵を漁って、なんとなくInterface Builderを使う方法がわかったけれど、一点すごくはまったところがあるので、ここに書いておこう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Interface Builderで新規のCocoa touch用ixbファイルを作成し、WindowとViewを作成するのだけど、Viewの初期値でUser Interactionがオフに設定されている。このせいで、View内に配置したボタンからのアクションが実行されずに、かなり悩んだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次のベータでは、きっとXcodeとの統合も完了し、Interface Builderでほいほい画面が作れるようになるだろうから、その時を気長にまとう。その前に日本でiPhone発売されないと、あんまり意味ないけど。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-5455267677798845991?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/5455267677798845991/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=5455267677798845991' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/5455267677798845991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/5455267677798845991'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/04/iphone-sdkinterface-builder.html' title='iPhone SDKとInterface Builder'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-3219178603350849773</id><published>2008-03-24T17:42:00.003+09:00</published><updated>2008-03-24T17:45:01.644+09:00</updated><title type='text'>L2TP on MacOS X</title><content type='html'>以前、MacOS X 10.5とMacOS X Server 10.4の間でL2TPを使う場合、MPPEを無効にしなければ接続できない、という内容の記事を書いたのだけれど、今日同僚からMPPEが有効のままでも問題なく接続できるとの情報をもらった。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;え！？ と思って自分のMacから試してみると、たしかに接続できる。うーん。なにかの勘違いだったのか。。。？&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-3219178603350849773?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/3219178603350849773/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=3219178603350849773' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/3219178603350849773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/3219178603350849773'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/03/l2tp-on-macos-x.html' title='L2TP on MacOS X'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-3920160829066345791</id><published>2008-02-21T19:10:00.002+09:00</published><updated>2008-02-21T19:11:35.936+09:00</updated><title type='text'>keiichi-mipv6 tag on NetBSD</title><content type='html'>Mobile IPv6開発のためにNetBSD treeにtagを打つ。どきどきだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-3920160829066345791?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/3920160829066345791/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=3920160829066345791' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/3920160829066345791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/3920160829066345791'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/02/keiichi-mipv6-tag-on-netbsd.html' title='keiichi-mipv6 tag on NetBSD'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3548910209670789438.post-6493603625095875380</id><published>2008-02-15T15:48:00.010+09:00</published><updated>2008-02-15T19:32:02.233+09:00</updated><title type='text'>L2TPでグローバルインターネット</title><content type='html'>MacOS X Server (10.4)をL2TPサーバにしてMacOS X (10.5)から接続する設定をしてみた。目的は、NATの裏からでもグローバルアドレスを使った通信をするため。&lt;div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;MacOS Xで遠隔会議するとき、&lt;a href="http://xmeeting.sourceforge.net/index.htm"&gt;XMeeting&lt;/a&gt;をよく使う。このとき、プライベートアドレスだとハマることが多い。それならいっそのことグローバルアドレス使えばいいじゃん、という流れ。会議は手段なので、&lt;a href="http://www.softether.com/"&gt;PacketiX VPN&lt;/a&gt;みたいなソフトが使えるなら、迷わず使いたいところ。残念ながら、MacOS X用はまだでないようだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;気をつけないといけなかった点は以下の通り。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;OS XクライアントでMicrosoft Point-To-Point Encryption (MPPE) Protocol (RFC 3078)を使わないように設定&lt;br /&gt;&lt;/li&gt;&lt;li&gt;OS X Serverのファイアウォールで、IKE (UDP 500)、IKE NAT Traversal (UDP 4500)、L2TP (UDP 1721)を通すように設定&lt;br /&gt;&lt;/li&gt;&lt;li&gt;当然、NATボックスも上記UDPポートを通すように設定&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;1.に関して、MacOS XのL2TP接続設定にはMPPEをオフにする設定がない。ウェブを見回っていたら、/Library/Prefences/SystemConfiguration/preferences.plistのCCPMPPE128EnabledとCCPMPPE40Enabledの値を0にすればよいという情報を見つけたので、それで対応する。&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MPPEはPPPペイロード (PPP Information Payload) を暗号化するための仕様。L2TPとPPPの終端装置が同じ物で、しかもIPsecを使ってL2TPのUDPトラフィックを暗号化している限りにおいては、MPPEでPPPペイロードを暗号化しなくてもよいだろう、と判断。というか、いまどき大切な情報をリンク層の暗号化機能のみで守る時代でもないだろうし。&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;なお、L2TP (+ IPsec)は、UDP 500、1721、4500が使えることが前提。次の問題は、これらのポートが空いているかどうかかな。&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3548910209670789438-6493603625095875380?l=networkautonomy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://networkautonomy.blogspot.com/feeds/6493603625095875380/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3548910209670789438&amp;postID=6493603625095875380' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/6493603625095875380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3548910209670789438/posts/default/6493603625095875380'/><link rel='alternate' type='text/html' href='http://networkautonomy.blogspot.com/2008/02/l2tp.html' title='L2TPでグローバルインターネット'/><author><name>keiichi</name><uri>http://www.blogger.com/profile/15576067072730290952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
