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관련 부분을 체크해보자. 어제는 분명 이 문제가 생겻는데 오늘은 안생긴다.. (그냥 잘되버림 아 찜찜해.)