CentOS 6.0을 이용한 가상화

1.
Dell PowerEdge R610을 이용한 가상화환경을 설정한 경험입니다. 다 아시는 내용이라도 이해를 바랍니다. 예전부터 제가 작업한 사항은 사내위키를 통하여 꼭 기록하였습니다. 지식공유차원입니다. 지금은 블로그가 위키역할을 하고 있으므로 작업내용을 소개하고자 합니다. 이후에 정리한 내용중 이전에 썼던 글을 같이 참조하셨으면 합니다.

BIOS 셋팅과 레이턴시
Low Latency와 CPU Affinity

가상화환경을 설정한 목적은 Community Cloud를 통하여 트레이딩서비스를 제공할 수 있는지를 시험하기 위함입니다. R610은 Hyper-Threading을 할 경우 12 Core이지만 Low Latency를 위하여 Virtual Processor기능을 Bios에서 Disabled로 할 경우 6Core입니다. Host와 Guest 둘에 2 Core 및 메모리 3G를 할당하는 환경을 구축하려고 합니다. Host OS와 Guest OS는 Centos 6.0으로 하였고 또다른 Guest OS는 Windows 2008 Server/Standard로 하였습니다. ZeroAOS는 Linux와 Windows를 모두 지원할 계획이기때문에 윈도우를 위한 표준OS로 Windows 2008 Server를 사용하려고 합니다.

CentOS 6.0을 설치할 때 Package->Virtualizaiton을 모두 선택하면 KVM을 이용한 가상화환경이 별도의 노력없이 잘 설치됩니다. System Tools -> Virtual Machine Manager를 이용하여 GUI를 이용하여 Virtual Machine을 편하게 설치할 수 있습니다.

혹시 Virtualization과 관련된 패키지를 설치하지 못했다면 다음과 같이 하면 됩니다.

yum install kvm libvirt python-virtinst qemu-kvm

libvirt daemon을 실행합니다.

/etc/init.d/libvirtd start]

이제 KVM이 정상적으로 동작하는지 알아보도록 하죠.

virsh -c qemu:///system list

그러면 아래와 같은 화면을 볼 수 있습니다.

이상과 같은 순서로 하면 Command Line에서도 가상화 프로그램을 설치할 수 있습니다. 그렇지만 CPU가 가상화를 지원하지 않는다고 하면 말짱 도루묵입니다. 명령어로 자신의 CPU가 지원하는지를 확인하여야 합니다.

egrep ‘(vmx|svm)’ –color=always /proc/cpuinfo

아래와 같은 화면에 vmx 혹은 svm이 다른 색상으로 표시되어야 합니다.

이상의 절차를 확인한 후 서둘러 VM를 설치하였습니다. VirtualBox를 사용해보았기때문에 설치자체는 힘들지 않았습니다. 다만 VirtualBox를 사용할 때 없던(?) 기능인 Spinning이 보이더군요.

2.
사실 리눅스나 윈도우를 깔아본 ?사람은 별 고민없이 새로운 VM를 설치할 수 있습니다.그런데 문제가 생겼습니다. 네트워크를 설정할 때 ‘NAT’로 하니까 GuestOS를 다른 서버에서 접근을 할 수 없습니다. VM이 ?아웃바운드하는 세션은 가능하지만 인바운드 세션을 받을 방법이 없습니다. 이 때 NAT대신에 BRIDGE를 사용하여야 합니다. Guest OS를 설치하기 전에 Bridge를 설정하여야 Virtual Machine Manager에서 Netowkr 설정이 가능합니다. 그러면 어떻게 설정할까요?

먼저 Bridge설정이 가능하도록 하는 프로그램을 설치합니다.

yum install bridge-utils

Bridge설정을 하기 위하여 /etc/sysconfig/network-scripts/ifcfg-br1을 만듭니다.

vi /etc/sysconfig/network-scripts/ifcfg-br1

이 때 물리적으로 공유하는 이더넷카드의 정보를 가져와서 수정합니다. 저의 경우 eth1입니다. 가져온 정보중 ?IPADDR, PREFIX, GATEWAY, DNS1 and DNS2 값등은 사용하고 TYPE은 Ethernet대신에 Bridge라고 합니다.아래와 같습니다.

DEVICE=”br1″
NM_CONTROLLED=”yes”
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=”System br1″
IPADDR=10.1.2.201
PREFIX=24
GATEWAY=10.1.2.1
DNS1=8.8.8.8

