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

 

저작자 표시 비영리 변경 금지
신고

# 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'를 실행시키면 된다.

저작자 표시 비영리 변경 금지
신고

리눅스 컴퓨터에서 윈도우즈 컴퓨터로 원격 데스크탑 연결하는 방법 (rdesktop 사용법)

 

리눅스에서 윈도우즈로 원격접속하기.

제가 예전에 우분투에서 윈도우즈로 접속하려고 여기저기 뒤져보며 이것도 해보고 저것도 해보고 노가다를 해본 경험을 바탕으로 우분투포럼에 how to remotely connect to windows from linux using rdesktop라는 글을 올렸지요. 한글버전도 있어야겠다 싶어서 여기에 올립니다. 이 글은 구글검색을 통해 이글을 찾게 될 리눅스초보자들까지 대상으로 쓴 글이기 때문에 초보자가 아닌 분들에게는 마치 Emacs에 내장된 eLisp설명서를 읽는 것같은 느낌일 겁니다.

윈도우즈는 XP부터 "원격 데스크탑 연결"이라는 기능을 제공합니다. 원격 데스크톱 연결이 무엇이냐? 홍길동이라는 애가 자기 집에 있는 컴퓨터 앞에 앉아서 회사 사무실에 있는 자기 컴퓨터로 접속을 해서 홍길동 앞에 있는 모니터에 사무실 컴퓨터의 스크린이 짠 하고 나오면서 마치 회사 컴퓨터 앞에 있는 것처럼 작업을 할 수 있게 해주는 것이 바로 '원격 데스크탑 연결'입니다. 이해가 안되시는 분들은 원격 데스크톱 연결 질문 대답을 읽어보세요. 이게 가능하려면 홍길동의 회사컴퓨터에 윈도우즈 XP Professional이상이 설치되어있고 또 원격 데스크탑 연결 서비스가 켜져있고 홍길동의 집컴퓨터에는 원격 데스크탑 연결 클라이언트가 설치되어있어야 합니다.

rdesktop은 리눅스에 설치해서 쓸 수 있는 윈도우즈 원격 데스크탑 연결 클라이언트입니다. rdesktop을 이용하면 리눅스 컴퓨터에서 윈도우즈 컴퓨터로 접속할 수 있습니다 즉 윈도우즈 컴퓨터의 스크린이 리눅스 컴퓨터 스크린에 나타납니다.

remote desktop software를 읽어보시면 아시겠지만 이런 종류의 원격접속프로그램은 rdesktop외에도 VNC, FreeNX 등 여러가지가 있습니다.

rdesktop사용법을 알아보기전에 먼저 비슷한 프로그램들과 rdesktop의 차이를 비교정리하겠습니다. 잠깐 그전에

님이 진짜로 원하는 것은 원격접속프로그램이 아니라 다른 것일 수도 있다

리눅스와 윈도우즈를 함께 쓰는 방법은 원격접속 말고도 아래와 같이 여러가지 방법이 있습니다.

한 컴퓨터에 윈도우즈와 리눅스를 같이 깔아서 부팅할 때마다 원하는 운영체제를 선택하고싶다 --> 듀얼 부팅
리눅스에서 윈도우즈 프로그램을 깔아서 사용하고 싶다 --> 와인
윈도우즈에서 리눅스 프로그램이나 유닉스 프로그램을 깔아 사용하고 싶다 --> 윈도우 환경에서 이용할 수 있는 유닉스 플랫폼 목록
리눅스에다가 윈도우즈 전체를 깔아서 쓰고 싶다. (혹은 거꾸로) --> VirtualBox, VMWare
누가 나한테 물려준 컴퓨터에 리눅스가 깔려있더라 난 리눅스 같은 거 필요없다 쓰기 쉬운 운영체제로 바꾸는 방법을 알려달라 --> 예쁘고 쓰기 쉬운 운영체제
윈도우즈와 리눅스 대응 프로그램 리스트 --> windows and os x software alternatives, Linux Alternative Project

(원격 데스크톱 접속 프로그램들 비교)

