https://www.vembu.com/blog/type-1-and-type-2-hypervisor/
방법 1)
[KVM1]
[root@kvm1 remote]# mv CentOS-7-x86_64-Minimal-2009.iso CentOS7-2009.iso
[root@kvm1 remote]# qemu-img create -f qcow2 /remote/centos1.qcow2 10G
Formatting '/remote/centos1.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
[root@kvm1 remote]# ls | grep centos1.qcow2
centos1.qcow2
[root@kvm1 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
virtual machine manager에서 centos1 선택
설치화면 넘겨 가면서 설치하기
방법 2)
[KVM2]
1. 사용할 디스크(qcow2) 준비 없이
2. 설치하면서 디스크 준비까지 한번에
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
name이 같으면 migration해서 이름이 겹칠 때 문제 발생할 수 있음
KVM1의 centos1와 이름이 다르게 centos2로 설정
virtual machine manager에서 centos2 선택
설치화면 넘겨 가면서 설치하기
[root@kvm1 remote]# virsh list --all
Id Name State
----------------------------------------------------
- centos1 shut off
[root@kvm1 remote]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
[root@kvm1 remote]# virsh autostart centos1
Domain centos1 marked as autostarted
[root@kvm1 remote]# virsh list --all --name
centos1
[root@kvm1 remote]# virsh console centos1
Connected to domain centos1
Escape character is ^]
6.1 xml 확인
[root@kvm1 remote]# virsh dumpxml centos1
설정된 가상머신의 xml 파일을 cat으로 열어보는 것과 같음
6.2 xml 편집
[root@kvm1 remote]# virsh edit centos1
설정된 가상머신의 xml 파일을 vi로 열어보는 것과 같음
7.1 virsh net-dumpxml default
스위치의 구성 내용 xml 파일을 cat으로 열어보는 것과 같음
[root@kvm1 remote]# virsh net-dumpxml default
<network connections='1'>
<name>default</name>
<uuid>8e8338a4-c7fc-4676-b458-a7bd092b6644</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:fc:83:47'/>
<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>
7.2 virsh net-edit default
vi 로 연결되어 스위치의 구성 내용을 변경할 수 있다!
[root@kvm1 remote]# virsh net-edit default
<network>
<name>default</name>
<uuid>8e8338a4-c7fc-4676-b458-a7bd092b6644</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:fc:83:47'/>
<ip address='10.10.10.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.10.201' end='10.10.10.239'/>
</dhcp>
</ip>
</network>
브릿지의 ip를 10.10.10.1로 변경
할당할 ip의 범위는 .201 ~ .239
위와 같이 변경
kvm과 네트워크 재실행
[root@kvm1 remote]# systemctl restart libvirtd # kvm 데몬 재실행
[root@kvm1 remote]# virsh net-destroy default # default 네트워크 중지
Network default destroyed
[root@kvm1 remote]# virsh net-start default # default 네트워크 실행
Network default started
[root@kvm1 remote]# ifconfig virbr0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.10.10.1 netmask 255.255.255.0 broadcast 10.10.10.255
ether 52:54:00:fc:83:47 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 0
브릿지의 ip가 10.10.10.1로 변경되었음
가상머신(kvm) 재실행
[root@kvm1 remote]# virsh destroy centos1
Domain centos1 destroyed
[root@kvm1 remote]# virsh start centos1
Domain centos1 started
[root@kvm1 remote]# virsh domifaddr centos1
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet0 52:54:00:f7:f9:26 ipv4 10.10.10.229/24
[kvm1의 centos1]
ip a
-> 10.10.10.229가 할당되었음
ping 10.10.10.1
ping www.google.com
브릿지와 통신이 되고, 인터넷 연결도 됨
[KVM1]
인터페이스 확인
[root@kvm1 remote]# virsh domiflist centos1
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default rtl8139 52:54:00:f7:f9:26
[root@kvm1 ~]# virsh net-edit default
<network>
<name>default</name>
<uuid>8e8338a4-c7fc-4676-b458-a7bd092b6644</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:fc:83:47'/>
<ip address='10.10.10.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.10.201' end='10.10.10.239'/>
</dhcp>
</ip>
</network>
위 xml 복사하기
내부에서 사용할 네트워크의 xml파일 만들기
[root@kvm1 ~]# touch private1.xml
[root@kvm1 ~]# vi private1.xml
<network>
<name>private1</name>
<bridge name='virbr1' 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>
default에서 복사한 xml 코드 붙여넣고 위와 같이 수정하기
내부 네트워크이기 떄문에 nat 필요 없음
mac주소 필요 없음
내부에서 쓸 독립적인 주소 -> 172.16.100.1
[root@kvm1 ~]# virsh net-define private1.xml
Network private1 defined from private1.xml
[root@kvm1 ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
private1 inactive no yes
[root@kvm1 ~]# virsh net-start private1
Network private1 started
[root@kvm1 ~]# virsh net-autostart private1
Network private1 marked as autostarted
[root@kvm1 ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
private1 active yes yes
[root@kvm1 ~]# ifconfig virbr1
virbr1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.16.100.1 netmask 255.255.255.0 broadcast 172.16.100.255
ether 52:54:00:49:17:86 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 0
네트워크를 삭제하고 싶다면
virsh net-undefine private1
네트워크 이름 : private1 (스위치의 이름 : virbr1 - 172.16.100.1)
private1 에 연결되는 가상머신들은 172.16.100.201 ~ 172.16.100.239 사이에서 IP 주소를 DHCP 를 통해 할당 받을 수 있다.
[root@kvm1 ~]# virsh attach-interface \
> --domain centos1 \
> --type network \
> --source private1 \
> --model virtio \
> --live \
> --config
Interface attached successfully
centos1에게 network 타입의 private1 네트워크로 연결할 예정이고 랜카드 모델은 virtio이다.
--live: 가상머신이 동작 중인 상태에서 연결할 것
--config: 재부팅되더라도 설정 계속 유지
kvm1의 centos1에서 확인
ip a
-> eth0이 연결되었음
-> 172.16.100.205가 할당되었음
centos1을 kvm1에서 kvm2로 migrate 시도
현재 상태에서 가상머신을 라이브 마이그레이션 시키면 이동되지 않는다.
kvm2에 private1 네트워크를 생성해주면 된다.
[root@kvm2 ~]# vi private1.xml
<network>
<name>private1</name>
<bridge name='virbr1' 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>
[root@kvm2 ~]# virsh net-define private1.xml
Network private1 defined from private1.xml
[root@kvm2 ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
private1 inactive no yes
[root@kvm2 ~]# virsh net-start private1
Network private1 started
[root@kvm2 ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
private1 active no yes
[root@kvm2 ~]# ifconfig | grep 172
inet 172.16.1.102 netmask 255.255.255.0 broadcast 172.16.1.255
inet 172.16.2.102 netmask 255.255.255.0 broadcast 172.16.2.255
inet 172.16.100.1 netmask 255.255.255.0 broadcast 172.16.100.255
[root@kvm2 ~]#
centos1이 kvm1에서 kvm2로 마이그레이션 된다.
migrate할 때마다 네트워크 설정을 해준다면 매우 번거로움.
cluster와 overlay 구성한다면 별도의 네트워크 설정 없이도 서로 다른 서버로 migration할 수 있음.
mac주소 알아내기
[root@kvm2 ~]# virsh domifaddr centos1
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet1 52:54:00:f7:f9:26 ipv4 192.168.122.24/24
vnet2 52:54:00:87:a1:0c ipv4 172.16.100.205/24
-> private1의 ip는 172.16.100.X 이므로 vnet2
인터페이스 제거
virsh detach-interface \
--domain centos1 \
--type network \
--mac 52:54:00:87:a1:0c \
--config
[root@kvm2 ~]# virsh destroy centos1
Domain centos1 destroyed
[root@kvm2 ~]# virsh start centos1
Domain centos1 started
[root@kvm2 ~]# virsh domifaddr centos1
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet1 52:54:00:f7:f9:26 ipv4 192.168.122.24/24
-> vnet2가 제거되었음
[kvm2의 centos2]
ls /dev/sd*
[kvm2]
[root@kvm2 ~]# virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes
remote active yes
[root@kvm2 ~]# virsh vol-create-as remote voltest1 1G
remote 저장소에 voltest1라는 저장소를 1G 만들겠다.
[root@kvm2 ~]# virsh vol-list remote | grep voltest1
voltest1 /remote/voltest1
생성된 voltest1 확인
[root@kvm2 ~]# file /remote/voltest1
/remote/voltest1: data
data를 저장할 수 있는 volume이다.
sda는 있으니까 sdb에 연결할 것임.
[root@kvm2 ~]# virsh attach-disk centos2 /remote/voltest1 --target sdb --persistent --live
Disk attached successfully
persistent: 영구적으로 연결
live: 동작 중인 상태에서 연결
remote 디렉토리 아래에 있는 1GB voltest1을 centos2의 sdb에 영구적으로 연결하되, 동작 중인 현재 상태에서 바로 붙이겠다.
[kvm2의 centos2]
ls /dev/sd*
/dev/sdb가 추가되었음
파티셔닝
fdisk /dev/sdb
n
n: 새로운 파티션 만들곘다.
나머지는 모두 엔터
sdb1이 생성되었음
포멧
mkfs.ext4 /dev/sdb1
마운트
mkdir /test
mount /dev/sdb1 /test
/dev/sdb1을 /test에 마운트
마운트 확인
df -h
/dev/sdb1이 마운트 된 것 확인할 수 있음
마운트 테스트
touch /test/from_centos2.txt
[KVM2]
동작 중인 상태에서 디스크 제거
[root@kvm2 ~]# virsh detach-disk centos2 sdb
Disk detached successfully
[centos2]
ls /dev/sd*
sdb가 없어졌음
이제 제거된 voltest 1을 centos1에 연결하고 centos1에서 아무 디렉토리나 만든 다음 둘을 마운트해본다. 정상적인 상태라면 centos2에서 만든 파일이 보여야 한다.
[KVM2]
[root@kvm2 ~]# virsh attach-disk centos1 /remote/voltest1 --target sdb --persistent --live
Disk attached successfully
remote 디렉토리 아래에 있는 1GB mytest를 centos1의 sdb에 영구적으로 연결하되, 동작 중인 현재 상태에서 바로 붙이겠다.
[KVM2의 centos1]
ls /dev/sd*
sdb와 sdb1이 연결되었다.
mkdir /mytest
mount /dev/sdb1 /mytest
-> 마운트
ls /mytest/
-> 마운트 확인
[참고]
도커 컨테이너와 같은 경우에는 휘발성이므로 자료가 영구보관되지 않는다. 이 경우 외부에 있는 스토리지를 활용하여 persistent volume(block storage) 을 구성하면 자료를 영구적으로 보관할 수 있게 된다!!
[root@kvm2 ~]# virsh destroy centos2
Domain centos2 destroyed
[root@kvm2 ~]# virsh undefine centos2 --remove-all-storage
Domain centos2 has been undefined
Volume 'hda'(/remote/centos2.qcow2) removed.
Volume 'sdb'(/remote/voltest1) removed.
[참고]
네트워크 삭제하기
virsh net-destroy default
virsh net-undefine private1
[KVM1]
[root@kvm1 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm1 network-scripts]# ls ifcfg-eth*
ifcfg-eth0 ifcfg-eth1 ifcfg-eth2
[root@kvm1 network-scripts]# cp ifcfg-eth0 ifcfg-br0
eth0: 인터넷 연결용 인터페이스
[root@kvm1 network-scripts]# vi 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
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0 # 어떤 스위치에 포함될 것인가를 지정
위와 같이 수정
eth0은 ip주소가 필요 없다.
[root@kvm1 network-scripts]# systemctl restart network
[root@kvm1 ~]# ifconfig br0
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:fe93:ac3d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:93:ac:3d txqueuelen 1000 (Ethernet)
RX packets 193 bytes 17499 (17.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 183 bytes 22545 (22.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@kvm1 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fe93:ac3d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:93:ac:3d txqueuelen 1000 (Ethernet)
RX packets 25947 bytes 2427234 (2.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17971 bytes 1558222 (1.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@kvm1 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c2993ac3d no eth0
virbr0 8000.525400fc8347 yes virbr0-nic
virbr1 8000.525400491786 yes virbr1-nic
[root@kvm1 ~]#
brctl show: 리눅스에서 제공하는 오픈소스 스위치인 linux bridge의 정보를 확인할 수 있다.
[root@kvm1 ~]# cp /remote/centos1.qcow2 /remote/centos11.qcow2
[root@kvm1 ~]# 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.
--network bridge:br0 -> 브릿지 네트워크 br0에 연결
--import -> 새로 설치하는 것이 아닌 qcow2 이미지 불러오기
[KVM1의 centos11]
ip a
-> ip주소: 211.183.3.131
ping www.google.com -c 3
storage로 ping
ping 211.183.3.100 -c 3
웹서버 실행하고 윈도우 10에서 접속 가능 여부 확인해보기
yum -y install httpd
systemctl start httpd
systemctl stop firewalld
curl -L https://www.naver.com -o /var/www/html/index.html
윈도우에서 211.183.3.131 접속
우리는 현재 별도의 컨트롤 노드는 없다.
이를 대신하여 172.16.1.101 을 컨트롤 노드로 활용할 계획이다.
컨트롤 노드에서 관리할 컴퓨트 노드의 주소는 172.16.1.101, 172.16.1.102 두대이다.
ssh root@kvm1 virsh list --all
ssh root@kvm2 virsh list --all
단, 패스워드는 묻지 말아야 한다!
kvm1 에서 /etc/ssh/ssh_config 파일에는 root 로 모든 호스트에 접속할 때에는 개인키를 이용하도록 해야 한다
각 서버에서 /etc/ssh/sshd_config 에서는 public key 를 이용하여 인증하도록 설정해야 한다
참고: https://velog.io/@ptah0414/Linux-2207-19-TIL#원격지에-있는-서버로-접속하기
[KVM1]
키페어 생성
[root@kvm1 ~]# ssh-keygen -q -f ~/.ssh/id_rsa -N ""
클라이언트 설정파일(ssh_config) 맨 아래에 호스트 정보 추가
[root@kvm1 ~]# vi /etc/ssh/ssh_config
Host kvm1
User root
IdentityFile /root/.ssh/id_rsa
Host kvm2
User root
IdentityFile /root/.ssh/id_rsa
[KVM1/KVM2]
id_rsa.pub(공개키)의 데이터를 kvm1과 kvm2의 ~/.ssh/authorized_keys 파일에 추가함
chmod 644 authorized_keys
권한 변경
[root@kvm1 ~]# vi /etc/ssh/sshd_config
43 PubkeyAuthentication yes
65 PasswordAuthentication no
위와 같이 수정
결과 확인
[root@kvm1 ~]# ssh root@kvm1 virsh list --all
Id Name State
----------------------------------------------------
5 centos11 running
[root@kvm1 ~]# ssh root@kvm2 virsh list --all
Id Name State
----------------------------------------------------
- centos1 shut off
- centos11 shut off
초반 서버인증을 위한 각 서버의 public key를 수집하기 위하여
ssh-keyscan kvm1 >> ~/.ssh/known_hosts
ssh-keyscan kvm2 >> ~/.ssh/known_hosts
를 해두면 초반 접속 시 yes/no 물어보는 것을 넘어가서 편리함