KVM1
mv /remote/CentOS-7-x86_64-Minimal-2009.iso /remote/CentOS7-2009.iso
qemu-img create -f qcow2 /remote/centos1.qcow2 10G
ls -l /remote/
virt-install --name centos1 --vcpus 1 --ram 1024 --network network:default --disk /remote/centos1.qcow2 --graphics vnc,port=5901 --location=/remote/CentOS7-2009.iso --noautoconsole
KVM2
mv /remote/CentOS-7-x86_64-Minimal-2009.iso /remote/CentOS7-2009.iso
virt-install --name centos2 --vcpus 1 --ram 1024 --network network:default --disk /remote/centos2.qcow2,size=10 --graphics vnc,port=5902 --location=/remote/CentOS7-2009.iso --noautoconsole
둘다 실행해서 설치
virsh list # 동작 중인 가상머신
virsh list --all # 모든 가상머신
virsh net-list --all
virsh autostart [도메인이름]
virsh list --all --name
virsh console [도메인이름]
가상머신들의 설정 값 확인
[root@kvm1 ~]# virsh dumpxml centos1
<domain type='kvm' id='2'>
<name>centos1</name>
<uuid>44c42c44-fb66-49c5-80c1-9e057ab2c4b8</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
...
b. virsh edit [도메인이름] : vi centos1.xml과 같이 편집 모드로 들어갈 수 잇다.
virsh edit [도메인이름]
네트워크의 설정값 확인 및 수정
[root@kvm1 ~]# virsh net-dumpxml default
<network connections='1'>
<name>default</name>
<uuid>9f32ef1a-42db-4683-98b1-5160630bcda2</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:e7:9a:9a'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
b. virsh net-edit default : vi로 연결되어 스위치의 구성 내용을 변경할 수 있다.
10.10.10.x대로 변경
수정 이후에
systemctl restart libvirtd # KVM 데몬 재실행
virsh net-destroy default # default network 중지
virsh net-start default # default network 실행
virsh destroy centos1 # 가상머신 종료
virsh start centos1 # 가상머신 실행
이후 ip를 확인해보면 10점 대로 되어있다.
virsh domifaddr [도메인이름]
[root@kvm1 ~]# virsh domifaddr centos1
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet0 52:54:00:fc:e3:84 ipv4 10.10.10.235/24
기존 default 네트워크를 이용하여 생성하기
touch private1.xml
[root@kvm1 ~]# vi private1.xml
<network>
<name>private</name>
<bridge name='virbr2' stp='on' delay='0'/>
<ip address='172.16.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='172.16.100.201' end='172.16.100.239'/>
</dhcp>
</ip>
</network>
virsh net-define private1.xml
# 현재 private1은 중지중/autostart는 아니다.start 해주고, autostart 해주려면
virsh net-start private
virsh net-autostart private
삭제하고 싶다면 virsh net-undefine [네트워크이름]
네트워크 이름 : private (스위치의 이름 : virbr2 - 172.16.100.1)
private에 연결되는 가상머신들은 172.16.100.201~172.16.100.239 사이에서 IP 주소를 DHCP로 할당받는다.
virsh attach-interface --domain centos1 --type network --source private --model virtio --live --config
마이그레이션 시
vnc 포트오류를 해결하고자 한다면
centos2에서 virsh net-destroy centos2으로 일단 중지
virsh edit centos2 해서 5901로 되어있는 포트 정보를 5902로 변경한다.
centos1(5900)—————-host:5901
centos2(5900)—————-host:5901
centos1
[root@kvm2 remote]# virsh domifaddr centos1
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet1 52:54:00:fc:e3:84 ipv4 192.168.122.14/24
vnet2 52:54:00:56:f8:58 ipv4 172.16.100.227/24
virsh detach-interface --domain centos1 --type network --mac 52:54:00:56:f8:58 --config
저장공간 사용하기
볼륨 만들기
[root@kvm2 remote]# virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes
remote active yes
# remote에 1G짜리 볼륨을 만듦
[root@kvm2 remote]# virsh vol-create-as remote voltest1 1G
Vol voltest1 created
[root@kvm2 remote]# virsh vol-list remote | grep voltest1
voltest1 /remote/voltest1
[root@kvm2 remote]# virsh attach-disk centos2 /remote/voltest1 --target sdb --persistent --live
Disk attached successfully
[root@kvm2 remote]# virsh attach-disk centos2 /remote/voltest1 --target sdb --persistent --live
Disk attached successfully
# sdb가 추가 된 것 확인 가능
ls /dev/sd*
# 파티셔닝 시작
fdisk /dev/sdb
----------------
n : 새로운 파티션 만들겠다. 나머지는 모두 엔터
# 포맷
mkfs.ext4 /dev/sdb1
# 마운트
mkdir /test
mount /dev/sdb1 /test
# 확인
df -h
touch /test/from_centos2.txt
[root@kvm2 remote]# virsh detach-disk centos2 sdb
Disk detached successfully
이후 centos2에서 ls /dev/sd*해보면 제거되어 없음
이제 제거 된 testvol1을 centos1에 연결하고, 아무 디렉토리 만든 다음 둘을 마운트 해본다.
정상적인 상태라면 centos2에서 만든 파일이 보여야 한다.
virsh attach-disk centos1 /remote/voltest1 --target sdb --persistent --live
centos1에서
mkdir /mytest
mount /dev/sdb1 /mytest
# 아까 centos2에서 만들었던 txt 파일이 보임
ls /mytest/
도커 컨테이너와 같은 경우에는 휘발성이므로 자료가 영구보관되지 않는다. 이 경우 외부에 있는 스토리지를 활용하여 persistent volume(block storage)를 구성하면 자료를 영구적으로 보관할 수 있게 된다.
종료(destroy) → 삭제(undefine)
virsh destroy centos1
virsh undefine centos1 --remove-all-storage
[브릿지 네트워크 이용하기]

