외부 네트워크(192.168.25.*)와 내부 네트워크(10.10.*.*)가 분리된 상황에서 내부 네트워크의 머신들이 wget이나 패키지 설치 등의 외부(인터넷) 접속을 통한 작업을 진행할 경우의 routing, ip forwarding 을 설정하는 과정에 대해 정리한다. 이러한 기능의 핵심이 되는 서버는 그림에서 보듯이 NAT router이다(참고: 본 테스트의 수행은 Ubuntu 14.4 LTS, Xen host 상에서, 여러 개의 ubuntu guest vm들을 생성하여 진행하였다).


1. Gateway 서버와 내부 서버의 NIC 설정


* gw1(NAT router, 여기서의 서버 이름은 ubuntu14-pvha1) 서버는 2 개의 네트워크 인터페이스(NIC)을 가진다

 - eth0, ip:192.168.25.201/24, internet gw ip:192.168.25.1(인터넷공유기-라우터의 외부게이트웨이)

 - eth1, ip:10.0.0.1/16


* n개의 내부서버(여기서의 서버 이름은 ubuntu14-pv1~ 4)는 각각 1개씩의 네트워크 인터페이스를 가진다

 - Netmask 는 255.255.0.0 즉 /16 이므로 gw1의 eth1 과 동일 네트워크가 된다

 - eth0, ip:10.0.10.1 ~ 10.0.10.4/16, gateway ip:10.0.0.1


* 그림에 걸맞는 상황을 설정하기 위해 각 서버의 NIC의 ip 주소를 static으로 설정한다. ifconfig 명령을 쓸 수도 있지만, 리부트 후에도 계속 작동하도록 config file을 직접 수정한다(NIC이 여러 개일지라도 gateway 는 1개만 존재해야 함에 유의).

root@ubuntu14-pvha1:~# vi /etc/network/interfaces

# The loopback network interface

auto lo

iface lo inet loopback


# The primary network interface

auto eth0

#iface eth0 inet dhcp

iface eth0 inet static

address 192.168.25.201

netmask 255.255.255.0

network 192.168.25.0

broadcast 192.168.25.255

gateway 192.168.25.1

dns-nameservers 8.8.8.8


# The secondary network interface

auto eth1

iface eth1 inet static

address 10.0.0.1

netmask 255.255.0.0

network 10.0.0.0

broadcast 10.0.255.255


root@ubuntu14-pv4:~# vi /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
address 10.0.10.4
netmask 255.255.0.0
network 10.0.0.0
broadcast 10.0.255.255
gateway 10.0.0.1
dns-nameservers 8.8.8.8

* 각 서버들의 NIC 설정을 마친 후 /etc/init.d/networking restart 또는 reboot 를 한 후 내부 외부에 대한 접속이 가능한지를 ping test 해 본다. 당연히 2개의 NIC을 통해 외부 및 내부와의 접속이 모두 가능하다.

root@ubuntu14-pvha1:~# ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=36.0 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=35.5 ms ...


root@ubuntu14-pvha1:~# ping 10.0.10.4

PING 10.0.10.4 (10.0.10.4) 56(84) bytes of data.

64 bytes from 10.0.10.4: icmp_seq=1 ttl=64 time=0.351 ms

64 bytes from 10.0.10.4: icmp_seq=2 ttl=64 time=0.517 ms ...


* n개의 내부서버 중 4번에서 외부로 ping test 를 수행해 본다. ping 수행이 실패한다. 다음 단계에서 해결해 보자.

root@ubuntu14-pv4:~# ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

^C

--- 8.8.8.8 ping statistics ---

11 packets transmitted, 0 received, 100% packet loss, time 10078ms


2. NAT Router 설정, 그리고 테스트


* NAT router 서버에서 다음과 같은 과정을 거쳐 설정을 진행한다

root@ubuntu14-pvha1:~# modprobe iptable_nat -> iptable_nat 커널모듈의 사용을 가능하게 한다


root@ubuntu14-pvha1:~# vi /etc/sysctl.conf -> 아래 라인을 찾아 comment 를 해제한다

net.ipv4.ip_forward=1


root@ubuntu14-pvha1:~# sysctl -p (또는 리부트, 변경된 Kernel 옵션을 작동시킴)

* echo 1 > /proc/sys/net/ipv4/ip_forward 로 명령어를 통해 설정할 수도 있으나, 리부트시에는 설정이 사라지므로 여기서는 사용하지 않는다.


root@ubuntu14-pvha1:~# cat /proc/sys/net/ipv4/ip_forward ->설정 값이 1인지 확인

1


root@ubuntu14-pvha1:~# vi /etc/rc.local (부팅 후 최종 수행 script, 아래 2개 라인을 추가, 완료시 리부트)

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -A FORWARD -i eth1 -j ACCEPT


