Plan 9

64bit環境(9kカーネル)を構築する

2016年5月6日作成

Plan 9からforkしたプロジェクトがいくつかありますが、 ここではベル研のPlan 9と9legacyを使います。

ソースコードの更新

最初に、replica/pullを使って、本家最新のソースに更新しておいてください。

2015年1月以降、本家が更新されていないので、9legacyのパッチ集から取得します。 現時点で、64bit環境の動作が確認できたパッチ一覧です。 上から順番に適用すれば依存関係も解決します。 このリポジトリには、9legacyのパッチ管理を少し便利にする、 簡単なrcスクリプトも含んでいますので、よければどうぞ。

9legacy-toolを使う場合、

% 9legacy/installall misc/patchlist
% 9legacy/apply

とすれば/sys以下のファイルに9legacyパッチ後のファイルをbindします。

また、以下の手順では/amd64以下にファイルを作成しますので、 作業するユーザはsysグループに属する必要があります。 fossilの場合は、

% con -l /srv/fscons
prompt: uname sys +bootes

6cコンパイラの更新

Runeが、2013年頃に16bitから22bitへアップデートされていますが、 配布物に含まれる6cコンパイラのバージョンは古いままです。 古いままだとコンパイル時に

runebase.c:xx illegal rune string

とか言われるので先にコンパイラの更新が必要です。 この時は、objtypeは現在使っている値(例えば386)のままで構いません。

% cd /sys/src/cmd/6c
% mk install

# 後処理
% mk nuke
% cd ../cc
% mk nuke

9legacyのパッチでアセンブラがサポートする命令も増えているので、 アセンブラとリンカも更新します。

# アセンブラ
% cd /sys/src/cmd/6a
% mk install
% mk nuke

# リンカ
% cd /sys/src/cmd/6l
% mk install
% mk nuke

各種ライブラリの作成

amd64環境のコマンド等からリンクされるライブラリを作成します。 ライブラリは、mk nukeすると 作成された/$objtype/lib/*.aファイルも消えてしまうため、 コンパイル時の中間ファイルを掃除するのはmk cleanを使いましょう。

objtype環境変数を切り替えると、コンパイラが生成するオブジェクトの ターゲットとなるアーキテクチャを切り替えられます。

% cd /sys/src
% objtype=amd64
% mk libs  # installとcleanを実行します

APE環境の作成

gs等、いくつかのコマンドをコンパイルする時に ape/pcc等を使うので用意しておきましょう。

# apeライブラリ
% mkdir /amd64/lib/ape
% cd /sys/src/ape
% mk lib.install
% mk lib.clean

# apeコマンド等
% mkdir /amd64/lib/ape
% mk cmd.install
% mk cmd.nuke
% mk 9src.install
% mk 9src.nuke

acme用コマンド

ほとんどのコマンドは/sys/src以下にソースがありますけど、 acme用のコマンドは/acme/*/srcに配置されています。

% mkdir /acme/bin/amd64
% cd /acme
% mk install
% mk nuke

コマンド類

ライブラリの準備ができたので、コマンドをビルドします。 カーネルの内部に一部のコマンドを埋め込むため、 先にコマンドのインストールが必要です。

% mkdir -p /amd64/bin/ ^ (aux auth dial disk fossil fs ip/httpd ndb replica upas usb venti)
% cd /sys/src/cmd

# upasグループに作業ユーザを追加するか、
# 以下2ファイルに/tmpをbindする等で書き込み可能にしておく
# /mail/lib/gone.msg
# /mail/lib/gone.fishing

% mk install
% mk nuke

9legacy-toolを使った場合、initだけはbind先に作成されてしまうので、 mk後に手動で移動させておきましょう。

% unmount /amd64
% cp $home/9legacy/plan9/amd64/init /amd64/init

ゲーム(不要なら飛ばす)

% mkdir /amd64/bin/games
% cd /sys/src/games
% mk install
% mk nuke

カーネル

ブートローダの更新が必要なら/sys/src/9k/bootにソースがありますけれど、 /sys/src/9以下の内容と同じなので何もしなくても構いません。

CPUサーバカーネルの場合はk10cpuコンフィグを使います。 ただ、k10cpuはsdドライバが含まれていないので、/dev/sdXX/nvramを読めません。 通常それは困るため、sdドライバを入れましょう。

dev +dev
	root
	...
	sd		# 追加

sd +dev	# 追加
	sdata	pci sdscsi
	sdiahci	pci sdscsi
...
rootdir
	bootk10f.out boot
	/amd64/bin/auth/factotum factotum
	/amd64/bin/ip/ipconfig ipconfig
#	../root/nvram nvram	# 削除

最後にコンパイルして終わり。

% cd /sys/src/9k/k10
% chmod +x ../mk/mkrootall
% mk 'CONF=k10cpu'
% 9fat:
% cp 9k10cpu /n/9fat
% mk 'CONF=k10cpu' nuke