Hyper-V 내의 VM에서 다시 Hyper-V를 설치: Nested Virtualization
최근 지인의 Facebook을 통해 알게 된 재미있는 사실이 하나 있습니다. ^^
Tuesdays with Corey: M-Series and Nested Virtualization on Azure
; https://channel9.msdn.com/Shows/Tuesdays-With-Corey/Tuesdays-with-Corey-M-Series-and-Nested-Virtualization-on-Azure
저걸 보면서... Azure에도 있는데, 혹시 Windows 운영체제의 Hyper-V에도 있지 않을까... 하는 생각에 찾아봤더니 역시나 있었습니다.
가상화안에 또 다른 가상화를, Nested Virtualization
; https://docs.microsoft.com/en-us/archive/blogs/koalra/nested-virtualization
즉, 윈도우 운영체제에 내장된 Hyper-V에서는 벌써부터 중첩 가상화가 지원되었던 것입니다. 단지, 그다지 사용 사례가 많지 않을 거라 생각했는지 Hyper-V 관리 콘솔에서의 설정은 지원되지 않고 Powershell로 명시적으로 활성화시켜야만 합니다.
가령 제 컴퓨터의 Hyper-V에 설치한 win10en64라는 VM에 중첩 가상화가 설정되어 있는지 다음의 명령어로 확인할 수 있습니다.
PS C:\WINDOWS\system32> GET-VMProcessor -VMName win10en64 | Format-List *
VMCheckpointId : 00000000-0000-0000-0000-000000000000
VMCheckpointName :
ResourcePoolName : Primordial
Count : 4
CompatibilityForMigrationEnabled : False
CompatibilityForOlderOperatingSystemsEnabled : False
HwThreadCountPerCore : 1
ExposeVirtualizationExtensions : False
Maximum : 100
Reserve : 0
RelativeWeight : 100
MaximumCountPerNumaNode : 8
MaximumCountPerNumaSocket : 1
EnableHostResourceProtection : False
OperationalStatus : {}
StatusDescription : {}
Name : Processor
Id : Microsoft:CCD4E0B9-8880-4557-AE8E-FCCA2A29AFF2\b637f346-6a0e-4dec-af52-bd70cb80a21d\0
VMId : ccd4e0b9-8880-4557-ae8e-fcca2a29aff2
VMName : win10en64
VMSnapshotId : 00000000-0000-0000-0000-000000000000
VMSnapshotName :
CimSession : CimSession: .
ComputerName : TESTPC
IsDeleted : False
ExposeVirtualizationExtensions 설정이 False로 되어 있는데, 이를 다음의 명령어로 True로 바꿔주면 중첩 가상화가 활성화됩니다.
PS C:\WINDOWS\system32> Set-VMProcessor -VMNAME win10en64 -ExposeVirtualizationExtensions:$True
참고로, 해당 VM이 실행 중이면 다음과 같은 예외가 발생하니,
Set-VMProcessor : Failed to modify device 'Processor'.
Cannot change the processor functionality of a virtual machine now.
'win10en64' failed to modify device 'Processor'. (Virtual machine ID CCD4E0B9-8880-4557-AE8E-FCCA2A29AFF2)
Cannot change the processor functionality of virtual machine 'win10en64' while it is running. (Virtual machine ID CCD4E0B9-8880-4557-AE8E-FCCA2A29AFF2)
At line:2 char:2
+ Set-VMProcessor -VMNAME win10en64 -ExposeVirtualizationExtensions:$T ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Set-VMProcessor], VirtualizationException
+ FullyQualifiedErrorId : InvalidState,Microsoft.HyperV.PowerShell.Commands.SetVMProcessor
반드시 VM을 끄고 합니다.
ExposeVirtualizationExtensions 설정을 활성화했으면, 해당 VM 내에서 다시 Hyper-V 구성 요소를 설치하는 것이 가능합니다. 제약 조건은, 그 VM의 운영체제가 Windows 10 TH2(10576+) 이상이어야 한다는 점입니다.
당연하지만, Hyper-V뿐만 아니라 VirtualBox 역시 설치할 수 있습니다. 실제로, 테스트를 위해 ExposeVirtualizationExtensions == False 상태의 VM에서 VirtualBox를 설치해 가상 VM을 생성하려고 시도해봤습니다. 물론 이대로는 다음과 같은 오류가 발생합니다.
가상 머신 xxx의 세션을 열 수 없습니다.
VT-x is not available (VERR_VMX_NO_VMX).
결과 코드:
E_FAIL (0x80004005)
구성 요소:
ConsoleWrap
인터페이스:
IConsole {872da645-4a9b-1727-bee2-5585105b9eed}
재미있는 것은, 해당 VM의 메모리 설정을 4GB에서 2GB로 낮추면 다음과 같은 메시지만 뜰 뿐,
"
시스템에서 VT-x/AMD-V 하드웨어 가속을 사용할 수 없습니다. OS/2나 QNX같은 일부 게스트 운영 체제는 이 기능이 필요하며, 사용하지 않으면 부팅할 수 없습니다.
"
"계속" 버튼을 누르면 VM 생성 단계로 넘어간다는 점입니다. 하지만, VirtualBox.exe 프로세스 사용률이 25%로 올라만 갈 뿐 더 이상 진전이 없습니다. 왜냐하면, 어쨌든 Hyper-V 내의 VM에서는 VirtualBox를 다시 띄워서 가상 머신을 생성할 수 없기 때문입니다.
반면, ExposeVirtualizationExtensions == True 상태로 바꿔주면 VM 내의 VirtualBox에서도 다시 VM을 설치하는 데 문제가 없습니다.
(그렇긴 한데, 안정성 측면에서 봤을 때 VirtualBox보다는 역시 Hyper-V를 중첩해서 이용하는 것이 더 나을 듯합니다. ^^)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]