RS-485
노이즈에 강해 원격 자동화에 많이 사용되는 RS-485 통신의 기본 원리와 회로도, 프로토콜 제작에 대해 알아본다.

RS-232는 그라운드와 데이터 신호의 전압 차이로 상대 기기에 전달된다. 그래서 통신 선로가 길수록 전압 저하로 노이즈에 약하고 고속이나 장거리에는 부적합 한 것이 단점이다. 반면 RS-422(EIA-422)는 고속 및 장거리 노이즈에 상대적으로 강한 통신 방법이다. 232가 불평형 통신 선에 의한 인터페이스라면 485는 평행형 통신 선이며, 쌍방 접속으로 최대 10Mbps로 수 Km까지 전송이 가능하다. 485는 표 1에 나타낸 것처럼 422와 전기적으로 다른 것 이외에는 유사하다.












































































항목 RS-232 RS-423 RS-422 RS-485
모드 타입 불평형 불평형 평형 평형
최대수 Driver(송신) 1 1 1 32
Receive(수신) 1 10 10 32
최대 케이블 길이(m) 15 1200 1200 1200
최대 Bps 20K 100K 10M 10M
Transmit Level Max ±15V ±6V 경우에 따라 다름 -
Min ±5V ±3.6V ±2V ±1.5V
수신감도 ±3V ±0.2V ±0.2V ±0.2V
Load Impedance(Ω) 3K∼7K 450이하 100이하 60이하
Output Current Limit 500mA∼(Vcc 또는 GND) 150mA∼GND 150mA∼GND 150mA∼GND
Driver ZOUT 최소값(Power Off) 300Ω 60kΩ 60kΩ 60kΩ






그림 1은 RS-485 IC의 내부 구조 및 연결 방법을 나타낸 것이다. LTC485와 MAX465는 Pin-to-Pin으로써 전기적 차이는 약간 있으나 기능 핀 구성이 같다. 언급된 제품 이외에 상당수 더 있지만 필자는 LTC485를 통해 실험했다. 그림1의 왼쪽은 IC 핀 구성과 내부 구조를 나타내며, 오른쪽은 IC를 이용해서 원거리를 케이블로 연결했을 경우를 매뉴얼에서 언급한 대로 나타냈다. 선로 상의 A, B 사이에 있는 RI는 종단 저항을 나타내며, 선로 임피던스마다 다르지만 보통 50~150Ω을 병렬로 연결해서 사용한다. 수신 쪽에서 정보를 보냈을 경우 반대편에 부딪혀서 메아리처럼 되돌아오는 신호를 소멸시키기 위해서이다. 빨래 줄처럼 한 개의 신호 선에 여러 대의 장비가 서로 통신할 경우에는, 장비마다 종단 저항을 전부 연결하는 것이 아니고 보내는 장비와 가장 멀리 위치한 받는 장비 한 대씩 두대만 종단 저항을 연결한다. 그래서 485 통신 보드에는 보통 100Ω의 종단 저항에 점프 핀으로 선택적인 연결을 할 수 있도록 해서, 선로 상의 마지막에 해당하는 보드에 종단 저항 설치가 가능하게끔 구성한다.
통신 선로 상에 직렬로 되어 있는 R14~R17의 1Ω 저항값은 선로로 과 전압이 들어오면 내부 기기를 보호하기 위한 보호 저항이다(신뢰성 없음). 선로 상에 이상 전압이 예상되거나 전기적으로 서로 절연(Isolation)하기 위해서는 포토 커플러를 485 드라이브 IC와 TTL 로직 IC 사이에 놓고 설계하기도 한다(그림 2 참조).


그림 2. RS-485와 RS-232 통신 설계












SYN SYN SOH Header STX Text ETX BCC







SYN : Synchronous Idle
SOH : Start Of Heading
STX : Start Of Text
ETX : End Of Text
BCC : Block Check Character
그림 3. 동기식 메시지 형식





2개 이상의 스테이션 사이에 정보를 전송하기 위한 순서 규약이 프로토콜이며, 이에 의해 통신이 제어된다. 통신 규약의 목적은 기기 사이의 연결을 시작하거나 끝내고 송?수신부를 지정하며, 오류 확인, 데이터 전송에 관련된 모든 제어 기능을 관리하는 데 있다. 232에서도 약간 언급했지만 데이터 전송에는 동기식과 비동기식이 있다.
동기식 방법에는 문자 지향적 프로토콜(Character-Oriented Protocol)과 비트 지향적 프로토콜(Bit-Oriented Protocol) 이 있다. 대부분의 통신 코드는 문자 지향적 방법의 변형을 이용하여 비동기식으로 통신하는 알고리즘이다. 데이터 전송을 담당하는 통신 제어 문자를 표 2에 나타냈는데, 이들 문자를 약속된 절차에 따라 서로 주고받으면서 통신하는것이다. 문자 지향적 형식은 헤더(Header) 영역과 텍스트(Text) 영역, 그리고 오류 검사(Error Check) 영역으로 나뉘며 이를 메시지(Message)라 한다.
그림 3은 동기식 문자 지향적 프로토콜의 전형적인 메시지 형식을 나타낸다. SYN은 상호 약속에 의해 송신부와 수신부의 동기를 돕는 것으로 0110100의 특수 문자를 사용하는데, HDLC(High-level Data Link Control)같은 비트 지향적 프로토콜에는 플래그 0111 1110을 사용한다. 필자가 구현한 통신 프로토콜은 시리얼 통신모드1을 사용한 비동기식이고, 메시지 형식은 문자 지향적인 방법을 이용했다. 특히 동기 맞추는 부분은 제외한 자작 프로토콜을 이용했다.
표 2는 서로 떨어져 있는 보드 사이를 통신하기 위해 미리 정의한(현재 통용되고 있음) 문자 기호를 나타내며 16진 Hex값이 이에 해당한다. 여기서부터는 이런 기호를 이용해서 장비와 장비간에 서로 통신하는 방법과 프로토콜을 정의하고자 한다. 궁극적인 목적은 넓은 범위에서 사각지대 없이 여러 대의 기기가 원활하게 서로 통신하며 정보를 주고받는 것이다. 데이터 수수를 위해 가장 먼저 해야 할 일은 신뢰성에 기반을 둔 통신이다. Mast, Slave의 개념을 쉽게 이해하기 위해서 이제부터는 대장/부하 개념으로 설명하겠다.
대장보드와 부하보드 상호간에는 비동기 통신, Polling, Selecting, Response 프로토콜을 사용한다. 통신 속도는 변경할 수 있지만, 기본적으로 19,200Bps에 고정되어 있다. 데이터 길이는 8비트, Stop 비트는 1, 패리티 비트는 없으며(8N1) 16진(Hex)과 ASCII 코드 또는 BCD 코드를 사용한다.
각 기기에는 고유의 UAD(Unit Address)가 Dip S/W에 의해 설정돼 있다. 그래서 사람 이름을 부르는 것과 같이 상대방의 UAD를 이용하여 통신하게 된다. 통신은 정해진 전문 형식에 의해 이루어진다. 통신할 데이터가 없더라도 일정한 시간이 되면 대장보드가 부하보드의 어드레스를 불러 주는데 이를 정기적 Polling라 한다(이하 POL). POL은 회선이 끊어졌는지 확인하며 기기가 정상적으로 동작하는지 체크하는 데도 이용된다. Selecting은(이하 SEL) 대장보드가 부하보드를 UAD로 불러 데이터를 송신할 때 이용되며, Response(이하 RSP)는 POL에서 해당 UAD가 응답할 내용을 대장보드에게 보낼 때 사용된다.




































































기호 Hex 의미 기능
STX 02 Start Of Text 블록의 시작
ETX 03 End Of Text 블록의 끝
EOT 04 End Of Transmission 전송의 끝
INQ 05 Inquiry 명령 실행응답 문의
ACK 06 Acknowledge 인식했음을 알림
DLE 10 Data Link Escape 전송 제어용 확장 코드
NACK 15 Negative Acknowledge 잘못 인식했음을 알림
ETB 17 End Of Transmission Black 전송 블록의 끝
POL 70 Polling 대장보드가 보냄
SEL 73 Selecting 부하보드 지정 정보 전달
UAD 0~F Unit Address 기기 번호
BCC 0~FF Exclusive OR Sum 블록 검사


















HDLC



HDLC(High-level Data Link Control)는 정보 전송을 위해 국제 표준위원회 ISO에서 개발한 비트 중심의 데이터 통신 프로 토콜이다. HDLC는 OSI 모형을 사용하는 컴퓨터와 컴퓨터 사이 의 데이터 통신에서 데이터 링크 계층에 대한 비트 단위의 동기 전송 방식을 정의하고 있다. 즉 데이터 프레이밍, 흐름 제어, 에 러 검출 정정 용도로 쓰이는 비트 기반 데이터 링크 계층의 동기 식 프로토콜인 것이다. HDLC에서의 순서와 정보는 Flag(8bit), Address(8bit), 제어(8bit), 데이터 정보(임의), 프레임 오류 점 검용(16bit), Flag(8bit)과 같은 프레임 형식으로 데이터가 저장 된다. HDLC는 IBM의 SDLC를 기반으로 개발됐고 ISO에 의해 표준화되었다. 표준 프로토콜 서브셋으로 구현된 HDLC의 예를 보면, 이더넷에 사용되는 802.2와 X.25에 사용되는 LAP 등이 대표적이다.
 
 
출처 : 네이버






통신 전문 형식의 예를 도식화하면 그림 4와 같다. 주기적으로 POL이 행해져서 부하보드가 송출할 정보가 없고 그냥 대답만 할 경우에는 CK(Acknowledge)만 보낸다. 보낼 전문이 있으면 RSP로 구성된 데이터 블록을 대장보드에게 보내면 된다.
한편 대장보드가 부하보드에게 정보를 보내고자 할 경우에는 부하보드의 UAD를 SEL 전문에 넣고 정보를 보낸다. 사실 POL과 SEL은 1:n의 일대 다 통신일 경우 대장보드를 포함해 RS-485 선로에 있는 부하보드 전부가 정보를 받고 해석한다. 그 후 자신의 UAD를 받았다면 해당 기기는 내부적으로 명령을 처리하고 응답한다. 응답 정보를 보낼 경우에는 RSP를 보내거나, 아니면 ACK 또는 NAK(Negative Acknowledge)를 보내면 된다. 홈 가드 보드의 통신에서 잘 받았거나 긍정 응답일 경우는 ACK, 정상적으로 통신이 수행되지 않았거나 부정 응답은 NAK를 보내어 확실한 통신이 이루어지도록 한다.
쉽게 말하자면 여러 사람들이 모여 서로 대화하는 것과 유사하다. 세 사람이 대화할 경우를 생각해보자. 서로 동시에 말하지 않기 위해 한 사람이 누군가와 대화하고 있다면 나머지 한 사람은 잠시 기다려 준다. 즉 자신의 이름이 아니면 응답하지 않고 불려진 상대의 대화가 끝날 때까지 기다리는 것이다. 하지만 기다리는 사람이 심심하지 않도록 가끔 이름을 불러 주는 에티켓을 발휘할 수 있다. 이러한 쌍방 간의 약속이 바로 프로토콜인 셈이다. 이는 기존 통신 시스템에서 사용하는 방법을 모방하여 만든 것이다.
좀더 높은 신뢰성과 암호화 기법이 필요한 독자는 스스로 개발하던지 또는 국제적으로 공인된 방법을 사용하기 바란다.
그림 4를 통해 다시 한 번 프로토콜을 설명해보겠다. 통신할 때는 3가지 모드가 있는데 POL, SEL, RSP가 그것이다. POL은 다시 정기적인 POL과 필요에 의해 사용하는 비정기적인 POL로 나눈다. 대장보드에서 부하보드에게 통신이 정상적으로 되는지, 선로에는 이상이 없는지, 그리고 부하보드가 응답할 것이 있는지 등을 POL한다. POL을 받은 부하보드는 보낼 정보가 있으면 RSP로 응답하고, 정보가 없다면 ACK를 보내 통신이 정상적으로 행해지고 있음을 대장보드에게 통보한다.


















