KVM (Kernel base virtual machine) - centos 7

CPU가 가상화 지원하는 확인

grep -E '(vmx|svm)' /proc/cpuinfo

뭐라고 마구마구 나와야함.

module load 확인

lsmod | grep kvm

install

yum -y install epel-release -y
yum  install  qemu-kvm  qemu-img -y
yum  install  libvirt libvirt-client  virt-install  virt-top virt-viewer -y
yum  install  bridge-utils  libguestfs-tools -y

# module 확인
lsmod | grep kvm
> kvm                   636931  0
> irqbypass              13503  1 kvm

systemctl start libvirtd
systemctl enable libvirtd
systemctl list-unit-files | grep libvirtd
> libvirtd.service                            enabled

디렉토리

  • default : /var/lib/libvirt
  • ISO image for installation : /var/lib/libvirt/boot
  • vm directory : /var/lib/libvert/images
  • libvirt configuration for qemu : /etc/libvirt
  • log : /var/log/libvirt/

network

KVM을 활성화하게 되면 virbr0 라는 가상의 이더넷이 생성이되는데 이것이 NAT로 동작하게 됩니다. 그러니까 KVM의 게스트들은 virbr0 의 NAT를 이용해서 인터넷을 하게 되는 것입니다.

그래서 KVM의 게스트들도 직접 공유기로 부터 private ip 주소를 할당 받기를 원했습니다. 그렇게 하기위해서는 br0 을 만들어서 eth0와 br0를 Bridged 시키면 됩니다.

virsh net-info default 
> Name:           default
> UUID:           ee730ae5-04b7-4506-ae81-f33c78b67d9d
> Active:         yes
> Persistent:     yes
> Autostart:      yes
> Bridge:         virbr0

# nat로 동작중 확인
ifconfig virbr0
> virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
>         inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
>         ether 52:54:00:39:41:64  txqueuelen 1000  (Ethernet)
>         RX packets 0  bytes 0 (0.0 B)
>         RX errors 0  dropped 0  overruns 0  frame 0
>         TX packets 0  bytes 0 (0.0 B)
>         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 00

bridge로 사용

# 기존 파일을 br로 만든다. 
cp /etc/sysconfig/network-scripts/ifcfg-em1 /etc/sysconfig/network-scripts/ifcfg-br0 

# em1을 br0로 바꾼다.
vi /etc/sysconfig/network-scripts/ifcfg-br0

NAME="br0" # 수정
DEVICE="br0" # 수정
TYPE=Bridge # 수정
ONBOOT=yes
NETBOOT=no
UUID="6a69c44e-4142-48e8-b991-7300e799dfbc"
IPV6INIT=no
BOOTPROTO=none
IPADDR=192.168.0.9
PREFIX=24
GATEWAY=192.168.0.1

# em1을 수정한다.
vi /etc/sysconfig/network-scripts/ifcfg-em1

NAME="em1"
DEVICE="em1"
ONBOOT=yes
BRIDGE=br0 # 수정

# 네트워크 재시작
systemctl restart network.service 

Bridged로 사용

network list 확인

virsh net-list
> Name                 State      Autostart     Persistent
> ----------------------------------------------------------
>  default              active     yes           yes

default 삭제

virsh net-destroy default
virsh net-list

가상 머신 설정

cd ~

wget -c https://cdimage.debian.org/mirror/cdimage/archive/6.0.10/amd64/iso-dvd/debian-6.0.10-amd64-DVD-1.iso

virt-install \
--name debian-6.0.10 \
--ram 1000 \
--vcpus 4 \
--os-type linux \
--os-variant debian6 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--console pty,target_type=serial \
--cdrom /var/lib/libvirt/boot/debian-6.0.10-amd64-DVD-1.iso \
--virt-type kvm \
--disk size=10  

# debian 9 
--location http://deb.debian.org/debian/dists/stable/main/installer-amd64/ \
--extra-args "console=ttyS0" \
--os-variant debian9 \

설치를 시작하고 있다는 메세지와 함게 대기를 하게 된다.

vnc viewer로 접속해보면 설치할수 잇는 화면을 볼수 있다.

설치하고 나면 접속할수 있다.

다음 2개 파일이 생성이 된다.

  • /var/lib/libvirt/images/debian-6.0.10.qcow2
  • /etc/libvirt/qemu/debian-6.0.10.xml

vnc로 접속해서 ip를 설정하자.

vi /etc/network/interface

auto lo iface lo inet loopback

auto eth0 iface eth0 inet static address 192.168.0.241 netmask 255.255.255.0 gateway 192.168.0.1 up ifconfig eth0 up

가상머신 관리

# 가상머신 list 
virsh list
# 가상머신 시작
virsh start debian-6.0.10
# 가상 머신 종료
virsh shutdown debian-6.0.10
# 가상 머신 재부팅
virsh reboot debian-6.0.10
# 가상 머신 강제 종료
virsh destroy debian-6.0.10
# 가상머신 삭제
virsh undefine --domain debian-6.0.10
# 가상 머신 저장 -- 스냅샷 가상 머신이 일시 정지후 자동 종료되버림 주의 라이브 아님
virsh save debian-6.0.10 debian-6.0.10_20200205
# 가상 머신 복원 -- 복원 후 가상 머신 실행
virsh restore debian-6.0.10_20200205
# 가상머신 아미지 파일 삭제 
rm data/vm/debian-6.0.10.img

