Windowsの展開を無償で行う

Windowsの大量展開を行う場合、WindowsServerのWDSを使用するのが最も簡単だ。
だけど、ただクローンを大量に作成する場合、WDSはオーバースペックだ。また、動作中のWindowsServerをWDSにするのは事故が起こりそうなので避けたいし、逆に事故を避けるために、WDS専用にWindowsServerを立てるのも、コスト面から容認できないだろう。OSのライセンスとCALが新たに必要になるから。

大量展開に本質的に必要なのは、実は

  1. ネットワークブートができること
  2. ブートした環境に、Windowsのイメージをストレージに展開できるソフトが入っていること
  3. ブートした環境から、ネットワーク越しに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を知っているという特殊な人以外はここで挫折するだろう(笑)。
ヒントとしては、

  1. とりあえずSELinuxは無効にして動作確認を行い、最終的に有効にするのがいいでしょう。
  2. とりあえずファイアウォールiptables)は無効にして動作確認を行い、最終的に有効にするのがいいでしょう。
  3. シンボリックリンクに\を含めたい場合は\\と記載すること。

以下はサーバの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ファイル共有が行われた。

  1. \\192.168.0.1\wmi  (イメージファイルの保存先兼取得先)
  2. \\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"

おまけ:
一連の動作を記載すると、以下のようになる。

  1. PCをネットワーク起動。起動したPCに、192.168.0.1サーバから、dhcpで192.168.0.XのIPアドレスと起動用ファイルのtftpパスが渡される。
  2. PCがtftpで起動用ファイル(pxeboot.n12)を取得し、実行。起動用ファイルが、さらにWindowsPEの起動に必要なファイルをtftpで取得する。
  3. tftpで取得されたwinpe.wimファイルが、PCのメモリドライブに展開され、windowsPEが起動される。
  4. Startnet.cmdが実行され、内部に記載されたAUTODEPLOY.batが実行される。
  5. AUTODEPLOY.batが\192.168.0.1\wmiをZドライブに割り当てる。そして、Zドライブ内のイメージ展開スクリプト(APPIMAGEX.bat)が取得され、実行される。
  6. イメージ展開スクリプト内のdiskpart実行によって、PCのHDDが初期化され、システムドライブとWindowsドライブが作成される。
  7. イメージ展開スクリプト内のimagex実行によって、Windowsドライブに対して、あらかじめ取得しておいた、windowsイメージが展開される。
  8. イメージ展開スクリプト内のbcdboot実行によって、systemドライブに対して、Windowsの起動ファイルが展開される。