RS-485 통신의 Echo, Non Echo 모드



멀티 포인트 버스를 사용하는 시스템은 하나의 버스에 여러 개의 마스터가 연결되어 있다. 이 때문에 하나의 마스터가 다른 마스터와 통신할 경우 반드시 출력 개폐를 해야 한다. 이것은 RS-422의 멀티 드롭 모드와 동일한 개념이다. 하지만 동시에 여러 개의 마스터가 출력하여 데이터가 충돌하는 현상이 발생하 므로 이러한 문제는 S/W에 의해 해결되어야 한다. 그러한 방법 중 하나가 자기가 보낸 정보를 자기가 받아보면 서 충돌 여부를 확인하는 것인데 이를 RS-485 Echo 모드라 부 른다. 예를 들자면 어떤 마스터가 멀티 포인트 버스에‘ABC’라 는 데이터를 보내면 이 데이터가 자동적으로 되돌아온다 (Echo). 이를 읽어와서‘ABC’여부를 확인한 후 동일한 정보가 아니거나 들어온 데이터 수가 틀리면 충돌한 것으로 보고 적절 한 시간 지연을 거친다. 그리고 다시 출력시켜 정확한 값이 되돌 아 올 때까지 되풀이하면 된다. 이 때 마스터의 RxD 신호선은 항상 멀티 포인트 버스에 접속돼 있어 자신의 데이터뿐만 아니 라 다른 마스터가 보내는 데이터도 받을 수 있다. 이러한 데이터 가 자신에게 필요한 정보인지 판단하는 것은 S/W에 의해 결정 된다. 즉 RS-485 Echo 모드에서 마스터의 RxD 신호선은 항상 멀티 포인트 버스에 접속돼 있어야 하는 반면, TxD 신호선은 데 이터를 출력할 때만 접속시켜야 하고 나머지는 반드시 단락시켜 야 한다. 만약 단락시키지 않으면 RS-422의 멀티 드롭 모드와 같이, 다른 마스터가 데이터를 보내도 충돌이 발생하여 올바른 송?수신이 되지 않는다. RS-485 Non Echo 모드는 RS-485 Echo 모드에서 자기가 보낸 데이터가 자기 자신에게 되돌아오는 기능을 없앤 것이다. 이는 TxD 신호선을 멀티 포인트 버스에 접속시키면 그 즉시 RxD 신호선이 멀티 포인트 버스에서 단락된다. 또 TxD 신호선 을 멀티 포인트 버스에서 단락시키면 바로 RxD 신호선이 멀티 포인트 버스에 접속하게 된다.
 
 
출처 : 시스템베이스





한편 대장보드가 특정 부하보드에게 직접 정보를 전달하는 SEL이 있다. SEL을 받고 부하보드가 정상적으로 명령을 처리하면 ACK를 보내고 송수신 에러가 발생하면 NACK를 보낸다. ACK는 보통 정보를 잘 받았을 경우에 사용하고 NACK는 SUM 체크나 수신 오류를 범했을 경우 사용한다.
도식화된 그림 5를 보면 3개 모드 중에서 맨 왼쪽은 정기적인 POL이다. PC에 연결되어 있는 대장보드가 부하보드에게 정기적으로 주소와 함께 정보를 보낸다. 이 때 RS-485 통신선에 연결된 기기들은 일단 분석한 후 자신의 어드레스와 받는 UAD가 동일한지 판단한다. 동일하다면 보낼 데이터 없이 대답만 할 경우 ACK를 보내고, 그림 5의 두 번째 상황처럼 응답 데이터가 있을 때는 RSP를 보내 통신한다. 전문 형식을 정상적으로 받으면 ACK를 보낸다. 반면 한번 더 송신을 요청하거나 취소할 때 또는 잘못 받았을 경우에는 NACK를 보내어 재 송신이 이루어질 수 있도록 한다. 그리고 도식화되어 있지는 않지만 정기적인 POL이나 정보를 보냈는데 일정 시간 동안 ACK 또는 NACK 응답이 없으면, 몇 번 더 재 송신한 후에 회선이 단선된 것으로 판단한다.
통신 프로토콜을 제작하는 것은 생각보다 상당히 복잡하고 여러 가지 실험을 통해 검증되어야 한다. 그러므로 LoopBack Test 프로그램에 대해 알아보면서 프로토콜을 이해하도록 하자. Loop Back Test는 통신 동작을 확인하기 위해 간단하게 이용하는 방법으로, 송신한 것을 자신이 수신하여 정확히 동작하고 있는지 파악할 때 사용한다. Loop Back Test Tool은 그림 6과 같이 제작한다. 그림 6에서 M은 Male(수컷), F는 Female(암컷)이고 10Ω은 의미 없는 보호 저항이다. 여기서 RX_H와 TX_H를 극성에 맞지 않게 잘못 연결하면 485 드라이버 칩이 내부적으로 파괴된다는 점을 기억하자.
Loop Back Test Tool의 R1과 R2에 오실로스코프 프로브와 GND 단자를 놓고 파형을 측정하면 그림 7의 하드카피 RS-485 파형을 얻을 수 있다.
이 때 DB 9핀 소켓의 1번에 스코프의 측정 단자 프로브를, 6번에는 스코프의 그라운드를 연결해야 한다. 처음 통신이 없을 때는 Stop을 유지하고 있다가 통신이 시작되면 Start(Low), 그리고 대문자‘Z’의 ASCII Code인 0x5A(0101 1010) LSB부터 전송되어 MSB를 마친 후 Stop(High) 비트, 그리고 다시 한 번 Stop(문헌에서는 State라 한다) 비트를 유지한다. 프로그램에서 통신모드1, 데이터 8비트, 패리티 없고 Stop 비트 1(8N1)로 설정해 놓았기 때문이다.
통신속도는 한 비트의 시간이 52㎲이기 때문에 역수를 취하면 19230.76≒19200Bps로 데이터가 송신된다는 것을 알 수 있다. 그리고 보면 기계는 정말 거짓말을 하지 않는다. 이 때문에 필자는 엔지니어로서, 인간의 명령에 따라 충실히 동작하는 기계를 올바르게 사용해야겠다는 의무감을 느끼기도 한다.
Source는 RS-485 통신의 기본 구조와 Loop Back Test 프로그램으로, 숫자‘2’를 누르면 영어 대문자‘Z’를 TXH 및 TXL로 485 통신 선로에 보내고 RXH 및 RXL로 다시 받는 내용이다. 통신 결과는 RS-232를 통해 하이퍼터미널에 프린트했다. 그러나 보통의 MPU는 UART 포트가 하나밖에 없어 232 통신과 485 통신을 프로그램에 의해서 이쪽 저쪽으로 스위칭 해야 한다. 그러므로 데이터를 잃어버리면 안 되는 통신 시스템을 요구하는 구조의 포트 전환은 굉장한 기술을 요하거나 아니면 적합하지 않다고 본다.










Source. 타깃 보드 커뮤니케이션 테스트 프로그램
/*
목적 : Target Board Communication Test
File name: com_test.c
Copyright Conan Kim All Rights Reserved.
*/
#include
#include // 중간생략
#include "C:₩hardware₩work₩gu_5002.h" // DS5002FP SFR 정의
#include "C:₩hardware₩work₩gu_type.h" // #include 정의
#include "C:₩hardware₩work₩gu_hard.h" // Memory Map
#define uchar unsigned char
#define uint unsigned int
/*******************/
/* function prototype */
/*******************/
// Interrupt initial
void init_serial(void); // 19200Bps setting
// Communication
void init_qbuffer(void); // Ring Buffer 초기화
bit check_pop(void); // RS-232로부터 입력 검사
// Utility
void title_print(void);
uchar xtoa_h(uchar _byteh); // Hex to ASCII Converter 상위 Nibble
uchar xtoa_l(uchar _bytel); // Hex to ASCII Converter 하위 Nibble
void putstring(char* star); // 문자열 RS-232 프린터
void putbyte(char c); // 문자(文字) 하나 출력
/*******************/
/* Variables Declarations */
/*******************/
uchar xdata get_char; // Q 버퍼에서 읽어온 입력 값
struct ring xdata q; // For Communication q-buffer
/******************/
/* Main Function */
/******************/
void main(void){
uchar xdata i;
EA=0; // Disable Interrupt
init_serial(); // 19200Bps Setting
init_qbuffer(); // Ring Buffer Setup q.rp=q.wp=0
EA=1; // Enable Interrupt
wdt(); // Watchdog Timer
switch(485){ // 참이므로 무한 루프 형성
case(485): // Endless Loop
title_print(); // 화면 프린터
putstring("₩nCMD>"); // 다음 명령 대기상태 Prompt
while(7){ // True 무한 Loop, for(;;)와 동일
wdt(); // Watchdog Timer
if(check_pop() && get_char==0x0D) // CR(Enter) Check
putstring("₩nCMD>"); // 엔터키이면 Prompt
switch(get_char){
case('h'):case('H'):case('?'): // Help Display
putstring("485_Communication(1), 485_Loop_back_Test(2)₩nCMD>");
break; // 절대 빠트리지 말자........ 필자 무지 고생했음
case('1'):case('!'): // 1일 경우, 실제 통신 프로그램 위치
putstring("Now! 485_Communication ₩nCMD>");
break;
case('2'):case('@'): // 2일 경우
putstring("Now! 485_Loop_Back_Test₩nCMD>");
putstring("Send ASCII Code 'Z' to RS-485₩nCMD>");
putstring("Receive(5) Char 'Z' to RS-485₩nCMD>");
ON_485(); // 485 Port On
// GU_TYPE.H에 다음과 같이 정의되어 있음
// #define ON_485() CON1=0;CON2=1
// #define OFF_485() CON1=1;CON2=1
// #define ON_MODEM() CON1=1;CON2=0
// #define OFF_MODEM() CON1=1;CON2=1
for(i=1;i<=5;i++){ // 5회 실행
wdt();
putbyte('Z'); // send 485 Port Z=0x5A=0101 1010
if(check_pop()){ // 485를 통해 수신 데이터 확인
OFF_485(); // 485 Port off, 수신 데이터 있음
putbyte(get_char); // 하이퍼터미널에 입력값 프린터
putstring("("); // 괄호
putbyte(xtoa_l(i)); // i 값을 ASCII로 변환
putstring(")₩nCMD>");
ON_485(); // 485 Port On
} // end if
}// end for(i∼
OFF_485(); // 485 Port Off, RS-232로 변환
putstring("("); // 괄호
putbyte(xtoa_l(i)); // ASCII로 변환
putstring(")₩nCMD>");
putstring("END RS-485 Communication ASCII Code 'Z' Send Test₩nCMD>");
putstring("If You Read Just Number '(6)' is Fail₩nCMD>");
break;
case('5'):case('%'): // this mode Output ASCII Code 'A'
putstring("Now! Modem Test₩nCMD>");
break;
default:break;
} // end switch(get_char)
} // end while(7)
break;
default: wdt(); break; // 필요하지 않음
} // end switch(485)
} // end main
// ========================================================
// ======================== Utility Routine ===============
// ========================================================
bit check_pop(void){
if(q.wp!=q.rp){
get_char=(q.buffer[q.rp]); // pop get char by check flag
q.rp++; // Increment Read Point
if(q.rp>QSIZE) q.rp=0; // 링 구조를 가지고 있음
return (1);
}
get_char=NULL; // 입력이 없으면 공(空), 여기서는 Zero
return (0);
}
void putbyte(uchar c){ // TI=1이 될 때까지 실행
SBUF = c; // 전송 인터럽트가 발생할 때 까지 대기
while(!TI); // 괄호가 참이면 계속 실행, 즉 TI=0이면 대기
TI=0; // (!TI)=0이 거짓이 되려면 TI=1
}
void putstring(char *str){ // Point 문자열 출력
unsigned int xdata i;
for(i=0;str[i]!='₩0';i++) {
if(str[i]=='₩n') {
putbyte(0x0a); // 0x0a = Line Feed(줄 바꿈)
putbyte(0x0d); // 0x0d = Carriage Return(커서를 좌측 끝)
}
else putbyte(str[i]);
}
}
uchar xtoa_h(uchar _byteh){ // 16진수를 ASCII로 변환 상위 Nibble
uchar nibble = _byteh >> 4;
return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0');
}
uchar xtoa_l(uchar _bytel){ // 16진수를 ASCII로 변환 하위 Nibble
uchar nibble = _bytel & 0x0F;
return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0');
}
void title_print(void){ // 사용자 타이틀 프린터
putstring("₩n******************************");
putstring("₩n* Target Board of Home Guard Communication Test *");
putstring("₩n******************************");
putstring("₩n₩n");
putstring("CMD>Push '?'or 'H' key then Commands display₩nCMD>");
}
// ========================================================
// ======================== Initial Routine ===============
// ========================================================
void init_qbuffer(void){ // 링 버퍼 초기화 루틴
q.rp=0; // Read Point value = 0
q.wp=0; // write Point value = 0
}
void init_serial(void){ // 19200
ES =1; // Enable Serial Interrupt
PS=1; // Serial Port Priority High
SCON = 0x50; // Mode=1, REN=1
PCON |= 0x80; // SMOD=1
TMOD |= 0x20; // Timer Mode=2, 8bit Auto_reload Timer
TH1 = 0xFC; // Time Value
TR1 = 1; // Run Timer 1
TI = 0; // Initial TI & RI
RI = 0; // SCON에서 이미 정의되어 있음
}
// ========================================================
// ======================== Interrupt ==================
// ========================================================
void timer0_isr(void) interrupt 1 using 1{ // auto reload 방식
timer.tick++;
if(timer.tick==0xFFFF) timer.tick=0;
}
void push_q(void) interrupt 4 using 1{ // UART 인터럽트
if(RI){ // RI=1일 때 실행
RI=0; // Empty RI(다음 인터럽트 받을 준비)
q.buffer[q.wp]=SBUF; // Write Point로 옮김
q.wp++; // Increment Write Point
if(q.wp>QSIZE) q.wp=0; // Write Point가 넘치지 않게(Ring Buffer)
} // End if(RI)
}
/*********************************/




