2010年1月31日日曜日

画面を飛ばす



Xのように画面をリモートに飛ばせるようです。

cpuサーバーにログインして、ローカルのwmを
指定してサーバー側のGUIを起動するようです。

※前エントリーのcpuサーバーへの接続の設定済みとします

%mount {wmexport} /mnt/wm
%cpu tcp!サーバー
; wmimport -w /n/client/mnt/wm wm/wm &

→ ウィンドウが開き、その中でwmが動く。

手前の赤枠のウィンドウ:リモートのGUIを表示させた入れ子のwm(unameがlinux)
左上のシェル:cpuサーバーに接続したシェル。(unameがlinux)
左下のシェル:ローカルのシェル。(unameがdarwin)

※専用アプリがあるようです。wm/dmwm、wm/dmviewを使うらしい。
wmview,wmdmを使う方法はあらかじめサーバー/クライアントでwmが
立ち上がることを前提としているような。

Infernoのサーバーの機能について

Infernoのサーバー機能についてちょっと解って来ました。
Plan9のサーバーは
- CPUサーバー
- 認証サーバー
- ファイルサーバー
にわかれるそうです。
どうやらInfernoもそういう分け方という理解で良さそう。

なお、それぞれのサーバー機能で、サービス名のニーモニック(styxとか、ポート番号を文字列で表現する)とか、ネットワークアクセスをする場合は、あらかじめ
ndb/cs
を実行しておく。

・認証サーバー
認証サーバーのプログラムはsvc/auth。
アカウント情報はauth/changeloginで追加する。

例えば、ユーザー/パスワードを追加するには、
auth/changelogin [ユーザー]
と実行する。

また、auth/createsignerkeyで鍵の生成も必要。
auth/createsignerkey [ユーザー]

認証サーバーを使う場合は、getauthinfoで
認証を行う。

例えば、後述のCPUサーバーの機能を使う場合は、
CPUサーバー、クライアントそれぞれでgetauthinfoを実行する。

・CPUサーバー
サービス名はrstyx。
サーバー側では、getauthinfoを実行するか、svc/rstyxを
実行するとサービスが立ち上がるんじゃなかろうか(自信無い)。
getauthinfo default
signer: 認証サーバー(cpuサーバーと同じ所で認証サーバーを動かすときはlocalhost)
user: ユーザー

保存しますか?にYESと答えると、認証情報が保存される。
再起動後はsvc/net or svc/rstyxの起動だけでよい。

クライアントからはまず認証。
getauthinfo tcp!接続先アドレス
signer: 認証サーバー
user: ユーザー

つぎに、接続コマンド
cpu tcp![CPUサーバー]
とすると、サーバーにログインし、
プロンプトが表示される。
抜けるときはexit。

ほかに、クライアントからはrcmdというのもつかえそう。
こちらはおそらくコマンドの単品実行でしょう。

・ファイルサーバー

ファイルサーバー側ではgetauthinfoを行う。
やり方はCPUサーバーと同じ。
getauthinfoの結果ファイルサーバーが立ち上がるようだ。
save file = yes としたときだけかな?

サーバー立ち上げはsvc/styxで。
または、細かくオプションを選ぶ場合はlisten。
認証(引数にキーを選ぶ)、エクスポートするディレクトリを選べるようだ。

クライアントからはgetauthinfoで認証し(CPUサーバーと同じ)
mountする。
mountは、こんな感じで。
mount tcp![ファイルサーバー] /n/remote
でOK。

※マウント後のファイルの使い方はいろいろ面白いことがありそう。
 例えば、Xみたいに画面を飛ばすのが面白かった。

※svc/net というサーバーコマンドもあるけど、これは
CPUサーバーとファイルサーバー両方まとめて立ち上げるように
思われる。

2010年1月26日火曜日

Inferno-kirkwoodのビルド

Linux環境を壊して、その復旧をしたりとのろのろやっていて
時間がかかってしまいましたが、
先日話題にしたInferno-kirkwood(sheevaplugで動かすInferno)をビルドしてみました。

結局ビルドできた環境はi386上のLinuxのみ。
arm上のLinux、i386上のOSXではいずれも失敗。

以下試したビルド方法。
Infernoのディレクトリは既にある物とする。

os/にinferno-kirkwoodのtrunkを持ってくる。
os/kirkwoodというディレクトリ名にしておく。

os/kirkwoodにsheevainit.bというファイルがあるので、
このファイルをinit/にコピー。

os/Linux/386/binにパスを通す。
まだやっていなかったらmakemk.shを実行。
あ、そのまえにmkconfigの編集が要るかも。
SYSTARGをLinuxに、SYSARCHを386にしておく。

