레이블이 Server인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Server인 게시물을 표시합니다. 모든 게시물 표시

2015년 10월 30일 금요일

Cloud Server 구축 - #06 XEN 설치




yum install kernel-xen xen xen-libs xen-devel

패키지를 찾을 수 없음



CentOS 6에서는 hypervisor로 kvm을 선택하고 있어서 OS설치후 Xen Hypervisor를 따로 설치해 주어야 합니다.
CentOS 6.x를 최소설치 모드(minimal)로 설치 합니다.

※ Xen 설치시 kvm과 충돌나는 문제로 고민 하기 싫으면 반드시 minimal로 설치 하기를 권장함.



Cloud Server 구축 - #05 Guest OS 설치






#qemu-img create -f raw guest_os01.raw 10G

Formatting 'guest_os01.raw', fmt=raw size=10737418240 



#virt-install --hvm --connect qemu:///system --network network:default --name guest_os01 --vcpus 1 --ram 512 --disk path=guest_os01.raw,size=10 --vnc --cdrom os/CentOS-6.5-x86_64-LiveCD.iso


--hvm 
하드웨어 가상화 사용
--connect qemu:///system 
로컬시스템에 연결
--network network:default 
--name guest_os01 
--vcpus 1 
--ram 512 
ram 설정 MB
--disk path=guest_os01.raw,size=10 
--vnc 
VNC 연결. 설정하지 않을 경우 GUI 모드로 guest os 설치 불가.
--cdrom os/CentOS-6.5-x86_64-LiveCD.iso
CD-ROM 일 경우 /dev/cdrom


SSH 실행
# virt-viewer quest_os01
Cannot open display: 
Run 'virt-viewer --help' to see a full list of available command line options


SSH로 실행 하면 안됨
VNC 원격접속으로 실행함

실행 매우 느림
부팅하는데만 10분 이상 소요


GUI 환경 설치












2014년 3월 1일 토요일

KVM vs XEN


가상화

 가상화란 컴퓨팅 리소스의 추상화를 통해 다수의 운영 체제 또는 애플리케이션 이미지가 하나의 물리적 서버를 공유하도록 함으로써 총소유비용을 극적으로 절감하고 관리성을 개선할 수 있게 하는 프로세스를 말한다.


전가상화 & 반가상화


  • 전가상화(Full Virtualization)
    • 491cec5902703 (400×200)
    • 하드웨어를 완전히 가상화 하는 방식, 하드웨어를 완전히 가상화하기 때문에 게스트 OS에 아무런 수정없이, 또한 윈도우에서 리눅스까지 다양한 OS 이용가능
    • 전제조건 : 물리적인 가상화 지원 기능이 있어야 함. CPU의 Intel-VT나 AMD-V 기능 필수
    • 단점 : CPU의 사용으로 성능 저하 발생
  • 반가상화(Para-Virtualization)
    • 491cec5940821 (400×200)
    • 전가상화와는 달리 하드웨어를 완전히 가상화하지는 않음. 게스트OS가 직접 하드웨어를 제어하는 것이 아니고 하이퍼바이저에게 의뢰, 하이퍼바이저가 제어를 하기때문에 높은 성능 유지 가능
    • 대표적 기술로는 XEN, KVM
    • 단점 : 게스트 OS의 커널의 일부분을 수정해야 하는 단점, 따라서 게스트 OS는 오픈 소스에 한정됨

하이퍼바이저(hypervisor)

 하이퍼바이저(hypervisor)는 호스트 컴퓨터에서 다수의 운영 체제(operating system)를 동시에 실행하기 위한 논리적 플랫폼(platform)을 말한다.

