まちの話題 - 南大隅町役場...2005.122006.09 みなみおおすみ 広報 ② まちの話題 まちの話題 Town, s Topics 八 月 二 〇 日 、 大 浜 海 岸 に お
Plan 9のお話
-
Upload
ryousei-takano -
Category
Technology
-
view
4.686 -
download
6
description
Transcript of Plan 9のお話
Plan 9とは?UNIXを開発したベル研の連中が開発した分散OS
2004
Jim McKie
1995
Dennis Ritchie
Dave Presotto
Rob Pike
Phil Winterbottom
Plan 9とGoogle
• Rob Pike、Ken Thompson、Russ Coxなど主力開発者がGoogleへ
http://undergoogle.com/tools/GoogleMasterPlanEN.html
Google OSPlan 9
Plan 10
Plan 11?
UNIXに勝てなかったPlan 9
“the most dangerous enemy of a better solution is an existing codebase that is just good enough”
-- Eric Raymond, “The art of UNIX Programming”
参照:西村賢「Linuxに勝てなかったPlan 9」@IT (2009)
UNIXに与えた影響• procファイルシステム
• ダンプファイルシステム• ユーザレベルファイルシステム• rfork、cloneシステムコール
• プロセス毎の名前空間• ユニオンディレクトリ• UTF-8 などなど
分散OS Plan 9の全体像!"#"!
$%& '()*+,*-.&*%/ 0(,1-/$/.(%- (, 23-4 5$66*& /*,).%$6- .% 26$% 7 /*,).%(6(89: ;.8<,*="-'(0-"/'*"$,,$%8*)*%/:
32> 32>;.6* ;.6*
?%/*,%*/
@$/*0$9
@$/*0$9
A*,)
A*,) A*,) A*,)
B/'*,%*/
;.C*,"D*/0(,1
E$/$1./
A*,)A*,)A*,)
!"#$%& '( )*%$+*$%& ,- . /.%#& 0/.1 2 "13*.//.*",1( 32> -*,F*,- $%& G.6* -*,F*,- -'$,* G$-/ 6(5$6+$,*$
%*/0(,1-4 0'.6* /*,).%$6- <-* -6(0*, 0.&*,+$,*$ %*/0(,1- -<5' $- B/'*,%*/4 E$/$1./4 (, /*6*H'(%*
6.%*- /( 5(%%*5/ /( /'*): @$/*0$9 )$5'.%*-4 0'.5' $,* I<-/ 32> -*,F*,- 5(%%*5/*& /( )<6/.H6* %*/!
0(,1-4 $66(0 )$5'.%*- (% (%* %*/0(,1 /( -** $%(/'*,:
A'* )(&*,% -/96* (G 5()H</.%8 (GG*,- *$5' <-*, $ &*&.5$/*& 0(,1-/$/.(% (, 23:26$% 7!- $HH,($5' .- &.GG*,*%/: A'* F$,.(<- )$5'.%*- 0./' -5,**%-4 1*9C($,&-4 $%& ).5*$66 H,(F.&* $55*-- /( /'* ,*-(<,5*- (G /'* %*/0(,14 -( /'*9 $,* G<%5/.(%$669 *J<.F$6*%/4 .%/'* )$%%*, (G /'* /*,).%$6- $//$5'*& /( (6& /.)*-'$,.%8 -9-/*)-: K'*% -()*(%* <-*-/'* -9-/*)4 /'(<8'4 /'* /*,).%$6 .- /*)H(,$,.69 H*,-(%$6.L*& C9 /'$/ <-*,: ?%-/*$& (G5<-/().L.%8 /'* '$,&0$,*4 26$% 7 (GG*,- /'* $C.6./9 /( 5<-/().L* (%*!- F.*0 (G /'* -9-!/*) H,(F.&*& C9 /'* -(G/0$,*: A'$/ 5<-/().L$/.(% .- $55()H6.-'*& C9 8.F.%8 6(5$64 H*,!-(%$6 %$)*- G(, /'* H<C6.569 F.-.C6* ,*-(<,5*- .% /'* %*/0(,1: 26$% 7 H,(F.&*- /'* )*5'!$%.-) /( $--*)C6* $ H*,-(%$6 F.*0 (G /'* H<C6.5 -H$5* 0./' 6(5$6 %$)*- G(, 86(C$669$55*--.C6* ,*-(<,5*-: M.%5* /'* )(-/ .)H(,/$%/ ,*-(<,5*- (G /'* %*/0(,1 $,* G.6*-4 /'*)(&*6"(G"/'$/"F.*0".-"G.6*+(,.*%/*&:
A'* 56.*%/!- 6(5$6 %$)* -H$5* H,(F.&*- $ 0$9 /( 5<-/().L* /'* <-*,!- F.*0 (G /'*%*/0(,1: A'* -*,F.5*- $F$.6$C6* .% /'* %*/0(,1 $66 *NH(,/ G.6* '.*,$,5'.*-: A'(-* .)H(,!/$%/ /( /'* <-*, $,* 8$/'*,*& /(8*/'*, .%/( $ 5<-/() %$)* -H$5*O /'(-* (G %( .))*&.$/*.%/*,*-/ $,* .8%(,*&: A'.- .- $ &.GG*,*%/ -/96* (G <-* G,() /'* .&*$ (G $ "<%.G(,) 86(C$6%$)* -H$5*!: ?% 26$% 74 /'*,* $,* 1%(0% %$)*- G(, -*,F.5*- $%& <%.G(,) %$)*- G(, G.6*-*NH(,/*& C9 /'(-* -*,F.5*-4 C</ /'* F.*0 .- *%/.,*69 6(5$6: P- $% $%$6(894 5(%-.&*, /'*&.GG*,*%5* C*/0**% /'* H',$-* ")9 '(<-*! $%& /'* H,*5.-* $&&,*-- (G /'* -H*$1*,!-'()*: A'* 6$//*, )$9 C* <-*& C9 $%9(%* C</ /'* G(,)*, .- *$-.*, /( -$9 $%& )$1*--*%-* 0'*% -H(1*%: ?/ $6-( 5'$%8*- )*$%.%8 &*H*%&.%8 (% 0'( -$9- ./4 9*/ /'$/ &(*-
出典:Rob Pike, “Plan 9 from Bell Labs” (1995)
共有メモリ型SMPマシン
WORM jukebox
WS or PC
資源へのアクセスは共通なプロトコル使用
「ファイル」メタファ• UNIXはたいていのものがファイル
O /dev/tty, /proc
X network interface, X window system
• Plan 9はすべてがファイル
O /dev/cons, /proc, network interface, rio window system, http, ftp, environment variable
X プロセス生成、ネットワークアドレス、共有メモリ
rioウィンドウシステム• /dev/^(cons mouse window)をプロセス毎に多重化するファイルサーバ
rioapp.
app.
app.User
Kernel #s #m
read /dev/mouseread /dev/mouse
/net
• ネットワークもファイルとして抽象化net
ether0 tcp udp cs dns
clone stats0 1
listenerrdatactl local remote status
デバイス プロトコルスタック サービス
/net/tcp• /net/tcp/N:コネクション毎ディレクトリ
• ctl:制御用ファイル
• data:データ通信用ファイル
• /net/tcp/clone:新規にディレクトリ作成% lc /net/tcp0 1 10 ... clone stats
% lc /net/tcp/0ctl data err listen localremote status
echoクライアント% cat /net/tcp/clone
5
% cat > /net/tcp/clone
connect 192.168.182.130!7
% cat /net/tcp/5/data &
% echo hoge > /net/tcp/5/data
echo
terminal 2:
terminal 1:
open(“/net/tcp/clone”)はopen
(“/net/tcp/*/ctl”)と等価
echoサーバ• listen(UNIXのinetd相当)経由で実行
• ポート監視して、ネットワークをstdioにつなぎ替える
% aux/listen1 -t tcp!*!7 /bin/service/tcp7 &
% cat /bin/service/tcp7
#!/bin/rc
/bin/cat
tcpdumpモドキ#!/bin/rcclonefile=/net/ether0/clone<[4] $clonefile { netdir=`{basename -d $clonefile} ^ / ^ `{cat /fd/4} echo connect -1 >$netdir/ctl || exit 'cannot connect' cat $netdir/data | xd -u -x2}
ネットワーキングAPI• ネットワーク操作もファイルへの
open-read-write-closeで可能
(Plan 9にioctlはない)
• BSDソケットのように、専用システムコールは不要
• 使いやすいライブラリ関数を提供
echoクライアントint fd, n;
char *name;
name = netmkaddr(“plan9.bell-labs.com”, “tcp”, “echo”);
fd = dial(name, 0, 0, 0);
:n = write(fd, buf, sizeof(buf));
read(1, buf, n);
“204.178.31.2!echo
echoサーバint acfd, lcfd, dfd, n;char adir[40], ldir[40]acfd = announce("tcp!*!7", adir);for (;;) { lcfd = listen(adir, ldir); switch (fork()) { case 0: dfd = accept(lcfd, ldir); while ((n = read(dfd, buf, sizeof(buf))) > 0) write(dfd, buf, n); exits(0); }}
/net/tcp/5
/net/tcp/6
注意:UNIXとは別物
BSDソケットとの比較Plan 9 BSD socket 説明dial
socketactive open用fdの取得
announcesocket
passive open用fdの取得dial connect active open
- bind アドレスの割当てannounce listen 接続待ち
listen/accept accept 接続の受付reject close 接続の切断
- shutdown接続の切断
使ってみようPlan 9
• まずはスタンドアローン版から
• ターミナル+fossil(ファイルサーバ)
• Go Plan 9 wiki!
http://plan9.bell-labs.com/wiki/plan9/
対応アーキテクチャ• i386、AMD64、ARM、PowerPC、...
• (仮想化技術いろいろ)KVM、QEMU、Virtual Box、VMWare、Xen、 lguest
• 最近一部で話題なのは、
UNIXで動くPlan 9環境• Plan9port
• Plan 9コマンドセットのUNIX移植
• 9vx
• 軽量なa.outバイナリエミュレーション
• Plan 9カーネルをユーザランドに移植
• Glandix
• Linuxカーネル拡張
プログラミング環境• kencc: ANSI Cじゃないコンパイラ
• acme: プログラマのためのエディタ(ただしマウスは必須)
• acid: マルチアーキ対応デバッグ環境
• APE: POSIX互換サブシステム
kencc:奇妙なコマンド名compiler assembler loader
SPARC kc ka klPower PC qc qa qlMIPS (BE) vc va vlMIPS (LE) 0c 0a 0l
Motorola 68000 1c 1a 1lMotorola 68020 2c 2a 2l
ARM (LE) 5c 5a 5lAMD64 Intel 960 6c 6a 6l
DEC Alpha 7c 7a 7lIntel 386 8c 8a 8l
AMD 29000 9c 9a 9l
man emacs(1)EMACS(1)
NAME emacs - editor macros
SYNOPSIS emacs [ options ]
DESCRIPTION This page intentionally left blank.
SOURCE MIT
SEE ALSO sam(1), vi(1)
BUGS Yes.
まずは、Hello, World!% cat hello.c#include <u.h>#include <libc.h>
void main(){ print(“Hello, World!\n”); exits(nil);}
% 8c hello.c% 8l -o hello hello.8% hello
見慣れないヘッダファイル% cat hello.c#include <u.h>#include <libc.h>
void main(){ print(“Hello, World!\n”); exits(nil);}
% 8c hello.c% 8l -o hello hello.8% hello
ANSI C/POSIXじゃない% cat hello.c#include <u.h>#include <libc.h>
void main(){ print(“Hello, World!\n”); exits(nil);}
% 8c hello.c% 8l -o hello hello.8% hello
ライブラリのリンク% cat hello.c#include <u.h>#include <libc.h>
void main(){ print(“Hello, World!\n”); exits(nil);}
% 8c hello.c% 8l -o hello hello.8% hello
include/libc.h:1: #pragma lib “libc.a”2: #pragma src “/sys/src/libc”
./helloじゃない% cat hello.c#include <u.h>#include <libc.h>
void main(){ print(“Hello, World!\n”); exits(nil);}
% 8c hello.c% 8l -o hello hello.8% hello
環境変数もファイル% ls /env'*' boottime 'fn#sigexit'pid terminal0 cflag font prompt timezoneNPROC cputype fs rcname userapid ether0 home rootdir wctlauth facedom ifs service wsysbootargs fileserver objtype statusbootfile 'fn#cpu%'path sysname
% cat /env/path./bin
ユニオンディレクトリ
% ns | grep /binbind /386/bin /binbind -a /rc/bin /binbind -a /usr/oraccha/bin/rc /binbind -a /usr/oraccha/bin/386 /bin
※Linuxにもaufs、unionfsなどファイルシステムレベルで同様の仕掛けを実現するものは存在する
• 複数のディレクトリを一つに統合例)すべての実行ファイルは/binに
デバッグ• 異常終了してもコアダンプしない!
• acid(1)デバッガ
• リモートデバッグも/procをimportするだけ
% foofoo 151: suicide: sys: trap: page fault pc=0x00001025% ps | grep fooglenda 151 0:00 0:00 8K Broken foo
% acid 151/proc/151/text: 386 plan 9 executable :acid: stk()
FAQ• ブートしたはいいがリブート方法がわからない
• ウィンドウがスクロールしない
• Ctrl-Cが効かない
• UNIXのあのコマンド・オプションはないの?
• ホストOSとファイル共有したい
• システムを最新に保つには?
• createシステムコール
• 動的リンクがないって本当?
• 日本語は読み書きできるの?