* 내부서버에서 외부로 접속이 가능한지 최종 테스트를 해 본다

  (참고: /etc/network/interfaces 에서 gateway 를 잡지 않았다면 route add default gw 10.0.0.1 로 따로 잡아 주어야 한다)

root@ubuntu14-pv4:~# ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=51 time=36.2 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=51 time=36.0 ms

^C

--- 8.8.8.8 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1001ms

rtt min/avg/max/mdev = 36.099/36.172/36.246/0.203 ms


root@ubuntu14-pv4:~# wget www.naver.com

--2015-06-30 17:31:58--  http://www.naver.com/

Resolving www.naver.com (www.naver.com)... 202.179.177.22, 125.209.222.141

Connecting to www.naver.com (www.naver.com)|202.179.177.22|:80... connected.

HTTP request sent, awaiting response... 200 OK

Length: unspecified [text/html]

Saving to: ‘index.html’


    [ <=>                                                                           ] 82,478      --.-K/s   in 0.008s  


2015-06-30 17:31:58 (10.3 MB/s) - ‘index.html’ saved [82478]


[관련 글]

2015/06/28 - [Xen 가상화 2] ubuntu pv guest on Ubuntu 14.4 LTS, Xen 4.4.1 - 설치 및 설정 가이드

2015/07/01 - Haproxy, Keepalived, nginx 를 이용한 고가용성(High Availablity) 웹서비스 환경 구현



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


지난 포스팅에서 windows(hvm) guest 를 Ubuntu 14.4 dom0 에 설치하고 설정하는 과정을 다루어 보았다. 이번에는 동일한 host 환경에 pv(반가상화) guest 를 설치하는 과정을 정리해 보고, 주의할 사항이나 문제 해결 방법 등에 대해 기록하고자 한다.


Host 의 xen 환경에 대해서는 지닌 시간에 충분히 다루었으므로, 이번에는 pv guest 를 설치하고 다루는 중요한 체크포인트들에 대해 집중적으로 기록한다.


지난 포스팅의 HVM guest 설치 과정과 이번 포스팅에서 다룰 pv guest 설치의 차이점들을 짚어 보도록 하자(참고/지난 포스팅: [Xen 가상화 1] Windows 7 hvm guest on Ubuntu 14.4 LTS, Xen 4.4.1 - 설치 및 설정 가이드)


* HVM guest는 Host 의 각종 장치를 에뮬레이션하는 기능(가상화된 장치)를 직접 사용하기 때문에 설치 CD/DVD-rom 이나, 네트워크 설치 등 다양한 방법을 자연스럽게 써서, 설치 과정이 직관적이고 쉬울 뿐 아니라 VNC 를 통해서 그래피컬한 방식으로 진행 가능하다

* PV(paravirt) guest OS는 주로 linux 계열의 OS 들을 사용하며, HVM guesu OS로 사용되는 Windows / Open Solaris / FreeBSD  등은 pv guest 로는 사용이 곤란하다

* PV guest 설치 방법은 크게 두 가지로 나뉜다

 1. config 파일 설정 방식으로, image 파일을 loop device 로 마운트하여 완전 수작업으로 시스템 파일 복사/설치(guest install 과정이 없음)하고 vm을 구동

 2. virt-install 로 text 방식 또는 virt-manager 로 GUI 방식으로 설치(guest install 과정이 있음)

* PV guest 설치시에는 Host 의 ISO 파일이나 CD/DVD-rom 을 사용할 수 없다

virt-manager 에서 새로운 vm 추가시에 "로컬 CDROM/ISO" 를 통한 설치 진행 시 paravirt 는 선택이 불가



위의 마지막 줄의 제약사항은 config 파일 설정 방식이나 virt-install 을 통한 명령어 방식에서도 동일하므로, 지난 포스팅에서와 같이 iso 파일을 마운트해서 PV guest 를 설치해 보려는 시도는 의미가 없음에 주의하자.


1. 어떤 방법을 쓸 것인가? ... GUI로 쉽게 가자


위에서 언급한 config 파일 설정을 통한 완전 수작업 방식은, Host OS 나 guest OS의 종류에 따라 방법이 달라질 뿐 아니라, image 파일 내의 파티션 설정, vmlinuz/initrd 등의 부트로더/OS파일 복사, 패키지의 수작업/선별적 설치(SUSE는 zypper, Ubuntu 는 apt-get...이런 식. 각각의 옵션도 상이함) 등의 복잡한 과정을 밟아야 하므로 다소 난이도가 있는 까다로운 작업이 될 수 있다. 따라서 이번 포스팅에서는 virt-manager 를 통한 쉬운 GUI 방식을 선택해서 진행해 보려 한다.


* 지난 포스팅에서 virt-manager 설치는 이미 해 두었으므로 별도 준비 과정은 없다

* 우선 xen의 config 파일을 수정하고 restart 한다

$ su -

# vi /etc/xen/xend-config.sxp -> 아래 2개 항목을 찾아서 uncomment 하고 내용을 수정한다

