반응형
SMALL

 

 

 

 

반응형
LIST
반응형
SMALL

 초등학생인 아들이 오늘 소풍이란다.

아침부터 잠도 안 깬 상태에서 롤을 말았다.

아들꺼와 선생님꺼 그리고 친구 엄마들과 같이 먹을 거란다.

롤을 제외한 나머지 음식들은 마눌님께서 만드셨다 

 

 

 

 

 

 

 

 

 

반응형
LIST

'지금 이 순간' 카테고리의 다른 글

일산 호수 공원  (0) 2013.06.11
카트 & 헤이리 마을  (0) 2012.10.23
석교리 영광정  (0) 2012.10.05
서울역사박물관, 광화문 물놀이  (0) 2012.07.09
오래된 기와장 페이트 작업  (1) 2012.05.14
반응형
SMALL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
LIST
반응형
SMALL

WEBFRONT SSH PORT 변경

AV2 서버 ssh 포트 변경
1) #cd /etc/ssh
2) #cp sshd_config sshd_config_2012****
변경할 sshd_cinfig 파일을 오늘날짜로 백업한다.
3) #vi sshd_conf
vi 편집기로 연다.
/Port
vi 에서 Port를 검색해서 찾는다.
#Port 22 의 #(주석)을 지우고 22번 포트를 변경한다.
Port *** /*변경할 포트번호*/
/wq /*vi 편집기를 저장하고 나온다 */
변경한 이후에는 서비스를 리스타트 해준다.
서비스 재시작
#service sshd restart
#netstat  -an  으로 오픈된 서비스 port 확인

WAF ssh 포트 변경
<<LE 장비일 경우>>
1. start-shell 접속
2. vi /usr/local/etc/sshd_config
3. Port 22 라고 적힌 부분에서 원하는 접속포트로 수정
4. 저장하고 나오기
5. killall sshd
6. /usr/local/sbin/sshd
7 netstat -lnt 로 LISTEN 포트 확인
8. vi /etc/cfgfiles
9. 제일 밑부분에 다음 내용 추가
   /usr/local/etc/sshd_config
10. :wq! 저장
11. write memory 로 설정저장하기

 

반응형
LIST
반응형
SMALL

젠서버 레퍼런스 사이트

 

하드웨어 체크
http://hcl.xensource.com/

 

클라우드 스택
http://sparkstar-code.blogspot.com/2012/03/citrix-xenserver-cloudstack.html

 

로컬 및 원격스토리지 구성방법
http://blog.blueweb.co.kr/143

 

백업 기능과 복구 시나리오
http://blog.blueweb.co.kr/144?category=17

 

 

반응형
LIST
반응형
SMALL

Linux Cluster Overview

[ 목 차 ]

1. 클러스터

2. 클러스터의 필요성

3. 클러스터의 종류

   3-1. 고계산용 클러스터 (HPC)

   3-2. 부하분산 클러스터 (LVS)

   3-3. 고가용성 클러스터 (HA)

   3-4. 그외의 클러스터 분류

4. 클러스터의 단점

 

1. 클러스터

 컴퓨팅 파워를 증가시키기 위한 다양한 방법이 있다. 그중 고성능 단일 컴퓨터를 이용한 계산은 이미 그 한계가 있음이 증명된 상태이며 이의 대안으로 다수의 프로세서(CPU)가 하나의 문제를 협동적으로 계산하는 병렬컴퓨팅이 등장하게 되었다. 다수의 프로세서가 하나의 메모리를 공유하는 SMP(symmetric multiprocessing) 머신, 다수의 프로세서가 각각 독립된 메모리를 가지고 있는 MPP(massively parallel processing) 머신, 다수의 프로세서의 지역 메모리를 계층적으로 공유하는 NUMA(non-uniform memory access) 등이 여기에 속한다. 그러나 기존 몇몇 벤더에 의해 제공되던 병렬컴퓨터 혹은 슈퍼컴퓨터들은 매우 고가이기 때문에 쉽게 접할수가 없었다.

한편 최근 마이크로프로세서들은 뛰어난 성능을 보여주고 있으며 고속네트워크 또한 널리 보급되었다. 이로 인해 단일 컴퓨터들을 네트워크로 연결함으로써 새로운 개념의 병렬컴퓨터를 만드는 것이 가능하게 되었다. 또한 리눅스라는 공개된 OS는 강력한 네트워크 성능을 제공하며 소스공개로 인한 자유로운 튜닝이 가능하기 때문에 이들을 위한 OS로 널리 사용되고 있다.
이러한 개념의 병렬컴퓨터를 통칭하여 '클러스터'라고 부른다.


2. 클러스터의 필요성

 많은 수치모델들은 좀 더 고품질의 결과를 얻기 위해서 또는 빠른 결과를 얻기 위해서 대규모 계산을 수행해야 하거나 대규모 데이타를 처리해야 한다. 이를 위해 주로 워크스테이션이 활용되고 있으나 단일 워크스테이션으로는 충분한 성능을 제공받지 못하거나 잠재적으로 성능 부족을 느끼게 된다. 병렬 컴퓨터는 이의 해결방안으로 좋은 선택이 될수 있으며 특히 클러스터는 아래와 같은 주목할만한 장점을 갖는다.

 첫째는 워크스테이션에 비해 월등한 컴퓨팅 파워를 제공할수 있으며 대규모 데이타 처리가 가능하다. 둘째는 범용하드웨어를 사용함으로 인해 상용 병렬컴퓨터에 비해 가격대 성능비가 매우 뛰어나다. 세째는 노드의 증설에 따라 성능향상이 자유로우며 퇴출된 컴퓨터들을 이용하여 고성능 병렬컴퓨터를 제작할수 있다. 네째는 자체 제작이 가능하다. 따라서 문제발생시 자체 해결이 용이하다.


3. 클러스터의 종류

 클러스터의 분류를 정의하는 것은 매우 다양하다. 일반적으로 많이 사용되는 분류법은 클러스터의 그 활용 목적에 따라 분류하는 것이며 이에 따르면 아래의 3가지로 나눌 수 있다.

•고계산용 클러스터 (HPC)
•부하분산 클러스터 (LVS)
•고가용성 클러스터 (HA)
3-1. 고계산용 클러스터 (HPC)

 HPC 클러스터는 고성능의 계산능력을 제공하기 위한 목적으로 제작된다. 주로 과학계산용으로 활용가치가 높으며 삼성종합기술원에서 개발한 Alpha-11 역시 HPC클러스터이다.


 HPC 클러스터를 구성하는 모든 컴퓨터들은 네트워크에 연결되어 있어서 상호간에 통신이 가능하므로 다수의 프로세서가 협동적으로 문제를 풀 수 있는 환경을 제공하게 된다. 그러나 이 기반을 이용하여 문제를 병렬로 푸는 것은 전적으로 프로그램 수준에서 이루어 진다. 따라서 클러스터 구축뿐만 아니라 프로그램 병렬화가 같이 고려되어야 한다.


3-2. 부하분산 클러스터 (LVS)

 대규모 서비스를 제공하기 위한 목적으로 제작되며 주로 웹서비스등에 활용가치가 높다.

 이러한 방식은 인터넷 사용자로 하여금 하나의 컴퓨터 즉 로드밸런서로부터 서비스를 제공받는 것으로 여겨지게 한다. 그러나 실제 서비스 제공은 로드밸런서에 연결되어 있는 서비스 노드들에 의해서 이루어진다. LVS 클러스터 역시 일반적으로 모든 컴퓨터간에 연결되어져서 구성된다. 그러나 이것은 필수적인 조건은 아니다.
만약 정적인 데이타만을 서비스하는 웹클러스터라면 각 서버들은 Load Balancer 와의 통신만 가능해도 된다. 또는 그 중간적인 형태역시 가능하다. 즉 클러스터의 위상(topology)에 있어서는 다양한 형태로의 변형이 가능하다.

 LVS 클러스터의 웹요청 처리과정을 살펴보면 다음과 같다.

