Plan9 from User Space: 普通のOSでplan9コマンドを使ってみる
Russ Coxはplan9に対する思い入れが相当あると見え、ユーザランドでplan9が体験できる環境をリリースした。
http://swtch.com/plan9port/
その名も「Plan9 from User Space」。 OSの名前となったEd Woodの名作"Plan9 from Out Space"をもじったものだ。
環境はLinux,*BSD,OS-XなどUnix系はサポートしているので、普段のマシンでplan9が体験できる。
インストール
ソースをダウンロードして展開し、/usr/local/plan9/(これが標準の居場所)に動かす。そこで./INSTALLを走らせればいいのだがX11ヘッダーが一通り必要となる。
- wget http://swtch.com/plan9port/plan9port.tgz
- tar xzf plan9port.tgz
- sudo mv plan9 /usr/local
# こんなのをインストールした(ubuntu)
- sudo apt-get install x11proto-xext-dev
- sudo apt-get install libxext-dev
- sudo apt-get install libxt-dev
- cd /usr/local/plan9; ./INSTALL
これで暫く待つ。無事ビルドが成功するとそこ(/usr/local/plan9)に使える環境ができる。PATHのお尻に/usr/local/plan9/binを追加して使う。
印象
コマンドとかはUnixと似たようなのが揃っている。Unixで使い慣れたものを再実装したんだろう。でも全く同じじゃない。どっちかというと、よりUnixの原点に戻たような感じだ。catにはオプションがない。(確かに使わない) lsは出力を複数のカラムに分割しない。そのまま真っ直ぐ一列になって出てくる。カラムに分けたければ、フォーマット変換プログラムにパイプすればいいという考えだ。これが真のUnixプログラムのありかただ。wcはUTF文字を数える。このように簡潔化されたり進歩したりしている。
ソースはCのよう。/usr/local/plan9/src/にソースが全てある。goの前身みたいな言語で書かれているわけじゃないようだ。でも開発ツールには9cや9lとかいう独自のシェルスクリプト(gccのラッパー)が用意されている。
plan9環境のエミュレーション
plan9ではサービスがファイル・システム・インターフェースとして提供されている。要は何でもサーバで、これをクライアントが自分の「ネームスペース」にマウントし、読んだり書いたりする。Unixの「何でもファイル」を徹底化したアーキテクチャだ。(UnixのFSマウントと違って、マウントされたサービスはそのプロセスにしか見えないようだ) クライアントサーバとファイルシステムが融合されたような感じだろうか。
この機能は本物のplan9でなければ体験できない。Unix上のPlan9 from User Spaceではp9というクライアントコマンドで模倣する。仮想のplan9サーバのファイルシステムインタフェースに対してlsしたりファイルを読んだり書いたりできる。
acmeを使ってみる
$ PATH=$PATH:/usr/local/plan9/bin
$ /usr/local/plan9/bin/acme
こうすると、お世辞にも綺麗とは言えないウインドーが上がってくる。
man 1 acmeにはキーボードやマウスから使えると書いてあるがどう使えばいいのかわからない。
でも、acmeの面白いところはプログラムがエディタと対話できることだ。(emaclientみたいな感じかな)
http://doc.cat-v.org/plan_9/4th_edition/papers/acme/
なので、早速p9でacmeと対話してみたい。
$ /usr/local/plan9/bin/9p
usage: 9p [-n] [-a address] [-A aname] cmd args...
possible cmds:
read name
readfd name
write [-l] name
writefd name
stat name
rdwr name
ls [-ldn] name
without -a, name elem/path means /path on server unix!$ns/elem
read write lsなどはわかる。
man 4 acmeから「acme」というディレクトリがあると知った。これを読んでみると:
$ /usr/local/plan9/bin/9p read acme
E��@�S<9MS<9MacmetengutengutenguE��S<9MS<9MconstengutengutenguH�S<9MS<9MconsctltengutengutenguE���S<9MS<9MdrawtengutengutenguH��S<9MS<9MeditouttengutengutenguF�S<9MS<9MindextengutengutenguF��S<9MS<9MlabeltengutengutenguD�@�S<9MS<9MnewtengutengutenguB����S<9MS<9M1tengutengu
なんか凄い出力になってしまった。
lsしてみると…
おう。
$ /usr/local/plan9/bin/9p ls acme
1
2
acme
cons
consctl
draw
editout
index
label
new
read acmeはディレクトリをcatするようなことのようだ。さて書き込みはできるか?
なんと、改行と同時にacmeの右下のパネルにテキストが出てきた! 上のスクリーンショット参照。
$ /usr/local/plan9/bin/9p write acme/new/body
asfadf
adsfasf
adsfas
oh hai
エディタというアプリケーションをサーバ化して、それをファイルインターフェースで駆ることができるのだ。本物のplan9ならacme/というディレクトリがどこかに出現して 'echo oh hai | acme/new/body'みたいなことするとそれが反映されるんだろう。