(xend-http-server yes)

(xend-port            8000)

service xen restart


* (옵션 사항) visrh 명령으로 storage poo 을 미리 설정해 두면 설치 iso, guest image 저장 위치를 따로 지정할 수 있다

(/home/vmimage는 guest OS의 설치 이미지 파일이 생성될 위치, /home/vmos_images 는 iso 파일이 저장된 위치)

# virsh

virsh # pool-destroy default

virsh # pool-undefine default

virsh # pool-define-as --name default --type dir --target /home/vmimage

virsh # pool-autostart default

virsh # pool-build default

virsh # pool-start default

virsh # pool-destroy local

virsh # pool-undefine local

virsh # pool-define-as --name local-iso --type dir --target /home/vmos_images 

virsh # pool-autostart local-iso

virsh # pool-build local-iso

virsh # pool-start local-iso

virsh # quit


* virt-manager 를 실행하고 VM 생성을 위한 과정을 진행한다

# virt-manager


127.0.0.1(xen) 항목을 더블클릭하여 root 암호를 입력하여 로그인


툴바의 '새 가상머신 생성' 버튼을 클릭하고 머신 이름 지정 후 '네트워크 설치'를 선택하고 '앞으로' 클릭


URL 입력 부분에 네트워크 설치 URL을 입력하고 OS종류, 버전을 선택하고 '앞으로'


* Ubuntu 14.4(trusty) 를 위한 네트워크설치 URL은 다음 3개 중 하나를 선택하여 입력

http://kr.archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/

http://us.archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/

http://mirrors.kernel.org/ubuntu/dists/trusty/main/installer-amd64/


디스크 이미지의 크기를 기가바이트 단위로 지정하고 '앞으로'


'추가옵션' 클릭, Virt 종류는 xen(paravirt) 로 선택


항목별 변경 사항이 있으면 각각 수정한 후 '적용', 상단의 '설치시작' 을 선택하면 다음 단계로 진행


프로그레스 바가 있는 작은 팝업창이 뜬 후, 약간의 시간이 지나면 가상머신관리자 창에 새로운 vm 이 나타난다. 이 때 접속이 되지 않는 시커먼 그래픽 콘솔 창이 같이 뜨는데, 당황하지 않고 창을 닫아 버리자(paravirt guest이므로 지금은 그래픽 화면을 볼 수 없고, base system 설치가 완료된 이후에는 가상콘솔 화면으로 접속할 수 있다).


다다

virt-manager 구동 후 시간이 지났을 경우 root 로그인 창이 뜨기도 한다



* xl list 를 해 보면 방금 생성한 vm 이 기동되고 정상 작동중인 것을 확인 수 있다

* 이제부터는 터미널을 열어서 텍스트 방식으로 진행한다. console 로 접속하면 셋업 단계의 화면을 접하게 된다

# xl li

Name                                        ID   Mem VCPUs State Time(s)

Domain-0                                     0 10714     4     r-----    4124.2

ubuntu14-pv3                                 3  1024     1     -b----       2.2

# xl console 3


엔터를 입력하여 다음 단계로...


other>Asia> ... 국가를 선택하고 엔터


default locale 선택하고 엔터


hostname 입력하고 엔터



* 이후부터는 일반적인 ubuntu OS 설치 과정과 거의 유사하므로 중간 과정 생략


모든 설치 과정이 완료되면 vm은 자동으로 reboot 된다


virt-manager 의 툴바에서 '가상머신 콘솔' 버튼을 클릭하면 새로운 vm에 접속할 수 있다. xl console 을 통해 text 방식으로도 접속 가능(새로이 만들어진 vm의 ip는 192.168.25.29 로 자동 할당 되어 있다)


Host 의 터미널에서 vm 쪽으로 ping test 를 수행해 본다. 네트워크가 정상 작동 됨을 볼 수 있다.


2. vm 복제(vm cloning)


* 새로운 vm이 설치되고 정상 작동하는 데에 수 십분 또는 그 이상의 시간이 소요되는데, 기존의 관리 대상인 vm을 복제해서 사용하면 몇 초만에 새로운 vm을 생성하여 사용할 수 있다.


복제할 대상이 되는 vm을 종료한 후, virt-manager에서 우클릭, 복제를 수행하면 된다


복제 될 vm의 이름을 지정하면 저장소도 해당 이름으로 자동 복제된다


스토리지의 크기에 따라 수 초~수 분 내로 새로운 vm이 만들어 진다


새롭게 복제된 vm이 나타났다. 이후의 테스트 과정은 생략한다.


* 참고: (설정 파일 위치 관련)

 - virt-manager, virt-install 같은 tool이 관리하는 기본 설정 파일은 /etc/libvirt 내에 위치한다

 - 사용자 고유의 virt-manager에 대한 각종 vm 관련 설정 사항은 $USER/.gconf/apps/virt-manager 내에 위치한다(본 예시에서는 /root/.gconf/apps/virt-manager 가 될 것이다)



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


