2013/07/29

DISMコマンドを使ったイメージキャプチャ・展開 その2

前回はざっとWIMイメージファイルのことを書いてみた。
http://win-enikki.blogspot.jp/2013/07/dism.html

実際にイメージキャプチャする場合には、
以前はImageX.exeとよばれるツールを利用する必要があったのだけれど、
Windows8からは標準で組み込まれているDISMコマンドからキャプチャおよび展開することが
できるようになった。

イメージ管理のコマンド ライン オプション
http://technet.microsoft.com/ja-jp/library/hh825258.aspx

Windows8ベースのWindowsPE4.0でも同様にDismコマンドを利用することができる。
WindowsPEを作成し、キャプチャ・展開するまでの手順をまとめてみる。
4

(ここからは自環境で行った検証なので、
本番環境で利用等で利用し、うまく行かなかった場合でも責任をとることはできません。
参考資料として、各自検証していただければとおもいます。)






■アセスメント&デプロイメントキットからWindowsPEを生成する

Windows(R) 8 用 Windows アセスメント & デプロイメント キット(x64)
http://www.microsoft.com/ja-jp/download/details.aspx?id=30652
image

Windows8用でも、Windows7OSへインストール、生成することは可能。
インストールウィザードにて、[DeploymentTools],[Windows Preinstallation Environment(Windows PE)]にチェックされていることを確認し、続行。

インストール完了後、[展開およびイメージングツール環境]を管理者として起動image
以下のコマンドを実行し、WindowsPEデータを取り出す。
copype amd64 c:\winpe_amd64
コピー先にWindowsPEのデータが入ったフォルダが生成される
image

■WindowsPEシステムロケール設定
WindowsPEもWimイメージとして存在している。
WIMイメージをマウントし、PEの設定やファイルの編集などを行う。
dism /mount-image /imagefile:"c:\winpe_amd64\media\sources\boot.wim" /index:1 /mountdir:"c:\winpe_amd64\mount"
image

c:\winpe_amd64\mount配下にWindowsPEのWIMイメージデータをマウントした。
ファイル等のデータを追加したい場合には、ここへ直接データをコピーすると良い。

WindowsPEの言語設定確認
[image%255B16%255D.png]
デフォルトだと、米国設定になっているので、日本設定にする。
言語パックインストール
dism /image:"c:\winpe_amd64\mount" /add-package /packagepath:"C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\ja-jp\lp.cab"
フォントインストール
dism /image:"c:\winpe_amd64\mount" /add-package /packagepath:"C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-FontSupport-JA-JP.cab"
既定言語変更
dism /image:"c:\winpe_amd64\mount" /set-allintl:ja-jp
キーボードの配列を日本語キーボード(106)に変更
dism /image:"c:\winpe_amd64\mount" /Set-UserLocale:ja-JP /set-InputLocale:0411:00000411
dism /image:"c:\winpe_amd64\mount" /set-LayeredDriver:6
タイムゾーンをTokyoに変更
dism /image:"c:\winpe_amd64\mount" /set-TimeZone:"Tokyo Standard Time"
日本語環境になったことを確認。
dism /image:"c:\winpe_amd64\mount" /get-intl
[image21%255B1%255D.png]
■ネットワーク設定バッチの組み込み
WindowsPE適用先の環境がDHCPサーバがある場合には特に必要ないのだけれど、
固定でIPアドレスを指定する場合にはnetshコマンドを使う。
もっと簡単にするため、固定IP設定を行うバッチをあらかじめWindowsPEへ組み込んでおく。(netsetup.bat)
尚、ネットワークドライバはWindows8ベースのPEではだいたい組み込まれていることが多いが、
ない場合にはこちらもドライバを組み込んでおく必要がある。

※netsetup.bat
@echo off  

rem -------------------------------------------------
rem IPアドレスの設定BAT 
rem http://win-enikki.blogspot.jp/
rem -------------------------------------------------

 cls
echo.
echo.
:inst
set Idx=nul
echo ネットワークの一覧を表示します。
netsh interface ip show interface
set /p Idx=設定したいネットワークの Idx の値を入力:
:Menu
echo ------------------------------------------------
echo □■ Menu ■□
echo ------------------------------------------------
echo 1:ネットワーク設定変更
echo 2:インデックス番号の再選択
echo 3:IPアドレスの確認
echo 4:構文確認
echo q:終了
echo ------------------------------------------------  

rem 判定キーの初期化
set Slt=nul  

rem 選択値の入力を求める
set /p Slt=入力:  

rem 条件分岐
if '%Slt%'=='1' goto Set_1
if '%Slt%'=='2' goto inst
if '%Slt%'=='3' goto Set_3
if '%Slt%'=='4' goto Set_4
if '%Slt%'=='q' goto :eof  

rem 指定文字以外の入力がある場合は、メニューに戻る
goto Menu  

:Set_1
rem ----------------------------------------------------
rem ■IPアドレスを固定で取得
rem ----------------------------------------------------
rem IPアドレス&DNSの設定  

