今日から始めるplan 9 from bell labs
DESCRIPTION
第一回カーネル・VM探検隊。2009-08-10TRANSCRIPT
![Page 1: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/1.jpg)
今日からはじめるPlan 9 from Bell Labs
oracchaPlan9日記(http://d.hatena.ne.jp/oraccha/)
2009年8月10日 第一回カーネル/VM探検隊
![Page 2: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/2.jpg)
Plan 9とは?
![Page 3: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/3.jpg)
本日の発表
• Plan 9とはどんなOSか?
• 9vxでPlan 9を始めよう
• Plan 9のプログラミング環境
![Page 4: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/4.jpg)
Plan 9とは?UNIXを開発したベル研の連中が開発した分散OS
1995
Dennis Ritchie
Dave Presotto
Rob Pike
Phil Winterbottom
![Page 5: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/5.jpg)
Plan 9とは?UNIXを開発したベル研の連中が開発した分散OS
2004
Jim McKie
1995
Dennis Ritchie
Dave Presotto
Rob Pike
Phil Winterbottom
![Page 6: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/6.jpg)
Plan 9は死なず!現在、ベル研が開発の中心でなくなったが、オープンソースソフトウェアとして開発継続
• 最新スパコン(BlueGene/P)に対応
• Google Summer of Code参加
• 年に一度International Workshop開催
![Page 7: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/7.jpg)
なぜ、Plan 9なのか?
“Not only is UNIX dead, it’s starting to smell really bad.” -- Rob Pike, 1991
![Page 8: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/8.jpg)
過去のしがらみ例えば、xterm...
Window Shell
User
ASR-33
![Page 9: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/9.jpg)
Plan 9が提案したアイデア
• すべてがファイル• 9Pプロトコル
• プロセスごとの名前空間
![Page 10: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/10.jpg)
「すべてがファイル」• すべて資源は名前(パス名)を持つ
• バイトストリームのopen-read-write-close
![Page 11: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/11.jpg)
初期のUNIXカーネル
Process
UFS
Char device
Block device
UFSInterface
Char Interface
Block Interface
Kernel
![Page 12: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/12.jpg)
そして、時は流れ...
ハードウェアが進歩して、UNIXは拡張されたが、そこに「UNIX哲学」はなかった
• ネットワーキング
• ソケット(UCB)
• GUI
• Xウィンドウシステム(MIT)
![Page 13: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/13.jpg)
肥大化するカーネル構造
Process
VFS
Char device
Block device
VFSInterface
Char Interface
Block Interface
Socket Other file system
sysfs
Sysctl
Lotsa stuff! UFS
![Page 14: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/14.jpg)
よりよいモデル
ProcessServer
Device
ServerInterface
Kernel
![Page 15: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/15.jpg)
Plan 9カーネル
Process
Server (process)for email file system
Server (process)for local file system
ServerInterface
Kernel
Device
9p2000 protocol
![Page 16: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/16.jpg)
9Pプロトコルクラス オペコード 説明
セッション
version パラメータネゴシエーション
セッションauth 認証
セッション attach コネクションの確立セッションflush リクエストのアボート
セッション
error エラーの応答
ファイル
walk パス名の検索
ファイル
open ファイルのオープン
ファイルcreate ファイルの作成
ファイル read ファイルからデータ転送ファイルwrite ファイルへデータ転送
ファイル
clunk ファイルの解放
ファイル
remove ファイルの削除
メタデータstat ファイル属性の取得
メタデータwstat ファイル属性の更新
![Page 17: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/17.jpg)
重要なアイデア
Plan 9カーネル=「サービスの多重化装置」
• すべての資源に対する単一のI/F
• すべてのサーバに対する共通プロトコル
UNIXカーネル=「I/Oの多重化装置」
![Page 18: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/18.jpg)
名前空間
Plan 9 UNIX
プロセス毎の名前空間システムグローバルなファイル空間
ユーザ権限 root権限
サービスを多重化 ディスクを多重化
![Page 19: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/19.jpg)
UNIXに与えた影響• 9Pファイルシステムプロトコル
• procファイルシステム
• ダンプファイルシステム
• rfork、cloneシステムコール
• ユニオンディレクトリ
• UTF-8 などなど
![Page 20: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/20.jpg)
対応アーキテクチャ
• i386、AMD64、ARM、PowerPC、SPARC
• (仮想化技術)KVM、QEMU、Virtual
Box、VMWare、Xen、KVM、 lguest
• MIPSにも対応していたが、過去の話
![Page 21: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/21.jpg)
UNIXで動くPlan 9環境• Plan9port
• Plan 9コマンドの移植
• v9fsと連携
• 9vx
• Plan 9カーネルをユーザランドで実行
• 軽量なバイナリエミュレーション
• Drawterm
• ターミナルアプリケーション
![Page 22: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/22.jpg)
9vx
Plan 9a.out
Plan 9a.out
Plan 9a.out
vx32 sandbox library
Modified Plan 9 kernel
Host OS(Linux, FreeBSD, MacOS X)
1プロセス
![Page 23: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/23.jpg)
9vx TIPS
• x86_64で実行する場合は、Mercurialリポジトリからビルド
- http://code.google.com/p/vx32/
• Plan 9本体のライブラリやソースコードが含まれないので、リポジトリから取得% 9fs sources% cd /n/sources% @{cd plan9/386/lib && tar c .} | \ @{cd /386/lib && tar x}
![Page 24: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/24.jpg)
プログラミング環境• acme: プログラマのためのエディタ(ただしマウスは必須)
• kencc: ANSI Cじゃないコンパイラ
• acid: マルチアーキ対応デバッグ環境
• APE: POSIX互換サブシステム
![Page 25: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/25.jpg)
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.
![Page 26: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/26.jpg)
kencc: 指示付き初期化子rio/rio.c
58: enum 59: { 60: Cut, 61: Paste, 62: Snarf, 63: Plumb, 64: Send, 65: Scroll, 66: }; 67: 68: char *menu2str[] = { 69: [Cut] "cut", 70: [Paste] "paste", 71: [Snarf] "snarf", 72: [Plumb] "plumb", 73: [Send] "send", 74: [Scroll] "scroll", 75: nil 76: };
C99と文法が異なる[Cut] = “cut”,
![Page 27: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/27.jpg)
kencc: 匿名構造体、複合リテラル
• rio/dat.h 107 struct Mousestate 108 { 109 Mouse; 110 ulong counter; 111 };
rio/wind.c 305: m = (Mousestate){w->mc.Mouse, w->mouse.counter};
• Linuxカーネルでは使われていない?
![Page 28: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/28.jpg)
まずは、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
![Page 29: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/29.jpg)
見慣れないヘッダファイル% 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
![Page 30: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/30.jpg)
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
![Page 31: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/31.jpg)
ライブラリのリンク% 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”
![Page 32: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/32.jpg)
./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
![Page 33: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/33.jpg)
環境変数もファイル% 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
![Page 34: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/34.jpg)
ユニオンディレクトリ
% 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に
![Page 35: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/35.jpg)
デバッグ• 異常終了してもコアダンプしない!
• 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()
![Page 36: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/36.jpg)
Plan 9のコードを読む• Webから:http://plan9.bell-labs.com/
sources/plan9/sys/src/
• (非公式)gitリポジトリ:git://github.com/
ericvh/plan-9.git
sys -- src |-- 9 # kernel | |-- pc | `-- port |-- cmd # uesr command `-- libc # libc library
![Page 37: 今日から始めるPlan 9 from Bell Labs](https://reader033.vdocuments.us/reader033/viewer/2022061605/558c3dfdd8b42ac5338b457f/html5/thumbnails/37.jpg)
続きは飲み会で
Plan9日記(http://d.hatena.ne.jp/oraccha/)