玄柴(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)の処理かな。