VNC는 거의 모든 OS에서 설치가 가능하고 거의 모든 OS로 접속가능합니다. 그런데 윈도우즈 원격 데스크탑이나 rdesktop이나 NX에 비해서는 반응속도가 느립니다. rdesktop은 윈도우즈로만 접속이 가능합니다. NX는 윈도우즈와 리눅스에 설치가능하고 리눅스로만 접속이 가능합니다. NX와 rdesktop과 윈도우즈 데스크탑 연결은 속도가 빠르고 기본적으로 연결을 암호화합니다. 하지만 VNC는 기본적으로는 연결이 암호화되어있지 않습니다만 ssh를 이용하면 VNC연결을 암호화할 수 있습니다. 더 자세한 사항은 comparison of remote desktop software를 읽어보세요. (링크는 되도록 한글로 된 거로 걸고 싶으나 걸만한 링크가 없다는... )

전 VNC보다는 rdesktop을 추천합니다. 속도도 빠르고 세팅하기도 쉬우니까.
그래도 VNC를 쓰시겠다는 분은 VNC 사용법VNC Ubuntu Documentation을 읽어보세요.

원격 접속 프로그램들마다 쓰는 프로토콜이 다릅니다. VNC, UltraVNC, RealVNC라는 이름의 프로그램들은 VNC프로토콜을 사용하고 rdesktop과 윈도우즈 원격 데스크탑은 RDP라는 프로토콜을 사용하고, FreeNX와 No Machine NX는 NX프로토콜을 사용합니다. 컴퓨터A에서 컴퓨터B로 원격접속하려면 컴퓨터B에 원격접속서버가 돌아가고있어야하고 컴퓨터A에는 같은 프로토콜을 사용하는 원격접속클라이언트가 설치되어있어야합니다. 예를 들면 No Machine NX와 FreeNX가 서로 다른 사람들이 만든 프로그램이지만 사용하는 프로토콜은 같기 때문에 컴퓨터B에 No Machine NX 서버를 깔아서 돌리고 컴퓨터 A에 FreeNX 클라이언트를 깔면 컴퓨터 A 앞에 앉아서 컴퓨터 B로 접속할 수 있습니다. 프로토콜이 도대체 뭔지 모르겠다거나 무슨 말인지 이해가 안된다는 분들은 걱정하지마세요 이해 안되도 rdesktop을 이용하는데는 지장이 없어요.

우분투 사용하시는 분들은 프로그램->인터넷을 살펴보세요. 거기에 "원격 데스크탑 보기"(vinagre)와 "터미널 서버 클라이언트"(tsclient)라는 프로그램들이 있는데 이것도 다른 컴퓨터로 원격 접속을 하게 해주는 클라이언트프로그램입니다. rdesktop은 거기에 없죠? 없을 거예요.

"원격 데스크탑 보기"(vinagre)는 VNC프로토콜을 사용합니다. 이 프로그램으로 윈도우즈에 접속하려면 윈도우즈에 VNC프로토콜을 사용하는 원격접속서버를 설치해야합니다. 그런 설치작업을 할 의향이 있으신 분은 한번 써보세요. 암호화하려면 ssh로 뭘 해줘야됩니다 속도가 좀 느릴 거예요.

"터미널 서버 클라이언트"(tsclient)과 rdesktop은 모두 RDP프로토콜을 사용하는 원격접속클라이언트입니다. "터미널 서버 클라이언트"는 아래의 스크린샷에서 보시다시피 사용하기 쉽게 생겼습니다. rdesktop은 아래 두번째 스크린샷처럼 사용합니다. 그렇습니다. rdesktop은 터미널창에서 입력해야합니다. 터미널서버클라이언트는 옵션 설정이 쉬운 반면 rdesktop은 터미널서버클라이언트보다 다양한 기능과 옵션을 제공합니다. (사실 터미널서버클라이언트는 rdesktop을 실행합니다.)

터미널 서버 클라이언트 (tsclinet)

rdesktop

잠깐 용어 설명 : 리눅스가 설치된 컴퓨터A에서 rdesktop이나 터미널서버클라이언트를 이용해서 윈도우즈컴퓨터B로 원격 접속하면 컴퓨터B는 "원격 컴퓨터"라고 부르고 컴퓨터A는 "로컬 컴퓨터"라고 부릅니다. 원격접속하면 원격 컴퓨터의 스크린 화면이 로컬컴퓨터 모니터에 나타나는 겁니다.