1.로드밸런서에게 인터넷으로부터 웹요청이 들어온다.
2.로드밸런서는 정해진 알고리즘에 따라 서비스를 수행할 server를 선택하고 웹요청을 forwarding 한다.
3.forwarding된 웹요청은 선택된 server에 전달된다.
4.웹요청을 받은 서버는 이에 대한 응답을 로드밸런서에게 제공한다.
5.로드밸런서는 제공받은 데이타를 웹요청을 한 컴퓨터로 재 전송해준다.
 부하분산용 클러스터중에서도 이러한 방식을 NAT(Network Address Transaction)라고한다.

 이 방식의 장점은 server가 어떤 OS이든지 상관이 없다는 것이다.

 그리고 IP Tunneling 방식은 웹요청이 들어오면 요청패킷을 캡슐화해서 클러스터내의 노드들에게 전송해준다. 이것은 응답이 로드밸런서를 거쳐서 나가지 않으므로 하나의 로드밸런서가 매우 많은 server들을 거느릴수가 있다. 그러나 클러스터내의 server들이 캡슐화된 패킷을 해석할수 있어야 하므로 현재는 리눅스에서만 가능하다.

 마지막으로 DR(Direct Routing)방식은 클러스터의 확장성을 높이기 위해 IP NAT 방식과 IP Tunneling방식의 장점만을 가져온 방식이다. 즉 서비스요청이 들어오면 패킷을 최소한으로 빨리 가공하여 리얼서버에게 보내면 리얼서버는 다른 루트를 통하여 응답을 보내는 것이다.
라우터가 요청패킷에 MAC 어드레스를 추가하여 유일한 리얼서버를 결정할수 있게 해준다.

 이것을 위해서는 모든 노드들이 단일 segment에 존재해야한다.

 부하분산 클러스터에 더 많은 관심이 있다면 http://linuxvirtualserver.org/ 를 참고하라.


3-3. 고가용성 클러스터 (HA)

 지속적인 서비스 제공을 목적으로 제작되며 주로 미션 크리티컬한 업무에 사용된다.
위에서 설명한 LVS클러스터를 고려해 보자. 만약 로드밸런서가 고장났다면 클러스터 전체는 무용지물이 될 것이다. 또한 서버들중 server2가 고장났다고 가정해보자. 일부 사용자는 원하는 데이타를 제공받지 못할 것이다. 이러한 문제를 극복하기 위한 목적으로 구성하는 것을 고가용성 클러스터라고 한다.
로드밸런서의 고장에 대처하기 위해 현재 사용되는 방법은 heart beat 와 fake 를 이용하는 방법이다. heart beat는 로드밸런서와 하나의 백업서버간에 주기적으로 통신을 하며 이상유무를 체크하게 된다. 로드밸런서의 고장이 인식되면 fake 라는 프로그램은 로드밸런서가 점유하고 있는 IP를 백업서버로 이주시켜서 계속 서비스를 수행시켜준다. 한편 server2의 고장은 로드밸런서에 의해서 주기적으로 감시되고 고장발생시 웹요청을 server2로 포워딩 하지 않음으로써 서비스가 지속적으로 수행하게 된다.

 고가용성 클러스터에 대해서 더 많은 관심이 있다면 http://www.linux-ha.org/ 를 참고하라.


3-4. 그외의 클러스터 분류

3-4-1. 노드의 소유권에 따라서 (Node Ownership)

•Dedicated Clusters
•Nondedicated Clusters
3-4-2. 노드의 하드웨어에 따라서 (Node Hardware) ? PC, Workstation, 또는 SMP 등등

•Clusters of PCs (CoPs) or Piles of PCs (PoPs)
•Cluster of Workstations (COWs)
•Clusters of SMPs (CLUMPs)
3-4-3. 노드의 운영시스템에 따라서 (Node Operating System) ? Linux, NT, Solaris, AIX 등

•Linux Cluster (예: Beowulf)
•Solaris Clusters (예: Berkeley NOW)
•NT Clusters (예: HPVM)
•AIX Cluster (예: IBM SP2)
•Digital VMS Clusters
•HP-UX Clusters
•Microsoft Wolfpack Clusters
3-4-4. 노드의 구성에 따라서 (Node Configuration)

•Homogeneous Clusters
- 모든 노드가 비슷한 구조와 같은 OS를 이용하는 경우
•Heterogeneous Clusters
- 모든 노드가 서로 다른 구조로 이루어져 있고 또한 다른 OS를 이용하는 경우
3-4-5. 노드의 위치와 숫자에 따른 구분 (Level of Clustering )

•Group Clusters (노드 수: 2-99)
- 노드들끼리 Myrinet과 같은 SANs(System Area Networks)로 연결되어 있다.
•Departmental Clusters (노드 수: 10-100)
•Organization Clusters (노드 수: 수백 개)
•National Metacomputers (WAN/Internet-based)
- 많은 Departmental/Organizational systems 또는 Clusters
•International Metacomputers (Internet-based)
- 천 개부터 수백만 노드들의 Cluster
 


4. 클러스터의 단점

 클러스터의 문제점은 관리의 어려움과 프로그램의 어려움을 들수 있다. 이러한 문제점은 다수의 컴퓨터로 구성되어 있다는 것에 기인한다. 즉 다수의 컴퓨터를 관리하고 일반적인 문제들(S/W, H/W)을 해결하는데 상대적으로 많은 노력이 필요하다는 것이다.
다행히 관리의 어려움을 해결하기 위한 많은 툴들이 공개되어 있으며 이러한 툴들을 이용하여 상당 부분 관리에 필요한 노력을 줄일 수 있다. Reference를 참고하자.

 한편 기존 워크스테이션에서 수행되는 프로그램들은 단일 컴퓨터에서 수행되도록 프로그램되어 있다. 이를 시리얼 프로그램이라 한다.
 그러나 클러스터를 비롯한 병렬 컴퓨터에서는 병렬 프로그램을 사용하여야만 한다. 인터넷을 통하여 병렬화된 프로그램을 구할 수도 있지만 공개된 병렬프로그램이 없다면 직접 프로그램을 병렬화하여야 한다. 이것은 경우에 따라 매우 많은 노력을 필요로 한다.

 

 

Building Cluster


[ 목  차 ]

1. 고려사항

2. 클러스터 구축하기

    2-1. 사설네트워크 구축

    2-2. 관리노드 세팅

    2-3. 컴퓨팅노드 세팅

    2-4. 클러스터 확장

3. 보안

4. 클러스터 관리툴

5. 벤치마킹

 

1. 고려사항

 클러스터 구축을 위해서는 어떠한 하드웨어를 사용하여 어떠한 규모의 클러스터를 구축할 것인지 H/W적인 선택을 하여야 한다. 그리고 어떠한 소프트웨어들을 설치할 것인지 몇가지 선택을 하여야 한다. 다음은 이러한 고려에 대한 작은 조언이다.

1-1. H/W의 고려사항

 클러스터 제작에 사용할 하드웨어를 선택하는 것은 중요하다. 특히 특정한 프로그램을 돌리기 위한 전용 클러스터를 구축하고자 한다면 더욱 중요하다. 다음은 일반적 몇가지 선택에 대한 조언이다.

1-1-1. 프로세서 (CPU)

 클러스터를 구축하여 원하는 컴퓨팅 파워를 얻기위한 두가지 고려사항이 있다. 저성능의 컴퓨터를 다수 연결할 것인가 고성능의 컴퓨터를 소수 연결할 것인가를 고려해야 한다. 일반적으로 노드의 수가 증가할수록 프로세서간의 통신이 증가하므로 네트워크 비용이 증가하게 되고 동기화에 필요한 시간이 증가하므로 병렬화 효율 역시 줄어들게 된다. 따라서 고성능 컴퓨터를 소수 연결하는 것이 효율면에서는 좋다. 그러나 고성능 컴퓨터의 가격은 그 성능에 비해 비싸기 때문에 타협을 하여야 한다.

 ALPHA 프로세서는 floating 계산 능력에 있어서 가장 앞선다. 동일클락의 intel 머신에 비해 약 2.5배 정도 빠르며 대부분의 수치모델들이 floating 연산이 주를 이루는 것을 감안하면 수치모델을 위한 클러스터 구축에 적합하다. 또한 64bit 아키텍쳐이므로 그에 따른 몇가지 장점이 있으며 그중 하나로 리눅스에서의 최대 파일사이즈 2G의 제한이 없다. 비록 리눅스 커널 2.4버전에서는 intel역시 2G제한이 없어졌으나 32bit 기반이므로 2개의 레지스트리가 주소참조시 사용되므로 여전히 알파가 빠른 주소결정을 할수있다. 그러나 가격이 비싸다는 단점이 있다.

 INTEL의 Pentium 시리즈로 대변되는 인텔 프로세서들은 저가에 클러스터를 구성할 수 있으며 다양한 H/W와 S/W의 지원을 받을 수 있는 장점이 있다.

 AMD 프로세서 역시 저가에 구성할 수 있으며 각종 벤치마킹에 의하면 Intel 프로세서에 비해 우수하다. 그러나 지원되는 하드웨어가 부족한것이 단점이며 듀얼(dual)보드가 아직 지원되지 않는 것 역시 단점이다. 참고로 듀얼보드를 사용할 경우 동일 보드상의 프로세서간의 통신이 빠르고 가격/프로세서 비용을 낮출 수 있다는 장점이 있다.