Type 1 / Type 2



  • Type 1 (native 또는 bare-metal)
    • 운영 체제가 프로그램을 제어하듯이 하이퍼바이저가 해당 하드웨어에서 직접 실행되며 게스트 운영 체제는 하드웨어 위에서 2번째 수준으로 실행된다. 
    • Xen, Citrix의 XenServer, VMware의 ESX Server, L4 마이크로커널, TRANGO, IBM의 POWER 하이퍼바이저(PR/SM), 마이크로소프트의 하이퍼-V, 패러랠서버, 썬의 로지컬 도메인 하이퍼바이저 등이 있다.
    • 히타치의 Virtage 하이퍼바이저같이 플랫폼의 펌웨어에 하이퍼바이저를 넣기도 하며 KVM은 하이퍼바이저 안에 완전한 리눅스 커널을 넣었는데 이것도 Type 1 이다.
  • Type 2 (hosted)
    • 하이퍼바이저는 일반 프로그램과 같이 호스트 운영 체제에서 실행되며 VM 내부에서 동작되는 게스트 운영 체제는 하드웨어에서 3번째 수준으로 실행된다. 
    • VMware Server, VMware Workstation, VMware Fusion, QEMU, 마이크로소프트의 버추얼 PC와 버추얼 서버, Oracle(SUN)의 버추얼박스, SWsoft의 Parallels Workstation과 Parallels Desktop이 있다.

KVM


  1. CPU의 가상화 지원기술(Intel-VT, AMD-V)이 필수인 전가상화만을 지원하기에 Xen처럼 가상머신의 커널을 수정해줄 필요가 없음
  2. ESX Server나 XenServer 등과 같은 전용의 하이퍼바이저가 아닌 Linux 자체를 호스트 OS로 이용
  3. 관리툴로서 에뮬레이터인 QEMU가 필요
  4. KVM에서 가상화를 제공하기 위해서는 한 가지 전제 조건이 붙는데, 사용하는 CPU에서 HVM(Hardware Virtual Machine) 기능을 제공해야 한다는 점이다. x86 아키텍처의 HVM으로는 Intel의 VT-x와 AMD의 SVM가 있다. 
  5. 같은 x86 아키텍처이라고 할지라도 가상화 기능은 벤더마다 다르므로 벤더별로 구현해야 하는 단점이 있다.


XEN


  1. Xen은 Type 1 하이퍼바이저이므로 호스트 운영체제가 존재하지 않는다. 
  2. Xen에는 도메인 0라는 특수한 도메인이 존재한다. 도메인 0는 실제 물리 디바이스와 통신하는 디바이스 드라이버가 있고, 각 도메인을 제어한다. 

참고


  • http://onestep.tistory.com/94
  • http://blog.daum.net/blue_05/12
  • http://blog.naver.com/lsj7610/80155779618
  • http://virtualhive.tistory.com/36
  • http://www.solanara.net/solanara/virtualization
  • http://technet.microsoft.com/ko-kr/magazine/hh802393.aspx



OpenCL 교육 정리

OpenCL 교육 정리

이 문서는 2014/02/24, 25 양일간 3D융합기술지원센터에서 실시한 OpenCL 교육을 받고 내용을 정리한 문서입니다.

OpenCL 이란?

l  OpenCL(Open Computing Language)은 개방형 범용 병렬 컴퓨팅 프레임워크이다.
l  CPU, GPU, DSP 등의 프로세서로 이루어진 이종 플랫폼에서 실행되는 프로그램을 작성할 수 있게 해 준다.
l  OpenCL은 커널 코드를 작성하기 위한 C99 기반의 언어인 OpenCL C와 플랫폼을 정의하고 제어하기 위한 API를 포함하고 있다.
l  OpenCL은 작업 기반(task-based) 및 데이터 기반(data-based) 병렬 컴퓨팅을 제공한다.
l  최신 버전 : 2.0
l  OpenCL platform model
l  Execution Model
n  kernel : device에서 실행되는 하나의 함수
n  work-item : 가장 작은 단위의 실행 객체. work-item 단위로 나뉘어 각각 병렬처리.
n  work-group : work-item 그룹.
n  Global : 전체 work 영역

OpenCL 개발 환경 구축

Windows OS 에서 NVIDIA가 제공하는 CUDA Toolkit을 사용하여 개발하는 환경을 구축하는 것을 기준으로 설명함.
CUDA GPU에서 수행하는 병렬처리 알고리즘을 C 프로그래밍 언어 등의 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술로 NVIDIA의 지포스 8시리즈급 이상에서 지원함.

