海馬のかわり

最近記憶力に難がある、地方在住サーバエンジニアの備忘録です。

VMware Workstation上のESXiをお手軽iSCSI Boot

Workstation8上の仮想環境(vSphere5)にて、iSCSIブート検証を行いたかったので、ESXi上の仮想NICをiPXEで「疑似iBFT対応HBA」に仕立ててみる。

iPXEはその名の通りPXEの拡張実装なので、本来はtftpサーバの準備などネットワークブート環境一式が必要なのだけれど、今回は専用Scriptを使用してお手軽に対処。

※ESXiに限らず、他のiBFT対応OSでもたぶん同じようにインストール&起動できるはず

■iBFT
Japanese VMware Documentation Library
http://pubs.vmware.com/vsphere-50/index.jsp?topic=/com.vmware.vsphere.storage.doc_50/GUID-404C622E-3EDD-4C19-B51D-27C3C7EBEDBB.html


iBFT iSCSI 起動の概要

ESXiをデプロイし、iSCSI SANから起動するには、iBFT(iSCSI Boot Firmware Table)形式をサポートしている、iSCSI起動対応のネットワーク アダプタがホストに必要です。iBFTは、iSCSI起動デバイスに関するパラメータをオペレーティング システムに伝える方法です。

~中略~

iSCSI からはじめて起動するとき、システム上のiSCSI 起動ファームウェアがiSCSI ターゲットに接続します。ログインに成功すると、ファームウェアはネットワークとiSCSI起動のパラメータをiBFTに保存し、システムのメモリにそのテーブルを格納します。システムはこのテーブルを使用して、そのiSCSI接続とネットワークの構成、および起動を行います。

Oracle solaris 10 u9 iSCSI Boot
http://www.slideshare.net/satokaz/oracle-solaris-10u9iscsiboot20101111public

■準備
Linuxマシン(iPXEビルド用)
iSCSIストレージ
・ESXi5 インストールメディア

■検証環境
・仮想化ソフト VMware Workstation8 (Windows)
・ストレージNW 10.10.10.0/24
・ESXi
  OS: ESXi 5.0
  IP: 10.10.10.150
iSCSI
  OS: NexentaStor Community Edition 3.1.1
  IP: 10.10.10.3
・ESXi5
  VMware-VMvisor-Installer-5.0.0-469512.x86_64.iso
Linuxマシン
  OS:CentOS 6.2

■前提条件
・事前にESXi用仮想マシン(ガワのみ)を作成しておく。
iSCSIブート用NICのタイプとして「e1000」、その他は「e1000e」を使用。
Linuxマシンには開発環境とgitをインストールしておく。
・ストレージNWにて、DHCPが使用できる事。
iSCSIストレージにて、ESX毎のiqnおよびLUNを作成しておく。
 (検証では、1ホスト毎に1iqn&1lunを用意)
f:id:extrea:20120222102207p:plain

■設定手順
1. iPXEのダウンロード
Linuxマシンにて作業を行う

# cd ~
# git clone git://git.ipxe.org/ipxe.git
# cd ipxe/
# git pull -v

2. iPXE用スクリプトファイルの作成
※setで指定している値は環境に合わせる

# cd src/
# vi esx01.ipxe
---
#!ipxe

dhcp || fail_dhcp
ifopen net0

### Settings
set hostname      esx01
set net0/ip       10.10.10.150
set net0/netmask  255.255.255.0
set net0/gateway  10.10.10.254
set initiator-iqn iqn.2012-02.org.ipxe:ipxe-esx01

# root-path iscsi:${target-ip}:${target-protocol}:${target-port}:${target-lun}:${target-iqn}
set root-path     iscsi:10.10.10.3:::0:iqn.2012-02.com.nexenta:nexenta-esx01

###

echo +--------------------+
echo Boot from iSCSI Device
echo +--------------------+
echo
echo Hostname.....: ${hostname}
echo Device IP....: ${net0/ip}
echo Subnetmask...: ${net0/netmask}
echo Gateway......: ${net0/gateway}
echo Initiator Iqn: ${initiator-iqn}
echo
echo Root-Path....: ${root-path}
echo

sleep 5
set keep-san 1
sanhook ${root-path} || goto debug_iscsi_target
sanboot || goto fail_sanboot
exit

:fail_dhcp
echo No response from DHCP server
goto drop_shell

:fail_sanboot
echo SAN boot fail.
echo Go to next boot device (DVD Drive etc...)
echo Press any key.
prompt
exit

:debug_iscsi_target
echo Can not attach an iSCSI Target.
goto drop_shell

:drop_shell
echo Dropping to shell.
prompt
shell

※冒頭のDHCPによるアドレス取得は必要ないはずだが、この処理がないとうまく動かなかった。

3. iPXE(ROM版)のビルド

# cd src
# make bin/8086100f.mrom EMBED=esx01.ipxe; echo $?
# mv bin/8086100f.mrom ./esx01_e1000.mrom

出来上がったNIC ROMをWorkstationの稼働するPCへ移動する。
※他のホスト用ROMも必要に応じ作成しておく。

4. ESXiホストvmxファイル編集
仮想NIC関連の設定箇所へ以下のように追記、編集する。
NIC ROMのパスは環境に合わせる。

ethernet0.virtualDev = "e1000"
ethernet0.opromsize = 262144
e1000bios.filename = "D:\shared\esx01_e1000.mrom

その他NICについては、以下のようにe1000eを指定。
指定しない場合はeth0と同様にe1000(ipxe ROM)が使用される。

ethernet1.virtualDev = "e1000e"
ethernet2.virtualDev = "e1000e"
ethernet3.virtualDev = "e1000e"
...

5.ブートデバイスの変更
起動後のPOST画面にて「F2」キーを押下しBIOS設定に入る。

デバイス起動順序にて「iPXE」を1st boot deviceに指定。
f:id:extrea:20120222110120p:plain

6.ブート
仮想DVDドライブにはOSのメディアをあらかじめセットしておく。

うまくいけば、こんな感じでDHCPにてアドレスを取得し、ブート処理を始める。
f:id:extrea:20120222110143p:plain

ipxe shellに落ちるようなら、ネットワークやiSCSI Targetの設定を再確認。
OSインストール後、問題なく起動できればOK

7.その他

・NICの設定変更
設定変更は、ROMの再ビルドにて対応。

今回は「疑似HBA的に」というコンセプトだったけれども、別途Apache+PHPなどアプリケーションサーバを用意し、動的に変更したiPXEスクリプトをhttp経由でロードする方法も取れる。

この場合下記例のようなスクリプトを書き込んだROM1種類を用意するだけで済む上、設定変更はWebサーバ上で行えるため便利。
(ただしアプリサーバがこけると、ホストがブートできなくなるリスクとトレードオフ)

#!ipxe

dhcp
echo "Load custom ipxe script..."
chain http://10.10.10.100/boot.ipxe?mac=${net0/mac}

※chainロード時のクエリ(MACアドレス)をトリガに、返答するipxeスクリプトを変える。


・「Booting from SAN device 0x8?」で固まる(OSインストール前)
OSインストール時に、iSCSIディスクからのブート試行時点で固まり、次のブートデバイスに映らないときは、Attach先のLUNを作り直したり、partedなどでパーティションタイプを上書きしてみたりすると良いかも。


■参照
iPXE - open source boot firmware / Documentation
http://ipxe.org/docs

Network-booting machines over HTTP
http://jpmens.net/2011/07/18/network-booting-machines-over-http/

iPXEで複数台のiSCSIブートをまとめる
http://www3.atword.jp/osserpse/2012/02/11/

以上