1-1-2. 네트워크 장치 (랜카드, 허브)

 가장 일반적인 경우 100Mbps 스위칭 허브와 랜카드를 사용하여 구성된다. 100Mbps 네트워크 장치를 사용하여 제작한 클러스터는 많은 사용자들에 의해 충분히 사용할 만한 장비라는것이 입증되었다. 만약 더 좋은 네트워크 장치를 사용하기를 원한다면 미리넷과 기가비트이더넷을 고려할수 있으나 이들 장비는 매우 고가이다. 특히 미리넷은 전용 프로토콜을 사용할 경우 패킷전송시 지연시간(latency)이 매우 작은 클러스터 전용 네트워크 장치이지만 TCP가 지원되지 않는 문제점은 있다.

 최근 TCP를 에뮬레이션할 수 있는 방법이 나와 있으나 아직 안정화 되어 있지 않으며 성능에도 문제가 있다.

1-1-3. 기타 주변장치

 메모리에 있어서는 1 bit 에러 보정능력이 있는 ECC램과 일반램이 고려될 수 있다. 좀더 신뢰성 있는 시스템을 구축하기 위해서는 ECC램을 사용하는것이 좋으나 가격은 좀더 비싸다.

 보드의 선택에 있어서는 성능보다는 안정성에 중점을 두어서 선택해야 하는 것이 바람직하다. 클러스터는 다수의 컴퓨터로 구성되므로 하드웨어가 문제를 일으킬 확률이 그만큼 증가하게 되기 때문이다. Storage(저장장치)의 경우 일반적으로 IDE방식과 SCSI방식의 HDD가 고려될 수 있다. 이는 전적으로 어떤 프로그램을 수행할 것인지에 따라 결정될 수 있다. I/O가 빈번이 발생하는 프로그램을 수행한다거나 동시에 다수의 프로세스에 의해서 I/O가 이루어진다면 SCSI을 고려해야 할것이다. 그리고 더 나은 안정성과 속도를 원하다면 고가의 RAID역시 고려될 수 있다. 한편 다수의 하드 디스크를 이용하여 소프트웨어적으로 RAID를 구성하는 방법도 있다.  

1-2. S/W의 고려사항

 클러스터를 위한 소프트웨어를 크게 3가지로 나눈다면 클러스터에 사용될 OS, 클러스터를 구축하는데 필요한 MiddleWare, 마지막으로 클러스터를 구성한후 사용할 프로그램으로 나눌 수 있다.

 다음은 이들에 대한 간단한 조언이다.


1-2-1. OS에 대한 고려사항

 가장 널리 사용되는 OS로는 역시 리눅스를 들 수 있다. 현재 리눅스를 이용하여 클러스터를 구축하기 위한 많은 기술문서와 라이브러리, 모니터링 툴, 큐잉시스템 등이 공개되어 있으며 심지어는 클러스터링을 위한 커널이미지, 배포판 등도 나와 있다.
한편 리눅스뿐만 아니라 UNIX, NT등에서도 클러스터를 구축할 수 있다.

1-2-2. MiddleWare에 대한 고려사항

 여기서 말하는 미들웨어란 병렬라이브러리, 모니터링 툴, 큐잉시스템등 클러스터 관련 소프트웨어를 지칭한다. 먼저 병렬라이브러리는 무수히 많이 있으며 이들중 원하는 라이브러리를 하나 또는 여러개 선택해서 설치할 수 있다. 모니터링 툴과 큐잉시스템 역시 다수가 공개되어 있으며 상용 툴들도 나와 있다. 이들에 대한 자세한 정보는 Reference Sites에 나와있는 각 소프트웨어의 홈페이지를 참고하기 바란다.

1-2-3. 프로그램 병렬화에 대한 고려

 기존 워크스테이션에서 돌고 있는 시리얼 프로그램을 클러스터에서 돌린다고 성능향상이 되는 것은 아니다. 클러스터를 비롯한 병렬컴퓨터는 병렬화된 코드를 요구한다. 즉 시리얼 프로그램을 병렬화 한후 이를 클러스터에서 수행해야 한다. 만약 인터넷을 통해 병렬화된 코드를 구할수 있다면 가장 바람직한 경우이다. 그렇치 않다면 모델 병렬화를 고려해야 한다. 병렬화 작업은 많은 노력이 필요할 수도 있다. C, C++, fortran 으로 작성된 프로그램이 병렬화가 가능하며 현재 ETRI(링크)에서 병렬화 작업에 필요한 교육을 주기적으로 진행하고 있으며 Alpha-11팀에서도 교육을 위한 문서를 제공하고 있다.

 일부 프로그램의 경우 병렬화된 프로그램이 공개된것이 있으며 그에 대한 정보를 얻으려면 S/W pool을 참조하자. Alpha-11팀에서는 S/W pool을 통하여 병렬 프로그램 및 기타 유용한 프로그램들을 수집하고 이를 공유하고자 한다. 당신이 제공하는 정보는 많은 사람들로부터 환영받을것이다.

 

 


2. 클러스터 구축하기

 본문서에서 제공하는 클러스터 제작 기법은 고성능 계산을 제공하기 위한 HPC 클러스터를 구축하기 위한 것이다. 그러나 대규모 클러스터(32노드 이상)에서는 본 문서에서 제공하는 기술이 그대로 적용가능하지 않을 수도 있다. 이것은 공개된 소프트웨어 특히 NFS에 의한 문제이며 대규모 클러스터를 구축하기 위해서는 많은 관련 연구가 필요하다. 따라서 본 문서에서는 이에 대해 다루지는 않을 것이다.

 리눅스는 Redhat 6.2를 사용하기로 한다. Redhat 6.*배포판과는 여러 설정파일의 변화는 거의 없으므로 이후 설명들이 그대로 적용가능하다. 그러나 Redhat 7.*에서는 몇몇 설정파일명과 구조가 바뀌었으므로 이후 설명이 그대로 적용가능하지는 않다.

 4대의 컴퓨터를 클러스터링 할 것이며 이후 필요한 장비는 다음과 같다.
컴퓨터 4대, 각 컴퓨터는 CPU, RAM, BOARD, HDD, VGA, Lan Card등의 기본적인 장치를 갖고 있다.
추가로 Lan Card 1개, 스위치허브 1개, 모니터 1개, 마우스 1개, 키보드 1개, IP(이후 111.111.111.111 이라고 가정) 한 개가 필요하다.

 클러스터 구축 방법은 컴퓨팅 노드의 하드디스크 유무에 따라 아래와 같이 두가지로 구분될 수 있다. 첫째 모든 컴퓨터가 물리적인 하드디스크를 갖고 있다. 그러나 /home을 위한 물리적 공간을 가지고 있지 않다. 단지 하나의 리눅스박스에만 /home을 위한 물리적 공간을 준다. 나머지 컴퓨터에서는 이 디렉토리를 네트워크를 통하여 공유하여 사용하는 것이다. 이 방식이 확장성과 편리성에 있어서 좋다.

 둘째 하나의 리눅스 박스에만 하드디스크가 있고 나머지 리눅스박스들은 하드디스크를 가지고 있지 않는 방식이다. 따라서 디스크가 없는 컴퓨터들은 부팅 디스켓 또는 부트롬을 사용해서 최소한의 부팅을 한후 NFS ROOT를 사용하여 다른 컴퓨터의 하드디스크 일부를 자신의 하드디스크처럼 사용한다. 이 방식은 하드디스크를 위한 비용을 절약할수 있으며, 이후에 노드(클러스터를 이루고 있는 컴퓨터 하나 하나를 노드라고 부름)를 추가하기 매우 쉬운 장점이 있다. 그러나 역시 확장성과 편리성에는 제약이 따르게 된다.

 이 문서에서는 첫 번째 방식으로 구현할 것이다.

 한편 준비된 4대의 컴퓨터중 어떤 컴퓨터를 관리 노드로 사용할것인지를 결정해야 한다. 클러스터는 하나의 시스템이다. 클러스터가 비록 여러대의 컴퓨터로 구성되어 있다고 할지라도 전체적인 관리는 한곳에서 이루어져야 한다. 우리는 이렇게 관리 작업을 할 컴퓨터를 관리 노드라고 부르자. 클러스터가 구축된후에 사용자들은 모두 관리 노드로 접속하여 작업을 수행하게 될 것이며 관리자 역시 관리 노드에서 클러스터의 관리를 수행하게 될것이다. 따라서 이왕이면 다른 컴퓨터 보다 성능이 좋은 컴퓨터를 관리노드로 사용하는 것이 좋겠다. 최소한 동일한 성능의 컴퓨터를 관리 노드로 사용하면 된다. 나머지 컴퓨터들을 컴퓨팅 노드라고 부르자.

 

