가상화 시스템에서 자원컨트롤에대한 신요소로 Linux Container 라는 녀석이 있다.
엄밀히 얘기하면 Full Virtualization 을 위한 메카니즘은 아니지만, 서버 가상화에대한
뚜렷한 효용성을 못느끼는 분들이나, 서버팜의 확실성에 대한 강한 신뢰를 내려놓지
못하는 불신으로 똘똘 뭉친 고리타풍(ㅋㅋ) 하신 분들은 한번쯤 보아둬도 좋을듯하다.
1. Introduce
1.1 What da Linux Containers?
Linux Containers (이하 LXC) 는 일반적인 물리적 가상화 에뮬레이션에서의
가상머신 셋팅에 기반이 되는 무거운 가상화 솔루션과는 반대로 그런 과정 없이
가상화에 대한 기능을 제공하는 초경량 가상화 메카니즘이다.
1.2 Whatever, what feature is it?
LXC 는 CGROUP 을 기반으로 프로세스의 수행시 POSIX file 수용력 추가하고
네트워크의 독립성을 보장하는 기능을 한다.
즉, 한 시스템에서 다른 프로세스들로부터 독립적인 어플리케이션의
실행, 그리고 동작을 보장 할 수 있게 해주는 것이다.
1.3 What different Level2 Hypervisor?
음? 눈치 챘어? 가상화자체가 Cgroup 으로 자원에 대한 할당이 가능한 Baremetal
Resouce management 를 표방하는데, 갑자기 왠 Cgroup 기반의 LXC 냐고?
예리하긴.. 엄밀히 말해, LXC 는 VirtualBOX 같은 2레벨 가상화에 대한 오버헤드 없이,
컨테이너 안에서 완벽하게 Linux system 환경에 대한 복제를 구현하기 위해 사용된다.
이따가 사용법을 알면 "어라 오오~" 할 텐데, 가상화는 꼭 베어메탈 하이퍼바이져에만
집중하는 것이 아니라는 것을 잊지말아야 한다. 물론 LXC 는 궁극적으론 Level2
Hypervisor 를 간단한 리소스 매니지먼트 개념으로 대체하기 위해 탄생하였다.
1.4 Why using LXC ? What different for detail?
Level 2 Hypervisor ( 이하 편의상 VirtualBOX ) 에서랑 정확히 뭐가다르냐고?
그건 VirtualBOX 상에서 돌아가는 상세한 내용이나 자원에 대한 문맥교환들은 전혀
Host 시스템에서 확인이 불가능하지만, LXC 에선 Kernel 과 함께 호스트시스템을
공유하고 있기 때문에, 가상화되어 돌아가고 있는 시스템 프로세스들과
파일시스템등의 상황을 호스트에서 완벽하게 보고 조절할 수 있다는 점이다..
자, 이것은 커널이 공유됨으로써 가상화 시스템에 로드된 모듈과 드라이버들을
관리자가 직접 조절 할 수 있다는 것으로 매우 강력하고 필요로 하는 기능이였다.
- 물론 레벨2 가상화 에뮬레이션에서의 이야기 이다.
1.4.1 Typical use cases for LXC.
- 동일 시스템에서 LAMP stack 으로 구동되는 서비스들이 매우 다양할 필요가 있을때,
( LAMP : Linux + Apache + MySQL + PHP 등의 조합이 된 웹서버 )
- 개발자들의 잦은 테스트를 위한 샌드박스 환경을 제공해야 할때,
- Full Virtualization 을 제공해야 할 만큼의 하드웨어 리소스제한을 요구하지는 않지만,
뭔가 좀 짜증나고 애매하게 유저환경에서의 자원관리가 까다롭게 요구될때.
1.5 Prepare (or note) for LXC
시스템 컨테이너가 시작될때, 기본적으로 많은 프로세스들이 /sbin/init 으로 카피되어
Conterner의 Process space 로 spawn 된다. 몇몇 시스템콜이나 Device access 는
커널에 의해 핸들링되어지므로, 만약 다른 커널버젼이나 다른 OS 환경에서의
가상환경을 제공해야 할 경우에는 반드시 이에 대한 처리가 필요하다.
이에 대한 정확한 가상머신의 수행을 위해선 다음과 같은 기본 처리가 되어야 한다.
- 하드웨어를 직접적으로 접근하려고 하는 데몬들의 init scripts 를 Disable.
- 컨테이너에 의해 접근이 가능한 하드웨어 디바이스들에 대한 설정이나 udev Disable
- 가상화 시스템의 Network 를 Host 시스템의 NIC 로 Bridge 시키기.
물론 LXC 에서는 이와 관련된 몇가지 스크립트 및 템플릿을 제공한다.
불행하게도 아주 최소한의 제공이라 결과적으론 손이 많이 가긴 한다는 점이지만..
(/usr/lib64/lxc/templates 에 있음...)
2. Configuration OS Containers
본격적인 설치 및 셋팅에 들어가 보도록 하겠다.
2.1 Prepare
최소한 2.6.29 커널에서부터 이 기능을 사용 할 수 있다.
또한 소개에서 말했듯이 Virtualization Disk 즉 가상하드디스크 File이 필요하다.
(VirtualBOX 의 Img 파일이라거나, KVM 의 img 디스크 파일들이 필요하다.)
정확하게 사용하기 위한 기능에대한 필요 커맨드를 기술해 보겠다.
2.1.1 CGroup
CGroup 의 자원관리 기능을 모델링하여 동작되므로 반드시 필수요소이다.
2.1.2 KPARTX
가상 이미지 디스크를 Host 에서 마운트하여 사용하기 위해 쓰인다. (Loop device)
2.1.3 B-Tree Filesystem (BtrFS)
B-Tree 의 스냅샷 기능을 이용하면 템플릿들을 자유자재로 만들고 수정할 수 있다.
2.1.4 Bridge-Utils
Container ( Guest VM 으로 이해하면 된다. ) 의 독립적 네트워킹을 위해 필요하다.
특히 Open vSwitch 나 macvlan 을사 용하기 위해 필요하다.
** Note : 본문서에서 필자는 VirtualBOX 의 OEL6 이미지와 템플릿, 그리고
쓰기가능한 Snapshot 을 위한 BtrFS 를 조합하여 진행하도록 하겠다.
2.2 Install and Configure
** Note : 참고로 이 문서는 Fedora16 64bit 에서 테스트 되고 작성되었다.
2.2.1 사전 패키지 인스톨
yum install libcgroup libcgroup-tools btrfs-progs bridge-utils
systemctl start cgconfig.service && systemctl enable cgconfig.service
( systemctl 로 시스템운용이 바뀐거라 써준거다 service 명령과 chkconfig 는
아직도 존재하니 사용해도 된다. :P )
2.2.2 LXC package 인스톨
** Note: 오라클 리눅스의 경우 lxc, lxc-libs, lxc-devel 이렇게 세개에 다 들어있다.
[mirr@Mirr-N ~]$ yum install lxc lxc-libs lxc-devel lxc-templates lxc-doc
Loaded plugins: auto-update-debuginfo, downloadonly, fastestmirror, filter-data,
: langpacks, list-data, local, presto, ps, refresh-packagekit,
: refresh-updatesd, versionlock
(snip)
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
lxc x86_64 0.7.4.2-1.fc16 fedora 71 k
lxc-devel x86_64 0.7.4.2-1.fc16 fedora 13 k
lxc-doc x86_64 0.7.4.2-1.fc16 fedora 5.6 k
lxc-libs x86_64 0.7.4.2-1.fc16 fedora 65 k
lxc-templates x86_64 0.7.4.2-1.fc16 fedora 7.7 k
Installing for dependencies:
debootstrap noarch 1.0.36-1.fc16 fedora 63 k
Transaction Summary
================================================================================
Install 6 Packages
Total download size: 225 k
Installed size: 225 k
Is this ok [y/N]: Downloading Packages:
(snip)
Installed:
lxc.x86_64 0:0.7.4.2-1.fc16 lxc-devel.x86_64 0:0.7.4.2-1.fc16
lxc-doc.x86_64 0:0.7.4.2-1.fc16 lxc-libs.x86_64 0:0.7.4.2-1.fc16
lxc-templates.x86_64 0:0.7.4.2-1.fc16
Dependency Installed:
debootstrap.noarch 0:1.0.36-1.fc16
Complete!
2.2.3 Container 용 마운트 포인트 생성. (BtrFS 이용)
# mkfs.btrfs /dev/mapper/vg_mirr-LV_Back -L LXC_Test
WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label LXC_Test on /dev/mapper/vg_mirr-LV_Back
nodesize 4096 leafsize 4096 sectorsize 4096 size 30.00GB
Btrfs Btrfs v0.19
# mkdir /container
# mount /dev/mapper/vg_mirr-LV_Back /container/
2.2.4 Container 하위에 Subvolume 생성
# btrfs subvolume create /container/ol6-template
Create subvolume '/container/ol6-template'
# btrfs subvolume list /container/
ID 256 top level 5 path ol6-template
2.2.5 Virtual Disk Image Mount
# kpartx -a /data/Virt/OL6.img -v
add map loop3p1 (253:7): 0 1024000 linear /dev/loop3 2048
add map loop3p2 (253:8): 0 2097152 linear /dev/loop3 1026048
add map loop3p3 (253:9): 0 9164800 linear /dev/loop3 3123200
# kpartx -l /data/Virt/OL6.img -v
loop3p1 : 0 1024000 /dev/loop3 2048
loop3p2 : 0 2097152 /dev/loop3 1026048
loop3p3 : 0 9164800 /dev/loop3 3123200
# fdisk -lDisk /dev/mapper/loop3p1: 524 MB, 524288000 bytes
255 heads, 63 sectors/track, 63 cylinders, total 1024000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/loop3p2: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/loop3p3: 4692 MB, 4692377600 bytes
255 heads, 63 sectors/track, 570 cylinders, total 9164800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
# mount /dev/mapper/loop3p3 /media/
Kpartx 를 이용하여 Image 파일을 Loop Device 로 Mapper 를 이용해 추가하고,
루트 파일시스템을 마운트 한 예로써도 매우 좋다.
2.2.6 Container 로 구동하기 위해서 마운트된 Root 의 내용을 복사한다.
# cd /mnt
# find . -mount -depth | cpio -pdv /container/ol6-template
사실 왜 cpio 를 이용하는지는 잘 모르겠다..막연히 device-mapper 를 이용해 기록하기
때문인가 싶은데..나중에 누가 좀 해주라 테스트좀 ㅋ
울 Cooperate Architect Organization Head 인 Wim 옹은 Tar 를 이용해서 옮겼다.
2.2.7 템플릿 만들기
여기가 이제 진짜 Contianer 로 운영하기 위한 핵심 프로세스이다.
우리의 Oracle Linux 에서는 LXC 를 위한 몇가지 다양한 템플릿 스크립트를 제공한다.
Oracle 6 용은 없지만 5 버젼 용을 이용해 만들도록 하겠다.
# cd /usr/lib64/lxc/templates
# ls lxc-ol*
lxc-ol4 lxc-ol5
# cp lxc-ol5 lxc-ol6
# perl -pi -e 's/ol5/ol6/g' lxc-ol6
# perl -pi -e 's/Linux 5/Linux 6/g' lxc-ol6
처음 얘기했듯이, Chkconfig 로 구동되지 않아야 하는 녀석들을 스크립트에 추가한다.
# vi lxc-ol6
..(snip)..
chroot ${rootfs_path} chkconfig avahi-daemon off
chroot ${rootfs_path} chkconfig certmonger off
chroot ${rootfs_path} chkconfig iptables off
chroot ${rootfs_path} chkconfig haldaemon off
chroot ${rootfs_path} chkconfig libvirt-guests off
chroot ${rootfs_path} chkconfig pulse off
..(snip)..
본격적인 템플린 생성!
# lxc-create -n ol6ctrl -t ol6
Warning:
-------
Usually the template option is called with a configuration
file option too, mostly to configure the network.
eg. lxc-create -n foo -f lxc.conf -t debian
The configuration file is often:
lxc.network.type=macvlan
lxc.network.link=eth0
lxc.network.flags=up
or alternatively:
lxc.network.type=veth
lxc.network.link=br0
lxc.network.flags=up
For more information look at lxc.conf (5)
At this point, I assume you know what you do.
Press <enter> to continue ...
This is not an Oracle Linux host and release missing.
Cloning base template /container/ol6-template to /container/ol6ctrl ...
Create a snapshot of '/container/ol6-template' in '/container/ol6ctrl'
error reading information on service acpid: No such file or directory
error reading information on service kudzu: No such file or directory
error reading information on service microcode_ctl: No such file or directory
error reading information on service autofs: No such file or directory
error reading information on service hidd: No such file or directory
error reading information on service isdn: No such file or directory
error reading information on service sendmail: No such file or directory
error reading information on service gpm: No such file or directory
error reading information on service ntpd: No such file or directory
error reading information on service dund: No such file or directory
error reading information on service avahi-daemon: No such file or directory
error reading information on service certmonger: No such file or directory
error reading information on service haldaemon: No such file or directory
error reading information on service libvirt-guests: No such file or directory
error reading information on service pulse: No such file or directory
Container created : /container/ol6ctrl ...
Container template source : /container/ol6-template
Container config : /etc/lxc/ol6ctrl
Network : eth0 (veth) on virbr0
'ol6' template installed
'ol6ctrl' created
뚜구둥~ 쉽게 만들어 지었다..
템플릿은 입맛에 맞게 수정하면 되고, 간단하게 가상머신이 하나 생성되는 셈이니,
왜 이녀석을 사용하는게 좋은지 다들 알것이다.
구지 에뮬레이팅되는 가상머신을 설치하여 GUI 등을 이용해 구동할 필요 없이,
간단한 자원 할당을 통해서도 이렇게 가상머신의 역할을 수행 할 수 있다는 점,
그리고 실제로 가상화에 대한 개념 그리고 발전모습을 더 디테일하게 밟아 볼 수
있다는 점이 내가 LXC 를 보고 열광하며 글을 쓰게 된 이유임을 알린다..
( 사실은 CGroup 이나 BtrFS 등은 RedHat 에 찾아보니 이미 새로운 문서들이 있더라는 ㅠㅠ )
- 예고편 2부
2부에서는 실제 운용하고 모니터링하는 부분에 대해서 서술하겠다.
Bridge 네트워크를 이용해서 외부와도 통신이 가능한 Container 를 만들고,
VLAN 을 이용해 Segement 의 구분을 지은 통신을 하는 모습,
컨테이너의 CPU 나 Network 등 리소스를 직접적으로 Controlling 하는 부분,
그리고 몇가지 기타 유용한 LXC 커맨드들을 살펴보도록 하겠다..
빠이빠이~
'Skills > 가상화(Hypervisors)' 카테고리의 다른 글
Oracle 에서도 Desktop Virtualization Infrastructure 가 있다는거 아니? (0) | 2013.08.22 |
---|---|
가상화 시스템에서 자원컨트롤에 대한 신요소! Linux Container - 2부 (0) | 2012.09.09 |
IBM Developerworks 의 KVM 관련 글. (0) | 2011.07.15 |
virt-manager 및 가상화 관련 라이브러리들에대한 깨알정보 (0) | 2011.05.12 |
ThinkPAD X201 vs X60s KVM 비교 (0) | 2011.03.20 |