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)
12278정성태7/23/20209463VS.NET IDE: 149. ("Binary was not built with debug information" 상태로) 소스 코드 디버깅이 안되는 경우
12277정성태7/23/202010903개발 환경 구성: 498. DEVPATH 환경 변수의 사용 예 - .NET Reflector의 (PDB 연결이 없는) DLL의 소스 코드 디버깅
12276정성태7/23/202010114.NET Framework: 930. 개발자를 위한 닷넷 어셈블리 바인딩 - DEVPATH 환경 변수
12275정성태7/22/202012647개발 환경 구성: 497. 닷넷에서 접근해보는 InterSystems의 IRIS Data Platform 데이터베이스파일 다운로드1
12274정성태7/21/202012045개발 환경 구성: 496. Azure - Blob Storage Account의 Location 이전 방법 [1]파일 다운로드1
12273정성태7/18/202013677개발 환경 구성: 495. Azure - Location이 다른 웹/DB 서버의 경우 발생하는 성능 하락
12272정성태7/16/20208656.NET Framework: 929. (StrongName의 버전 구분이 필요 없는) .NET Core 어셈블리 바인딩 규칙 [2]파일 다운로드1
12271정성태7/16/202010717.NET Framework: 928. .NET Framework의 Strong-named 어셈블리 바인딩 (2) - 런타임에 바인딩 리디렉션파일 다운로드1
12270정성태7/16/202011545오류 유형: 633. SSL_CTX_use_certificate_file - error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
12269정성태7/16/20208555오류 유형: 632. .NET Core 웹 응용 프로그램 - The process was terminated due to an unhandled exception.
12268정성태7/15/202010709오류 유형: 631. .NET Core 웹 응용 프로그램 오류 - HTTP Error 500.35 - ANCM Multiple In-Process Applications in same Process
12267정성태7/15/202012380.NET Framework: 927. C# - 윈도우 프로그램에서 Credential Manager를 이용한 보안 정보 저장파일 다운로드1
12266정성태7/14/202010086오류 유형: 630. 사용자 계정을 지정해 CreateService API로 서비스를 등록한 경우 "Error 1069: The service did not start due to a logon failure." 오류발생
12265정성태7/10/20209236오류 유형: 629. Visual Studio - 웹 애플리케이션 실행 시 "Unable to connect to web server 'IIS Express'." 오류 발생
12264정성태7/9/202018304오류 유형: 628. docker: Error response from daemon: Conflict. The container name "..." is already in use by container "...".
12261정성태7/9/202011224VS.NET IDE: 148. 윈도우 10에서 .NET Core 응용 프로그램을 리눅스 환경에서 실행하는 2가지 방법 - docker, WSL 2 [5]
12260정성태7/8/20209625.NET Framework: 926. C# - ETW를 이용한 ThreadPool 스레드 감시파일 다운로드1
12259정성태7/8/20209167오류 유형: 627. nvlddmkm.sys의 BAD_POOL_HEADER BSOD 문제 [1]
12258정성태7/8/202012322기타: 77. DataDog APM 간략 소개
12257정성태7/7/20209342.NET Framework: 925. C# - ETW를 이용한 Monitor Enter/Exit 감시파일 다운로드1
12256정성태7/7/20209754.NET Framework: 924. C# - Reflection으로 변경할 수 없는 readonly 정적 필드 [4]
12255정성태7/6/202010180.NET Framework: 923. C# - ETW(Event Tracing for Windows)를 이용한 Finalizer 실행 감시파일 다운로드1
12254정성태7/2/202010032오류 유형: 626. git - REMOTE HOST IDENTIFICATION HAS CHANGED!
12253정성태7/2/202011096.NET Framework: 922. C# - .NET ThreadPool의 Local/Global Queue파일 다운로드1
12252정성태7/2/202013068.NET Framework: 921. C# - I/O 스레드를 사용한 비동기 소켓 서버/클라이언트파일 다운로드2
12251정성태7/1/202011040.NET Framework: 920. C# - 파일의 비동기 처리 유무에 따른 스레드 상황 [1]파일 다운로드2
... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...