Source를 컴파일 한 후 프로그램을 로딩, 윈도우의 하이퍼 터미널과 실험용 보드인 홈 가드 보드를 연결한다. 정상적으로 Loop Back Test가 되었다면 그림 8과 같은 결과를 얻을 수 있다.
만약 P2나 P3의 DB 9핀 소켓에 아무 것도 연결하지 않고 프로그램을 실행시키면 Z(1)~Z(5)가 출력되지 않고‘(6)’만 화면에 나타난다.
바탕화면에 하드 카피된 TTY 프로그램은 PC 회사에서 COM 포트를 테스트하기 위해 이용하는 실행 파일로 Microsoft Corp.에서 만든 것이다. 윈도우에서 제공되는 하이퍼터미널을 사용해도 된다.
자체적으로 RS-485의 TX를 통해 보낸 정보를 RX로 받는 것까지 됐다면 다시 프로토콜로 돌아오자. 앞에서 프로토콜을 필자가 직접 만들었다고 했다. 그런데‘프로토콜’의 사전적 의미를 찾아보니 외교상으로는 의전(儀典)이나 의례(儀禮)를 나타내며, 전산에서는 컴퓨터 상호간 또는 컴퓨터와 단말기 사이의 데이터를 송?수신하는데 필요한 통신 규약으로 쓰여 있다. 결국 프로토콜은 일상 생활에서도 사용되고 있는 것이다.
특히 많이 사용되는 전화망 통신의 예를 들어보자. 첫째, 음의 변조방식과 전화번호가 있다. 둘째, 통화하고자 하는 상대가 응답이 가능한지 이름이나 교환 및 내선 번호를 통해 확인한다. 셋째, 상대방과 접속이 되어서도 언어와 Yes or No의 대답 등 일정한 도덕 규약이 있다. 이렇게 프로토콜은 통신 문화이며 정해진 예절이다.
자작한 통신 프로토콜은 다음과 같은 사항을 생각하지 않고 만든 점에 유의하도록 하자. 우선 데이터 투명도를 DLE(Data Link Escape)로 생각하지 않았다. 또한 선로 상에서의 통신 속도를 자동으로 맞추지 못하며, 통신 상에서 각종 대기 시간 및 정기적 POL 시간 등을 실험을 통해 정확히 고려하지 않았다.
나머지는 차지하고라도 데이터 투명도는 꼭 짚어보고 넘어가야 하겠다. 초기 데이터 통신에는 ASCII 문자만으로 통신을 하다가 점점 정보 의미가 확대됨에 따라 2진 정보를 전송할 필요가 있게 됐다. 그러나 2진 정보는 문자 지향적 프로토콜에서 수신부에 의해 잘못 해석될 우려가 있다. 이를 막기 위한 작업을 투명(Transparent) 데이터라고 부른다.
데이터 투명도는 문자 지향적 프로토콜에서 각 통신 제어 문자 이전에 DLE(Data Link Escape)라는 문자를 삽입하므로 이루어진다. 그래서 텍스트를 보낼 때 DLE로 시작해서 DLE로 끝나는 것이다. 만약 DLE(0x10h=0001 0000)와 똑같은 2진 정보가 텍스트 안에 존재하고 있다면, DLE의 혼선을 막기 위해 다시 한번 DLE를 보내는데 수신 시에도 두 개를 받았다면 하나를 버린다. 그러나 이런 방법의 데이터 투명도는 프로그램 하기도 까다롭고 특히 효율이 떨어진다는 단점이 있다.
다른 방법으로는 텍스트 수를 세어 보내는 쪽에서 주고, 받는 쪽에서는 바이트 수를 세어 받는 방법도 있다. 보통 비트 지향적 프로토콜에서 많이 사용한다. 표 3은 홈 가드에서 사용하는 프로토콜의 정해진 명령어를 보여준다.
구현된 타깃 보드는 PC와 연결되어 있는 하나의 대장보드와 이곳에 연결되어 있는 여러 대의 부하보드로 구성돼 있어 서로 정해진 프로토콜에 의해 통신하면서 정보를 주고받는다. 장비가 여러 대의 기기와 접속했을 경우 어떤 모양새를 도플러지(Topology)라고 하는데, 기본적인 방법에는 Point to Point와 멀티 드롭 방식이 있다.




표 3. 프로토콜 제작 예











































































코드 명칭 설명 비고
31 초기 설정 홈 가드 초기화 대장보드가 부하보드에 보낼 때 사용
UAD가 00일 경우에는 부하보드 전부 해당
32 날짜 설정 RTC 년, 월, 일 설정
33 시간 설정 RTC 시, 분, 초 설정
34 알람 설정 RTC 알람 설정
35 모뎀 설정 모뎀 초기화 설정
36 Reset Reset
39 주소 보고 명령 기기의 DIP S/W값 요청
3A 기기 상태 보고 가드 현재 상태 보고 요청
3B 기기 제어 명령 부하보드의 기타 제어 요청
- - - -
51 가드 상태 통보 - -
59 기기 주소 통보 기기의 DIP S/W 값 -
5A 기기 상태 통보 가드 현재 상태 초음파, 온도, 방범 스위치
5B 기기 제어 통보 기기 제어 -
5F 기기 고장 통보 부하보드 고장 보드 고장 상태

















Fan Out



디지털 집적회로(IC)의 외부에 접속되는 부하에 대하여 회로 의 출력 드라이브 능력을 나타낸다. 팬 아웃이 크면 드라이브 능 력이 크다고 할 수 있다. TTL IC에서는 보통 10∼20개 정도의 팬 아웃을 가져, 동일 선상에 접속되는 부하를 능력 이상으로 연 결하면 드라이브 능력이 떨어진다. 팬 아웃 수치로 칩 세기를 평 가할 수도 있다.





P_to_P 방식은 초등학생들이 자연시간에 실험해보았듯이 컵에 실을 꿰어 일대 일로 통신하는 것이다. 멀티 드롭은 P_to_P를 계속 확장한 것으로, 흡사 빨랫줄에 여러 개의 세탁물이 집게로 고정된 모양을 하고 있는 방법이다.
보드의 연결도 멀티 드롭으로 구성되어 있어 통신하고자 하는 정보를 UAD(Unit Address)와 함께 선로에 놓으면 일단 전부 통신 선로에 연결되어 있는 대장 및 부하보드가 정보를 취득한 후 자신의 UAD가 아니면 버리는 구조로 되어 있다. 특히 대장보드가 UAD에 0X00을 넣어 선로에 놓으면 선로에 있는 모든 부하보드는 전부 자신의 UAD로 간주하고 제어 명령을 해석하고 실행한다. 이런 프로토콜을 이용하여 빠른 시간에 부하보드를 초기 설정이나 시간 설정할 수 있다.
다음은 프로토콜에서 미처 설명하지 못한 통상적인 부분을 요약한 것이다. 프로토콜을 작성할 때 염두해 두어야 할 부분이기도 하다.
.전송에 이상이 있을 경우 4회 정도 등, 정해진 회수만큼 재 시도해본다.
.부하보드가 대장보드로부터 두 번 이상 똑같은 명령을 받고 다시 한 번 정상적으로 처리했다면 ACK를 보낸다.
.NACK 수신 시에는 바로 전 상태의 전문을 다시 보낸다.
.EX-OR 또는 SUM 에러가 발생하면 NACK를 보내고 NACK를 받은 보드는 에러가 발생했던 전문을 다시 보낸다.
.대장보드는 정기적으로(시간은 상태에 따라 변할 수 있음) POL을 행한다.
.POL에서 재 시도 횟수를 넘을 때까지 부하보드가 응답하지 않는다면, 대장보드는 선로의 이상 혹은 고장으로 판단한다.
.부하보드는 대장보드의 POL에 응답하는 것 외에 자체적으로 RSP 전문을 보낼 수 없다.
.부하보드끼리는 POL, SEL, RSP를 서로 행할 수 없다.



그림 9는 대장보드와 부하보드를 연결하는 방법을 나타낸다. ‘MAST’는 대장보드를, ‘SLAVE’Keeper 1~Keeper n은 부하보드를 가리킨다. 부하보드는 통신모드3으로 할 경우 8비트의 UAD 때문에 0x0∼0xFF로 한계가 있다. 하지만 통신모드1로 했을 경우에는 이야기가 달라진다. 즉 프로토콜을 잘 만들고 Fan Out 한계가 없다면 무한대의 부하보드와 통신할 수 있는 것이다.
RX, TX는 대장보드를 기준으로 송?수신이 결정(사실 장비의 보통 기준은 PC이다)되기 때문에 대장보드가 송신이면 부하보드는 수신으로 맞춰야 한 다 . 즉 대장보드의 TX_H(TX_L)와 부하보드의 RX_H(RX_L)가 서로 연결되어야 하는 것이다. 이를 지키지 않으면 485 드라이버가 제 기능을 할 수 없다. 대장보드의 TxD 및 RxD 신호는 드라이브 RS-232를 통해 PC와 인터페이스 된다. 그러나 대장이든 부하든 같은 모듈을 사용하고 두 개의 프로그램이 같이 적재되어 있는데, 딥 스위치의 설정에 따라 대장보드와 부하보드가 결정된다.
출처 : 맥가이심(ecima)블로그

