sanpobiyori.info

Hyper-V Server 2016でLinuxの構築でハマった件

先日、自宅検証環境としてHyper-V Server 2016を構築したわけですが、Linux Serverを構築しようとした際に構築できなかったため、その際の対象法です。

事象

そもそも構築できなかったとはどういうことかというと、Hyper-V Server 2016上で仮想マシンを構築時に第2世代を選択することにより、仮想マシン起動時にOSインストールの為のisoファイルが読み込まれない事象が発生します。

そのため、OSのインストール作業が始められない状態となります。

network-image

原因

Hyper-Vの仕様として、仮想マシンの世代を第2世代としている場合、セキュアブートが規定で有効かつ、セキュアブート用に読み込むテンプレートがWindows用のもののため、Linuxがブートでできません。

そのため、何かしらの方法でセキュアブートを無効にするか、Microsoftが発行している証明機関 (CA)を利用したテンプレートへ変更してあげる必要があります。

  • 逆にWindows 8 以降のOSであれば問題なくインストールできます。
  • そもそもセキュアブートに対応していない、ディストリビューションや少し古めのバージョンの場合は、無効一択になります。
  • Windows 7 64bitの場合も無効にする必要があります。

問題

ようやく本題に入ります。

原因はセキュアブートで対処方法もハッキリしているので、画面からポチポチと設定変更をしてあげればいい訳です、 本来は!

ですが、画面から操作しようとすると、以下のように「プロパティ ‘BindToHostTpm’ がクラス ‘Msvm_SecuritySettingData’ に存在しません。」と表示され操作できません。

network-image

みんな大好きGoogle先生に質問してみたところ、現在の最新版Windows10とWindows Server 2016とで発生するバグのようですね。

ちなみに、それぞれのOSバージョンは以下の通りです。

クライアント端末(Windwos 10)

> [System.Environment]::OSVersion

Platform ServicePack Version      VersionString
-------- ----------- -------      -------------
 Win32NT             10.0.17134.0 Microsoft Windows NT 10.0.17134.0

Hyper-V Server 2016

> [System.Environment]::OSVersion

Platform ServicePack Version      VersionString
-------- ----------- -------      -------------
 Win32NT             10.0.14393.0 Microsoft Windows NT 10.0.14393.0

分かりやすくまとめると以下の通りです。

OSbuildversionアップデート名
Windows1010.0.17134.01803April 2018 Update
Hyper-V Server10.0.14393.01607Anniversary Update

こうしてみるとバージョンが1年半くらい離れていることが分かります。

解決方法

解決方法は至って単純で、GUIで解決できないならPowerShellを使って設定を変更してしまおうというものです。

セキュアブートを無効にするパターン

変更対象の仮想マシンが停止中であることを確認し、以下のコマンドを実行します。

Set-VMFirmware -VMName <仮想マシン名> -ComputerName <Hyper-Vホスト名> -EnableSecureBoot off

以下のコマンドを実行し、結果が「OFF」となっていれば無効になっています。

> Get-VMFirmware -VMName <仮想マシン名> -ComputerName <Hyper-Vホスト名> | select SecureBoot

SecureBoot
----------
       Off

セキュアブートの使用するテンプレートを変更するパターン

現在使用しているテンプレートを確認します。

> Get-VMFirmware -VMName <仮想マシン名> -ComputerName <Hyper-Vホスト名> |select SecureBoot*

SecureBoot SecureBootTemplateId                 SecureBootTemplate
---------- --------------------                 ------------------
        On 1734c6e8-3154-4dda-ba5f-a874cc483422 MicrosoftWindows

セキュアブートが有効かつ「MicrosoftWindows」というテンプレートが使用されていることが分かります。

では使用するテンプレートを変更・・・の前に、使用できるテンプレートを確認します。

確認には以下のコマンドを使用します。

> Get-VMHost -ComputerName <Hyper-Vホスト名> | select SecureBootTemplates

SecureBootTemplates
-------------------
{MicrosoftWindows, MicrosoftUEFICertificateAuthority}

確認結果から「MicrosoftWindows」と「MicrosoftUEFICertificateAuthority」というテンプレートが使用できることが分かります。

では、変更を行います。

Set-VMFirmware -VMName <仮想マシン名> -ComputerName <Hyper-Vホスト名> -SecureBootTemplate 'MicrosoftUEFICertificateAuthority'

設定が変更されたことを確認します。

> get-VMFirmware -VMName <仮想マシン名> -ComputerName <Hyper-Vホスト名> |select SecureBoot*

SecureBoot SecureBootTemplateId                 SecureBootTemplate
---------- --------------------                 ------------------
        On 272e7447-90a4-4563-a4b9-8e4ab00526ce MicrosoftUEFICertificateAuthority

無事、変更されていますね。

これで問題なくLinuxOSをインストールできますね!

でもこれからも、度々こういう問題起こるんだろうな・・・。

参考URL


comments powered by Disqus