2-1. 사설 네트워크 구축

 구축하게 될 클러스터는 4대의 컴퓨터가 하나의 독립된 네트워크를 형성하게 될 것이다. 따라서 물리적으로 아래와 같이 연결하여야 한다.
관리노드와 컴퓨팅노드 2, 3, 4, ...., n 가 클러스터링 된 모습이다.

 사설 네트워크를 구축하는 이유는 아래의 몇가지를 들 수 있다.

 첫째, 모든 사용자가 관리노드로 접속하여 작업을 하도록 유도함으로써 관리가 편리한 장점이있다.

 둘째, 모든 노드에 대한 보안설정이 필요없고, 관리노드에 대한 보안설정만으로 전체 노드들을 지켜낼 수 있다.

 셋째, 컴퓨팅 노드들은 외부 패킷의 영향을 받지 않을 수 있다.

 넷째, 불필요한 공인 IP의 낭비를 막을 수 있다.  

 2-2. 관리노드 세팅

2-2-1. 리눅스 설치하기

여분의 준비된 Lan Card를 장착한다.
리눅스를 설치한다.
알파리눅스의 설치는 인텔 계열에 비해서 어렵다. 문제가 있다면 여기를 참고한다.
리눅스에 익숙하지 않다면 전부설치를 권장한다.

2-2-2. 네트워크 설정하기

두 개의 랜카드에 다음과 같은 주소를 부여한다. eth1에 부여되는 주소에 대해서는 그대로 따라하면 된다. 내부네트워크에서 사용될 주소이므로 어떠한 값이 사용되어도 상관없다.


eth0 : IP(111.111.111.111)
eht1 : IP(192.168.1.1)  hostname : master.cluster.net
hostname : node1.cluster.net 

[root@master /etc]# /sbin/ifconfig 명령을 사용하여 제대로 설치됬는지를 확인해 볼수 있다.
[root@master /etc]# /sbin/ifconfig

eth0


eth1


lo


 Link encap:Ethernet  HWaddr 00:60:08:F6:AB:24
inet addr:111.111.111.111  Bcast:75.1.50.255  Mask:255.255.255.0
. . . . . . . . .
Link encap:Ethernet  HWaddr 00:60:08:F6:AB:25
inet addr:192.168.1.1  Bcast:10.0.1.255  Mask:255.255.255.0
. . . . . . . . .
Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
. . . . . . . . . 

한편 라우팅은 아래와 같이 설정해 주어야 한다. xwindow 환경에서 netcfg 명령을 사용하여쉽게 설정할 수 있다.
[root@master /etc]# /sbin/route
Kernel IP routing table


Destination Gateway Genmask Flags Metric Ref Use lface
192.168.1.1
192.168.1.0
111.111.111.111
111.111.111.0
127.0.0.0
default  *
*
*
*
*
your.gateway  255.255.255.255
255.255.255.0
255.255.255.255
255.255.255.0
255.0.0.0
0.0.0.0  UH
U
UH
U
U
UG  0
0
0
0
0
0  0
0
0
0
0
0  0 eth1
0 eth1
0 eth0
0 eth0
0 lo
0 eth0 

2-2-3. hosts 파일 편집한다.
클러스터를 이루고 있는 각노드의 주소와 이름을 정의해 준다. 이것은 관리노드와 모든 컴퓨팅노드에서 동일하게 설정해 준다.

[root@master /]# vi /etc/hosts


210.123.54.230
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4  master.cluster.net
node1.cluster.net
node2.cluster.net
node3.cluster.net
node4.cluster.net  master
node1
node2
node3
node4 

2-2-4. /home을 공유한다.

다음과 같이 exports 파일을 편집하자.

[root@master /etc]# cat /etc/exports
/home   node2 (rw,no_all_squash,no_root_squash)
/home   node3 (rw,no_all_squash,no_root_squash)
/home   node3 (rw,no_all_squash,no_root_squash)

그리고 다음의 명령을 사용하여 nfs를 다시 시작해주자.

[root@master /etc]# /etc/rc.d/init.d/nfs restart

마스터 노드에 nfs 데몬이 제대로 떠있는지 확인해보자. 아래와 비슷하게 나와야 한다..

[scshin@master scshin]$ ps -auex |  grep nfs
root     549   0.0   0.0   0   0 ?       SW   Jan05   0:34 [nfsd]
root     550   0.0   0.0   0   0 ?       SW   Jan05   0:34 [nfsd]
. . . . .

nfs 데몬이 떠 있지 않다면 nfs는 RPC(Remote Procedure Call)를 사용하기 때문에 포트매퍼(Port mapper)라는 데몬이 먼저 떠 있어야 한다. 이를 확인해 보자.

[root@master /etc]# rpcinfo -p
  프로그램 버전 원형   포트
  100000   2   tcp    111   portmapper
  100000   2   udp   111   portmapper
  . . . . . .

이 데몬이 떠 있지 않다면 다음과 같은 명령을 사용하여 portmapper를 먼저 띠우고 nfs를 재시작 해보자.

[root@master /etc]# /etc/rc.d/init.d/portmap start

위 두가지 모두 정상적으로 작동한다면 nfs가 제대로 동작할 것이다. 그러나 그렇치 않다면 nfs가 커널에서 지원되지 않는 경우일수 있다. 이를 위해서는 커널 컴파일을 해주어야 한다. 커널 컴파일시 nfs 관련 옵션들을 모두 커널에 포함시켜 주어야 한다. 이것은 커널 컴파일에 익숙한 사용자라면 별 어려움이 없겠지만 그렇치 않은 사용자라면 http://kldp.org/ 에 가서 "kernel compile" 이라는 검색어로 검색하면 많은 문서를 찾을수 있을 것이다. 이를 참고하여 커널 컴파일을 해야 한다.

kernel 2.2.13 버전에서는 아래와 같은 옵션들이 포함되어야 한다.

Code maturity level options  --->
       [*] Prompt for development and/or incomplete code/drivers
Filesystems  --->
       Network File Systems  --->
             <*> NFS filesystem support
                     <*> NFS server support (NEW)
                     <*> Emulate sun server

커널 컴파일을 마쳤으면 커널과 모듈들을 적재하고 재부팅한후 nfs를 다시 시작해보자.

2-2-5. rsh을 허가한다.

클러스터내의 모든 노드들간에 rsh 이 가능하도록 세팅해야 한다. 이것은 MPI가 정상작동하기 위해 필요하다. 다음의 순서대로 따라해보자. 역시 관리노드와 모든 컴퓨팅 노드에 동일하게 설정해 주어야 한다.

[root@master /root]# whoami
root
[root@master /root]# cd /etc
[root@master /etc]# vi inetd.conf
. . . . .
# Shell, login, exec, comsat and talk are BSD protocols.
shell     stream   tcp     nowait   root    /usr/sbin/tcpd   in.rshd
login     stream   tcp     nowait   root    /usr/sbin/tcpd   in.rlogind
#exec   stream   tcp     nowait   root    /usr/sbin/tcpd   in.rexecd
. . . . .

