2014年5月4日作成

さくらVPSでPlan 9ネットワークを構成してみた

さくらVPSを使って、フルシステムのPlan 9を作ってみます。 最終的に、ファイルサーバ、認証サーバ、CPUサーバの3つ建てて、 インターネットからdrawtermでアクセスできるところまでの予定です。

方針

ざっくりと構成方針です。

ホストカーネルether0ether1fs
fspccpuf133.242.aaa.aaa192.168.1.3venti+fossil
authpcauth133.242.bbb.bbb192.168.1.7fossil
cpupccpu133.242.ccc.ccc192.168.1.23fossil

authとcpuは、最終的にfsをルートにマウントするので、 fossilのみで構成しています。

133.242.ではじまるアドレスは、 さくらVPSに割り当てられているアドレスを使います。 ネットワークの構成(ipgw, ipmaskなど)は VPSコントロールパネルのOSインストール時に見られます。 それ以外の方法で知る方法は知りませんので、 情報を控えておいたほうがいいでしょう。

準備

まずは3台のVPSが必要なので、NICを認識するところまで作業します。 VPSに単体Plan 9をインストールする部分は、さくらVPSにPlan 9をインストールを読んでください。

サーバ3台の構築が終わったら、VPSコントロールパネルから、 ローカルネットワークの追加が必要です。 これは本契約でなければ使えません。 本契約になってしばらくすればサーバ一覧に出てきます。 サーバを停止した状態で、各サーバのNIC1にローカルネットワークを接続します。 これでローカルネットワーク経由での通信が可能となります。

このネットワークは扱いがちょっと面倒です。 OS再インストールをすると、おそらくISOからブートするより前に、 ローカルネットワーク構成がリセットされてしまいますので 忘れずに再接続しなければなりません。

また、インターネット側はNIC0にだけ割り当て可能です。 Plan 9は/netに内部ネットワークをバインドしたほうが楽なのですが、 /lib/namespaceの中でether0(NIC0)を/netにバインドしているので これをether1へ切り替える必要があります。 切り替えたことにより、fsをルートにマウントするサーバは かならずNICを2枚以上使って、NIC0をインターネット側に、 NIC1をローカルネットワークしなければならなくなります。

ファイルサーバ

NICを認識したpcfカーネルが動作した直後だと仮定しています。

タイムゾーン構成

fs% con -l /srv/fscons
prompt: uname adm +glenda
prompt: ctl+\
>>> q
fs% cd /adm/timezone
fs% cp Japan local

ファイルサーバ用カーネルインストール

fs% cd /sys/src/9/pc
fs% mk 'CONF=pccpuf'
fs% 9fat:
fs% mv 9pccpuf /n/9fat
fs% mk 'CONF=pccpuf' nuke

終わったら、/n/9fat/plan9.iniを編集。 bootfileエントリは、ブート時にカーネルを選べるように、 変更ではなく追加したほうがいいでしょう。

bootfile=sdC0!9fat!9pccpuf
sysname=fs
auth=192.168.1.7
console=0 b115200 l8 pn s1

ネットワーク構成

ローカルネットワーク(NIC1)を/netに割り当てるように変更します。

fs% grep /net /lib/namespace
bind -a #l1 /net  (オリジナルは#lだった)
bind -a #I /net

NIC0は/net.altへ割り当てますが、サーバによっては どちらも/netに割り当てたい場合があるので、 サーバ固有構成のほうで設定します。

fs% cat /cfg/fs/namespace
bind -a #l0 /net.alt
bind -a #I1 /net.alt

cpurcで各NICへIPアドレスを設定。 途中の$ipgwは、インストール時に示されたゲートウェイアドレス。

% cat /cfg/fs/cpurc
ip/ipconfig ether /net/ether1 add 192.168.1.3 255.255.255.0
ip/ipconfig -x.alt -g $ipgw ether /net.alt/ether0 add 133.242.aaa.aaa 255.255.254.0
ndb/dns -r
ndb/cs -x.alt -f /lib/ndb/external
ndb/dns -rx.alt -f /lib/ndb/external
aux/timesync -n /net.alt/udp!ntp1.sakura.ad.jp
aux/listen -q -d /cfg/$sysname/service tcp
sleep 3

/cfg/fs/serviceは、/rc/bin/serviceをコピーして 必要なサービスだけ残しています。9pサービスだけあればいいのですが、 何もListenしていないと/rc/bin/cpurcでいろいろサービスが起動してしまうので、 今回は割と無難なtcp9(discard)だけ立てていますが、 ほかに、/rc/bin/cpurcを変更してしまってもいいと思います。

/lib/ndb/local, /lib/ndb/externalは適切な値で構成しておきます。 localのほうはipnetを使ってグループにまとめられますが、 グローバルIPアドレスはばらばらなので、個別に設定しましょう。 だいたいこんな感じ。

sys=fs dom=fs.domain.dom
	ether=xxxxxxxx
	ip=133.242.aaa.aaa
	ipgw=xxx.xxx.xxx.xxx
	ipmask=255.255.254.0
	dns=133.242.0.3
	dns=133.242.0.4

サーバ構成

bootesユーザを追加します。

fs% con -l /srv/fscons
prompt: uname bootes bootes
prompt: ctl+\
>>> q

ファイルサーバを他のサーバからマウントできるように、 tcp564をListenするようにfossilを変更。 /rc/bin/service/!tcp564もあるけれど、こっちは使わない。

fs% fossil/conf /dev/sdC0/fossil >/tmp/flproto
fs% echo 'listen tcp!*!564' >>/tmp/flproto
fs% fossil/conf -w /dev/sdC0/fossil /flproto
fs% rm /tmp/flproto

必要なユーザやファイルをあらかじめ作っておいて再起動。

prompt: uname adm +bootes
prompt: uname adm -glenda
prompt: uname sys -glenda
prompt: uname adm -sys (これは好み)
prompt: fsys main
prompt: create /active/sys/log/cron sys sys a666
prompt: create /active/adm/secstore adm adm d775
fs% fshalt
(停止したらコントロールパネルから再起動)

理由は分かりませんが、Plan 9でctl+t, ctl+t, rとリブートすると VPSの状態が「不明」になって、強制停止も起動もできなくなります。 こうなると、不明から脱するには再インストールを行って むりやり「起動」状態に戻す必要があります。 (「起動」になればいいので、再インストールを最後まで行う必要はありません)

再起動後

9pccpufカーネルで起動したら、 最初にbootesの情報をきかれるので入力します。 残りのサーバにも同じものを設定する必要があります。

終わったら、/sys/logにエラーが出ていないか、 必要なサービスだけになっているかを確認して終わり。

fs# netstat | grep Listen
fs# netstat /net.alt | grep Listen