Xen-4 가상화 환경 및 GPU Passthrough 구현
Xen4.1 + GPU PassThrough
작성일 : 2011년 12월 15일
작성자 : 클루닉스/서진우(alang@clunix.com)
1. 기술소개
본 문서는 Virtualization의 대표적인 hypervisor 인 XEN을 이용하여 가상머신에
물리적인 GPU(VGA)를 인식시키고, 이를 이용하여 가상환경에서 고성능의 그래픽 작업
이 가능한 환경을 구현하는데 필요한 기술을 설명한 것이다.
XEN은 VMWare와 더불어 가장 많이 알려진 Hypervisor 코어 중 하나이다.
최초에는 Open Source로 발전하다 Redhat 의 지원을 잠시 받다가, 현재 Citrix에 인수
되어 Open Source 형태의 패키지와 commercial solution(Citrix XenServer)형태로
배포되고 있다.
본 문서에서는 Open Source 기반의 Xen 4.1을 통해 GPU PassThrough 환경을 구현해
보고자 한다.
2. 구축 환경
서버 : Intel Xeon E5650 Processor, 24GByte Memory, supports Intel-VT and Intel-VD
– 가상머신에서 CPU 와 Memory를 직접 접근하기 위해서는 Mainboard BIOS에서
Intel-VT가 지원되어야 한다.
– 가상머신에서 PCI Device 에 직접 접근 하기 위해서는 Mainboard BIOS에서
Intel-VD가 지원되어야 한다. 근래 GPU 장치의 경우 대부분 PCIe 16x slot 에
장착됨으로 Intel-VD 지원이 필수적으로 필요하다.
이밖에 Pysical Keyboard, mouse 등의 passthrough에도 필요한 조건들이다.
GPU : NVIDIA Quadro 2000
OS : Redhat Enterprise Server 6.2
XEN : xen-4.1.2
3. 구축 방법
3.1 운영체제 설치 및 설정
운영체제는 RHEL6.2를 설치하였다. XEN을 사용하기 위해서는 XEN커널이 별도로 필요하기
때문에 운영체제의 버전에는 큰 영향은 받지 않는다. 다만 너무 오래된 운영체제를 사용하면
XEN 4.x 대의 기본 유틸리티를 사용하는데 Library 의존성등의 문제가 발생할 수 있다.
운영체제의 기본 커널 버전이 2.6.18(RHEL5) ~ 2.6.32(RHEL6) ~ 3.x 에 속하는 Linux 배포
버전이라면 설치가 가능하다.
– 파티션 구조
/boot : 별도의 boot 파티션을 구성할 경우, 이곳에 Xen 커널 이미지가 설치된다.
RHEL 기본 커널과 추가로 build 한 XEN 커널등이 위치하는 곳임으로 넉넉한 용량을
잡아주도록 한다. 500MB 이상 권장
/ : 새로운 커널을 build 함으로 /lib/modules 하위에 새롭운 모듈이 추가 된다.
10GB 정도 잡아주도록 한다.
/usr : 30GB 권장 – 용도에 맞게 축소 가능
/var : 20GB 권장 – 용도에 맞게 축소 가능
/tmp : 20GB 권장 – 용도에 맞게 축소 가능
/data : 나머지 (실제 가상머신 이미지가 설치되는 공간이다. 가상머신 생성 수에 따라
알맞은 용량을 활당하도록 한다.
swap : 적절히 ..
– Grub 설정
Xen 커널을 build 한후, grub 수정이 추가적으로 필요하지만, 우선 기본 설정되어
있는 hiddenmenu 설정을 제거하도록 한다.
# vi /boot/grub/menu.lst
—————————————————————————–
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
#hiddenmenu
.
—————————————————————————-
– 네트워크 구성
먼저 /etc/hosts 파일에 서버의 hostname 을 등록한다.
# vi /etc/hosts
—————————————————————————–
127.0.0.1 alang09
—————————————————————————–
libvirtd를 이용하여 가상머신을 구축하면 기본적으로 가상머신의 네트워크 환경은
NAT로 구성이 된다. libvirtd 데몬이 기본 실행되었을때 네트워크 환경 구성을 살펴
보면 virtbr0 장치가 기본적으로 잡혀 있을 것이다.
NAT 구성을 제거하기 위해서는 아래 명령을 수행한다.
# virsh net-destroy default
# virsh net-undefine default
# service libvirtd restart
가상 머신에서 사용할 네트워크 방식은 bridge 방식을 권장한다.
Xen host 와 같은 IP 대역을 VM 에서 사용할 수 있는 장점이 있고, 여러개의 NIC를
각 VM에 개별 활당하여 네트워크 병목을 분산할 수 있는 장점이 있다.
단 bridge-utils 패키지가 사전에 설치 되어 있어야 한다. 만일 설치가 안되어 있다면
본 설정은 아래의 yum 설정과 주요 rpm update 이후 네트워크 설정을 하도록 한다.
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
—————————————————————————–
DEVICE=”eth0″
HWADDR=”00:25:90:33:D3:6C”
#IPADDR=192.168.123.61
NETMASK=255.255.255.0
NM_CONTROLLED=”no”
ONBOOT=”yes”
TYPE=Ethernet
BRIDGE=xenbr0
—————————————————————————–
# vi /etc/sysconfig/network-scripts/ifcfg-xenbr0
—————————————————————————–
DEVICE=xenbr0
TYPE=Bridge
BOOTPROTO=static
GATEWAY=192.168.123.254
IPADDR=192.168.123.61
NETMASK=255.255.255.0
ONBOOT=yes
DELAY=0
NM_CONTROLLED=no
—————————————————————————-
주요 사항
NM_CONTROLLED=no 설정을 추가해 준다.
만일 mulit nic 를 이용하여 각 VM의 네트워크 연결 채널을 분리하고자 할때는
위와 동일한 방식으로 xenbr1을 만들다. 그런 후, 아래 설명할 hvm 설정 파일에
해당 VM에서 연결할 xenbr device를 지정하면 된다.
채널 분산 확인은 아래와 같이 수행하면 된다.
# brctl show
bridge name bridge id STP enabled interfaces
xenbr0 8000.00259033d36c no eth0
tap68.0
tap69.0
vif68.0
vif69.0
xenbr1 8000.00259033d36d no eth1
tap73.0
tap74.0
vif73.0
vif74.0
– 기본 보안 설정 off
# vi /etc/selinux/config
—————————————————————————-
SELINUX=disabled
—————————————————————————-
# /etc/rc.d/init.d/iptables stop
# /sbin/chkconfig –level 345 iptables off
– Yum 설정
정식 RHEL6 배포판일 경우, 공식적으로 RHN 사이트에 subcriptions 정보를 등록한다.
여기서는 Centos6 의 repository 를 등록하여 yum 환경을 구성하였다.
# vi /etc/yum.repos.d/centos.repo
—————————————————————————–
[base-be]
name=CentOS-6 – Base
#repo=os
baseurl=http://mirror.centos.org/centos/6.2/os/x86_64/
enabled=1
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/6.2/os/x86_64/RPM-GPG-KEY-CentOS-6
[updates-be]
name=CentOS-6 – Updates
baseurl=http://mirror.centos.org/centos/6.2/updates/x86_64/
enable=1
gpgcheck=1
[centosplus-be]
name=CentOS-6 – Plus
baseurl=http://mirror.centos.org/centos/6.2/centosplus/x86_64/
enabled=1
gpgcheck=1
[extras-be]
name=CentOS-6 – Extras
baseurl=http://mirror.centos.org/centos/6.2/extras/x86_64/
enable=1
gpgcheck=1
[fasttrack-be]
name=CentOS-6 – Fasttrack
baseurl=http://mirror.centos.org/centos/6.2/fasttrack/x86_64/
enabled=1
gpgcheck=1
—————————————————————————
# yum -y install yum-priorities
# yum -y install yum
# yum -y install yum-utils
– OS 기본 패키지 업데이트
Xen 설치를 위해 필요한 패키지를 설치 혹은 업데이트 한다.
# yum install screen vim wget tcpdump ntp ntpdate man smartmontools links lynx ethtool xorg-x11-xauth
# yum groupinstall “Development tools” “Additional Development” “Debugging Tools” \
“System administration tools” “Compatibility libraries” “Console internet tools” \
“Desktop Platform Development”
# yum install transfig wget texi2html libaio-devel dev86 glibc-devel e2fsprogs-devel \
gitk mkinitrd iasl xz-devel bzip2-devel pciutils-libs pciutils-devel SDL-devel \
libX11-devel gtk2-devel bridge-utils PyXML qemu-common qemu-img mercurial texinfo libuuid-devel
# yum install glibc-devel.i686
– XEN 패키지 설치
# wget http://xenbits.xen.org/people/mayoung/EL6.xen/SRPMS/xen-4.1.2-2.el6.src.rpm
# rpm -ivh xen-4.1.2-2.el6.src.rpm
# cd /root/rpmbuild/SPECS
# rpmbuild -bb xen.spec
—————————————————————————————————
.
.
작성: /root/rpmbuild/RPMS/x86_64/xen-4.1.2-2.el6.x86_64.rpm
작성: /root/rpmbuild/RPMS/x86_64/xen-libs-4.1.2-2.el6.x86_64.rpm
작성: /root/rpmbuild/RPMS/x86_64/xen-runtime-4.1.2-2.el6.x86_64.rpm
작성: /root/rpmbuild/RPMS/x86_64/xen-hypervisor-4.1.2-2.el6.x86_64.rpm
작성: /root/rpmbuild/RPMS/x86_64/xen-doc-4.1.2-2.el6.x86_64.rpm
작성: /root/rpmbuild/RPMS/x86_64/xen-devel-4.1.2-2.el6.x86_64.rpm
작성: /root/rpmbuild/RPMS/x86_64/xen-licenses-4.1.2-2.el6.x86_64.rpm
작성: /root/rpmbuild/RPMS/x86_64/xen-debuginfo-4.1.2-2.el6.x86_64.rpm
.
————————————————————————————————–
# cd /root/rpmbuild/RPMS/x86_64/
build된 xen rpm 을 모두 설치한다. 그럼 아래와 같은 의존성 error 가 발생한다.
# rpm -Uvh xen*.rpm
—————————————————————————–
error: Failed dependencies:
/usr/bin/qemu-nbd is needed by xen-runtime-4.1.2-2.el6.x86_64
—————————————————————————–
RHEL6 에서는 xen 커널을 통해 VM을 생성하고 관리하는 유틸로 qemu를 사용한다.
하지만 RHEL6에 기본 탑재된 Hypervisor인 KVM에서도 qemu를 사용하고, 기본 설치된
qemu는 KVM 관리에 필요한 형태와 패키지만 설치가 된다.
qemu 에서 xen을 관리하기 위해서는 qemu-common 패키지가 필요하다.
# wget http://www.gitco.de/linux/x86_64/centos/6/src/qemu-0.12.5-1.el6.src.rpm
# rpm -ivh qemu-0.12.5-1.el6.src.rpm
# cd /root/rpmbuild/SPECS
# rpmbuild -bb qemu.spec
build 가 완료되면 여러개의 rpm 이 생성되는데, 이중 qemu-common 만 설치를 한다.
# cd /root/rpmbuild/RPMS/x86_64/
# rpm -Uvh qemu-common-0.12.5-1.el6.x86_64.rpm
그런 후 xen 패키지를 다시 설치한다.
# rpm -Uvh xen*.rpm
– Xen Source로 Build 하기
# hg clone http://xenbits.xensource.com/xen-unstable.hg
# cd xen-unstable.hg
# cd tools
# make
make 를 하면서 wget 으로 필요한 패키지를 다운받아 자동 설치하는 과정이 있다.
일단 patch를 적용하기 위해서는 완전한 Source 구성 먼저 해야 한다.
# make clean
필요한 patch 들을 적용한다. 필요한 패치 정보는 xen dev 사이트에서 확인이 가능
하다.
http://xen.1045712.n5.nabble.com/Xen-Dev-f2473738.html
# cd ..
# patch -p0 < XXX.patch
# make xen
# make tools
# make install-xen
# make install-tools
– Xen 커널 build 하기
xen 커널을 만드는 알려진 방법은 아래와 같다.
[root@el6 x86_64]# mkdir /root/kernel && cd /root/kernel
[root@el6 kernel]# git clone git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git linux-2.6-xen
[root@el6 kernel]# cd linux-2.6-xen
[root@el6 linux-2.6-xen]# git checkout -b xen/stable-2.6.32.x origin/xen/stable-2.6.32.x
[root@el6 linux-2.6-xen]# wget -O .config http://pasik.reaktio.net/xen/kernel-config/config-2.6.32.25-pvops-dom0-xen-stable-x86_64
[root@el6 linux-2.6-xen]# make oldconfig
[root@el6 linux-2.6-xen]# make -j4 bzImage && make -j4 modules && make modules_install
[root@el6 linux-2.6-xen]# depmod -a 2.6.32.25
[root@el6 linux-2.6-xen]# cp -a arch/x86/boot/bzImage /boot/vmlinuz-2.6.32.25
[root@el6 linux-2.6-xen]# cp -a System.map /boot/System.map-2.6.32.25
[root@el6 linux-2.6-xen]# cp -a .config /boot/config-2.6.32.25
[root@el6 linux-2.6-xen]# cd /boot
[root@el6 boot]# dracut initramfs-2.6.32.25.img 2.6.32.25
최신의 커널을 유지하고자 할때 위 방법을 사용하면 될듯 하다.
본 테스트 당시에는 git checkout 단계에서 계속 문제가 발생하여, 다른 방법으로 Kernel을 구성하였다.
기본적으로 RHEL6, Centos6 에 맞게 Xen Kernel에 제공되는 사이트가 있다. 하지만
Xen 환경에서 GPU PassThrough 를 하기 위해서는 기본 XEN 커널 설정에 추가해야하는 항목이 있어,
기본 제공되는 Xen kernel rpm을 사용할 수는 없다.
본 방법은 RHEL 커널 환경을 최대한 유지하면서 XEN 커널 부분만 재구성하고자 할때 사용하면 괜찮은
방법이다.
# wget http://xenbits.xen.org/people/mayoung/testing/SRPMS/kernel-2.6.32-131.21.1.el6.xendom0.src.rpm
# rpm -ivh kernel-2.6.32-131.21.1.el6.xendom0.src.rpm
# cd /root/rpmbuild/SPECS
# rpmbuild -ba –target=x86_64 kernel.spec
위와 같이 kernel 을 rebuild 하면 gpg 에러가 발생하는 경우가 있다.
이때는 kernel.spec 를 열어 아래 내용을 주석 처리한다.
#gpg –homedir . –batch –gen-key %{SOURCE11}
SRPM을 통해 커널을 rebuild 하게 되면, 처음에 kernel source 압축을 풀고, redhat 관련 주요 Patch를
적용하게 된다. 그런 후 주요 redhat kernel의 config 값이 적용된다. 그 다음 커널 이미지를 compile
하게 된다. 이 시점에서 인터럽트(Ctrl + c)를 건다. /root/rpmbuild/BUILD 에 가면 RHEL 커널에 XEN
항목이 추가된 kernel source 가 존재한다.
# cd /root/rpmbuild/BUILD/kernel-2.6.32-131.21.1.el6/linux-2.6.32-131.21.1.el6.xendom0.x86_64
커널 설정을 수정한다.
# vi .config
—————————————————————————–
.
CONFIG_XEN_PCI_PASSTHROUGH = y
.
CONFIG_XEN_PCIDEV_FRONTEND = y
.
CONFIG_XEN_NETDEV_BACKEND = y
.
CONFIG_XEN_PCIDEV_BACKEND = y
.
CONFIG_XEN_PCIDEV_BACKEND_PASS = y
——————————————————————————
위 설정 항목을 모두 활성화 시켜 둔다. 특히 CONFIG_XEN_PCIDEV_BACKEND_PASS은 반드시 활성화
시킨다.
이제 커널을 build 한다.
# make -j 4 bzImage && make -j 4 modules && make modules_install
# make install
이제 /boot 디렉토리에 가서 필요한 커널이 재대로 설치 되어 있는지를 확인한다.
# cd /boot
# ls -l
——————————————————————————
lrwxrwxrwx. 1 root root 51 2011-12-26 19:15 System.map -> /boot/System.map-2.6.32-131.21.1.el6.xendom0.x86_64
-rw-r–r–. 1 root root 2315706 2011-12-26 19:15 System.map-2.6.32-131.21.1.el6.xendom0.x86_64
-rw-r–r–. 1 root root 100941 2011-12-26 19:05 config-2.6.32-131.21.1.el6.xendom0.x86_64
-rw-r–r–. 1 root root 20318209 2011-12-26 19:15 initramfs-2.6.32-131.21.1.el6.xendom0.x86_64.img
-rw-r–r–. 1 root root 167033 2011-12-14 08:43 symvers-2.6.32-131.21.1.el6.xendom0.x86_64.gz
lrwxrwxrwx. 1 root root 48 2011-12-26 19:15 vmlinuz -> /boot/vmlinuz-2.6.32-131.21.1.el6.xendom0.x86_64
-rw-r–r–. 1 root root 3952816 2011-12-26 19:15 vmlinuz-2.6.32-131.21.1.el6.xendom0.x86_64
## 아래 부분은 xen-hypervisor 가 설치되면 생성되는 파일들이다.
-rw-r–r–. 1 root root 732375 2011-12-15 01:42 xen-4.1.2.gz
lrwxrwxrwx. 1 root root 12 2011-12-25 14:38 xen-4.1.gz -> xen-4.1.2.gz
-rw-r–r–. 1 root root 13192649 2011-12-15 01:42 xen-syms-4.1.2
lrwxrwxrwx. 1 root root 12 2011-12-25 14:38 xen.gz -> xen-4.1.2.gz
——————————————————————————
만일 위와 같은 내용이 없다면 build 한 커널 source 디렉토리에서 수동으로 생성해준다.
# cd /root/rpmbuild/BUILD/kernel-2.6.32-131.21.1.el6/linux-2.6.32-131.21.1.el6.xendom0.x86_64
# depmod -a 2.6.32-131.21.1.el6.xendom0.x86_64
# cp -a arch/x86/boot/bzImage /boot/vmlinuz-2.6.32-131.21.1.el6.xendom0.x86_64
# cp -a System.map /boot/System.map-2.6.32-131.21.1.el6.xendom0.x86_64
# cp -a .config /boot/config-2.6.32-131.21.1.el6.xendom0.x86_64
# dracut initramfs-2.6.32-131.21.1.el6.xendom0.x86_64.img 2.6.32-131.21.1.el6.xendom0.x86_64
# ln -sf vmlinuz-2.6.32-131.21.1.el6.xendom0.x86_64 vmlinuz
# ln -sf System.map-2.6.32-131.21.1.el6.xendom0.x86_64 System.map
마지막으로 grub.conf 에 새로 build 한 커널 설정을 추가한다.
# vi /boot/grub/menu.lst
—————————————————————————-
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
#hiddenmenu
title Enterprise Linux (2.6.32-131.21.1.el6.xendom0.x86_64)
root (hd0,0)
kernel /boot/xen.gz dom0_mem=22000M loglvl=all guest_loglvl=all
module /boot/vmlinuz-2.6.32-131.21.1.el6.xendom0.x86_64 ro root=UUID=500fb141-a70e-4607-8969-12b98718acd2 nomodeset rd_NO_LUKS LANG=ko_KR.UTF-8 rd_NO_MD quiet rhgb crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_LVM rd_NO_DM
module /boot/initramfs-2.6.32-131.21.1.el6.xendom0.x86_64.img
.
——————————————————————————-
kernel /boot/xen.gz dom0_mem=22000M 내용 중 dom0_mem 설정은 dom0 에 할당할 memory
크기를 지정하는 곳이다. 가급적 물리적으로 장착된 memory의 1/2 이상 지정하는 것을
권장한다.
# /sbin/chkconfig ksm off
# /sbin/chkconfig ksmtuned off
이제 reboot 한다. 정상적으로 reboot 이 완료되면 xen 을 통해 vm을 생성할 수 있게 된다.
reboot 후, 아래 명령을 통해 정상적으로 동작하는지를 확인한다.
# xm list
——————————————————————————-
Name ID Mem VCPUs State Time(s)
Domain-0 0 20211 24 r—– 1884.9
# xm info
——————————————————————————-
host : alang09
release : 2.6.32-131.21.1.el6.xendom0.x86_64
version : #1 SMP Mon Dec 26 19:06:17 KST 2011
machine : x86_64
nr_cpus : 24
nr_nodes : 2
cores_per_socket : 6
threads_per_core : 2
cpu_mhz : 2666
hw_caps : bfebfbff:2c100800:00000000:00003f40:009ee3fd:00000000:00000001:00000000
virt_caps : hvm hvm_directio
total_memory : 24567
free_memory : 1682
free_cpus : 0
xen_major : 4
xen_minor : 1
xen_extra : .2
xen_caps : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
xen_scheduler : credit
xen_pagesize : 4096
platform_params : virt_start=0xffff800000000000
xen_changeset : unavailable
xen_commandline : dom0_mem=22000M loglvl=all guest_loglvl=all iommu=1
cc_compiler : gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC)
cc_compile_by : mockbuild
cc_compile_domain :
cc_compile_date : Wed Dec 14 11:41:56 EST 2011
xend_config_format : 4
——————————————————————————-
– GPU PassThrough 기본 설정 하기
이제 GPU passThrough 를 설정하는 방법이다.
위 단계에서 Kernel rebuild 와 xen 이 적용된 kernel로 boot 이 성공되었다면,
VM 에서 사용할 GPU의 PCI ID를 확인하여 grub.conf 에 적용해야 한다.
# lspci | grep VGA
——————————————————————————
02:00.0 VGA compatible controller: nVidia Corporation GT216 [GeForce GT 220] (rev a2)
07:01.0 VGA compatible controller: Matrox Graphics, Inc. MGA G200eW WPCM450 (rev 0a)
83:00.0 VGA compatible controller: nVidia Corporation GF106GL [Quadro 2000] (rev a1)
——————————————————————————
현 시스템은 3개의 VGA를 장착하고 있다. 07:01.0 에 VGA card는 system console용으로 사용되는
기본 VGA이다.
여기서는 83:00.0 에 장착된 Nvidia Quadro 2000 Card를 VM에 할당할 계획이다.
해당 PCI ID를 grub.conf 에 반영한다.
# vi /boot/grub/menu.lst
—————————————————————————–
.
title Enterprise Linux (2.6.32-131.21.1.el6.xendom0.x86_64)
root (hd0,0)
kernel /boot/xen.gz dom0_mem=22000M loglvl=all guest_loglvl=all iommu=1
module /boot/vmlinuz-2.6.32-131.21.1.el6.xendom0.x86_64 ro root=UUID=500fb141-a70e-4607-8969-12b98718acd2 \
nomodeset rd_NO_LUKS LANG=ko_KR.UTF-8 rd_NO_MD quiet rhgb crashkernel=128M KEYBOARDTYPE=pc \
KEYTABLE=us rd_NO_LVM rd_NO_DM \
pci=resource_alignment=83:00.0;83:00.1 \
xen-pciback.permissive \
xen-pciback.hide=(83:00.0)(83:00.1)
module /boot/initramfs-2.6.32-131.21.1.el6.xendom0.x86_64.img
.
—————————————————————————-
설정이 반영되는 지점은 kernel 항목에 iommu=1 반영
modules 항목에 pci=resource_alignment=83:00.0;83:00.1 xen-pciback.permissive xen-pciback.hide=(83:00.0)(83:00.1)
이다.
83:00.1 은 quadro 2000에 같이 장착된 audio 장치에 대한 정보이다. 여기서는 같이 추가하였다.
여러개의 PCI 장치를 VM 에서 사용한다면 위 설정과 같이 계속 추가해 갈수 있다.
다시 reboot 한다.
– VM 생성 기본 환경 설정 하기
이제 VM을 생성해 보도록 한다.
RHEL 환경에서 xen을 관리하기 위해서는 libvirt 와 virt-manager를 사용하게 되는데,
기본적으로 RHEL 에 설치된 libvirt 는 KVM 에 맞추어져 있다. xen에서는 사용할 수 없다.
xen 에서 사용하기 위해서는 관련 패키지를 rebuild 해야한다.
libvirt 패키지를 rebuild 하기 위해서는 xen 커널 상태에서는 문제가 발생한다.
RHEL orginal 커널로 재부팅을 한다.
RHEL 기본 커널로 재부팅 후, libvirt rebuild를 위해 몇가지 패키지를 설치한다.
# yum install libvirt virt-manager xorg-x11-xauth
# wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/libvirt-0.9.4-23.el6_2.1.src.rpm
# rpm -i libvirt-0.9.4-23.el6_2.1.src.rpm
# wget http://pasik.reaktio.net/xen/patches/libvirt-spec-rhel6-enable-xen.patch
# cd /root/rpmbuild/SPECS
# cp -a libvirt.spec libvirt.spec.orig
# patch -p0 < ~/src/libvirt-spec-rhel6-enable-xen.patch
patching file libvirt.spec
# rpmbuild -bb libvirt.spec
# yum install libnl-devel xhtml1-dtds libudev-devel libpciaccess-devel yajl-devel libpcap-devel avahi-devel parted-devel device-mapper-devel numactl-devel netcf-devel
# rpmbuild -bb libvirt.spec
# cd /root/rpmbuild/RPMS/x86_64/
# rpm -Uvh –force libvirt-*
# /sbin/chkconfig –level 345 libvirtd on
이제 다시 xen 커널로 리부팅 한다.
libvirt 가 재대로 동작하는지 확인한다.
# virsh list
—————————————————————————–
Id 이름 상태
———————————-
0 Domain-0 실행중
– VM 생성하기
xen 환경에서 vm을 생성하는 방법은 크게 두가지가 존재한다. virt-manager(virt-install)를
사용하는 방법과 xm create 를 이용하는 방법이다.
virt-manager를 사용하는 방법은 아래 사이트 내용을 참고한다.
http://blog.syszone.co.kr/2991
아래는 xen tool을 이용하여 vm을 설치하는 방법이다.
# cd /etc/xen
# vi winxp-00.hvm
—————————————————————————-
kernel=”/usr/lib/xen/boot/hvmloader”
device_model=”/usr/lib64/xen/bin/qemu-dm”
builder=”hvm”
memory =”4096″
name =”winxp-00″
vcpus =”4″
vif = [ ‘type=ioemu, bridge=xenbr0′ ]
disk = [ “file:/data/winxp-00,hda,w”,”file:/usr/local/src/Win7Ent.iso,ioemu:hdc:cdrom,r” ]
boot = “dc”
sdl = 0
opengl = 1
vnc = 1
stdvga = 0
serial = “pty”
tsc_mode = 1
localtime = 1
usbdevice=’mouse’
usbdevice=’tablet’
—————————————————————————
유의해야할 설정은 boot 와 disk 이다.
boot 의 값에 a, c, d, n 등의 값이 들어갈수 있다 .
a : floppy
c : hard disk
d : cdrom
n : network (pxe boot)
boot 값에 들어가는 순서대로 boot device 가 인식된다.
disk 의 “file:/data/winxp-00,hda,w” 은 vm 의 hard disk 에 해당하는 이미지 파일이다.
“file:/usr/local/src/Win7Ent.iso,ioemu:hdc:cdrom,r” 는 cdrom 에 해당하는 iso 이미지 파일이다.
만일 물리적인 cdrom장치를 사용할 경우에는 아래와 같은 방식으로 설정을 한다.
disk = [ “file:/VOS/KR-WIN7.img,hda,w”,”phy:/dev/cdrom,hdc:cdrom,r” ]
sdl 은 xm create 로 vm을 시작하면 자동으로 VNC 가상 콘솔 실행 여부를 정의하는 설정이다.
localtime은 해당 VM의 시간을 domain0 의 시스템 시간과 동기화 시키는 옵션
usbdevice=’tablet’은 VM의 VNC 콘솔로 mouse를 클릭했을때 mouse가 VM 콘솔안에
잠기게 된다. 이를 해제하기 위해서는 CTRL+ALT key를 눌려야 하는데, 이 옵션이
포함되면 자유롭게 local PC와 vm vnc console을 mouse로 이동할수 있다.
xm create 로 이미지를 생성하기 위해서는 먼저 disk 에 vm 이미지 파일을 먼저 생성해야 한다.
아래는 dd 명령을 통해 30GByte 에 해당하는 /data/winxp-00 이미지 파일을 생성하는 내용이다.
# dd if=/dev/zero of=/data/winxp-00 bs=1M count=30000
이제 hvm 설정대로 vm을 생성해 보자
# xm create winxp-00.hvm
vncviewer 를 통해 vm 의 가상 콘솔로 접속해 보자
# xm vncviewer winxp-00
or
# virt-viewer winxp-00
windows 운영체제를 설치한다.
– GPU PassThrough 설정하기
운영체제 설치가 완료되면, 일단 vm을 종료시킨다.
# xm shutdown winxp-00
그런 후 direct 로 접근한 GPU 에 대한 PCI ID를 입력한다.
# vi /etc/xen/winxp-00.hvm
—————————————————————————-
kernel=”/usr/lib/xen/boot/hvmloader”
device_model=”/usr/lib64/xen/bin/qemu-dm”
builder=”hvm”
memory =”4096″
name =”winxp-00″
vcpus =”4″
vif = [ ‘type=ioemu, bridge=xenbr0′ ]
disk = [ “file:/data/winxp-00,hda,w”,”file:/usr/local/src/Win7Ent.iso,ioemu:hdc:cdrom,r” ]
boot = “dc”
sdl = 0
opengl = 1
vnc = 1
stdvga = 0
serial = “pty”
tsc_mode = 1
localtime = 1
usbdevice=’mouse’
usbdevice=’tablet’
gfx_passthru=0
pci=[’83:00.0′,’83:00.1′]
—————————————————————————-
다시 vm 을 부팅한다.
# xm create winxp-00.hvm
재대로 PCI PassThrough 가 되는지 확인한다.
# xm pci-list winxp-00
—————————————————————————-
Vdev Device
05.0 0000:83:00.0
—————————————————————————-
또 PCI PassThrough 를 시킬 수 있는 장치에 대한 리스트를 확인해 볼수도 있다.
# xm pci-list-assignable-device
—————————————————————————-
0000:83:00.0
0000:83:00.1
0000:00:1a.1
0000:00:1a.2
—————————————————————————-
이제 VNC 가상 콘솔로 접속한다.
# xm vncviewer winxp-00.hvm
장치관리자에 디스플레이 설정을 보면 “표준VGA” 가 하나 더 secondary 장치로 인식되어 있을 것이다.
네트워크 설정을 한 후, nvidia 사이트에 가서 quadro 2000 driver 를 다운 받아 설치한다.
secondary VGA 장치가 NVIDIA Quadro 2000 으로 인식되었는지를 확인한다.
원격데스크탑 설정을 활성화하고, RGS를 설치한다.
그런 후 VM을 종료한다.
winxp-00.hvm 설정에 gfx_passthru 설정 값을 1 로 수정한다.
gfx_passthru 설정은 VM에서 인식하는 두개의 VGA 중 direct로 접근하는 VGA를 primary 로 인식하게
하는 설정이다.
# vi /etc/xen/winxp-00.hvm
—————————————————————————-
kernel=”/usr/lib/xen/boot/hvmloader”
device_model=”/usr/lib64/xen/bin/qemu-dm”
builder=”hvm”
memory =”4096″
name =”winxp-00″
vcpus =”4″
vif = [ ‘type=ioemu, bridge=xenbr0′ ]
disk = [ “file:/data/winxp-00,hda,w”,”file:/usr/local/src/Win7Ent.iso,ioemu:hdc:cdrom,r” ]
boot = “dc”
sdl = 0
opengl = 1
vnc = 1
stdvga = 0
serial = “pty”
tsc_mode = 1
localtime = 1
usbdevice=’mouse’
usbdevice=’tablet’
gfx_passthru=1
pci=[’83:00.0′,’83:00.1′]
—————————————————————————-
다시 시작한다.
# xm create winxp-00.hvm
# xm vncviewer winxp-00
-> qemu> prompt 화면 나타남
gfx_passthru=1 을 적용하면 VNC 를 통한 가상 콘솔 화면을 볼수 없게 된다.
이제 해당 VM의 console 화면을 보기 위해서는 물리적으로 장착된 Nvidia Quadro 2000
장치에 모니터를 연결하여야 화면을 볼수 있다.
앞서 원격데스크탑을 활성화 했으니, VM의 부팅이 완료된 상태에서는 원격 데스크탑으로
접속하여 콘솔 작업을 진행할 수 있다.
– VM 에 Physical Keyboard/Mouse passthrough 설정하기
이제 VM에서 접근하는 VGA 장치에 모니터를 달면 VM 콘솔 화면이 나타난다.
하지만 Xen Host 에 장착된 Keyboard 와 Mouse 로는 동작할 수가 없다.
VM에서 사용할 수 있는 USB Type 의 Keyboard와 Mouse 를 서버에 장착한다.
해당 장치의 정보를 확인한다.
# lsusb
—————————————————————————-
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 002: ID 1bcf:0007 Sunplus Innovation Technology Inc. Optical Mouse
Bus 005 Device 003: ID 173d:0002
—————————————————————————–
보다 자세한 정보를 보기 위해서는 lsusb 명령에 -v 옵션을 사용하면 된다.
위 정보를 보면 USB ID 1bcf:0007 는 mouse 이고, 173d:0002 는 keyboard 이다.
winxp-00.hvm 파일에 usb 설정을 추가한다.
# vi /etc/xen/winxp-00.hvm
—————————————————————————–
.
usbdevice=’mouse’
usbdevice=’keyboard’
usb = 1
usbdevice = “host:1bcf:0007”
usbdevice = “host:173d:0002”
—————————————————————————–
VM 을 실행한다.
# xm create winxp-00.hvm
VM 에 설정된 USB 장치를 추가한다.
# xm usb-add winxp-00 host:1bcf:0007
# xm usb-add winxp-00 host:173d:0002
제거 할때는 usb-del 명령을 이용한다.
USB passthrough 를 시킬 수 있는 장치 목록 확인은 아래 명령으로 가능하다.
# xm usb-list-assignable-devices
—————————————————————————–
4-1 : ID 1bcf:0007 Sunplus Innovation Technology Inc. Optical Mouse
4-2 : ID 05af:0802 USB Keyboard
—————————————————————————–
키보드 인식 하기
xm usb-hc-create 명령을 통해 VM 상에 usb host 를 생성한다. 해당 명령 뒤에 2개의 인자가
붙는데 첫번째는 usb 버전, 두번째는 usb port 수 이다.
# xm usb-hc-create winxp-00 1 4
# xm usb-list-assignable-devices
——————————————————————————–
4-1 : ID 1bcf:0007 Sunplus Innovation Technology Inc. Optical Mouse
4-2 : ID 05af:0802 USB Keyboard
——————————————————————————–
위 명령으로 USB Passthrough를 시킬 수 있는 장치 목록을 확인한다.
4-2 USB Keyboard 장치를 winxp-00 VM 의 USB host 에 추가 시킨다.
# xm usb-attach winxp-00 0 1 4-2
USB host 에 연결된 장치 목록을 확인한다.
# xm usb-list winxp-00
——————————————————————————-
Idx BE state usb-ver BE-path
0 0 1 USB1.1 /local/domain/0/backend/vusb/1/0
port 1: 4-2 [ID 05af:0802 USB Keyboard]
port 2:
port 3:
port 4:
——————————————————————————
위 절차의 설정을 hvm 설정 파일에 반영하는 방법은 아래와 같다.
# vi /etc/xen/winxp-00.hvm
————————————————————————–
.
vusb=[‘usbver=1, numports=4, port_1=4-2′]
————————————————————————–
콘솔에서 Multi VMS를 통해 USB 마우스/키보드를 분리하기 위해서는
gfx_passthru=2 설정이 필요함 -> 검증 필요
– RGS 설치하기
GPU PassThrough 된 VM 에 원격으로 접속하여 고성능의 그래픽 자원을 사용하기
위해서는 remote 환경에서 접속하여 물리적인 그래픽 장치를 그대로 이용하여
비디호 신호를 처리하고, 그 결과 화면을 빠르게 전송할 수 있는 원격 데스크탑
프로토콜이 필요하다.
HP RGS를 이용하여 이 역할을 수행할 수 있다.
위 단계까지 정상적으로 처리가 되었다면, PassThrough 된 GPU 장치에 장착된
모니터와 콘솔용 Keyboard/Mouse를 이용하여 GPU 용 VM 에 접속을 한다.
그런 후 HP RGS를 설치한다.
만일 GPU PassThrough 까지 처리는 정상적이나 USB Keyboard/Mouse에 대한
PassThrough가 정상적으로 안되는 경우, 콘솔 화면에서 입출력에 대한 통제
를 할수 없게 된다.
이런 경우를 대비해 원격데스트탑 서비스를 앞 단계에서 활성화 시켜두었다.
원격 데스크탑으로 접속하여 RGS를 설치한다. 원격 데스크탑 환경에서 RGS
를 설치하면 설치 도중, 원격 상태임을 알리며, 설치가 진행되면서 자동으로
리부팅한다는 메세지와 함께 접속 세션이 끊어지게 된다.
1~5분 정도 기다리면 리부팅이 되고, 그 이후 부터는 RGS로 접속이 가능하다.
리부팅 되는 과정에 대한 모니터링은 “xm list” 를 통해 해당 VM의 상태를
확인하면 된다.
– virt-manager 를 통한 GPU PassThrough 설정
본 내용은 참고만 하길 바란다. 본 문서는 xen tool 을 이용하여 GPU PassThrough
를 구현하는 것을 설명하고 있다. 앞서 얘기한바와 같이 libvirt와 virt-manager
를 이용해서도 xen vm 을 생성할 수 있고, 관리할 수도 있다.
virt-manager를 이용하여 VM을 생성한 경우 virt-manager 상에서 PCI 장치를
추가하면 python 에러가 발생한다. 그러므로 GPU PassThrough 를 위해서는
수동으로 관련 설정을 추가해야 한다.
우선 virt-manager를 이용하여 정상적으로 VM을 만든 후, 종료를 한다.
virsh 명령을 이용하여 해당 VM 의 설정을 edit 할수 있다.
# virsh edit winxp-00
——————————————————————————
<domain type=’xen’>
<name>winxp-00</name>
<uuid>59024ab7-adc2-fc77-1c36-e157a51b042f</uuid>
<description></description>
<memory>3145728</memory>
<currentMemory>3145728</currentMemory>
<vcpu>4</vcpu>
<os>
<type>hvm</type>
<loader>/usr/lib/xen/boot/hvmloader</loader>
<kernel></kernel>
</os>
<clock offset=’localtime’>
<timer name=’hpet’ present=’no’/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/lib64/xen/bin/qemu-dm</emulator>
<disk type=’file’ device=’disk’>
<driver name=’file’/>
<source file=’/data/winxp-00’/>
<target dev=’hda’ bus=’ide’/>
</disk>
<disk type=’file’ device=’cdrom’>
<driver name=’file’/>
<source file=’/usr/local/src/Win7Ent.iso’/>
<target dev=’hdc’ bus=’ide’/>
<readonly/>
</disk>
<interface type=’bridge’>
<mac address=’00:16:3e:64:04:e4’/>
<source bridge=’xenbr0’/>
<script path=’/etc/xen/scripts/vif-bridge’/>
</interface>
<serial type=’pty’>
<target port=’0’/>
</serial>
<console type=’pty’>
<target type=’serial’ port=’0’/>
</console>
<input type=’tablet’ bus=’usb’/>
<input type=’mouse’ bus=’ps2’/>
<graphics type=’vnc’ port=’-1′ autoport=’yes’ keymap=’en-us’/>
<hostdev mode=’subsystem’ type=’pci’ managed=’no’>
<source>
<address domain=’0x0000′ bus=’0x83′ slot=’0x00′ function=’0x0’/>
</source>
</hostdev>
# GPU PassThrough config #
<hostdev mode=’subsystem’ type=’pci’ managed=’no’>
<source>
<address domain=’0x0000′ bus=’0x83′ slot=’0x00′ function=’0x1’/>
</source>
</hostdev>
# GPU PassThrough config #
</devices>
</domain>
————————————————————————————-
# virsh start winxp-00
# virt-viewer winxp-00
이제 윈도우 장치 관리자에 GPU 관련 VGA 장치가 하나 추가 되었을 것이다.
NVIDIA 드라이브를 설치하고, 원격데스트탑을 활성화한 후, RGS를 설치한다.
그런 후, 해당 VM을 종료한다.
# virsh edit winxp-00
아래 옵션 제거
<graphics type=’vnc’ port=’-1′ autoport=’yes’ keymap=’en-us’/>
# virsh start winxp-00
이제 가상 콘솔 VNC로 접속이 되지 않을 것이다. xen tool 에서 gfx_passtru 옵션을 적용
했을때와 동일하게 qemu> 화면만 나타난다.
원격 데스크탑이나, RGS를 통해 접속하면 된다.
– Xen PV Driver 설치 하기
이제 Xen VM의 성능을 최적화하기 위해 PV Driver를 설치한다.
주로 Disk, Network, Pci 장치등에 대한 driver를 Xen 전용 driver를 사용함으로
prarvirtualization 효과를 주게 된다.
아래 사이트에서 드라이버를 다운받는다.
http://www.jolokianet.net/70Knowledge/Virtualization/Open_Source_Windows_Paravirtualization_Drivers_for_Xen/Installing_the_0.10.x_GPLPV_Drivers
windows 2008/vista/7 을 설치할때는 설치전 command 상에서 아래 명령을
실행한 후 설치를 하도록 한다.
bcdedit /set testsigning on
*YOU MUST REBOOT BEFORE INSTALLING THE DRIVERS!*
-Xen PV Driver 삭제하기
uninstall_0.10.x.bat 실행
리부팅 – 리부팅 시 PV Driver 에서 다시 표준 VM driver를 설치함으로
다시 리부팅 될수 있음.
제어판에서 GPL PV driver 삭제, Xen PV Driver 들 삭제..
리부팅
C:\windows 밑에 xen*.sys 파일들 찾아서 삭제
리부팅
– VM 복제 방법
Open Xen 환경에서 VM 을 복제하는 방법이다.
virt-manager를 이용한 경우 virt-clone 명령을 이용하여 간단히 복제가
가능하지만 xen tool을 이용한 경우에는 다소 수동적인 방법이 필요하다.
virt-manger 환경에서의 VM 복제 방법은 http://blog.syszone.co.kr/3125
문서를 참고한다.
xen tool 환경에서의 복제 방법은 아래와 같다.
먼저 복제할 VM 이미지를 복제한다.
# dd if=/data/win07-00 of=/data/win07-10 bs=4k
xen hvm 파일을 복사한다.
# cp /etc/xen/win07-00.hvm /etc/xen/win07-10.hvm
win07-10.hvm 파일을 열어서 name 과 disk를 값을 win07-10 으로 변경한다.
또한 복제 대상 VM이 현재 Live 상태라면, 복제된 VM을 실행할때 IP 충돌이
발생한다. vif 설정에 ip를 강제로 넣어 기존 VM과 충돌을 예방한다.
vif = [‘type=ioemu, ip=192.168.123.63, bridge=xenbr0’]
혹은 복제 대상 전용 VM을 만들고, 기본 네트워크 설정을 DHCP로 하여 운영
해도 좋을듯 하다.
새로 복제한 VM 을 실행한다.
# xm create win07-10.hvm
실행이 완료되면 administrator 로 접속하여 운영체제 버전에서 제공하는
sysprep 명령을 이용하여 SID 를 변경한다. “다시봉인” 메뉴 선택.
변경 시 인증등 생략 가능한 것은 생략한다. (정식의 경우에는 인증도 해야할듯)
리부팅 하여 다시 접속하면, 최초 윈도우 설정 상태로 돌아간다.
간단히 설정하고, 다시 리부팅하면, 기존 VM의 응용상태를 유지하면서
새로운 윈도우를 만들수 있다.
참고 ; XP의 경우 sysprep 툴은 OS 배포 CD 의 Support\Tools 폴더 밑에 Deploy.cab
파일을 열면 들어 있다. sysprep.exe 파일과 setupcl.exe 파일을 임의의 디렉토리
에 복사한 후, sysprep.exe 파일을 실행하면 된다.
Windows7의 경우 C:\Windows\system32\sysprep 디렉토리안에 해당 명령이
기본적으로 제공된다.
참고 : sysprep 으로 OS를 통인할 경우 백신 프로그램이나 Daemon Tool 가 같은
가상 device를 생성하는 프로그램은 설치하지 않도록 한다.
Active directory에 참여하는 VM 생성 시에는 sysprep 을 하지 않은 템플릿 이미지
를 통해 VM을 새로 생성하고, 초기에 새로 sysprep 를 해주도록 한다. SID충돌 문제
4. 이슈
– 물리적인 디스크 (파티션, 볼륨) 사용하기
VM 에 사용할 디스크 공간을 LVM으로 구성한후, 사전에 만들어둔 vm 이미지파일을
dd 로 lvm 파티션에 dump 하여 사용하면 된다.
성능은 물리적인 성능과 가까이 나온다.
dd if=winxp-00 of=/dev/mapper/vg_vol-LogVol04 bs=4k
hvm config
disk = [ “phy:/dev/mapper/vg_vol-LogVol04,hda,w”,”file:/usr/local/src/WindowsXP3.iso,ioemu:hdc:cdrom,r” ]
– Keyboard PassThrough
– Multi VGA PassThrough
Xen-4.1.2 버전에서 Multi VGA PassThrough 에 대한 다른 이슈는 없었음.
다만 Passthrough 되는 VGA 종류에 따라 호환성 문제가 있음.
현재 Nvidia, ATI, Intel 등의 VGA Card 에 대해 적용 성공한 정보가 있음.
본 테스트에서는 Nvidia Quadro 2000 과 Nvidia GT220 으로 테스트를 시작
하였음. Nvidia Quadro 2000 은 정상적으로 동작하나, GT220은 드라이버
호환성 문제 발생. 처음에는 VGA PassThrough 시 secondary VGA에 대한
이슈로 판단했으나, VGA 장치의 호환성 문제임. Quadro2000을 2개를 장착
하여 2개의 VM에서 동시에 동작하니, 문제 없음.
두번째 VGA를 passthrough 하는 방법은 첫번째와 동일함. grub.conf 에
해당 장치의 PCI ID를 등록하고, xen hvm 설정에서 gfx_passthru 관련
옵션을 추가해 주면 됨.
2011.12.29
추가적으로 Quadro4000, QuardFX580 도 테스트를 해보았다.
Quardo4000은 정상, QuardroFX580은 호환성 문제 발생
동시 3개의 GPU PassThrough 성공
* Enable GPU PT VGA
NVIDIA Quardro 2000
NVIDIA Quardro 4000
* Disable GPU PT VGA
NVIDIA GT 220
NVIDIA Quardo FX 580
NVIDIA GTX 560Ti
– Windows7 + RGS 조합 시 Panic
Windows7 을 guest OS로 하여 GPU Passthrough 를 설정하면 nvlddmkm.sys
관련 BSOD 와 같은 다양한 문제가 발생한다. 이 문제는 Nvidia GPU를 사용
할 경우 발생하는 문제인듯 함. 해결 방법은 hvm 설정에 아래 두가지의
설정을 off 하면 된다.
pci_msitranslate = 0
pci_power_mgmt = 0
아래는 Windows7 에 대한 권장 hvm 설정이다.
————————————————————————–
kernel=”/usr/lib/xen/boot/hvmloader”
device_model=”/usr/lib64/xen/bin/qemu-dm”
builder=”hvm”
memory =”3072″
name =”win7-002″
vcpus =”2″
vif = [ ‘type=ioemu, bridge=xenbr0, model=e1000’ ]
disk = [ “phy:/dev/sdb6,hda,w”,”file:/usr/local/src/Win7Ent.iso,ioemu:hdc:cdrom,r” ]
boot = “dc”
sdl = 0
opengl = 1
vnc = 1
stdvga = 0
serial = “pty”
vncconsole = 1
localtime = 1
viridian = 1
xen_platform_pci=1
pci_msitranslate = 0
pci_power_mgmt = 0
acpi=1
apic=1
acpi_s3 = 1
acpi_s4 = 1
on_poweroff = ‘destroy’
on_reboot = ‘restart’
on_crash = ‘restart’
xen_extended_power_mgmt=1
pae=1
hpet = 1
#hap = 1
#usbdevice=’mouse’
#usbdevice=’keyboard’
usbdevice=’tablet’
#vusb=[‘usbver=2, numports=4, port_1=3-2,port_2=3-1,port_3=4-2′]
#usb = 1
#usbdevice = “host:046b:ff10”
#usbdevice = “host:1bcf:0007”
#usbdevice = “host:05af:0802”
gfx_passthru=1
pci=[’84:00.0’]
————————————————————————-
테스트된 NVIDIA Driver는 275.33 ~ 285.58 이다. 모두 정상적으로 동작하는 것을 확인하였다.
– xen tool 을 이용한 vm 관리 방안
start, shutdown, save, snapshot, migration, clone, restore 에 대한
기본 운영 방법 확인
RNTier 관리 연동 방안 모색
– Xen kernel rpm 생성 -> xen passthrough config 적용된 rpm
– Dom0_mem 최적 설정 값 찾기
– Windows7 4GPU 사용 시 0x00000116 다운 문제
TDR 서비스에 의한 문제로 레지스터리 수정을 통해 해결 가능하다고 한다.
하지만 수정을 하면 116 코드로 다운되는 경우는 없으나, vm state가 background 상태로
실제 통제 불능 상태가 되는 증세가 종종 발생한다.
경험으로는 4대 시스템을 모두 사용할때, 아무런 동작을 하지 않은 채 장시간 VM을 켜둘때
증세가 주로 발생한다.
일단 TDR 서비스 관련 수정 방법이다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers
DWORD TdrDelay = 30
DWORD TdrDdiDelay = 30
Or
String value TDRDelay = 0
(이게 정답, 위에것은 계속 116 에러 발생. 대신 이걸 하면 그냥 죽음..)
– 특정 시간(30분이내)이 지나면 blocked 상태로 Guest VM 중지
BIOS 에서 Turbo, EIST, Hyper-thread 를 disable 함.
– kernel:Disabling IRQ #16 에러 문제
irq 16: nobody cared (try booting with the “irqpoll” option)
Pid: 0, comm: swapper Not tainted 2.6.32-131.21.1.el6.xendom0.x86_64 #2
Call Trace:
<IRQ> [<ffffffff810d9a3b>] ? __report_bad_irq+0x2b/0xa0
[<ffffffff810d9c3c>] ? note_interrupt+0x18c/0x1d0
[<ffffffff810da325>] ? handle_fasteoi_irq+0xc5/0xf0
[<ffffffff812fb018>] ? __xen_evtchn_do_upcall+0x218/0x2f0
[<ffffffff812fb5fd>] ? xen_evtchn_do_upcall+0x3d/0x60
[<ffffffff8100d31e>] ? xen_do_hypervisor_callback+0x1e/0x30
<EOI> [<ffffffff810013aa>] ? hypercall_page+0x3aa/0x1010
[<ffffffff810013aa>] ? hypercall_page+0x3aa/0x1010
[<ffffffff810084a0>] ? xen_safe_halt+0x10/0x20
[<ffffffff8101514d>] ? default_idle+0x4d/0xb0
[<ffffffff8100ae86>] ? cpu_idle+0xb6/0x110
[<ffffffff81008c89>] ? xen_irq_enable_direct_end+0x0/0x7
[<ffffffff814fc8b2>] ? cpu_bringup_and_idle+0x13/0x15
handlers:
[<ffffffff813bb640>] (usb_hcd_irq+0x0/0x90)
Disabling IRQ #16
# cat /proc/interrupts | more
.
16: 81 0 0 0 0 0 44811756 0
0 0 0 0 xen-pirq-ioapic-level uhci_hcd:usb3
# lspci | grep USB
00:1a.0 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #4
00:1a.1 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #5
00:1a.2 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #6
00:1a.7 USB controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2
00:1d.0 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #1
00:1d.1 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #2
00:1d.2 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #3
00:1d.7 USB controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #1
# cat /proc/bus/usb/devices | more
T: Bus=08 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 2.06
S: Manufacturer=Linux 2.6.32-131.21.1.el6.xendom0.x86_64 uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:1d.2
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
grub.conf -> acpi=off
irqpoll
– windows 환경에서 RGS 접속 안되는 문제
Linux RGS client 로는 접속이 잘되지만, 윈도우 RGS client 에서 접속이 안되는 경우가
있다. 이경우는 PV Driver를 설치하여 Nic 가 pv driver로 지정되어 있을때 발생한다.
아직 명확한 원인 규명은 못한 상태이고, 해결 방법은 PV driver를 제거하면 된다.
PV driver 를 설치하면 VM의 network, disk, pci 관련 장치들의 성능이 향상되는데,
이런 목적으로 PV driver를 설치해야 하는 RGS 환경의 경우 Network 부분은 제외하면 된다.
이미 PV driver를 설치했을 경우 제거 하는 방법은 아래 사이트에서 제공하는 uninstall
batch file 을 이용하면 된다.
http://wiki.univention.de/index.php?title=Installing-signed-GPLPV-drivers
– 네트워크 성능 향상 방법
크게 3가지 방법이 있다.
첫째,
VM을 기본 설치하면 Realtek 8139 nic 장치가 잡힌다. 이는 100Mbps 장치로 Gbps 성능을
생각했을 경우 성능이 매우 떨어질것이다.
hvm 설정에서 vif = [ ‘type=ioemu, bridge=xenbr1’] 이부분에 model=e1000 항목을 추가한다.
vif = [ ‘type=ioemu, bridge=xenbr1, model=e1000’ ]
둘째,
PV driver를 설치한다. 그럼 Xen PV Network 장치가 잡히기 되는데, 해당 장치의 [속성]으로
들어가서 [구성] -> [고급] 항목으로 들어간다.
Disable Checksum Offload.
Disable Large Send Offload.
Disable Scatter/Gather.
참고로 이방법은 권장하지 않는다. PV driver 중 Net driver 의 경우 시스템(host)을 불안하게
하거나 Guest에서 네트워크 동작 상태를 불안하게 하는 증세가 발견되었다.
셋째,
물리적인 NIC를 PCI passthrough 로 직접 연결하는 방법이 있다.
– VM에 여러개 Nic 장착하기
vif = [ ‘type=ioemu, bridge=xenbr1, model=e1000′,’type=ioemu, bridge=xenbr0, model=e1000’ ]
– virt-manager에 Xen VM 등록하기
xen command로 만든 vm 정보는 기본적으로 virt-manager에 등록되지 않는다.
xm create 로 실행읗 하면 virt-manager에 해당 vm이 나타나지만, vm이 종료되면 다시 해당 정보가
사라진다.
만일 xen vm의 기본 관리를 virt-manager를 통해 하고 싶을 경우, 두가지 방법이 있다.
– xm new 명령을 이용한 방법
xm new win7-00.hvm
– virsh define 명령을 이용한 방법
먼저 xm create 명령으로 vm을 실행한다.
# xm create win7-00.hvm
그런 후 virsh edit 명령으로 xen hvm 설정을 libvirt 상의 xml 설정으로 변환한다.
# virsh edit win7-00
virsh 상에서 변환된 xml 값을 복사하여 win7-00.xml 파일을 만든다.
그런 후 virsh define 명령으로 virt-manager 에 등록한다.
# virsh define win7-00.xml
**** LVM을 이용한 VM DISK 관리..
– Guest OS로 Linux 설치 시 주의 사항
Guest OS로 Linux를 설치하면 매번 guest OS를 부팅할때 마다 mac 주소가 변경된다.
이로 인해 ifcfg-eth0의 IP설정내용이 dhcp 상태로 초기화 되는 문제 발생
해결하기 위해서는 quest os 부팅 후 네트워크 설정 파일인 ifcfg-ethx 파일을 열어보면
HWADDR 설정이 잡혀있다. 해당 mac주소를 xen hvm 설정 중 네트워크 설정인 vif 에
guest OS의 mac을 추가해야 한다.
# vi rhel5-01.hvm
——————————————————————-
.
vif = [ ‘type=ioemu, bridge=xenbr0, mac=00:16:3e:14:e1:53’ ]
.
——————————————————————-
– xen kernel repo
cd /etc/yum.repos.d/
wget http://www.crc.id.au/repo/kernel-xen-release-6-3.noarch.rpm
rpm -Uvh kernel-xen-release-6-3.noarch.rpm
yum install kernel-xen xen
vi EL6_Xen.repo
[el6-xen]
name=Xen compiled for EL6 – $basearch
baseurl=http://xenbits.xen.org/people/mayoung/EL6.xen/$basearch/
enabled=1
gpgcheck=0
[el6-xen-source]
name=Xen compiled for EL6 – Source
baseurl=http://xenbits.xen.org/people/mayoung/EL6.xen/SRPMS/
enabled=0
gpgcheck=0
– nic problem
# modinfo e1000e
filename: /lib/modules/2.6.32-131.21.1.el6.xendom0.x86_64/kernel/drivers/net/e1000e/e1000e.ko
version: 1.2.20-k2
# ethtool -i eth0
driver: e1000e
version: 1.2.20-k2
firmware-version: 1.9-0
bus-info: 0000:05:00.0
# ethtool -S eth1
# lspci | grep Ethernet
05:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
06:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
07:03.0 Ethernet controller: D-Link System Inc DGE-530T Gigabit Ethernet Adapter (rev 11) (rev 11)
RHEL5.x RHEL6.x 에 Intel 82574L NIC 문제 발생
wget http://elrepo.org/linux/elrepo/el6/x86_64/RPMS/elrepo-release-6-4.el6.elrepo.noarch.rpm
yum install kmod-e1000e
Hardware Error]: Machine check events logged
————[ cut here ]————
WARNING: at net/sched/sch_generic.c:261 dev_watchdog+0x26d/0x280() (Not tainted)
Hardware name: X8DTG-QF
NETDEV WATCHDOG: eth0 (e1000e): transmit queue 0 timed out
Modules linked in: iptable_filter(U) ip_tables(U) ebtable_nat(U) ebtables(U) nfsd(U) lockd(U) nfs_acl(U) auth_rpcgss(U) exportfs(U) autofs4(U) sunrpc(U) bridge(U) stp(U) llc(U) ip6t_REJECT(U) nf_conntrack_ipv6(U) nf_defrag_ipv6(U) xt_state(U) nf_conntrack(U) ip6table_filter(U) ip6_tables(U) ipv6(U) xen_gntdev(U) vhost_net(U) macvtap(U) macvlan(U) tun(U) uinput(U) skge(U) e1000e(U) microcode(U) sg(U) i2c_i801(U) i2c_core(U) iTCO_wdt(U) iTCO_vendor_support(U) snd_hda_codec_realtek(U) snd_hda_intel(U) snd_hda_codec(U) snd_hwdep(U) snd_seq(U) snd_seq_device(U) snd_pcm(U) snd_timer(U) snd(U) soundcore(U) snd_page_alloc(U) ioatdma(U) dca(U) i7core_edac(U) edac_core(U) shpchp(U) ext4(U) mbcache(U) jbd2(U) sr_mod(U) cdrom(U) sd_mod(U) crc_t10dif(U) pata_acpi(U) ata_generic(U) ata_piix(U) dm_mirror(U) dm_region_hash(U) dm_log(U) dm_mod(U) [last unloaded: scsi_wait_scan]
Pid: 0, comm: swapper Not tainted 2.6.32-131.21.1.el6.xendom0.x86_64 #2
Call Trace:
<IRQ> [<ffffffff81068287>] ? warn_slowpath_common+0x87/0xc0
[<ffffffff81068376>] ? warn_slowpath_fmt+0x46/0x50
[<ffffffff81465afd>] ? dev_watchdog+0x26d/0x280
[<ffffffff8150ba6c>] ? _spin_unlock_irqrestore+0x1c/0x20
[<ffffffff8107b884>] ? mod_timer+0x144/0x220
[<ffffffff8150ba6c>] ? _spin_unlock_irqrestore+0x1c/0x20
[<ffffffff81465890>] ? dev_watchdog+0x0/0x280
[<ffffffff8107b087>] ? run_timer_softirq+0x197/0x340
[<ffffffff81070871>] ? __do_softirq+0xc1/0x1d0
[<ffffffff8100d2cc>] ? call_softirq+0x1c/0x30
[<ffffffff8100ef05>] ? do_softirq+0x65/0xa0
[<ffffffff81070655>] ? irq_exit+0x85/0x90
[<ffffffff812fb602>] ? xen_evtchn_do_upcall+0x42/0x60
[<ffffffff8100d31e>] ? xen_do_hypervisor_callback+0x1e/0x30
<EOI> [<ffffffff810013aa>] ? hypercall_page+0x3aa/0x1010
[<ffffffff810013aa>] ? hypercall_page+0x3aa/0x1010
[<ffffffff810084a0>] ? xen_safe_halt+0x10/0x20
[<ffffffff8101514d>] ? default_idle+0x4d/0xb0
[<ffffffff8100ae86>] ? cpu_idle+0xb6/0x110
[<ffffffff814ee8ca>] ? rest_init+0x7a/0x80
[<ffffffff81ba0f33>] ? start_kernel+0x41d/0x429
[<ffffffff81ba033a>] ? x86_64_start_reservations+0x125/0x129
[<ffffffff81ba43a0>] ? xen_start_kernel+0x637/0x63e
—[ end trace ec92cd663f6f9faf ]—
grub.conf -> pcie_aspm=off
pci=noacpi
swiotlb=force and iommu=soft
– windows7 ‘ hvm config example
builder = ‘hvm’
memory = ‘8195’
#for upstream qemu:
#device_model_override = ‘/usr/lib/xen/bin/qemu-system-x86_64’
#device_model_version = ‘qemu-xen’
vcpus = 6
# pinning is highly recommended for latency reasons (see corresponding xen commandline in grub)
#cpus=”2-7″
# for installation with physical cdrom:
disk = [ ‘/dev/vg_ssd/win7system,,hda’ , ‘phy:/dev/cdrom,hdc:cdrom,r’ ]
# for after the os-installation:
#disk = [ ‘/dev/vg_ssd/win7system,,hda’ , ‘/dev/vg0/win7data,,hdb’ ]
name = ‘win’
serial = ‘pty’
# mac adress generator e.g. here: http://www.miniwebtool.com/mac-address-generator/
# without gplpv drivers installed:
vif = [‘bridge=br0, mac=00:12:3e:6c:2f:02, model=e1000’ ]
# with gplpv drivers installed:
#vif = [‘bridge=br0, mac=00:12:3e:6c:2f:02, model=virtio’ ]
# uuid generator e.g. here: http://www.guidgenerator.com
uuid = “48a09a51-d6e8-4984-b380-4dff0c9dc7f9”
# after installation “d” can be ommited for a little faster DomU boot
boot=”dc”
sdl=0
# it’s not necessary to have the passed-through GPU as primary within the DomU, so:
gfx_passthru=0
keymap = “en”
vnc=1
vncconsole=0
#vncpasswd=”supersecret”
vnclisten=”127.0.0.1″
vncdisplay=10
pci = [ ’08:00.0′ , ’08:00.1′ , ’00:1d.0′ , ’00:1d.1′ , ’00:1d.2′ , ’00:1d.7′ ]
#only working with upstream-qemu
#soundhw=’hda’
on_xend_stop = “shutdown”
on_poweroff = “destroy”
on_reboot = “restart”
on_crash = “restart”
monitor=1
pci_power_mgmt=1
xen_platform_pci=1
pci_msitranslate=1
viridian=1
hpet=1
acpi=1
apic=1
pae=1
– grub.conf
title Red Hat Enterprise Linux Server (2.6.32-131.21.1.el6.xendom0.x86_64)
root (hd0,0)
kernel /xen.gz dom0_mem=20000M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin loglvl=all guest_loglvl=all iommu=1
module /vmlinuz-2.6.32-131.21.1.el6.xendom0.x86_64 ro root=/dev/mapper/vg_vol-LogVol00 nomodeset rd_NO_LUKS LANG=ko_KR.UTF-8 rd_NO_MD quiet rhgb crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg_vol/LogVol00 rd_NO_DM pci=resource_alignment=83:00.0;83:00.1;84:00.0;84:00.1;02:00.0;02:00.1;03:00.0;03:00.1 xen-pciback.permissive xen-pciback.hide=(83:00.0)(83:00.1)(84:00.0)(84:00.1)(02:00.0)(02:00.1)(03:00.0)(03:00.1)
module /initramfs-2.6.32-131.21.1.el6.xendom0.x86_64.img
– sandy bridge kernel panic 문제
SATA Controller 설정을 AHCI 로 변경, 2.6.32.59-1.choon.centos6.x86_64 커널 사용
http://choonrpms.choon.net/centos/
– stdvga 의 ram size 증가시키기
hvm 설정 파일에 videoram 옵션 추가
videoram=32 (32M)
– sdl 모드에서 ctrl+alt+del 키 보내기 ..
ctrl+alt+2 를 누름. 그럼 qemu command console 로 감.
여기서 “sendkey ctrl-alt-delete” 를 입력함.
그럼 후 ctrl+alt+1 키를 누르면 다시 VM 화면으로 전환됨.
– xen 4.2 에서 auto-balloons 관련 설정 수정 사항..
auto-balloon 은 xen guest 에 할당되는 memory를 유동적으로 조절하는 기능으로
4.2 부터 기본적으로 off 가 되어 있다.
현재 dom0_mem 설정이 물리적인 메모리의 3/4 정도를 잡고 있기 때문에 자동으로
balloon 기능이 설정되지 않으면 VM 1개 이상 띄우면 메모리가 부족하다는 메세지가
나올것이다.
해결 방법 1 :
# vi /boot/grub/menu.lst
kernel /boot/xen.gz dom0_mem=min:2G,max:22G,2G iommu=1
고정적인 VDI 서버일 경우..
해결 방법 2 :
# vi /etc/xen/xend-config.sxp
(enable-dom0-ballooning yes)
HPC 와 VDI 혼용일 경우..
– GUI 설치 하기 ( convirt )
cd /etc/yum.repos.d
wget –no-cache http://www.convirture.com/repos/definitions/rhel/6.x/convirt.repo
yum install convirt
convirt
– VNC 상태에서 cdrom 바꾸기
완전 물리적 장치를 변경하는 방법
ctrl-alt-2
eject hdc
change hdc /dev/cdrom 혹은
ISO 파일을 변경하는 방법
# xm block-attach <domain> file:/path/to/cd1.iso hdc:cdrom r
xm block-list -l xm_domain_name
xm block-detach xm-domain-name 5632
xm block-attach xm-domain-name file://path/to/my/ISO hdc:cdrom r
xm block-attach WINDOWS7-00 file:/VOS/ko_OFFICE14_essentials.iso hdc:cdrom r
– VHD..
vhd 파일을 컨트롤 하기 위해서는
blktap module이 설치되어 있어야 한다
vhd-util create -n TEST.vhd -s 80000MB
tapdisk -n vhd:/VOS/TEST1.vhd
disk = [ “tap2:tapdisk:vhd:/VOS/TEST1.vhd,hda,w”,”file:/VOS/Win7Ent.iso,ioemu:hdc:cdrom,r” ]
cat /sys/class/blktap2/devices
vhd-util snapshot -n TEST_S.vhd -p TEST.vhd
tapdisk -n vhd:/VOS/TEST_S.vhd
xen 에서 vhd 파일을 vm 이미지로 사용할 수 있다.
하여 vhd 파일을 다루는 법을 살짝 알아본다. ( 생성및 스냅샷 )
xen을 설치하고 나면
dom0에 아래와 같은 유틸리티가 있을 것이다.
vhd-util
vhd-update
이중 vhd-util 의 사용법 일부 및 해당 vhd 파일을 vm으로 연결시키는 테스트를 해 본다.
vhd 파일 생성
파일의 생성
vhd-util create -n test.vhd -s 10240
vhd파일에 domU 리눅스 시스템 만들기 // 요 링크는 따로 제작할 예정
생성한 vhd로 vm 띄우기
// test.cfg 내에 disk 설정을 아래와 같이 한다.
disk = [‘VHD_FILE_PATH,vhd,xvda1,rw’]
snapshot
스냅샷 생성법 ( 아마, xenserver의 fast clone이 동작하는 방식이 아닌가.. 정확하진 않습니다.)
vhd-util snapshot -n snapshot_01.vhd -p test.vhd
생성한 vhd로 vm 띄우기
// test.cfg 내에 disk 설정을 아래와 같이 한다.
disk = [‘VHD_SNAPSHOT_FILE_PATH,vhd,xvda1,rw’]
;;; 원본 이미지를 snapshot 해서 sysprep 를 한 경우 ..
case 1 :
snapshot 2 node 생성
ip, hostname, application 변경 시 정상
case 2 :
1노드에서 sysprep 실행 시 정상
2노드에서 sysprep 실행 시 두노드 모두 문제 발생
원본은 정상 유지
-> snapshot 상태에서 sysprep 을 하면 문제가 발생함.
effective case
AD 사용 안하는 경우 ..
원본이미지 용량 문제 개선 -> 복제 시간 단축
;;; 원본 이미지를 sysprep 한 후, 반드시 종료(리부팅 아님)한 상태에서
snapshot 으로 복제 한 경우 ..
모두 정상..
– Windows 이미지 만들기 순서
OS 설치
네트워크 설치
administrator 활성
windows update 실시 – 마지막 업데이트 까지..
pv driver 설치 – 네트워크 드라이브는 제외
VGA driver 설치
RGS 설치, 윈격데스크탑 활성 – RGS sendconfig 설정
SW 설치 – 알약, 데몬 툴 설치 하면 안됨
전원 절전 모드 해제
sysprep – 일반화 체크, 반드시 종료
– VHD 를 raw 로 변환 하기
qemu-img convert -f vpc -O raw win7.vhd win7.raw
– RHEL6.3 NVIDIA Quadro
rdblacklist=nouveau nouveau.modeset=0 3
– 네트워크 본딩 구성 시 ..
bond 장치를 여러 VM이 공유할 경우 mode=1(active/standby)로 구성.
mode=0 일 경우 1대 VM에서는 정상 동작하지만, 2대가 동시에 사용하면
패킷이 밸런스 될때 문제가 발생.
mode=0 를 사용하기 위해서 아래와 같은 방법을 통해 어느정도 네트워크를
안정화 할 수는 있음.
# vi /etc/sysctl.conf
net.ipv4.conf.xenbr0.arp_announce = 2
net.ipv4.conf.xenbr1.arp_announce = 2
net.ipv4.conf.xenbr0.arp_ignore = 1
net.ipv4.conf.xenbr1.arp_ignore = 1
# vi /etc/xen/scripts/choon-network-script
dir=$(dirname “$0”)
“$dir/network-bridge” “$@” vifnum=0 bridge=xenbr0 netdev=bond0
“$dir/network-bridge” “$@” vifnum=1 bridge=xenbr1 netdev=bond1
# vi /etc/xen/xend-config.sxp
(network-script choon-network-script bridge=xenbr1 netdev=bond1 antispoof=yes)
reboot
하지만..완전하지는 않는듯 하다.
balance 에 해당하는 Mode 에서 가장 안정적인 것은 mode=5(tlb) 임
대역폭이 중요한 경우라면 mode=5, 안정성이 최 우선인 곳은 mode=1 사용을 권장한다.
– 윈도우 절전모드 관리
제어판-전원욥션->사용중인전원욥션->고급전원관리->절전->절전모드 해제 타이머허용(사용안함)
절전모드를 접근하는 장치 검색
powercfg -devicequery wake_armed
해당 장치의 속성으로 들어가서 절전 관리 기능 설정
(특히 네트워크 장치: 장치관리자로 가서 네트워크 어댑터 속성 -> 전원 관리 -> 전원끄기 해제
powercfg -h off
관리자 권한으로 cmd > powercfg /a
항상 켜짐(S0)
대기 모드(S1)
절전 모드(S2)
최대 절전 모드(S3)
하이브리드 절전 모드(S4)
완전 전원 종료(S5)
– HP Gen8 머신의 경우 BIOS SATA Controller 설정을
대상 머신 :
HP ProLiant SL390s G7 Server series
HP ProLiant ML350p Gen8 Server series
HP ProLiant DL360p Gen8 Server series
HP ProLiant DL380p Gen8 Server series
HP ProLiant BL460c Gen8 Server series
Enable SATA AHCI Support
설정을 아래 설정으로
Enable Legacy Support
http://bizsupport1.austin.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c03264177&lang=en&cc=us&taskId=101&prodSeriesId=5177949&prodTypeId=3709945
kernel 3.x.x & xen 4.2.1 의 경우 초기 셋팅 시 ..
sdl 사용하지 않고, vnc 방식으로 사용 권장
HP 장비의 의 경우 2.6.32 대 커널 시 kenel panic not syncing 발생..
아마도 SATA controller 를 인식 못하는듯..
kernel 3.6.x 대 사용.
kenrnel 3.6.x 대 xen 환경에서 기본적으로 peth0 라는 네트워크 장치 생성
또한 eth0 가 bridge 로 자동으로 잡힘.
xenbr0를 잡아주고, 리부팅하니, peth0 는 자동으로 사라짐.
– RGS 와 VNC 사용 시 주의 사항..
콘솔 VNC 을 접속한 상태에서 RGS를 접속한 경우, RGS 세션을 강제로 끊으면 그래픽 드라이브에
손상이 가는 문제 발생..주의 바람..
#spice
spice=1
spiceport=6000
spicehost=’192.168.1.187′
spicedisable_ticketing = 0 # default is 0
spicepasswd = ‘password’
apic=0 # disable acpi, if you used the additional patch referred below, use acpi=0 instead
– ATI 그래픽으로 GPU PassThru 구현 하기
ATI 카드의 경우 gfx_passthru 설정이 정상적으로 동작하지 않는 증세가 있음.
ATI VGA의 경우 Windows 가 정상적으로 해당 그래픽 드라이브를 로딩하기 전에
그것을 자동으로 사용할 수 없게 에뮬레이트 어탭터를 이용하여 BIOS 밑 Windows
콘솔에서 사용함. 만일 gfx_passthru를 1로 설정하면 부팅 시 부터 ATI 카드를
통해 그래픽을 표현하고자 함으로 에뮬레이터 VGA를 사용할 수 없고, 초기 부팅
이 진행되지 않음.
ATI 의 경우 gfx_passthru=0 으로 사용해야함.
Windows XP 의 경우 부팅 시 마다 비디오 속성이 초기화(4bit, 480×360) 되는
문제 있음.
Windows 7의 경우 초기화와 유사한 문제는 있지만, 사용은 가능한 수준임.
모니터 해상도를 NVIDIA 와 같이 다른 모니터의 EDID를 입력하여 가상 모니터
로 Wide 확장 해상도를 사용할 수 있지만 ATI는 아직 성공하지 못함.
Windows7 의 경우 드라이브 설치 시 오류 발생. 하지만 드라이브는 인식함.
CCC 설치 시 BSOD 발생. ATI driver 압축 파일 해제 후, 장치관리자에서
그래픽 드라이브 만 별도 설치한다.
– ATI 시스템 driver 인식 및 utilty 설치 방법
1. dotNET4 설치
2. driver(v13.1) 직접 설치 -> 장치관리자->디스플레이->드라이브업데이트
3. APP 설치
– ATI 와 NVIDIA 그래픽 카드 동시 이용시 참고 사항
ATI 와 NVIDIA 그래픽 카드를 동시에 이용할 경우, NVIDIA 역시 gfx_passthru=0
으로 설정해야 부팅이 이루어 진다.
아마도 host 머신에서 부팅 시 최초 인식되는 VGA의 특성을 따라가는 것 같음.
ATI를 먼저 인식할 경우 gfx_passthru 관련 특성이 NVIDIA에도 적용되는듯..
gfx_passthru=0으로 할 경우 표준VGA가 secondary VGA로 인식하게 됨.
– windows7, ATI 관련 hvm 예제
builder=’hvm’
memory = 6144
vcpus=8
name = “win8″
#vif = [‘type=vif, bridge=br0’]
disk = [‘phy:/dev/vg0/Windows8x64,ioemu:hda,w’,’phy:/dev/vg0/steam,ioemu:hdb,w’,’file:/mnt/data/iso/empty.iso,hdc:cdrom,r’]
acpi = 1
boot=”c”
sdl=0
serial=’pty’
vnc=1
vnclisten=’127.0.0.1′
vncunused=1
pci=[’01:00.0′,’01:00.1′,’00:1d.0′,’04:00.0′,’04:01.0′]
gfx_passthru=0
viridian=1
monitor=1
pci_power_mgmt=1
xen_platform_pci=1
pci_msitranslate=1
hpet=1
acpi=1
apic=1
pae=1
clunix config
kernel=”/usr/lib/xen/boot/hvmloader”
device_model=”/usr/lib/xen/bin/qemu-dm”
builder=”hvm”
memory =”3072″
#extra = ‘xencons=tty’
name =”WIN7-ATI1″
monitor=1
vcpus =”4″
vif = [ ‘type=ioemu, bridge=xenbr0, model=e1000′,’type=ioemu, bridge=xenbr1, model=e1000’ ]
disk = [ “phy:/dev/sdb5,hda,w” ]
boot = “dc”
sdl = 0
opengl = 1
vnc = 1
vnclisten=”192.168.123.75″
vncdisplay=21
vncunused=1
stdvga = 1
videoram = 32
serial = “pty”
vncconsole = 0
#localtime = 1
viridian = 1
xen_platform_pci= 1
pci_msitranslate = 1
pci_power_mgmt = 1
acpi=1
apic=1
#acpi_s3 = 1
#acpi_s4 = 1
on_poweroff = ‘destroy’
on_reboot = ‘restart’
on_crash = ‘restart’
#xen_extended_power_mgmt=2
pae=1
hpet = 1
#hap = 1
#usbdevice=’mouse’
#usbdevice=’keyboard’
usbdevice=’tablet’
#vusb=[‘usbver=2, numports=4, port_1=3-2,port_2=3-1,port_3=4-2′]
usb = 1
#usbdevice = “host:046b:ff10”
#usbdevice = “host:1bcf:0007”
#usbdevice = “host:05af:0802″
gfx_passthru=0
pci=[’02:00.0’]
– DELL 대용량 메모리 장비 적용 시 에러..
DELL Precision T7600, Memory 128GByte 장비에서 발생한 문제..
booting 시 아래 단계에서 무지 오래 시간이 걸림.
Starting udev: Wait timeout. Will continue in the background.[FAILED]
kernel option 에 udevtimeout=3 정도를 두어 이 부분을 빨리 진행하면..
다음 단계에서 아래와 같은 메세지가 (거의 모든 장치에 대해..) 나타나며..
거의 5분~10분정도 소요됨.
udevd[46]: worker [53] failed while handling ‘/devices/vbd-2048’
udevd[46]: worker [54] unexpectedly returned with status 0x0100
부팅이 완료되었을때는 부하가 100 이상..
해결법 :
dom0_mem=1024M
only 1024M 가 답임.
– LINUX Guest OS 설치 방법
kernel=”/usr/lib/xen/boot/hvmloader”
device_model=”/usr/lib/xen/bin/qemu-dm”
builder=”hvm”
memory =”8000″
#extra = ‘xencons=tty’
name =”RNTier”
monitor=1
vcpus =”4″
#vif = [ ‘type=ioemu, bridge=xenbr0’ ]
vif = [ ‘mac=00:16:3E:77:9E:27, bridge=xenbr0, model=e1000’ ]
disk = [ “file:/home/VOS/RNTier.img,hda,w”,”file:/home/VOS/rhel-server-6.3-x86_64-dvd.iso,ioemu:hdc:cdrom,r” ]
boot = “nc”
sdl = 1
opengl = 1
vnc = 1
stdvga = 1
videoram = 32
serial = “pty”
vncconsole = 0
vnclisten=”192.168.202.200″
vncdisplay=20
#localtime = 1
viridian = 1
xen_platform_pci= 1
pci_msitranslate = 0
pci_power_mgmt = 0
acpi=1
apic=1
acpi_s3 = 1
acpi_s4 = 1
on_poweroff = ‘destroy’
on_reboot = ‘restart’
on_crash = ‘restart’
xen_extended_power_mgmt=2
pae=1
hpet = 1
#hap = 1
#usbdevice=’mouse’
#usbdevice=’keyboard’
usbdevice=’tablet’
#vusb=[‘usbver=2, numports=4, port_1=3-2,port_2=3-1,port_3=4-2′]
usb = 1
#usbdevice = “host:046b:ff10”
#usbdevice = “host:1bcf:0007”
#usbdevice = “host:05af:0802″
#gfx_passthru=1
#pci=[’84:00.0′,’84:00.1’]
리눅스의 경우 설치 후 네트워크가 잡히지 않는 문제가 발생한다.
VM을 생성할때마다 Mac address 가 변경되고, 설치 시 생성된 Mac 정보가 udev
network rule 에 설정되는데, 이후 재 부팅 시 또 Mac 이 변경되어 udev rule
가 일치하지 않아 생기는 문제이다.
최초 설치 시 Mac address 정보를 hvm 설정에 fix를 하면 이러한 문제를
해결할 수 있다. fix를 하지 않은채 VM을 설치하였다고 하더라도
부팅 후, 생성된 Mac 주소를 통해 udev rule 과 ifcfg 설정에 해당 Mac을 일치
시켜 주면 문제를 해결할 수 있다.
PXE 방식으로 OS를 설치할 경우에도 반드시 설치 전 Hvm 설정에 Mac 정보가
fix 되어 있어야 한다.
– Linux PV driver 설치
xen_platform_pci=1
– SR-IOV
grub.conf
To enable SR-IOV with Xen for Intel systems append the pci_pt_e820_access=on parameter to the kernel
Enable Intel VT-D in BIOS
supported adapter
intel i350
intel 83574
intel 82576
intel 82599 – windows 7 supported
# vi /etc/modprobe.d/igb.conf
——————————————————————————–
options igb max_vfs=4
blacklist igbvf
#options loop max_loop=128
——————————————————————————–
해당 nic 활성화
# ifup <nic_name>
reboot
# lspci | grep Virtual
i350 의 경우, windows 7 guest 에서 VF 장치 인식은 하지만, 실제 드라이버를 설치하지는
못했음. 대부분 Windows 2008R2, Windows8, Windows 2012 에서 지원된다는 말은 있는데,
Windows 7 에서 지원된다는 언급은 거의 없음. 82599 장치의 경우 windows 7 이 지원된다는
글은 본적있음. 테스트는 못해봄.
아래는 인텔 사이트의 FAQ 내용임
Which guest operating systems (GOS) have virtual function drivers?
virtual function (VF) drivers for guest operating systems are available for:
Windows Server 2012*
Windows 8*
Windows Server 2008 R2*
Windows Server 2008*, 32-bit and 64-bit
Linux* 2.6.30 kernel or later
Red Hat Enterprise Linux 5.4* and later
Red Hat Enterprise Linux 6.0* and later
SUSE Linux Enterprise Server 11* SP1 and later
– 10Gb NIC 카드 firmware 문제
NetXtrame 10Gbps T-base 장치 firmware 문제
bnx2x_init_firmare:12171 can’t load bnx2x/bnx2x-e2-7.8.2.0.fw
문제..
# wget https://raw.github.com/cernekee/linux-firmware/master/bnx2x/bnx2x-e2-7.8.2.0.fw
# cp bnx2x-e2-7.8.2.0.fw /lib/firmware/bnx2x
– Disk direct access
# vi /etc/udev/rules.d/50-udev.rules
ACTION==”add”, KERNEL==”sdb”, SYMLINK+=”xapi/block/%k”, RUN+=”/bin/sh -c ‘/opt/xensource/libexec/local-device-change %k 2>&1 >/dev/null&'”
ACTION==”remove”, KERNEL==”sdb”, RUN+=”/bin/sh -c ‘/opt/xensource/libexec/local-device-change %k 2>&1 >/dev/null&'”
ACTION==”add”, KERNEL==”sdc”, SYMLINK+=”xapi/block/%k”, RUN+=”/bin/sh -c ‘/opt/xensource/libexec/local-device-change %k 2>&1 >/dev/null&'”
ACTION==”remove”, KERNEL==”sdc”, RUN+=”/bin/sh -c ‘/opt/xensource/libexec/local-device-change %k 2>&1 >/dev/null&'”
ACTION==”add”, KERNEL==”sdd”, SYMLINK+=”xapi/block/%k”, RUN+=”/bin/sh -c ‘/opt/xensource/libexec/local-device-change %k 2>&1 >/dev/null&'”
ACTION==”remove”, KERNEL==”sdd”, RUN+=”/bin/sh -c ‘/opt/xensource/libexec/local-device-change %k 2>&1 >/dev/null&'”
disk = [ “phy:/dev/xapi/block/sdb,hda,w” ]
– Hypervisor error
xen-acpi-processor: (CX): Hypervisor error (-38) for ACPI CPU1
xen-acpi-processor: (_PXX): Hypervisor error (-38) for ACPI CPU1
– 주요 사이트
http://xen.crc.id.au/support/guides/install/#
http://choonrpms.choon.net/sl/6
– PCI passthrough
Dynamic assignment with xl
(This option is only available from Xen 4.2.) Begin by making sure that dom0 has the pciback module loaded:
# modprobe xen-pciback
(Or modprobe pciback for classic Xen kernels.)
Then make a device assignable by using xl pci-assignable-add. For example, if you wanted to make the device at BDF 08:00.0 available for guests, you could type the following:
# xl pci-assignable-add 08:00.0
# xl pci-assignable-list
Dynamic assignment with sysfs (xm)
# modprobe xen-pciback
echo 0000:08:00.0 > /sys/bus/pci/devices/0000:08:00.0/driver/unbind
echo 0000:08:00.0 > /sys/bus/pci/drivers/pciback/new_slot
echo 0000:08:00.0 > /sys/bus/pci/drivers/pciback/bind
# vi pciback.sh
#!/bin/bash
if [ $# -eq 0 ]; then
echo “Require PCI devices in format: <domain>:<bus>:<slot>.<function>”
echo “Eg: $(basename $0) 0000:00:1b.0”
exit 1
fi
modprobe pciback
for pcidev in $@; do
if [ -h /sys/bus/pci/devices/”$pcidev”/driver ]; then
echo “Unbinding $pcidev from” $(basename $(readlink /sys/bus/pci/devices/”$pcidev”/driver))
echo -n “$pcidev” > /sys/bus/pci/devices/”$pcidev”/driver/unbind
fi
echo “Binding $pcidev to pciback”
echo -n “$pcidev” > /sys/bus/pci/drivers/pciback/new_slot
echo -n “$pcidev” > /sys/bus/pci/drivers/pciback/bind
done
xm pci-list-assignable-devices
– 유휴세션 강제 로그오프 방법
http://blogs.technet.com/b/askds/archive/2010/08/24/forcing-afterhours-user-logoffs.aspx
– VCPU Pinning
DOM0 CPU 0,1
DOMU1 CPU 2&3
DOMU2 CPU 4&5
DOMUX CPU 6&7 share
vi /boot/grum/menu.lst
dom0_max_vcpus=2 dom0_vcpus_ping
command 로 제어하기
xm vcpu-pin ID VCPU CPU
xm vcpu-pin 14 0 7
xm vcpu-pin 0 0 0
xm vcpu-pin 0 1 0
xm vcpu-pin 0 2 0
xm vcpu-pin 0 3 0
xm vcpu-pin 0 4 1
xm vcpu-pin 0 5 1
xm vcpu-pin 0 6 1
xm vcpu-pin 0 7 1
xm vcpu-list
hvm config
vcpus=2
cpus=”2-3″
or
cpus = [“2″,”3”]
xm sched-credit
xm sched-credit -d <domain> -w <weight>
xm sched-credit -d <domain> -c CAP : CAP is int