Windows10 Hyper-Vは非常に便利で、現在のノートPCスペックとかでは当たり前の
くらいであればWindwos10 Hyper-V上に、複数のWindows Server評価版を動作させて
といった検証環境を動作させることも可能です
Hyper-V上にHyper-Vを構築することをNested(ネスト)という
ハイパーバイザ上にハイパーバイザを構築することができれば、1台の物理マシン上でなんでもできるようになります
このハイパーバイザ上にハイパーバイザを構築することをネスト(Nested hyper-V)といいます
Windows 10 Nested Hyper-Vを行おうとするとエラーメッセージが出る
しかし、Windows10にインストールした、Windows Server 2016でいざHyper-V役割を有効化しようとすると
- 機能をインストールしようとしているサーバーで問題が検出されました。選択した機能は、選択肢たサーバーの現在の構成と互換性がありません。[OK]をクリックして別の機能を選択してください
- Hyper-Vをインストールできません:必要な仮想化機能がプロセッサにありません
というエラーメッセージが出力されます
対応方法
ほぼおまじないに近いのですが
といった対応でWindows10 Nested Hyper-Vが完成します
スクリプト入手
こちらのURLの本文をそのまま「enable-NestedVm.ps1」で保存します
* スクリプトの中身は本記事末尾に記載しているものでもOKです。上記URLと同一内容です
スクリプト実行
PowerShellを管理者権限で起動します
スクリプトを実行します
- .\enable-NestedVm.ps1 [ゲストOS名]
- 最初の質問には「Y」
- 2番めの質問には「N」
今回「hcihost1」というVMがHper-V利用可能にするためには .\enable-NestedVm.ps1 hcihost1 と指定実行します
1番めの質問には必ず「Y」で返答してください。Nだと何もしないで終了します
2番めの質問に「Y」で返答すると、選択し仮想マシンのメモリサイズが4GBに強制変更されます。それが嫌なら「N」で
PS D:\LocalHyeprV> .\enable-NestedVm.ps1 hcihost1 This script will set the following for hcihost1 in order to enable nesting: Dynamic memory will be disabled Optionally set vm memory to 4GB Input Y to accept or N to cancel:Y VM memory is set less than 4GB, without 4GB or more, you may not be able to start VMs. Would you like to set Vm memory to 4GB? (Y/N)N Not setting Vm Memory to 4GB. PS D:\LocalHyeprV>
これで、問題なくWindows10のゲストOS上にHyper-V機能をインストールできます
スクリプト中身(enable-NestedVm.ps1)
最後にスクリプト本体です
リンク先URLが切れてしまった場合などに
そのままコピーして、「enable-NestedVm.ps1」として保存してください
- enable-NestedVm.ps1
param([string]$vmName) # # Enable-NestedVm.ps1 # # Checks VM for nesting comatability and configures if not properly setup. # # Author: Drew Cross if([string]::IsNullOrEmpty($vmName)) { Write-Host "No VM name passed" Exit; } # Constants $4GB = 4294967296 # # Need to run elevated. Do that here. # # Get the ID and security principal of the current user account $myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent(); $myWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($myWindowsID); # Get the security principal for the administrator role $adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator; # Check to see if we are currently running as an administrator if ($myWindowsPrincipal.IsInRole($adminRole)) { # We are running as an administrator, so change the title and background colour to indicate this $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"; } else { # We are not running as an administrator, so relaunch as administrator # Create a new process object that starts PowerShell $newProcess = New-Object System.Diagnostics.ProcessStartInfo "PowerShell"; # Specify the current script path and name as a parameter with added scope and support for scripts with spaces in it's path $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'" # Indicate that the process should be elevated $newProcess.Verb = "runas"; # Start the new process [System.Diagnostics.Process]::Start($newProcess) | Out-Null; # Exit from the current, unelevated, process Exit; } # # Get Vm Information # $vm = Get-VM -Name $vmName $vmInfo = New-Object PSObject # VM info Add-Member -InputObject $vmInfo NoteProperty -Name "ExposeVirtualizationExtensions" -Value $false Add-Member -InputObject $vmInfo NoteProperty -Name "DynamicMemoryEnabled" -Value $vm.DynamicMemoryEnabled Add-Member -InputObject $vmInfo NoteProperty -Name "SnapshotEnabled" -Value $false Add-Member -InputObject $vmInfo NoteProperty -Name "State" -Value $vm.State Add-Member -InputObject $vmInfo NoteProperty -Name "MacAddressSpoofing" -Value ((Get-VmNetworkAdapter -VmName $vmName).MacAddressSpoofing) Add-Member -InputObject $vmInfo NoteProperty -Name "MemorySize" -Value (Get-VMMemory -VmName $vmName).Startup # is nested enabled on this VM? $vmInfo.ExposeVirtualizationExtensions = (Get-VMProcessor -VM $vm).ExposeVirtualizationExtensions Write-Host "This script will set the following for $vmName in order to enable nesting:" $prompt = $false; # Output text for proposed actions if ($vmInfo.State -eq 'Saved') { Write-Host "\tSaved state will be removed" $prompt = $true } if ($vmInfo.State -ne 'Off' -or $vmInfo.State -eq 'Saved') { Write-Host "Vm State:" $vmInfo.State Write-Host " $vmName will be turned off" $prompt = $true } if ($vmInfo.ExposeVirtualizationExtensions -eq $false) { Write-Host " Virtualization extensions will be enabled" $prompt = $true } if ($vmInfo.DynamicMemoryEnabled -eq $true) { Write-Host " Dynamic memory will be disabled" $prompt = $true } if($vmInfo.MacAddressSpoofing -eq 'Off'){ Write-Host " Optionally enable mac address spoofing" $prompt = $true } if($vmInfo.MemorySize -lt $4GB) { Write-Host " Optionally set vm memory to 4GB" $prompt = $true } if(-not $prompt) { Write-Host " None, vm is already setup for nesting" Exit; } Write-Host "Input Y to accept or N to cancel:" -NoNewline $char = Read-Host while(-not ($char.StartsWith('Y') -or $char.StartsWith('N'))) { Write-Host "Invalid Input, Y or N" $char = Read-Host } if($char.StartsWith('Y')) { if ($vmInfo.State -eq 'Saved') { Remove-VMSavedState -VMName $vmName } if ($vmInfo.State -ne 'Off' -or $vmInfo.State -eq 'Saved') { Stop-VM -VMName $vmName } if ($vmInfo.ExposeVirtualizationExtensions -eq $false) { Set-VMProcessor -VMName $vmName -ExposeVirtualizationExtensions $true } if ($vmInfo.DynamicMemoryEnabled -eq $true) { Set-VMMemory -VMName $vmName -DynamicMemoryEnabled $false } # Optionally turn on mac spoofing if($vmInfo.MacAddressSpoofing -eq 'Off') { Write-Host "Mac Address Spoofing isn't enabled (nested guests won't have network)." -ForegroundColor Yellow Write-Host "Would you like to enable MAC address spoofing? (Y/N)" -NoNewline $input = Read-Host if($input -eq 'Y') { Set-VMNetworkAdapter -VMName $vmName -MacAddressSpoofing on } else { Write-Host "Not enabling Mac address spoofing." } } if($vmInfo.MemorySize -lt $4GB) { Write-Host "VM memory is set less than 4GB, without 4GB or more, you may not be able to start VMs." -ForegroundColor Yellow Write-Host "Would you like to set Vm memory to 4GB? (Y/N)" -NoNewline $input = Read-Host if($input -eq 'Y') { Set-VMMemory -VMName $vmName -StartupBytes $4GB } else { Write-Host "Not setting Vm Memory to 4GB." } } Exit; } if($char.StartsWith('N')) { Write-Host "Exiting..." Exit; } Write-Host 'Invalid input'
関連記事です
Windows10 Hyper-V有効化はとても簡単な手順で実施できます
Windows10 Hyper-Vでも、LinuxはもちろんWindows Server 2016仮想マシンも構築可能です
Windows10 でWindows Server系インフラ検証に必須のADインストール手順です
以上