이제 eth1의 설정을 변경할 차례입니다.

DEVICE=”eth1″
NM_CONTROLLED=”yes”
ONBOOT=yes
TYPE=Ethernet
#BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=”System eth1″
#UUID=9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04
#IPADDR=10.1.2.201
#PREFIX=24
#GATEWAY=10.1.2.1
HWADDR=F0:4D:A2:09:DE:A1
#DNS1=8.8.8.8
BRIDGE=br1

위의 설정처럼 BOOTPROTO, IPADDR, PREFIX, GATEWAY, DNS1, and DNS2s는 #으로 주석처리하고 BRIDGE를 추가하여 값을 넣습니다.

/etc/init.d/network restart

위의 명령을 실행하고 난 후 ifconfig로 네트워크 설정을 확인합니다. 만약 방화벽기능이 On 되어 있는 서버일 경우 별도의 작업을 하여야 합니다. 저의 경우 Off를 해놓아 더 이상 설정변경을 하지 않았습니다.

Virtual Machine Manager를 이용하여 설치를 할 경우 Network설정에서 Bridge를 선택하실 수 있습니다.

그런데 저처럼 이미 선택한 경우는 어떻게 해야 하나요? 무식하게 다시 설치를 하여야 하나요? 가장 안전한 방법이 재설치입니다. 그렇지만 환경파일의 설정값을 바꾸면 되지않을까 시험을 해보았습니다.

‘ps -ef’로 실행중인 프로세스를 찾아보시면 qemu-kvm이라는 프로세스를 확인하실 수 있습니다.

qemu ? ? ?2054 ? ? 1 ?6 10:38 ? ? ? ? ?00:25:40 /usr/libexec/qemu-kvm -S -M rhel6.0.0 -enable-kvm -m 3072 -smp 2,sockets=2,cores=1,threads=1 -name Centos6 -uuid e5287511-5b10-78ae-d130-d2c6cf0e5648 -nodefconfig -nodefaults -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/Centos6.monitor,server,nowait -mon chardev=monitor,mode=control -rtc base=utc -boot c -drive file=/home/Zero/images/Centos6.img,if=none,id=drive-virtio-disk0,boot=on,format=raw,cache=none -device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0 -drive if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdev tap,fd=21,id=hostnet0 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:7b:e3:db,bus=pci.0,addr=0x3 -chardev pty,id=serial0 -device isa-serial,chardev=serial0 -usb -device usb-tablet,id=input0 -vnc 127.0.0.1:0 -vga cirrus -device AC97,id=sound0,bus=pci.0,addr=0x4 -incoming exec:cat -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6

qemu-kvm의 옵션정보는 /etc/libvirt/qemu 에 xml파일로 저장되어 있습니다.

Centos6.xml이라는 파일을 열어서 interface와 관련된 항목을 찾았습니다. 기존설정은 아래와 같습니다.

<interface type=’network’>
<mac address=’52:54:00:7b:e3:db’/>
<source network=’default’/>
<model type=’virtio’/>
<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x03′ function=’0x0’/>
</interface>

Interface를 다음과 같이 수정하였습니다. mac address를 설정하지 않으면 자동으로 설정한다고 합니다.

<interface type=’bridge’>
<source bridge=’br1’/>
</interface>

이제 Centos를 설치한 Guest OS로 ssh로 접속하여 네트워크설정을 확인합니다.

이상과 같이 환경설정 파일을 직접 수정하는 방법도 있지만 virsh를 이용하는 방법도 있습니다.

virsh edit <VM name>

위와 같이 입력하면 xml파일을 읽어와 에디터에서 수정할 수 있도록 해줍니다. 나머지는 ?동일합니다. 이제 Guest OS가 Boot할 때 자동으로 실행하도록 설정할 차례입니다. 방법은 아래와 같습니다.

virsh autostart guest_name

아주 간단하죠?(^^)

3.
이상이 CentOS 6.0을 이용한 가상화설정이었습니다. 이제 두가지 과제가 남았습니다. 하나는 Guest OS에 CPU Affinity를 적용하는 일입니다. 다음은 Host OS의 네트워크환경이 모두 Bridge를 통하여 이루어지도록 하는 것입니다.

먼저 CPU Affinity는 VMS를 이용하여 설치할 때 CPU Spinning 항목에서 사용할 CPU를 입력하면 자동적으로 CPU Affinity가 적용됩니다. 앞서 CentOS 6은 CPU Core 2,3을 할당하였다고 하였습니다. 이를 확인하려면 아래와 같이 합니다. PID 2054는 앞서 Centos6의 가상환경을 만들어주는 프로세스의 ID입니다.

