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

비밀번호

댓글 작성자
 




1  2  [3]  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13567정성태2/27/20241836오류 유형: 898. .NET Framework 3.5 이하에서 mscoree.tlb 참조 시 System.BadImageFormatException파일 다운로드1
13566정성태2/27/20241892오류 유형: 897. Windows 7 SDK 설치 시 ".NET Development" 옵션이 비활성으로 선택이 안 되는 경우
13565정성태2/23/20241734닷넷: 2219. .NET CLR2 보안 모델에서의 개별 System.Security.Permissions 제어
13564정성태2/22/20241978Windows: 259. Hyper-V Generation 1 유형의 VM을 Generation 2 유형으로 바꾸는 방법
13563정성태2/21/20241961디버깅 기술: 196. windbg - async/await 비동기인 경우 메모리 덤프 분석의 어려움
13562정성태2/21/20242007오류 유형: 896. ASP.NET - .NET Framework 기본 예제에서 System.Web에 대한 System.IO.FileNotFoundException 예외 발생
13561정성태2/20/20242082닷넷: 2218. C# - (예를 들어, Socket) 비동기 I/O에 대한 await 호출 시 CancellationToken을 이용한 취소파일 다운로드1
13560정성태2/19/20242129디버깅 기술: 195. windbg 분석 사례 - Semaphore 잠금으로 인한 Hang 현상 (닷넷)
13559정성태2/19/20242954오류 유형: 895. ASP.NET - System.Security.SecurityException: 'Requested registry access is not allowed.'
13558정성태2/18/20242204닷넷: 2217. C# - 최댓값이 1인 SemaphoreSlim 보다 Mutex 또는 lock(obj)를 선택하는 것이 나은 이유
13557정성태2/18/20241941Windows: 258. Task Scheduler의 Author 속성 값을 변경하는 방법
13556정성태2/17/20242002Windows: 257. Windows - Symbolic (hard/soft) Link 및 Junction 차이점
13555정성태2/15/20242152닷넷: 2216. C# - SemaphoreSlim 사용 시 주의점
13554정성태2/15/20241875VS.NET IDE: 189. Visual Studio - 닷넷 소스코드 디컴파일 찾기가 안 될 때
13553정성태2/14/20241967닷넷: 2215. windbg - thin/fat lock 없이 동작하는 Monitor.Wait + Pulse
13552정성태2/13/20241916닷넷: 2214. windbg - Monitor.Enter의 thin lock과 fat lock
13551정성태2/12/20242107닷넷: 2213. ASP.NET/Core 웹 응용 프로그램 - 2차 스레드의 예외로 인한 비정상 종료
13550정성태2/11/20242271Windows: 256. C# - Server socket이 닫히면 Accept 시켰던 자식 소켓이 닫힐까요?
13549정성태2/3/20242731개발 환경 구성: 706. C# - 컨테이너에서 실행하기 위한 (소켓) 콘솔 프로젝트 구성
13548정성태2/1/20242532개발 환경 구성: 705. "Docker Desktop for Windows" - ASP.NET Core 응용 프로그램의 소켓 주소 바인딩(IPv4/IPv6 loopback, Any)
13547정성태1/31/20242317개발 환경 구성: 704. Visual Studio - .NET 8 프로젝트부터 dockerfile에 추가된 "USER app" 설정
13546정성태1/30/20242156Windows: 255. (디버거의 영향 등으로) 대상 프로세스가 멈추면 Socket KeepAlive로 연결이 끊길까요?
13545정성태1/30/20242007닷넷: 2212. ASP.NET Core - 우선순위에 따른 HTTP/HTTPS 호스트:포트 바인딩 방법
13544정성태1/30/20242033오류 유형: 894. Microsoft.Data.SqlClient - Could not load file or assembly 'System.Security.Permissions, ...'
13543정성태1/30/20242065Windows: 254. Windows - 기본 사용 중인 5357 포트 비활성화는 방법
13542정성태1/30/20242084오류 유형: 893. Visual Studio - Web Application을 실행하지 못하는 IISExpress - 두 번째 이야기
1  2  [3]  4  5  6  7  8  9  10  11  12  13  14  15  ...