ESXi 5をソフトiSCSIでブート
- 2013/09/30 初版はESXiを仮想環境でインストールして、その仮想ディスクをSANのストレージとしてコピーする方法を紹介していましたが、この方法だと(起動はして、動作もするのですが)設定が変更できないなどの不具合があることが分かったので、直接SANのストレージへインストールする方法に書き換えました。
以前、LinuxにソフトiSCSI機能をインストールした際に ESXi 4.xをiSCSIでブートできることは確認していましたが、あくまでも動作確認の範囲で、実用というわけではありませんでした。しかしこの程、本格的にESXiのiSCSIブート環境を整えようと思い設定しましたので、そのメモを残しておきます。
なぜ、ESXiのiSCSIブート環境を整えようかと思ったと言うとWindows XPが間もなくサポート終了となるからです。XP(およびIE 8)のサポートが終了されれば、新たに発見されたセキュリティホールは放置状態になるので、幾つかの仮想マシンをWindows 7/8環境へ移行しなければなりません。仮想環境で運用するので、ESXiサーバがダウンした際に、代替えのESXiサーバを直ぐに立ち上げられるようにしたい、と言うのが動機です。
なお、私の環境はファイルサーバ(兼ストレージサーバ)とESXiホストは分けてあり、ファイルサーバが動いている限りは、ESXiホストは(性能などは別として)別のマシンでも動かすことができるので、ESXiのiSCSIブートが意味を持ってきます。通常の環境であれば特に必要ないでしょう。
用意するもの
ハードウェア
- PXEブートが可能なPC
- ESXiが動作可能なこと
ソフトウェア
ESXiはいつの間にか5.5.0になっていました。しかし、私の廉価なPCで使われているRealtekのイーサネット チップに対応していないためESXi 5.5.0ではネットワークが利用できませんでした。そこで、5.1.0U1をインストールします。(なお、イーサネット チップさえESXiがサポートしていれば、5.5.0でも手順は全く同じです。)
iSCSIのサーバターゲット)にはIET iSCSIを使いました。ソフトiSCSIにはgPXEの後継(?)であるiPXEを使います。
後半のDHCPサーバ、TFTPサーバはPXEブートに必要なコンポーネントです。標準のPXEではiSCSIやFCoEといったプロトコルには対応していないので、PXEからチェーンするiPXEを使ってiSCSIブートを実現します。
なお、PXEについての基本的な設定などは、他のWebページで解説が山ほどありますので、ここでは触れません。PXEブートの環境は整っているという前提で、変更点・追加点のみを書いておきます。
iSCSI SANについても同様です。既にiSCSI SANの環境があるという前提で追加点のみを書きます。
それと、私のストレージサーバ(兼DHCP/TFTP/DNS/NFS/etcサーバ)環境はUbuntu 12.04です。基本的には他のLinuxでも同様の設定で動くと思いますが、確認はしてません。あと、私は“よゐこ”ではありませんから作業は一々sudoなんて面倒くさいことはやりませんので、rootで行っています。
インストール手順
インストールの手順は次のようになります。
最初は仮想環境でゲストOSとしてESXiをインストールして、その仮想ディスク イメージをSANのストレージとして使う方法でインストールしたのですが、自身でインストールしたディスクでないと(つまり、他のマシンでインストールしたディスクを別のマシンで起動している状態では)起動は出来きて使えるのですが、設定の変更がディスクに反映されませんでした。例えば、IPアドレスを変更しても一時的には変更できるのですが、再起動すると元に戻ってしまいます。
やはり、iSCSIのSANのストレージをブート時にフックして、そこにCDから直接インストールしないと宜しくないようです。
- iSCSIターゲットにESXi用のストレージを用意する
ESXi 5.5のインストール ガイドによると1GBでもインストールできるようですが、ログ等の領域も確保した最低容量は6GBということなので、6GBのストレージを用意します。私の環境では“/san”というディレクトリの下にiSCSI用のストレージ ファイルを置くようにしていますので、次のように設定しました。
root@server:~# dd if=/dev/null of=/san/esxi_5.1.raw bs=1G seek=6 root@server:~# chmod 600 /san/esxi_5.1.raw root@server:~# ls -l /san total 16755868 -rw------- 1 root root 4294967296 Jul 17 00:22 android.raw -rw------- 1 root root 6442450944 Sep 27 02:18 esxi_5.1.raw -rw------- 1 root root 6442450944 Nov 18 2012 opencv.raw root@server:~#
拡張子は“raw”になっていますが“img”でも“vmdk”でも何でも構いません。次に設定するファイルに記述するストレージ パスと同じであれば何でもOKです。
次に iSCSIサーバの設定ファイル /etc/iet/ietd.conf に、このディスク イメージのエントリを追加します。
Target iqn.2013-09.localnet:esxi5 Lun 0 Path=/san/esxi_5.1.raw,Type=fileio IncomingUser myname mypassword
ここでは必要最小限の項目だけ挙げています。セグメント長とか各自の環境と好みに合わせて設定してください。
最後にiSCSIサーバを再起動します。(なお、その際iSCSIのアクセスが無い事を確認して下さい。)
root@server:~# service iscsitarget restart * Removing iSCSI enterprise target devices: [ OK ] * Stopping iSCSI enterprise target service: [ OK ] * Removing iSCSI enterprise target modules: [ OK ] * Starting iSCSI enterprise target service [ OK ] [ OK ] root@server:~#
- PXE、iPXEをインストール用に設定する
PXEは各自の環境に最も依存するところです。かと言って全てのケースについて書くわけにも行きませんので、私の環境での設定になります。まずは、私のPXEの環境の概要から。TFTPのルート ディレクトリは /tftpboot としています。これはUNIXの流儀に則って /tftpbootにしていますが、通常 ISC TFTPをインストールすると /var/lib/tftpboot がルート ディレクトリになるかと思います。どちらでも設定内容は変わりませんが、適宜、読み替えて下さい。(以下の紹介は単純化してあります。実際の環境はブートするOSをメニューで選択したり、クライアントのMACアドレスで動作を変更したりと、もっと複雑なのですが、それをそのまま書いてしまうと参考にならないので、ごくごく単純化しています。)
既にPXEの環境はできていると言う前提ですので、iPXEの導入の所から始めます。次のホームページからiPXEのソフトウェアをダウンロードします。
http://ipxe.org/howto/chainloading
ソフトウェアは次のようにwgetでダウンロードしても良いです。
root@server:~# cd /tftpboot root@server:/tftpboot# wget http://boot.ipxe.org/undionly.kpxe root@server:/tftpboot# chmod 644 undionly.kpxe root@server:/tftpboot# ls -l undionly.kpxe -rw-r--r-- 1 root root 66979 Sep 27 10:00 undionly.kpxe root@server:/tftpboot#
tftpサーバが非rootで動作する場合はroot以外でもファイルを読めるようにchmodしておきます。
次に、DHCPサーバの設定ファイル /etc/dhcp/dhcpd.conf を変更します。ESXiをiSCSIブートさせたいPCのエントリを次のように設定します。
host mypc { hardware ethernet 12:34:56:78:90:ab; fixed-address 192.168.1.234; option host-name "mypc"; if exists user-class and option user-class = "iPXE" { filename "script.ipxe"; } else { filename "undionly.kpxe"; } }
このエントリの意味は、最初にtftpでファイルを要求して来た際には"undionly.kpxe"を渡してあげて、(そのundionly.kpxeを使って再度)二回目のtftpファイル要求の際には"script.ipxe"というスクリプト ファイルを渡してあげるとう意味です。
つまり、/tftpboot/script.ipxeというスクリプト ファイルを用意しておく必要があります。
#!ipxe set username myname set password mypassword # sanboot iscsi:server:::0:iqn.2013-09.localnet:esxi5 sanhook iscsi:server:::0:iqn.2013-09.localnet:esxi5
“sanboot”の行はコメントアウトしてあります。これは後で ESXi のインストールが終わって ESXi を通常にブートする際に使います。まだ ESXi はインストールされておらずストレージは空の状態ですから“boot”はできません。その代り“sanhook”というコマンドで iSCSIターゲットのストレージをフックできるようにしておきます。
あと、“server”と言うのはiSCSIサーバ(つまり私の環境では自分自身)を指定します。IPアドレスでもOKですし、名前解決ができていればホスト名でもOKです。なお、このファイルも TFTPサーバが読めるようにパーミッションを設定しておいてください。
さて、以上で設定は終わりですので DHCPサーバを再起動します。
root@server:/tftpboot# service isc-dhcp-server restart isc-dhcp-server stop/waiting isc-dhcp-server start/running, process 25912 root@server:/tftpboot#
- iSCSIブートしてESXiをインストールする
まず、PCのBIOS設定画面を起動します。大抵のPCの場合は、電源投入直後の自己診断(POST)の間に DEL キーを押すとBIOS設定画面に入るかと思いますが、メーカーによっては異なるので各自確認しておいてください。
BIOS設定画面に入ったら、ブートデバイスの順位を次のように設定します。
- PXEネットワーク ブート
- CD/DVD/BLドライブ
つまり、電源を入れると自動的にPXEブートを実行します。そして、それが終了(もしくは失敗)したらCDドライブでブートするように設定します。3番目以降は何でも構いません。
次にESXi 5.1のCDをドライブにセットします。その後、BIOSの設定を保存して再起動します。
すると、PCは次のように動作します。
- PXEブートに入りDHCPサーバからIPアドレスなどを受け取る
- TFTPを使ってiPXEのソフトウェアをダウンロードする。
- iPXEが起動して、iSCSIプロトコルを使ってリモートのストレージをフックする
- iPXEが終了して、CDドライブからブートする。
DHCPサーバからIPアドレス等の取得に数秒かかりますが、後はアッと言う間に終わって、すぐにCDドライブからESXiのインストールが始まります。
あとは、ESXiのインストール ガイドなどを見ながらESXiをインストールしてください。注意点としては、もし、PCがローカルなHDDを持っている場合は、間違ってHDDの方にESXiをインストールしないようにすることです。ストレージの選択の所でリモートのストレージを選択してインストールします。
インストールが終了すると、PCの再起動に入りますが、再起動が始まったところ(電源ランプが一旦消えて、PCのロゴが出ているところ)で電源を切ります。(タイミングを逃しても、ESXiのインストールCDが起動するだけですの、そこで電源を落としても大丈夫です。)
- PXE、iPXEをブート用に設定する
インストールが終わったら、今度はiSCSIストレージからブートするようにiPXEの設定を変更します。/tftpboot/script.ipxeというスクリプト ファイルを次のように変更してください。
#!ipxe set username myname set password mypassword sanboot iscsi:server:::0:iqn.2013-09.localnet:esxi5 # sanhook iscsi:server:::0:iqn.2013-09.localnet:esxi5
これで、今度は“フック”するのではなく“ブート”するようになります。この設定を終えてから、PCの電源を入れれば、ESXiをブートするハズです。
IPアドレスに関してですが、VMwareのインストールマニュアルにはiSCSIブートを使う際にはスタティックIP設定をするようにと書いてあります。しかし、DHCPで取得した動的IPアドレスでも動作するのは確認しています。とは言っても DHCPにしたところで、別のPCでブートすると上に書いた様にストレージに何も書き込めない状態になるので、余り意味がありません。(検証はしていませんが、PCのIPアドレスをDHCP/DNSサーバで管理していて、同じPCだけどIPアドレスを変更する場合には使えるかも知れません。)特に必要性がないのであればスタティクにアドレスを設定しておく方が良いでしょう。
IPアドレスを設定したら、次にvSphere Client等でログインしてiSCSIの設定をします。ブートはiPXEを使っていますが、ハイパーバイザのレイヤでiSCSIにアクセスしようとするとユーザ/パスワードを設定していませんから、iSCSIターゲットにログインできません。構成⇒ストレージアダプタからiSCSIのCHAPの設定をしておきます。これを忘れると、(1)ブート時のiSCSIモジュールのロードに非常に時間がかかる、(2) datastore1をマウントできない、ということになってしまいます。
BOISのブート順位の設定はご自分の環境に合わせて再設定しておいてください。常時SANブートのESXiを使うのであれば、上で設定した順番でOKです。もし、普段はローカルなHDDにインストールしているOSを立ち上げて使うのであれば、
- HDD
- CD/DVD/BLドライブ
- PXEネットワークブート
としておけば良いでしょう。メーカーに依って異なりますが、電源投入直後に F12 または F2 とか F8 を押すとブートデバイスの選択画面に入るので、そこでPXEブートを選択すれば、いつでもESXiを使えます。