터미널서버클라이언트와 rdesktop이 지원하는 기능

1. 원격 컴퓨터 화면크기설정 (원격컴퓨터의 스크린을 보여주는 창의 크기.)
2. 원격 컴퓨터 소리 설정 (원격컴퓨터에서 나는 소리가 로컬컴퓨터에서 나게 해주는 기능. 원격컴퓨터에 깔린 음악프로그램으로 원격컴퓨터에 있는 음악파일을 재생하면 소리가 로컬컴퓨터에서 나면 좋겠죠.)
3. 하드디스크 연결 (원격컴퓨터에서 로컬컴퓨터의 파일을 접근할 수 있게 해주는 기능. 원격컴퓨터의 윈도탐색기에서 로컬컴퓨터의 파일에 접근할 수 있습니다.)
4. 연결시 시작 프로그램 설정 (원격접속을 시작할 때 자동으로 실행될 윈도우즈프로그램들을 설정)
5. 연결 성능에 관련된 설정
.
rdesktop이 지원하는 다른 기능

1. 장치 연결 (원격컴퓨터에서 인쇄하면 로컬컴퓨터의 프린터에서 인쇄되게 하는 등의 장치연결. 스피커, 프린터, 하드디스크 USB등)
2. SeamlessRDP (원격컴퓨터의 프로그램 하나 하나를 로컬컴퓨터에서 보이도록 하는 기능. 즉 원격컴퓨터 데스크탑 전체가 로컬컴퓨터 모니터에서 보이는 게 아니라 특정한 프로그램을 콕 찝어서 그것만 로컬컴퓨터에서 작업하는 기능. 무슨 말인지 이해가 안되면 구글이미지검색창에 SeamlessRDP를 입력해보세요.)
3. 로컬컴퓨터에 있는 특정한 폴더를 원격컴퓨터에 연결하는 기능.
4. 클립보드 공유 (원격컴퓨터에서 텍스트를 클립보드로 복사해서 로컬컴퓨터에서 붙여넣기하고 반대로도 할 수 있는 기능.)

윈도우즈컴퓨터에서 설정해줘야 할 일

터미널서버클라이언트나 rdesktop을 이용해서 접속하려는 윈도우즈컴퓨터의 버전은 XP Professional이거나 그 이상이어야합니다. 접속하려면 먼저 윈도우즈컴퓨터에서 몇가지 해줘야 할 일이 있습니다.

윈도우즈 암호가 abcde, aaaaaaaaa, iamking처럼 약한 암호라면 강한 암호로 바꿔줍니다. 10자는 넘어야되고 사전에서 찾을 수 있는 단어의 단순한 조합은 안됩니다. 강한 암호로 바꾸는 이유는 윈도우즈에서 원격접속서비스를 키면 그 컴퓨터가 있는 곳으로 직접 가지 않고도 누구든지 원격으로 접속을 시도할 수 있기 때문입니다. 자동으로 수많은 암호를 입력해보는 프로그램을 이용해서 접속을 시도하는 사람들이 있을지도 모릅니다.

원격 데스크톱 연결 사용에서 "연결할 컴퓨터에서 원격 연결을 허용"이라는 부분을 읽어보시거나 컴퓨터를 원격 데스크톱으로 설정를 읽어보고 거기에 나온데로 윈도우즈컴퓨터에서 원격연결을 허용해줍니다.

그 다음에는 보안을 위해서 만약 윈도우즈컴퓨터로 접속하려는 컴퓨터의 아이피가 자기가 가지고 있는 리눅스컴퓨터의 아이피주소가 아닐 경우 접속을 거부하도록 방화벽설정을 해주면 좋습니다. 그럴려면 제어판을 열고 윈도우즈방화벽을 엽니다. (스크린샷 참조) 예왜탭으로 가서 "원격 데스크톱"가 체크상태인지 확인해보고(체크상태여야함) 이걸 선택한 상태에서 편집버튼을 눌러서 나오는 대화상자에서 범위변경버튼을 누른 후 거기에서 윈도우즈컴퓨터로 원격 접속을 허용하고 싶은 컴퓨터들의 아이피주소를 입력해줍니다.

