커널 기반 가상 머신(KVM)은 물리적 Linux 시스템에 설치하여 가상 머신을 생성할 수 있는 소프트웨어 기능이다. 가상 머신은 물리적 시스템과 CPU 사이클, 네트워크 대역폭 및 메모리와 같은 리소스를 공유한다. KVM은 Linux에서 가상 머신에 대한 네이티브 지원을 제공하는 Linux 운영 체제 구성 요소이다.
KVM 설치 사전 환경 구성
- Lab Setup
Manufacturer: eSlim Korea
Operating System: CentOS Linux 7 (Core)
processor-version: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
Kernel: Linux 3.10.0-1160.el7.x86_64
사전 환경 체크
1. Processor 가상화 지원 활성화 확인
$ lscpu | grep -i "virtualization\|svm"
Virtualization: VT-x
$ egrep '(vmx|svm)' /proc/cpuinfo | wc -l
48
- Intel 및 AMD 프로세서는 가상화 기술을 제공하기 위해 각각 Intel Virtualization Technology(Intel VT), AMD-V를 사용한다.
- Intel VT의 경우 Default 설정 값이 비활성화 되어있어 BIOS 설정에서 활성화 해야 한다.
BIOS 진입 -> IntelRCSetup -> Processor Configuraion -> VMX Enabled
BIOS 진입 -> IntelRCSetup -> Intel VT for Directed I/O (VT-d) Enabled
- AMD-V의 경우 Default 설정값이 활성화 되어있고 BIOS 설정에서 비활성화 또는 활성화 불가능하기 때문에 따로 설정할 필요가 없다.
2. 커널 버전 2.6.20 이상
- Linux OS 의 커널 버전이 2.6.20 이상(커널 버전 2.6.20부터 리눅스 커널 자체에 내장됨)
$ hostnamectl
Static hostname: localhost.localdomain
Transient hostname: localhost
Icon name: computer-server
Chassis: server
Machine ID:
Boot ID:
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.el7.x86_64
Architecture: x86-64
3. 그래픽 환경 지원
- 그래픽 환경 추가
-- 그래픽 환경(GNOME Desktop) 추가
$ yum groupinstall "X Window System" "GNOME Desktop"
-- 그래픽 환경 default 설정
$ systemctl set-default graphical.target
-- 그래픽 환경 지원 모드 확인
$ systemctl get-default
graphical.target
- vnc 서버 구성 VDI 에 realvnc 등 설치 후, vncport(Default: 5901)로 접속하면 virt manager를 실행하여 GUI에서 관리할 수 있다.
KVM 설치, 설정
1. virt-manager 설치
$ yum install virt-install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager -y
2. 네트워크 설정
- bridge 설정
-- 1. br0 생성
$ vi /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.10.235
PREFIX=24
GATEWAY=10.0.10.1
DNS1=8.8.8.8
-- 2. eth0 를 br0 bridge에 연결 : ifcfg-eth0 마지막줄에 BRIDGE 설정 추가 하고 ip는 삭제
$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
BRIDGE=br0
-- 3. 반영
$ service network restart
-- 4. 확인
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.2c600c8be5d0 no eth0
nerdctl10 8000.da23e99d353b no vethbe5ee88a
nerdctl11 8000.b2cd54f28bbd no vethb7164a2d
virbr0 8000.525400737e4b yes virbr0-nic
vnet
- VM 포트를 호스트에서 액세스하는 방법 1: 방화벽 설정(권장)
-- 방화벽 활성화
$ systemctl start firewalld
-- guest vm 이 점유할 포트에 대한 방화벽 규칙 추가
$ firewall-cmd --zone=public --add-port=7000-9000/tcp --permanent
-- 반영
$ firewall-cmd --reload
-- 반영확인
$ firewall-cmd --list-all
- VM 포트를 호스트에서 액세스하는 방법 2: iptables 설정
-- 외부 -> 호스트:{목적지 포트} 로 들어오는 연결 허용
$ iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport {목적지 포트} -j ACCEPT
</pre>
* libvirt 데몬 실행
<pre>
$ systemctl enable --now libvirtd
$ systemctl enable --now virtlogd
Guest KVM 인스턴스 생성
1. os를 설치할 base 이미지 파일 생성
qemu-img create -f [format] [저장할 이미지파일] [용량]
ex: qemu-img create -f qcow2 centos.qcow2 100G
2. guest vm 인스턴스 생성
$ virt-install \
--name centos \
--ram 8192 \
--vcpus=4\
--check-cpu \
--os-type=linux \
--cdrom CentOS-7-x86_64-Minimal-2009.iso \
--disk path=centos.qcow2,device=disk,format=qcow2,bus=virtio \
--network bridge=virbr0 \
--hvm \
--vnc \
--vncport=8196 \
--vnclisten=0.0.0.0 \
--boot hd \
--noautoconsole
3. VDI 에 realvnc 등 설치 후, vncport(여기서는 8190)로 접속하여 OS 설치 진행
4. Serial Console 지원 설정
$ vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="... console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0"
$ grub2-mkconfig -o /boot/grub2/grub.cfg
-- kvm host server에서 console로 접속
$ virsh console <KVM 이미지>
5. 유동 IP (DHCP) 사용 설정
$ cd /etc/sysconfig/network-scripts/
$ mv ifcfg-ens32 ifcfg-eth0
$ vi ifcfg-eth0
BOOTPROTO=dhcp
DEVICE=eth0
ONBOOT=yes
$ service network restart
-- kvm host server에서 할당받은 dhcp ip 확인
$ virsh net-dhcp-leases default
6. ssh 설정
-- 호스트 -> 게스트 VM:22 포트로의 TCP 연결 허용
$ iptables -I FORWARD -m tcp -p tcp --dport 22 -j ACCEPT
-- DNAT 처리 (Port forward: {목적지 포트} --> 22)
$ iptables -t nat -A PREROUTING -p TCP --dport {목적지 포트} -j DNAT --to {게스트 VM IP}:22
-- 접속 확인
$ ssh root@10.0.10.235:{목적지 포트}