티스토리와 같은 블로그시스템에서 에디터로 글을 작성하다 보면 약간의 장식을 하고 싶은 생각이 들 때가 있다. 굳이 외양을 중시하는 예쁜 블로그를 꾸미는 경우가 아니더라도 말이다. 특히 프로그래밍, 엔지니어링 방법에 대해 본인 스스로 잊지 않기 위해 개인 블로그에 메모를 남기는 습관을 가진 필자의 경우는,


$ sudo apt-get install build-essential git cmake libqt4-dev libphonon-dev python2.7-dev libxml2-dev libxslt1-dev qtmobility-dev


와 같은 옆으로 길게 타이핑하는 경우를 표현하는 일이 많은데, 이 때 한 줄에 늘어서 타이핑하는 개념으로 보이려면


$ sudo apt-get install build-essential git cmake libqt4-dev libphonon-dev python2.7-dev libxml2-dev libxslt1-dev qtmobility-dev


와 같이 좌우 스크롤이 생기고 글씨는 오른 쪽에 숨는 모양으로 표현하고 싶을 때가 생긴다. 티스토리에서 제공하는 글상자는 기본적으로 스크롤이 따로 생성되지 않으며, 텍스트가 넘칠 경우 다음 라인으로 넘어 가도록(Wrap) 되어 있다. 이런 경우는 html 편집을 통해 원하는 결과를 내어 볼 수 있다.


웹 표현 언어인 HTML 에 대해 깊은 지식이 없더라도 본 글에서 설명하는 대로 따라하면 간단히 이를 구현해 볼 수 있다. 자, 그 과정은 다음과 같다. 참 간단하지 않은가?


Tistory 블로그에디터에서 글을 작성. 글상자를 만든다.


우선 글상자(textbox) 로 만들 부분을 마우스 드래그로 선택 후에 에디터 상단 '글상자' 버튼으로 박스 테두리를 만드는 부분까지는 익히 해 오던 방법이다. 아래와 같이 글상자를 만들자(여기서는 편의상 좌우를 200px로 고정했다).


한잔의 술을 마시고 

우리는 버어지니아 울프의 생애와 

목마를 타고 떠난 숙녀의 옷자락을 이야기 한다 



티스토리에디터 에디터타입의 HTML 을 클릭"<div ... style=" 부분 속성을 추가



본 글에서는 "한잔의 술을 마시고" 텍스트가 있는 부분에서 왼쪽 방향으로 찾아 보면 <div class="txc-textbox" style="border: 1px solid rgb(... 부분이 보일 것이다. 이 부분의 style=" 뒤에 overflow:auto; white-space:nowrap; 라고 적어 넣어 주고 저장하자. 즉 <div class="txc-textbox" style="overflow:auto; white-space:nowrapborder: 1px ... 처럼 파란 글씨 부분을 적어 넣어 주면 된다. 결과는 다음과 같이 보일 것이다.


한잔의 술을 마시고 

우리는 버어지니아 울프의 생애와 

목마를 타고 떠난 숙녀의 옷자락을 이야기 한다



참고: overflow 의 다른 값 또는 그의 변형


<div> 영역의 지정된 부분을 벗어나는 경우에 지정할 수 있는 overflow 속성의 다른 값 또는 변형들은 아래와 같다.


overflow: auto;

overflow: scroll;

overflow-x: scroll;

overflow-y: scroll;

overflow: hidden;

overflow: visible;

영역을 벗어나면 자동으로 스크롤이 생김. 그 이전에는 스크롤 없음

영역을 벗어나면 화면 스크롤이 해당 방향으로 활성화. 항시 스크롤은 보이며 비활성화

영역을 벗어나면 좌우로만 스크롤이 활성화

영역을 벗어나면 상하로만 스크롤이 활성화

영역을 벗어나면 그 부분은 화면에서 보이지 않음. 스크롤은 없음

영역을 벗어나도 화면에서 보임.  스크롤은 없음


보다 다양한 설명과 예시는 html.am 사이트에서 살펴볼 수 있으니, 한 번 방문해 보자.


- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


Python을 활용한 GUI 프로그래밍에 꼭 한 번씩 거론되는 것이 있다. 오픈소스 프로젝트로서, Python을 위한 C++바인딩인 PySide 프로젝트가 그것이다. 참고로, 기존의 PyQt4에는 API Level 1과 API level 2 가 각각 존재하고 있으며, 그에 비해 PySide는 PyQt API level 2 만을 고려하여 구현되어 있다(PySide 쪽이 LGPL[각주:1]이 적용되어 PyQt 보다 저작권 면에서 더 자유롭다...정도만 얘기하고, Qt의 역사나 핀란드의 노키아, 디지아 등 잡다한 궁금한 점들은 구글링으로 해결하자).