윈도우즈 방화벽 원격접속 아이피 제한

스크린샷이 작아서 잘 안보이는 분은 스크린샷에 마우스커서를 대고 마우스오른쪽버튼을 누른 후 이미지보기를 누릅니다. 그것도 안되면 이 글 맨 밑에 링크걸린 첨부파일을 다운받습니다.

윈도우즈에서 준비할 건 이게 끝입니다. 이제 리눅스 컴퓨터로 갑시다.

리눅스 컴퓨터에서 할 일

리눅스 컴퓨터에 rdesktop을 설치합니다. 우분투 사용하시는 분들은 이미 설치가 되어있고 나머지는 해당 배포판의 게시판에서 설치방법을 찾아보시거나 rdestkop 홈페이지에 가서 읽어보고 직접 설치합니다. (터미널창에 rdesktop를 입력해보면 rdesktop이 이미 설치되어있는지 알 수 있습니다.)

rdesktop이 설치가 되었다면 이제 원격접속을 시도해봐야겠지요. 자 터미널창을 엽니다. (우분투사용자의 경우 터미널창을 여는 방법은 프로그램->보조프로그램->터미널) 명령을 실행하려면 명령을 입력한 후 엔터를 눌러야하는 것쯤은 알아두시고...

원격컴퓨터 윈도우 사용자이름(윈도우즈 켜서 로그인할 때의 이름)과 로컬컴퓨터 리눅스 사용자 이름(리눅스 컴퓨터 키거나 로그인할 때 선택하거나 입력하는 그 이름)이 같고 윈도우컴퓨터의 아이피주소가 고정된 주소(예를 들어 143.210.123.456라고 가정)라면 로컬컴퓨터 앞에서 터미널 창을 열어서 다음과 같은 명령을 실행합시다.

rdesktop 143.210.123.456

만약 사용자이름이 서로 다르고 윈도우즈사용자이름이 john이라면 다음과 같은 명령을 실행해야합니다.

rdesktop -u john 143.210.123.456

그러면 윈도우즈로 원격접속이 되서 화면이 바뀌고 윈도우즈 로그인암호를 물어보는 윈도창이 외롭게 떡하니 뜨는데 윈도우즈암호를 입력해줍니다. 그러면 원격컴퓨터의 화면이 뜰 겁니다. 원격접속을 끊고 다시 로컬컴퓨터 리눅스의 화면으로 돌아오려면 윈도우즈 시작버튼을 누릅니다 그러면 윈도우즈종료버튼 대신 연결끊는 버튼이 있을텐데 그걸 누르면 됩니다.

하라는 데로 명령을 실행했는데 로그인창이 뜨기는 커녕 아무일도 안 일어난다는 분들이 있을 텐데요. 원인이 뭘까요. 혹시 rdesktop명령을 실행할 때 윈도우즈컴퓨터가 꺼진 상태였던 건 아닙니까? 원격접속하려면 켜진 상태여야합니다. rdesktop프로그램이 알아서 켜주지는 않습니다. 혹시 명령을 그냥 복사해서 터미널창에 붙여넣기했습니까? 위에서 예시로 제시한 명령에서 143.210.123.456은 자기꺼 윈도우즈의 아이피주소로 바꿔서 입력하셔야지요. john도 자신의 윈도우즈로그인이름으로 바꿔야되구요. 앞으로 나오는 명령도 알아서 바꿔서 입력해주시길.

도대체 아이피주소라는게 뭐냐 내 윈도우즈 컴퓨터의 아이피주소가 뭔지 모르겠다는 분들은 What is My IP Address라는 사이트를 윈도컴퓨터에서 방문하시면 알려줍니다. 이 숫자가 윈도우즈 부팅할 때마다 바뀌는 분은 DynIP가 제공하는 Dynamic DNS 서비스를 이용하시면 고정된 아이피주소 비슷한 걸 받을 수 있습니다. (참고 : Dynamic DNS Providers List)

저는 대개의 경우는 다음 두 가지 명령 중 하나를 쓰는 걸 권장합니다.

첫번째 명령 :

rdesktop -u john -k ko -fP 143.210.123.456