/etc/inetd.conf 파일을 열고 약 40번째 줄을 보면 위와 비슷한 내용이 보일 것이다. 여기서 shell 과 login 이 아마 주석처리되어 있을 것이다 다. 주석을 제거해 주자. 다음과 같은 명령을 사용하여 inetd를 다시 시작해주자. 참고로 rsh는 보안상 위험하기 때문에 독자들은 rsh을 풀어주는 대신 정확한 설정을 통하여 위험을 줄여야 한다. 이에 대한 내용은 뒤에서 다루기로 하겠다.

[root@master /etc]# /etc/rc.d/init.d/inet restart

그리고 어떤 컴퓨터들이 자신에게 rsh이 가능하도록 허가할지를 정의해 주어야 한다. 다음의 명령들을 따라해 보자.

[root@master /etc]# vi /etc/hosts.equiv
node1
node2
node3
node4

hosts.equiv 파일이 없으면 이를 만들고 위와 같이 2개의 호스트 이름을 적어주자. 이제 이 두 개의 호스트간에는 일반 사용자에 한해서 rsh 명령이 가능해 질 것이다. 이제 rsh 이 제대로 동작하는지 확인해보자. root 가 아닌 일반 유저로 테스트 해야 한다.

관리노드에서 컴퓨팅 노드로 rsh이 되는지 확인해보자.

[scshin@master scshin]$ rsh node2
Last login: . . . . . .
[scshin@node2 scshin]$

슬레이브 노드에서 마스터 노드로 rsh이 되는지 확인해보자.

[scshin@node2 scshin]$ rsh node1
Last login: . . . . . .
[scshin@master scshin]$

2-2-6. 병렬라이브러리를 설치한다.

MPI 라이브러리에는 몇가지 종류가 있다. 그중 유명한 것이 LamMPI 와 MPICH 이다. 이 글에서는 LamMPI를 설치해보겠다.
http://www.mpi.nd.edu/lam/download/ 에서 lam 최신버전을 받아오자. 이 글을 쓰는 시점에서는 6.3.2가 최신버전이다. 참고로 새로운 버전이 나올때 설치방법이 변경될수 있으므로 다운받은 파일에 있는 설치문서를 참고하기 바란다.


[root@master /tmp]# wget http://www.mpi.nd.edu/downloads/lam/lam-6.3.2.tar.gz
--14:15:57--   http://www.mpi.nd.edu:80/downloads/lam/lam-6.3.2.tar.gz
         => `lam-6.3.2.tar.gz'
Connecting to www.mpi.nd.edu:80... connected!
HTTP request sent, awaiting response... 200 OK
Length: 1,411,693 [application/x-tar]
   0K -> .......... .......... .......... .......... .......... [   3%]
                . . . . . . . . . . .
  1350K -> .......... .......... ........               [100%]
14:28:11 (1.89 KB/s) - `lam-6.3.2.tar.gz' saved [1411693/1411693]


[root@master /tmp]# ./configure --prefix=/usr/local/lam
. . . . . . .
[root@master /tmp]# make
. . . . . . .

이제 lamMPI 설치가 끝났다. 그러나 실행을 위해서 몇가지 설정이 남아 있다. 사용자가 LamMPI를 사용하기 위해서는 먼저 LAMHOME 이라는 환경변수가 선언되야 한다. 이를 위해서 다음과 같이 하자.

[root@master /tmp]# vi /etc/bashrc
. . . . . . .
export LAMHOME=/usr/local/lam
export PATH=$PATH:$LAMHOME/bin

/etc/bashrc 파일을 열고 마지막에 위의 두줄을 넣어주자. 이렇게 함으로써 모든 사용자가 로그인 할 때 LAMHOME 과 PATH가 적당하게 설정될 것이다.

 

2-3. 컴퓨팅노드 셋팅


2-3-1. 리눅스 설치하기

관리노드와 마찬가지로 리눅스를 설치한다.

2-3-2. 네트워크 설정하기

하나의 랜카드에 다음과 같은 주소를 부여한다. eth1에 부여되는 주소에 대해서는 내부네트워크에서 사용될 주소이므로 어떠한 값이 사용되어도 상관없다. 여기서는 node2(192.168.1.2), node3(192.168.1.3), node4(192.168.1.4)를 부여하기로 한다.

eht0 : IP(192.168.1.2)     hostname : node2.cluster.net

[root@node2 /etc]# /sbin/ifconfig 명령을 사용하여 제대로 설치됐는지를 확인해 볼수 있다.

[root@node2 /etc]# /sbin/ifconfig


eth0


lo


 Link encap:Ethernet  HWaddr 00:60:08:F6:AB:24
inet addr:192.168.1.2  Bcast:75.1.50.255  Mask:255.255.255.0
. . . . . . . . .
Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
. . . . . . . . . 

한편 라우팅은 아래와 같이 설정해 주어야 한다. 기본게이트웨이는 관리노드가 된다. X-window 환경에서 netcfg 명령을 사용하여 쉽게 설정할 수 있다.

[root@node2 /etc]# /sbin/route
Kernel IP routing table


Destination Gateway Genmask Flags Metric Ref Use lface
192.168.1.2
192.168.1.0
127.0.0.0
default  *
*
*
111.111.111.111  255.255.255.255
255.255.255.0
255.0.0.0
0.0.0.0  UH
U
U
UG  0
0
0
0  0
0
0
0  0 eth1
0 eth1
0 lo
0 eth0 

2-3-3. hosts 파일 편집한다.

클러스터를 이루고 있는 각 노드의 주소와 이름을 정의해 준다.

[root@node2 /]# vi /etc/hosts


210.123.54.230
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4  master.cluster.net
node1.cluster.net
node2.cluster.net
node3.cluster.net
node4.cluster.net  master
node1
node2
node3
node4 

2-3-4. /home을 공유한다.

이미 관리노드에서는 node2, node3, node4가 관리노드 자신의 /home을 마운트하는 것을 허락했다. 따라서 컴퓨팅노드에서는 관리노드의 /home 공간을 아래와 같은 한 줄을 추가함으로써 마운트할 수 있다.

[root@node2 /]# vi /etc/fstab
. . . . . . .
192.168.1.1:/home     /home   nfs   hard,intr,rw

컴퓨터 192.168.1.1의 /home을 자신의 /home 으로 사용하라는 명령이다. 이때 파일시스템은 nfs 이고 hard는 강한연결을 의미한다. 즉 마스터 노드의 nfs가 죽었다면 /home을 사용하기를 원하는 슬레이브 노드의 프로세스는 마스터 노드가 살아나서 /home 에 접근할 수 있을때까지 기다린다. 그리고 이 프로세스를 죽이거나 정지시킬수 없는 상태가 된다. 그러나 intr 옵션을 줌으로써 죽이는 것이 가능하게 된다. 반대로 soft 옵션을 timeo= 옵션과 같이 사용하면 마스터 노드의 nfs가 죽었을시 일정시간후 타임아웃이 발생하게 된다.

2-3-5. rsh을 허가한다.

컴퓨팅노드 역시 관리노드와 마찬가지로 inetd.conf 파일을 동일하게 주석 처리 부분을 제거해해 주고 /hosts.equiv 파일을 편집해준다. 이제 rsh 이 제대로 동작하는지 확인해보자. root 가 아닌 일반 유저로 테스트 해야 한다.

관리노드에서 컴퓨팅 노드로 rsh이 되는지 확인해보자.

[scshin@master scshin]$ rsh node2
Last login: . . . . . .
[scshin@node2 scshin]$

컴퓨팅노드에서 관리노드로 rsh이 되는지 확인해보자.

[scshin@node2 scshin]$ rsh node1
Last login: . . . . . .
[scshin@master scshin]$

2-3-6. 병렬라이브러리를 설치 및 테스트

이제 컴퓨팅노드에도 동일한 방법으로 LamMPI를 설치하자. 컴퓨팅노드는 인터넷에 연결되어 있지 않으므로 ftp 또는 rcp을 이용하여 관리노드로부터 lam-6.3.2.tar.gz 파일을 받아서 설치하면 된다.

이제 2개의 컴퓨터 master(node1) 와 node2가 클러스터링 되었다. 이제 lamMPI를 사용하여 클러스터가 제대로 동작하는지를 테스트해보고 나머지 node3, node4를 클러스터링 할 것이다. 특이할만한 것은 node3, node4의 설치는 다른 방법을 사용할 것이다. 일단 테스트를 해보자.

