2015年2月16日月曜日

iPXE でBitVisor をネットワークブートしよう


iPXE でBitVisor をネットワークブートしよう





はじめに



BitVisor のブートは,ローカルディレクトリにイメージを置いて,Grub から起動する方法を取ることが多いかなと思うが,これは開発時には結構面倒.

なぜなら,トライアンドエラー中にBitVisor のイメージを差し替えるためだけに,BitVisor なしで一度ブートしないといけないから.

ネットワークブートなら,サーバーにおいてあるBitVisor のイメージを差し替えればいいので,楽.

というわけで,ネットワークブートの方が楽だよ,と先輩に教わった方法をここに書く.




恐らく,ブートするのがBitVisorだからと言って特別なことはあまりない.

Linux をiPXE でネットワークブートするのと設定はほぼ同じだと思う(Linux はやったことないけど.)






環境




  • iPXEサーバーマシン: Raspberry Pi


  • OS: Raspbian






必要なもの




  1. BitVisor を起動マシンするマシン(BIOS の設定でネットワークブートを有効にできるもの)


  2. Raspberry Pi


  3. GNU make が動くx86マシン(1. のマシンでもいい)


    • iPXE のイメージとBitVisorのイメージを作るのに必要








設定方法




TFTP のインストール & 設定



使うのはtftpd-hpa.




$ sudo apt-get install tftpd-hpa
$ sudo vi /etc/default/tftpd-hpa
$ sudo service tftpd-hpa start


設定ファイルの変更は以下の通り




4c4
< TFTP_DIRECTORY="/srv/tftp"
---
> TFTP_DIRECTORY="/var/lib/tftpboot/"
6c6
< TFTP_OPTIONS="--secure"
---
> TFTP_OPTIONS="--secure -4"


上記設定では, /var/lib/tftpboot にiPXE のイメージを置く設定.

/var/lib/tftpboot がない状態でtftpd-hpa を起動しようとすると,失敗するらしい.



オプションに -4 をつけた理由.

= オプション追加せずにtftpd-hpa を起動しようとしたら,Raspbian でIPv6 が無効になってて動かなかったから.

ちょっと jot: obs600 で 再度 debian squeeze - その 1






DHCP サーバーのインストールと設定




$ sudo apt-get install isc-dhcp-server
$ sudo vi /etc/dhcp/dhcpd.conf #設定ファイルの編集
$ sudo service isc-dhcp-server


設定ファイルの変更(というより追記)は以下の通り




107a108,118
>
> subnet 192.168.0.0 netmask 255.255.255.0 {
> deny unknown-clients; # 下記でMACアドレスが登録されてない起動マシンは無視.
> host deep-desktop {
> hardware ethernet 00:60:6E:EB:5A:D8; # 起動マシンのMACアドレス.
> fixed-address 192.168.0.20; # BitVisorを起動するマシンに割り振るIPアドレス
> option host-name "deep-desktop"; # host *** の部分と同じ.
> next-server 192.168.0.30; # tftp サーバのIPアドレス.
> filename "bitvisor-boot.kpxe"; # ipxe イメージのファイル名
> }
> }


これで,MACアドレス 00:60:6E:EB:5A:D8 から要求が来たら, TFTP で /var/lib/tftpboot/bitvisor-boot.kpxe を送る.

bitvisor-boot.kpxe というのは,iPXE のイメージファイル.

このファイルの作り方は後述.





iPXE をイメージを作成



iPXE はイメージファイルをtftp で起動マシンに投げて,起動マシンで実行される.

なので,起動マシンがx86 ならx86向けにビルドする.

というわけで,以下のイメージファイルの作成の操作はx86マシンでやる.



$ git clone git://git.ipxe.org/ipxe.git
$ cd ipxe/src
$ vi bitvisor-boot.ipxe
$ cat bitvisor-boot.ipxe
#!ipxe
dhcp
boot bitvisor.elf
$ make -j4 bin/undionly.kpxe EMBED=bitvisor-boot.ipxe
# scp bin/undionly.kpxe deep@raspberrypi:~

bitvisor-boot.ipxe はiPXE でのブート処理を記述するファイル.

上記の設定で,サーバーの /var/lib/tftpboot/bitvisor.elf をブートする.

今回は書かないが,この設定をいじると,ブートするイメージを選択するメニューを出せたりもする.



make の結果, bin/undionly.kpxe が作成される.

これが,iPXE のイメージファイル.

このファイルをRaspberry Pi 上に置く.



以下は,Raspberry Pi上で操作.

TFTP のディレクトリにiPXE のイメージを置く(ついでにファイル名も変える)



$ sudo cp undionly.kpxe /var/lib/tftpboot/bitvisor-boot.kpxe





BitVisor のビルド



これもx86マシンでやる.



$ wget http://sourceforge.net/projects/bitvisor/files/latest/download?source=files -o bitvisor-1.4.tar.gz
$ tar -zxvf bitvisor-1.4.tar.gz
$ cd bitvisor-1.4/
$ tar -zxvf bitvisor-1.4.tar.gz
$ cd bitvisor-1.4/
$ history | tail -n3
$ make config # 動かすだけならデフォルト設定で大丈夫だと思う(多分)
$ make -j4
$ scp bitvisor.elf deep@raspberrypi:~


Raspberry Pi でbitvior.elf をTFTP のディレクトリに配置.



$ cp bitvisor.elf /var/lib/tftpboot/bitvisor.elf





いざブート…の前にBIOS 設定




  • ブートする前にBitVisor を起動するマシンのBIOS の設定を変更


    • ネットワークブートを有効にする(大抵どこかにあると思うので探そう,これなかったら諦めて別のマシンを用意して)




  • ブートの優先順位でネットワークブートを再優先にする


    • 優先順位の選択にネットワークブートを出すには,ネットワークブートを有効化してから一時Save&Exit しないといけないので注意.










おわりに



今回はRaspberry Pi をサーバにしてみたが,VMでもいいからx86 マシンを用意できるからそっちの方が多分よい.

なぜなら,iPXE のイメージを差し替えるときにいちいち別のマシンでビルドしないといけないから…



雑な説明になってしまったので,質問や突っ込みがあれば,是非お願いします.

(TFTP とかiPXE の仕組みはたぶん3割くらいしかわかってないので,仕組みとかは質問されても答えられないと思うけど…)






--
My Emacs Files At GitHub