MDI(Medium Dependent Interface)와 MDIX(MDI Crossover)
 크로스 연결을 해야할때 크로스케이블이 없고, 스트레이트(or 다이렉트)케이블만 있을경우
 MDI/MDI-X 표시가 있는 제품의 스위치나, 허브는 자동으로 케이블을 확인하고, 연결을 해준다.
 특히 요즘 나오는 제품들은 거의 이렇다고 보면 되기때문에 케이블 때문에 문제가 생기는 경우는 없다
 고 보면 된다.
 
 - 좋은 세상이다...^^

퍼온 사이트(http://kin.naver.com/open100/db_detail.php?d1id=1&dir_id=106&eid=kIZ5a6tTl/UvwmoBIGIC37tlw7HFaHrL&qb=aWNtcCBwb3J0)

▶ TCP/IP 프로토콜에서 사용하는 Port

1) 가장 많이 사용되는 포트 : 0 ~ 1023

2) 예약된 포트 : 1024 ~ 49151

3) 동적, 사설 포트 : 49152 ~ 65535


▶ 가장 많이 사용되는 포트 요약  (0~1023)

키워드

포트번호

포트용도

icmp

8/tcp, 8/udp,

0/tcp, 0/udp

Unassigned

ftp-data

20/tcp, 20/udp

File Transfer [Default Data]

ftp

21/tcp, 21/udp

File Transfer [Control]

ssh

22/tcp, 22/udp

SSH Remote Login Protocol

telnet

23/tcp, 23/udp

Telnet

smtp

25/tcp, 25/udp

Simple Mail Transfer

domain

53/tcp, 53/udp

Domain Name Server

whois++

63/tcp, 63/udp

whois++

tftp

69/tcp, 69/udp

Trivial File Transfer

gopher

70/tcp, 70/udp

Gopher

finger

79/tcp, 79/udp

Finger

www

80/tcp, 80/udp

World Wide Web HTTP

pop3

110/tcp, 110/udp

Post Office Protocol - Version 3

ntp

123/tcp, 123/udp

Network Time Protocol

epmap

135/tcp, 135/udp

DCE endpoint resolution

profile

136/tcp, 136/udp

PROFILE Naming System

netbios-ns

137/tcp, 137/udp

NETBIOS Name Service

netbios-dgm

138/tcp, 138/udp

NETBIOS Datagram Service

netbios-ssn

139/tcp, 139/udp

NETBIOS Session Service

imap

143/tcp, 143/udp

Internet Message Access Protocol

snmp

161/tcp, 161/udp

SNMP

namp

167/tcp, 167/udp

NAMP

imap3

220/tcp, 220/udp

Interactive Mail Access Protocol v3

ldap

389/tcp, 389/udp

Lightweight Directory Access Protocol

https

443/tcp, 443/udp

http protocol over TLS/SSL

shell

514/tcp

cmd

syslog

514/udp

syslog

printer

515/tcp, 515/udp

spooler

ftps-data

989/tcp, 989/udp

ftp protocol, data, over TLS/SSL

ftps

990/tcp, 990/udp

ftp protocol, control, over TLS/SSL

telnets

992/tcp, 992/udp

telnet protocol over TLS/SSL

imaps

993/tcp, 993/udp

imap4 protocol over TLS/SSL

pop3s

995/tcp, 995/udp

pop3 protocol over TLS/SSL (was spop3)

 

▶ 예약된 포트 요약  (1024 ~ 49151)

키워드

포트번호

포트용도

ms-sql-s

1433/tcp, 1433/udp

Microsoft-SQL-Server

ms-sql-m

1434/tcp, 1434/udp

Microsoft-SQL-Monitor

sybase-sqlany

1498/tcp, 1498/udp

Sybase SQL Any

atm-zip-office

1520/tcp, 1520/udp

atm zip office

ncube-lm

1521/tcp, 1521/udp

nCube License Manager

ricardo-lm

1522/tcp, 1522/udp

Ricardo North America License Manager

cichild-lm

1523/tcp, 1523/udp

cichild

ingreslock

1524/tcp, 1524/udp

ingres

orasrv

1525/tcp, 1525/udp

oracle

sybasedbsynch

2439/tcp, 2439/udp

SybaseDBSynch

sybaseanywhere

2638/tcp, 2638/udp

Sybase Anywhere

ms-wbt-server

3389/tcp, 3389/udp

MS WBT Server

http-alt

8080/tcp, 8080/udp

HTTP Alternate (see port 80)


▶ 웜/바이러스 포트로 방화벽에서 차단해야할 포트 요약

포트번호

원래 포트 용도

키워드

69/udp

TFTP

Nachi 웜,

Blaster 웜

80/udp

web server

Nachi 웜

135/tcp, 135/udp

NETBios

Nachi 웜,

Blaster 웜

137/udp

NETBios

Nachi 웜,

Blaster 웜

138/udp

NETBios

Nachi 웜,

Blaster 웜

139/tcp

NETBios

Nachi 웜,

Blaster 웜

443/tcp, 443/udp

HTTPS

Slapper 웜

445/tcp

NETBios

Nachi 웜,

Blaster 웜

514/tcp

SHELL

RPC Backdoor

515/tcp, 515/udp

LPRng

Red 웜

593/tcp

http-rpc-epmap, HTTP RPC Ep Map

Nachi 웜,

Blaster 웜

1008/udp

-

LiOn 웜

1243/tcp

-

ShoolBus Backdoor

1433/tcp, 1433/udp

ms-sql-m, Microsoft-SQL-Monitor

W32.Slammer 웜

1434/tcp, 1434/udp

ms-sql-m, Microsoft-SQL-Monitor

W32.Slammer 웜

3385/tcp

qnxnetman

Net-Worm.Win32.Mytob.dc

4444/tcp

krb524

Blaster 웜,

Welchia 웜

6667/tcp, 6667/udp

ircu 6665-6669/tcp  IRCU

Welchia 웜

6668/tcp, 6668/udp

ircu 6665-6669/tcp  IRCU

Welchia 웜

6669/tcp, 6669/udp

ircu 6665-6669/tcp  IRCU

Welchia 웜

10008/tcp, 10008/udp

-

LiOn 웜

54321/tcp

-

ShoolBus Backdoor

17300/tcp

-

Kuang2 바이러스

30999/tcp

-

Kuang2 바이러스

27374/tcp, 27374/udp

-

SubSeven Backdoor

 

▶ 메신저 관련

Service

Name

Server

Port

Description

MSN

64.4.130.0/24

207.46.104.0/24

207.46.106.0/24

207.46.107.0/24

207.46.108.0/24

207.46.110.0/24

TCP 1863 ,80

1863접속 시도 후 차단 되면 80 접속 시도

TCP 6891-6900

파일 전송

UDP 6901

음성채팅

UDP1863,5190

Microsoft Network Messenger

Yahoo

216.136.233.152/32

216.136.233.153/32

216.136.175.144/32

216.136.224.143/32

66.163.173.203/32

216.136.233.133/32

216.136.233.148/32

66.163.173.201/32

216.136.224.213/32

TCP 5050,5101

5050 접속 시도 후 차단 되어 있으면Port 계속 변경

TCP 5000-5001

음성채팅

TCP 5100

화상채팅

Nate On

203.226.253.75/32

203.226.253.135/32

203.226.253.82/32

TCP 5004-5010

기본 포트 5004-5010 접속 시도후 차단되어 있으면 Port를 계속 변경

TCP80,83,7003

웹 컨텐츠 및 문자 보내기

Daum

211.233.29.78/32

TCP 8062

 

SayClub

211.233.47.20/32

 

 

AOL

 

TCP 5190

AOL Instant Messenger Also used by: ICQ

UDP 4000

ICQ_locator

Dreamwize

211.39.128.236/32

211.39.128.184/32

TCP 10000

 

버디버디

 

TCP 810

 

TCP 940

 

TCP 950

 

케이친구

 

TCP 7979

 

천리안

 

TCP 1420

 

TCP4949, 8989

파일 송수신

ICQ

 

TCP 5190

 

UIN

 

TCP 8080

 

Genile

 

TCP 10000

 

 

▶ P2P 관련

service name

TCP

UDP

소리바다

22322, 22323, 7675

22321, 7674

당나귀

4661, 4662, 4665

8719, 4665, 4672

구루구루

9292, 9293, 8282, 31200

 

Direct

411-412

411-412

Gnutella

6346, 6347

 

GoBoogy

 

5325

Hotline

5497, 5498, 5500, 5501, 5503

 

KaZaA

1214

 

Madster

23172, 9922

 

Maniac

2000, 2222

2010

V-Share

8401-8404

8401-8404

shareshare

6399, 6777

 

WINMX

6699

6257

엔유

8185, 8184

 

파일구리

9493

9493

파일피아

8090-8091

 

iMash

5000

 

BitTorrent

6881, 6889

 

Guntella-Morpheus

6346-6347

6346-6347

GuRuGuRu

9292, 8282, 31200

 

Madster-Aimster

23172, 9922

 

MiRC

6667, 6665-6670, 7000

 

Bluster

 

41170

GoToMyPc

8200

 

Napster

6600-6699, 4444, 5555, 6666, 7777, 8888, 8875

 


▶ Game 관련

service name

TCP

UDP

스타크래프트

6112, 1156-1158

6112, 1156-1158

<퍼온 사이트 : http://www.cep.kr/blog/52?TSSESSION=4f98481c5f3797791b64d03f490b6566 >

Linux Diskless Cluster

5th Edition

기상연구소 예보연구실

*박광기

도종관

이용희

2002.5.28

1. H/W Setting

1.1 Master Node Bios Setting

1.2 Slave Node Bios Setting

1.3 Slave Node Onboard Lancard 부팅 셋팅

2. Clustering

2.1 Clustering에 필요한 package

2.2 Master node Setting

2.2.1 HDD partitioning

2.2.2 TFTP setting

2.2.3 DHCP setting

2.2.4 NIS setting

2.2.5 RSH setting

2.2.6 syslog

2.2.7 /etc setting

2.2.8 kernel setting

2.3 Slave node Setting

2.3.1 sdct

2.3.2 /tftpboot/Template

2.3.3 slave node kernel

2.3.4 adcn

2.3.5 test node debug

2.3.6 slave node 추가

3. 필요한 소프트웨어 설치

3.1 MPICH

3.2 PG COMPILER

3.3 OpenMP

3.4 PVM

3.5 NETCDF

3.6 NCARG

4. 추가적인 기술들

4.1 PXE

4.2 Channel Bonding

4.3 MON

4.4 MOSIX

4.5 M-VIA

4.6 MYRINET

4.7 BPROC

5. 참고 자료

6. Benchmark

6.1 H/W 성능에 따른 성능 비교

6.2 Network 속도에 따른 성능 비교

1. H/W Setting

1.1 Master Node Bios Setting

* Bios setting

[Advanced]

Keyboard Configuration

--> Keyboard Error : Ignore Error

[Boot]

