Windows 7をディスクレスで使う
“ディスクレスXPの実現”でXPをディスクレスで使う方法をメモしたが、その時点ではWindows 7をディスクレスで動かすことができなかった。しばらく放っておいたのだが、空いた時間が出来たので再度トライしたら、すんなりと出来てしまった。以前は何が悪かったのか、皆目見当がつかない。前回と今回で唯一違うとするとiSCSIターゲット(サーバ)がUbuntu 10.04かUbuntu 8.04かの違い位しか思い浮かばないのだけども、それが原因とは思えない。
まっ、結果オーライということで、Windows 7のディスクレス・インストールの方法をメモしておく。と、言っても前回のXPのディスクレス化と同様、gPXEとiSCSIを使う。殆んどが重複するが、あっちを見たり、こっちを見たりでは不便なので、重複部分も再度メモしておく。なお、基本的には、
http://www.etherboot.org/wiki/sanboot/win2k8
http://www.etherboot.org/wiki/sanboot/win7
に書いてある通りにすればOKである。
■ 概要
大まかな流れは以下の通り:
参考(gPXE):http://www.etherboot.org/wiki/howtos
参考(iSCSI):http://iscsitarget.sourceforge.net/
gPXEはPXEを拡張したブート機能を提供する。通常のPXEではiSCSIプロトコルを使ったブートはできないが、gPXEをつかうことで可能となる。
XPの場合はiSCSIを使ってOSを直接はインストールはできないので、既存の(インストール済みの)OSを再設定して実現したが、Windows7の場合はiSCSIを使って直接iSCSIサーバのストレージにインストールすることができる。
■ iSCSIターゲット(ストレージサーバ)の設定
今回はLinuxマシンをiSCSIのサーバとした。ベースとしたのはUbuntu 8.04 LTS Server。インストールと設定は拍子抜けするほど超簡単。(本格運用するのであれば、構成や細かいパラメータの調整等が難しいだろうが、取りあえず動かすだければ直ぐにできる。)
まず、iSCSIターゲットのパッケージをインストールする。
# apt-get install iscsitarget
次にiSCSIターゲットのデーモンが起動するように設定する。
# echo "ISCSITARGET_ENABLE=true" >> /etc/default/iscsitarget
最後にデーモンを起動すればOK。
# /etc/init.d/iscsitarget start
■ ディスクのイメージファイルの作成
上の設定でiSCSIのターゲットとして動作するようにはなったが、イニシエータ(クライアント)へサービスするHDDのイメージファイルを作成・設定しなければならない。このイメージファイルの中にWindows7をインストールする。従って、Windows7のOSが収容できるだけの大きさが必要となる。
32GBの“ディスク”を作成する場合は次のコマンドを実行する。
# dd if=/dev/zero of=/PATH_TO_FILE/win7ulti64.img bs=1G count=32
これには少々時間がかかる。(ddのseekオプションでファイルサイズだけ確保する方法もあるが、フラグメントがひどくなりそうなので私は使っていない。)
次に作成したイメージファイルをiSCSIのディスクファイルとして設定する。
# vi /etc/ietd.conf Target iqn.2010-07.localnet:n118_w7u64 Lun 0 Path=/PATH_TO_FILE/win7ulti64.img,Type=fileio
ここで“n118_w7u64”は任意の識別子がだが、複数のクライアントで複数のOSをサポートできるように私は“ホスト名_OS名”とした。n118がクライアント(イニシエータ)ホスト名でw7u64がOSの名前(とバージョンなど)である。
そしてiSCSIのデーモンを再起動する。
# /etc/init.d/iscsitarget restart
ここで、もし、VMwareなどの仮想マシンを使っている環境であれば、このイメージ・ファイルを仮想マシンのモノシリック(フラット)ファイルとして作成し、それを指定することもできる。
例えばVMwareの場合、ハードウェアの追加で仮想ディスクを作成する時に“Allocate all disk space now”オプションを指定して“win7ulti64”という名前でモノシリックな仮想ディスクを作成すると
- win7ulti64.vmdk
- win7ulti64-flat.vmdk
という2つのファイルが出来る。win7ulti64.vmdkは仮想ディスクの情報を書いた設定ファイルで仮想ディスクの本体はwin7ulti64-flat.vmdkとなる。このwin7ulti64-flat.vmdkをiSCSIのターゲットのファイルをして指定する。たとえば、
# vi /etc/ietd.conf Target iqn.2010-07.localnet:n118_w7u64 Lun 0 Path=/PATH_TO_FILE/win7ulti64-flat.vmdk,Type=fileio
こうしておく事で、iSCSIのサービスを止めてから、仮想マシンへ仮想ディスクとして接続することも可能となる。OSの外(この場合はWindows7の外)からディスクを保守・管理する場合は便利だ。(仮想ディスクとして利用する他に“HDDイメージファイルをマウントして使う方法”でメモったように、Linuxのディレクトリにマウントして使う方法ある。)
■ PXEサーバの設定
PXEとはDHCPとTFTPを組み合わせて実現している仕組み(詳しくはこことかここを参照)。つまり、DHCPサーバとTFTPサーバの設定を行う。
まず、混乱しないように、ここでは2つの意味でPXEサーバの設定を行うことに注意する。以下、その説明。
ディスクレス・クライアントがiSCSIを使ってネットワークブートするためには通常のPXEではダメで“gPXE”を使う。そして、ディスクレス・クライアントにgPXEを実行させる方法は幾つかある。フロッピーやUSBメモリからブートする方法が一般的のようだが。ここではiSCSIを使って“ネットワーク”ブートをしようとしているわけだから、ネットワークに繋がれているのが前提となる。それであれば、PXEを使ってgPXEをダウンロード&実行させるのが自然である。ということで、ここでは(1)PXEを使ってgPXEをダウンロードするための設定と、(2)gPXEを使ってiSCSIの情報を得るための設定を行う。
まずは、PXEを使ってgPXEブートが出来るようにTFTPサーバを設定する。といっても、ファイルをTFTPサーバに置くだけ。次のページから
http://rom-o-matic.net/gpxe/gpxe-1.0.0/contrib/rom-o-matic/
次のオプションを指定して、
1. Choose an output format: [PXE bootstrap loader keep [Keep PXE stack method 1] (.kpxe)]
[Get Image]ボタンを押しダウンロードする。ダウンロードしたファイル“gpxe-1.0.0-gpxe.kpxe”を /tftpboot/gPXE/ というディレクトリを作って、その下に置いておく。
次に、DHCPサーバの設定。ディスクレス・クライアントからブートの要求に対して、(1)PXEによる要求に応えてgPXEをダウンロードする、(2)gPXEからの要求によりiSCSIサーバのターゲットディスクの情報を与えるようにDHCPサーバを設定する。/etc/dhcp3/dhcpd.confに次のようなディスクレスサーバのエントリを追加する。(使用しているDHCPサーバによって設定するファイルが異なったり、DHCP環境により内容が若干ことなってくるので自分の環境に合わせて設定する。)
option space gpxe; option gpxe-encap-opts code 175 = encapsulate gpxe; option gpxe.keep-san code 8 = unsigned integer 8; host n118 { hardware ethernet 00:12:34:56:78:9a; fixed-address n118; option host-name "n118"; if exists user-class and option user-class = "gPXE" { filename ""; option root-path "iscsi:is-server::::iqn.2010-07.localnet:n118_w7u64"; option gpxe.keep-san 1; option gpxe.no-pxedhcp 1; } else { filename "/gPXE/gpxe-1.0.0-gpxe.kpxe"; } }
参考:http://www.etherboot.org/wiki/pxechaining#setting_up_pxe_chainloading
ここで、ディスクレスクライアントからの要求に対して、1回目の要求と2回目の要求で返す情報がことなるのでif文を使って切り替えている。(これを最初に書いた人に拍手。)
なお、今回の実験環境では、n118というのがディスクレスのホスト名である。私の環境ではDNSを使ってLAN内でもアドレス解決が出来るようになっているので、192.168.1.118のような表記は使わずにホスト名を使っている。同様にis-serverというのがiSCSIターゲットのホスト名である。もし、名前解決ができない環境であればIPアドレスを直打ちする。(もし、iSCSIで上手くブートできない時は、直接IPアドレスを記入して試してみるといい。)
以上の設定が終わったらDHCPサーバデーモンを再起動する。
# /etc/init.d/dhcp3-server restart
■ OSのインストール
Windows7をiSCSIでインストールするポイントは以下の通り。
HDDは必ずしも外しておく必要はない。インストール画面でiSCSIとHDDと両方のストレージが表示され、インストールする場所を聞かれる。もし、外せるのあれば外しておいた方が混乱もないだろう。特にHDDに既にOSがインストールされている場合は。
BIOSのブートオプション設定は、次の順番でブートデバイスを探すようにしておく。
- PXEによるネットワークブート
- CD/DVDによるブート
- HDD(もし内蔵HDDがあれば)
なお、古いPCなどでPXEブート出来ない場合は次のページを参考にしてフロッピーやUSBメモリを使ってgPXEをブートすればいい。(2つ目の参考ページからバイナリのイメージを入手できる。)
参考:http://www.etherboot.org/wiki/removable
参考:http://rom-o-matic.net/gpxe/gpxe-1.0.0/contrib/rom-o-matic/
なお、フロッピーやUSBからgPXEをブートする場合でも、上に書いたDHCPサーバのエントリはそのままでOK。またBIOSの設定は順位は
- USBもしくはフロッピーによるgPXEのブート
- CD/DVDにおるブート
- HDD(もし内蔵HDDがあれば)
となる。(ただし、USBやフロッピーによるgPXE起動でのWindows7のインストールは未確認。)
あとは普通にWindows7をインストールすればいい。
PCの電源を入れると、先ずはPXEが動き、gPXEをダウンロードしてくる。次にgPXEが動きだし、iSCSIのターゲットの情報を入手して、iSCSIサーバの“ディスク”からブートしようとする。しかし、まだOSやブートローダはインストールされていないので、ブートに失敗する。(ただし、DHCPのオプションで指定したように、iSCSIの情報は保持される。)そして、次にDVDからのブートが始まり、Windows7のインストーラが起動する。既にgPXEによりiSCSIのターゲットディスクの情報を獲得されているので、Windows7のインストーラはiSCSIのディスクを認識する。インストール画面の初期の段階でWindows7をインストールする場所を聞かれるが、そこでは次のような画面が表示されるはずだ。
ここで、このマシンにはローカルなHDDは接続していないので、表示されている32GBのストレージはiSCSIのものである。
あとは、普通にWindows7をインストールすればいい。BIOS設定でPXEブートが最優先になっている限り、iSCSIディスクからブートする。
追記:2010/08/11
iSCSIを使った場合と、内蔵HDDを使った場合の性能を簡単比較してみた。“iSCSIとHDDのベンチマーク”
■ コメント
こうもあっさりとiSCSIブートやインストールが出来てしまうと、個別のPCにHDDを持つ必要もなくなる。iSCSIサーバが止まっている時にスタンドアロンで起動するPCや、ネットワークから切り離すノートPCについてはローカルなHDDも必要だが、オフィスで使う事務用のPCなどはiSCSIで十分だろう。
実際、HDDを止めてiSCSIで起動すると、HDDの騒音がないので非常に静かになる。書斎で使うPCにはうってつけかもしれない。(iSCSIサーバは別の部屋に置いておくことが前提となるが。)
また、一昔前は“モバイル・ラック”を使って複数のHDDを交換して使ったりもしていたが、iSCSIを使えばネットワーク経由で任意のストレージからブートできて、自由にストレージを接続、切断できるので、もうモバイル・ラックの必要性もそれ程はないだろう。