MINZKN.COM |  |  | Services | About

우분투(Ubuntu) 가상머신(Virtual Machine) 서버 환경 구축

1.1. 개요

kvm+qemm+virt-manager.png
[PNG image (218.33 KB)]
12-osx-bigsur-upgraded.png
[PNG image (581.86 KB)]
[https]Ubuntu[] 20.04 Server LTS 기준으로 가상머신 서버환경을 구축하는 방법을 소개합니다.

영문버젼으로 기본설치한 경우를 기준으로 설명합니다.

필자는 "xfce4", "xrdp", "libvirt-bin", "virt-manager" 설치 조합을 권장드린다는 점 먼저 말씀드리며 윈도우 PC에 모두 있는 "원격 데스크톱 연결" 프로그램으로 가상머신 서버에 접속해서 "Virtual Machine Manager" UI를 통해서 KVM을 제어한다는 구성이라는 설명과 함께 읽어주시면 좋겠습니다.

1.2. 설치

먼저 [https]Ubuntu[] 20.04 Server LTS 배포판을 설치합니다. (본 문서는 20.04 기준으로 작성되었으나 14.04, 16.04, 18.04 에서도 설치되는 것을 확인했습니다.)
  • 설치 직후 최신 패키지 업그레이드를 반영합니다. (권장사항)
    $ sudo apt-get update
    $ sudo apt-get upgrade
    
  • systemd 기반의 배포판의 경우 경우에 따라서 일정시간 경과 후 최대 절전모드로 진입할 수 있습니다. 이것을 원치 않는다면 다음과 같이 설정합니다. (권장사항)
    $ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
    
    BIOS 설정에서 C-state 제한을 걸어서 최대 절전모드를 진입하지 않도록 할 수도 있습니다. 이 경우 C1 ~ C3E 까지만 허용하고 이상의 상태조정은 제한하도록 하시면 됩니다.
    
    만약 최대 절전모드를 다시 허용하려면 다음과 같이 할 수 있습니다.
    $ sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
    
  • 또한 화면이 일정시간 경과시 꺼지는 것을 원치 않는 다면 다음과 같이 설정합니다. (선택사항)
    처음 설치시 첫 등록한 관리자 계정에서 다음과 같이 실행합니다. (위 최대 절전모드 해제한 경우 기본적으로 불필요)
    
    $ setterm --blink off --blank 0 --powersave off --powerdown 0 --store
    $ sudo setterm --blink off --blank 0 --powersave off --powerdown 0 --store
    


최소한의 설치를 위해서 불필요한 패키지(Package)들은 모두 제거(Uninstall) 합니다. (필요에 의해서 삭제를 원치 않는 경우 적절히 생략하시고 진행하세요)
  • nano 편집기 (선택사항, 필요 없는 경우 삭제합니다. vim 사용법을 잘 모르신다면 이 부분은 건너뛰세요.)
    $ sudo apt-get remove nano
    
  • vim tiny 편집기를 제거하고 vim original을 설치 (선택사항, vim-basic 이 있기 때문에 vim-tiny 는 삭제해도 됩니다. vim을 보다 전문적으로 사용하기 위한다면 권장합니다.)
    $ sudo apt-get remove vim-tiny
    $ sudo apt-get install vim
    
  • cloud-init 삭제 (선택사항, 아직은 이것이 없는게 더 좋다는 의견 드립니다.)
    $ sudo apt-get remove cloud-init
    
  • swap 비활성화 (선택사항, 메모리가 충분하다면 swap 비율을 낮추거나 비활성화 구성하는게 좋은 듯 합니다. - 참고: ZRAM (압축메모리) 를 이용한 SWAP 확보 방법)
    => swap을 비활성화 (메모리가 충분히 큰 경우만)
    /etc/fstab 에서 swap 설저부분을 모두 주석처리하고 "sudo swapoff -a" 명령으로 비활성화 합니다.
    
    => swap 비율을 낮추는 설정 (메모리가 충분치는 않아서 swap을 비활성화하기 어려운 경우)
    "/etc/sysctl.conf" 에 "vm.swappiness" 값을 50 ~ 60 사이로 추가합니다. 50에 가까울수록 swap 비율을 낮추게 됩니다. (필자는 55정도로 설정)
    
    => ZRAM을 사용할 경우 필자의 경우 가상머신이 실행중에 매우 낮은 확률로 오류 (압축된 스왑을 풀 수 없다는 오류) 가 발생되는 경우가 있었습니다.
    