서두가 너무 길었다. 간단히 글 게재의 목적만 말하자면, PySide 1.2.1 버전은 대다수 리눅스 배포판 등의 소프트웨어 다운&설치 명령들(yum, zypper, apt-get 또는 pip)로 간단히 설치, 사용이 가능하다. 하지만 2015년 6월 현재 최신 1.2.2 버전(2014년 4월 릴리즈. 1.2.1은 2013년 8월 릴리즈)은, 공식페이지(pyside.readthedocs.org)에서도 "Linux 바이너리는 제공하지 않음" 이라고 발표하고 있는 실정이다.


뵨 글에서는 Windows 와 Linux 에서의  Python 2.7.x 를 위한 PySide 1.2.2 설치 방법에 대해 정리해 두도록 한다.


Windows 7에 PySide 1.2.2 설치 과정 & 주의사항


Windows에서는 특별히 어려운 점은 없다. Python 2.7.x 이 기존에 설치되어 있다고 가정하고, PyQt 4.10.3 for python 2.7 을 설치하면 된다(참고로, 각종 windows 용 python extensions 들은 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 로 가면 거의 찾을 수 있으며, python 버전에 맞는 바이너리를 다운로드 받아 자유롭게 사용 가능하다).


get-pip.py 다운로드c:\python2\scripts 에 저장하고 pip 설치. pip로 PySide 를 설치하면 간단히 끝.

C:\> mkdir c:\python2\scripts

C:\> CD c:\python2\scripts

C:\> python get-pip.py

C:\> ./pip install -U PySide


Linux에 PySide 1.2.2 설치하는 방법


구글링 해 보면 다양한 방법들이 존재하고 있다. 어떤 리눅스 배포판에서는 자체 공식 repo 를 통해서도 간단히 설치할 수도 있겠고, Python 관련 사이트에서 설치 바이너리(deb, rpm 등) 다운로드 받아 설치할 수도 있겠다. 여기서는 소스 다운로드 & 빌드를 통해 설치하는 방법만을 다룰텐데, 대다수의 내용은 가장 정평한 pyside.readthedocs.org 에 있는 내용을 거의 그대로 참조하였다.


* Source Build 를 위한 준비 과정

$ sudo apt-get install build-essential git cmake libqt4-dev libphonon-dev python2.7-dev libxml2-dev libxslt1-dev qtmobility-dev


* Python 2.7 용 pip 를 다운로드 & 설치. Build를 위한 wheel 설치

$ mkdir ~/PySideBuild; cd ~/PySideBuild;

$ wget https://bootstrap.pypa.io/get-pip.py

$ sudo python2.7 get-pip.py

$ sudo pip2.7 install wheel


* PySide 1.2.2 다운로드 & Build

$ wget https://pypi.python.org/packages/source/P/PySide/PySide-1.2.2.tar.gz

$ tar -xvzf PySide-1.2.2.tar.gz

$ cd PySide-1.2.2

$ python2.7 setup.py bdist_wheel --qmake=/usr/bin/qmake-qt4


* Build 된 배포 바이너리 설치 & 확인

$ ls -l dist

합계 12616

-rw-rw-r-- 1 bryan bryan 12916258  6월 13 18:00 PySide-1.2.2-cp27-none-linux_x86_64.whl

$ sudo pip2.7 install dist/PySide-1.2.2-cp27-none-linux-x86_64.whl



설치 완료된 PySide 정상 작동 확인


$ python

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 