두번째 명령 :
rdesktop -u john -k ko -g 100% -PKD 143.210.123.456

두 명령 다 원격컴퓨터화면을 전체화면으로 보여줍니다. (관련옵션 : 첫번째 명령에서 -f, 두번째 명령에서는 -g 100% -D.) 두 명령 모두 옵션 -P를 통해서 비트맵캐쉬(bitmap cache)옵션을 켜주는데 이러면 반응속도가 빨라집니다. 접속을 끊지 않고 전체화면모드에서 나가기만 하려면 Ctrl+Alt+Enter를 누릅니다. 다시 전체화면으로 가려면 Ctrl+Alt+Enter를 다시 눌러주면 됩니다. (참고사항 : -k ko는 한영키가 원격에서도 작동하게 하려고 넣은 옵션)

위의 두 명령 중 첫번째 명령으로 원격접속한 후 Alt+TAb(창 전환 단축키)을 누르면 로컬컴퓨터 리눅스에서 창전환이 되는게 아니라 원격컴퓨터 윈도우즈에서 창전환이 일어납니다. Alt+Tab은 윈도우즈와 리눅스데스크탑 모두에서 창전환 단축키인데 그걸 원격에서 잡아챈 겁니다. 이건 좋은 거죠? 그런데 다른 키도 다 잡아갑니다. Ctrl+Alt를 누른 상태에서 오른쪽방향키를 누르면 이게 리눅스 작업공간 전환 단축키이니까 작업공간 전환이 일어나야 되는데 안 일어나고 그냥 원격컴퓨터윈도우즈가 다 먹습니다. 이건 안 좋죠? 다른 작업공간을 보려면 일단 전체화면모드에서 나가주는 수 밖에 없습니다.

작업공간 얘기가 뭔소린지 모르겠다는 분은 리눅스의 가상 작업공간에 대한 글을 읽어보시거나 우분투 소개글의 작업공간 부분을 읽어보세요.

두번째 명령으로 접속하면 반대의 현상이 일어납니다. 그때는 Alt+Tab을 누르면 리눅스 데스크탑에서 창전환이 일어납니다. 불편하겠지요. 일부 이걸 원하는 사람들도 있긴 하겠지만.. 그리고 Ctrl+Alt+방향키를 누르면 리눅스 작업공간 전환이 됩니다. 이거 잘 쓰면 유용합니다. 리눅스 첫번째 작업공간에서 작업하고 있다가 두번째 작업공간으로 가서 터미널창 열고 두번째 명령을 입력해서 윈도우즈로 원격접속하면 두번째 작업공간에 전체화면으로 원격컴퓨터 윈도우즈의 화면이 뜨는데 그 상태로 있다가 갑자기 로컬컴퓨터작업이 하고 싶으면 첫번째 작업공간으로 오고 그러다가 다시 원격컴퓨터작업하고 싶으면 두번째 작업공간으로 가는 식으로 사용하면 편합니다. 이런 식으로 사용하면 로컬에서 어떤 텍스트를 복사해서 원격에서 붙여넣기를 하거나 할 때 편합니다.

원격에서 창전환을 Alt+tab으로 창전환하고 싶은 분은 첫번째 명령이 좋습니다만 첫번째 명령으로 원격접속하면 전체화면모드를 나가기 전에는 클립보드 공유가 잘 안되는 버그가 있습니다. 자세한 사항은 여기.를 방문하세요. 그래서 원격과 로컬 사이에서 붙여넣거나 복사하는 작업을 많이 할려면 두번째 명령을 써야 합니다.

원격컴퓨터의 윈도우즈에서도 리눅스처럼 텍스트를 마우스로 긁기만 해도 클립보드로 복사가 되고 마우스의 중간버튼을 눌러서 붙여넣기가 되게 하려면 윈도우즈에 dragking을 설치합니다. dragking.ahk가 작동하려면 ahkstructlib.ahk가 필요하니까 그것도 다운받아서 dragking.ahk가 있는 폴더에 다운받습니다.

우분투 바탕화면에 원격접속아이콘 만들기

원격접속할 때마다 터미널창 열어서 어려운 명령어 입력해서 접속하려니까 좀 귀찮지요.

