VIVER CORE Server 0.0.5

VIVER CORE Serverのバージョン0.0.5をリリースします。
ルートファイルシステムNFS+unionfsを使えるようになりました。実験的にaufsと9p2000.u(Plan9 Resource Sharing Protocol)もサポートしています。
また、TFTPサーバーで、クライアント要求されたファイル名を変換する機能に対応しました。クライアントのIPアドレスやMACアドレスによって、ルートファイルシステムやpostbootパッチを変更することができます。



VIVER CORE Server 0.0.5
viver-core-server.0.0.5.i386.tar.gz
viver-core-server.0.0.5.src.tar.gz
viver-core-root.0.0.5.i386.tar.gz


  • 新しいプロトコルを追加
    • nfs+cp (STABLE)
    • nfs+unionfs
    • nfs+aufs (未テスト)
    • 9p (未テスト)
    • 9p+cp (未テスト)
    • 9p+unionfs (未テスト)
    • 9p+aufs (未テスト)
  • TFTPのファイル名変換に対応

NFS+unionfs, NFS+aufs

NFSを読み込み専用としてマウントし、その上にtmpfsをかぶせてルートファイルシステムとして使います。いわゆるCopy-on-Writeで、書き込みはtmpfsに行われます。

rooturl=nfs+unionfs://192.168.0.1/path/to/root
rooturl=nfs+aufs://192.168.0.1/path/to/root

nfs+unionfsには、unionfsのパッチが当たったカーネルが必要です。
nfs+aufsには、aufsのlhashパッチが当たったカーネルと、aufsのカーネルモジュールが必要です。


ブート後にネットワークがダウンするとクライアントがハングアップしてしまうので、注意が必要です。起動するディストリビューション側でも、起動時にネットワークが再起動されないようにしておく必要があります。


…ちなみに、nfs+aufsはまだ1回もテストが成功していないので、動くかどうか分かりません ^_^;)
(特に/sbin/mount.aufsがシェルスクリプトで書いてあり、これがbusyboxのashで動くかどうか不明)
※2007/10/16追記:nfs+aufsもうまく動きました。


NFS+cp

NFSを読み込み専用でマウントし、中身をすべてtmpfsにコピーし、NFSをアンマウントします。

rooturl=nfs+cp://192.168.0.3/path/to/root

9p, 9p+unionfs, 9p+aufs, 9p+cp

rooturl=9p://host:port/pathは、v9fsを書き込み可能でマウントして、ルートファイルシステムとして使います。
unionfs、aufs、cpは、それぞれNFSと同じです。


Linuxで動く9p2000.uサーバーの実装にはどうやら3種類あるのですが(おそらくどれもv9fsプロジェクトのもの)、どうもうまく動きません。ファイルに書き込んだだけで固まってしまっり、mknodすると固まってしまったり。カーネル(サーバー)側の問題なのかサーバー側の問題なのかは良く分かりませんが。うーむ。

  • npfsライブラリに含まれているufs
  • u9fs
  • spfsライブラリに含まれているufs(たぶん最新)

※追加:
JStyxJava
rstyxRuby
libixp(Cでライブラリのみ)



9pは直接ルートファイルシステムとして使えるのに、NFSは使えないのは、NFSを(安全に)書き込み可能でマウントするにはlockdが必要だからです。lockdをinitramfsに入れれば良いのですが、それは難しい仕事になりそうです。
※どうやらlockdではなくて、portmapかもしれません。調査中…


TFTPのファイル名変換

VIVER CORE Serverでは、PXEのNBP(Network Bootstrap Program、ブートローダ的なもの)としてpxelinuxを使っています。pxelinuxは、TFTPサーバーから設定ファイル取得するのですが、このときにIPアドレスとMACアドレスを使って別の設定ファイルを使ってくれます。

pxelinuxのREADMEより↓

  As an example, if the boot file name is /mybootdir/pxelinux.0, the
  UUID is b8945908-d6a6-41a9-611d-74a6ab80b83d, the Ethernet MAC
  address is 88:99:AA:BB:CC:DD and the IP address 192.0.2.91, it will
  try:

	/mybootdir/pxelinux.cfg/b8945908-d6a6-41a9-611d-74a6ab80b83d
	/mybootdir/pxelinux.cfg/01-88-99-aa-bb-cc-dd
	/mybootdir/pxelinux.cfg/C000025B
	/mybootdir/pxelinux.cfg/C000025
	/mybootdir/pxelinux.cfg/C00002
	/mybootdir/pxelinux.cfg/C0000
	/mybootdir/pxelinux.cfg/C000
	/mybootdir/pxelinux.cfg/C00
	/mybootdir/pxelinux.cfg/C0
	/mybootdir/pxelinux.cfg/C
	/mybootdir/pxelinux.cfg/default

  ... in that order.


これでクライアントごとに別の設定ファイルを渡すことができる(→カーネルやブートパラメータを変えられる)のですが、IPアドレスが16進数だったりと、少々分かりにくいです。

そこで、VIVER CORE ServerはTFTPサーバーの実装にtftp-hpaを使っているのですが、tftp-hpaは、クライアントから要求されたファイル名を正規表現を使って変換することができます。


VIVER CORE Serverではデフォルトで↓このような正規表現が設定しています。(tftpboot/remapファイル)

# <operation>   <pattern>       <replace>

# IP address Hex => Num
r       pxelinux.cfg/[0-9A-F]{8}$                       ipaddr4/\i
r       pxelinux.cfg/[0-9A-F]{6}$                       ipaddr3/\i
r       pxelinux.cfg/[0-9A-F]{4}$                       ipaddr2/\i
r       pxelinux.cfg/[0-9A-F]{2}$                       ipaddr1/\i
r       ipaddr4/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)        pxelinux.cfg/\1
r       ipaddr3/([0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+        pxelinux.cfg/\1
r       ipaddr2/([0-9]+\.[0-9]+)\.[0-9]+\.[0-9]+        pxelinux.cfg/\1
r       ipaddr1/([0-9]+)\.[0-9]+\.[0-9]+\.[0-9]+        pxelinux.cfg/\1

# ARP Type 1 => 0
r       pxelinux.cfg/01-([0-9a-f]-[0-9a-f]-[0-9a-f]-[0-9a-f]-[0-9a-f]-[0-9a-f])         pxelinux.cfg/00-\1


これによって、先ほどのpxelinuxのアクセスは、

	/mybootdir/pxelinux.cfg/b8945908-d6a6-41a9-611d-74a6ab80b83d
	/mybootdir/pxelinux.cfg/00-88-99-aa-bb-cc-dd
	/mybootdir/pxelinux.cfg/192.0.2.91
	/mybootdir/pxelinux.cfg/C000025
	/mybootdir/pxelinux.cfg/192.0.2
	/mybootdir/pxelinux.cfg/C0000
	/mybootdir/pxelinux.cfg/192.0
	/mybootdir/pxelinux.cfg/C00
	/mybootdir/pxelinux.cfg/192
	/mybootdir/pxelinux.cfg/C
	/mybootdir/pxelinux.cfg/default

に変換されます。


ただIPアドレスを使う場合は、DHCPサーバーでMACアドレスを元に配布するIPアドレス固定しておかないと、あまり意味がありません。