Overview
KVM(Kernel-based Virtual Machine)에서 중첩 가상화(Nested Virtualization)는 가상 머신(VM) 내부에서 또 다른 VM을 실행할 수 있게 해주는 기능이다. 이는 가상화 환경을 테스트하거나 CI/CD, 클라우드 플랫폼 테스트, 개발 환경 구축 등에서 유용하게 사용된다.
이 문서에서는 KVM 호스트에서 중첩 가상화를 활성화하고, 게스트 VM에서도 가상화를 사용할 수 있도록 설정하는 방법을 단계별로 안내한다.
📅 관련 글
2022.08.08 - [Understand different OS Concepts/Virtualization] - KVM과 QEMU란? (Linux 가상화 솔루션)
2022.08.08 - [Understand different OS Concepts/Virtualization] - Libvirt란? (Linux 가상화 관리 도구)
2022.08.12 - [Understand different OS Concepts/Virtualization] - Libvirt virsh 명령어 정리
VT-x(Intel Virtualization Technology) 이해
VT-x란?
VT-x는 Intel CPU에서 제공하는 하드웨어 가상화 기술로, 게스트 운영체제가 직접 하드웨어에 접근할 수 있도록 지원하는 기능이다.
주요 구성 요소
- VMX (Virtual Machine Extensions): 가상화를 위한 CPU 확장 명령어
- EPT (Extended Page Tables): 메모리 가상화 최적화
- VPID (Virtual Processor ID): TLB 플러시 오버헤드 감소
- VT-d: I/O 장치 가상화 지원
BIOS/UEFI에서 VT-x 확인 및 활성화
1. BIOS/UEFI 진입
- 시스템 부팅 시 F2, F12, Del 키 등을 눌러 BIOS/UEFI 설정 진입
- 제조사별로 키가 다를 수 있음
2. VT-x 설정 위치
- Advanced → CPU Configuration → Intel Virtualization Technology
- Processor → Intel VT-x
- Security → Virtualization → VT-x
3. 관련 설정 항목들
- Intel VT-x Technology: [Enabled]
- Intel VT-d Technology: [Enabled] (I/O 가상화)
- Execute Disable Bit: [Enabled]
CPU가 가상화를 지원하는지 확인
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 46 bits physical, 48 bits virtual
CPU(s): 72
On-line CPU(s) list: 0-71
Thread(s) per core: 2
Core(s) per socket: 18
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 79
Model name: Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz
Stepping: 1
CPU MHz: 1367.142
CPU max MHz: 3600.0000
CPU min MHz: 1200.0000
BogoMIPS: 4594.55
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 46080K
NUMA node0 CPU(s): 0-17,36-53
NUMA node1 CPU(s): 18-35,54-71
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap intel_pt xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
- Flags 항목에서 Intel CPU는 vmx, AMD CPU는 svm 플래그가 있는지 확인
KVM 호스트에서 커널 모듈 로드 상태 확인
현재 로드된 모듈 확인
lsmod | grep kvm
정상적으로 로드된 예시
kvm_intel 487424 18
kvm 1404928 13 kvm_intel
irqbypass 12288 1 kvm
모듈이 로드되지 않은 경우 예시
$ lsmod | grep kvm
# (아무 출력 없음)
KVM 게스트가 가상화를 지원하는지 확인
중첩 기능을 활성화한 KVM 게스트 머신의 전원을 켜고 로그인한다.
KVM 게스트의 터미널에서 다음 명령을 실행하여 가상화가 활성화되었는지 여부를 확인한다.
$ egrep --color -i "svm|vmx" /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap intel_pt xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap intel_pt xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
호스트에서 중첩 가상화 활성화
기존 KVM 모듈 언로드
다음으로 KVM 모듈을 언로드 한다.
INTEL 시스템
$ sudo modprobe -r kvm_intel
AMD 시스템
$ sudo modprobe -r kvm_amd
`nested=1` 옵션으로 모듈 재로드
INTEL 시스템
$ sudo modprobe kvm_intel nested=1
AMD 시스템
$ sudo modprobe kvm_amd nested=1
중첩 가상화 영구 적용
중첩된 VT 기능은 KVM 호스트 시스템을 재부팅할 때까지만 활성화된다.
중첩 기능을 영구적으로 활성화하려면 `/etc/modprobe.d/kvm.conf` 파일 을 편집하면 된다.
$ sudo vi /etc/modprobe.d/kvm.conf
파일이 없으면 그냥 만들면 된다.
INTEL 호스트 에 다음 줄을 추가 한다.
options kvm_intel nested=1
AMD 호스트 에 다음 줄을 추가 한다.
options kvm_amd nested=1
- 파일을 저장하고 닫는다.
- 완료! KVM 호스트 시스템에서 중첩 VT를 활성화했다.
중첩 가상화 활성화 여부 확인 (호스트)
프로세서가 INTEL인 경우 `cat` 명령 을 사용하여 `sys/module/kvm_intel/parameters/nested` 파일을 확인하면 된다.
$ cat /sys/module/kvm_intel/parameters/nested
Y
On INTEL CPU
$ modinfo kvm_intel | grep -i nested
결과
parm: nested_early_check:bool
parm: nested:bool
On AMD CPU
$ modinfo kvm_amd | grep -i nested
게스트 VM에서 중첩 가상화 활성화
방법 A: virsh CLI 이용
$ virsh
virsh # list --all
virsh # edit <vm-이름>
CPU 설정 부분에서 아래와 같이 변경한다.
<cpu mode='host-passthrough' check='none'>
<feature policy='require' name='vmx'/>
</cpu>
- VM을 저장하고 종료한 후 다시 시작한다.
방법 B: Virt-Manager 사용
- Virt-Manager 실행
- 해당 VM → 오른쪽 클릭 → 열기(Open) → 세부정보(Details)
- 프로세서(Processor) 탭 이동
- CPU 모드를 host-passthrough로 설정
- 적용 후 VM 재부팅
게스트에서 중첩가상화 확인
# 게스트 VM 내부에서 실행
$ egrep --color -i "vmx" /proc/cpuinfo
flags: ... vmx ...
# 중첩 가상화 지원 확인
$ cat /sys/module/kvm_intel/parameters/nested
Y
VT-x 고급 기능 설정
EPT(Extended Page Tables) 활성화
<cpu mode='host-passthrough' check='none'>
<feature policy='require' name='vmx'/>
<feature policy='require' name='ept'/>
</cpu>
VPID(Virtual Processor ID) 활성화
<cpu mode='host-passthrough' check='none'>
<feature policy='require' name='vmx'/>
<feature policy='require' name='vpid'/>
</cpu>
종합 설정 (권장)
<cpu mode='host-passthrough' check='none' migratable='on'>
<feature policy='require' name='vmx'/>
<feature policy='require' name='ept'/>
<feature policy='require' name='vpid'/>
<feature policy='require' name='unrestricted_guest'/>
</cpu>
VT-x 성능 최적화 팁
NUMA 최적화
<cpu mode='host-passthrough'>
<numa>
<cell id='0' cpus='0-7' memory='8388608' unit='KiB'/>
</numa>
</cpu>
CPU 핀닝 (CPU Pinning)
<vcpu placement='static' cpuset='0-7'>8</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='0'/>
<vcpupin vcpu='1' cpuset='1'/>
<vcpupin vcpu='2' cpuset='2'/>
<vcpupin vcpu='3' cpuset='3'/>
</cputune>
하이퍼스레딩 고려
# 하이퍼스레딩 확인
$ lscpu | grep "Thread(s) per core"
Thread(s) per core: 2
# 물리 코어만 사용하는 설정
<vcpu placement='static' cpuset='0,2,4,6'>4</vcpu>
중첩 가상화 성능 모니터링
VT-x 기능 활용 확인
# 게스트에서 VT-x 기능 확인
$ dmesg | grep -i "kvm\|vmx"
kvm: using vector-hashing linked list to track 1024 VTs
kvm: VM_EXIT reason: 0x2 (VMCALL)
성능 측정
# 중첩 VM 성능 테스트
$ time dd if=/dev/zero of=/tmp/test bs=1M count=1000
# CPU 성능 벤치마크
$ sysbench cpu --cpu-max-prime=20000 run
문제 해결 (Troubleshooting)
1. VT-x 활성화 실패
# 에러 메시지 확인
$ dmesg | grep -i "kvm\|vmx"
kvm: disabled by bios
# 해결책: BIOS에서 VT-x 활성화 필요
2. 중첩 가상화 미지원
# 중첩 지원 확인
$ cat /sys/module/kvm_intel/parameters/nested
N
# 해결책: 모듈 재로드
$ sudo modprobe -r kvm_intel
$ sudo modprobe kvm_intel nested=1
3. 게스트에서 VT-x 미인식
# 게스트 CPU 설정 확인
$ virsh dumpxml vm-name | grep -A5 -B5 cpu
# CPU 모드 변경 필요
<cpu mode='host-passthrough' check='none'>
<feature policy='require' name='vmx'/>
</cpu>
QEMU/KVM 직접 실행 시 VT-x 설정
1. 기본 중첩 가상화
qemu-system-x86_64 \
-enable-kvm \
-cpu host,+vmx \
-m 4096 \
-smp 4 \
disk.qcow2
2. 고급 VT-x 기능 활성화
qemu-system-x86_64 \
-enable-kvm \
-cpu host,+vmx,+ept,+vpid,+unrestricted-guest \
-m 4096 \
-smp 4 \
disk.qcow2
보안 고려사항
1. 중첩 가상화 보안 위험
- VM Escape: 중첩 환경에서 탈출 위험 증가
- Side-channel 공격: 하드웨어 기능 노출로 인한 정보 유출
- 리소스 고갈: 과도한 중첩으로 인한 DoS
2. 보안 강화 방법
<!-- 불필요한 기능 비활성화 -->
<cpu mode='host-passthrough'>
<feature policy='disable' name='invtsc'/>
<feature policy='disable' name='amd-stibp'/>
</cpu>
마무리
KVM에서 중첩 가상화를 활성화하면 게스트 VM 안에서 또 다른 가상 환경을 실행할 수 있어 개발 및 테스트 환경 구축에 매우 유용하다.
하드웨어가 이를 지원하는지 확인하고, 호스트 및 게스트 VM에서 각각 설정을 적용하면 된다. `lscpu`, `modinfo`, `virsh` 같은 도구를 활용해 상태를 점검하고, 필요 시 Virt-Manager에서도 손쉽게 설정이 가능하다.
DevOps, 클라우드 테스트, 컨테이너 기반 가상화 실습 등 다양한 목적에 맞춰 활용해 보자!
Reference
- https://ostechnix.com/how-to-enable-nested-virtualization-in-kvm-in-linux/
- https://wiki.libvirt.org
- https://docs.fedoraproject.org
'Virtualization' 카테고리의 다른 글
| Proxmox란? (0) | 2024.05.24 |
|---|---|
| Xen Orchestra란? (0) | 2024.05.21 |
| Libvirt virsh 명령어 정리 (0) | 2022.08.12 |
| Libvirt란? (Linux 가상화 관리 도구) (0) | 2022.08.08 |
| KVM과 QEMU란? (Linux 가상화 솔루션) (0) | 2022.08.08 |