2022-11-04
#21 [학습서] ARM기반 가상화(KVM) 실습
2022-11-04
Tasks

ARM기반 가상화(KVM) 실습#


1. Kernel-based Virtual Machine(KVM)#

  • KVM은 KVM 커널 모듈을 통해, 리눅스 커널을 하이퍼바이저로 변환한다.
  • QEMU는 하드웨어를 에뮬레이트하는 기능이며, KVM에 QEMU가 포함된다.
  • 커널수준의 하이퍼바이저이기에 Type1에 해당되지만, KVM환경에서 Host OS가 완전히 동작하기에 Type2로 분류된다.

1.1. KVM 지원 시스템#

  • 일반적은 AMD-V와 Intel VT 등의 x86에서는 가상화 확장(virtualization extensions)을 지원한다. 이는 KVM이 x86에서 전가상화 솔루션으로 사용가능하다는 의미이다. 따라서, 메인 Linux커널에는 KVM이 포홤되고 KVM에는 QEMU를 포함한다.
    #x86기반 가상화지원 확인
    lscpu | grep Virtualization
    # 결과> 
    # Virtualization:                  VT-x
    
    # KVM 모듈 확인 (x86)
    lsmod | grep kvm
    # 결과>
    # kvm_intel             294912  0
    # kvm                   819200  1 kvm_intel
    
    # 모듈 확인이 안될경우 아래 사용
    modprobe kvm_intel
    modprobe kvm_amd
    
    # CPU가 하드웨어 가상화 지원하는 여부 확인
    grep -E -c "vmx|svm" /proc/cpuinfo
    # 결과>
    # 0 보다 클경우 하드웨어 가상화를 지원한다.
    # VMX나 SVM을 포함하지 않을 경우 CPU 가상화는 지원되지 않는다.
    
  • 위의 내용은 일반 x86을 기반 하드웨어 가속을 확인하는 방법이다. 현재까지 파악한 바로는 ARM에서 하드웨어 가속을 직접적으로 확인하는 명령어는 찾지 못했다. 다만 커널 메시지 또는 패키지를 통해서 KVM 지원 여부를 파악할 수 있다.
    # 커널 메시지를 통해 kvm 사용 확인
    dmesg | grep -i kvm
    # 결과 >
    # [    3.255834] kvm [1]: IPA Size Limit: 40 bits
    # [    3.261646] kvm [1]: vgic-v2@2c020000
    # [    3.265346] kvm [1]: GIC system register CPU interface enabled
    # [    3.271804] kvm [1]: vgic interrupt IRQ1
    # [    3.276390] kvm [1]: Hyp mode initialized successfully
    
    # 패키지를 통해 kvm 지원 확인
    sudo apt install -y cpu-checker
    kvm-ok
    # 결과 >
    # INFO: /dev/kvm exists
    # KVM acceleration can be used
    

1.2. KVM 패키지 설치#

  • 설치 패키지
    sudo apt install -y qemu-kvm libvirt-daemon libvirt-clients bridge-utils virtinst virt-manager
    # --------------------------------------------------------------------- #
    
    # KVM에뮬레이터 제공하는 VM관리 패키지
    sudo apt install -y qemu-kvm 
    
    # 가상화 지원하는 libvirtd 데몬 패키지
    sudo apt install -y libvirt-daemon
    
    # 가상화 플랫폼을 관리하기위한 소프트웨어
    sudo apt install -y libvirt-clients
    
    # 이더넷 브리지를 구성하기위한 명령 줄 도구 세트
    sudo apt install -y bridge-utils 
    
    # 가상 머신을 만들기위한 명령 줄 도구 집합
    sudo apt install -y virtinst
    
    # libvirt기반 VM 관리 GUI 인터페이스 도구
    sudo apt install -y virt-manager
    
  • 설치확인
    • x86의 경우
      lsmod | grep -i kvm
      
    • ARM의 경우
      # libvirtd 설치 확인
      sudo systemctl is-active libvirtd
      
      # 사용자 그룹 추가
      sudo usermod -aG libvirt $USER
      sudo usermod -aG kvm $USER
      
      # libvirtd 서비스 확인
      sudo systemctl enable libvirtd --now
      sudo systemctl status libvirtd.service
      

