가상화 머신을 하나 가지고 싶다고 생각하던 중 실제로 구축을 해보고자 서버를 구매하였습니다. 처음에는 싱글 노드를 가진 OpenStack 시스템을 구축하고 싶었지만 생각보다 과정이 만만치 않더군요. 일단은 간단하게 Xen 서버를 구축하여 구동하기로 하였고 몇주째 사용중에 있습니다. 생각 이상으로 안정적인것 같아 설치 과정을 기록해 두고자 정리합니다.
제가 개발에 사용한 서버는 DELL PowerEdge C1100 중고에 72G메모리와 1TB 하드디스크 3개를 RAID5로 묶었습니다. CentOS는 현재 최신버전인 6.5를 설치하였습니다. 부가적인 서비스 모두 필요없으므로 [링크]에서 CentOS Minimal 버전을 다운로드 합니다.
페이지에서 위와 같이 64비트용 ISO를 다운 받습니다. 시디로 굽거나 USB에 구워서 사용하시면 됩니다. 이후에 서버에 일반적인 방식으로 설치를 하시면 됩니다. 다만 파티션의 전체를 LVM Volume Group으로 묶어서 사용합니다. 저의 경우 전체 2T용량을 다음과 같이 설정하였습니다.
LVM Volume Groups └── vg_cloudsystem └── swap 4G └── / 50G Hard Drives └── /dev/sda └── /dev/sda1 /boot 500M └── /dev/sda2 vg_cloudsystem LVM
결과적으로 2T의 용량중 55기가정도만 사용하고 나머지는 FREE 영역으로 놔두고 리눅스 설치를 진행합니다. 설치가 완료된 후 콘솔에 접속하여 용량을 확인해 보면 다음과 같이 설정된것을 확인할 수 있습니다.
$ lvm vgs VG #PV #LV #SN Attr VSize VFree vg_cloudsystem 1 4 0 wz--n- 1.82t 1.76t $ lvm lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv_root vg_cloudsystem -wi-ao---- 50.00g lv_swap vg_cloudsystem -wi-ao---- 4.00g
CentOS의 설치가 완료되었지만 Minimal 버전의 경우 자동으로 네트워크 설정이 진행되지 않습니다. 수동으로 네트워크 설정을 진행해 보겠습니다. 내부의 가상 서버들이 모두 외부의 네트워크와 통신을 할 수있도록 브릿지(Bridge) 설정을 할 것입니다.
$ cd /etc/sysconfig/network-scripts $ cp ifcfg-eth0 ifcfg-xenbr0
DEVICE=eth0 HWADDR=60:EB:69:FE:4C:72 TYPE=Ethernet ONBOOT=yes IPV6INIT=no NM_CONTROLLED=no BRIDGE=xenbr0
DEVICE=xenbr0 TYPE=Bridge ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=dhcp
위와 같이 네트워크 설정을 진행해 주시면 네트워크의 준비는 끝납니다. 기본적으로 eth0에 할 설정을 xenbr0에 설정했다는것이 중요한 부분입니다. 예시에는 DHCP를 사용하는 네트워크 환경의 예시를 적어놓았는데 만약 고정 아이피를 사용할 경우 다음과 같이 설정하시면 됩니다.
DEVICE=xenbr0 TYPE=Bridge ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=static DELAY=0 IPADDR=1.2.3.4 NETMASK=255.255.255.0 GATEWAY=1.2.3.1 DNS1=168.126.63.1 DNS2=168.126.63.2
이제 다음의 명령을 사용하여 네트워크 서비스를 구동해 줍니다.
$ service netwok restart
정상적으로 네트워크가 돌아왔다면 CentOS 배포본의 업데이트를 진행해 봅시다. 업데이트에 문제가 없다면 XEN을 설치합니다.
$ yum -y update $ yum install centos-release-xen $ yum install xen $ /usr/bin/grub-bootxen.sh
/boot/grub/grub.conf 의 내용을 확인하여 정상적으로 커널이 추가되어있는지 확인해 봅니다. defaults 값이 0이고 kernel /xen.gz 같은 내용이 첫번째 커널로 정의되어있으면 정상입니다.
이제 재부팅을 해야 하는데요, 기왕 재부팅 할꺼 SELinux도 꺼두겠습니다.
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config $ setenforce 0
이제 재부팅을 합니다.
$ reboot
재부팅이 정상적으로 되었다면 다음과 같이 정상적으로 XEN이 구동중인지 확인해 볼 수 있습니다.
$ xm info host : cloud-system release : 3.10.25-11.el6.centos.alt.x86_64 version : #1 SMP Fri Dec 27 21:44:15 UTC 2013 machine : x86_64 nr_cpus : 16 nr_nodes : 1 cores_per_socket : 4 threads_per_core : 2 cpu_mhz : 2133 hw_caps : bfebfbff:2c100800:00000000:00003f40:029ee3ff:00000000:00000001:00000000 virt_caps : hvm hvm_directio total_memory : 73718 free_memory : 47174 free_cpus : 0 xen_major : 4 xen_minor : 2 xen_extra : .3-26.el6 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=1024M,max:1024M loglvl=all guest_loglvl=all cc_compiler : gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3) cc_compile_by : mockbuild cc_compile_domain : centos.org cc_compile_date : Tue Dec 10 20:32:58 UTC 2013 xend_config_format : 4
여기서 유심히 봐야 하는 부분은 virt_caps인데요 CPU가 전가상화를 지원하고 BIOS에서 Enabled되어있다면 hvm이 보여집니다. hvm이 없다면 전가상화는 불가능한것으로 이해하시면 됩니다. 개인적으로 설정파일을 이용하는 xm 또는 xl 커맨드로의 가상서버 생성은 조금 복잡한것 같아 libvirt를 설치하겠습니다.
$ yum install rsync wget vim-enhanced openssh-clients $ yum install libvirt python-virtinst libvirt-daemon-xen
이번에는 가상 서버에서 사용할 디스크를 생성해 보겠습니다. 가상화 이미지 파일을 사용할수도 있지만 개인적으로 LVM 파티션을 직접 마운트하는 방식을 선호합니다.
$ lvcreate -L 500G -n lv_theeye vg_cloudsystem Logical volume "lv_theeye" created $ lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv_root vg_cloudsystem -wi-ao---- 50.00g lv_swap vg_cloudsystem -wi-ao---- 4.00g lv_theeye vg_cloudsystem -wi-a----- 500.00g
vg_cloudsystem Volume Group 밑에 새롭게 500G 용량의 Logical Volume을 생성하였습니다. 만약에 잘못 생성하여 삭제할 일이 있을 경우 다음의 명령을 사용하여 삭제할 수 있습니다.
$ lvremove /dev/vg_cloudsystem/lv_theeye
이제 가상 서버를 생성하기에 앞선 모든 준비가 끝났습니다.
$ virt-install --virt-type xen \ -n theeye -r 8192 --vcpus=2 \ -f /dev/vg_cloudsystem/lv_theeye -p \ -l http://ftp.daum.net/centos/6.5/os/x86_64 \ --os-type=linux --nographics \ --network=bridge:xenbr0 --network=network:default
위의 옵션은 다음과 같은 의미를 가지고 있습니다.
- xen 타입의 가상화 서버를 생성 (–virt-type)
- 가상화 서버의 이름은 theeye로 지정 (-n)
- 메모리는 8기가를 할당 (-r)
- CPU는 2개를 할당 (–vcpus)
- /dev/vg_cloudsystem/lv_theeye LVM 파일 시스템을 사용 (-f)
- 다음에서 제공하는 CentOS 미러 저장소 활용 (-l)
- 반가상화(Para-virtualization)로 설정 (-p)
- 설치할 OS의 타입은 리눅스 (–os-type)
- GUI지원없이 설치 (–nographics)
- 이더넷은 2개를 설정, eth0은 브릿지를 사용하고 eth1은 내부 가상 네트워크를 사용 (–network)
전가상화로 설치할 경우 -p 대신에 –hvm옵션을 사용하시면 됩니다. 잠시후 다음과 같은 설치 화면을 콘솔에서 볼 수 있습니다.
설치를 진행하기에 앞서 eth0과 eth1의 네트워크 설정을 어떻게 해야 할지에 대해 알아봅시다. 호스트 머신에서 ifconfig 내용을 확인해 보면 다음과 같은 내용을 확인할 수 있습니다.
ifconfig xenbr0 Link encap:Ethernet HWaddr 60:EB:69:FE:4C:72 inet addr:1.2.3.4 Bcast:1.2.3.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:20969079 errors:0 dropped:0 overruns:0 frame:0 TX packets:32361982 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2228628430 (2.0 GiB) TX bytes:35151830809 (32.7 GiB) eth0 Link encap:Ethernet HWaddr 60:EB:69:FE:4C:72 inet6 addr: fe80::62eb:69ff:fefe:4c72/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:78368057 errors:0 dropped:0 overruns:0 frame:0 TX packets:117016569 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:10209375118 (9.5 GiB) TX bytes:132135431402 (123.0 GiB) Memory:c0200000-c0220000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:139859 errors:0 dropped:0 overruns:0 frame:0 TX packets:139859 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:88945222 (84.8 MiB) TX bytes:88945222 (84.8 MiB) virbr0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:275408 errors:0 dropped:0 overruns:0 frame:0 TX packets:407325 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:16857625 (16.0 MiB) TX bytes:590232428 (562.8 MiB)
여기서 기존에 정의하지 않았던 virbr0를 확인할 수 있습니다. 여기의 네트워크 대역이 192.168.122.0인것을 확인할 수 있습니다.
기본적으로 물리적인 eth0은 xenbr0 브릿지를 통해 dom0라는 가장 기본이 되는 가상 도메인의 eth0에 연결됩니다. 이를 통해서 다른 게스트들이 외부로의 통신이 가능해 집니다. 여기서 보여지는 vif들은 192.168.122.x를 부여받게 됩니다. 즉 새로 설치한 게스트의 eth0(bridge:xenbr0)은 xenbr0를 직접 사용하여 공용 아이피를 설정할 것이고 eth1(network:default)은 dom0의 사설 아이피를 설정할 것입니다.
DEVICE=eth0 TYPE=Ethernet HWADDR=00:16:3E:55:F5:3B BOOTPROTO=static NM_CONTROLLED=no ONBOOT=yes IPADDR=1.2.3.5 NETMASK=255.255.255.0 GATEWAY=1.2.3.1 DNS1=168.126.63.1 DNS2=168.126.63.2
DEVICE=eth1 TYPE=Ethernet HWADDR=00:16:3E:55:F5:3C BOOTPROTO=static NM_CONTROLLED=no ONBOOT=yes IPADDR=192.168.122.50 NETMASK=255.255.255.0 GATEWAY=192.168.122.1
잊지 말고 네트워크 서비스를 재시작 해줍시다. 이제 이 서버는 외부 네트워크뿐만 아니라 다른 가상 서버들과도 통신이 가능한 가상 서버가 되었습니다. xm help를 통해 어떤 작업이 가능한지 확인해 보시기 바랍니다. (xm top을 통해 전체 게스트들의 상태를 확인할수도 있습니다) 네트워크 문제가 발생했을 경우 콘솔에 바로 접속하는 방법은 다음의 명령어를 사용하시면 됩니다.
$ xm list Name ID Mem VCPUs State Time(s) Domain-0 0 1022 16 r----- 17344.6 theeye 1 16384 2 -b---- 379145.7 $ xm console theeye
virt-install을 이용하여 설치할 때에 사용할 수 있는 원격지 저장소중에 제 생각에 빠른곳 몇개를 정리해 보았습니다.
- CentOS : http://ftp.daum.net/centos/6.5/os/x86_64
- Debian : http://ftp.kr.debian.org/debian/dists/stable/main/installer-amd64
- Ubuntu(13.10) : http://ftp.ubuntu.com/ubuntu/dists/saucy/main/installer-amd64
참고
- http://hustcalm.me/blog/2013/10/14/playing-with-xen-under-centos6-dot-4-to-build-your-own-vps/
- http://drewsymo.com/2013/11/install-xen-4-with-libvirt-xl-on-centos-6-2014/
- http://www.cyberciti.biz/tips/rhel-centos-xen-virtualization-installation-howto.html