[GCC 4.8.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import PySide

>>> PySide.__version__

'1.2.2'

>>>



- Barracuda -



  1. GPL과는 달리, LGPL은 소스를 공개하지 않고도 상용프로그램을 만들 수 있다. [본문으로]
저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


OpenSUSE 13.2 에서 python 개발환경을 구성할 경우에 거쳐가야 할 몇 가지 단계들이 있다. 아마도 대다수 OpenJDK를 채택한 Linux들에도 해당될 듯 한데, Pycharm이 Linux를 위한 구현을 java 로 하였기 때문에 발생하는 일종의 패키지 충돌 문제를 만나게 된다.


다시 말하면, Opensource 진영에서 채택한 OpenJDK는 OpenSUSE 뿐 아니라 Ubuntu 등 대다수 Open Linux 배포판들이 java 플랫폼을 위해 기본으로 포함하고 있다. 그러나 Linux용 Pycharm은 Oracle-Sun jdk/jre 기반으로 만들어져 있으며, 이 문제는 update-alternatives 라는 유틸리티로 극복할 수 있다. 이를 잘 활용하면, 서로 다른 버전의 gcc가 각각 특정 라이브러리에 국한되어 컴파일 되어야 하는 상황에 대한 훌륭한 솔루션이 되기도 한다.


본 포스팅에서 다루어 나가려 하는 단계는 간단히 다음과 같다. 아래에 다루는 내용은 OpenSUSE 뿐 아니라 대다수 linux 배포판에서 적용 가능하며, 마지막 부분의 pycharm 설치 과정은 pycharm 새버전을 설치 또는 업그레이드하는 과정으로 유용하게 참조될 수 있다(pycharm 5.0.1 에서도 적용 가능 확인. 2015/12/7).


* Oracle jdk 를 다운로드하고 설치

* update-alternatives 설정으로 문제 해결

* pycharm 설치


Oracle jdk 8을 다운로드하고 설치


* Oracle jdk 8(rpm) 를 다운로드 한다(☞가기)(참고로 Oracle은 JDK 7에 대해서는 더 이상 지원을 하지 않겠다고 밝힌 바 있다. 2015년 현재 다운로드가능한 버전은 8u45 이다).

* 주의: ubuntu 15.* 부터는 rpm 으로 설치가 되지 않으니 여기 를 참조하여 ppa repository 를 등록하여 설치하여야 한다

$ su -

# java -version -> 현재 설치 된 jdk가 Openjdk인지 확인

# rpm -i --nodeps jdk-8u45-linux-x64.rpm -> nodeps 옵션이 없으면 기존 OpenJDK 와의 의존성 문제로 설치가 실패됨에 유의

Unpacking JAR files...
    rt.jar...
    jsse.jar...
    charsets.jar...
    tools.jar...
    localedata.jar...
    jfxrt.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...



update-alternatives 설정으로 충돌 문제 해결


* JDK 패키지 내에 포함 된 실행파일 들(java, javadoc, jar, javap, javac, javaws, javah, jarsigner)에 대해 동일한 우선순위(1551) 를 지정하여 update-alternatives 를 수행한다.

# update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_45/bin/java 1551

# update-alternatives --install /usr/bin/javadoc javadoc /usr/java/jdk1.8.0_45/bin/javadoc 1551

# update-alternatives --install /usr/bin/jar jar /usr/java/jdk1.8.0_45/bin/jar 1551

# update-alternatives --install /usr/bin/javap javap /usr/java/jdk1.8.0_45/bin/javap 1551

# update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.8.0_45/bin/javac 1551

# update-alternatives --install /usr/bin/javaws javaws /usr/java/jdk1.8.0_45/bin/javaws 1551

# update-alternatives --install /usr/bin/javah javah /usr/java/jdk1.8.0_45/bin/javah 1551

# update-alternatives --install /usr/bin/jarsigner jarsigner /usr/java/jdk1.8.0_45/bin/jarsigner 1551


* display option으로 java 실행파일에 현재 설정된 alternatives 가 확인 가능하며, config option으로 디폴트 버전을 스위칭할 수도 있다.

# update-alternatives --display java

java - auto mode
  link currently points to /usr/java/jdk1.8.0_45/bin/java
/usr/java/jdk1.8.0_45/bin/java - priority 1551
/usr/lib64/jvm/jre-1.5.0-gcj/bin/java - priority 1500
  slave jre: /usr/lib64/jvm/jre-1.5.0-gcj
  slave jre_exports: /usr/lib64/jvm-exports/jre-1.5.0-gcj
  slave rmiregistry: /usr/lib64/jvm/jre-1.5.0-gcj/bin/rmiregistry
Current 'best' version is '/usr/java/jdk1.8.0_45/bin/java'.


# update-alternatives --config java

There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                   Priority   Status
------------------------------------------------------------
* 0            /usr/java/jdk1.8.0_45/bin/java          1551      auto mode
  1            /usr/java/jdk1.8.0_45/bin/java          1551      manual mode
  2            /usr/lib64/jvm/jre-1.5.0-gcj/bin/java   1500      manual mode


* root 아닌 일반 유저(python 개발 계정)으로 전환하여, java 환경 변수를 설정해 둔다

$ cd

$ vi .bashrc -> 아래 라인을 스크립트 상단에 추가

export JAVA_HOME=/usr/java/jdk1.8.0_45

$ source .bashrc

$ java -version

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)


Pycharm 4.5.1 community edition 설치 및 설정


* pycharm 4.5.1 패키지 파일을 다운로드(☞가기)하고 설치한다. 작업의 편의를 위해, 반드시 일반 유저(개발자 계정)으로 진행함에 유의하자.

$ tar xvzf pycharm-community-4.5.1.tar.gz -C /tmp/

$ sudo su -c "chown -R root:root /tmp/pycharm*"

sudo rm -rf /opt/pycharm-community/  ==> 업그레이드일 경우

$ sudo rm /usr/local/bin/pycharm /usr/local/bin/inspect ==> 업그레이드일 경우

$ sudo mv /tmp/pycharm-community* /opt/pycharm-community

$ sudo su -c "ln -s /opt/pycharm-community/bin/pycharm.sh /usr/local/bin/pycharm"

