玄柴(SheevaPlug)でPlan 9
玄柴を買ったはいいけど、放置状態だったので、ちょっと時間を作ってPlan 9が動くところまで確認した。ここに動かし方をまとめておく。
戦略としてはカーネルをtftpによってロードし、リモート(VMWare Fusion上)のPlan 9をファイルサーバ(+ tftpd)として動かすことにする。ブート時にはシリアルコンソール経由でU-bootの操作が必要だが、先ほどのエントリに書いたとおりで、screenを使っている。
何はなくともPlan 9のスタンドアローン環境が必要なので、ISOイメージをダウンロードしてインストールしておく。そして、「ARMクロスコンパイル環境」に従って、ツールチェインとARM用の実行バイナリ、カーネルをビルドする。SheevaPlug用のカーネルが入ったのは割と最近のことなので、/sys/src/9/kwがない場合(ずいぶん前にインストールしてそのままだったら)はpullスクリプトを実行してシステムを最新状態にしておくこと。
カーネルができたら、9plugを/lib/tftpdディレクトリ以下にコピーする。tftpdの起動は、
% ip/tftpd
でOK。
続いて認証用にfactotumにユーザ名とパスワードの組を登録し、ファイルサーバになるためにexportfsを起動しておく。
% echo 'key proto=p9sk1 dom=macair user=oraccha !password=password' >/mnt/factotum/ctl % aux/listen1 -t tcp!*!564 /bin/exportfs -s &
では、玄柴に電源を入れ、シリアルコンソールをつなげよう。デフォルトではLinuxが起動するが、U-bootの起動シーケンス中に何かキー入力すると、プロンプトが表示されて入力待ちになる。
__ __ _ _ | \/ | __ _ _ ____ _____| | | | |\/| |/ _` | '__\ \ / / _ \ | | | | | | (_| | | \ V / __/ | | |_| |_|\__,_|_| \_/ \___|_|_| _ _ ____ _ | | | | | __ ) ___ ___ | |_ | | | |___| _ \ / _ \ / _ \| __| | |_| |___| |_) | (_) | (_) | |_ \___/ |____/ \___/ \___/ \__| ** MARVELL BOARD: SHEEVA PLUG LE U-Boot 1.1.4 (Sep 7 2009 - 20:21:09) Marvell version: 3.4.16 U-Boot code: 00600000 -> 0067FFF0 BSS: -> 006CEE60 Soc: 88F6281 A0 (DDR2) CPU running @ 1200Mhz L2 running @ 400Mhz SysClock = 400Mhz , TClock = 200Mhz DRAM CAS Latency = 5 tRP = 5 tRAS = 18 tRCD=6 DRAM CS[0] base 0x00000000 size 256MB DRAM CS[1] base 0x10000000 size 256MB DRAM Total size 512MB 16bit width Flash: 0 kB Addresses 8M - 0M are saved for the U-Boot usage. Mem malloc Initialization (8M - 7M): Done NAND:512 MB CPU : Marvell Feroceon (Rev 1) Streaming disabled Write allocate disabled USB 0: host mode PEX 0: interface detected no Link. Net: egiga0 [PRIME], egiga1 Hit any key to stop autoboot: 0 Marvell>>
DHCPでIPアドレスを取得することもできるが、ここでは静的にアドレスを設定することにする。まずはprintenvで設定をメモしておいて、ipaddr、netmask、serverip、さらに必要であればgatewayipをsetenvで設定する。順に玄柴自身のアドレス、ネットマスク、tftpdが動いているサーバのアドレス、デフォルトゲートウェイのアドレスとなる。疎通確認にはpingが使える。以下、説明のため、VMWare Fusion上のPlan 9は192.168.0.1、玄柴は192.168.0.2とする。
Marvell>> setenv ipaddr 192.168.0.2 Marvell>> setenv netmask 255.255.255.0 Marvell>> setenv serverip 192.168.0.1 Marvell>> ping 192.168.0.1 Using egiga0 device host 192.168.0.1 is alive Marvell>> saveenv Saving Environment to NAND... Erasing Nand...Writing to Nand... done
さていよいよtftpdからカーネルをロードして起動する。
Marvell>> tftp 0x800000 9plug Using egiga0 device TFTP from server 192.168.0.1; our IP address is 192.168.0.2 Filename '9plug'. Load address: 0x800000 Loading: ################################################################# ################################################################# ########################################################## done Bytes transferred = 959744 (ea500 hex) Marvell>> go 0x800000 ## Starting application at 0x00800000 ... Plan 9 address map: enabled window 5 for spi: targ 1 attr 0x1e size 134,217,728 addr 0xe8000000 cpu0: 1200MHz ARM Marvell 88F6281 (arm926ej-s) #l0: kirkwood: 1000Mbps port 0xf1072000 irq 11: 005043014445 l2 cache enabled as write-through spi flash at 0xe8000000: memory reads enabled 504M memory: 52M kernel data, 452M user, 1961M swap
なにやら動き始めて、ファイルシステムと認証サーバのアドレスを入力するように促される。これらは192.168.0.1でOKである。そして、続いてユーザ名、ドメイン、パスワードを聞かれるので、factotumに登録した内容を応えればよい。あとsecstoreは使わないので空でOKだ*1。
filesystem IP address[no default]: 192.168.0.1 authentication server IP address[no default]: 192.168.0.1 bad nvram key bad authentication id bad authentication domain authid: oraccha authdom: macair secstore key: password: can't write key to nvram: jmk added reentrancy for threads version...time... init: starting /bin/rc 192.168.0.2#
ちゃんと起動してrcのプロンプトが現れた。あとは煮るなり焼くなりお好きなように。
Hello, worldもちゃんと動くよ。デフォルトの実行ファイル名は8.outじゃなくて5.out。
192.168.0.2# cat > hello.c #include <u.h> #include <libc.h> void main() { print("Hello, world!\n"); exits(nil); } 192.168.0.2# 5c hello.c 192.168.0.2# 5l hello.5 192.168.0.2# file 5.out 5.out: arm plan 9 executable 192.168.0.2# 5.out Hello, world!
玄柴をCPUサーバとして動かしたいのだけど、うまくいかないな。。。
Twalk /bin/timeでそんなファイルはないって言われてる?
notefs: ->Tversion tag 65535 msize 8216 version '9P2000' notefs: <-Rversion tag 65535 msize 8216 version '9P2000' notefs: ->Tattach tag 10 fid 318 afid -1 uname oraccha aname notefs: <-Rattach tag 10 qid (0000000000000000 0 d) cpu: waiting for FS: : notefs: ->Twalk tag 1 fid 318 newfid 293 nwname 1 0:bintime notefs: <-Rerror tag 1 ename file does not exist notefs: ->Tclunk tag 1 fid 318 notefs: <-Rclunk tag 1 read9pmsg(4) returns 0: notefs exiting: postnote PNGROUP 782: '/proc/782' file does not exist
*1:この辺はlibboot(/sys/src/9/boot)の処理かな。