PXE+iSCSIブートするための試行錯誤に費やされたGW前半のメモ
連休中に書いたメモ・その2。編集せずにManchesterからお送りします。
PXEブートしたカーネルからNFS rootやiSCSIデバイスをroot mountすることでディスクレスブートマシンを実現できることは知られているし、枯れた技術でもある。重要なのは、特殊な機材がなくても、PXE compliantなネットワークインタフェースを持つマシンなら何であっても(それが実マシンであっても仮想マシンであっても)「擬似的に」iSCSIブートできるということである。
Stateless Linuxは、この技術をコアにディスクレスクライアントのディスクイメージやプロファイルを中央集中的に管理するマネージャ機能などを提供するもののようだ。が、どの記事を見ても全貌はさっぱり分からない。Component-wiseに「できたもの」からStateless Linuxという名前を付けていくだけなのかもしれない。正式にFedora CoreやRHELのリリースに包含されるようになればもう少し分かりやすくなるだろうが。
それはさておき、StatelessLinuxiSCSIRoot - Fedora Project Wikiには、iSCSIブート用のinitrd.imgを作る方法が書かれているのだが、私が試した限りではちっともうまくいかなかった。
おおまかに言って三つの問題があった。
一つは、StatelessLinuxiSCSIRootにあるとおりに、mkinitrd --net-dev eth0して作ったinitrd.imgに含まれるinitスクリプトに、
network --device eth0 --bootproto dhcp
と書かれていることだ。この部分はDHCPサーバからIPアドレスなど取得して、ifconfig upしてくれたり、route addしてくれたりするのだと思うのだが、Fedora Core 6ではこれがまったく動かない。dhcpdが動作しているマシン上でtcpdump port dhcpcしていると、PXEのブートシーケンス(dhcpによってIPアドレスなどを確定してカーネルやRAMディスクのイメージをダウンロードする必要がある)ではパケットダンプが観測されるが、initスクリプトの実行部分ではまったく観測できない。なんなんだこれは。
もう一つは、StatelessLinuxiSCSIRootの方法だと、initスクリプトに/sbin/iscsistartを実行する部分が生成されなければならないはずなのだが、実際にはうまく生成されない。いくつか思い付く理由も対策もあるのだが、mkinitrdを改造する必要があるのでとても面倒くさい。
もう一つの問題は、上ができたとしてもiscsistartへの引数がinitrd.img内にスタティックに書き込まれてしまうことである。これだとホストごとに同じ手続きでmkinitrdしなくてはならない。NFS rootの場合と同様に、カーネル引数に渡したオプションを解釈してiscsistartしてくれればよいのだが。
こうした状況にめげずに何とか便利なツールはないものかと探していたわけなのだが、あまりいいツールがない。
iSCSI-initは、カーネル引数を解釈してiSCSIデバイスをアタッチしてくれるカーネルモジュールだが、Open-iSCSI以前のLinux-iSCSIにしか対応していない。CentOS 4.xの場合には使える。
Diskless / remote boot with Open-iSCSI - WPKG - Windows software deployment toolは、initスクリプトそのものを自作のものに置き換えるものでOpen-iSCSIに対応している。その自作スクリプトが難ありで、カーネル引数でホストのIPアドレスなどを指定しなければならないという困った仕様。
正常動作し、カーネル引数を使ってiSCSIの設定を行うinitrdを生成するツールを作るだけでGWの前半を潰してしまった。不慣れなもので。暇があれば続編を書く。
Comments and Trackbacks