os/kirkwood/mkuimageというディレクトリがあるので、
ここで、mk all;mk install実行。
これは、生成するバイナリをubootで使用できる形式に変換する物。

続いて、os/kirkwood/でmk allを実行。
/usr/以下の○○というファイルが無い、とか言われたら、
空のファイル/ディレクトリで良いので作って再トライ。

すると、uisheeva.gzというファイルができた!
サイズは700kbyte程。

実機で動かしたいけど、動かした後何かしたい訳でもないのでまあいいや。

Acheron Limbo Compiler

Limbo コンパイラーとその実行環境をPOSIXに移植したプロジェクトがあるそうです。

Acheron Limbo Compiler

もしこれが普通に使えそうなら、普段からLimboがいかせるかもしれない。


コンパイルしてみようと思ったが、ごにょごにょしているうちに、
Linuxマシンをおかしくしてしまった。
やる気を失ったので後日・・

なお、ソースはアーカイブになっていないようなので、CVSで持ってくる必要がありそう。
また、コンパイルにはocamlが必要っぽい。



ほかに、Parrotについてもちょっと見てみた。
これは、仮想マシン(レジスタマシン)の実装らしい。
色々な言語に対応しているようだ。
しかし、Limboには対応していないようだ。残念。

Parrot Language

2010年1月23日土曜日

mkuimageがあると便利

Plan9日記にて
inferno-kirkwoodの紹介があった。
InfernoをSheevaplugで動かすプロジェクトらしい。
これは参考になりそう。

で、そこのソースツリーにmkuimageというのがあった。
ubootでブートするためのイメージファイルを作るためのものだと思う。
これ使えないだろうか(OSXで動くといいなぁ)。

それはともかく、このプロジェクトはBeagle Boardの
ネイティブポートの参考になるはずなので見てみることにする。

Sheevaplugもちょっと気になっているが、たぶん買わないと思う。

2010年1月20日水曜日

BeagleboardのLinux emuでUIが動いた



Beagleboard上のLinux上のInferno emuでGUIが動きました。

スタンドアロンではなく、他のマシンのXserverに画面を飛ばしています。

やったこと

・ubuntu on beagleboardの環境整備

apt-getにてxorg, xorg-dev, gcc, mercurialを持ってくる。

・Infernoのビルド

google codeのtrunkをmercurialで持ってきて、ごにょごにょとビルド。

・Xserverの用意。

今回はWinXP上のcygwinのXserverを使ってみた(図)。
いい感じでwm/wmが表示された。

charonを立ち上げようとしたら固まった。まだ完全ではないらしい。

ちなみに、ネットワーク経路はかなりひねくれていて、

beagleboard -(usb)- MAC -(wlan)- hub -(ether)- Win

といった感じ。OSもinferno,linux,osx,win、経路はUSB, wlan, Ethernet、
アーキテクチャもarm, i386と、ふんだんにまたがっています。
MACはネットワークブリッジとシリアルコンソールとして機能している。

※Linuxと対向だったらもっと素直にいけたかも。

なお、スタンドアロンも試みたのですが、startx自体は実行でき、xtermも立ち上がったっぽいのですが、USBキーボードをさしたらXが落ちたっぽい。
引き続き調査予定。

2010年1月16日土曜日

InfernoのHTTPでCGIを書く

InfernoのHTTPでCGIを作成する方法が分かりました。

・HTTPサーバーの起動

svc/httpd/httpd

オプションは
-D デバッグログを出す
-p ポート

・まずは普通のウェブページの表示方法

/services/httpd/rootというディレクトリの下に
htmlソースを置くとアクセスできる。
index.htmlというファイルを置くと、

http://host/index.htmlまたはhttp://host/ でアクセス可能。

サブディレクトリを作ってもOK。

・CGIのサンプル

CGIはhttp://host/magic というパスでアクセスする。
まずはhttp://host/magic/echo
とアクセスしてみる。
すると、なにやら情報が表示される。
これはファイルシステム上の/dis/svc/httpd/echo.disに当たる。
LimboでかかれたCGIファイルで、ソースは/appl/svc/httpdの下にecho.bがある。
これを真似して、例えば同じ場所にtest.disを置くと、
http://host/magic/test
でアクセスできる。

詳細はecho.bをみると大体わかるが、
通常のシェルコマンドと書き方がちょっと違う。

覚えきれるものでもないので、雛形にしてしまうのがよいか。


implement test;

include "sys.m";
sys: Sys;
include "draw.m";

