2025年5月5日月曜日

Prism Centralの活用その6(Sysprepが利用可能なテンプレートを作成する/その3)

WindowsやLinuxが入った仮想マシンを一括で展開したい場合、併せてホスト名やIPアドレスなどのカスタマイズも自動で行いたいものです。

Windowsの場合は、特にActive Directoryに参加する際、複数の仮想マシンが同じホスト名で参加すると動作に不具合が生じますし、SIDが重複しているとWSUSなど一部の機能が正常に動作しない場合があります。

Windowsの場合は、Sysprep、Linuxの場合は、cloud-initを利用して、仮想マシン展開時に独自のパラメーターにカスタマイズすることができます。Nutanixは、もちろん仮想マシンクローン時にSysprepやcloud-initと連携して、カスタマイズが可能です。

今回は、よく利用されるWindowsとSysprepの連携方法をテンプレートを使ってご紹介いたします。

まずは、テンプレートになる仮想マシンを用意しましょう。

今回は、Windows 11 Enterprise 24H2を用意しました。VDIの場合、VDIソフトウェアを利用した一括展開ができるので、あまりNutanixの機能を利用してクローンは行わないかもしれませんが、手動でのVDI環境構築や、もちろんサーバーOSでも同じ手順でSysprepを実行した仮想マシンを展開可能です。

Windows 11は、UEFIブート、セキュアブート、vTPM有効化などWindows 11の条件に従って仮想マシンを作成し、OSのインストールを行ってください。

OSのインストールを行ったら、Windows Updateや、あらかじめ利用するソフトウェアのインストールなど必要な作業を行ってください。

さて、準備ができたら、以下の作業を行います。

  • セットアップ時に作成したローカルアカウントを削除し、ローカルのAdministratorユーザーを有効化し、Administratorユーザーでサインインする
  • シャットダウン制御を行うため、「AHV環境におけるWindows仮想マシンのシャットダウンについて」を参考に画面の省電力OFFと、ロック時のシャットダウンを有効化する(任意)
  • デフォルトで有効化されるビットロッカーを無効化する
    「manage-bde -off c: 」を実行し、「manage-bde -status」で、暗号化領域が0%になっていることを確認する
  • Sysprep中にストアアプリのエラーが出る場合は、ストアアプリを削除する(後述)

Sysprepを実行する前に、インストール漏れなどがないように、一度OSをシャットダウン後にスナップショットを取得しておくことをお勧めします。

では、実際にSysprepを実行します。

ファイル名を指定して実行から「c:\windows\system32\sysprep\sysprep」を実行します。


Sysprepで、SIDを再生成する必要がありますので、「一般化する」にチェックを入れ、シャットダウンを選択してください。(再起動を選択すると、再起動をSID再生成処理が走ってしまいますので、テンプレート化してもSIDが再生成されません)


では、OKを押してSysprepを実行します。

が、おそらく以下のような「SysprepでWindowsのインストールを検証できませんでした。詳細については~」メッセージが出るのではないかと思います。


何らかの理由でSysprepが失敗していると考えられます。

まずは、指定された「C:\Windows\System32\Sysprep\Panther\setuperr.log」を参照します。


このログを見ると、LanguageExpreriencePackja-JPのパッケージが原因でSysprepに失敗していることがわかります。ほかにもEdgeなどで同様に引っかかる場合もあります。

この場合、PowerShellで該当のストアアプリパッケージを削除する必要があります。

上記のログの場合、以下のコマンドをPowerShellで管理者権限で実行します。

Get-AppxPackage -AllUsers <パッケージ名> | Remove-AppxPackage -AllUsers


上記ログの例)

Get-AppxPackage -AllUsers Microsoft.LanguageExperiencePackja-JP | Remove-AppxPackage -AllUsers

実際にPowerShellでの実行の画面


この状態で再度、Sysprepを実行し、一般化にチェックを入れて「シャットダウン」を選択し、OKをクリックします。


再び同じエラーが出ることがあります。

場合は、再度C:\Windows\System32\Sysprep\Panther\setuperr.log」を参照します。

ここでは、新たなログとして、WidgetsPlatformRuntimeが引っかかっているのがわかります。


同様に管理者権限で、パッケージを削除します。

Get-AppxPackage -AllUsers Microsoft.WidgetsPlatformRuntime | Remove-AppxPackage -AllUsers


再び、Sysprepで「一般化する」にチェックを入れ、「シャットダウン」を選択し、OKをクリックします。