echo ローカルエリア接続に設定するIPアドレスを入力してください
set /p Ipadd=入力:  

echo サブネットマスクを入力してください
set /p Subnet=入力:  

echo デフォルトゲートウェイを入力してください
set /p Dfgy=入力:  

echo DNS を入力してください
echo 例:10.2.129.210
set /p DnsSv1=入力:  

set yorn=nul
set /p yorn=設定します。(y or n):  

rem 条件分岐
if '%yorn%'=='y' goto Main
if '%yorn%'=='n' goto Menu
goto Menu
:Main
echo しばらくお待ちください。
netsh interface ip set dnsserver %Idx% source=static addr=%DnsSv1% register=both
netsh interface ip set address %Idx% source=static %Ipadd% %Subnet% %Dfgy%  

echo ネットワークを設定しました。
echo Menuに戻ります。キーを押してください。
pause>nul  

rem 処理終了
goto :Menu  

:Set_4
rem ----------------------------------------------------
rem ■インデックス番号の確認
rem ----------------------------------------------------
echo 手動設定時の構文例
echo netsh interface ip set dnsserver [インデックス番号] static [DNSサーバのIPアドレス] none
echo netsh interface ip set address [インデックス番号] static [IPアドレス] [サブネットマスク] [デフォルトゲートウェイ]
pause
rem 処理終了
goto :menu  

:Set_3
rem ---------------------------------------------------------
rem ■IPアドレスの確認
rem ---------------------------------------------------------
rem IPアドレスなどを表示させる
ipconfig /all
echo.
pause  

rem 処理終了
goto :Menu  


netsetup.batを以下のフォルダに保存
C:\winpe_amd64\mount\Windows\System32
続いてキャプチャ・展開する為のバッチも用意する。(ImgCap.bat)
各コマンドの内容は以下を参考

DISM を使ってイメージを適用する方法
http://technet.microsoft.com/ja-jp/library/hh824910.aspx

尚、今回のバッチでのイメージ展開時のパーティション再作成は、
ディスクの1本目をフォーマットし、
システムパーティション(300MB)・リカバリー領域(3000MB)・ブートパーティション(残りのデータ領域)
としている。
パーティション構成・指定先を変えたい場合は、
CreatePartitions.txtおよび DISM /apply-image 部分の指定先を変更すること。
また、システムパーティションに対し、UEFIではなくBIOS形式の場合は、BCDBOOT部分を変更すること。

ImgCap.bat

@echo off

rem -------------------------------------------------
rem DISMキャプチャ・展開
rem http://win-enikki.blogspot.jp/
rem -------------------------------------------------
cls

:Menu
echo ------------------------------------------------
echo □■ Menu ■□
echo ------------------------------------------------
echo 1:イメージフォルダマウント
echo 2:イメージ新規取得
echo 3:イメージ追記取得
echo 4:イメージ展開(Cドライブ専用)
echo q:終了
echo ------------------------------------------------

rem 判定キーの初期化
set Slt=nul

rem 選択値の入力を求める
set /p Slt=入力:

rem 条件分岐
if '%Slt%'=='1' goto Set_1
if '%Slt%'=='2' goto Set_2
if '%Slt%'=='3' goto Set_3
if '%Slt%'=='4' goto Set_4
if '%Slt%'=='q' goto :eof

rem 指定文字以外の入力がある場合は、メニューに戻る
goto Menu

:Set_1
rem ----------------------------------------------------
rem ■ネットワークフォルダマウント
rem ----------------------------------------------------


echo "イメージデータ保存箇所を入力してください。\\<IPアドレス>\<共有フォルダ>"
set /p Ipadd=入力:

net use n: %Ipadd%
dir n:

echo 共有フォルダ設定をNドライブとしてマウントしました。
echo Menuに戻ります。キーを押してください。
pause>nul

rem 処理終了
goto :Menu

:Set_2
rem ----------------------------------------------------
rem ■イメージ新規取得
rem ----------------------------------------------------

echo 以下のフォルダへ作成するイメージファイル名を記入してください。
echo (例) sample.wim
echo ;
dir n:\
set /p CapImg=入力:

echo ;

echo 取得するイメージのドライブ名を記入してください
echo (例) C:\
set /p CapDrv=入力:

echo ;

echo 取得するイメージの説明を記入してください
echo (例) サンプルイメージ
set /p CapDesc=入力:

echo ;

echo キャプチャ名: %Capimg%
echo キャプチャドライブ: %CapDrv%
echo キャプチャ保存先: %CapDesc%

set yorn=nul
set /p yorn=上記内容で取得します。(y or n):
if '%yorn%'=='y' goto Main2
if '%yorn%'=='n' goto Menu
goto Menu
:Main2


echo キャプチャ中です。
Dism /Capture-Image /ImageFile:n:%Capimg% /CaptureDir:%CapDrv% /Name:"%CapDesc%"