apt-repository 를 활성화 합니다. (선택사항, 반드시 필요한 사항은 아닙니다.)
$ sudo add-apt-repository main
$ sudo add-apt-repository universe
$ sudo add-apt-repository restricted
$ sudo add-apt-repository multiverse
$ sudo apt-get update


시간동기화 클라이언트 설치 (권장사항)
  • ntp daemon 설치
    $ sudo apt-get install ntp
    
  • "/etc/ntp.conf" 에 하기 항목 추가/수정
    server 0.asia.pool.ntp.org
    server 1.asia.pool.ntp.org
    server 2.asia.pool.ntp.org
    server 3.asia.pool.ntp.org
    
  • timezone 설정 (대한민국 시간대로 설정)
    $ sudo timedatectl set-timezone Asia/Seoul
    
    또는
    
    $ sudo dpkg-reconfigure tzdata
    


원격데스크탑(rdp, TCP/3389) 서버 설치 (권장사항, 일반 Microsoft Windows 의 "원격 데크스톱 연결"을 통해서 UI접속을 하실 수 있게 됩니다.)
  • Windows Manager(Gnome, KDE 등) 가 설치되어 있는 경우
    $ sudo apt-get install xrdp
    
  • Windows Manager가 설치되어 있지 않고 최소한으로만 설치하고자 하는 경우
    $ sudo apt-get install xfce4 xfce4-terminal
    $ sudo apt-get install libfontenc1 libxfont2 xfonts-encodings xfonts-utils xfonts-base xfonts-75dpi
    $ sudo apt-get install xrdp
    
    설치 과정에서 "display manager"를 선택하라고 나올 수 있습니다. 이 경우 "lightdm" 을 선택하는 것을 기준으로 설명합니다. (선택 사항)
    
    설치 완료 후 "/etc/xrdp/startwm.sh" 를 수정합니다. => 마지막 부분의 Xsession을 실행(exec)하는 부분은 모두 주석처리 또는 제거하시고 대신 그 위치에 "exec xfce4-session" 을 추가 (원격 접속이 잘 안되는 경우만 하시면 됩니다)
    >>>
        exec xfce4-session
        #test -x /etc/X11/Xsession && exec /etc/X11/Xsession
        #exec /bin/sh /etc/X11/Xsession
    <<<
    
    이렇게 설치하고 나면 xrdp 계정이 생성되는데 이 계정을 ssl-cert group 에 추가해주는게 좋습니다. (선택 사항, xrdp 접속시 인증서를 사용할 수 있도록 하는 사항)
    $ cat /etc/group|grep ssl-cert
    ssl-cert:x:120:xrdp
    
  • 한글 환경 설치
    • 언어팩 설치 (한글 환경을 원하는 경우 필수사항)
      $ sudo apt-get install language-pack-ko
      
    • 은폰트(unfonts) 설치 (선택사항)
      $ sudo apt-get install fonts-unfonts-core fonts-unfonts-extra 
      
    • 백묵폰트(baekmuk) 설치 (선택사항)
      $ sudo apt-get install fonts-baekmuk
      
    • 나눔폰트(nanum) 설치 (선택사항, 개인적으로 이 폰트가 가장 개발콘솔용 폰트로 이용하기에 가시성이 좋은 것 같습니다.)
      $ sudo apt-get install fonts-nanum fonts-nanum-coding fonts-nanum-extra
      
    • 한글 입력기 설치 (권장사항, ibus-hangul, 한글 입력을 원하는 경우)
      $ sudo apt-get install ibus ibus-hangul im-config zenity
      
      => 설치 후 설정사항 (im, ibus, ibus-hangul, Autostart 설정)
        - "im-config" 를 실행하여 "ibus"을 선택합니다.
        - "ibus-setup" 을 실행하여 "Input Method" 에 "Korean - Hangul"을 추가해줍니다.
        - 매 접속마다 한글 입력기가 실행되어야 하므로 "설정(Settings)" > "Session and Startup" 메뉴에서 "Application Autostart" 항목에 "/usr/bin/ibus-daemon -drx" 명령이 실행될 수 있도록 추가해주세요.
      
    • 또 다른 한글 입력기 (선택사항, fcitx, 한글 입력을 원하는 경우 ibus 말고 또 다른 방법 중 하나)
      $ sudo apt-get install fcitx fcitx-hangul
      
      => 설치 후 /etc/default/im-config 를 편집기로 열어서 IM_CONFIG_DEFAULT_MODE 항목의 값을 auto 에서 fcitx 로 변경 후 저장하고 재부팅
      
  • FireFox 브라우져 (선택사항 : 브라우저 환경이 필요한 경우)
    $ sudo apt-get install firefox
    
  • 크롬브라우져(chromium browser) (선택사항 : 브라우저 환경이 필요한 경우)
    $ sudo apt-get install chromium-browser
    