Removable Devices

HDD <-- Master이므로 HDD로 부팅하는 것이 정상.

MBA UNDI (Bus0 Slot15)

MBA UNDI (Bus0 Slot16)

1.2 Slave Node Bios Setting

* Bios setting

[Advanced]

Keyboard Configuration

--> Keyboard Error : Ignore Error

[Power]

ACPI Enabled : No

Power Savings : Disabled

[Boot]

MBA UNDI (Bus0 Slot15) <-- OnBoard Network Boot사용하기 위해.

1.3 Slave Node Onboard Lancard 부팅 셋팅

* Bios 셋팅이 끝나면 ( Boot가 MBA UNDI인 경우 ) 시스템이 재가동된다. 이때 화면상에 "Control + Alt + B" 가 나오면 그대로 따라 누른다. 이렇게 하면 onboard lancard 붙팅에 관련된 옵션을 셋팅 할 수 있는 창이 뜬다. 이때 다음을 수정한다.

Boot Method : TCP/IP

Protocol : DHCP (우리가 주로 DHCP를 사용할 것이므로 )

Config message : Enabled

Message Timeout : 3 seconds

Boot Failure Prompt : Wait for time out

Boot Failure : Reboot ( 실패하게되면 시스템을 자동으로 재가동하게 하기위해)

F10을 눌러서 저장하고 나온다.

2. Clustering

2.1 Clustering에 필요한 package

DHCP

dhcp-common

dhcp-server

dhcp-client

TFTP

tftp

tftp-server

tftpboot-script

adcn

sdct

Etherboot

mknbi ( etherboot )

imggen ( Onboard Lancard rom boot )

RSH

rsh-server

rsh

NIS

ypbind

yp-tools

ypserv

mawk (이 패키지가 없으면 make를 하여도 ypcat하면 자료가 나오지 않는다. make할 때 조금 문제가 발생한다. mawk대체 품은 awk이다.

(Makefile에서 수정해 주면 됨))

CHANNEL BONDING

2.4.x부터는 kernel에 포함되어 있으므로 kernel컴파일시 channel bonding을 모듈로 켜놓으면 됨.

2.2 Master node Setting

2.2.1 HDD partitioning

Diskless로 클러스터를 구성하면 hard link를 해야 경우가 있다. 그런데 hard-link는 동일한 파티션내에서는 문제가 되지 않지만 다른 파티션 사이에서는 하드링크를 걸 수가 없기 때문에 node수만큼 필요한 공간을 사용하기 위해 root(/)를 크게 하고 그곳에 node용 NFS-root 영역을 잡는 것이다. 따라서 추가되는 노드수에 대비하여 충분히 크게 잡아주는 것이 좋다.

/ : node수에 맞게 적당히 ( node당 ( 150MB ~ ) 200MB정도 계산함 )

/usr : 15G정도 ( 많은 소프트웨어 깔므로... )

/home : User Data용

2.2.2 TFTP setting

/etc/xinetd.d/tftp 파일을 vi로 열어서 'disable = yes'로 된 부분을 'disable = no' 로 바꿔주면된다. 만약에 수동으로 하고 싶지 않다면 redhat 계열 linux같은 경우에는 setup 명령을, mandrake linux같은 경우에는 ntsysv 명령을 통하여 service중 tftp를 체크해 주면 된다. 이 tftp 셋팅은 rpm 패키지를 설치한 후에 서비스를 가동시켜주기만 하면 된다. 이유는 dhcp 또는 bootp서버를 이용할 때 TFTP는 kernel전송용 FTP 역할만 하기 때문에 별도로 고려해야 할 것이 없다. TFTP를 가동할 때는 /etc/rc.d/init.d/xinetd restart를 해주면 된다. (오래된 배포판은 /etc/rc.d/init.d/inet restart )

( 사용자인증과정 없이 서버에 지정된 위치의 파일을 요구하면, 파일을 전송해 주

는 방식. 보안은 취약하지만 아주 기본적인 파일 전송만 하면 될 때 많이 쓰임.

주로 네트워크 장비들의 펌웨어 등을 업그레이드할 때 많이 사용되어짐.)

TFTP 서버는 기본적으로 /tftpboot 디렉토리를 기본 디렉토리로 사용한다. 만약에 이 디렉토리를 사용하고 싶지 않다면 kernel source에서 /tftpboot로 된 것을 찾아 수정한 후에 kernel을 컴파일 할 경우에는 자신이 바꾼 디렉토리가 tftp서버의 기본 디렉토리가 된다.

sdct나 adcn을 돌리기전에 master node설정을 끝내고 sdct를 돌린다. 그리고 나서 /tftpboot/Template 설정이 끝나면 adcn을 돌리면 된다.

sdct를 돌리기 전에 /tftpboot가 있다면 문제가 되므로 /tftpboot 디렉토리를 지운 후에 sdct를 돌리면 된다.

2.2.3 DHCP setting

Diskless를 사용하는 것은 관리상 편리함이 가장 우선이고 또한 Hard disk의 가격부담을 줄이는 장점도 있다. 이 문서에서는 계산 전용 Cluster를 위주로 하여 설명하기 때문에 CPU자원을 최우선으로 고려하며 또한 문제 발생시 쉽게 CPU용 컴퓨터만 간편하게 재부팅해도 하여도 kernel이나 file system이 손상되는 등의 문제가 발생하지 않으므로 중요한 fileserver만 관리하면 되기 때문에 관리 및 유지상 장점이 있다. 이 문서에서는 diskless Clsuter를 만들기 위해서 사용하는 방법이 DHCP 또는 BOOTP 기능을 활용 수 있도록 다루었다. 그러나 BOOTP는 고전적인 방법이고 DHCP를 사용하는 것이 편리하여 BOOTP에 대해서는 환경 설정 파일만 간략히 설명하고 여기서는 DHCP를 중심으로 설명을 하였다.

[DHCP]

/etc에 있는 dhcpd.conf파일을 수정하고 나서 /etc/rc3.d/S*dhcp를 설정하여 부팅시에 자동으로 DHCP daemon이 가동되도록 설정하면 된다. 물론 이것 역시 /etc/dhcpd.conf 파일을 수정한 후에 간단하게 redhat 계열 linux에서는 setup명령으로 설정하고, mandrake linux에서는 ntsysv명령으로 dhcp service를 설정할 수가 있다.

실제 Node간에는 사설 IP로 설정하여 연산에만 사용할 수 있도록 하고 master node에만 접속 가능한 IP를 설정하는 예제이다. (사설 IP: 10.1.10.x/접속용 IP: 210.200.100.x라고 하자)

------------------------/etc/dhcpd.conf---------------------------------------

not authoritative;

#ddns-update-style none;

#log (info, concat ( "VCI: " , option vendor-class-identifier ) );

shared-network expo {

subnet 10.1.10.0 netmask 255.255.255.0 {

}

subnet 210.200.100.111 netmask 255.255.255.255 {

}

}

group {

default-lease-time 21600;

max-lease-time 21600;

use-host-decl-names on;

option domain-name "kma.go.kr";

option subnet-mask 255.255.255.0;

option broadcast-address 10.1.10.255;

option routers 10.1.10.10;

option domain-name-servers xxx.xx.xx.x;

option nis-domain "expo";

option nis-servers 10.1.10.10;

option log-servers 10.1.10.10;

option tftp-server-name "expo";

server-name "expo";

host expo1 {

hardware ethernet 00:E0:81:03:6E:27;

fixed-address 10.1.10.11;

option root-path "/tftpboot/10.1.10.11";

next-server 10.1.10.10;

filename "/10.1.10.11/boot/bzImage.mba";

}

host expo2 {

hardware ethernet 00:E0:81:03:6D:09;

fixed-address 10.1.10.12;

option root-path "/tftpboot/10.1.10.12";

next-server 10.1.10.10;

filename "/10.1.10.12/boot/bzImage.mba";

}

..........................................

host expo8 {

hardware ethernet 00:E0:81:03:6C:65;

fixed-address 10.1.10.18;

option root-path "/tftpboot/10.1.10.18";

next-server 10.1.10.10;

filename "/10.1.10.18/boot/bzImage.mba";

}

}

---------------------------------------------------------------------

option domain-name은 이 master node가 속해있는 domain name을 적어주면 된다. option subnet-mask에는 Cluster간 통신할 네트워크 Class를 C Class로 설정하였다. option broadcast-address는 Cluster간 통신할 네트워크 broadcast영역을 설정해준다. option routers는 Cluster의 master node의 Cluster IP를 써주면 된다. Cluster의 모든 통신은 Master node로부터 이루어지기 때문이다. option domain-name-servers는 이 cluster의 hostname을 등록해 dns서비스를 하는 서버의 IP를 적어주면 된다. option nis-domain은 master node에서 NIS를 통해 각 연산노드들의 계정을 일괄 관리하기 위해 NIS 기능을 사용하는데 이때 NIS서버가 역시 Master Node가 되므로 master node hostname을 써주면 된다. 물론 별도로 관리한다면 용도에 맞게 적어주면 된다. option nis-servers는 NIS서버의 hostname대신 IP를 써주면 된다.

option log-servers는 모든 node의 log내용을 master node에 쌓아두기 위해 설정하는 것이다. 그 이유는 각 node는 disk가 없기 때문이고 또한 관리를 편리하게 하기 위해서이기도 하다.

option tftp-server-name은 tftp로 각 노드의 kernel을 제공할 서버를 써주면 된다. 물론, master node가 각 node의 모든 kernel을 가지고 있고 또한 제공하기 때문에 master node의 hostname을 썼다. server-name는 master node의 hostname을 써주면 된다.

그리고 group안에 있는 host는 각 node의 hostname을 써주면 된다. 즉, 이 DHCP서버가 각 node의 lancard의 macaddress를 참조하여 hostname과 IP를 자동으로 그 host에 제공하게 된다. hardware ethernet은 slave node의 lancard macaddress를 적어주면 된다. 이 값은 etherboot용 floppy를 만들어 부팅 시켜 보거나 lancard driver flopy에 있는 utility를 활용하거나 windows에서 네트웍이 연결된 상태에서 command창을 띄워 netstat -nr 명령을 통하여 알아낼 수 있다. 기타 arpwatch등의 많은 방법을 통하여 알아낼 수 있다. fixed-address는 이 host가 받을 IP이다. 즉, expo1이라는 hostname을 받은 slave node는 10.1.10.11의 IP를 자동으로 부여받게 된다. option root-path은 tftpboot로부터 받아오는 root위치를 알려준다. next-server는 DHCP 서버를 제공하는 master node의 IP를 적어주면 된다. filename은 tftp로 갖고 갈 slave node의 kernel image의 위치를 적어주면 된다. 이런 방식으로 필요한 만큼의 node를 셋팅 하여 주면 된다.

이런 셋팅이 끝나면 /etc/rc.d/init.d/dhcpd restart명령을 통하여 dhcp 데몬을 재가동해주면 된다.

[BOOTP]

이는 /etc/bootptab또는 /etc/bootparams파일이 설정파일이다. 예를 아래에 들었다.

-------------------/etc/bootptab----------------------

global:sm=255.255.255.0:ds=172.16.24.1:gw=172.16.24.1:ht=ethernet:bf=bzImage.new:dn=cep.re.kr:sa=172.16.24.1:

test1:td=/tftpboot:hd=/172.16.24.2/boot:tc=global:ha=0050FC4F0EE3:ip=172.16.24.2:rp=/tftpboot/172.16.24.2:

test2:td=/tftpboot:hd=/172.16.24.3/boot:tc=global:ha=0050FC4F0AED:ip=172.16.24.3:rp=/tftpboot/172.16.24.3:

----------------------------------------------------

여기서 global아래에 적은 것은 모든 연산 노드들에서 공통적으로 사용될 내용임.

sm : sub netmask

ds : DNS서버 IP

gw : gateway IP

df : 부팅할 cluster client node kernel image file name

dn : cluster domain name

sa : tftp서버의 IP주소 ( 대게 cluster master node에 설정하므로 master node IP를 씀)

그리고 각 cluster client node들의 hostname을 시작으로 해서 각 node들의 환경을 셋팅 해 줌.

td : secure TFTP서버에서 사용되는 TFTP의 기본 디렉토리

hd : td와 같이 사용되어 커널 파일의 전체디렉토리 경로임. (TFTP는 td:hd디렉토리를 boot kernel 디렉토리로 인식하므로 /tftpboot/172.16.24.2/boot의 위치가 boot kernel이 있는 위치로 알게 됨.)

tc : global환경을 모두 포함하라는 의미임.

ha : cluster client node lancard hardware address (mac address)

ip : cluster client node IP

rp : cluster client node의 루트 파일시스템으로 마운트할 디렉토리 위치.

필요한 node들은 이렇게 test1, test2, test3, ...로 계속 적어주면 된다.

이렇게 설정이 끝났으면 bootp daemon을 가동시켜주면 된다.

2.2.4 NIS setting

NIS는 여러 host의 계정 관리할 때 매우 편리한 기능이다. 같은 계정을 여러 호스트에 발급하고 또한 관리하기 위해서 매번 여러 호스트에 접속하여 계정 관리를 하고 또한 패스워드도 각 호스트에서 모두 바꾸는 불편함 없이 한 호스트에서만 계정을 발급하고 또한 어떠한 호스트이던 간에 필요할 때 패스워드를 바꾸면 NIS로 묶여 있는 모든 host들의 계정 정보 및 password가 동시에 수정해 준다. 이 기능은 관리자에게 매우 매력적이고 편리한 기능이다. 물론 cluster에서도 각 node에서 연산역할만 하지만 프로그램이 수행되기 위해서는 각 node에 동일한 계정이 있어야 하며, 또한 동일한 계정 정보를 가지고 있어야 하므로 이곳에서 또한 NIS기능을 활용한다. 우선 /etc/yp.conf파일에 NIS정보를 추가해준다.

-----------------/etc/yp.conf-------------

domain expo server 10.1.10.10 <----------- 추가내용

----------------------------------------------------

domain expo server expo로 사용하여도 된다. 그러나 server뒤에 hostname을 쓰기 위해서는 DNS서버에 이 host에 대해 등록되어 있어야만 가능하다. 그렇기 때문에 DNS에 등록되진 않은 경우에는 직접 IP를 적어주어도 된다. IP를 적을 때에는 Cluster 내부에서만 인식할 것이므로 Cluster용 사설 IP를 사용하면 된다.

ypbind 데몬을 돌리기 위해서는 /etc/sysconfig/network 파일에 NIS서버를 설정해줘야만 NIS서버를 정상적으로 작동하게 된다.

---------------/etc/sysconfig/network--------------

NETWORKING=yes

FORWARD_IPV4=yes

HOSTNAME=expo

DOMAINNAME=kma.go.kr

NISDOMAIN=expo <---- NIS를 사용하기위해 추가

GATEWAY=190.1.40.1

GATEWAYDEV=eth3

--------------------------------------------

정보를 찾을 때 /etc/hosts파일에서 찾고 또한 DNS서버에서 찾게 설정되어 있다. 그러나 NIS를 사용하게 되면 네트워크 상에서 NIS서버에서 정보를 찾아야 하므로 다음처럼 /etc/host.conf 파일에 nis를 추가해준다.

-----------/etc/host.conf---------------

order hosts,bind,nis <---- nis 추가

multi on

------------------------------------

여기까지 되었다면 yp의 master를 현재 host에 설정하기 위해 다음 명령을 실행해준다.

/usr/lib/yp/ypinit -m

이것을 실행하게 되면 필요한 정보 등을 갖고 와서 yp용 DB파일을 /var/yp 디렉토리 하에 만들게 된다. 그리고 yp는 보안상 약간의 문제가 될 수 있으므로 다음처럼 yp기능을 제공한 네트웍 범위를 지정해줘야 한다.

--------------/var/yp/securenets----------------

255.0.0.0 127.0.0.0

255.255.255.0 10.1.10.0

255.255.255.255 xxx.xxx.xxx.xx

---------------------------------------------

yp관련 server가 잘 설정되었는지 확인하기 위해 /var/yp/ypservers 파일을 열어본다. yp server의 hostname으로 잘 되어 있다면 ypwhich 명령으로 ypserver를 한번 더 검색해본다. 물론 같이 잘 나온다면 yp설정이 정상적으로 된 것으로 생각하면 된다.

--------/var/yp/ypservers-----

expo

----------------------------

{NIS계정 추가하기}

NIS용 계정을 추가하기 위해서 /etc/passwd 아래에 +:*:0:0:::를 추가하고 그 아래에 계정을 일반적으로 수동으로 추가하듯이 추가하여 주면 된다.

이렇게 계정을 추가한 후에 (+:*:0:0::: 아래에다가) /var/yp 아래에서 make명령을 실행시켜주면 자동으로 계정이 yp db에 등록되게 된다. 한가지 TIP은 yp계정 한계선(+:*:0:0:::)위에 발급된 계정은 그 host에만 적용되며 (NIS로 적용 안됨.) 또한 그 host내에서는 NIS 계정보다 일반계정이 우선권이 있다. 그래서 NIS 계정과 일반계정이 같은 것이 있는 경우에는 그 host에서만은 일반계정이 우선적으로 설정한 내용이 적용된다. 물론 다른 NIS로 묶인 host에서는 NIS정보에 의해 적용된다.

yp그룹은 /etc/group 파일에 +:*:0:를 추가하고 아래에 마찬가지로 추가해주면 된다.

계정 발급 후에는 항상 /var/yp에서 make 명령을 한번씩 돌려주는 것을 잊어서는 안 된다. 이렇게 모든 것이 되었다 싶으면 yp 데몬을 한번 재 가동시켜준 후에 ypcat passwd 명령을 하였을 때 NIS용 계정 발급된 내용이 잘 보이면 NIS는 성공한 것으로 생각하면 된다. 그런데 한가지 yp 데몬들에 대해서는 잘 설정되었으나 ypcat으로 정보가 보이지 않는 경우에는 mawk 패키지가 깔려 있지 않은 경우이다. 그러니 mawk 패키지를 깔아주고 나서 /var/yp에서 make명령를 돌려주면 다시 db가 갱신되어 잘된다. mawk가 없는 경우에는 awk로 대체할 수가 있으므로 /var/yp/Makefile를 열어서 mawk로 된 것을 awk로 수정하여 실행하면 된다.

개인이 패스워드 바꿀 때는 yppasswd 명령을 이용하면 됨.

NIS Client에서 NIS 정보를 만들기 (yp관련 server 설정하기)

/usr/lib/yp/ypinit -s expo

여기서 expo는 NIS 서버 hostname이다.

2.2.5 RSH setting

rsh는 remote shell의 약자로 telnet처럼 login ID와 password를 이용하여 접속하여 사용하는 것이 아니라 ID와 패스워드 없이 다른 host로 쉬게 이동하거나 명령을 직접 실행가능 하게 해준다. 많은 컴퓨터를 관리할 때는 매우 편리하나 조금 보안상 문제가 발생할 수 있다. rsh를 일반사용자들이 사용하기 위해 설정해보자. /etc/hosts.equiv파일에 다음처럼 각 node의 모든 host이름을 적어주자. 만약에 한 host가 2개 이상의 네트워크를 사용하기 위해 2개 이상의 hostname을 갖고 있다면 모든 hostname으로의 network에서 rsh가 가능하게 하기 위해 모두 추가해줘야 한다.

------------/etc/hosts.equiv---------------

localhost

expo

expo1

...

expo8

exp <-- 이 아래는 channel bonding용으로도 rsh를 사용할 수 있도록 하기 위해

exp1

...

exp8

---------------------------

rsh의 보안 및 사용할 기능과 root사용자를 위해 다음처럼 /etc/securetty파일에 내용을 추가해준다.

-------------/etc/securetty----------------

rexec

rlogin

rsh

root@localhost

root@expo

root@expo1

....

root@expo8

-------------------------------------------

또한 root사용자가 rsh를 사용할 때 remote 명령이 안 되는 것을 풀기 위해 다음처럼 내용을 주석 처리해 준다.

------------/etc/pam.d/rsh-----------------

auth required /lib/security/pam_nologin.so

auth required /lib/security/pam_rhosts_auth.so hosts_equiv_rootok

----------------------------------------------

rexec기능을 root도 가능하게 하기 위해 다음처럼 파일에 내용을 추가해준다.

-------------------/etc/pam.d/rexec---------------

.....

auth sufficient /lib/security/pam_rhosts_auth.so hosts_equiv_rootok

...

-------------------------------------------------

rlogin를 root가 사용가능 하게 하기 위해 다음처럼 내용을 추가해준다.

-----------------/etc/pam.d/rlogin-----------------

...

auth sufficient /lib/security/pam_rhosts_auth.so hosts_equiv_rootok

...

---------------------------------------

마지막으로 /root디렉토리에 .rhosts파일을 만들어 준다.

--------------------/root/.rhosts---------------

localhost

expo

expo1

...

expo8

exp

exp1

...

exp8

---------------------------------

2.2.6 syslog

syslog는 각 node마다 각기 쌓이게 되면 관리하기가 불편하다 또한 각 node들이 disk가 없으므로 master node에 모든 log를 쌓는 것이 편리하다. 그렇게 하기 위해 다음처럼 설정하자.

-----------/etc/sysconfig/syslog--------------

SYSLOGD_OPTIONS="-r -m 0" <--- -r 옵션 추가

---------------------------------------------------

-r 옵션은 remote host에서 log정보를 보낼 경우, 받아서 자신의 log파일에 저장하겠다는 것이다. 이렇게 master node에 이것을 설정하고 slave node에 /etc/syslog.conf 에 내용을 master node로 보내게 하면 master node의 log파일에 모든 slave노드의 log까지 들어가므로 하나의 파일만 살펴보면 모든 node의 log를 볼 수 있게 된다.

slave node에서는 다음처럼 파일을 수정해주면 설정된 node로 모든 log내용이 전송된다. 그러므로 slave설정할 때 설정해주면 된다. 물론 adcn를 돌리게 되면 자동으로 master node로 log가 쌓이도록 자동 설정된다.

----------------- /tftpboot/Template/etc/syslog.conf------------------

*.* @expo

-----------------------------------------------------------------

2.2.7 /etc setting

각 node에 대한 cluster용 ip를 설정해준다. 대부분 정보가 hostname으로 사용되기 때문에 hosts파일에 다음처럼 설정해주면 된다.

-------------/etc/hosts--------------------

127.0.0.1 localhost.localdomain localhost

210.200.100.111 expo expo.kma.go.kr

# Cluster

10.1.10.10 expo

10.1.10.11 expo1

........ ...

10.1.10.18 expo8

# Bonding

10.1.100.10 exp exp0

10.1.100.11 exp1

..... ...

10.1.100.18 exp8

--------------------------------------------

/etc/ethers파일은 정확히(??) 뭐에 필요한건지는 모르겠지만 각 node의 lancard macaddress와 각 host의 hostname을 mapping시켜주는 파일이므로 아래 형식처럼 써주면 된다.

