하이퍼바이저 유형
- Type 1 (Bare Metal): 하이퍼바이저가 물리적 서버 위에서 직접 실행되고, 운영체제(OS)와 가상 머신을 관리합니다.
- 하이퍼바이저는 물리적 리소스를 추상화하고, 가상 머신마다 격리된 환경을 제공합니다.
- Type 1 하이퍼바이저는 호스트 OS가 없는 상태에서 하드웨어에 직접 설치되므로, 가상화 성능이 뛰어나고, 하드웨어 자원을 직접 제어합니다.
- 하이퍼바이저가 커널 역할을 하며 하드웨어 자원을 관리하고, 가상 머신들이 필요한 자원을 효율적으로 할당받을 수 있도록 돕습니다.
- 예: VMware ESXi, Microsoft Hyper-V, KVM(opensource, gcp 기본 hypervisor)
- Type 2 (Host-based): 하이퍼바이저가 호스트 OS 위에서 실행되어 가상화를 제공합니다.
- 호스트 OS는 물리적 리소스를 직접 관리하고, 하이퍼바이저는 그 위에서 실행됩니다.
- 가상화가 호스트 OS 위에서 이루어지기 때문에, 하이퍼바이저가 직접 하드웨어에 접근할 수 없습니다. 대신, 호스트 OS 커널을 통해 하드웨어 자원에 접근해야 합니다.
- 이 과정에서 중간 계층(호스트 OS)이 추가되므로, 가상화 성능에 일부 오버헤드가 발생하고, 그로 인해 성능 저하가 있을 수 있습니다.
- 예: VirtualBox, VMware Workstation.
가상화 방식
- 전가상화 (Full Virtualization):
- OS와 드라이버를 수정하지 않고 그대로 사용.
- 하이퍼바이저가 운영체제마다 명령어를 해석하여 커널에 전달.
- 성능 저하가 발생함 (명령어 해석 필요).
- 반가상화 (Para Virtualization):
- OS와 드라이버가 수정된 버전 사용.
- 이미 해석된 명령어를 전달만 하므로 성능 저하가 거의 없음.
- opensource인 linux에서만 지원함.
- 예: Xenserver
가상화 기술
- QEMU (Quick Emulator):
- Type 2 에뮬레이터:
- 실제 하드웨어가 아닌 다른 환경에서 동작하는 시스템을 에뮬레이팅하여, 원래의 하드웨어처럼 동작하도록 만들어줍니다.
- 하드웨어 가상화: 다양한 아키텍처에서 OS 및 프로그램을 실행할 수 있도록, 하나의 명령어 세트를 다른 명령어 세트로 변환하는 Binary Translation을 사용합니다.
- 성능 저하: 소프트웨어 방식으로 동작하기 때문에 성능이 떨어지며, 물리 자원이 x86 계열의 CPU일 때도 다른 아키텍처(예: 안드로이드, 모바일 기기, 라우터 등)를 에뮬레이팅하려면 속도가 느려집니다.
- 전가상화: 하드웨어 아키텍처에 맞춰 OS 및 드라이버를 수정하지 않고 실행할 수 있게 지원하지만 성능 저하가 큽니다.
- KVM (Kernel-based Virtual Machine):
- Type 1 하이퍼바이저: 하드웨어와 직접 상호작용하며, 호스트 하드웨어에서 명령어를 처리합니다. 이를 통해 성능이 더 빠르고 효율적입니다.
- Binary Translation 없음: KVM은 같은 아키텍처에서만 동작하는 가상화 방식으로, 예를 들어 물리 자원이 x86이라면 가상화된 자원도 x86만 사용할 수 있습니다.
- 빠른 성능: 하드웨어와 직접 상호작용하므로 성능 면에서 QEMU(Type 2 에뮬레이터)보다 우수합니다.
- QEMU-KVM:
- 에뮬레이터 + 하이퍼바이저: QEMU와 KVM을 결합하여, QEMU는 드라이버를 에뮬레이션하고, KVM은 가상 머신에서 실행된 명령어를 호스트 하드웨어에서 처리합니다.
- 전가상화: 가상 머신과 호스트가 동일한 아키텍처(x86)에서 작업하며, QEMU가 드라이버를 에뮬레이션하여 OS와 드라이버를 수정하지 않고 실행할 수 있습니다.
- 성능: QEMU의 에뮬레이션과 KVM의 하드웨어 가상화가 결합되어, 하드웨어와의 직접 상호작용 덕분에 QEMU 단독보다 성능이 빠르고 효율적입니다.
1. virsh net-list
[root@kvm1 ~]# virsh net-list
Name State Autostart Persistent
--------------------------------------------
default active yes yes
- Name: 네트워크 이름, 여기서는 default 네트워크입니다.
- State: 현재 네트워크의 상태, active는 네트워크가 활성화되었음을 의미합니다.
- Autostart: KVM이 시작될 때 네트워크를 자동으로 시작할지 여부를 나타냅니다.
- yes: KVM이 시작될 때 default 네트워크가 자동으로 활성화됩니다.
- no: 자동으로 활성화되지 않습니다.
- Persistent: 네트워크 설정을 시스템 재부팅 후에도 유지할지 여부를 나타냅니다.
- yes: 네트워크 설정이 재부팅 후에도 지속적으로 반영됩니다.
- no: 재부팅 시 네트워크 설정이 사라집니다.
2. virsh net-dumpxml default
[root@kvm1 ~]# virsh net-dumpxml default
<network>
<name>default</name>
<uuid>28d39d9b-24cf-4ea2-8255-7efda0471e11</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:dd:07:d0'/>
<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>
- default: 네트워크의 이름이 default입니다.
- : 네트워크의 고유 식별자(UUID)입니다.
- : 네트워크의 전달 방식이 NAT(Network Address Translation) 방식입니다. 이는 가상 머신들이 외부와 통신할 때 host의 IP 주소를 통해 외부와 연결됨을 의미합니다.
- : start='1024' end='65535'은 NAT 포트 범위를 설정합니다. 이 범위 내에서 포트 포워딩이 가능하다는 의미입니다.
- : virbr0는 가상 브리지 인터페이스로, 가상 머신들이 이 브리지를 통해 네트워크를 연결합니다.
- stp='on': 스패닝 트리 프로토콜(STP)이 활성화되어 루프를 방지합니다.
- delay='0': 브리지의 초기 지연 시간 설정입니다.
- : 가상 네트워크의 MAC 주소입니다.
- : 가상 네트워크의 IP 주소와 서브넷 마스크입니다. 192.168.122.1은 가상 네트워크의 기본 게이트웨이 IP 주소입니다.
- : DHCP 서버 설정입니다. 이 설정에 따라 192.168.122.2에서 192.168.122.254까지의 IP 범위에서 동적으로 IP를 할당합니다.
STP (Spanning Tree Protocol)
- 네트워크에서 루프를 방지하고, 효율적인 데이터 흐름을 보장하는 중요한 프로토콜입니다.
- STP는 물리적 연결을 논리적으로 블로킹하여, 불필요한 경로를 차단하고, 네트워크의 성능을 최적화합니다.
- 프레임 루프, 멀티플 카피, 브로드캐스트 스톰 문제를 해결하기 위해 STP는 최적의 경로만을 활성화시키고, 나머지 경로는 논리적으로 블로킹합니다.
- 장애 발생 시에는 백업 경로가 자동으로 활성화되어 네트워크 장애를 최소화합니다.
실습
cpu/ram/disk 1st NIC 2nd NIC
kvm1 |
4/8/20 |
211.183.3.101/24 |
|
|
DG : .2 |
|
|
|
|
DNS : 8.8.8.8 |
172.16.1.101/24 |
|
|
|
DG: X |
|
|
|
|
DNS : X |
Server with GUI |
|
|
|
(run level 3) |
|
|
|
|
kvm2 |
|
211.183.3.102/24 |
|
|
DG : .2 |
|
|
|
|
DNS : 8.8.8.8 |
172.16.1.102/24 |
|
|
|
DG: X |
|
|
|
|
DNS : X |
Server with GUI |
|
|
|
(run level 3) |
|
|
|
|
stg |
2/4/160 |
211.183.3.100/24 |
|
|
DG : .2 |
|
|
|
|
DNS : 8.8.8.8 |
172.16.1.100/24 |
|
|
|
DG: X |
|
|
|
|
DNS : X |
minimal install |
|
|
|
- 모든 서버와 스토리지는 방화벽, SELinux 는 중지 시킨다.
KVM1 서버 설정:
- 방화벽 및 SELinux 비활성화:
- 방화벽 비활성화:
- systemctl disable firewalld --now
- SELinux 비활성화:
- sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
- 기본 패키지 설치:
- alias vi='vim' 추가하여 vi 명령어가 vim을 실행하도록 설정:
- echo "alias vi='vim'" >> ~/.bashrc source ~/.bashrc
- yum -y install curl git wget vim
- KVM, QEMU 및 관련 도구 설치:
- qemu-kvm: QEMU와 KVM 모듈을 연결하여 가상화 환경을 제공.
- libvirt: QEMU-KVM을 관리하는 데몬.
- virt-install: CLI 환경에서 가상 머신을 생성하는 도구.
- virt-manager: GUI 환경에서 가상 머신을 관리하는 도구.
- openssh-askpass: 가상 머신 마이그레이션 시 패스워드를 입력할 수 있도록 지원.
- yum update -y && yum -y install qemu-kvm libvirt virt-install virt-manager openssh-askpass
- NFS 서버 패키지 설치:
- yum -y install nfs-utils
- Runlevel 설정: KVM1을 multi-user.target으로 설정하여 3번 runlevel로 실행 (GUI 없는 상태):
- systemctl set-default multi-user.target
- KVM1 서버 종료:
- 설정이 완료되면 KVM1 서버를 종료:
- init 0
STG 서버 설정:
- 방화벽 및 SELinux 비활성화:
- systemctl disable firewalld --now sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
- 기본 패키지 설치:
- yum -y install curl git wget vim echo "alias vi='vim'" >> ~/.bashrc source ~/.bashrc
- NFS 서버 패키지 설치:
- yum -y install nfs-utils
KVM2 서버 설정:
- 호스트네임 변경:
hostnamectl set-hostname kvm2
- KVM2의 호스트네임을 kvm2로 설정:
- IP 주소 변경: KVM2의 네트워크 설정 파일을 열어 IP 주소를 211.183.3.102로 변경:IPADDR=211.183.3.102로 설정하고 저장 후 네트워크 서비스를 재시작:
- systemctl restart NetworkManager nmcli net off nmcli net on ip a # 변경된 IP 주소 확인
- vi /etc/sysconfig/network-scripts/ifcfg-ens160
STG 서버에서 NFS 설정:
- NFS 공유 설정: /shared 디렉토리의 공유 설정을 /etc/exports 파일에 추가:파일에 다음과 같이 입력:
- /shared 172.16.1.101(rw,no_root_squash) /shared 172.16.1.102(rw,no_root_squash)
- vi /etc/exports
- NFS 서버 재시작:
- chmod 700 /shared systemctl restart nfs-server
KVM1/KVM2에서 NFS 마운트:
- KVM1/KVM2에서 /remote 디렉토리 생성 및 NFS 마운트: 두 서버에서 /remote 디렉토리를 생성하고, STG 서버에서 공유한 /shared 디렉토리를 마운트:
- mkdir /remote mount -t nfs 172.16.1.100:/shared /remote
- KVM2에서 파일 생성: KVM2에서 /remote 디렉토리에 파일을 생성:
- touch /remote/from_kvm2.txt
결과 확인:
- STG, KVM1, KVM2에서 파일 확인:
- STG에서 /shared 디렉토리 내용 확인:
- ls /shared/
- KVM1에서 /remote 디렉토리 내용 확인:
- ls /remote/
- 현재 마운트 상태 확인:
- mount | grep /shared
KVM1/KVM2 설정:
- QEMU-KVM 실행 권한:
- QEMU-KVM 실행은 root 권한을 통해 가능해야 합니다. 즉, libvirtd 서비스는 root 사용자로 실행해야 합니다.
- libvirtd 설정:
- libvirt의 설정 파일을 수정하여 root 권한으로 실행되도록 설정합니다:
- vi /etc/libvirt/qemu.conf
- libvirtd 서비스 활성화:
- libvirtd 서비스를 부팅 시 자동으로 시작하도록 설정하고, 즉시 실행합니다:
- systemctl enable libvirtd --now
- libvirtd 상태 확인:
- libvirtd 서비스가 정상적으로 실행되고 있는지 확인합니다:
- systemctl status libvirtd
STG 서버에서 이미지 준비:
- 실습용 이미지 다운로드:
1. virsh list --all
- 목적: 현재 동작 중인 가상 머신과 중지된 모든 가상 머신 목록을 확인할 수 있습니다.
- 설명: 이 명령어를 사용하면, 실행 중인(running) 가상 머신뿐만 아니라 중지된(shut off) 가상 머신도 포함하여 모든 가상 머신을 확인할 수 있습니다.
2. virsh console ID 또는 도메인이름
- 목적: 가상 머신에 콘솔로 접속하여 해당 가상 머신을 직접 제어할 수 있습니다.
- 설명: virsh console 명령어를 사용하면 가상 머신의 콘솔에 접속하여 운영체제의 명령줄을 사용할 수 있습니다. 여기서 ID 또는 도메인이름은 접속하려는 가상 머신의 고유 식별자 또는 이름입니다.
3. virsh dumpxml 도메인이름
- 목적: 특정 가상 머신의 구성 내용을 XML 형식으로 확인할 수 있습니다.
- 설명: 이 명령어를 사용하면, 해당 가상 머신의 설정 파일을 XML 형태로 확인할 수 있습니다. 예를 들어, 가상 머신의 하드웨어 설정, 네트워크 설정 등을 파악할 수 있습니다.
4. virsh edit 도메인이름
- 목적: 특정 가상 머신의 구성 내용을 수정할 수 있습니다.
- 설명: 이 명령어는 virsh dumpxml과 유사하지만, XML 파일을 편집할 수 있는 인터페이스를 제공합니다. 이 명령어를 사용하면 가상 머신의 설정을 실시간으로 수정할 수 있습니다.
https://drive.google.com/file/d/1i3zSNaTwnx8_zepwr90iG3I7Yl-0NZRD/view?usp=sharing
새로운 네트워크를 만들고, 동작 중인 가상 머신(인스턴스)을 새로운 네트워크에 연결하는 과정
1. 기존 네트워크 정보 확인
- virsh net-list 명령어로 현재 활성화된 네트워크 목록을 확인합니다.
- 예시: 기본 네트워크(default)가 활성화되어 있음을 확인할 수 있습니다.
virsh net-list
2. 기존 네트워크 설정을 파일로 백업
- virsh net-dumpxml default > pri.xml 명령어로 현재 활성화된 네트워크(default) 설정을 pri.xml 파일로 백업합니다.
- pri.xml 파일에는 네트워크의 브리지 이름, IP 주소, DHCP 설정 등 네트워크에 대한 상세 정보가 포함됩니다.
virsh net-dumpxml default > pri.xml
3. 새로운 네트워크 설정 파일 작성
- pri.xml 파일을 열어 기존 설정을 수정합니다.
- 예시: 새로운 네트워크 이름을 prinet으로 지정하고, 브리지 이름을 virbr1으로 설정하며, IP 주소 범위도 192.168.123.101부터 192.168.123.199로 설정합니다.
<network>
<name>prinet</name>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='192.168.123.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.123.101' end='192.168.123.199'/>
</dhcp>
</ip>
</network>
4. 새로운 네트워크 정의
- virsh net-define pri.xml 명령어로 새로 수정한 pri.xml 파일을 기반으로 새로운 네트워크 prinet을 정의합니다.
- 이 명령어를 실행하면 네트워크가 정의되고 활성화되지는 않으며, 이후에 활성화할 수 있습니다.
virsh net-define pri.xml
5. 가상 머신의 네트워크 인터페이스 확인
- virsh domiflist rocky17 명령어를 사용하여 특정 가상 머신(rocky17)의 네트워크 인터페이스 정보를 확인합니다.
- vnet0 인터페이스가 default 네트워크에 연결되어 있다는 정보가 출력됩니다.
virsh domiflist rocky17
6. 가상 머신을 새로운 네트워크에 연결
- virsh attach-interface --domain rocky17 --type network --source prinet --config --live 명령어를 사용하여 동작 중인 가상 머신(rocky17)을 새로 정의한 네트워크(prinet)에 연결합니다.
- -config 옵션은 가상 머신의 구성 파일에도 변경 사항을 반영하고, -live 옵션은 실시간으로 변경을 적용합니다.
virsh attach-interface --domain rocky17 --type network --source prinet --config --live