이후 재부팅시 그래픽 로그인창이 나오는 것을 원치 않으신다면 다음과 같이 graphical.target 을 multi-user.target 으로 바꾸어줍니다. (권장사항)
# sudo systemctl get-default
graphical.target
# sudo systemctl set-default multi-user.target
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.


xrdp.png
[PNG image (33.49 KB)]



KVM + QEMU 가상서버 설치
  • KVM + QEMU 및 기반유틸 설치
    Ubuntu 18.04 이하인 경우
    $ sudo apt-get install qemu-kvm libvirt-bin ovmf ubuntu-vm-builder bridge-utils
    
    Ubuntu 20.04 이상인 경우
    $ sudo apt install qemu-kvm ovmf bridge-utils
    
    추가적으로 다음의 패키지 설치를 권장합니다. (권장사항, 만약 문제가 발생되고 이를 이해하기 어렵거나 스스로 해결하기 어렵다면 설치를 우선은 생략하세요.)
    $ sudo apt install firewalld dnsmasq
    $ sudo systemctl enable --now firewalld
    $ sudo systemctl restart libvirtd
    
    firewalld 의 firewall-cmd 명령에 대한 개략적인 사용법
    => 특정 인터페이스를 zone 에 합류 시키려면 : firewall-cmd [--permanent] [--zone=<zone>] --add-interface=<interface-name>
    => 특정 서비스를 zone 에 허용하려면 : firewall-cmd [--permanent] [--zone=<zone>] --add-service=<service-name>
    => 특정 포트를 zone 에 허용하려면 : firewall-cmd [--permanent] [--zone=<zone>] --add-port=<portid>[-<portid>]/<protocol>
    => IKE/NAT-T 허용 : firewall-cmd [--permanent] [--zone=<zone>] --add-service=ipsec
    => IPSec policy (out) 에 따른 허용 : firewall-cmd [--permanent] [--zone=<zone>] --direct --add-rule ipv4 nat POSTROUTING 0 -m policy --dir out --pol ipsec -j ACCEPT
    => IPSec policy (in) 에 따른 MSS 조정 : firewall-cmd [--permanent] [--zone=<zone>] --direct --add-rule ipv4 mangle PREROUTING 0 -m policy --pol ipsec --dir in -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1281:1536 -j TCPMSS --set-mss 1280
    => IPSec policy (out) 에 따른 MSS 조정 : firewall-cmd [--permanent] [--zone=<zone>] --direct --add-rule ipv4 mangle POSTROUTING 0 -m policy --pol ipsec --dir out -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1281:1536 -j TCPMSS --set-mss 1280
    => ESP 프로토콜 허용 : firewall-cmd [--permanent] [--zone=<zone>] --add-rich-rule='rule protocol value="esp" accept'
    => AH 프로토콜 허용 : firewall-cmd [--permanent] [--zone=<zone>] --add-rich-rule='rule protocol value="ah" accept'
    => IPCOMP 프로토콜 허용 : firewall-cmd [--permanent] [--zone=<zone>] --add-rich-rule='rule protocol value="ipcomp" accept'
    => 특정 출발지 대역 거부 : firewall-cmd [--permanent] [--zone=<zone>] --add-rich-rule='rule family="ipv4" source address="<address>/<prefix>" drop'
    => 특정 목적지 대역 거부 : firewall-cmd [--permanent] [--zone=<zone>] --add-rich-rule='rule family="ipv4" destination address="<address>/<prefix>" drop'
    => 특정 목적지 대역과 포트를 거부 : firewall-cmd [--permanent] [--zone=<zone>] --add-rich-rule='rule family="ipv4" destination address="<address>/<prefix>" port="23" protocol="tcp" drop'
    => 특정 포트 개방 (DNAT) : firewall-cmd [--permanent] [--zone=<zone>] --add-forward-port='port=<portid>:proto=<protocol>:toport=<portid>:toaddr=<to-address>'
    => Masquerade 허용 : firewall-cmd [--permanent] [--zone=<zone>] --add-masquerade
    
    GeoIP DB를 사용하여 특정 국가별 차단등을 관리하고자 한다면 다음과 같이 설치 및 몇가지 제반사항을 진행해야 합니다. (선택사항, [^https://codepre.com/how-to-block-ip-addresses-from-countries-with-geoip-addon-in-iptables.html 참고링크])
    $ sudo apt install xtables-addons-common libtext-csv-xs-perl perl
    $ cd /usr/lib/xtables-addons/
    $ sudo ./xt_geoip_dl
    $ sudo mkdir -p /usr/share/xt_geoip/
    $ cd /usr/share/xt_geoip/
    $ sudo perl /usr/lib/xtables-addons/xt_geoip_build /usr/lib/xtables-addons/dbip-country-lite.csv
    $ firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -m geoip --src-cc CN,RU,KP -j DROP
    
    추가적으로 ARM archtecture에 대한 에뮬레이션을 원하신다면 다음과 같이 추가로 QEMU arm 지원을 추가할 수 있습니다. (선택사항, Android나 Raspberry pi 등을 ARM archtecture 로 에뮬레이션하고 싶다면 설치하세요.)
    $ sudo apt install qemu-user-static qemu-system-arm qemu-efi
    
  • 특정 계정에게 사용권한을 할당하려면 다음과 같이 libvirtd group에 userid 를 추가해줍니다. (만약 현재 로그인한 계정에서 추가했다면 다시 로그인해야 권한이 반영됩니다.)
    $ sudo adduser `id -un` libvirtd
    Adding user '<username>' to group 'libvirtd' ...
    
  • KVM + QEMU 설치 확인
    • Intel VT-x 와 AMD-V 중에서 H/W 가속이 지원 가능한 경우 0보다 큰 값이 출력됩니다.
      $ egrep -c '(vmx|svm)' /proc/cpuinfo
      
  • KVM+QEMU 관리 UI 프로그램인 virt-manager 설치 (강력추천, 윈도우상의 "시스템" 메뉴에 보시면 "Virtual Machine Manager"가 설치되며 이를 실행하여 손쉽게 가상환경을 다루실 수 있습니다.)
    $ sudo apt-get install virt-manager
    
  • 올바르게 설치되었다면 다음과 같이 나올겁니다.
    $ virsh list --all
     Id Name                 State
    ----------------------------------
    
    $
    
  • virt-manager 에서 원격지의 KVM+QEMU 서버를 SSH를 경유하여 관리하고자 한다면 하기와 같이 ssh-askpass-gnome package를 추가로 설치합니다.
    $ sudo apt-get install ssh-askpass-gnome
    
  • 만약 설치에 문제가 있다면 다음과 비슷하게 나올겁니다.
    $ virsh list --all
    libvir: Remote error : Permission denied
    error: failed to connect to the hypervisor
    $
    


VirtualBox 설치 (선택사항, 실제 사용계획이 있는 경우만 설치하세요.)
$ sudo apt-get install virtualbox


Docker 설치 (선택사항, 만약 libvirt와 firewalld 가 운영중인 환경에 docker 를 운영하기 위해서는 몇가지 네트워크에 대한 전문적인 구성이 필요하므로 잘 다룰 수 없다면 생략하세요.)
$ sudo apt-get install docker.io

=> 참고) "/etc/docker/daemon.json" 을 적절히 아래와 같이 수정하여 firewalld/iptables 등을 고려할 필요가 있을 수 있음. (아래의 설정내용은 예시이며 각 환경에 따라서 전문적으로 수정할 필요성 있음)
{
        "bridge":"br0",
        "fixed-cidr":"192.168.0.240/29",
        "default-gateway":"192.168.0.254",
        "dns":["192.168.0.3","168.126.63.1","168.126.63.2"],
        "mtu":1500,
        "ipv6":false,
        "iptables":false,
        "ip-forward": false,
        "ip-masq": false
}

OR

{
        "bip": "198.18.1.1/24",
        "userland-proxy": false
}

1.3. KVM : passthrough

그래픽 카드(GPU)나 기타 PCI 장치를 passthrough 하는 방법을 소개합니다.

passthrough 란 KVM+QEMU 서버에서 해당 PCI 장치를 사용하지 않고 가상화 호스트에서 이 장치를 단독으로 사용할 수 있게 하는 방법입니다. (PCI 장치를 가상화 호스트에 PCI장치로 인식하고 단독으로 사용) 보통은 그래픽 장치나 오디오등의 미디어 장치, 그리고 Ethernet 장치등을 이렇게 사용합니다.

먼저 필수적으로 BIOS 설정에서 "VT-d (Intel)" 또는 "AMD IOMMU (AMD)" 관련 옵션이 있으면 활성(Enable)해주세요.

  >>> grub 파일을 수정합니다. (Intel CPU 인 경우는 "intel_iommu=on", AMD CPU 인경우는 "amd_iommu=on")
  >>> 기본적인 옵션은 "intel_iommu=on iommu=pt" 이고 추가적으로 자신의 장비에 상황에 따라서 참고하여 아래의 옵션을 추가로 사용합니다. (혹시 장치가 동작하지 않는다면 "iommu=pt" 옵션을 빼보고 해볼 필요가 있습니다. 성능 측면에서는 pt 가 있는게 좋습니다.)
  >>> "rd.driver.pre=vfio-pci" 옵션은 ramdisk 로부터 vfio-pci module 을 올리도록 합니다. (Ubuntu 기반 배포판의 경우 꼭 추가해주어야 합니다.)
  >>> "vfio_iommu_type1.allow_unsafe_interrupts=1" MSR 을 허용해주는 것으로 우선 이 옵션을 빼고 해보시고 MSR관련 오류가 나온다면 이 옵션을 추가해주시면 됩니다. (단, 이 옵션은 실행하는 가상호스트가 신뢰할 수 있을 때만 사용하셔야 합니다. 신뢰할 수 없는 가상호스트인 경우 이 옵션을 사용하지 않는게 좋습니다.)
$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt rd.driver.pre=vfio-pci vfio_iommu_type1.allow_unsafe_interrupts=1"

  >>> nVidia인 경우 하기와 같이 blacklist 로 추가합니다. (즉, passthrough 할 장치와 관련성이 있는 driver/module이 불필요하게 올리지 않도록 각자의 passthrough 장치에 따라서 조치가 필요합니다.)
$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

  >>> grub 설정의 변경사항을 반영합니다.
  >>> 하기 명령 또는 "sudo grub-mkconfig -o /boot/grub/grub.cfg"
$ sudo update-grub

  >>> PCI 목록에서 passthrough 할 장치의 ID를 확인해둡니다.
  >>> 저의 경우는 Quadro FX1800 이 있는 장비는 passthrough 할 그래픽 카드의 PCI ID 가 "10de:0638" 이네요.
$ sudo lspci -nn | grep -i nvidia 
07:00.0 VGA compatible controller [0300]: NVIDIA Corporation G94GL [Quadro FX 1800] [10de:0638] (rev a1)

  >>> 저의 경우는 GT730 이 있는 장비는 passthrough 할 그래픽 카드의 PCI ID 가 "10de:1287"과 "10de:0e0f" (Audio) 이네요.
$ sudo lspci -nn | grep -i nvidia 
07:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK208B [GeForce GT 730] [10de:1287] (rev a1)
07:00.1 Audio device [0403]: NVIDIA Corporation GK208 HDMI/DP Audio Controller [10de:0e0f] (rev a1)

  >>> 저의 경우는 GT1030 이 있는 장비는 passthrough 할 그래픽 카드의 PCI ID 가 "10de:1d01"과 "10de:0fb8" (Audio) 이네요.
$ sudo lspci -nn | grep -i nvidia 
07:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP108 [GeForce GT 1030] [10de:1d01] (rev a1)
07:00.1 Audio device [0403]: NVIDIA Corporation GP108 High Definition Audio Controller [10de:0fb8] (rev a1)

  >>> passthrough 할 PCI 장치의 ID를 vfio.conf 파일을 만들어서 ids의 값으로 편집합니다.
  >>> 만약 장치가 여러개라면 PCI 장치의 ID를 콤마(,)로 구분하여 쭉 넣어줍니다.

  >>> Quadro FX1800 가 있는 장비의 경우
$ sudo vi /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:0638
options vfio-pci disable_vga=1

  >>> GT730 이 있는 장비의 경우
$ sudo vi /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:1287,10de:0e0f
options vfio-pci disable_vga=1

  >>> GT1030 이 있는 장비의 경우
$ sudo vi /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:1d01,10de:0fb8
options vfio-pci disable_vga=1

  >>> vfio-pci 모듈 설정 활성화
$ sudo -i
$ echo 'vfio-pci' > /etc/modules-load.d/vfio-pci.conf

  >>> initramfs 갱신 (부팅에서 initramfs 기반 배포판이 아닌 경우이거나 Ubuntu가 아닌 배포판의 경우는 이 과정이 다를 수 있습니다.)
$ sudo update-initramfs -u

  >>> 재부팅 필요
$ sudo reboot


  >>> 재부팅 된 후 부팅메세지(dmsg)를 보시면 "DMAR" 또는 "IOMMU" 라는 문자열을 포함한 메세지가 확인된다면 준비된 것입니다. (이제 해당 PCI 장치는 가상머신에게 모든 권한을 위임할 준비가 된 자원이 됩니다. 환경에 따라서 약간 다른 메세지로 보일 수 있습니다.)
$ sudo dmesg | grep -E "DMAR|IOMMU" 
[    0.000000] ACPI: DMAR 0x00000000BF77E0C0 000100 (v01 AMI    OEMDMAR  00000001 MSFT 00000097)
[    0.000000] DMAR: IOMMU enabled
[    0.000000] DMAR-IR: This system BIOS has enabled interrupt remapping
[    1.271828] DMAR: Host address width 40
[    1.271916] DMAR: DRHD base: 0x000000fbffe000 flags: 0x1
[    1.272041] DMAR: dmar0: reg_base_addr fbffe000 ver 1:0 cap c90780106f0462 ecap f020f6
[    1.272167] DMAR: RMRR base: 0x000000000ed000 end: 0x000000000effff
[    1.272262] DMAR: RMRR base: 0x000000bf7ed000 end: 0x000000bf7fffff
[    1.272356] DMAR: ATSR flags: 0x0
[    1.272756] DMAR: dmar0: Using Queued invalidation
[    1.272860] DMAR: Setting RMRR:
[    1.273164] DMAR: Setting identity map for device 0000:00:1a.0 [0xbf7ed000 - 0xbf7fffff]
[    1.273537] DMAR: Setting identity map for device 0000:00:1a.7 [0xbf7ed000 - 0xbf7fffff]
[    1.273895] DMAR: Setting identity map for device 0000:00:1d.0 [0xbf7ed000 - 0xbf7fffff]
[    1.274257] DMAR: Setting identity map for device 0000:00:1d.1 [0xbf7ed000 - 0xbf7fffff]
[    1.274618] DMAR: Setting identity map for device 0000:00:1d.2 [0xbf7ed000 - 0xbf7fffff]
[    1.275036] DMAR: Setting identity map for device 0000:00:1d.7 [0xbf7ed000 - 0xbf7fffff]
[    1.275179] DMAR: Setting identity map for device 0000:00:1a.0 [0xed000 - 0xeffff]
[    1.275315] DMAR: Setting identity map for device 0000:00:1a.7 [0xed000 - 0xeffff]
[    1.275450] DMAR: Setting identity map for device 0000:00:1d.0 [0xed000 - 0xeffff]
[    1.275585] DMAR: Setting identity map for device 0000:00:1d.1 [0xed000 - 0xeffff]
[    1.275720] DMAR: Setting identity map for device 0000:00:1d.2 [0xed000 - 0xeffff]
[    1.275855] DMAR: Setting identity map for device 0000:00:1d.7 [0xed000 - 0xeffff]
[    1.275992] DMAR: Prepare 0-16MiB unity mapping for LPC
[    1.276402] DMAR: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
[    1.276713] DMAR: Intel(R) Virtualization Technology for Directed I/O

  >>> 또한 vfio-pci 모듈이 잘 활성화(Enabled) 되었는지 확인하면 됩니다. (이 메세지는 실제 가상화 호스트가 구동되어 해당 장치가 passthrough활성화 될 때 확인가능합니다. 가상화 호스트 구동하지 않으면 안나옵니다.)
$ sudo dmesg | grep -i vfio 
[    8.015119] VFIO - User Level meta-driver version: 0.3
[    8.034941] vfio-pci 0000:07:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
[    8.052303] vfio_pci: add [10de:0638[ffff:ffff]] class 0x000000/00000000
[  567.518237] vfio-pci 0000:07:00.0: enabling device (0140 -> 0143)
[127997.152879] vfio-pci 0000:07:00.0: enabling device (0400 -> 0403)



아래 화면은 제 그래픽 카드를 passthrough 설정하여 가상머신에서 사용하도록 설정하는 화면입니다.
kvm+qemm+virt-manager+passthrough.png
[PNG image (210.02 KB)]


passthrough 로 Windows 가상머신 장치관리자에 해당 장치가 보이게 됩니다.
passthrough-to-windows.png
[PNG image (24.75 KB)]

1.4. 유틸 사용법 및 기타 유용한 사항들

다른 VM disk image를 KVM용 qcow2 로 변환하는 방법
# 사용법 : qemu-img convert -O <변환하고자 하는 포맷 이름> <변환할 파일명:source> <변환된 포맷으로 저장할 파일명:target>
예)
$ qemu-img convert -O qcow2 MyVMdisk1.vmdk MyVMdisk1.qcow2

