상세 컨텐츠

본문 제목

25.03.19. KVM을 활용한 가상화 환경 구축 및 NFS 서버 설정 실습

AWS CLOUD SCHOOL 9기

by AI Engineer crystal 2025. 3. 19. 09:39

본문

하이퍼바이저 유형

  1. Type 1 (Bare Metal): 하이퍼바이저가 물리적 서버 위에서 직접 실행되고, 운영체제(OS)와 가상 머신을 관리합니다.
    • 하이퍼바이저는 물리적 리소스를 추상화하고, 가상 머신마다 격리된 환경을 제공합니다.
    • Type 1 하이퍼바이저호스트 OS가 없는 상태에서 하드웨어에 직접 설치되므로, 가상화 성능이 뛰어나고, 하드웨어 자원을 직접 제어합니다.
    • 하이퍼바이저가 커널 역할을 하며 하드웨어 자원을 관리하고, 가상 머신들이 필요한 자원을 효율적으로 할당받을 수 있도록 돕습니다.
    • 예: VMware ESXi, Microsoft Hyper-V, KVM(opensource, gcp 기본 hypervisor)
  2. Type 2 (Host-based): 하이퍼바이저가 호스트 OS 위에서 실행되어 가상화를 제공합니다.
    • 호스트 OS는 물리적 리소스를 직접 관리하고, 하이퍼바이저는 그 위에서 실행됩니다.
    • 가상화가 호스트 OS 위에서 이루어지기 때문에, 하이퍼바이저가 직접 하드웨어에 접근할 수 없습니다. 대신, 호스트 OS 커널을 통해 하드웨어 자원에 접근해야 합니다.
    • 이 과정에서 중간 계층(호스트 OS)이 추가되므로, 가상화 성능에 일부 오버헤드가 발생하고, 그로 인해 성능 저하가 있을 수 있습니다.
    • 예: VirtualBox, VMware Workstation.

가상화 방식

  1. 전가상화 (Full Virtualization):
    • OS와 드라이버를 수정하지 않고 그대로 사용.
    • 하이퍼바이저가 운영체제마다 명령어를 해석하여 커널에 전달.
    • 성능 저하가 발생함 (명령어 해석 필요).
  2. 반가상화 (Para Virtualization):
    • OS와 드라이버가 수정된 버전 사용.
    • 이미 해석된 명령어를 전달만 하므로 성능 저하가 거의 없음.
    • opensource인 linux에서만 지원함.
    • 예: Xenserver

가상화 기술

  1. QEMU (Quick Emulator):
    • Type 2 에뮬레이터:
      • 실제 하드웨어가 아닌 다른 환경에서 동작하는 시스템을 에뮬레이팅하여, 원래의 하드웨어처럼 동작하도록 만들어줍니다.
    • 하드웨어 가상화: 다양한 아키텍처에서 OS 및 프로그램을 실행할 수 있도록, 하나의 명령어 세트를 다른 명령어 세트로 변환하는 Binary Translation을 사용합니다.
    • 성능 저하: 소프트웨어 방식으로 동작하기 때문에 성능이 떨어지며, 물리 자원이 x86 계열의 CPU일 때도 다른 아키텍처(예: 안드로이드, 모바일 기기, 라우터 등)를 에뮬레이팅하려면 속도가 느려집니다.
    • 전가상화: 하드웨어 아키텍처에 맞춰 OS 및 드라이버를 수정하지 않고 실행할 수 있게 지원하지만 성능 저하가 큽니다.
  2. KVM (Kernel-based Virtual Machine):
    • Type 1 하이퍼바이저: 하드웨어와 직접 상호작용하며, 호스트 하드웨어에서 명령어를 처리합니다. 이를 통해 성능이 더 빠르고 효율적입니다.
    • Binary Translation 없음: KVM은 같은 아키텍처에서만 동작하는 가상화 방식으로, 예를 들어 물리 자원이 x86이라면 가상화된 자원도 x86만 사용할 수 있습니다.
    • 빠른 성능: 하드웨어와 직접 상호작용하므로 성능 면에서 QEMU(Type 2 에뮬레이터)보다 우수합니다.
  3. 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 서버 설정:

  1. 방화벽 및 SELinux 비활성화:
    • 방화벽 비활성화:
    • systemctl disable firewalld --now
    • SELinux 비활성화:
    • sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  2. 기본 패키지 설치:
    • alias vi='vim' 추가하여 vi 명령어가 vim을 실행하도록 설정:
    • echo "alias vi='vim'" >> ~/.bashrc source ~/.bashrc
  3. yum -y install curl git wget vim
  4. KVM, QEMU 및 관련 도구 설치:
    • qemu-kvm: QEMU와 KVM 모듈을 연결하여 가상화 환경을 제공.
    • libvirt: QEMU-KVM을 관리하는 데몬.
    • virt-install: CLI 환경에서 가상 머신을 생성하는 도구.
    • virt-manager: GUI 환경에서 가상 머신을 관리하는 도구.
    • openssh-askpass: 가상 머신 마이그레이션 시 패스워드를 입력할 수 있도록 지원.
  5. yum update -y && yum -y install qemu-kvm libvirt virt-install virt-manager openssh-askpass
  6. NFS 서버 패키지 설치:
  7. yum -y install nfs-utils
  8. Runlevel 설정: KVM1을 multi-user.target으로 설정하여 3번 runlevel로 실행 (GUI 없는 상태):
  9. systemctl set-default multi-user.target
  10. KVM1 서버 종료:
    • 설정이 완료되면 KVM1 서버를 종료:
    • init 0