테스트를 위한 프로그램 이 준비되있다. 이를 다운받아서 아래와 같이 수행해 보자. 아래와 같이 됬다면 LamMPI 가 정상적으로 설치되고 작동할 것이다. 여기서 lamhosts라는 파일은 클러스터내에 어떤 노드가 있는지를 지시해주는 파일이며 반드시 lamhosts 라는 이름을 가질 필요는 없으며 클러스터내의 호스트주소를 담고 있으면 된다.

[root@master /tmp]# su - scshin
[scshin@master scshin]$ vi lamhosts
node1
node2
[scshin@master scshin]$ lamboot -v lamhosts
LAM 6.3.2/MPI 2 C++ - University of Notre Dame
Executing hboot on n0 (node1)...
Executing hboot on n1 (node2)...
topology done
[scshin@master scshin]$

병렬 라이브러리를 포함하여 컴파일을 한다. gcc 대신 hcc를 사용해야 한다.

[scshin@master scshin]$ hcc -o parall_add ./parall_add.c -lmpi

우리는 2개의 노드를 가지고 있으므로 -np 2 라는 옵션을 사용하여 병렬로 수행한다. 프로그램에서 입력을 요청할 것이다. 적당한 integer 숫자를 적어주자. 프로그램은 1부터 사용자가 입력한 숫자까지 병렬로 덧셈을 수행하고 시리얼로 덧셈을 수행하여 speeup을 알려줄것이다.

[scshin@master scshin]$ mpirun -np 2 ./parall_add
*****************************************************
          Notice !!
If input is not enough large,
    Parallel method is not efficient.
This program will add from 1 to your input.
*****************************************************
Input integer number : 10000000
    Parallel SUM = 2290707264,   Wall clock time = 0.075050
    Serial Sum = 2290707264,   Wall clcok time = 0.144484
    SPEED UP = 1.925171
Goodbye! : )
[scshin@atom scshin]$

1∼10000000 까지 더하였다. 병렬로 계산해서 0.144484 초가 걸렸으며 스피드업은 약 1.9가 나왔다. 컴퓨터 사양에 따라 당연히 결과값은 조금씩 틀릴 것이다. 여기까지 왔다면 기본적인 클러스터가 구성된 것이다.

 

2-4. 클러스터의 확장

이제 우리는 master(node1) 와 node2을 클러스터링 하였다. 이제 남은 node3, node4를 클러스터에 붙여보자. 위에서 설명한 컴퓨팅노드의 세팅에 준해서 설치를 하면 된다. 그러나 컴퓨팅 노드가 하드웨어적으로 완전히 동일한 사양이라고 한다면 다른 유용한 방법이 있어서 이를 소개한다.

추가는 하나씩 하나씩 해나가면 된다. node3을 추가해 보자. node3에서 HDD를 분리하여 node2에 붙인다. 이제 node2를 부팅하자. 이제 node2는 2개의 HDD를 갖게 되었다. 원래 node2가 갖고 있던 HDD가 /dev/hda 라고 하고 node3에서 띠어낸 HDD가 /dev/hdc 라고 하면 다음과 같은 명령을 사용하여 디스크복사를 하자.

[root@node2 /root]# dd if=/dev/hda of=/dev/hdc

이제 node2에서 새로 붙인 HDD를 분리하여 node3에 붙이자. 그리고 node3을 부팅한후 몇가지 설정 파일을 변경하자. 이 파일들은 위에서 다루었던 파일들이므로 자세한 내용은 생략한다.

1.모든 노드의 /etc/hosts 파일에 192.168.1.3 node3 node.cluster.net을 추가한다.
2.모든 노드의 /etc/hosts.equiv 파일에 node3을 추가한다.
3.마스터 노드의 /usr/local/atom/cluster.list 에 node3을 추가한다.
4.마스터 노드의 /etc/exports을 변경하여 node3이 /home을 마운트하는 것을 허락해준다.
5.추가한 노드의 /etc/fstab을 변경하여 마스터 노드의 /home을 마운트하도록 한다.
6.추가한 노드의 /etc/sysconfig/network에서 호스트 네임을 node3으로 변경하자.
7.추가한 노드의 /etc/sysconfig/network-scripts/ifcfg-eth0의 IP를 192.168.1.3 으로 바꾸자.
8.마스터노드의 nfs를 다시 시작해주고, node3을 리부팅해서 테스트 해보자.
 

3. 보안

일반적으로 가장 간단한 몇가지 최소한의 보안에 대해서 고려해보고자 한다. 클러스터의 보안은 전적으로 관리노드에서 이루어져야 하며 리눅스에서 기본으로 제공하고 있는 tcp wrapper를 이용해보자.

모든 보안설정이 그러하듯 모든 접근권한을 막고, 일부를 열어주는 방법을 사용한다. 아래는 tcp_wrapper 에 의해서 제어 가능한 모든 서비스포트의 접근을 막기위한 설정이다. 아래 한줄을 추가한다.

[root@master /]# cat /etc/hosts.deny
. . . . . . .
ALL : ALL EXCEPT localhost : twist ( /etc/deny_message %h ) &

twist 는 거부된 접근에 대해서 정해진 스크립트를 수행하도록 해준다. 따라서 허가되지 않은 IP로 부터의 접근은 /etc/deny_message을 출력을 보내주고 연결을 끊는다. 아래 간단한 스크립트 예제가 있다.

[root@master /]# cat /etc/deny_message
#!/bin/sh
echo "Your IP=$1 is not allowed."
[root@master /]# /etc/rc.d/init.d/inet restart
. . . . . .
. . . . . .

이제 모든 곳으로부터의 접근은 거부될 것이다. 정확하게 말하면 tcpd에 의해서 제어되는 모든 서비스로의 접근은 거부될 것이다. tcpd에 의해서 제어되는 서비스와 서비스 네임은 /etc/inetd.conf에서 확인할 수 있다.

이제 허가할 IP에 대해서 접근을 허가해 주어야 한다. 이 설정은 /etc/hosts.allow 파일에 의해서 아래와 같이 이루어진다.

[root@master /]# cat /etc/hosts.allow
. . . . . . .
##### IP of cluster #####
ALL     : 127.0.0.1

##### IP of cluster #####
ALL     : 192.168.1.

##### IP of allowed user #####
ALL     : 123.123.123.4
ALL     : 123.123.53.1
. . . . . .

이외에도 서비스단위로 접근제어가 가능하다. 123.123.123.123 에 대해서 telnet과 ftp만 허락하고자 한다면 다음과 같이 하면 된다.

in.telnetd   :   123.123.123.123
in.ftpd     :   123.123.123.123

또 한가지 고려되야 할 것은 필요없는 데몬(서버)들을 내려야 한다. 일반적으로 HPC클러스터의 경우 httpd, sendmail, smba, named 등은 사용하지 않을 것이므로 이들 서비스를 내리는 것이 바람직하다.

 

4. 클러스터 관리툴

ALPHA11팀에서 제작 사용하고 있는 간단한 클러스터 관리 프로그램을 설치하고 사용하는 방법에 대한 설명을 할것이다.

 

5. 벤치마킹

현재의 Setting되어진 System Configuration상에서 각종 기준이 될수 있는 Performance를 측정하는 것은 매우 중요한 일이다. Benchmark는 System의 성능을 check해 본다는 중요성도 있지만, 더 나아가 향후 System을 upgrade해나가는 과정중에 성능이 실제로 향상되었느냐는 관점에서 중요한 지침이 되는것이다. 물론 자신이 사용하고 있는 병렬 Application을 돌려보는 일은 우선적이다.

그러나, 그 밖에 일반적인 공개/표준 Benchmark program을 돌려본다면, 다른 Cluster System과 상호 성능 비교를 할수 있는 중요 자료를 확보하는 것이다.
흔히 쉽게구할 수 있는 대표적인 병렬 Benchmark program들은 아래와 같다.


NPB (NAS Parallel Benchmark)
      - http://www.nas.nasa.gov/Software/NPB/

Linpack Benchmark (ScaLAPACK Benchmark)
      http://www.netlib.org/scalapack/

PMB (Pallas MPI Benchmark)
      http://www.pallas.de/pages/pmbd.htm

NPB2 (클러스터의 성능 벤치마킹)
      - http://www.nas.nasa.gov/NAS/NPB

Linux/Unix nbench (리눅스 유닉스 성능 벤치마킹)
      - http://www.tux.org/~mayer/linux/bmark.html

NetPIPE (네트워크 벤치마킹)
      - http://www.scl.ameslab.gov/Projects/ClusterCookbook/nprun.html