/etc/exports파일은 일부러 수정해줄 필요는 없다. 이유는 adcn을 돌리게되면 자동으로 /etc/exports파일이 수정되기 때문이다. 그러나 이 파일은 혹시라도 잘못 된 경우를 대비해서 참조하기 위해 적어둔다.

------------------/etc/exports----------------------

/tftpboot/10.1.10.11 expo1(rw,no_all_squash,no_root_squash,no_subtree_check)

/usr expo1(ro,no_all_squash,no_root_squash,no_subtree_check)

.... ...

--------------------------------------------------------

마지막으로 kernel 및 ip performance 등에 관련된 환경설정 파일이다.

-------------------------/etc/sysctl.conf---------------

net.ipv4.ip_forward = 1

net.core.rmem_default = 262144

net.core.rmem_max = 262144

net.core.wmem_default = 262144

net.core.wmem_max = 262144

#

sys.fs.file-max = 16384

-------------------------------------------------------

2.2.8 kernel setting

kernel을 컴파일 하기 전에 Makefile을 열어서 다음을 수정해준다.

----------/usr/src/linux/Makefile----------------

EXTRAVERSION =-2

--------------------------------------------

이 내용은 kernel compile후에 module를 컴파일 한 후에 module install시 module이 kernel-version-num뒤에 extraversion 이 들어가므로 module들이 서로 꼬이지 않아 좋다. 또한 kernel 적용 버전이 될 수도 있어 편리하다. 이 부분을 잘 활용하면 된다.

master용 kernel setting에 있어 나머지는 각 시스템에 맞게 각자 관리자의 목적에 맞게 설정하면 된다. 그러나 아래의 셋팅은 master node에 있어 꼭 필요한 정보이므로 아래 내용만큼은 꼭 넣어야 하며 나머지는 각 시스템에 맞게 설정해주면 된다.

------------------------------------------------------------------

Code maturity level options

--> Prompt for development and/or incomplete code/drivers --- y

File System

--> Kernel automounter support ---- y

--> Kernel automounter version 4 support (also support v3) ---- y

--> Network File System

--> NFS file system ---- y

--> Provide NFSv3 client support ---- y

--> NFS server support ---- y

--> Provide NFSv3 server support ---- y

--------------------------------------------------------------------

( USB Mouse가 필요한 경우에는 다음 부분을 살펴보면된다.

Input core support

--> mouse support --- y

USB support

--> USB Human Interface Devices (HID)

--> USB HIDBP Mouse (basic) support --- y )

설정이 끝났으면 Save configuration to An Alternate File을 이용하여 master node kernel setting값을 저장해둔다. 그래야 나중에 조금 설정 값을 바꿀 때 이 값을 불러들여서 수정하면 편리하기 때문이다. 이제 설정이 끝났으므로 컴파일을 해야 한다. 컴파일을 하기 위해서는 다음처럼 명령을 이용하면 된다.

make dep; make clean; make bzImage; make modules; make modules_install

위의 명령어를 이용하여 master node kernel을 compile하고 또한 module들을 컴파일하고 module들을 인스톨한다.

+ linux kernel setting 및 lilo 설정.

cp /usr/src/linux/arch/i386/boot/bzImage /boot

cp /usr/src/linux/System.map /boot/System.map-kernel.version.num-EXTRAVERSION

vi /etc/lilo.conf을 해서 아래처럼 master node kernel 부팅을 추가해준다.

-------------------------

image=/boot/bzImage

label=master

root=/dev/hda5 ( / partition )

read-only

-------------------------

lilo 명령을 이용하여 kernel setting한 것을 boot roader에 적용한다.

2.3 Slave node Setting

2.3.1 sdct

sdct는 /tftpboot/Template라는 디렉토리에 master node의 root partition에 있는 내용들을 hard link로 만들어주는 역할을 한다. /tftpboot/Template가 모든 컴퓨팅 노드의 구성을 변경하는 곳이 된다. 이곳의 파일이 바뀌면 앞으로 만들게 될 다른 cluster client node들의 파일도 전부 바뀌게 된다. /tftpboot/Template ( Master node root ), /tftpboot/IPs ( Cluster client node root )가되는 것이다. 그렇기 때문에 /tftpboot/Template 디렉토리 아래에 있는 파일을 자신의 클러스터에 맞게 변경하면 된다.

sdct -s 10.1.10.10

그러나 이것은 초기버전 에서는 조금 수정해야 할 부분이 많다. 그래서 필자가 수정한 파일을 이용하여 주면 조금은 더 편리하다.

sdct -N 10.1.10.10 -P /usr/local/src/cluster/bin [ -s 10.1.10.10 ]

여기서 -N은 NFS-ROOT서버의 IP주소를 써주면 되고 또한 -P 뒤에는 기타 환경 설정용 파일이 존재하는 위치를 적어줌. -s 뒤에는 master node의 IP를 써주면 됨. -s 부분은 굳이 적지 않아도 자동으로 찾아 적힌다. 필자가 수정한 sdct파일은 다음 파일도 필요 한다. sdct.ext.fstab 이 파일은 fstab을 만들어주는데 있어 부수적으로 더 필요한 설정이 들어가 있는 파일이다.

2.3.2 /tftpboot/Template

이 위치에서는 etc/rc0.d와 etc/rc3.d 그리고 etc/rc6.d 디렉토리의 실행순서 등을 만들고 불필요한 파일은 삭제를 해줘야한다. 만약에 XWindows를 사용한다면 etc/rc5.d를 사용하게 될 것이다. 이 부분은 slave하나를 셋팅해 놓고 켜보면서 뜨는 message를 보면서 파일순서 또는 필요 없는 데몬을 삭제하면 된다.

/etc/rc.d/init.d/netfs의 시작순서가 /etc/rc.d/init.d/network 다음에 오도록 수정한다.

/etc/rc.d/rc3.d/S10network와 /etc/rc.d/rc3.d/S11netfs로 만들어준다.

/etc/rc.d/rc2.d/K10netfs와 K20network는 가장 큰 숫자로 바꿔준다.

한가지 /etc/init.d/killall과 halt란 파일을 수정하지 않으면 재부팅 및 shutdown시 killall process이후에 멈추는 문제가 생긴다.

                  2.3.3 slave node kernel

물론 이것 역시 /usr/src/linux/Makefile을 vi로 열어서

----------/usr/src/linux/Makefile----------------

EXTRAVERSION =-2

--------------------------------------------

이 부분을 수정해준 후에 다음 작업을 해주는 것이 좋다.

master용 kernel configure를 불러들인다. 그리고 나서 다음 항목을 수정한다.

------------------------------------------------------

Networking Options

--> IP: kernel level autoconfiguration

--> IP: BOOTP support ---- y

File system

--> Network File System

--> Root file system on NFS ------ y

----------------------------------------------------

그러나 slave용 node에서는 NFS-ROOT용으로 사용할 Network card는 kernel속에 직접 넣어야 한다. 그래야만 kernel을 tftp로 갖고 가서 kernel을 load하면서 network이 구성될 수가 있기 때문이다. 이렇게 하지 않으면 network용 module을 올리기전에 NFS-ROOT가 올라오지 않아서 문제가 되기 때문이다. 그리고 나서 다음처럼 커널을 컴파일 해준다.

참고로 vmware를 사용할 경우 vmware용 렌카드는 lancepci.lzrom(또는 amdhomepna.lzrom)을 사용하면 된다.

Network device support

--> Ethernet (10 or 100Mbit)

--> AMD LANCE and PCnet (AT1500 and NE2100) support ---y

accton lancard는 tulip driver를 사용한다. tulip driver는

Network device support

--> Ethernet (10 or 100Mbit)

--> EISA, VLB, PCI and on board controllers

--> DECchip Tulip (dc2114x) PCI support ---y

make dep; make clean; make bzImage

명령을 이용하여 커널을 컴파일 한다.

이제 컴파일이 끝난 후에 bzImage와 System.map파일을 /tftpboot/Template/boot에 카피해 놓자. 그리고 나서 etherboot용 kernel로 만들기 위해서 만들어진 kernel을 조금 수정해야 한다. 먼저 etherboot용 프로그램을 컴파일 해놓고 다음처럼 프로그램으로 수정해주면 된다.

mknbi 프로그램을 이용하여 network boot가 가능하게 kernel image시작부분에 코드를 추가해준다. 그리고 바뀐 kernel image와 System.map파일이 /tftpboot/Template/boot에 존재해 있게 해주면 된다.

mknbi와 etherboot파일은 http://etherboot.sourceforge.net/ 또는 http://etherboot.sourceforge.net/distribution.html 이곳에서 다운받을 수 있다.

mknbi --format=elf --target=linux --output=bzImage.new --ip=dhcp bzImage

--format : nbi로 하면 커널 로딩을 못한다. elf로 하여야 한다.

--target : linux에서 사용할것이므로 linux로 한다.

--output : kernel image를 변경후 저장할 파일명이다.

--ip : dhcp데몬을 사용할 것이면 dhcp bootp를 사용할 것이면 bootp를 씀.

만약에 etherboot가 아닌 onboard용 lancard를 이용한 rom 부팅을 한다면 다음 프로그램을 이용하여야 하며 이용법은 다음과 같다.

/usr/local/sbin/imggen -a bzImage.nbi bzImage.mba

그러나 mknbi를 먼저 실행한 후에 mknbi를 수행한 kernel image파일을 같고 위처럼 바꾸기 때문에 mknbi역시 꼭 필요한 것이다.

diskless cluster node로 부팅하기 위한 부팅 디스크 만들기를 만들어 보자. 이것은 부팅 image와 간략한 lancard정보만 들어 있는 아주 작은 image파일이다.

ehterboot는 gcc 2.96에서는 컴파일이 되지 않는다. 2.95이하 또는 3.0이상에서만 컴파일이 된다. 한가지 문제점은 컴파일이 잘되고 부팅 이미지 만들어 부팅하면 부팅이 잘되어 찾기는 하지만 찾는 중으로 멈춰 있으면 다음 3가지를 점검하자.

a) cable 연결상태 확인.

b) dhcp 또는 bootp 설정상태.

c) nds상태

e) 컴파일은 되었지만 잘못 컴파일 된 경우 ( 이때는 kgcc 로 컴파일해보자 ).

etherboot는 src디렉토리의 Config 파일이 bootp로 할지 dhcp로 할지 결정하는 옵션 등이 있다. 적당히 수정한다.

make; make bin/boot1a.bin

명령으로 컴파일을 한다.

boot1a.bin은 부팅 image인데 이것은 위처럼 make 명령을 따로 줘야 한다.

cat bin/boot1a.bin bin32/xxx.lzrom > /dev/fd0

명령으로 부팅 이미지를 floppy디스크에 넣는다. 여기서 xxx.lzrom은 cluster client node 컴퓨터에 붙어 있는 렌카드에 맞는 image파일이다.

2.3.4 adcn을 이용한 slave node 추가

adcn을 사용하여 cluster client node의 루트 파티션 설정하기.

이 파일은 각 client node들의 root partition을 잡을 때 사용하는 스크립트로, 필요한 정보는 각 노드의 IP주소, 각종 네트워크 정보, 그리고 그 노드에 있는 Lan card의 하드웨어 주소 등으로 되어 있다.( 하드웨어 주소는 16진수 6자리 숫자로 된 것으로 세계에서 그 렌카드의 하드웨어 주소는 오직 하나임. ) 자세한 설명을 “adcn -h“ 로 살펴보면됨. adcn을 사용하기 전에 아래의 cluster client node 설정하는 부분을 보고 client node용 kernel image를 만들어두고 adcn을 사용하면 편리하다.

