KVM 가상화란?
KVM(Kernel-based Virtual Machine)은 리눅스 커널에 내장된 가상화 기술입니다. 리눅스 커널 자체를 하이퍼바이저로 변환하여, 하나의 물리적 서버에서 여러 개의 독립적인 가상 머신(VM)을 실행할 수 있게 해줍니다.
KVM은 Type-1 하이퍼바이저(베어메탈)의 성능을 제공하면서도, 일반 리눅스 시스템의 모든 기능을 그대로 사용할 수 있다는 장점이 있습니다. Intel VT-x나 AMD-V 같은 하드웨어 가상화 기술을 활용하여 거의 네이티브에 가까운 성능을 제공합니다.
리눅스 홈 서버에서 KVM을 사용하는 이유
자원 효율성과 격리 홈 서버 하나로 여러 서비스를 안전하게 운영할 수 있습니다. 예를 들어 웹 서버, 미디어 서버, NAS, 개발 환경 등을 각각 독립된 VM으로 분리하면, 한 서비스에 문제가 생겨도 다른 서비스에는 영향을 주지 않습니다.
실험과 학습 환경 새로운 리눅스 배포판이나 소프트웨어를 테스트할 때 매우 유용합니다. VM에서 마음껏 실험하고, 문제가 생기면 스냅샷으로 쉽게 복구하거나 VM을 삭제하면 됩니다. 실제 시스템에는 전혀 영향을 주지 않습니다.
백업과 이전성 VM은 단순한 파일 형태로 존재하므로 백업이 매우 간편합니다. 전체 VM을 다른 서버로 옮기거나, 스냅샷을 통해 특정 시점으로 복원하는 것도 쉽습니다.
보안 강화 각 서비스를 VM으로 격리하면 보안이 크게 향상됩니다. 만약 한 서비스가 해킹당하더라도 다른 VM이나 호스트 시스템으로 침투하기가 매우 어렵습니다. 특히 외부에 노출되는 서비스(웹 서버 등)를 별도 VM으로 운영하면 위험을 최소화할 수 있습니다.
다양한 OS 동시 운영 리눅스 호스트에서 Windows VM을 실행하거나, 다양한 리눅스 배포판을 동시에 운영할 수 있습니다. 홈 서버 하나로 여러 OS가 필요한 다양한 작업을 수행할 수 있습니다.
KVM은 오픈소스이고 무료이며, QEMU와 함께 사용하면 강력한 가상화 환경을 구축할 수 있습니다.
1. KVM 설치 준비 (사전 확인)
가장 먼저, CPU가 하드웨어 가상화 기술(Intel VT-x 또는 AMD-V)을 지원하는지 확인해야 합니다. 이 기술이 있어야 KVM이 커널 수준에서 효율적으로 동작합니다.
egrep -c '(vmx|svm)' /proc/cpuinfo
# 결과로 1 이상의 숫자가 출력되면 CPU가 가상화를 지원하는 것이다.
# 만약 0이 나온다면, 시스템의 BIOS/UEFI 설정에 진입하여 'Virtualization Technology' 또는 유사한 이름의 옵션을 활성화해야 한다.
2. KVM 및 필수 유틸리티 설치
다음 명령어로 KVM 구동에 필요한 핵심 패키지들을 설치합니다.
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils -y
각 패키지의 역할은 다음과 같습니다.
- qemu-kvm: KVM 커널 모듈을 활용해 가상 하드웨어를 에뮬레이션하는 핵심 백엔드이다.
- libvirt-daemon-system: 가상머신, 스토리지, 네트워크를 관리하는 백그라운드 서비스(데몬)이다.
- libvirt-clients: virsh 등 가상머신을 제어하는 클라이언트 도구 모음이다.
- virsh: 실행 중인 가상머신을 관리(시작, 종료, 콘솔 접속 등)하는 기본 도구이다.
- virtinst: virt-install 명령어를 제공하는 패키지입니다. 가상머신을 새로 생성하고 설치하는 데 필수이다.
- bridge-utils: 가상 네트워크 브리지를 생성하고 관리하는 유틸리티이다.
3. 사용자 권한 설정
매번 sudo를 사용하는 번거로움을 피하기 위해 현재 사용자를 libvirt와 kvm 그룹에 추가합니다. 이를 통해 일반 사용자 계정으로 가상머신을 관리할 수 있는 권한을 얻게 됩니다.
sudo adduser $USER libvirt
sudo adduser $USER kvm
✅ 중요: 그룹 변경 사항을 시스템에 적용하려면 로그아웃 후 다시 로그인하거나 시스템을 재부팅해야 합니다.
4. 설치 미디어(ISO) 준비
가상머신에 설치할 운영체제의 ISO 파일이 필요합니다. wget을 사용하여 Ubuntu 24.04 서버 ISO 파일을 홈 디렉토리로 다운로드합니다.
cd ~
# 우분투 릴리스 페이지를 먼저 확인
curl -s https://releases.ubuntu.com/24.04/ | grep -i "server.*iso"
# 다운로드
wget https://releases.ubuntu.com/24.04/ubuntu-24.04.2-live-server-amd64.iso
libvirt-qemu 사용자가 접근할 수 있도록 /home 폴더로 ISO 파일을 옮깁니다.
sudo mv ubuntu-24.04.2-live-server-amd64.iso /home/
# 스토리지 풀 디렉토리 생성
sudo mkdir -p /var/kvm/images
5. virt-install로 가상머신 생성 및 VirtIO 적용
이제 virt-install 명령어를 사용하여 모든 설정을 한 번에 적용한 가상머신을 생성합니다. 아래 예제는 2 vCPU, 4GB RAM, 20GB VirtIO 디스크를 갖춘 Ubuntu 서버를 생성하는 명령어입니다.
sudo virt-install \
--name ubuntu2404 \
--ram 4096 \
--disk path=/var/kvm/images/ubuntu2404.img,size=20,bus=virtio,format=qcow2 \
--vcpus 2 \
--os-variant ubuntu24.04 \
--network network=default,model=virtio \
--graphics none \
--console pty,target_type=serial \
--location /home/ubuntu-24.04.2-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
--extra-args 'console=ttyS0,115200n8'
- --disk ... bus=virtio: 디스크 컨트롤러로 VirtIO를 지정하여 I/O 성능을 극대화한다.
- --network ... model=virtio: 네트워크 카드 모델로 VirtIO를 지정하여 네트워크 처리량을 극대화한다.
- --graphics none 과 --extra-args 'console=ttyS0...': GUI 없이 시리얼 콘솔만으로 설치와 접속이 가능하도록 설정한다.
명령을 실행하면 즉시 OS 설치 화면으로 진입하며, 화면의 안내에 따라 설치를 완료하면 됩니다.
이런 화면이 나온다면 Continue in basic mode로 진행합니다.