출처 : http://www.alpha11.com - SAMSUNG Advanced Institute Of Technology

 

 

 

반응형
LIST
반응형
SMALL

# Linux Export

1. bash에서의 쉘변수와 환경변수(1) 쉘변수
 1) 개요: 말 그대로 특정한 쉘 즉 bash에서만 적용되는 변수를 말한다.
 2) 특징
  ㄱ. 지정하는 방법은 '변수명=값' 형태로 지정하면 된다.
    예) [posein@www posein]$ COLOR=red
  ㄴ. 변수값을 출력할 때는 변수명 앞에 $을 붙여 echo명령을 사용하면 된다.
    예) [posein@www posein]$ echo $COLOR
      red
(2) 환경변수: 모든 쉘에 영향을 미치는 변수라는 것을 제외하고는 쉘변수와 지정방법이나 특징이
        유사하다.
(3) bash에서 쉘변수를 환경변수화시키기: export명령을 사용하면 된다.

2. 일반적인 환경변수목록(1) 환경변수
 1) HOME : 사용자의 홈디렉토리
 2) PATH : 실행파일을 찾는 경로
 3) LANG : 프로그램 사용시 기본 지원되는 언어
 4) PWD : 사용자의 현재 작업하는 디렉토리
 5) TERM : 로긴 터미널 타입
 6) SHELL : 로그인해서 사용하는 쉘
 7) USER : 사용자의 이름
 8) DISPLAY : X 디스플레이 이름
 9) VISUAL : visual 편집기의 이름
 10) EDITOR : 기본 편집기의 이름
 11) COLUMNS : 현재 터미널이나 윈도우 터미널의 컬럼수
 12) PS1 : 명령프롬프트변수
 13) PS2 : 2차 명령프롬프트이다. 명령행에서 를 사용하여 명령행을 연장했을 때 나타난다.
 14) BASH : 사용하는 bash 쉘의 경로
 15) BASH_VERSION : bash의 버전
 16) HISTFILE : history 파일의 경로
 17) HISTFILESIZE : history 파일의 크기
 18) HISTSIZE : history에 저장되는 갯수
 19) HISTCONTROL : 중복되어지는 명령에 대한 기록 유무를 지정하는 변수이다.
 20) HOSTNAME : 호스트의 이름
 21) LINES : 터미널의 라인 수
 22) LOGNAME :로그인이름
 23) LS_COLORS : ls 명령의 색상관련 옵션
 24) MAIL : 메일을 보관하는 경로
 25) MAILCHECK : 메일확인시간
 26) OSTYPE : 운영체제 타입
 27) SHLVL :쉘의 레벨
 28) TERM :터미널종류
 29) UID : 사용자의 UID
 30) USERNAME : 사용자이름
(2) 사용예
 1) [posein@www /]$ mkdir $HOME/backup
   [posein@www /]$ ls -ld $HOME/backup
   drwxrwxr-x   2 posein  posein     4096 1월 15 01:31 /home/posein/backup
 2) [posein@www /]$ echo $PS1
   [u@h W]$
    => 프롬프트 형식
      d : '요일 달 날짜'형태로 나타내준다. (예 "Wed Jan 15")
      h : 호스트이름을 보여준다. 보통 '.'를 사용한 이름인 경우 첫번째 '.'까지 보여준다.
      H : 호스트이름을 보여준다.
      l : 쉘의 터미널 장치의 이름을 보여준다.
      s : 쉘의 이름을 보여준다.
      t : 24시 형태의 현재 시간을 보여준다. (예 HH:MM:SS)
      T : 12시 형태의 현재 시간을 보여준다. (예 HH:MM:SS)
      @ : am/pm 12시 형태의 현재시간을 보여준다.
      u : 현재 사용자의 이름을 보여준다.
      w : 현재 작업디렉토리를 보여준다.
      W : 현재작업디렉토리의 마지막 디렉토리만 보여준다.
      ! : 현재 명령의 히스토리 넘버를 보여준다.
      : 를 보여준다.
 3) [posein@www posein]$ PS1="[u@t W]$ "
   [posein@00:53:51 posein]$
    => 프롬프트에서 호스트이름대신에 현재시간을 표시하도록 설정하였다.

3. 환경변수관련 명령
(1) set : shell변수를 표시하고 값을 지정할 수 있다. C-shell에서는 변수와 값지정시에 필수적으
      로 사용해야 하지만, Bash에서는 변수와 값지정시에 꼭 set 명령을 지정하지 않아도 된다.
 1) 사용법
  set [option] [argument]
 2) option
  -o : 현재 set옵션의 상태를 표시한다.
 3) 사용예
  ㄱ. set
    => 옵션이나 인자가 주어지지 않으면 이미 지정된 shell변수와 함수이름,값이 표시된다.
  ㄴ. set -o
    => 현재 set옵션의 상태가 표시된다.
 4) 응용예
  [posein@www posein]$ a=1          // bash에서는 set 명령없이 "변수=값" 형태로 지정
                              하면 된다. 확인은 인자없이 set 이라고 입력한다.
  [posein@www posein]$ echo $a
  1
   => 변수로 선언되었으므로 $a하면 1이라는 값이 출력된다.
  [posein@www posein]$ /bin/csh       // 임시로 C-shell로 전환.
  [posein@www ~]$
   => C-shell로 전환하면 프롬프트로 바뀜을 알 수 있다.
  [posein@www ~]$ b=2
  b=2: Command not found.
   => bash에서 변수지정하는 것처럼 하면 오류가 나타남을 알 수 있다.
  [posein@www ~]$ set b=2
   => C-shell 계열에서는 변수와 값지정시 set 명령을 사용해야 한다. 확인하려면 인자없이 set
    이라고 입력한다.
  [posein@www ~]$ echo $b
  2
    => 변수로 선언되었으므로 $b하면 2라는 값이 출력된다.

(2) env : 환경변수에 대한 정보를 보여준다.
 1) 환경변수란 : 로그인할 때나 새로운 쉘을 파생시킬 때 쉘의 환경을 정의하는 중요한 역할을
           수행한다. env를 실행하면 환경 변수 설정값들을 확인할 수 있고 또한 각 환경
           변수를 나타낼 때 변수이름앞에 $를 붙인다.
 2) 사용예
  [root@www /root]# env
   => 현재 시스템의 환경변수를 보여준다.
 3) 환경변수의 설정 : 값을 지정한후 export해야 한다. 현재 리눅스의 bash에서는 export를 생략
              해도 반영된다.
  예) 패스변경하기
    [posein@www posein]$ echo $PATH
    /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
      => 현재 패스를 확인하면 홈디렉토리를 없다. 홈디렉토리를 추가해보자.
    [posein@www posein]$ PATH="$PATH:/home/posein"
    [posein@www posein]$ export PATH
    [posein@www posein]$ echo $PATH
    /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin:/home/posein
(3) export : 쉘변수를 환경변수로 만들어주는 명령이다. 현재 리눅스 bash에서 일시적인 반영시에
        는 생략해서 사용할 수 있다.
 1) 사용법
  export 환경변수=변수값
 2) 사용예
  ㄱ. [root@www root]# export PATH="$PATH:/usr/local/apache/bin"
      => 현재 설정된 패스값에 /usr/local/apache/bin이라는 경로를 추가한다.
  ㄴ. [posein@www posein]$ PATH="$PATH:/home/posein"
      => 현재 설정된 패스값에 "/home/posein"이라는 경로를 추가한다. export명령을 생략해서
       사용해도 된다.
 3) 참고: export 명령은 쉘변수를 환경변수로 만들어 준다. 그러나, 쉘에서 export로 선언하여
      사용한 뒤에 로그아웃하게 되면 초기화된다. 따라서, 해당 환경변수의 값을 계속적으로
      반영되도록 하려면 /etc/profile(전체시스템)이나 ~/.bash_profile(개인사용자)파일안에
      선언하면 된다.

(4) unset : 선언된 변수를 제거하는 데 사용한다.
 1) 사용법
  unset 변수이름
 2) 사용예
  [root@www /root]# TEL=042
  [root@www /root]# echo $TEL
  042
  [root@www /root]# unset TEL
  [root@www /root]# echo $TEL  // 변수가 제거되었으므로 아무값도 출력되지 않는다.