1.      Microsoft Visual Studio 준비
2.      NVIDIA CUDA 5.5 다운로드 및 설치
B.      반듯이 OS 버전 및 BIT(32/64) 에 맞는 설치 파일을 설치해야 함.
3.      참고
A.     OpenCL.dll 빌드 오류
                         i.         64비트 윈도우의 경우 디폴트로 로딩되는 OpenCL.dll 32비트 용으로 로딩되어 빌드가 정상적으로 되지 않는 경우 발생.
                       iii.         위 링크로 다운로드한 파일을 설치하여 intel OpenCL x64 SDK 가 설치되도록 함.

OpenCL 프로젝트 설정

가장 기본적인 Win32 콘솔 응용 프로젝트를 생성하여 OpenCL 프로그래밍이 가능하도록 설정하는 방법을 설명함.
1.      Win32 콘솔 응용 프로그램 생성
2.      속성 > C/C++
A.     '일반'의 추가 포함 디렉터리 항목에 아래 경로 추가
                           i.         CUDA Toolkit 설치 경로/include
3.      속성 > 링커
A.     '일반'의 추가 라이브러리 디렉터리 항목에 아래 경로 추가
                           i.         CUDA Toolkit 설치 경로/lib/Win32
                          ii.         64bit OS 라고 x64 폴더를 지정해도 빌드가 제대로 되지 않음.
B.      '입력'의 추가 종속성 항목에 OpenCL.lib 추가.

OpenCL 프로그래밍

기본적으로 병렬 덧셈 프로그램을 작성해 본다.
1.      소스 파일에 sample.cl 파일 추가 후 아래 코드 추가
__kernel void vecAdd(__global int *a, __global int *b, __global int *c) {
int id = get_global_id(0);
c[id] = a[id] + b[id];
}

2.      main cpp 파일에 아래 코드 추가
#include "stdafx.h"
#include
#include

#include

#define MEM_SIZE 128
#define MAX_SOURCE_SIZE 0x100000

int _tmain(int argc, _TCHAR* argv[])
{
          // 변수 선언
          cl_platform_id                     platform_id;
          cl_uint                               ret_num_platforms;
         
          cl_device_id                        device_id;
          cl_uint                               ret_num_devices;

          cl_context                          context;

          cl_command_queue             command_queue;

          cl_mem                             memA;
          cl_mem                             memB;
          cl_mem                             memC;

          char                                  *source_str;
          size_t                                 source_size;

          FILE                                   *fp;
          char                                  filename[]="./sample.cl";

          cl_program                         program;
          cl_kernel                            kernel;

          cl_int                                 ret;
          cl_int                                 err;
          size_t                                 size;

          int a[MEM_SIZE];
          int b[MEM_SIZE];
          int c[MEM_SIZE];
         

          // Platform ID 얻기
          ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);

          // Divice ID 얻기
          ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, &ret_num_devices);

          // Context 생성. context Device 리소스를 관리함.
          context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);

          // Command Queue 생성. Command Queue를 통해 Device에 작업 시킴.
          command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
         
          // 계산할 변수에 값 할당
          for (int i = 0; i < MEM_SIZE; i++) {
                       a[i] = i;
                       b[i] = 4 * i;
          }

          // 계산에 사용되는 각 변수 메모리 할당
          memA = clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE*sizeof(int), NULL, &ret);
          memB = clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE*sizeof(int), NULL, &ret);
          memC = clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE*sizeof(int), NULL, &ret);

          // kernel에 입력해야하는 변수를 command queue에 할당
          ret = clEnqueueWriteBuffer(command_queue, memA, CL_TRUE, 0, MEM_SIZE*sizeof(int), a, 0, NULL, NULL);
          ret = clEnqueueWriteBuffer(command_queue, memB, CL_TRUE, 0, MEM_SIZE*sizeof(int), b, 0, NULL, NULL);

          // kernel 함수 파일 읽어오기
          fp = fopen(filename, "r");
          if (!fp) {
                       printf("Not Kernel File. \n");
                       exit(1);
          }
          source_str = (char*)malloc(MAX_SOURCE_SIZE * sizeof(char)) ;
          source_size = fread(source_str, 1, MAX_SOURCE_SIZE, fp);
          fclose(fp);

          // kernel 함수 string 으로 부터 program 생성
          program = clCreateProgramWithSource(context, 1, (const char**)&source_str, (const size_t*)&source_size, &ret);

          // program 빌드
          ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);

          // kernel 생성. 두번째 param kernel 함수명을 정확기 기입하여야함.
          kernel = clCreateKernel(program, "sample", &ret);

          // kernel 함수 param 지정
          ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&memA);
          ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&memB);
          ret = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&memC);

          // global item 수 설정. 128번의 연산을 수행할 것이므로 128 설정.
          size_t global_item_size = 128;
          // work_group 수 설정. global item 수에따른 work_group 분류로 global item 수에 나누어 떨어지는 수가 되어야함.
          size_t local_item_size = 1;

          // kernel queue 할당. 실제 계산 수행.
          ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, &local_item_size, 0, NULL, NULL);

          // 결과값 읽어오기
          ret = clEnqueueReadBuffer(command_queue, memC, CL_TRUE, 0, MEM_SIZE*sizeof(int), c, 0, NULL, NULL);
         
          // 결과값 출력
          for (int i = 0; i < MEM_SIZE; i++) {
                       if (i%4 == 0 ) printf("\n");
                       printf("%d\t", c[i]);
          }

          // 메모리 해제
          ret = clFlush(command_queue);
          ret = clFinish(command_queue);
          ret = clReleaseKernel(kernel);
          ret = clReleaseProgram(program);
          ret = clReleaseMemObject(memA);
          ret = clReleaseMemObject(memB);
          ret = clReleaseMemObject(memC);
          ret = clReleaseCommandQueue(command_queue);
          ret = clReleaseContext(context);

          return 0;
}