터미널창에서 Ctrl+R을 눌러보세요. 그러면 (revers-i-search)라고 하면서 뭐가 나오는데 그 상태에서 rdesktop이라고 입력하면 예전에 입력했던 명령들 중에서 rdesktop이라는 단어를 포함하는 가장 최근의 명령을 찾아서 보여줍니다 이상태에서 Ctrl+R을 한번 더 눌러주면 두번째로 최근의 명령을 보여줍니다. 계속 Ctrl+R을 눌러줘서 찾고자 하는 명령이 나왔으면 엔터키를 누르면 그 명령이 실행되고 Ctrl+C를 눌러주면 아무것도 안하고 명령검색이 취소됩니다. 즉 터미널창에 복잡한 명령을 한번만 입력해주면 나중에는 찾아서 입력할 수 있습니다. (마치 텍스트 에디터의 최근 문서 나열하는 기능과 비슷합니다. 우분투의 경우 위치->최근문서와 비슷.)

그래도 터미널창 계속 열어주는 게 귀찮죠. 그냥 바탕화면에 아이콘 하나 눌러서 원격접속했으면 좋겠지요. 우분투를 쓰시는 분은 바탕화면에서 마우스 오른쪽클릭한 후 "실행 아이콘 만들기..."를 누른 후, 다음 스크린샷처럼 명령어칸에 자신이 사용하고자 하는 명령어를 입력하고 나머지 칸은 대충 쓴 후 확인을 눌러주면 바탕화면에 실행아이콘이 생깁니다. 만약 쓰고자 하는 명령어에 %가 포함되있으면 명령어칸에 입력할 때에는 %를 %%로 바꿔서 써줘야합니다. (팁 : 실행아이콘에 쓸 이미지를 그럴싸 한 걸로 선택하려면 실행아이콘 만들 때 왼쪽에 있는 스프링처럼 생긴 걸 눌러서 맘에 드는 이미지를 골라주면 됩니다 맨 마지막 쯤에 나오는 vinagre.svg가 쓸만합니다.)

실행아이콘 만들기

rdesktop의 유용한 옵션

-r disk:doc=/home/john/Documents,pic=/home/john/Pictures
rdesktop명령에 이 옵션을 추가해서 접속한 후 '내 컴퓨터' 아이콘을 누르면 거기에 /home/john/Documents폴더와 /home/john/Pictures폴더가 각각 doc과 pic이라는 이름으로 나타납니다. 이렇게 하면 원격컴퓨터의 윈도우즈 프로그램으로 로컬컴퓨터의 파일을 열거보거나 수정하거나 파일을 옮기거나 할 수있습니다.

-r sound:local
이 옵션은 원격컴퓨터에서의 소리가 로컬(local)컴퓨터에서 나도록 하는 옵션입니다. 이런 거나 원격에서 인쇄하면 로컬에서 인쇄되도록 하거나 하는 기능을 device redirection이라고 부르는데 이에 대해서 더 자세히 알고 싶은 분은 /usr/share/doc/rdesktop/redirection.txt를 읽어보십쇼. (이 파일이 없는 분은 터미널창에 locate redirection.txt를 실행해서 찾아보세요)

-k ja
rdesktop명령어를 입력할 때 -k ko대신 -k ja라는 옵션을 설정해주면 원격컴퓨터에서 일본어로 작업할 수 있습니다. 다른 언어는 /usr/share/doc/rdesktop/keymap-names.txt를 읽어보세요.

-p os83ks93
이 옵션은 윈도우즈로그인암호(이 경우 os83ks93)를 미리 입력해주는 옵션입니다. 편하다고 이 옵션 사용하기전에rdesktop Insecure password handling을 읽어보세요.

-0
이 옵션은 attach to console 옵션인데 이 옵션없이 원격접속하면 원격데스크탑의 원래사용자가 로그아웃됩니다. 원격데스크탑 앞에 있는 사람과 로컬컴퓨터 앞에 있는 사람 둘이서 같이 작업하려면 이 옵션을 켜줘야합니다. (알파벳 o가 아니라 숫자 0이라는 걸 명심.)