이미지 변환 과정에서 크기를 최대한 줄이고자 한다면 "-c" 옵션도 함께 추가할 수 있습니다. (단, 이 경우 가상머신이 조금 느려질 수 있습니다.)
예)
$ qemu-img convert -c -O qcow2 MyVMdisk1.vmdk MyVMdisk1.qcow2
  • 지원 가능한 변환 포맷 확인
    $ qemu-img --help |grep "Supported formats"
    Supported formats: blkdebug blkreplay blkverify bochs cloop dmg file ftp ftps host_cdrom host_device http https iscsi iser luks nbd null-aio null-co parallels qcow qcow2 qed quorum raw rbd replication sheepdog throttle vdi vhdx vmdk vpc vvfat
    



    명령행에서 가상머신 다루기 (명령행 번거롭습니다. virt-manager 사용을 권합니다.)
    $ virsh --help
    
  • 가상환경 목록 확인
    $ virsh list --all
     Id    Name                           State
    ----------------------------------------------------
     -     Windows                        shut off
    ...
    
  • 가상환경 실행/종료/재시작
    $ virsh start <Name>
    $ virsh shutdown <Name>
    $ virsh reboot <Name>
    
  • 가상환경의 console 접속 (console 정의가 설정된 가상환경과 해당사항을 지원하는 OS인 경우에 대한 제한적 사용)
    $ virsh console <Name>
    



    아무것도 하지 않는데도 불구하고 가상머신의 CPU 부하가 큰 경우 (또는 운영체제 부팅과정에서 Timer 관련 오류등이 있는 경우 시도해볼만한 설정, 권장)
    $ virsh edit "<가상머신 이름>"
    
    
    다음과 같이 clock 설정 부분의 내용을 동일하게 편집하고 저장하고 가상머신을 재시작 해봅니다.
    
    Guest 운영체제가 Windows 계열인 경우
    >>>
      <clock offset='localtime'>
        <timer name='hpet' present='no'/>
        <timer name='hypervclock' present='yes'/>
      </clock>
    <<<
    
    또는 Guest 운영체제가 Linux 계열인 경우
    >>>
      <clock offset='localtime'>
        <timer name='hpet' present='no'/>
        <timer name='kvmclock' present='yes'/>
      </clock>
    <<<
    

1.5. 참고자료


Copyright ⓒ MINZKN.COM
All Rights Reserved.