adcn -i 10.1.10.12 -c cpu1 -d cep.re.kr -D eth0 -n 255.255.255.0 -s 10.1.10.10 -N 10.1.10.0 -g 10.1.10.10 -b 10.1.10.255 -m 00:D0:80:10:DC:70 -f

-i : 해당 컴퓨터의 cluster client node IP주소임.

-c : 해당 컴퓨터의 cluster client node의 host name임.

-d : 현재 cluster의 domain name이됨.

-D : cluster client node에사 사용될 Lancard의 interface이름을 써주면됨. (lancard가 하나이면 기본적으로 eth0 임.)

-n : netmask를 써줌.

-s : cluster Master node IP를 써주면 됨.

-N : Network를 써주면됨. ( cluster client node 네트워크 주소가 172.16.24.0가됨 )

-g : Network의 기본 네트웍 gateway 주소임.

-b : broadcast용 IP주소.

-m : cluster client node의 Lancard hardware address( Mac address )

adcn을 사용하면 /etc/hosts와 /etc/exports(NFS서버에 필요함) 그리고 /etc/fstab파일도 자동으로 각 node들에 맞게 수정됨.

이 과정은 루트파일시스템을 NFS로 접근하게 만드는 과정이다. (/usr/src/linux/Documentation/nfsroot.txt 참조)

이 내용 역시 손본 것이 많기 때문에 필자가 수정한 것을 사용하면 조금 더 편리하게 수정할 수 있다.

필자가 수정한 adct에는 -M 옵션과 -P 옵션이 있다. 여기서 -M옵션은 NIS 서버의 hostname을 써주면 되고, -P는 기타 부수적인 환경설정 파일이 존재하는 위치를 써주면 된다. 그리고 한번에 여러개의 slave를 만들기 위해서는 여러번 실행하려면 매우 불편할 것이다. 그래서 다음처럼 해보자.

---- slave라는 실행 파일을 하나 만들고 내용을 추가하자.----------------

#!/bin/bash

for AA in $(cat node) ; do

./adcn -i 10.1.10.1$AA -c cpu$AA -M cpu0 -P /usr/local/src/cluster/bin -d cep.re

.kr -D eth0 -n 255.255.255.0 -s 10.1.10.10 -N 10.1.10.0 -g 10.1.10.10 -b 10.1.10

.255 -m 00:50:FC:4F:0E:E3 -f

done

----------------------------------------------------------------

그리고 node라는 파일을 하나 만들어 node의 번호들을 죽 적어 둔 후 slave라는 파일을 실행시키면 각 노드의 slave를 adcn를 실행시켜줄 것이다.

물론 필자가 수정한 adcn이란 파일은 adcn.ext.exports란 파일이 필요하며 이 파일은 추가적으로 exportfs시키는 정보가 들어가는 파일이다.

2.3.5 test node debug

우선 한 개의 slave node를 만들어서 계속 부팅 해가며 문제점을 모두 잡은 후에 모두 문제가 해결되면 나머지 node에 대해서 만들어 주면 cluster완성되는 것이다.

만약에 cluster 이후 rsh에서 명령어가 안될 때 다음을 채크해보자.

/dev/console 파일의 퍼미션이 644로 안되어 있는 경우가 있다. 이런 경우 rsh로 login은 되어도 명령어가 실행되지 (rsh cpu1 ls) 않는 경우가 있다. 이럴 때는 chmod 644 /dev/console 해주면 된다.

가끔 keyboard가 이상할 경우 tset 과 reset 명령을 내려본다. 그러면 이상하던 keyboard가 정상으로 돌아온다.

3. 필요한 소프트웨어 설치

3.1 MPICH

mpirun -v -machinefile machine.cluster.node -nolocal -np 8 mm5.mpp.mpich

여기서 -nolocal 이던가 -nolocalhost이던가??를 해주는 것은 현재 돌리는 node에서는 계산을 하지말고 machine.cluster.node파일에 나열한 node hostname들에서만 계산작업을 하게 하는 것이다.

3.2 PG COMPILER

3.3 OpenMP

3.4 PVM

3.5 NETCDF

3.6 NCARG

4. 추가적인 기술들

4.1 PXE

4.2 Channel Bonding

channel bonding은 linux kernel에서 지원하고 H/W적 slot이 지원되는 한도 내에서 개수를 늘릴 수 있다.

channel bonding은 가상 network device를 만들고 (bond0) 그 device에 실제 물리적 device를 붙여서 같은 mac-address와 같은 IP를 같게 만들어준다. bonding시키는 모들 실제 물리적 device를.... 그러나 mac-address는 실제 device중 가장 먼저 bond0에 붙는 것의 mac-address를 가져가서 가상 device인 bond0의 mac-address가 되어 진다. 하나의 IP로의 네트웍이 실제 물리적으로 분리된 network 경로를 통해 네트웍이 분산되어 나가므로 그많큼 네트웍 bandwidth가 넓어지는 것이다. 하나보단 2개일 때 대략적으로 2배의 bandwidth가 넓어졌다.

1. Kernel에서 channel bonding을 y로 해준다.

2. ------/etc/modules.conf------------

alias bond0 bonding

options bond0 miimon=100

---------------------------------

3. /etc/sysconfig/network-scripts/ifcfg-bond0을 만들어주고 내용은 eth0와 비슷하게 IP를 하나 추가한다. 만약에 NFS-ROOT를 사용중이라면 (eth0에서) eth0와 비슷하게 Network Classs가 다르게 잡아준다.

예) 10.1.10.x를 NFS-ROOT로 사용중이라면

bond0 의 IP는 10.1.100.x를 사용해라. 안 그러면 네트워크이 혼동되어서 네투워크이 꼬일 경우도 있다.

4. /etc/rc.d/rc.local 내용추가

------------------------------

/sbin/ifenslave bond0 eth1

/sbin/ifenslave bond0 eth2

------------------------------

4.3 MON

4.4 MOSIX

M-VIA는 네트웍 속도에는 크게 영향을 주지 못하고 단지 네트웍을 심하게 사용하기 위해 CPU가 사용하는 load를 줄여준다. Network을 cpu가 관리하는 것을 lancard가 직접 관리하도록 해주는 프로그램이다. 실제 테스트를 하여보면 Network을 사용하기 위한 CPU load를 50%가까지 줄여준다. 그러므로 CPU는 계산에 더 사용하고, Network 사용에는 더 줄일 수 있다. 한가지 이것을 사용하려면 기존의 lancard용 device는 모듈로 만들어 주거나 아예 없애야 한다. 왜냐면 m-via용 device가 대신해서 module로 떠야하기 때문이다. 이렇기 때문에 NFS-ROOT용으로 사용하는 lancard는 m-via를 사용할 수가 없다. 왜냐면 NFS-ROOT용 lancard device는 kernel에 직접 넣어두어야만 network boot를 통해 NFS-ROOT를 사용할 수가 있기 때문이다.

참조: http://spcc.uos.ac.kr/clustering/mvia.html

- 지원되는 Lancard

DEC Tulp (kernel 2.2 and 2.4에서 지원) : 장시간 가동시 하드웨어 문제 같아 보이는 현상으로 죽어버린다.

Intel pro 10/100 (kernel 2.2 and 2.4에서 지원)

3com (kernel 2.4에서 지원)

Packet Engines GNIC-I gigabit (kernel 2.2.에서 지원)

Packet Engines GNIC-II gigabit (kernel 2.2.에서 지원)

Syskonnet SK-98XXX gigabit (kernel 2.2 and 2.4에서 지원)

- SMP 지원됨.

- Install

Makefile.config 파일에서 Kernel version/ SMP사용여부/ 깔릴 DEVICE Directory 등 수정

-----------------Makefile.config------------------------

# The version of the Linux kernel for which M-VIA is being built.

LINUX_VERSION = 2.4.9-4 <===== 리눅스 커널버전(현재 사용중인 커널의 커널 버전을 써준다. 이유는 나중에 module이 깔리때 들어갈 /lib/module하의 디렉토리를 맞추기위해서이다.

# Set MVIA_SMP to 1 for SMP machines, 0 for uniprocessors.

MVIA_SMP = 1 <== SMP사용여부

# The location of the Linux kernel source.

LINUX_SRC = /usr/src/linux-2.4.9 <== 현재 사용중인 커널의 소스위치

# The directories to install M-VIA user files in.

INCDIR = $(BASEDIR)/include

LIBDIR = $(BASEDIR)/lib

DEVDIR = $(ROOTDIR)/dev <== M-VIA용 디바이스가 설치될 위치 (Master일때와 slave일때의 위치가 다르므로 잘 생각 : 현재 master용)

#DEVDIR = /tftpboot/Template/dev (slave용 위치)

----------------------------------------------------

make후 인스톨하면 다음이 설치된다.

/lib/modules/kernel-version-num/net 하에 설치됨.

공통으로 사용되는 모듈: via_ka.o via_lo.o via_ering.o

각 카드의 모듈들 : via_3c59x.o (3c59x용) via_eepro100.o (intel용) via_tulip.o (DEC용)

/usr/local/lib/libvipl.a

/usr/local/include/vipl.h 가 또 설치되어 진다.

이렇게 설치후 모듈을 module map파일에 등록하기위해

depmod -a kernel-version-num 명령으로 등록시켜준다.

/dev 디렉토리에 필요한 device(via_lo via_eth1 via_eth0 ...)를 만들기위해 다음명령어를 사용한다.

make devices

/etc/modules.conf파일을 수정해준다.

----------modules.conf---------------

alias char-major-60 via_lo

alias eth2 via_eepro100

-----------------------------------

/etc/sysconfig/network-script/ifcfg-eth2를 생성해도 되지만 잘 되지 않는 편이어서 /etc/rc.d/rc.local파일에 ifconfig명령으로 뜨게 해준다.

/etc/vip_hosts파일 생성

------vip_hosts---------

00:03:47:B2:5B:18 exp

00:03:47:B2:22:BF exp1

00:03:47:B2:5B:19 exp2

00:03:47:B2:55:03 exp3

-----------------------

앞에는 각 호스트의 m-via로 사용할 lancard mac-address고 뒤는 host의 hostname이다.

추후에 m-via를 이용하여 channel bonding을 해보면 어떨지??? 아마도 UTP gigabit을 두개정도 사용하면 myrinet정도의 효과가 나오지 않을까?? 생각한다. 가격 대 성능 비에서 좋지 않을까???

한가지 문제점은 M-VIA를 이용하여 네트웍 구성 후 MPI를 사용하기 위해서는 MVICH를 깔아야만 하는데 네트웍 구성을 되었지만 MPI를 사용하기 위한 MVICH가 문제가 있어 잘 깔리지 않는다. 이것만 해결되면 한번 사용해 봄직 할 것 같다.

4.5 M-VIA

4.6 MYRINET

4.7 BPROC

5. 참고 자료

1. diskless node script

ftp://ftp.sci.usq.edu.au/pub/jacek/beowulf-utils/disk-less

2. Root file system over NFS

/usr/src/linux/Documentation/nfsroot.txt

3. Myrinet

http://www.myri.com

4. Etherboot

http://etherboot.sourceforge.net

5. OpenPBS

http://www.openpbs.org

6. MOSIX

http://www.mosix.org

7. MPICH

http://www.mcs.anl.gov/mpi/mpich/index.html

8. OpenMP

http://www.openmp.org

9. PXE

http://www.lanworks.com

10. GFS

http://www.sistina.com/products_gfs.htm

11. PVFS

http://www.parl.clemson.edu/pvfs/index.html

12. spcc.uso.ac.kr 은 각종 벤치마크가 잘되어 있다

+ Recent posts