STG 서버 설정:

  1. 방화벽 및 SELinux 비활성화:
  2. systemctl disable firewalld --now sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  3. 기본 패키지 설치:
  4. yum -y install curl git wget vim echo "alias vi='vim'" >> ~/.bashrc source ~/.bashrc
  5. NFS 서버 패키지 설치:
  6. yum -y install nfs-utils

KVM2 서버 설정:

  • Manage → Clone
  1. 호스트네임 변경:
    hostnamectl set-hostname kvm2
    
  2. KVM2의 호스트네임을 kvm2로 설정:
  3. IP 주소 변경: KVM2의 네트워크 설정 파일을 열어 IP 주소를 211.183.3.102로 변경:IPADDR=211.183.3.102로 설정하고 저장 후 네트워크 서비스를 재시작:
  4. systemctl restart NetworkManager nmcli net off nmcli net on ip a # 변경된 IP 주소 확인
  5. vi /etc/sysconfig/network-scripts/ifcfg-ens160

STG 서버에서 NFS 설정:

  1. NFS 공유 설정: /shared 디렉토리의 공유 설정을 /etc/exports 파일에 추가:파일에 다음과 같이 입력:
  2. /shared 172.16.1.101(rw,no_root_squash) /shared 172.16.1.102(rw,no_root_squash)
  3. vi /etc/exports
  4. NFS 서버 재시작:
  5. chmod 700 /shared systemctl restart nfs-server

KVM1/KVM2에서 NFS 마운트:

  1. KVM1/KVM2에서 /remote 디렉토리 생성 및 NFS 마운트: 두 서버에서 /remote 디렉토리를 생성하고, STG 서버에서 공유한 /shared 디렉토리를 마운트:
  2. mkdir /remote mount -t nfs 172.16.1.100:/shared /remote
  3. KVM2에서 파일 생성: KVM2에서 /remote 디렉토리에 파일을 생성:
  4. touch /remote/from_kvm2.txt

결과 확인:

  1. STG, KVM1, KVM2에서 파일 확인:
    • STG에서 /shared 디렉토리 내용 확인:
    • ls /shared/
    • KVM1에서 /remote 디렉토리 내용 확인:
    • ls /remote/
    • 현재 마운트 상태 확인:
    • mount | grep /shared

KVM1/KVM2 설정:

  1. QEMU-KVM 실행 권한:
    • QEMU-KVM 실행은 root 권한을 통해 가능해야 합니다. 즉, libvirtd 서비스는 root 사용자로 실행해야 합니다.
  2. libvirtd 설정:
    • libvirt의 설정 파일을 수정하여 root 권한으로 실행되도록 설정합니다:
    • vi /etc/libvirt/qemu.conf
  3. libvirtd 서비스 활성화:
    • libvirtd 서비스를 부팅 시 자동으로 시작하도록 설정하고, 즉시 실행합니다:
    • systemctl enable libvirtd --now
  4. libvirtd 상태 확인:
    • libvirtd 서비스가 정상적으로 실행되고 있는지 확인합니다:
    • systemctl status libvirtd

STG 서버에서 이미지 준비:

  1. 실습용 이미지 다운로드:

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

관련글 더보기