3.      빌드
4.      디버깅하지 않고 시작
5.      결과 확인
128번의 덧셈 계산 병렬 계산.

참고

l  OpenCL 홈페이지
l  OpenCL 2.0 Spec
l  NVIDIA 예제 파일 다운로드
l  추천 도서
n  OpenCL Programing Guide - AAFTAB MUNSHI / Addison Wesley
n  OpenCL 프로그래밍 - 주식회사 Fixstars / 한빛미디어


2014년 2월 22일 토요일

Cloud Server 구축 - #04 VNC 설치

원격 접속 설정


원격 접속을 위해 VNC 설치

1. 서버에 VNC 설치

  • GUI 환경이 설치 되어있어야 함.
  • 기본적으로 GUI 환경으로 설치 하였지만 아닐 경우 아래 명령어로 설치.
    • yum groupinstall "X Window System" "KDE Desktop"
  • VNC Server 설치
    • yum install tigervnc-server
    • default 로 설치가 되어있었음

2. 방화벽 설정

  • VNC는 5901 포트 사용
  • 방화벽에서 5901 포트 open
    • iptables -I INPUT 1 -p tcp --dport 5901 -j ACCEPT
    • iptables -I OUTPUT 1 -p tcp --dport 5901 -j ACCEPT

3. 설정 파일 수정

  • VNC 설정 파일
    • /etc/sysconfig/vncservers
  • 코드 추가
    • VNCSERVERS="1:root"
    • VNCSERVERARGS[1]="-geometry 1024x768"

4. 비밀번호 설정

  • VNC 접속시 사용할 비밀번호 설정
    • vncpasswd root

5. VNC 실행

  • VNC server 생성
    • vncserver
    • 등록한 비밀번호 입력
  • VNC Server 시작
    • service vncserver start
    • 등록한 비밀번호 입력

6. VNC Viewer 설치

  • Windows에 VNC Viewer 프로그램 설치
  • 대표적인 VNC Viewer 프로그램인 TightVNC 설치
    • http://www.tightvnc.com/download.php