# 가상머신 설정 변경
virsh edit debian-6.0.10
# 또는 vi /etc/libvirt/qemu/

# virsh로 접속해있기 
virsh

# Hypervisor 접속하기
virsh -c qemu:///system

# 모든 VM 리스트 확인
virsh list --all

# 설정 백업
virsh dumpxml source_vm > .../vm-definition-repository/source_vm.xml

vnc 제거

설치시에만 vnc가 필요했고 설치후에는 ssh로 접속한다. 그러므로 vnc를 제거해야한다. 다음을 주석처리한다.

virsh edit debian-6.0.10
<!-- <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
  <listen type='address' address='0.0.0.0'/>
</graphics> -->

설정파일이 바귀였으므로 destory하고 새로 시작한다.

virsh destory debian-6.0.10
virsh start debian-6.0.10

vm 복사하기

virsh suspend debian-6.0.10 
# virt-clone --original=[원래 있던 VM 이름] --name=[새로 만들 VM 이름] -f [생성할 img 파일 위치]
virt-clone --original=debian-6.0.10 --name=adtree -f /var/lib/libvirt/images/adtree.qcow2

virsh resume debian-6.0.10 

# 파일 두개가 생성된지 확인
ls /var/lib/libvirt/images
ls /etc/libvirt/qemu
# enable vnc for new vm 
virsh edit adtree

virsh start adtree
# log in to new vm
sed -i "s/192.168.0.241/192.168.0.242/" /etc/network/interfaces
rm /etc/udev/rules.d/70-persistent-net.rules
reboot

# remove vnc 

vm 백업해두기

save는 image만 백업을 해두는것이므로 그 당시 xml도 같이 백업해둬야한다.

# 백업할 폴더로 이동 
cd /var/lib/libvirt/images
# 백업
virsh suspend debian-6.0.10 
virsh save debian-6.0.10 /data/vm/snapshot/debian-6.0.10_20200205 --verbose
virsh dumpxml > debian-6.0.10 /data/vm/snapshot/debian-6.0.10_20200205.xml

# 사용하닥 뭔가 잘못되서 기존 vm삭제
virsh destroy debian-6.0.10
virsh undefine debian-6.0.10
virsh list --all # 지워진것 확인
rm -rf /data/vm/debian-6.0.10.img

# 복원
cp /data/vm/debian-6.0.10_20200205 /var/lib/libvert/images/
cd /var/lib/libvert/images/
virsh restore debian-6.0.10_20200205
virsh list --all

vm 다른 서버로 이동하기 (오리지널 파일로)

ssh node9
virsh destroy debian-6.0.10 # 꺼야만 clone이 된다.
# 다음 두파일을 다른 호스트로 보낸다.
scp /var/lib/libvirt/images/debian-6.0.10.qcow2 192.168.0.8:/var/lib/libvirt/images/
scp /etc/libvirt/qemu/debian-6.0.10.xml 192.168.0.8:/etc/libvirt/qemu/

ssh node8
virsh define /etc/libvirt/qemu/debian-6.0.10.xml
virsh start debian-6.0.10 
virsh list --all

vm 다른서버로 이동하기 (backup 파일로)

ssh node9
virsh dumpxml adtree > /data/vm/snapshot/adtree_20200205.xml
scp /data/vm/snapshot/adtree-20200205 192.168.0.8:/var/lib/libvirt/images/
scp /data/vm/snapshot/adtree_20200205.xml 192.168.0.8:/etc/libvirt/qemu/

ssh node8
cd /var/lib/libvirt/images/
virsh restore adtree-20200205

> error: Cannot access storage file '/var/lib/libvirt/images/adtree.qcow2' (as uid:107, gid:107): No such file or directory

qemu-img create -f qcow2 /var/lib/libvirt/images/adtree.qcow2 10
ls
virsh restore adtree-20200205

virsh define /etc/libvirt/qemu/adtree.xml

virsh list --all

todo

  • vm에 콘솔로 접속하기
  • os 자동 설치 (centos - kickstart , debian - preseeding )
  • iso 없이 자동 설치 (location 이용)
  • vm harddisk 늘리기
  • vm cpu memory 늘리기
  • monitoring

error

  • vm을 다른서버에 복구하다보면 mac address를 안바꾸는 실수를 한다.
  • vm을 잘 복구를 했는데 부팅은 잘되나 network가 잘안되면 rm /etc/udev/rules.d/70-persistent-net.rules를 하고 재부팅하자. mac 이 바뀌면 이 파일 새로 생성해야한다.
  • 위 방법도 안되면 hostos에서 ip forward관련 부분을 체크해보자. 어제는 분명 이 문제가 생겻는데 오늘은 안생긴다.. (그냥 잘되버림 아 찜찜해.)
teamsmiley's profile image

teamsmiley

2020-02-06 00:00

Read more posts by this author