echo キャプチャ終了しました。
echo メニューに戻ります。
pause>nul
goto :Menu

:Set_3
rem ----------------------------------------------------
rem ■イメージ追記取得
rem ----------------------------------------------------

echo 追記するイメージファイル名を記入してください。
echo (例) sample.wim
echo ;
dir n:\
set /p CapImg=入力:

echo ;

echo 取得するイメージのドライブ名を記入してください
echo (例) C:\
set /p CapDrv=入力:

echo ;

echo 取得するイメージの説明を記入してください
echo (例) サンプルイメージ
set /p CapDesc=入力:

echo ;

echo キャプチャ名: %Capimg%
echo キャプチャファイルデータ
Dism /Get-ImageInfo /ImageFile:n:\%Capimg%
echo キャプチャドライブ: %CapDrv%
echo キャプチャ保存先: %CapDesc%

set yorn=nul
set /p yorn=上記内容で取得します。(y or n):
if '%yorn%'=='y' goto Main2
if '%yorn%'=='n' goto Menu
goto Menu
:Main2


echo キャプチャ中です。
Dism /Append-Image /ImageFile:n:%Capimg% /CaptureDir:%CapDrv% /Name:"%CapDesc%"

echo キャプチャ終了しました。
echo メニューに戻ります。
pause>nul
goto :Menu


:Set_4
rem ----------------------------------------------------
rem ■イメージ展開(Cドライブ専用)
rem ----------------------------------------------------

echo 以下のデータから適用するイメージファイル名を記入してください
dir n:\
set /p ApImg=入力:
rem dir n:\%Apimg%

Dism /Get-ImageInfo /ImageFile:n:\%Apimg%
echo 適用するIndexを指定してください。
set /p ApIndex=入力:


Dism /Get-ImageInfo /ImageFile:n:\%Apimg% /Index:%ApIndex%

set yorn=nul
set /p yorn=上記のイメージを展開します。(y or n):
if '%yorn%'=='y' goto Main4
if '%yorn%'=='n' goto Menu
goto Menu
:Main4

echo パーティション作成しています。
diskpart /s CreatePartitions.txt

echo イメージ展開中です。
Dism /apply-image /imagefile:N:\%Apimg% /index:%ApIndex% /ApplyDir:W:\

echo ブートパーティション適用中です。
rem ブートがUEFIではなくBIOSであれば、最後をBIOSに変更する
BCDBOOT W:\Windows /l ja-jp /s S: /f UEFI

echo 作業完了しました。
echo 再起動してください。メニューに戻ります。
pause>nul
goto :Menu


バッチ内で利用している、diskpartコマンドの呼び出しの為、以下のテキストを用意
CreatePartitions.txt
-------------------------------------
select disk 0
clean
create partition primary size=3000 id=27
format quick fs=ntfs label="Recovery"
assign letter="R"
create partition primary size=300
format quick fs=ntfs label="System"
assign letter="S"
active
create partition primary
format quick fs=ntfs label="Windows"
assign letter="W"
-------------------------------------
ImgCap.batおよびCreatePartition.txtを
以下のフォルダに保存
C:\winpe_amd64\mount\Windows\System32

■コミット・USBへ保存
データの準備が完了したらデータをコミットし、マウント解除する
dism /unmount-image /mountdir:"c:\winpe_amd64\mount" /commit
最後に、USBへ書き出し、USBから起動できるようにする。
Makewinpemedia /ufd C:\winpe_amd64 <USBドライブ>
[image%255B27%255D.png]

これでキャプチャ・展開するためのWindowsPE USBができた。

■検証
実際にネットワークの適用、イメージキャプチャ、展開を検証機にて試してみた。

検証機にて
USBメモリブートし、WindowsPEで起動、netsetup.bat を実行し、固定IPアドレスを適用した。

続いて、Imgcap.batを実行し、キャプチャ保存先のフォルダをマウントする。


次にドライブを指定してWIMイメージファイルを作成する。
キャプチャドライブは、どのドライブになるかWindowsPE上で確認しておく必要がある。
(尚、イメージ取得時間は下の画像では多少カットしてます)

作成してあるWIMファイルに追記する格好でイメージキャプチャをしてみる。


上の画像をみてわかる通り、WIMファイル上では3GBほどであるが、
実際のデータ容量は12GBほどとなっており、キャプチャ時に圧縮が行われている。
また、今回は同じデータをWIMファイルに追加しているため、WIMファイルの容量自体はほとんど増加していないこともわかる。

最後にイメージ展開をしてみる。
前述の通り、展開においてはパーティションの切り方や、システムパーティションの種類によって
設定変更が必要となるため、注意すること。

その後、再起動すると正常に起動することを確認できた。
以上で、DISMコマンドを利用してイメージキャプチャ、展開を行うことができた。

機会あれば、WDS展開サービスに関しても 少しいじってみたいなぁと思う。



スポンサーリンク

スポンサーリンク