아니면 taskset 명령어를 이용하여 CPU Affinity를 적용하여도 됩니다. 사용법은 아래를 확인하시길 바랍니다.

TaskSet 으로 Process의 사용 CPU를 지정해 보자!

CPU Affinity를 적용할 때 Kernel Parameter를 이용하는 방법도 있습니다. isolcpu입니다. 제가 시험한 환경도 Host OS는 CPU Core 0,1을 사용하는 것으로 설정하였습니다. /boot/grub/grub.conf중 일부입니다.

title CentOS Linux (2.6.32-71.29.1.el6.x86_64)

root (hd0,0)
kernel /vmlinuz-2.6.32-71.29.1.el6.x86_64 ro root=/dev/mapper/vg_zeroaos-lv_root rd_LVM_LV=vg_zeroaos/lv_root rd_LVM_LV=vg_zeroaos/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=ko crashkernel=auto rhgb quiet isolcpu=2,3,4,5
initrd /initramfs-2.6.32-71.29.1.el6.x86_64.img

isolcpu가 정상적으로 적용되었으면 Host OS의 프로세는 당연히 0,1에서 동작하여야 합니다. 그런데 특정한 프로세스를 Taskset으로 보면 이렇습니다.

isolcpu의 설정이 뜻대로 움직이지 않네요. 좀더 확인해야 할 부분입니다.

또다른 과제인 Bridge설정을 변경하는 부분은 외부에서 SSH로 Guest OS에 바로 접속하도록 하기 위함입니다. 이 부분은 좀더 살펴보아야 할 듯 하네요.

이상을 위해 참고한 자료는 다음과 같습니다.

Virtualization With KVM On A CentOS 6.0 Server
IBM Information Center for Linux(Linux와 Virtualization항목을 참고. 특히 튜닝항목 참조)

(*)참고로 가상화를 위한 Shell인 virsh의 사용법을 소개합니다. 유닉스나 리눅스 계열의 경우 shell을 잘 사용하면 거의 모든 일을 손쉽게 할 수 있습니다. 마찬가지입니다.

Show a list of all the defined guests: virsh list –all
Show a guest’s info: virsh dominfo guest’s_name
Start and stop guests:

Start a guest: virsh start guest’s_name
Shutdown a guest (gently): virsh shutdown guest’s_name
Shutdown a guest (wild): virsh destroy guest’s_name
Suspend a guest: virsh suspend guest’s_name
Resume a suspended guest: virsh resume guest’s_name
Create and modify guests:

Create a new guest
Create a guest from its XML definition: virsh create xml_file.xml
Dump a guest’s definition in XML: virsh dumpxml guest’s_name
Modify a guest’s definition: virsh edit guest’s_name
Remove a guest’s definition (it doesn’t remove the image file): virsh undefine guest’s_name
Backup and restore guests:

Save a guest’s state on a file: virsh save guest’s_name guest’s_state_file
Restore a guest from a state file: virsh restore guest’s_state_file

2 Comments

  1. yosnoop

    CPU Affinity가 어느정도 성능향상을 가져오는지 궁금하네요. 저희는 가상머신에는 적용하지않아서요.

    네트워크메니저 사용하시는군요. 저희는 지워버렸습니다. 기존의 네트워크 설정파일을 자꾸 무시해서 화났습니다.

    아직은 PoC단계이신듯한데 호스트머신에 가상머신을 많이 설치할 예정이시라면 DHCP머신을 하나 마련하셔서 프로파일을 관리하는 걸 추천합니다. Koan을 사용하면 DHCP에 정의된 가상머신을 호스트머신에서 kickstart할 수 있습니다.

    Reply
    1. smallake

      Cobber/Koan은 처음 알았습니다. 한번 보고 괜찮을 듯 하면 참고로 하겠습니다. DHCP서버는 제가 입주한 센터에 있습니다. DHCP서버를 사용하도록 브릿지구성을 해야 하는데 아직 못하고 있습니다.

      네트워크매니저가 아직 속을 썩이지 않아서…

      CPU Affinity는 최소한 Jitter를 최소화할 수만 있어도 괜찮다는 생각으로 시험하고 있습니다. 아직 결과가 나오지 않아서.

      때가 되면 공개하도록 하겠습니다.

      감사합니다.

      Reply

Leave a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.