7. 접속

  • Windows에서 TightVNC Viewer 실행
  • '서버 IP:1' 입력하고 Connect
  • 비밀번호 입력


8. 접속 완료

  • 접속화면


* 참조

  • http://www.cmsfactory.net/node/10252


2014년 2월 18일 화요일

Cloud Server 구축 - #03 KVM 설치 2


KVM 설치 2

CentOS x86_64 설치


  • CentOS 32비트 KVM 이 설치되지 않아 CentOS 64비트 재 설치
  • SSH 설치 및 방화벽 해제
  • 부팅 시 SSH 자동 실행 등록
  • yum update 실행


KVM 설치


  • kvm 패키지 설치
    • # yum install kvm
  • 관련 패키지 설치
    • # yum install virt-manager libvirt libvirt-python python-virtinst qemu kvm-qemu-img virt-viewer
    • # yum install bridge-utils
  • 책에서 아래 명령어를 실행하라고 나와있으나 command not found
    • system-config-securitylevel
  • 재부팅 후 kvm 확인
    • lsmod | grep kvm
    • 실행 결과
      • kvm                   332980  0

2014년 2월 16일 일요일

Cloud Server 구축 - #02 KVM 설치

KVM 설치

yum 으로 설치


# yum install kvm


  • 패키지를 찾을 수 없다며 설치 안됨.
    • No package kvm available.
  • yum repository 때문인 것 같아 아래와 같이 설정된 repository를 다음으로 변경함.
    • centos.mirror.cdnetworks.com -> http://ftp.daum.net/centos
  • 그래도 kvm 패키지를 찾지 못함.
  • OS의 버전 등의 문제가 아닌가 추측함.
    • KVM이 고려되어 설계된 2.6.20 이후 버전의 커널을 쓰는 OS에 설치 권장이라고 함.
    • 설치된 CentOS의 커널 버전은 2.6.32-431.5.1.el6.i686
  • 검색 결과 'Virtualization' 그룹을 install 하지 않아 그렇다고 하여 추가함.
    • yum groupinstall Virtualization "Virtualization Client" "Virtualization Platform" "Virtualization Tools"
    • 그래도 찾을 수 없음.
  • CentOS 에서 KVM 사용이 64비트 권장이라고 나와있는 곳이 있었는데 검색을 더 해본 결과 32비트는 지원하지 않는 것으로 결론.
    • => CentOS 64비트로 재설치



2014년 2월 1일 토요일

Cloud Server 구축 - #01 기반 구축


시작


테스트 서버를 구축해보고자 하는 중에

팀장님께서 클라우드 서버를 구축해보는 것이 어떠겠냐고 하셔서 클라우드 서버를 구축 해보고자 한다.

팀장님께서 안쓰시는 PC 한대를 주시고 아래와 같은 책을 사주셨다.


이 책을 보고 공부를 하면서 클라우드 서버를 구축해보고 기술들을 익혀 나갈 예정이다.


설치


사양

PC는 1대이며 사양은 다음과 같다.


  • CPU :  Intel(R) Core(TM)2 CPU 6400  @ 2.13GHz
  • RAM : 2 GB
  • HDD : 250 GB

OS

Ubuntu 가 사용하기 쉽고 평소에 그나마 많이 사용해 보아 Ubuntu를 설치하려고 했으나 

실제 현업에서는 CentOS 를 많이 사용한다고 하여 이번 기회에 CentOS 도 사용해보고자 

현재 최신 버전인 CentOS 6.5 설치 하였다.

그리고 yum update 명령어를 통해 최신 상태로 업데이트를 하였다.

VT 기술 지원 확인

책의 내용에 따르면 하드웨어가 VT 기술을 제공하여야 한다고 한다.

인텔 CPU 는 vmx 가 포함되어있는지 확인하면 된다.


PC가 오래되어 지원하지 않을 줄 알았는데 위와 같이 vmx 를 지원하는 것을 확인하였다.

SSH 설치

원격접속을 통해 쉽게 작업을 할 수 있도록 기본적으로 SSH 설치를 확인하고

실제로 동작하는지 테스트하였다.