include "bufio.m";
include "cache.m";
include "contents.m";
include "httpd.m";
Private_info: import Httpd;
include "cgiparse.m";
cgiparse: CgiParse;

test: module {
init: fn(g: ref Private_info,
req: Httpd->Request);
};

init(g: ref Private_info,
req: Httpd->Request)
{
sys = load Sys Sys->PATH;
cgiparse = load CgiParse CgiParse->PATH;
if(cgiparse == nil){
return;
}
cgidata := cgiparse->cgiparse(g, req);
bufio := g.bufio;
Iobuf: import bufio;

# Send header
g.bout.puts(cgidata.httphd);

# Send body
g.bout.puts("<head><title>test</title></head><body>test</body>\r\n");

g.bout.flush();
}


リクエストデータはcgiparseの結果に格納され、
method, uri, headerなどのメンバーで参照できて便利。
フォームデータはformでアクセス出来るのでこれでCGIが実現できるはず。
これはtag, valのペアのリストになっているのでhd, tlメソッドで
簡単に取り出せる。

(tag, val) = hd cgidata.form;
cgidata.form = tl cgidata.form;

のループでOK。

cgidataに関してはcgiparse.mを見ると良い。
関係ないけどacme(エディタ)でimport "cgiparse.m";の所で右クリックすると
ヘッダファイルにジャンプしてくれるので実に便利。

・その他

認証には対応していないように見える。

情報があんまり無いので、結局ソースコードから追った。
時間かかった〜。

2010年1月14日木曜日

Inferno on Ubuntu on Beagleboard

さて、新年が始まったわけですが、いきなりインフルエンザに罹患し出遅れています。
とはいえ、自由時間が取れるようになってきたので開発を再開しました。

Inferno on Ubuntu on Beagleboardを試してみました。
BeagleboardというARMボードの上でUbuntu Linuxをまず動かします。
その上でHosted Infernoを動かしてみました。
結果はうまくいきました。
wmは無理ですが、シェルは動きました。
ネットワークも未検証です。

なお、すべてネットに転がっていたビルド済みバイナリを利用しました。
何一つ自力でコンパイルしていない・・・

Ubuntuのインストール

まずはUbuntuのインストールです。
http://pyohn.blog.so-net.ne.jp/2009-11-18
の通りです。
作業はdebianで行いました。古いマシンなので遅かった・・・

・ビルド済みデモイメージを持ってくる
・カーネルとルートファイルシステムが含まれている。
・カーネルをuImageに変換し、SDカードのfatパーティションにコピー
・ルートファイルシステムをSDカードのext3パーティションに展開
・SDカードをbeagleboardに取り付け、ブート。
・以下のコマンド

setenv bootcmd 'mmc init; fatload mmc 0:1 0x80300000 uImage; bootm 0x80300000'
setenv bootargs 'console=ttyS2,115200n8 console=tty0 root=/dev/mmcblk0p2 rootwait rootfstype=ext3 ro vram=12M omapfb.mode=dvi:1280x720MR-16@60'
boot

で、めでたくログインプロンプトが出る。
このデモイメージはubuntu/temppwdというアカウントでログインできるようだ。

ひとまずubuntuが立ち上がった。

Infernoのインストール

つづいてInfernoのインストールです。
ubuntuのext3パーティションのどこかにInfernoのシステムをおきます。
たとえば/Infernoとか。

必要なものはInfernoのバイナリ。
これは、
http://code.google.com/p/inferno-bin/
にあるものを使いました。
Downloadから
「emug Linux arm Google Android emulator」
を選択しました。ダウンロードしてemu-gなどという名前にしておきます。

これだけでは動作せず、いくつかdisファイルが必要なようです。
選ぶのも面倒なので、既存のdis一式を丸ごとコピーしました。
コピー元は
http://code.google.com/p/inferno-os/
のtrunkのdisディレクトリでよいかと。
※disはアーキテクチャに依存しないので、どれでも共通です。

これらをたとえば以下のようなディレクトリ構成に配置します。

dis/
Linux/arm/bin/emu-g

Ubuntuでログインし、
cd path.../Linux/arm/bin
とディレクトリを移動し、
emu-g -r ../../../
とすると見事シェルが立ち上がりました。
-rはルートディレクトリです。
プロンプトは;です。
lcとするとファイル一覧が表示されます。

今後

これにて組み込みボードでInfernoが動く感じが再現できました。
しかし、できればNativeで動かしたいので引き続きNative Infernoを動かす努力を
していきたいと思います。
また、Hosted Infernoも、ネットワークがまだ動かせていないなど、課題があるので
そちらもやっていこうかと。