PengX2 Installation Manual

이 문서는 PengX(U+XEN) 2 Install 방법을 기술합니다.

준비 사항

VT 활성화/RAID 설정 및 cmos 설정

현재 출시된 대부분은 가상화를 지원하나 오래된 hardware(cpu, mainboard)는 지원하지 않을 수 있다. 지원 여부를 확인하고 cmos에서 가상화 기능을 켠다.(intel vt, amd -v) 1. Intel Hyperthread(HT)를 Enabled로 켠다. 2. performance 관련 부분을 최대치에 설정한다. 그렇지 않을 경우 절전 등으로 성능에 제한이 있을수 있다. 3. UXEN은 아래와 같이 RAID 설정을 권장한다. * UXEN OS 영역 : Raid-1 (Mirror) * Data (VM Image 저장소) 영역 : Raid-10 (Stripe + Mirror)

설치 미디어 생성

uxen iso 파일을 이용하여 설치 부팅 미디어를 생성하는 방법이다. 해당 미디어를 통해 부팅을 시도하여 설치를 진행할 수 있다.

이미지 파일 다운로드

uxen iso 파일은 (http://repo.iorchard.co.kr/lgu)에서 download 받을수 있다. uxen-[version]-amd64-CD-1.iso 파일을 download 하면 된다. 해당 iso 파일을 cd로 굽거나 usb로 생성해 부팅할 수 있다.

설치 CD 생성 방법

CD-Recorder류의 프로그램을 이용하여 Download한 ISO 파일을 CD로 구우면 된다. Windows 디스크 이미지 버너(Windows 내장)나 CDBurnerXP (freeware), ImgBrun (freeware) 등 이용할 수 있다. 각 프로그램마다 방법이 다르고, 또 복잡하지 않으므로 자세한 설명은 생략한다.

설치 USB Flash Drive 생성 방법

  1. linux에서는 아래의 명령으로 간단히 생성할 수 있다.

    # dd if=<uxen-iso-file> of=<usb device>; sync
    
    • “uxen-iso-file” 은 download한 iso 파일을 입력한다. of는 os에서 인식한 usb 장치명이다. (ex. /dev/sdc)
  2. windows에서는 win32diskimager (http://sourceforge.net/projects/win32diskimager)을 사용하여 iso파일을 USB Flash Drive로 생성할 수 있다.

    • win32diskimager는 이미지 파일을 선택할때 *.img``가 기본값으로 설정되어 있어 *.*로 변경해야 iso파일을 선택할 수 있다.
    • unetbootin은 iso 파일을 직접 기록하지 않고 bootloader를 직접 설치,설정하여 usb device를 생성하므로 권장하지 않는다.

설치 USB Flash Drive 생성 방법 : syslinux 설치 기반 (on linux)

이 방법은 USB Flash driver에 직접 filesystem을 구성하고 bootloader를 설치하는등의 과정이 포함되어 있어 다소 복잡하나, 사용자가 유연하게 media를 생성할 수 있는 장점이 있다.

  1. http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/hd-media/ 에서 vmlinuz 와 initrd.gz 파일을 download 한다.

    # wget http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/hd-media/{vmlinuz,initrd.gz}
    
  2. usb 부팅매체를 만드는데 필요한 필요한 packages 설치한다.

    # apt-get install syslinux mtools mbr dosfstools
    
  3. usb를 꼽고 fdisk를 사용하여 partition을 나눈다. 아래의 는 usb memory를 sdc로 가정하였고, 파티션 생성 후 bootable flag를 부여한다.

    # fdisk /dev/sdc
    command (m for help) : n
    Partition type:    p    primary (0 primary, 0 extended, 4 free)
    e    extended
    Select (default p): p
    Partition number (1-4, default 1): 1
    First sector (2048-7831551, default 2048):
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-7831551, default 7831551):
    using default value 7831551
    Command (m for help): t
    Sectlected partition 1
    Hex code (type L to list codes) : e
    Command (m for help): a
    Partition number (1-4): 1``
    
  4. FAT로 포멧한다.

    # mkdosfs /dev/sdc1
    
  5. bootloader (syslinux) 설치한다.

    # syslinux /dev/sdc1
    
  6. MBR을 설치한다. sdc1이 아닌 sdc을 주의하자.

    # install-mbr /dev/sdc
    
  7. 마운트후 커널과 initramdisk, iso파일을 복사한다.

    # mount /dev/sdc1 /mnt
    # cp vmlinuz,initrd.gz uxen-2.0-amd64-CD-1.iso /mnt
    
  8. bootload (syslinux) 설정 파일을 생성한다.

    # vi /mnt/syslinux.cfg
    
  9. default vmlinuz

    append preseed/file=/cdrom/simple-cdd/uxen2.preseed preseed/file=/cdrom/simple-cdd/default.preseed debian-installer/locale=ko_KR vga=788 initrd=initrd.gz -- quiet
    
  10. usb memory를 umount 한다.

    # umount /mnt
    

설치 USB Flash Drive 생성 방법 (legacy) : grub 기반 (on windows)

USB Flash Drive을 이용하여 설치 미디어를 생성하는 방법이다. 생성하기 위해선 windows용 dd 설치가 필요하다.

  1. http://www.chrysocome.net/dd 에서 windows용 dd를 download받아 설치한다.

  2. http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/hd-media/boot.img.gz 를 download 받는다.

  3. download한 boot.img.gz의 압축을 푼다. (결과물 : boot.img)

  4. usb memory를 삽입한뒤, dd툴을 이용하여 usb의 volume uuid를 검색한다. (removeable media와 드라이브명 확인)

  5. dd.exe –list

    ...
    \\.\Volume{c6d6abd9-086c-11e0-8f9b-00163647b632}\
    link to \\?\Device\Harddisk1\DP0-0+6
    removeable media
    Mounted on \\.\e:
    ...
    
  • 위의 경우 “.:raw-latex:Volume{c6d6abd9-086c-11e0-8f9b-00163647b632}”가 된다.
  1. image 파일을 usb로 복사한다.

    dd.exe if=c:\boot.img of=\\.\Volume{c6d6abd9-086c-11e0-8f9b-00163647b632} bs=1M --progress
    
  2. 복사가 끝나면 usb를 뺏다 다시 연결한다.

  3. Uxen iso 파일을 해당 USB memory 드라이브(e:)로 복사한다.

  4. 마지막으로 부트로더의 parameter값을 수정한다. 노트패드로 아래와 같이 e:txt.cfg를 수정하면 된다.

    append preseed/file=/cdrom/simple-cdd/uxen2.preseed preseed/file=/cdrom/simple-cdd/default.preseed debian-installer/locale=ko_KR
    

설치 USB Flash Drive 생성 방법 (legacy) : grub 기반 (on linux)

linux의 경우도 위의 windows와 동일한 방법으로 진행된다.

  1. http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/hd-media/boot.img.gz 를 download 받는다.

    # wget http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/hd-media/boot.img.gz
    
  2. download한 boot.img.gz을 usb dev로 복사한다. (아래는 usb가 /dev/sdc로 가정)

# zcat boot.img.gz > /dev/sdc
  1. 복사된 usb를 mount 한다.

    # mount /dev/sdc /mnt
    
  2. Uxen iso파일을 mount된 usb로 복사한다.

    # cp uxen-2.0-amd64-CD-1.iso /mnt
    
  3. bootloader의 parameter값을 수정한다.

    # vi /mnt/txt.cfg
    append preseed/file=/cdrom/simple-cdd/uxen2.preseed preseed/file=/cdrom/simple-cdd/default.preseed debian-installer/locale=ko_KR
    
  4. Usb media를 umount 한다.

# umount /mnt

uxen 설치

uxen2 media를 넣고 부팅을 시도한다. CMOS에서 부팅 순서를 해당 미디어(cdrom, usb) 먼저 시도하도록 설정하여야 한다. uxen2 installer은 Debian Installer를 customize 한것이므로, 일반적인 Debian 계열의 OS(Debian, Ubuntu등)의 설치과정과 거의 흡사하다.

설치

  1. 키맵 설정 uxen의 설치시 가장 먼저 설정하는 값이다. (설치 미디어 생성 방법에 따라 grub의 선택화면이 나올수 있다. 이때는 기본값인 default로 부팅을 진행하면 된다.) 일반적인 Query를 사용한다면 “미국 영어”를 선택한다. 다른 언어의 키맵을 선택할 경우, 키와 문자의 매핑이 달라 알파벳의 입력이 불가능할 수 있다.

  2. 설치 Profile 선택 설치할 Profiles을 선택한다.

    pengx는 uxen의 hypervisor를, uxen은 management 서버인 xeus와의 통신을 하기 위한 uxenapi를 의미한다. 둘다 필요하므로 space키를 눌러 모두 선택하여 진행한다.

  3. 기본 네트워크 설정

  • Network을 설정할 수 있다. 공인망(서비스망)으로 설정을 진행해야 설치 도중 문제시 원격으로 지원이 가능하다. 부여하고자 할 ip 주소를 입력한다.
  • netmask를 입력한다
  • gateway를 입력한다.
  • name server를 입력한다. 없다면 생략 가능하다.
  • hostname을 입력한다.
  • network의 domain name을 입력한다. 없다면 ‘계속’을 눌러 넘어 갈 수 있다.
  1. 파티션 설정

“자동”으로 설치를 진행할 수 있지만 “수동 으로” 선택하여 아래의 파티션으로 설정을 권장한다. 설치하고자 하는 디스크에 파티션을 나눈다. 아래의 파티션을 권장한다. (sda 설치 가정)

  • sda1 : swap - 1G
  • sda2 : / (root) - 10G ext4
  • VM Image 저장소를 local disk에 저장한다면 /data 영역을 추가하여 xfs로 구성한다. (예를 들면 /dev/sda3나 /dev/sdb1등) FC SAN이나 iScsi, AOE등 Storage를 사용할경우 설치 이후에 따로 설정해야 하므로 swap과 root 파티션만을 설정한뒤 넘어가도록 한다.
  1. 설정이 완료되면 ‘파티션 나누기를 마치고 바뀐 사항을 디스크에 쓰기’를 선택한다.

  2. 설치 설정이 완료되면 하드 디스크에 uxen을 설치하기 시작한다.

설치 종료

설치가 완료되면 시스템이 자동으로 shutdown 된다. power 버튼을 눌러 시스템을 켠다. 문제없이 설치가 되었다면 아래와 같이 GRUB 설정화면을 볼수 있을것이다. Xen 커널로의 부팅이 가장 첫번째 자리하고 있고, 기본값으로 설정되어 있다. 특별한 키이벤트가 없다면 10초뒤 자동으로 Xen Kernel로 부팅이 진행된다.

부팅이 완료되면 CLI Login화면을 볼 수 있을것이다. 초기값으로 설정된 OS의 계정 정보는 아래와 같다.

  • OS User : root
  • Password : orchardxen

설치 후 점검 사항

장치 점검

설치 후엔 각 장치들이 제대로 인식 되었는지 확인이 필요하다.

  1. CPU Core 수 확인 실제 물리 CPU Cores는 몇개인지 아래 명령을 알수 있다. HT(hyperthreading)을 제대로 켰다면 실제 Cores * 2가 나와야 정상이다. # xl info | grep nr_cpus
  2. RAM 확인 uxen에서 메모리 인식은 제대로 되어 있는지 확인한다. 단위는 MB로 표시된다. # lspci  | grep total_mem
  3. Raid Controller, HDD Raid Controller는 제대로 잡혀있는지 아래의 명령으로 확인할 수 있다. # lspci  | grep -i raid 또 실제로 잡힌 Hard Disk도 확인해야 한다. HDD 개수와 Size는 맞는지 확인한다. # parted -l
  4. Ethernet Card 실제 물리 NIC가 정상적으로 인식하고 있는지는 다음 명령으로 확인할 수 있다. # lspci  | grep -i ether 각 ethernet interface 마다 옳바르게 잡혀있는지, 개수는 맞는지 확인한다.
  5. HBA Card FC SAN을 사용하는 경우라면 HBA가 정상적인지도 확인해야한다. # lspci  | grep -i fibre
  6. 기타 H/W 그밖의 다른 H/W는 lspci 또는 lshw 명령등으로 확인할 수 있다.

네트워크 설정

Uxen은 VM과 PM의 네트워크 구성을 위해 가상의 스위치를 구성하여 네트워크를 구성한다. 설치시 설정했던 네트워크는 자동으로 linux bridge (xenbr0)로 구성되어 설정된다. 이를 변경하거나, 새로운 네트워크 구성할 수 있다. 모든 설정이 끝마치면 reboot하여 Ping test등으로 정상적으로 작동하는지 확인이 필요하다.

  1. bonding 구성 2개 이상의 NIC을 이용하여 대역폭 확장이나 이중화를 구성하기 위한 bonding을 설정할 수 있다. uxen의 경우 bonding은 mode 1 (active-backup)과 mode 4 (lacp : 802.3ad)를 지원한다.

    bonding설정은 debian 계열 OS(debian, ubuntu등)에서의 bonding 설정과 동일하다. 아래의 경우 eth0, eth1을 mode 1인 active-backup 구성하여 bond0를 생성한 예이다. /etc/network/interfaces파일을 수정한다.

    # vi /etc/network/interfaces
    auto bond0
    iface bond0 inet manual
    slaves eth0 eth1
    bond-mode active-backup
    bond-miimon 100
    bond-downdelay 200
    bond-updelay 200
    

    추가로 module 설정을 수정한다.

    # echo “bonding” >> /etc/modules
    # vi /etc/modprobe.d/bonding
    alias bond0 bonding
    options bond0 mode=6 miimon=100 primary=eth0
    

    Bonding interface를 올려 제대로 설정되어 있는지 확인한다.

    # ifup bond0
    # cat /proc/net/bonding/bond0
    Bonding Mode: Active-Backup
    Primary Slave: None
    Currently Active Slave: eth0
    MII Status: up
    MII Polling Interval (ms): 100
    Up Delay (ms): 200
    Down Delay (ms): 200
    
    Slave Interface: eth0
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 00:18:fe:fa:c2:14
    Slave queue ID: 0
    
    Slave Interface: eth1
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 00:18:fe:fa:c2:15
    Slave queue ID: 0
    
  2. linux bridge 구성 uxen에서 기본으로 설정되는 가상 switch인 linux bridge를 이용하여 네트워크를 구성하는 방법이다. 아래는 xenbr1이라는 bridge interface (가상 switch)를 생성하고 eth1을 연결한 예이다.

    # vi /etc/network/interfaces
    auto eth1
    iface eth1 inet manual
    
    auto xenbr1
    iface xenbr1 inet static
        bridge_ports eth1
        bridge_maxwait 5
        address 192.168.0.100
        netmask 255.255.255.0
        gateway 192.168.0.1
    

    bonding interface를 bridge 하려면 bridge_ports에 해당 interface(bond0)를 추가하면 된다. 설정후 아래의 명령으로 확인할수 있다.

    # ifup xenbr1
    # brctl show
    bridge name   bridge id           STP enabled   interfaces
    xenbr1        8000.a0369f3e1b14   no            eth1
    
  3. OVS 구성 가상 switch로 Linux bridge를 사용하지 않고 Open VSwitch를 사용하는 방법이다. 위의 eth1, xenbr1 linux bridge 구성과 동일한 설정을 ovs로 구성한 예이다.

    # vi /etc/network/interfaces
    auto xenbr1
    allow-ovs xenbr1
    iface xenbr1 inet static
        ovs_type OVSBridge
        ovs_ports eth1
        bridge_maxwait 5
        address 192.168.0.100
        netmask 255.255.255.0
        gateway 192.168.0.1
    
    allow-xenbr1 eth1
    iface eth1 inet manual
        ovs_type OVSPort
        ovs_bridge xenbr1
    

    /etc/rc.local파일을 수정하여 부팅시 자동으로 interface가 올라오도록 설정한다.

    # vi /etc/rc.local
    for ovsbr in $(grep 'allow-ovs' /etc/network/interfaces \| awk '{print $2}');
        do ifup –allow=ovs $ovsbr
    done
    

    xenbr0의 ovs bridge에 eth0 port를 추가한다.

    # ovs-vsctl add-port xenbr1 eth1
    # ovs-vsctl show
    51556966-9a66-474c-bd46-38a5e389189be
    Bridge “xenbr1”
        Port “eth1”
            Interface “eth1”
    

VM 이미지 저장소 구성

  1. 디렉토리 생성 vm image의 저장소로 사용될 스토리지를 구성하는 방법이다. 이 저장소의 위치는 반드시 /data에 마운트되어야만 한다. /data 에는 아래와 같은 디렉토리들이 존재하여야만 uxen이 정상적으로 작동한다.

    • /data/template : template image 디렉토리

    • /data/domu : vm image 디렉토리

    • /data/iso : 설치 iso를 위한 디렉토리 따라서 스토리지를 /data에

      mount한 뒤엔 아래와 같이 해당 디렉토리들을 생성해야한다.

      # mkdir /data/{template,domu,iso}
      
  2. Local Disk 외부의 스토리지 구성없이 PM의 Disk를 이용하여 vm image 저장소를 구성하는 방법이다. 각 PM들이 각자의 Local Disk에 vm image를 저장하여 서로 공유되지 못하므로, VM Migrate이 지원되지 않는다. Local Disk는 Raid 10을 권장하며, filesystem은 XFS의 사용을 권장한다. 아래는 /dev/sdb를 local storage로 구성한 예이다.

    # fdisk /dev/sdb
    

    /dev/sdb1으로 파티션을 구성한다.

    # mkfs.xfs /dev/sdb1
    

    xfs로 filesystem을 생성한다. /data를 생성하고 filesystem이 자동 mount되도록 fstab에 추가한다.

    # mkdir /data
    # echo “/dev/sdb1 /data xfs defaults 0 0” >> /etc/fstab
    # mount -a
    
  3. NFS 일반적인 NFS를 마운트하듯 /data 파티션에 mount한다.

    # mkdir /data
    # echo “[nfs-server-address]:[shared-volume] /data nfs defaults 0 0” >> /etc/fstab
    # mount -a
    
  4. FC SAN, iSCSI, AoE FC SAN나 iSCSI, AoE를 이용하여 /data를 구성할 수 있다. 다만 multipath, ocfs2등의 설정들이 다소 복잡하여 이 문서에서는 생략한다.

  5. 기타 설정 Drop cache 적용 현재 cache 관련 이슈로 인해 정기적으로 cache를 비워줘야 한다. root user의 crontab에 아래와 같이 등록한다.

    # crontab -e
    * * * * sync && echo 3 > /proc/sys/vm/drop_caches
    

uxenapi 설치

management인 xeus와의 통신을 위해 필요한 uxenapi를 설치하는 방법이다. Uxen 설치시 profile 설정에서 “uxen”을 선택하여야만 설치가 가능하다. 또 uxenapi를 설치하기 위해서는 uxen의 정보들을 저장할 DB(postgre sql)가 존재해야만 한다. uxenapi의 소스는 orchard 홈디렉토리 밑에 위치하고 있다. Install script를 실행하여 uxenapi를 설치할 수 있다.

  1. Install script 실행

    # su - orchard
    $ cd ~/uxen/scripts
    $ ./install_uxen.sh
    
  2. uxenapi 설치 화면

VM Image 저장소로 사용될 /data의 구성이 완료되어있는지 확인한다. Install script를 실행하기전에 /data의 mount와 directory들을 생성해야한다.

  1. database 설정 uxenapi를 설치할때 DB(postgre sql)의 연결을 확인한다.
  1. database 서버 연결 설정

DB(postgre sql)의 IP주소를 입력한다. hostname을 입력 할 경우 /etc/hosts 에 등록이 되어 있어야 한다.

Database의 이름을 입력한다.

Db user을 입력한다.

Db user 패스워드를 입력한다.

새로운 Zone을 구성할 경우 첫번째로 설치한 Node는 template 동기화 작업등의 추가 작업이 포함된다. 따라서 위와 같이 first node인지 물어본다.

xenapi 통신을 위해 사용되는 management bridge interface를 설정한다.

설치가 완료된다면 위와 같은 화면을 볼수 있을것이다.

  1. uxenapi 연결 테스트 uxenapi를 호출하는 cli툴이 존재한다. 해당 cli 툴로 localhost로 uxenapi를 호출하여 정상적으로 작동하는지 확인할 수 있다.

    # ~orchard/uxen/scripts/uxen_cli -h
    bash usage: uxen\_cli [-h] [-v] [-t] COMMAND ...
    
    UXEN Cli Tool for UXEN-API
    
    positional arguments:
      COMMAND
        pm-info       Get information about a pm
        pm-stat       Get a system stat about a pm
        tpl-list      List information about all template
        tpl-del       Delete a template
        vm-list       List information about all vm
        vm-start      Start a vm
        vm-shutdown   Shutdown a vm
        vm-poweroff   Shutdown a vm (force-shutdown)
        vm-reboot     Reboot a vm
        vm-info       Get information about a vm
        vm-stat       Get system stat about a vm
        disk-list     List disks about vm
        disk-add      Add a disk to a vm
        disk-del      Delete a disk to a vm
        vif-list      List vif about a vm
        vif-add       Add a vif to a vm
        vif-del       Delete a vif to a vm
    optional arguments:
      -h, --help      show this help message and exit
      -v, --verbose   Increate output verbosity
      -t , --output   Output type (xml, json)~orchard/uxen/scripts/uxen_cli pm-info
    

    vm들이 존재하지 않을수 있으니 pm-info와 같은 COMMAND를 호출하여 테스트를 진행한다.

    # ~orchard/uxen/scripts/uxen\_cli pm-info
    

    Return code가 200으로 해당 PM의 정보가 제대로 출력된다면 제대로 작동하는 것이다.

  2. uxenapi 연결 테스트 (legacy) uxenapi를 호출을 test하기위해 만든 script들이 존재한다. 해당 script들을 실행시켜 uxenapi이 제대로 작동하는지 확인할 수 있다. script들을 실행하기 전에 include.sh을 수정하여 서버의 port를 변경해야한다.

    # cd ~orchard/uxen/api/tests
    # vi include.sh
    

    SERVER=”http://localhost:8000/api” 에서 포트를 아래와 같이 80 번으로 변경한다.

    #!/bin/bash
    
    SERVER="http://localhost:80/api"
    CURL="curl -v"
    
    GET() {
            url=$1
            echo -n "##### GET $url" ; read
            $CURL -H 'Content-type: application/xml' -X GET $url
    }
    
     POST() {
            url=$1
                  data=$2
            echo "$data"
            echo -n "##### POST $url" ; read
            echo "$data" | $CURL -H 'Content-type: application/xml' -X POST -d @- $url
    }
    

    이제 pm_info를 실행하여 api request를 호출해본다.

    # ./pm_info.sh
    

    아래와 같이 pm의 정보가 제대로 나타난다면 정상적으로 작동함을 의미한다.

    <pm id="A064D172-E07E-DD11-91FE-0023541104C2">
    <name>jennings</name>
             <status>running</status>
             <cpu_core>4</cpu_core>
             <memory>8191</memory>
             <interfaces>
         <interface>
             <name>eth1</name>
             <mac>00:20:78:12:19:f1</mac>
             <ip></ip>
         </interface>
         <interface>
             <name>eth0</name>
             <mac>00:23:54:11:04:c2</mac>
             <ip></ip>
         </interface>
         <interface>
             <name>xenbr0</name>
             <mac>00:20:78:12:19:f1</mac>
             <ip></ip>
         </interface>
     </interfaces>
     </pm>
     * Connection #0 to host localhost left intact
     * Closing connection #0