rdesktop의 옵션 목록을 간략하게 보시려면 터미널에 rdesktop를 입력하시고 더 자세하게 보시려면 man rdesktop를 입력하세요. (아직 번역이 안된 것 같네요.)

rdesktop으로 연결하면 기본적으로 트래픽이 암호화됩니다. 즉, 네트워크상에서 트래픽을 엿듣기좋아하는 사람에게는 원격컴퓨터와 로컬컴퓨터사이의 대화내용이 암호화된 상태로 293s93js9r2j29w9m8235m2x80wdx3....처럼 보이는 겁니다. 그렇기에 rdesktop사용은 어느 정도의 보안이 보장됩니다. 그런데 rdesktop은 Man in the middle attack이라는 공격에 취약합니다. Man in the middle attack이 뭔지 궁금하신 분은 http://en.wikipedia.org/wiki/Man-in-the-middle_attack를 방문하세요.

이런 공격으로부터 보호받으려면 SSH의 포트포워딩과 함께 SSH의 finger print(지문)기능을 이용해야 합니다. 그런데 SSH이용하는게 초보자들에게는 굉장히 어렵지요. 내 컴퓨터를 호시탐탐 노리고 있는 해커가 있을 것 같다는 분은 SSH포트포워딩을 이용해야겠지만 대부분은 SSH포워딩을 이용 안해도 괜찮을 꺼예요.

SSH를 이용해 rdesktop의 보안을 강화하기

SSH터널을 사용하고 싶은 분은 먼저 윈도우즈에 SSH서버를 깔고 돌려야합니다. cygwin과 ssh서버를 까는 방법을 초보자도 알기 쉽게 설명한 글을 읽어보시려면 lifehacker personal ssh server article을 읽어보세요. UNIX, SSH, CYGWIN에 대해서 잘 모르는 사람들이 이해할 수 있는 진짜 완벽한 글인데 단점이라면 영어라는 거?. 한글로 된 글은 윈도우에 cygwin설치 및 ssh서버 설정를 읽어보세요.

위의 링크된 글을 보면 c:\cygwin\etc\defaults\etc\sshd_config(ssh서버 설정 텍스트 파일)의 내용을 수정하라는 내용이 나옵니다. cygwin폴더 밑에 있는 텍스트파일을 수정할 때에는 notepad2처럼 UNIX텍스트포멧을 지원하는 프로그램을 사용하시는게 좋습니다.

윈도우즈방화벽에서 원격데스크톱서비스에 접근가능한 아이피를 제한했던 것처럼 SSH서버에 접근할 아이피도 제한할 수 있습니다. 보안을 위해서는 제한을 해주는게 좋겠죠. 윈도우즈에서 시작 --> 모든 프로그램 --> Cygwin --> Cygwin Bash Shell을 실행하면 나오는 터미널창에서 다음 명령을 실행합니다.

ssh-keygen -lf /etc/ssh_host_rsa_key.pub

명령을 실행했을 때 나오는 RSA Key fingerprint를 메모해놓습니다. 이거 나중에 필요합니다.

이제 리눅스 로컬컴퓨터로 돌아와서 터미널창에 telnet localhost 3389를 실행합니다. localhost(리눅스로컬컴퓨터 자신)의 포트 3389로 접속을 시도하는 명령인데 대개의 경우 이 명령을 실행하면 다음과 같은 결과가 나와야합니다.

$ telnet localhost 3389
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
이런 결과가 나오면 SSH포워딩으로 rdesktop을 사용할 때 이 포트(3389)를 이용할 수 있습니다. 만약 결과가 다음과 같다면 로컬컴퓨터의 3389포트는 이미 어떤 서버프로그램이 사용중인 포트입니다.
$ telnet localhost 3389
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

결과가 첫번째처럼 나왔다면 다음과 같은 명령을 통해서 리눅스에서 윈도우즈 원격 접속 서비스로 ssh포트포워딩을 합니다.

ssh -L 3389:localhost:3389 john@143.210.123.456

이 명령은 리눅스로컬컴퓨터의 3389포트를 윈도우즈의 3389포트(윈도우즈 원격 접속 서비스가 쓰는 포트)로 포워딩합니다. 명령을 실행하면 다음과 같은 메세지가 나와야 합니다.