1.3. KVM 실행#

  • 기본 KVM 네트워크 설정

    # 네트워크 확인
    sudo virsh net-list
    
    # 위에 default가 없으면 실행
    sudo virsh net-start default
    
  • UI 실행

    # virt GUI 실행
    virt-manager
    
    • 실행화면
      • UI매니저.png
  • CLI 실행

    # 이미지 다운로드
    wget https://cdimage.ubuntu.com/releases/20.04/release/ubuntu-20.04.5-live-server-arm64.iso
    
    # VM 생성 실행
    sudo virt-install --name=test-vm \
    --vcpus=2 \
    --memory=2024 \
    --cdrom=./ubuntu-20.04.5-live-server-arm64.iso \
    --disk size=10
    
    • 옵션

      --nameVM에 부여하는 이름
      --descriptionVM에 대한 간단한 설명
      --ramVM에 할당하려는 RAM의 양
      --vcpusVM에 할당하려는 가상 CPU 수
      --disk디스크에서 VM의 위치(존재하지 않는 qcow2 디스크 파일을 지정하면 자동으로 생성됨)
      --cdrom다운로드한 ISO 파일의 위치
      --graphics표시 유형을 지정합니다
    • 실행화면

      • 네스티드1.png
      • 네스티드2.png
  • VM 생성 확인

    virsh list
    # 결과 >
    # Id   Name      State
    # -------------------------
    # 5    test-vm   running
    
    virsh net-list
    # 결과 >
    # Name      State    Autostart   Persistent
    #--------------------------------------------
    # default   active   no          yes
    
    virsh net-info default
    # 결과 >
    # Name:           default
    # UUID:           0b28ad19-a402-4f9f-96f3-44fc37e0cb2a
    # Active:         yes
    # Persistent:     yes
    # Autostart:      no
    # Bridge:         virbr0
    
    virsh net-dhcp-leases default
    # 결과 >
    #  Expiry Time           MAC address         Protocol   IP address           Hostname   Client ID or DUID
    # ------------------------------------------------------------------------------------------------------------------------------------------------
    # 2022-11-03 10:07:40   52:54:00:99:90:74   ipv4       192.168.122.138/24   vraptor    ff:56:50:4d:98:00:02:00:00:ab:11:24:40:3e:78:e9:3e:a3:99
    
  • netbooting 실행 (옵션)

    sudo virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location http://ports.ubuntu.com/ubuntu-ports/dists/focal/main/installer-arm64/ --network bridge=virbr0,model=virtio --graphics none --extra-args='console=ttyS0,115200n8 serial'
    
    • 실행화면
      • 넷부1.png
      • 넷부2.png
      • 넷부3.png

1.4. KVM 네트워크 설정 (옵션)#

  • 참고
  • 네트워크 브리지 설정
    # 가상 브리지 "virbr0"은 KVM 자동 생성되며, 테스트 목적으로 사용된다.
    # 네트워크 브리지 사용은 아래와 같이 편집해야 한다.
    sudo vi /etc/netplan/00-installer-config.yaml
    >
    ...
    # 추가
    bridges:
        br0:
          interfaces: [eth0]
          addresses: [172.20.10.9/28]
          gateway4: 172.20.10.1
          nameservers:
            addresses: [4.2.2.2, 8.8.8.8]
    
    # 확인
    sudo netplan apply
    sudo networkctl status br0
    sudo networkctl -a
    sudo networkctl list
    

1.5. 디스크 이미지 생성#

  • qcow2(QEMU Copy-On-Write2) 파일생성
    • QEMU에서 이용되는 디스크 이미지 파일 포맷
    • 해당 파일 포맷의 이미지는 가상 Storage의 저장 용량을 할당한다.
    • 동적 블록 할당(실제 데이터 크기는 논리적보다 작다), 오버레이 방식(백업 이미지에서 추가 변경사항만 작성), 스냅샷 생성(이미지 이전 내용 복구 가능)
  • qcow2 파일 생성
    • 20GB까지 용량을 확보가능한 파일 포맷을 생성

    • OS를 담고 있지 않은 비어 있는 파일, OS를 설치할 가상 디스크 역할

      qemu-img create -f qcow2 ubuntu20_base.qcow2 20G
      

1.6. OpenStack : QEMU-KVM 설치 (옵션)#

ARM기반 오픈스택에서는 Compute노드의 하이퍼바이저를 이용하여 인스턴스를 생성한다. OS환경이 Ubuntu일때 가상화를 위해 사용하는 도구는 QEMU이다.

  • ARM ubuntu 20.04
    apt-get install qemu-kvm -y
    apt-get install virtinst -y
    apt-get install bridge-utils -y
    apt-get install cpu-checker -y
    apt-get install virt-manager -y 
    apt-get install qemu-efi -y
    
    apt-get install -y qemu-kvm virtinst bridge-utils cpu-checker virt-manager qemu-efi
    sudo adduser $USER kvm
    
Comment 0

Add a comment