Windowsの大量展開を行う場合、WindowsServerのWDSを使用するのが最も簡単だ。
だけど、ただクローンを大量に作成する場合、WDSはオーバースペックだ。また、動作中のWindowsServerをWDSにするのは事故が起こりそうなので避けたいし、逆に事故を避けるために、WDS専用にWindowsServerを立てるのも、コスト面から容認できないだろう。OSのライセンスとCALが新たに必要になるから。
大量展開に本質的に必要なのは、実は
- ネットワークブートができること
- ブートした環境に、Windowsのイメージをストレージに展開できるソフトが入っていること
- ブートした環境から、ネットワーク越しにOSイメージが取得できること
の3点だ。要は、以上のことができるだけのLinuxサーバが立てられれば、無料でWindowsの展開ができるはずだ。
上記1については、DHCPとTFTPサービスを立ててしまえば問題なく行える。また、上記2については、WindowsPE3.1にimagexを入れたものか、WindowsPE4.0以上付属のDISMによって、問題なく実施できる、上記3についてはsambaによるファイル共有で問題なく行える。1,3はLinuxで実装できるので無料、2.WindowsPEも無料で入手できるので、少なくともソフトウェアについては無償でWindowsの配布環境が構築可能だ。
とりあえず、こちらのサイトを参考にCentOS 6.5にdhcpサーバとtftpサーバをインストールし、WindowsPEを登録した。Linuxを問題なく使用できて、WindowsPEを知っているという特殊な人以外はここで挫折するだろう(笑)。
ヒントとしては、
- とりあえずSELinuxは無効にして動作確認を行い、最終的に有効にするのがいいでしょう。
- とりあえずファイアウォール(iptables)は無効にして動作確認を行い、最終的に有効にするのがいいでしょう。
- シンボリックリンクに\を含めたい場合は\\と記載すること。
以下はサーバのIPアドレスを192.168.0.1にした場合のdhcpの最低限設定。
/etc/dhcp/dhcpd.conf
option domain-name "winpe7.local"; subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.10 192.168.0.250; default-lease-time 3600; max-lease-time 86400; next-server 192.168.0.1; filename "pxeboot.n12"; }
まあ、無事にWindowsPEをネットワーク起動できる環境が構築できたので、次はOSイメージの取得だ。
OSイメージの共有はsambaで行う。ネットワークを完全に閉じた環境でセットアップを行うことを想定し、認証なし環境を構築した。
/etc/samba/smb.conf
security = share
ここで、ポイントとなるのは、winpe.wimの入れ替えを簡単に行えるように、winpe.wimの入っているディレクトリを共有すること。カスタマイズしたwinpe.wimを誰でも簡単に入れ替えられる。
/etc/samba/smb.conf
[wmi] path = /var/local/share public = yes readable = yes writable = yes [winpe] path = /var/lib/tftpboot/winpe public = yes readable = yes writable = yes
Linuxをつかえる人がいれば共有の必要はない。この設定で、展開サーバには以下2つのWindowsファイル共有が行われた。
- \\192.168.0.1\wmi (イメージファイルの保存先兼取得先)
- \\192.168.0.1\winpe (winpe.wimファイルの入れ替え用)
さて以上で、ネットワークブートでWindowsPEを起動し、net useコマンドで共有し、imagexもしくはdismで展開することは十分にできるようになったが、自動で展開できれば尚良い。WindowsPEにバッチを仕込みたいところだが、イメージのファイル名とか、ディスクのパーティション設定とか、頻繁に変わるような値については、毎回WindowsPEに仕込みたくない。だから、WindowsPEには「\\192.168.0.1\wmi」をZドライブとして共有し、その中の「Script」ディレクトリから、変わりそうな値を含んだスクリプトを取得して、実行するようなバッチを作ってみた。そして、このファイルをWindowsPEの「system32\Startnet.cmd」に記載し、winpe.wimを作成した。これで、完成だ。
WindowsPEに仕込んだバッチ(AUTODEPLOY.bat)
@ECHO OFF REM タイトル REM Windows7用 展開サービス用バッチ REM REM 作成者 REM 2014/04/29 marujx REM REM 使い方: REM WindowsPEに組み込んで使用します REM 例:Startnet.cmdに本バッチを記載 REM Windowsイメージの配布サーバとディレクトリ SET WINSHARE=\\192.168.0.1\wmi REM Windowsイメージ展開バッチのありか SET IMAGEXSCRIPT=Z:\SCRIPTS\APPIMAGEX.bat ECHO ----------------------------------------- ECHO %WINSHARE%のZドライブ割り当て開始 NET USE Z: %WINSHARE% IF %ERRORLEVEL% NEQ 0 GOTO NETWORKERR ECHO イメージファイルの共有フォルダを取得し ECHO Zドライブに割り当てました。 ECHO ----------------------------------------- ECHO Zドライブからイメージ展開用スクリプトを ECHO 取得します COPY %IMAGEXSCRIPT% . IF %ERRORLEVEL% NEQ 0 GOTO FILECOPYERR ECHO イメージ展開用スクリプトを取得しました ECHO ----------------------------------------- ECHO イメージ展開用スクリプトを実行します %IMAGEXSCRIPT% ECHO イメージ展開用スクリプトが終了しました ECHO ----------------------------------------- ECHO Zドライブの割り当てを終了します。 NET USE Z: /DELETE ECHO ----------------------------------------- ECHO イメージ展開を終了しました。 PAUSE EXIT /B 0 :NETWORKERR ECHO イメージファイルの共有フォルダ取得に失敗しました。 ECHO 終了します PAUSE EXIT /B 1 :FILECOPYERR ECHO Zドライブからの「%IMAGEXSCRIPT%」のコピーに失敗しました。 ECHO 終了します PAUSE NET USE Z: /DELETE EXIT /B 1
Z:\SCRIPTS\APPIMAGEX.bat
@ECHO OFF REM タイトル REM Windows7用 イメージ置換バッチ REM REM 作成者 REM 2014/04/29 marujx REM REM ※注意※ REM 本バッチの実行で、実行したPCのデータはすべて消去されます。 ECHO Windowsイメージの展開を開始します。 ECHO このPCのデータはすべて削除されます。 ECHO 停止したい場合は、ctrl+Cを押下してください。 REM 以下行のPAUSEを削除すると、自動実行されます。 PAUSE REM イメージファイルの名称を記載します SET IMAGEFILENAME1=Z:\win7ent.wim SET DISKPARTSCRIPT=Z:\SCRIPTS\DPS.txt ECHO ----------------------------------------- ECHO ************DISKPART開始************ DISKPART /s %DISKPARTSCRIPT% ECHO ************DISKPART終了************ ECHO ----------------------------------------- ECHO ************IMAGE復元開始************ IMAGEX /APPLY %IMAGEFILENAME1% 1 w:\ bcdboot w:\Windows /l ja-jp /s s: ECHO ************IMAGE復元終了************ ECHO ----------------------------------------- ECHO IMAGEの復元を終了しました。
Z:\SCRIPTS\DPS.txt
select disk 0 clean create partition primary size=100 format quick fs=ntfs label="System" assign letter="S" active create partition primary format quick fs=ntfs label="Windows" assign letter="W"
おまけ:
一連の動作を記載すると、以下のようになる。
- PCをネットワーク起動。起動したPCに、192.168.0.1サーバから、dhcpで192.168.0.XのIPアドレスと起動用ファイルのtftpパスが渡される。
- PCがtftpで起動用ファイル(pxeboot.n12)を取得し、実行。起動用ファイルが、さらにWindowsPEの起動に必要なファイルをtftpで取得する。
- tftpで取得されたwinpe.wimファイルが、PCのメモリドライブに展開され、windowsPEが起動される。
- Startnet.cmdが実行され、内部に記載されたAUTODEPLOY.batが実行される。
- AUTODEPLOY.batが\192.168.0.1\wmiをZドライブに割り当てる。そして、Zドライブ内のイメージ展開スクリプト(APPIMAGEX.bat)が取得され、実行される。
- イメージ展開スクリプト内のdiskpart実行によって、PCのHDDが初期化され、システムドライブとWindowsドライブが作成される。
- イメージ展開スクリプト内のimagex実行によって、Windowsドライブに対して、あらかじめ取得しておいた、windowsイメージが展開される。
- イメージ展開スクリプト内のbcdboot実行によって、systemドライブに対して、Windowsの起動ファイルが展開される。