$ ssh -L 3389:localhost:3389 john@143.210.123.456
The authenticity of host '143.210.123.456 (143.210.123.456)' can't be established.
RSA key fingerprint is f3:90:3b:70:20:a2:52:fe:fx:a2:90:70:3b:f3:6a:22.
Are you sure you want to continue connecting (yes/no)? 

메세지에 뜬 RSA key finger print가 윈도우즈에 SSH서버설정하면서 메모한 RSA key finger print와 동일한지 확인합니다. 만약 동일하지 않다면 no라고 대답해야합니다. 왜냐하면 이 경우 지금 ssh로 접속한 컴퓨터는 님의 윈도우즈컴퓨터가 아니라 님의 윈도우컴인 척하는 가짜일 가능성이 크기 때문입니다 즉 man in the middle일 가능성이 큽니다.

만약 동일하다면 yes라고 대답합니다. 그러면 암호를 물어보는데 윈도우즈암호를 입력해주면 이제 터미널창에서 ssh세션이 시작됩니다. 여기서 입력하는 명령어는 전부 원격컴퓨터에서 작동합니다. 마치 원격컴퓨터의 터미널창이 로컬컴퓨터 앞에 짠하고 나타난 것 같죠? ssh세션에서 나가려면 exit을 입력하면 됩니다만 아직은 나가지 마세요. ssh세션을 끄지 않고 그대로 놔둔 상태에서 터미널창을 한 개 더 연 후 새 터미널창에서 다음 명령을 실행하세요

rdesktop -u john localhost

그러면 SSH를 통해서 윈도우즈로 원격 접속되니다. 그런데 명령이 좀 이상해보이지 않습니까? 리눅스컴퓨터 앞에 앉아서 리눅스로컬컴퓨터로 즉 자기자신으로 원격접속한다는 뜻인 것 같죠? 맞습니다. 이 명령을 실행하면 rdesktop프로그램이 로컬컴퓨터의 3389포트(원격접속서비스 기본포트)로 접속하는데 처음 터미널창에서 해준 작업 때문에 로컬컴퓨터의 3389포트가 원격컴퓨터의 3389포트로 암호화된 터널로 연결된 상태라서 결과적으로는 마치 rdesktop이 원격컴퓨터로 접속한 것처럼 됩니다. (위의 rdesktop명령은 옵션설정이 거의 없는데 알아서 설정하시길. 제가 맨 위에서 권장했던 두 명령처럼 설정하면 됩니다.)

지금 ssh세션을 끄면 연결이 끊겨서 rdesktop의 원격접속 연결도 같이 끊기게 되겠죠? 그런 방식으로 원격접속을 끊는 건 비추고 윈도우즈 시작메뉴를 통해서 먼저 윈도원격접속을 끊은 후에 ssh세션을 종료하는 걸 권장합니다. 그런데 ssh세션 종료하지 않고 놔두면 편한 점이 있는데 나중에 다시 SSH를 통해서 rdesktop연결을 쓸 때에 ssh포워딩을 따로 시작해주지 않아도 된다는 점입니다 이미 하나 시작해논 걸 안 껐으니까.

SSH포워딩을 사용해서 rdesktop을 쓰면 약간 속도가 느려집니다 이건 아마 cygwin이 느려서 그럴 거니다. (그래도 VNC보다는 빠를 거예요)

만약 telnet localhost 3389를 실행했을 때 이미 사용중인 포트라는 결과가 나왔다면? 그럴 땐 사용중이지 않은 다른 포트를 찾아야 합니다. 3099포트를 시험해봅시다. telnet localhost 3099를 실행해서 3099가 이미사용중인 포트인지 아니면 사용가능한 포트인지 확인해보고 사용가능한 포트이면 다음과같은 명령을 입력합니다.

ssh -L 3099:localhost:3389 john@143.210.123.456

이 명령은 로컬컴퓨터의 3099포트를 윈도우즈의 3389포트(원격접속서비스의 기본포트)로 포워딩하면서 ssh세션을 시작합니다.

새 터미널창을 열고 다음 명령을 실행하면 윈도우즈로 원격접속됩니다.


저작자 표시 비영리 변경 금지
신고


티스토리 툴바