Systems/Unix2011.08.12 14:50
가상화 Solution중에 OpenVZ라는 것이 있습니다. Linux 기반 커널 위에 '컨테이너(container)'라고 불리는 경량의 독립 공간을 만드는 기술인데요. 보통 가상화라고 하면 별도의 운영체제가 완전히 추상화된 하드웨어 계층 위에 독립적으로 설치되어 돌아가는 것을 상상하는 경우가 많은데 OpenVZ는 좀 다릅니다. 커널은 Host OS의 커널을 공유하고, 그 위에 개별적인 OS quota를 주는 형식에 더 가깝죠.

그래서 '커널이 다른 OS를 OpenVZ로 가상화 하는 것은 곤란' 합니다.

자세한 사항은 www.openvz.org 에 가셔서 알아보시기 바라구요. 지금부터는 OpenVZ를 이용해 CentOS 5.6을 여러 개의 CentOS 5 머신으로 가상화하는 방법을 살펴보겠습니다. (이 문서는 작성일 이후 1년쯤 뒤에는 더 이상 참고자료로서 활용되지 못할 수 있으므로 주의하세요. 작성일은 2011년 8월 12일입니다.)

1. Centos 5.6 설치

OpenVZ는 아직 CentOS 6.0을 지원하지 않고 있습니다. (이 문서 작성일을 기준으로) 그래서 CentOS 5.6을 설치합니다. http://ftp.daum.net/centos/5.6/isos/i386/CentOS-5.6-i386-bin-DVD.torrent 링크를 클릭하셔서 torrent 프로그램을 통해 운영체제 이미지를 다운받고, 이미지를 DVD로 구워서 설치하시면 됩니다. torrent 프로그램으로는 uTorrent를 쓰시면 되겠군요.

운영체제 설치하실 때는 가급적 /vz/ 파티션을 따로 잡아주시고, 해당 파티션은 반드시 ext3 파일 시스템을 사용하도록 해 주세요. 이 아래에 가상 머신 이미지들이 들어간다고 보시면 됩니다.

2. OpenVZ 설치

설치가 끝나고 재부팅이 되면, 다음을 실행합니다.

# cd /etc/yum.repos.d
# wget http://download.openvz.org/openvz.repo
# rpm --import  http://download.openvz.org/RPM-GPG-Key-OpenVZ
# yum install ovzkernel
이제 OpenVZ 커널이 설치되었으니 부트로더를 수정할 순서입니다. /boot/grup/grub.conf 파일을 열어보면 아마 다음과 같은 항목이 추가되었을 겁니다.

title OpenVZ (2.6.8-022stab029.1)
        root (hd0,0)
        kernel /vmlinuz-2.6.8-022stab029.1 ro root=/dev/sda5
        initrd /initrd-2.6.8-022stab029.1.img
이제 재부팅할때 OpenVZ를 선택하면 되는데, 그 때 마다 OpenVZ를 수동으로 선택하는 것은 귀찮으니까 이 파일 안에 있는 default= 뒤에 있는 숫자를 OpenVZ에 할당되어 있는 숫자로 (아마 십중팔구 0일 겁니다) 바꾸어 주세요.

그런 다음에는 이제 sysctl 파일을 ( /etc/sysctl.conf ) 변경해야 합니다.

# On Hardware Node we generally need
# packet forwarding enabled and proxy arp disabled
net.ipv4.ip_forward = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.default.proxy_arp = 0

# Enables source route verification
net.ipv4.conf.all.rp_filter = 1

# Enables the magic-sysrq key
kernel.sysrq = 1

# We do not want all our interfaces to send redirects
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
없는 항목은 추가하고, 있는 항목의 값은 적절히 바꾸어 주세요.

그런 다음에는 /etc/sysconfig/selinux 파일을 고쳐서 다음과 같이 해야 합니다.

SELINUX=disabled
그런 다음 재부팅 하시고,

이제 OpenVZ 사용에 필요한 파일을 다음과 같이 해서 깔아줍니다.

# yum install vzctl vzquota
x86_64 플랫폼이면 다음과 같이 해야 한다고 하는군요. 저는 안해봤습니다.

# yum install vzctl.x86_64 vzquota.x86_64
자. 그럼 이제 OpenVZ 설치는 끝난 겁니다. 다음과 같이 해서, 실행합시다.

# /sbin/service vz start
여기까지 하면 이제 OpenVZ 커널 모듈이 올라가 있을 것입니다. 시스템이 재부팅되었을 때 이 마지막 절차를 또 해야 하는지는 잘 모르겠군요.





3. 가상머신 생성

자. 그럼 이제 가상머신을 생성해 보죠. 가상머신을 생성할 때에는 소위 가상머신 템플릿이라는 것이 /vz/template/cache/ 디렉터리 아래에 있어야 합니다. wget http://download.openvz.org/template/precreated/centos-5-x86.tar.gz 같이 입력해서 다운받습니다. 그리고 해당 디렉터리 아래에 갖다놓습니다. 그리고 다음과 같이 합니다.