Network Functions Virtualization(NFV)
[root@kvm1 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm1 network-scripts]#
[root@kvm1 network-scripts]# ls ifcfg-eth*
ifcfg-eth0 ifcfg-eth1 ifcfg-eth2 # eth0이 인터넷 연결용 인터페이스
[root@kvm1 network-scripts]# cp ifcfg-eth0 ifcfg-br0
[root@kvm1 network-scripts]# vi ifcfg-br0
[root@kvm1 network-scripts]# cat ifcfg-br0
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=211.183.3.101
PREFIX=24
GATEWAY=211.183.3.2
DNS1=8.8.8.8
[root@kvm1 network-scripts]# vi ifcfg-eth0
[root@kvm1 network-scripts]# cat ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0 # 어떤 스위치에 포함될 것인가를 지정
[root@kvm1 network-scripts]# systemctl restart network
[root@kvm1 network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 211.183.3.101 netmask 255.255.255.0 broadcast 211.183.3.255
inet6 fe80::20c:29ff:fed7:7e7d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d7:7e:7d txqueuelen 1000 (Ethernet)
RX packets 26 bytes 7709 (7.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 41 bytes 5516 (5.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fed7:7e7d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d7:7e:7d txqueuelen 1000 (Ethernet)
RX packets 741 bytes 292419 (285.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 597 bytes 55300 (54.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
brctl show : 리눅스에서 제공하는 오픈소스 스위치인 linux bridge의 정보를 확인 할 수 있다.
[root@kvm1 network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29d77e7d no eth0
이후 가상머신을 만들 때 br0을 연결하면 됨
[root@kvm1 network-scripts]# cp /remote/centos1.qcow2 /remote/centos11.qcow2
[브릿지 네트워크에 신규 VM 연결하기]
[root@kvm1 network-scripts]# virt-install --name centos11 --vcpus 1 --ram 1024 --disk /remote/centos11.qcow2 --import --network bridge:br0 --graphics vnc --noautoconsole
WARNING No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.
Starting install...
Domain creation completed.
이후 생성된 centos11을 실행하여 ip a로 ip를 확인해보면 211.183.3.X가 할당 된 것을 볼 수 있다.
인터넷과의 연결, 스토리지와의 연결 모두 정상적으로 되어야 한다.
ip a
ping www.google.com -c 3
ping 211.183.3.100 -c 3
웹서버 실행 후 윈도우 10에서 접속 가능 여부 확인
yum -y install httpd
systemctl restart httpd
systemctl stop firewalld
똑같이 kvm2도 구성해서 bridge로 변경 후 migrate
kvm2에서 커맨드로 kvm1로 다시 migrate하기
[root@kvm2 network-scripts]# virsh list --all
Id Name State
----------------------------------------------------
6 centos11 running
- centos1 shut off
[root@kvm2 network-scripts]# cd
[root@kvm2 ~]# virsh migrate --live centos11 qemu+ssh://kvm1/system --verbose --persistent --unsafe
root@kvm1's password:
Migration: [100 %]
우리는 현재 별도의 컨트롤 노드는 없다. 이를 대신하여 172.16.1.101(kvm1) 을 컨트롤 노드로 활용할 계획이다. 컨트롤 노드에서 관리할 컴퓨트 노드의 주소는 172.16.1.101(kvm1), 172.16.1.102(kvm2) 두 대이다.
ssh root@kvm1 virsh list —all
ssh root@kvm2 virsh list —all
했을 때, 두개의 명령어 실행이 가능해야 한다.
단, 패스워드는 묻지 말아야 한다.
kvm1에서 /etc/ssh/ssh_config 파일에는 root로 모든 호스트에 접속할 때에는 개인키를 이용하도록 해야한다.
각 서버에서 /etc/ssh/sshd_config에서는 public key를 이용하여 인증하도록 설정해야 한다.
ssh 서비스를 cleint (/etc/ssh/ssh_config 파일 이용) / server(/etc/ssh/sshd_config 파일 이용)
보안상 password 로그인 추천X
43 PubkeyAuthentication yes
65 PasswordAuthentication no
kvm1
ssh-keygen -q -f ~/.ssh/id_rsa -N ""
~/.ssh/에 id_rsa(개인키) 파일과 id_rsa.pub(공개키) 파일이 만들어진다.
공개키는 접속하고자 하는 서버의 ~/.ssh/authorized_keys에 넣어둔다.
[root@kvm1 network-scripts]# cd ~/.ssh
[root@kvm1 .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@kvm1 .ssh]# cat id_rsa.pub > authorized_keys
/etc/ssh/ssh_config 파일에 아래와 같은 내용을 추가하여 해당 호스트로 접속할 때에는 기본적으로 .ssh/id_rsa를 이용하여 접속하도록 설정해둔다.
vi /etc/ssh/ssh_config
------------------------파일 아래에 추가
Host kvm1
User root
IdentityFile /root/.ssh/id_rsa
Host kvm2
User root
IdentityFile /root/.ssh/id_rsa
변경된 사항은 서버에 활성화 되어야하므로 각 서버에서 systemctl restart sshd를 해 갱신
systemctl restart sshd
초반 서버인증을 위한 각 서버의 public key를 수집하기 위하여
ssh-keyscan kvm1 >> ~/.ssh/known_hosts
ssh-keyscan kvm2 >> ~/.ssh/known_hosts 를 해 두면 초반 접속시 yes/no 물어보는거 넘어가니까 편리함!!!
결과 확인
[root@kvm1 ~]# ssh kvm1 virsh list
Id Name State
----------------------------------------------------
5 centos11 running
[root@kvm1 ~]# ssh kvm2 virsh list
Id Name State
----------------------------------------------------