Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)
(시리즈 글이 10개 있습니다.)
Windows: 63. 윈도우 서버 2012 - Hyper-V의 새로운 기능 Live Migration
; https://www.sysnet.pe.kr/2/0/1356

개발 환경 구성: 211. Hyper-V - Generation 2 유형의 VM 생성 시 ISO 부팅이 안된다면?
; https://www.sysnet.pe.kr/2/0/1603

개발 환경 구성: 236. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법
; https://www.sysnet.pe.kr/2/0/1742

개발 환경 구성: 317. Hyper-V 내의 VM에서 다시 Hyper-V를 설치: Nested Virtualization
; https://www.sysnet.pe.kr/2/0/11218

개발 환경 구성: 405. Hyper-V 가상 머신에서 직렬 포트(Serial Port, COM Port) 사용
; https://www.sysnet.pe.kr/2/0/11720

.NET Framework: 798. C# - Hyper-V 가상 머신의 직렬 포트와 연결된 Named Pipe 간의 통신
; https://www.sysnet.pe.kr/2/0/11722

디버깅 기술: 169. Hyper-V의 VM에 대한 메모리 덤프를 뜨는 방법
; https://www.sysnet.pe.kr/2/0/12284

개발 환경 구성: 608. Hyper-V 가상 머신에 Console 모드로 로그인하는 방법
; https://www.sysnet.pe.kr/2/0/12859

개발 환경 구성: 664. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/13246

Windows: 259. Hyper-V Generation 1 유형의 VM을 Generation 2 유형으로 바꾸는 방법
; https://www.sysnet.pe.kr/2/0/13564




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로 낮추면 다음과 같은 메시지만 뜰 뿐,

nested_virtual_1.png

"
시스템에서 VT-x/AMD-V 하드웨어 가속을 사용할 수 없습니다. OS/2나 QNX같은 일부 게스트 운영 체제는 이 기능이 필요하며, 사용하지 않으면 부팅할 수 없습니다.
"


"계속" 버튼을 누르면 VM 생성 단계로 넘어간다는 점입니다. 하지만, VirtualBox.exe 프로세스 사용률이 25%로 올라만 갈 뿐 더 이상 진전이 없습니다. 왜냐하면, 어쨌든 Hyper-V 내의 VM에서는 VirtualBox를 다시 띄워서 가상 머신을 생성할 수 없기 때문입니다.

반면, ExposeVirtualizationExtensions == True 상태로 바꿔주면 VM 내의 VirtualBox에서도 다시 VM을 설치하는 데 문제가 없습니다.

(그렇긴 한데, 안정성 측면에서 봤을 때 VirtualBox보다는 역시 Hyper-V를 중첩해서 이용하는 것이 더 나을 듯합니다. ^^)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/9/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  47  48  49  50  51  52  53  54  [55]  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12251정성태7/1/202011040.NET Framework: 920. C# - 파일의 비동기 처리 유무에 따른 스레드 상황 [1]파일 다운로드2
12250정성태6/30/202013672.NET Framework: 919. C# - 닷넷에서의 진정한 비동기 호출을 가능케 하는 I/O 스레드 사용법 [1]파일 다운로드1
12249정성태6/29/20209815오류 유형: 625. Microsoft SQL Server 2019 RC1 Setup - 설치 제거 시 Warning 26003 오류 발생
12248정성태6/29/20208234오류 유형: 624. SQL 서버 오류 - service-specific error code 17051
12247정성태6/29/20209764.NET Framework: 918. C# - 불린 형 상수를 반환값으로 포함하는 3항 연산자 사용 시 단축 표현 권장(IDE0075) [2]파일 다운로드1
12246정성태6/29/202010565.NET Framework: 917. C# - USB 관련 ETW(Event Tracing for Windows)를 이용한 키보드 입력을 감지하는 방법
12245정성태6/24/202011039.NET Framework: 916. C# - Task.Yield 사용법 (2) [2]파일 다운로드1
12244정성태6/24/202010863.NET Framework: 915. ETW(Event Tracing for Windows)를 이용한 닷넷 프로그램의 내부 이벤트 활용 [1]파일 다운로드1
12243정성태6/23/20208445VS.NET IDE: 147. Visual C++ 프로젝트 - .NET Core EXE를 "Debugger Type"으로 지원하는 기능 추가
12242정성태6/23/20209174오류 유형: 623. AADSTS90072 - User account '...' from identity provider 'live.com' does not exist in tenant 'Microsoft Services'
12241정성태6/23/202012528.NET Framework: 914. C# - Task.Yield 사용법파일 다운로드1
12240정성태6/23/202013821오류 유형: 622. 소켓 바인딩 시 "System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions" 오류 발생
12239정성태6/21/202010217Linux: 30. (윈도우라면 DLL에 속하는) .so 파일이 텍스트로 구성된 사례 [1]
12238정성태6/21/202010188.NET Framework: 913. C# - SharpDX + DXGI를 이용한 윈도우 화면 캡처 라이브러리
12237정성태6/20/20209958.NET Framework: 912. 리눅스 환경의 .NET Core에서 "test".IndexOf("\0")가 0을 반환
12236정성태6/19/202010345오류 유형: 621. .NET Standard 대상으로 빌드 시 dynamic 예약어에서 컴파일 오류 - error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
12235정성태6/19/20209968오류 유형: 620. Windows 10 - Inaccessible boot device 블루 스크린
12234정성태6/19/20209692개발 환경 구성: 494. NuGet - nuspec의 패키지 스키마 버전(네임스페이스) 업데이트 방법
12233정성태6/19/20209372오류 유형: 619. SQL 서버 - The transaction log for database '...' is full due to 'LOG_BACKUP'. - 두 번째 이야기
12232정성태6/19/20208326오류 유형: 618. SharePoint - StoreBusyRetryLater 오류
12231정성태6/15/202010748.NET Framework: 911. Console/Service Application을 위한 SynchronizationContext - AsyncContext
12230정성태6/15/202010112오류 유형: 617. IMetaDataImport::GetMethodProps가 반환하는 IL 코드 주소(RVA) 문제
12229정성태6/13/202011982.NET Framework: 910. USB/IP PROJECT를 이용해 C#으로 USB Keyboard + Mouse 가상 장치 만들기 [1]
12228정성태6/12/202012078.NET Framework: 909. C# - Source Generator를 적용한 XmlCodeGenerator파일 다운로드1
12227정성태6/12/202016038오류 유형: 616. Visual Studio의 느린 업데이트 속도에 대한 원인 분석 [5]
12226정성태6/11/202013342개발 환경 구성: 493. OpenVPN의 네트워크 구성 [4]파일 다운로드1
... 46  47  48  49  50  51  52  53  54  [55]  56  57  58  59  60  ...