그럼 일반적인 우분투 설치화면이 나오며 설치를 진행하면 됩니다.

최종적으로 VM 생성에 성공하였습니다. Reboot Now를 눌러 재부팅을 합니다.

그럼 아래와 같이 에러가 뜰 것입니다. 실제 서버라면 USB를 제거 후 엔터를 입력 하면 되지만, 지금은 엔터만 입력 하면 처리 됩니다.

최종적으로 가상머신 및 우분투 설치에 성공했습니다.

CLI로 직접 가상머신을 구현하면서 생각보다 정확한 예제가 없어 힘들었으며 아래 글이 제일 참고에 도움이 되었습니다.
https://www.server-world.info/en/note?os=Ubuntu_24.04&p=kvm&f=2
참고로, 기본 설정은 물리적인 호스트 서버를 Restart 하면, 가상머신 서버는 꺼지게 되는데 아래의 설정으로 항상 자동으로 시작하게 할 수 있습니다.
virsh autostart ubuntu2404
6. virsh로 가상머신 관리하기
설치가 완료된 후에는 virsh 명령어로 가상머신을 제어할 수 있습니다.
모든 가상머신 목록 확인
virsh list --all
가상머신 시작
virsh start ubuntu2404
가상머신 콘솔 접속
virsh console ubuntu2404
#(콘솔에서 빠져나오려면 Ctrl + ] 키를 누른다.)
가상머신 종료
virsh shutdown ubuntu2404
가상머신 삭제
virsh destroy ubuntu2404 2>/dev/null || true
virsh undefine ubuntu2404 --remove-all-storage 2>/dev/null || true
가상머신 정보 확인
$ virsh dominfo ubuntu2404 # 혹은 id 사용 가능 > virsh dominfo 6
Id: 6
Name: ubuntu2404
UUID: 31d0aca0-89ab-47af-9f02-6251cf90d45c
OS Type: hvm
State: running
CPU(s): 2
CPU time: 7.9s
Max memory: 4194304 KiB
Used memory: 4194304 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: apparmor
Security DOI: 0
Security label: libvirt-31d0aca0-89ab-47af-9f02-6251cf90d45c (enforcing)
가상머신 cpu 정보 확인
$ virsh vcpuinfo ubuntu2404 # 혹은 id 사용 가능 > virsh vcpuinfo 6
VCPU: 0
CPU: 9
State: running
CPU time: 4.0s
CPU Affinity: yyyyyyyyyyyy
VCPU: 1
CPU: 2
State: running
CPU time: 3.6s
CPU Affinity: yyyyyyyyyyyy
가상 머신 메모리 정보
$ virsh dommemstat 6
actual 4194304
swap_in 0
swap_out 0
major_fault 0
minor_fault 0
unused 3798036
available 3930188
usable 3675476
last_update 1757047658
disk_caches 90300
hugetlb_pgalloc 0
hugetlb_pgfail 0
rss 901704
가상머신 디스크 정보
# 블록 디바이스 목록
$ virsh domblklist 6
Target Source
------------------------------------------
vda /var/kvm/images/ubuntu2404.img
sda -
# 디스크 통계
$ virsh domblkstat 6 vda
vda rd_req 11894
vda rd_bytes 350624768
vda wr_req 1683
vda wr_bytes 36586496
vda flush_operations 411
vda rd_total_times 122093023
vda wr_total_times 249181176
vda flush_total_times 489480779
# 디스크 상세 정보
$ virsh domblkinfo 6 vda
Capacity: 21474836480
Allocation: 4533014528
Physical: 21478375424
가상머신 네트워크 정보
# 네트워크 인터페이스 목록
$ virsh domiflist 6
Interface Type Source Model MAC
-------------------------------------------------------------
vnet5 network default virtio 52:54:00:1d:06:93
# 네트워크 인터페이스 통계
$ virsh domifstat 6 vnet5
vnet5 rx_bytes 372871
vnet5 rx_packets 804
vnet5 rx_errs 0
vnet5 rx_drop 0
vnet5 tx_bytes 21453
vnet5 tx_packets 248
vnet5 tx_errs 0
vnet5 tx_drop 0
# IP 주소 확인
$ virsh domifaddr 6
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet5 52:54:00:1d:06:93 ipv4 192.168.122.81/24
이 과정을 통해 CLI 환경에서 KVM의 구성요소를 이해하고, 고성능 VirtIO 가상머신을 생성 및 관리할 수 있게 되었습니다. 또한 이제, 물리 서버(호스트)의 하드웨어 성능에 맞추어 서비스별 여러 서버(VM)을 활용할 수 있습니다.
추후 가상머신 접속 시, virsh console 명령어 보다는 아래처럼 ssh로 접속하는 것을 추천합니다. (virsh domifaddr 명령어로 ip 확인)
$ ssh username@192.168.122.81'홈 서버' 카테고리의 다른 글
| 홈서버 구축기 #5 - Nginx Stream 모듈로 VM의 PostgreSQL 포트 포워딩하기 (0) | 2025.09.08 |
|---|---|
| 홈서버 구축기 #4 - Nginx 포워딩 & 웹 페이지 서빙 (0) | 2025.09.05 |