Tag Archives: 서버관리

CentOS LVM 기반 XEN 가상화 구축하기

centos

가상화 머신을 하나 가지고 싶다고 생각하던 중 실제로 구축을 해보고자 서버를 구매하였습니다. 처음에는 싱글 노드를 가진 OpenStack 시스템을 구축하고 싶었지만 생각보다 과정이 만만치 않더군요. 일단은 간단하게 Xen 서버를 구축하여 구동하기로 하였고 몇주째 사용중에 있습니다. 생각 이상으로 안정적인것 같아 설치 과정을 기록해 두고자 정리합니다.

제가 개발에 사용한 서버는 DELL PowerEdge C1100 중고에 72G메모리와 1TB 하드디스크 3개를 RAID5로 묶었습니다. CentOS는 현재 최신버전인 6.5를 설치하였습니다. 부가적인 서비스 모두 필요없으므로 [링크]에서 CentOS Minimal 버전을 다운로드 합니다.

xen_virtualization_01

페이지에서 위와 같이 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옵션을 사용하시면 됩니다. 잠시후 다음과 같은 설치 화면을 콘솔에서 볼 수 있습니다.

xen_virtualization_02

설치를 진행하기에 앞서 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인것을 확인할 수 있습니다.

xen-bridge-vif

기본적으로 물리적인 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

[CentOS] vsftpd 패시브 모드로 동작하게 하기

클라이언트가 FTP서버에 접속하여 데이터를 주고 받는데에는 엑티브 모드와 패시브 모드 두가지가 있습니다. 이 두가지의 차이는 다음과 같습니다.

엑티브 모드는 클라이언트가 데이터를 수신받을 임의의 포트를 열고 서버에 알려주면 서버는 자신의 20번 포트를 통해 클라이언트의 임의의 포트에 데이터를 전송해 줍니다.

하지만 엑티브 모드에서는 클라이언트가 방화벽(공유기등의 사설 네트워크) 밑에 있다면 외부에서 이 클라이언트에 직접 접근하는것을 불가능합니다. 그래서 패시브 모드에서는 이러한 동작을 반대로 진행합니다. 정리하면 다음과 같습니다.

패시브 모드는 서버가 데이터를 송신해줄 임의의 포트를 열고 클라이언트에 알려주면 클라이언트는 서버의 임의의 포트에 접속하여 데이터를 가져갑니다.

결과적으로 방화벽과 같은 복잡한 네트워크 환경에서는 FTP의 패시브 모드의 지원이 꼭 필요합니다. 하지만 여기서 문제가 있는데 패시브 모드에서 서버가 사용하는 임의의 포트가 1024 이후의 모든 임의의 포트라는 것입니다. 이는 서버의 보안이나 방화벽 설정을 함에 있어 껄끄러움으로 작용하게 됩니다.

vsftpd에서는 이 패시브모드의 포트의 범위를 임의 설정할 수 있습니다. 그렇게 되면 방화벽 설정도 한결 용이해 질것입니다. /etc/vsftpd/vsftpd.conf 파일에 다음의 내용을 추가해줍니다.

pasv_enable=Yes
pasv_min_port=10090
pasv_max_port=10100

위에서 설정한 포트의 범위는 원하시는 적절한 범위로 설정하시기 바랍니다. 이제 방화벽 설정을 추가해 보겠습니다. /etc/sysconfig/iptables 에 다음을 추가하겠습니다.

-A INPUT -m state --state NEW -m tcp -p tcp --dport 10090:10100 -j ACCEPT

이제 데몬들을 재시작하면 패시브 모드가 정상적으로 동작하게 됩니다.

ftp> get eye.sql
local: eye.sql remote: eye.sql
229 Entering Extended Passive Mode (|||10093|).
150 Opening BINARY mode data connection for eye.sql (13719976 bytes).
 30% |****************                                       |  4094 KiB  682.45 KiB/s    00:13 ETA

파일을 한번 다운로드 받아보았습니다. 정상적으로 패시브 모드로 진입하는것을 확인할 수 있습니다.