今度は、画面が変わりました。このプログレスバーが表示されるダイアログが表示されたらあとは、少し時間がかかりますが、その後自動でOSがシャットダウンされます。


では、次に作成した、Windows 11のマスターをテンプレートに登録します。

Prism CentralのVMsから、テンプレートにしたい該当のマシンをチェックし、「Action」から、「Create VM template」を選択します。


次にテンプレートの名称及び、メモを入れます。
今回、SysprepのXMLは、あらかじめ登録しておくようにします。

Script Typeを「Sysprep(Windows)」を選択し、ConfigurationMethodを「Custom Script」を選択します。

次に、本来Sysprep時に、「unattend.xml」ファイルとして記載するXMLの内容を「Startup Script」 の中に記載します。

今回サンプルで以下のような条件でファイルを記載しています。

  • ホスト名をランダムに変更
  • ADに参加(参加用のユーザー・パスワードを記載)
  • 言語を日本語に設定
  • 初回アニメーションを無効化するレジストリを追記
  • 初回起動時に「C:\script\startup.bat」を実行
  • 初回起動時にドメインユーザーでログイン(ユーザー・パスワードを記載)
  • EULAや無線LAN設定などをスキップする
  • オンラインアカウント登録を無効にする

設定した内容は、以下の通りです。

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
  <settings pass="specialize">
    <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64"
               publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"
               xmlns:wcm="http://schemas.microsoft.com/WMIConfig/v2002/State"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <ComputerName>*</ComputerName>
      <TimeZone>Tokyo Standard Time</TimeZone>
    </component>
    <component name="Microsoft-Windows-UnattendedJoin" processorArchitecture="amd64"
               publicKeyToken="31bf3856ad364e35" language="neutral"
               versionScope="nonSxS"
               xmlns:wcm="http://schemas.microsoft.com/WMIConfig/v2002/State"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <Identification>
        <JoinDomain>toriten.oita</JoinDomain>
        <Credentials>
          <Domain>toriten.oita</Domain>
          <Password>toritenpassword</Password>
          <Username>ikoi</Username>
        </Credentials>
      </Identification>
    </component>
  </settings>
  <settings pass="oobeSystem">
    <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/v2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <InputLocale>ja-JP</InputLocale>
      <SystemLocale>ja-JP</SystemLocale>
      <UILanguage>ja-JP</UILanguage>
      <UserLocale>ja-JP</UserLocale>
    </component>
    <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/v2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <OOBE>
        <HideEULAPage>true</HideEULAPage>
        <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
        <HideLocalAccountScreen>true</HideLocalAccountScreen>
        <ProtectYourPC>3</ProtectYourPC>
        <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
      </OOBE>
      <DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet>
      <FirstLogonCommands>
        <SynchronousCommand wcm:action="add">
          <CommandLine>reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v EnableFirstLogonAnimation /t REG_DWORD /d 0 /f</CommandLine>
          <Description>Disable First Logon Animation</Description>
          <Order>1</Order>
        </SynchronousCommand>
        <SynchronousCommand wcm:action="add">
          <CommandLine>c:\script\startup.bat</CommandLine>
          <Description>Run FirstRun Batch Script</Description>
          <Order>2</Order>
        </SynchronousCommand>
      </FirstLogonCommands>
      <UserAccounts>
        <LocalAccounts>
          <LocalAccount wcm:action="add">
            <Password>
              <Value>local-password</Value>
              <PlainText>true</PlainText>
            </Password>
            <Name>nakayoshi</Name>
            <Group>Administrators</Group>
          </LocalAccount>
        </LocalAccounts>
      </UserAccounts>
      <AutoLogon>
        <Password>
          <Value>toritenpassword</Value>
<PlainText>true</PlainText> </Password> <Username>maruyama</Username> <Enabled>true</Enabled> <Domain>toriten.oita</Domain> </AutoLogon> </component> </settings> </unattend>


実際にXMLの内容を入力したうえで、「Next」をクリックします。


最後にサマリーの画面が表示されますので、ここで確認を行います。

注意してほしいことは、今回の事例では、ADに参加する処理が入っていますので、テンプレートから展開された仮想マシンがDHCPでIPアドレスを取得できる環境を用意しておく必要があります。IPAM設定、またはDHCPサーバを仮想マシンのVLANに用意しておく必要があります。(ADに参加しない場合など、Sysprep時にネットワークに接続する要件がない場合は、Sysprep時のネットワーク接続は必須ではありません


これで、テンプレートの作成は、完了です。

長くなってしまったので、次回で実際の展開の動きを確認したいと思います。




0 件のコメント:

コメントを投稿