# ln -s /vz/template/cache/centos-5-x86.tar.gz /vz/template/cache/centos-5.tar.gz
가상머신 생성은 굉장히 간단합니다.

# vzctl create 1011
이렇게 하면 1011번 가상머신이 만들어집니다. 그럼 해당 가상머신을 설정해보죠.

# vzctl set 1011 --hostname 1011.xxxx.re.kr --save
# vzctl set 1011 --ipadd 10.0.0.11 --save
# vzctl set 1011 --nameserver 1.2.3.4 --save
# vzctl set 1011 --userpasswd root:rootpasswd
호스트 이름, 가상머신의 IP 주소, 네임서버, 패스워드 등은 적절히 입력해 주세요. ^^ 그런 다음 가상머신을 다음과 같이 실행합니다.

# vzctl start 1011
그런 다음 ssh 10.0.0.11해 보시면, 해당 가상머신으로 SSH 접속이 가능함을 확인하실 수 있을겁니다. :-)

SSH 접속 후에 외부로 PING을 해보면 가상 머신을 설치한 기계의 IP주소 외에는 PING이 안될수도 있습니다. 주로 가상머신에 사설 IP 주소를 할당한 경우에 그러한데요.

그런 경우에는 가상 머신을 설치한 HOST 운영체제에 IP_TABLE을 조작해서 NAT처럼 동작하도록 만들어줘야 합니다. 여러분이 설치한 기계의 IP 주소가 192.168.5.4라고 해 볼까요? 그럼 다음과 같이 하시면 됩니다.

# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to 192.168.5.4

그리고 나서는 firewall 설정을 변경해줘야 합니다.

# /sbin/iptables -A RH-Firewall-1-INPUT -s 10.0.0.0/24 -j ACCEPT
# /sbin/iptables-save > /etc/sysconfig/iptables
# /sbin/service iptables restart

간혹 VE 안에서 DNS가 안되는 경우가 있는데, 그런 경우가 발생하면 강제로 DNS 포트를 개방해야합니다.

# /sbin/iptables -A RH-Firewall-1-INPUT -p udp --dport 53 -j ACCEPT
이렇게 하면 VE 안에서 네트워킹도 웬만하면 다 되실겁니다. 뭔가 안되는 프로그램이 있다면 (yum 같은 것이 안될 수도 있습니다) 관련된 포트를 찾아서 열어주면 됩니다 (yum의 경우에는 80 포트를 개방해야 합니다.) 이거 저거 다 귀찮으실 때는 모든 ip 프로토콜을 다 개방하는 방법도 있습니다. 좀 껄쩍지근하긴 하지만 -A RH-Firewall-1-INPUT -p ip -j ACCEPT 처럼 하시면 되겠습니다.

각각의 컨테이너에 프로그램을 깔때는 vzctl exec를 사용하면 편합니다.

# vzctl exec 1011 yum -y install gcc autoconf automake

4. Troubleshooting

4.1. Java

Java를 설치하고 실행하면  Error occurred during initialization of VM : java.lang.OutOfMemoryError: unable to create new native thread 같은 오류가 뜨면서 java가 실행이 안될때가 있습니다. 그럴때는 java -Xmx64m 처럼 해 보실 것. 안되면 64보다 더 낮은 값으로 낮추는 것도 괜찮습니다. 그래도 해결이 안되실 때는 http://forum.openvz.org/index.php?t=msg&goto=7057 이 쓰레드를 참고하실 것.

4.2 메모리 등의 자원 부족

OpenVZ 컨테이너 안에서 메모리 등의 자원 부족 현상이 발생할 경우, 쓰레드가 안뜬다거나 자바 가상 머신이 안돈다거나 하는 문제가 생길 수 있습니다. 그럴 때는 해당 자원을 늘려주어야 하는데요. http://wiki.openvz.org/Resource_shortage 여기 언급된 대로 실제 물리적 기계 상에서 cat /proc/user_beancounters 를 해 보면 각각의 컨테이너 ID 별로 어떤 자원이 부족해서 문제가 생겼는지를 파악할 수 있습니다. failcnt에 0 아닌 숫자가 찍히거든요.

그런 문제가 생기면 문제가 생긴 자원을 두배로 늘려줘 보세요. 하는 방법은 다음과 같이 하시면 됩니다. 물리적 메모리의 양을 화면에 표시된 barrier, limit의 값의 두 배 값으로 setting하는 예제입니다.

# vzctl set 1011 --kmemsize $((2752512*2)):$((2936012*2)) --save



신고
Posted by 이병준
TAG ,

소중한 의견, 감사합니다. ^^