$ sudo su -c "ln -s /opt/pycharm-community/bin/inspect.sh /usr/local/bin/inspect"


$ pycharm &




- Barracuda -



저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


2015년 현재, Opensource Xen이나 Citrix XenServer+XenCenter, VMWare ESX+vSphere, Oracle VM Server 등의 많은 가상화 Solution들이 있다. 본 편에서는 현존 대다수 가상화 솔루션들의 근간이 되는, Opensource Xen을 활용한 가상화 실습 시에 가장 필수적으로 밟아 나가는 단계를 정리해 두려 한다. 염두에 두고 있는 것은 Ubuntu와 OpenSuse 를 각각 Host로 하고 Windows 7 과 CentOS Server 를 각각 Guest 로 하는 조합으로 대략 3~4가지의 시리즈를 써 나가는 것이다.


본 편에서는 그 첫 번째 Case로, Ubuntu 14.4 LTS 를 Host(Dom0)로 한 Xen 환경에서 Windows 7  VM을 사용하기 위한 방법과 과정을 정리해 나가고자 한다. 단, 가상화 솔루션이 "어떻게 작동하는지"의 이해에 도움이 되도록, 각 과정을 수동으로 직접 다루며, 최대한 GUI 관리 툴 등은 사용하지 않는 것이 본 포스팅들의 특별한 의도도 생각하면 되겠다.


전체적인 과정을 간단히 나열하면 다음과 같다.


* Ubuntu 14.4 LTS Desktop 설치 - Host OS 준비

* Host 를 Xen Dom0 로 사용할 수 있도록 하는 필수 과정들

* VM에 Guest OS(Windows 7) 을 설치하고 사용, 운영하는 방법과 과정



이제 각 단계 별로 실제 작업을 차근차근 수행해 보자.


1. Ubuntu 14.4 LTS 설치 - Host OS 준비