(참고) bash에서는 환경변수를 만들 때 변수 값을 설정한 후, 환경에 변수를 익스포트(export)하는
    두 단계를 거친다.
 * 사용예
  [posein@www posein]$ echo $LANG     // 언어관련 환경변수값 확인
  ko_KR.eucKR
  [posein@www posein]$ date
  수 5월 21 01:28:56 KST 2003       // 한글로 표시된다.
  [posein@www posein]$ LANG=euc_UN    // 영어로 변경
  [posein@www posein]$ export LANG    // 일시적으로 변경할 경우에는 생략가능
  [posein@www posein]$ date
  Wed May 21 01:29:07 KST 2003       // 영어로 표시된다.


4. 명령어 히스토리(command history)
(1) history에 대하여
 1) 설명: bash에서는 입력하여 실행했던 모든 명령들은 히스토리 리스트 버퍼에 스택으로 저장된
      다. 이 기능은 반복하여 입력하거나 명령을 수정할 때 유용하게 쓰인다. 사용법은 방향키
      위/아래를 누르면서 사용가능하다. 히스토리 파일은 각 사용자의 홈 디렉토리에
      .bash_history라는 이름으로 존재하며 쉘 실행 중에는 메모리에만 명령어 히스토리를
      기억하고 있다가 로그아웃시에 .bash_history파일에 저장한다.
 2) 사용예
  [posein@www posein]$ history
   => 입력한 명령어들의 리스트를 보여준다.
(2) history 관련 변수
 1) 종류
  ㄱ. HISTSIZE : 히스토리 스택의 크기가 지정되어 있다. 단위는 명령의 개수이다. 이 변수의
            설정값을 변경했을 경우 history명령을 내리면 해당개수만큼만 출력된다. 또한
            방향키로 검색했을 경우에는 설정한 명령한 개수만 검색된다.
  ㄴ. HISTFILESIZE : 실질적인 히스토리파일의 크기이다.
  ㄷ. HISTFILE   : 히스토리 파일의 위치를 보여준다.
  ㄹ. HISTCONTROL : 중복되어지는 명령에 대한 기록 유무를 지정하는 변수이다.
 2) 사용예
  ㄱ. [posein@www posein]$ echo $HISTFILE
     /home/posein/.bash_history
  ㄴ. [posein@www posein]$ HISTSIZE=1
      => 실질적인 히스토리 파일의 스택크기가 1이 되므로 방향키로 조회해도 나오지 않는다.
(3) ! 과 히스토리 명령문 : 느낌표(!)를 이용하여 실행할 수 있다.
 1) 사용법
  !! : 마지막으로 실행했던 명령문을 실행한다.
  !n : n번째 실행한 명령문을 실행한다.
  !-3 : n번째 이전에 실행했던 명령문을 실행한다.
  !string : 가장 최근에 'string(문자열)'으로 시작하는 명령문을 실행한다.
  !?string? : 가장 최근에 실행했던 명령문중 string을 포함하고 있는 명령문을 실행한다.
          배포판에 따라 string뒤에 ?는 생략가능하다.
  ^string1^string2 : 마지막 실행 명령문의 string1을 string2로 대체한 후 실행한다.
 2) 사용예
  ㄱ. [posein@www posein]$ pwd
     /home/posein
     [posein@www posein]$ !!
     pwd
     /home/posein
      => pwd가 실행된다.
  ㄴ. [posein@www posein]$ !-4
     date
     수 5월 21 01:51:08 KST 2003
      => history 스택을 거슬러 4만큼 올라가서 해당 명령을 실행한다. 현재의 예제는 date
       명령임을 알 수 있다.
  ㄷ.[posein@www posein]$ !100
      => history의 번호중에서 100번 명령을 실행한다.
  ㄹ. [posein@www posein]$ set
     .....
     [posein@www posein]$ !s
      => 가장 최근에 's'로 시작하는 set명령이 실행된다.
  ㅁ. [posein@www posein]$ ls -alF
     .....
     [posein@www posein]$ !?al
      => ls -alF가 실행된다.
  ㅂ. [posein@www test]$ ls
     a.txt
     [posein@www test]$ cp a.txt b.txt
     [posein@www test]$ ^b.txt^c.txt
     cp a.txt c.txt
     [posein@www test]$ ls
     a.txt b.txt c.txt
(4) 참고 - history관련 테크닉
 1) [CTRL] + [r]
    => 명령프롬프트상태에서 이 키 조합을 누르면 검색할 수 있는 명령프롬프트가 뜬다. 이 때
     특정한 문자를 입력하면 가장 최근에 그 문자로 수행한 명령을 보여준다.
 2) [ESC] 후에 [.] 또는 [ALT] + [.]
    => 최근에 사용된 인자(argument)를 붙여준다. 텔넷으로 접속한 경우에는 [ALT]+[.]은 사용할
     수 없다.
 3) export HISTCONTROL=ignoreboth
    => 중복되어지는 명령어는 히스토리에 기억하지 않는다. 명령행에 입력하거나 계속적으로
     반영시키려면 .bashrc파일에 기록한다.

5. alias
(1) 개요 : 명령어에 별명(alias)를 만드는 것이다. 어떠한 명령에 기본으로 옵션을 추가시키거나
      자신만의 독특한 명령어를 만들 수 있다. 기본적으로 alias만 입력했을 경우에는 현재
      설정된 alias를 보여준다.
(2) 사용법
  alias 별명이름='실행될 명령의 정의'
(3) 사용예
 1) alias
    => 현재 설정된 alias를 보여준다.
 2) alias rm='rm -i'
    => rm명령에 기본으로 -i옵션을 부여하여 rm명령을 실행시킬때마다 확실히 지울 것인지 물어
     본다.
 3) unalias rm
    => rm에 설정된 ailas를 해제한다.
(4) 특징
  1) 일반쉘상태에서 alias를 설정한 뒤 로그아웃하면 그 설정은 무효가 된다.
  2) alias의 해제는 unalias명령을 이용한다.
  3) alias의 설정을 지속적으로 반영시키려면 ~/.bashrc파일안에 설정하면 된다.
(참고) ~/.bashrc파일안에 설정하면 다음 로그인부터 그 값이 반영된다. 만약 즉시 반영하고 원할
    경우에는 'source .bashrc'를 실행시키면 된다.

 

반응형
LIST
반응형
SMALL

# Setting up a Policy-Based VPN Tunnel

1. Bind interfaces to zones and assign them IP addresses:
set interface ethernet1 zone trust
set interface ethernet1 ip 10.1.1.1/24
set interface ethernet3 zone untrust
set interface ethernet3 ip 1.1.1.1/24
2. Set the addresses for the end entities beyond the two ends of the VPN tunnel:
set address trust host1 10.1.1.5/32
set address untrust host2 10.2.2.5/32
3. Define the IKE Phase 1 proposal and Phase 2 proposal. If you use the default proposals, you do not need to
define Phase 1 and Phase 2 proposals.
4. Define the remote gateway:
set ike gateway gw1 address 2.2.2.2 main outgoing-interface ethernet3 preshare
netscreen proposal pre-g2-3des-sha
5. Define the VPN tunnel as AutoKey IKE:
set vpn vpn1 gateway gw1 proposal g2-esp-des-md5
6. Set a default route (both the Trust and Untrust zones are in the trust-vr routing domain):
set vrouter trust-vr route 0.0.0.0/0 interface ethernet3 gateway 1.1.1.250
7. Set outbound and inbound policies:
set policy from trust to untrust host1 host2 any tunnel vpn vpn1
set policy from untrust to trust host2 host1 any tunnel vpn vpn1
The procedure for setting up a VPN tunnel for a dialup user with IKE also constitutes up to seven steps.
1. Bind interfaces to zones and assign them IP addresses.
2. Define the protected address that you want the dialup user to be able to access through the tunnel. (See the
set address command.)
3. Define the user as an IKE user. (See the set user command.)
4. Define the IKE Phase 1 proposal, Phase 2 proposal, and remote gateway. (Note: If you use the default
proposals, you do not need to define a Phase 1 or Phase 2 proposal.)
5. Define the VPN tunnel as AutoKey IKE. (See the set vpn command.)
6. Set a default route (both the Trust and Untrust zones are in the trust-vr routing domain).
7. Define an incoming policy, with Dial-Up VPN as the source address and the VPN tunnel you configured in
step 5.

 

 

반응형
LIST

+ Recent posts