* 준비물: Ubuntu 14.4 LTS Desktop, 64 bit의 iso 파일을 내려 받아 구운 DVD-ROM(http://www.ubuntu.com/download/desktop 참조)


Windows계열이든 Linux 계열이든 OS를 설치하는 과정은 크게 다르지 않다. 설치 화면을 "잘 보고 따라 가면" 된다! 만약 주의 사항이 있다면 따로 Post-it 같은 메모지를 써서 기록해 두는 방법을 애용하자. 아마도 내 말이 피가 되고 살이 됨을 나중에 느끼게 될 지도 모를 일이다.


* OS 설치시 가상화 등의 추가 옵션은 따로 지정하지 않고,  Default 옵션만으로 진행한다.

* 본 글에서는 vm을 설치할 볼륨이 스파스(sparse) 파일이 될 것이므로, Host OS에 마운트 되는 볼륨의 경우 /(root) 볼륨은 20~100 GB 가량, /home 볼륨은 200GB~400GB 이상 여유 있게 잡는다. vm OS 가 설치된 볼륨 파일들을 /home 내에 하위 디렉토리를 만들고 체계적으로 관리하기 위함이다.

* 한글/영문 입력이 가능하도록 설정하고, 인터넷 접속이 가능하도록 네트워크 설정까지 완료한다.

* 추후에 linux guest vm으로 양방향 ssh 접속/운영이 가능하도록 다음과 같이 설정해 둔다

$ su -

# apt-get install ssh

# vi /etc/ssh/sshd_config -> 아래 항목을 찾아서 yes 로 변경한다.

  PermitRootLogin yes

# service ssh restart



2.Host 를 Xen Dom0 로 사용할 수 있도록 하는 필수 과정들


* 이번 단계에서는 Xen 관련 패키지 설치, VM 네트워킹을 위한 bridge 설정, 부팅 시 Xen kernel 이 로딩되도록 grub 설정 등의 작업을 수행한다.

* 과정을 단순하게 하기 위해 모든 패키지는 바이너리 형태로 설치된다. 즉 source 를 다운로드하여 빌드하는 방식으로 설정하는 경우에 꼭 써야 하는 apt-get build-dep, .configure, make && make install 등의 명령이나 스크립트의 실행 등은 사용하지 않아도 된다.


# apt-get install xen-hypervisor-4.4-amd64 xen-utils-4.4

# apt-get install qemu-kvm libvirt-bin libvirt-dev virt-manager virtinst vncviewer

# adduser $USER libvirtd


* Xen networking 에서 가장 중요한 부분. 여기서는 첫 번째 NIC(eth0)를 Xen 에서 사용할 bridge로 설정한다.

# vi /etc/network/interfaces -> 구조에 맞게 적당히 수정(dhcp 를 사용하지 않는 경우는 dhcp 대신 static 으로)

  iface eth0 inet manual
  auto xenbr0
  iface xenbr0 inet dhcp
      bridge_ports eth0

  ...


# vi /etc/xen/xend-config.sxp -> uncomment 처리

  (network-script network-bridge)

# vi /etc/default/xen -> xl 로 되어 있는지 확인(기본 툴스택이 xm 에서 보다 향상된 최근 xl 로 업그레이드 되어 있음)

  TOOLSTACK=xl


# vi /etc/default/grub

  GRUB_CMDLINE_LINUX=""  # dom0_mem=512 dom0_max_vcpus=1 dom0_vcpus_pin 와 같이 튜닝 가능

  GRUB_CMDLINE_LINUX_DEFAULT=""


# cd /etc/grub.d

# mv 10_linux 21_linux -> 부팅 순서에 20_linux_xen 이 먼저 배치되도록 변경

# sync

# reboot


* Host 의 네트웍이 정상 작동 하는지, 브리지 설정이 제대로 되어 있는지 점검한다.

# ping google.com

# brctl show

  bridge name    bridge id                    STP enabled    interfaces
  virbr0          8000.000000000000         yes       
  xenbr0        8000.d0505602a73d         no                   eth0


* 아래의 xl 실행 결과를 볼 수 있다면, 설정된 Xen 가상화 환경이 잘 작동하는 것으로 보고 다음 단계 수행

# xl info
host                   : Ubuntu-desktop
release                : 3.16.0-38-generic
version                : #52~14.04.1-Ubuntu SMP Fri May 8 09:43:57 UTC 2015
machine                : x86_64
nr_cpus                : 4
max_cpu_id             : 3
nr_nodes               : 1
cores_per_socket       : 4
threads_per_core       : 1
cpu_mhz                : 3399
hw_caps                : bfebfbff:2c100800:00000000:00007f00:77fafbff:00000000:00000021:00002fbb
virt_caps              : hvm hvm_directio
total_memory           : 12207
free_memory            : 8559
sharing_freed_memory   : 0
sharing_used_memory    : 0
outstanding_claims     : 0
free_cpus              : 0
xen_major              : 4
xen_minor              : 4
xen_extra              : .1
xen_version            : 4.4.1
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          :
xen_commandline        : placeholder
cc_compiler            : gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
cc_compile_by          : stefan.bader
cc_compile_domain      : canonical.com
cc_compile_date        : Wed May 20 12:19:20 UTC 2015
xend_config_format     : 4



3.VM에 Guest OS(Windows 7) 을 설치하고 사용, 운영하는 방법과 과정



* 준비물: Windows 7 이 설치 가능한 CD 또는 DVD의 iso 파일, /root/vmos_images/win7.iso 로 복사해 둔다.


* 이번 단계에서는 VM을 설치하기 위한 가상 볼륨(Sparse 파일)을 준비하고, 실제로 guest os인 Windows 7을 설치, Xen을 통해 구동하고 사용하는 방법을 기술한다.


# mkdir -p /home/vmimage/win7

# cd /home/vmimage/win7

# dd if=/dev/zero of=./win7.img bs=4k count=1 seek=8M -> 30GB 가량의 빈 파일 생성


* Windows 계열 OS 는 일반적으로 전가상화(Full virtualization, HVM) 방식을 쓴다

# vi win7.cfg

# WINDOWS 7 CONFIGURATIONS for Xen
#  - Installation: Ubuntu 14.4 LTS, Xen 4.4.1 guest

builder = 'hvm'
vcpus = 2
memory = 4096

#Disks
disk = [
    'file:/home/vmimage/win7/win7.img,ioemu:hda,w',
    'file:/root/vmos_images/win7.iso,ioemu:hdc:cdrom,r'
]

#Hostname
name = 'windows7-1'

# Networking
vif = ['type=ioemu,mac=00:16:3E:*:*:*,bridge=xenbr0']

# Behavior
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'

on_xend_stop='shutdown'

# VNC
vnc=1           # Enable VNC
vncconsole=0  # Don’t start vncviewer after “create” the domain
vncunused=0   # Don’t automatically assign unused port based on domain id
vncdisplay=2    # VNC Port Number to be added to “5900”. e.g.:  vncdisplay=2  : port=5902
                               # So, invoke "vncviewer 127.0.0.1::5902 &" after "create" domU

# Boot: d(cdrom) - to install Windows into the image file or target volume
# After installation, change it as 'c' or 'cd'
boot='d'
#boot='cd'


# Mouse cursor sync in vncviewer

usb=1

usbdevice='tablet'


# Set video ram for HiRes

stdvga=1

videoram=16


* Xen에 의해 vm이 생성되고, 설정 파일(win7.cfg) 에서 지정된 가상볼륨 파일(win7.img)에 windows 7 이 설치되는 과정

# xl create win7.cfg

Parsing config from win7.cfg


# vncviewer 127.0.0.1::5902 &




# xl list

Name                   ID    Mem  VCPUs    State       Time(s)
Domain-0                0   3482      4         r-----     4430.5
windows7-1              14  4096     4         -b----       71.1



- Barracuda -

저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들