안녕하세요, 오늘은 개발자에게 없어선 안될 프로그램!ㅋㅋ

시너지의 설정에 대해 알아보겠습니다.

시너지는 소프트웨어적으로 여러대의  PC의 키보드/마우스를 공유시켜주는 프로그램이 되겠습니다.

일단,

윈도우용 시너지 파일을 받아 설치합니다.

최신 사이트 기준으로 http://synergy-foss.org/pm/projects/synergy/tabs/download

접속하여 각자의 PC의 OS에 맞추어 설치합니다.(우리는 윈도우기준으로 파일을 받아 설치하구요-)


 

이러한 화면이 나타날 것입니다.

두번째 블록의  Configure를 누르시구요-


이러한 화면이 나타나는데요, 첫번째 블록의  + 버튼을 눌러. Client와 Server의 이름을 적어줍니다.


아래와 같습니다.

Server(윈도우)쪽 이름은 첫번째 그림의 Option  파트의 advanced의 screen name 과 통일시켜 주셔야 하고,
Client(리눅스)쪽 이름은 실제 리눅스에서 사용되고 있는 Network name(Host name) 으로 설정해주셔야 합니다.

리눅스쪽  Host name 은 네트워크 관리의 DNS 탭에서 확인할 수 있습니다.


설정이 끝나셨으면 다시 이 페이지로 돌아오셔서

이제 모니터의 위치에 따라 윈도우 피씨를 오른쪽으로 쓸것인지~ 리눅스를 왼쪽으로 쓸것인지~ 방향을 정해주게 됩니다. 이정돈 알아서 하시고~ PASS

그다음 초기페이지로 돌아오시구요, start 버튼을 누르셔서 클라이언트의 접속을 기다리게 합니다


다음은 Client(리눅스) 쪽 설정입니다.

리눅스에서는 synergy를 패키지로 제공하기에,

> yum install synergy

 로 간단하게 설치할 수 있습니다.

그 다음 synergyc 본인IP 를 입력하시면

바로 서버로 접속할 수 있습니다.

이로써 시너지의 기본설정을 모두 마쳤습니다.




PS1. 키보드와 마우스를 제공하는 PC가 Windows 방화벽을 사용 중이라면 아래와 같이 접속하려는 PC에서 에러가 발생할 수 있습니다.

사용자 삽입 이미지

이렇게 "connect to server : address not found for: ****" 에러가 발생한다면 키보드와 마우스를 제공하는 PC의 Windows 방화벽에서 "파일 및 프린터 공유"를 체크하시고 적용하십시오.

사용자 삽입 이미지


PS2. 리눅스 로그인 암호 입력전부터 시너지를 활용하고 싶으시다면

/etc/gdm/Init/Default  내용을 조금 수정해주시면 됩니다.

exit 0라고 써있는 곳 위에다가 아래의 스크립트를 적어줍니다.

/usr/bin/killall synergyc
sleep 2
/usr/bin/synergyc 자신의 IP

참고 : http://jwmx.tistory.com/833

'Linux' 카테고리의 다른 글

리눅스(페도라) 네트워크 설정  (1) 2010.12.22
 
LVS

안녕하세요, 오늘은 프로젝트 관련하여 LVS 구축에 대한 이론적인 부분을 기술하도록 하겠습니다.


1. LVS 구축  

가상서버를 구성하는 방안에는 그 방식에 따라 크게 3가지 다른 방법으로 구성할 수가 있습니다. NAT 를 이용하는 방법, IP터널링을 이용하는 방법, 다이렉트 라우팅을 이용하는 방법으로 각각의 장단점을 간단히 알아보도록 하겠습니다.

1). NAT 를 이용하는 방법

NAT(Network Address Translation) 방식은 패킷 내의 IP 주소를 변경해 부하 분산을 수행하는 방법입니다. 먼저 클라이언트에게는 로드 밸런서(Load Balancer)의 도메인 네임 또는 IP가 알려져 있습니다. 클라이언트가 이 알려진 도메인 네임이나 IP를 사용해 로드 밸런서에게 서비스 요청 패킷을 전송합니다. 또한 로드 밸런서는 n개의 서버 가운데 하나를 정해진 스케줄링 방법에 의해 선택한 후 패킷 내의 목적지 주소를 해당 서버의 IP로 다시 작성합니다. 리얼 서버는 클라이언트의 요청을 처리한 후, 로드 밸런서에게 응답을 돌려줍니다. 이때 로드 밸런서는 실제 응답의 발신지 주소를 다시 자신의 IP로 변경한 후 클라이언트에 서비스를 제공합니다.   

NAT에 의한 가상 서버의 장점은 실제 서버가 TCP/IP를 지원하는 어떠한 운영체제에서도 운용될 수 있다는 것입니다. 실제 서버는 사적 인터넷 주소체제(private Internet addresses)를 사용할 수 있고 단지 부하 분산기(load balancer)만 하나의 IP 주소가 필요합니다.  

단점은 확장성에 제한이 있다는 것입니다. 서버의 노드수가 수십개로 증가될 경우 병목이 발생할수 있습니다. 왜냐하면 패킷이 들어오고 나갈때마다 부하분산서버에서 패킷을 변경해야하기 때문입니다. 즉 항상 부하분산서버(Director)를 통과합니다. 로드 밸런서는 리얼 서버로 오가는 모든 패킷의 주소를 재작성해야 하므로 병목현상이 발생할 수 있습니다. 따라서 클러스터를 구성할 수 있는 서버의 개수에 제한을 받습니다. 이외에도 로드 밸런서가 다운될 경우 전체 서비스가 중단되는 문제가 발생합니다. 이를 방지하기 위해 일반적으로 ‘백업 로드 밸런서’를 두지만, 평상시는 이 고가의 서버를 사용하지 않으므로 낭비 요소가 됩니다. 방식은 하드웨어나 어플라이언스 형태로 제공되는 경우가 많으며, 대표적인 NAT 방식으로는 레이어4 스위치(OSI 7 계층 모델 가운데 4번 계층인 전송 계층에서 이뤄지는 스위칭 기법을 지원하는 네트워크 장비), 시스코의 로컬 디렉터, LVS(Linux Virtual Server)-NAT 방식 등이 있습니다.

 

 
<Figure 1. NAT 방식>

 

2). IP터널링을 이용하는 방법

IP터널링 방식에서는 NAT방식과는 다르게 부하분산서버는 들어오는 요청에 대해서 뒷단의 서버들(Real Server)에게 패킷을 전달하는 역할만 수행을 합니다. 뒷단의 서버들은 받은 요청에 대해서 다시 부하분산서버로 패킷을 주는 NAT방식과는 다르게 직접 그 요청의 처리를 수행하기 때문에 병목현상이 없어지게 됩니다. 이러한 IP터널링 방식을 설정하기 위해서는 Director 뿐만 아니라 Real Server에서 역시 IP터널링을 지원하도록 설정을 해주어야 합니다.

 

<Figure 2. IP Tunneling 방식>


3). 다이렉트 라우팅을 이용하는 방법

 

다이렉트 라우팅은 리얼 서버와 로드 밸런서가 가상 IP 주소를 공유합니다. 로드 밸런서와 리얼 서버는 네트워크 인터페이스에 가상 IP가 설정돼 있어야 하며, 이 인터페이스를 이용해 로드 밸런서는 요청 패킷을 받아들이고 스케줄링에 의해 선택된 리얼 서버로 직접 라우팅 합니다.

먼저 클라이언트가 가상 IP로 서비스 요청을 하면 로드 밸런서는 리얼 서버 가운데 하나를 스케줄링합니다. 그리고 선택된 서버로 직접 라우팅해 클라이언트의 요청을 리얼 서버로 전달합니다. 리얼 서버는 요청 사항을 처리한 후, 로드 밸런서를 거치지 않고 클라이언트로 직접 응답을 합니다. 각 리얼 서버는 로드 밸런서와 같은 가상 IP를 공유하고 있기 때문에, 로드 밸런서를 거치지 않고 클라이언트로 직접 응답할 수 있습니다.

이 방식은 로드 밸런서에서 병목현상이 NAT보다 적게 나타납니다. 로드 밸런서의 시스템 환경에 따라 차이가 있겠지만, 이론적으로는 100여 개의 서버를 클러스터로 구성할 수 있다고 합니다. 현재 대부분의 운영체제가 가상 IP 설정을 지원하므로 리얼 서버로 사용함에 있어 운영체제에 큰 제한을 받지 않습니다. 하지만 로드 밸런서뿐만 아니라 리얼 서버도 각각의 리얼 IP를 가지고 있어야 합니다. 그리고 NAT와 마찬가지로 백업 서버를 둬야 하는 부담이 있습니다. 특히 리눅스를 리얼 서버로 사용하는 경우 ARP 문제를 해결하기 위해 커널을 수정해 주어야 하는 경우가 있습니다. 참고로 다이렉트 라우팅 방식을 이용한 제품은 Resonate와 터보 클러스터, LVS-DR 등이 있습니다.

 

 

  <Figure 3. Direct Routing 방식>



2. 가상 서버 스케쥴링 알고리즘 

리눅스 가상서버에서 사용하는 스케쥴링 알고리즘을 설명합니다. 


1) Round-Robin Scheduling (라운드 로빈 스케쥴링)

말그대로 라운드-로빈 방식을 이용해 네트웍 연결을 서로 다른 서버에 연결하는 것을 말합니다. 이 경우 실제서버의 연결 갯수나 반응 시간 등은 고려를 하지 않습니다. 그렇지만 약간의 차이가 있습니다. 라운드 로빈 DNS는 단일한 도메인을 서로 다른 IP로 해석을 하지만, 스케쥴링의 기초는 호스트 기반이며 캐싱때문에 알고리즘을 효율적으로 사용하기 힘듭니다. 그래서 실제 서버사이에 동적인 부하 불균형이 심각해 질수 있습니다. 가상 서버의 스케쥴링 기초는 네트웍 기반이며 라운드 로빈 DNS 에 비해 훨씬 더 훌륭합니다.

2) Weighted Round-Robin Scheduling (가중치기반 라운드 로빈 스케쥴링)

가중치기반 라운드 로빈 스케쥴링은 실제 서버에 서로 다른 처리 용량을 지정할 수 있습니다. 각 서버에 가중치를 부여할 수 있으며, 여기서 지정한 정수값을 통해 처리 용량을 정합니다. 기본 가중치는 1입니다.

가중치가 있는 라운드 로빈 스케쥴링을 사용하면 실제 서버에서 네트웍 접속을 셀 필요가 없고 동적 스케쥴링 알고리즘보다 스케쥴링의 과부하가 적으므로 더 많은 실제 서버를 운영할 수 있습니다. 그러나 요청에 대한 부하가 매우 많을 경우 실제 서버사이에 동적인 부하 불균형 상태가 생길 수 있습니다.


  3) Least-Connection Scheduling (최소 접속 스케쥴링) 

최소 접속 스케쥴링은 가장 접속이 적은 서버로 요청을 직접 연결하는 방식을 말합니다. 각 서버에서 동적으로 실제 접속한 숫자를 세어야하므로 동적인 스케쥴링 알고리즘중의 하나입니다. 비슷한 성능의 서버로 구성된 가상 서버는 아주 큰 요구가 한 서버로만 집중되지 않기 때문에, 접속부하가 매우 큰 경우에도 아주 효과적으로 분산을 합니다.

가장 빠른 서버에서 더 많은 네트웍 접속을 처리할 수 있습니다. 그러므로 다양한 처리 용랑을 지닌 서버로 구성했을 경우에도 훌륭하게 작동 한다는 것을 한눈에 알 수 있을 것입니다. 그렇지만 실제로는 TCP의 TIME_WAIT 상태 때문에 아주 좋은 성능을 낼 수는 없습니다.


4) Weighted Least-Connection Scheduling (가중치 기반 최소 접속 스케쥴링)

가중치 기반 최소 접속 스케쥴링은 최소 접속 스케쥴링의 한 부분으로서 각각의 실제 서버에 성능 가중치를 부여할 수 있습니다. 언제라도 가중치가 높은 서버에서 더 많은 요청을 받을 수 있습니다. 가상 서버의 관리자는 각각의 실제 서버에 가중치를 부여할 수 있습니다. 가중치의 비율인 실제 접속자수에 따라 네트웍 접속이 할당됩니다. 기본 가중치는 1입니다.

가중치가 있는 최소 접속 스케줄링 알고리즘은 최소 접속 스케쥴링 알고리즘에 비해 부가적인 배분작업이 필요합니다. 서버들이 같은 처리 용량을 가졌을때는 작업 할당의 간접비용을 최소화 하기위해 최소 접속 스케쥴링과 가중치가 있는 최소 접속 스케쥴링 알고리즘 둘 다 사용할 수 있습니다.

 


참고 : http://hakkoo.net/zeroboard/zboard.php?id=study&page=6&sn1=&divpage=1&category=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=desc&no=419&PHPSESSID=34ad0df0e6670171141d75494595ea57

 

 

리눅스 네트워크 명령어
- IP할당등은 부팅시 초기화됨. 영구적으로 변경하기 위하여, 아래 파일을 수정해야 함.

인터페이스(랜카드) 설정 정보 표시 : ifconfig
eth0 인터페이스(랜카드) 설정 정보 표시 : ifconfig eth0
IP 할당 : ifconfig eth0 192.168.1.1
여러 IP 할당 : ifconfig eth0:0 192.168.1.2
두번째 IP 할당 : ifconfig eth0:1 192.168.1.3
IP/Subnet 설정 : ifconfig eth0 192.168.1.1 netmask 255.255.255.0
eth0 인터페이스 disable : ifconfig eth0 down
eth0 인터페이스 enable : ifconfig eth0 up
접속여부, 응답시간, 패킷손실율 확인 : ping [웹주소 or IP]
현재 라우팅 테이블 보기 : route
기본 Gateway 설정 : route add default gw [gateway 주소]
IP 주소와 매칭되는 하드웨어 주소 표시: arp
IP 패킷이 목적지에 도달하기 위해 거치는 (라우팅) 경로추적 Trace Route: traceroute [web 주소]
IP 패킷이 목적지에 도달하기 위해 거치는 경로추적 Trace Path: tracepath [web 주소]
DNS Test : host [web 주소]
Advanced DNS Test : dig [web 주소]
Reverse Lookup : host 8.8.8.8
Advanced Reverse Lookup : dig -x 8.8.4.4



리눅스 네트워크 수정파일 (위와 동일한 기능. 영구저장)

// 네트워크와 호스트 명 설정
# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=fedora.wiz.pe.kr

// 네트워크 인터페이스 설정
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
NM_CONTROLLED=yes
IPADDR=[IP주소]
NETMASK=255.255.255.0
GATEWAY=[Gateway 주소]
DNS1=168.126.63.1
TYPE=Ethernet
USERCTL=no
IPV6INIT=no

// 기본 DNS 설정
# vi /etc/resolv.conf
nameserver 168.126.63.1
// 네트워크서비스 자동 시작 해제
# chkconfig NetworkManager off
// 네트워크서비스 중지
# service NetworkManager stop
// 네트워크 자동 시작 등록
# chkconfig network on
// 네트워크 시작
# service network start
 
LVS

첨부:

Makefile - module programing Makefile 예시
ip_vs_rr.c - Round Robin 코드 (Linux kernel 원본에 존재)


sequence
1) ip_vs_rr.c를 적절히 수정.
2) Make 하여, Module 생성. (ip_vs_rr.ko)
3) 2)에서 생성한 파일을 /lib/module/(해당커널 버전)/kernel/net/netfilter/ipvs 로 복사
4) ipvs 실행 및 확인



팁 : 
1)  Line by Line
2) insmod : module 올림
    rmmod : mudule  내림
3) printk(""); 를 사용하여, 코드의 실행 부분 확인가능 - printk("") 는 dmesg 로 확인 가능
                   dmesg -c >> dmesg 출력 clear
    




/*

* Round-Robin Scheduling

*/

int i=1, n=1;

static struct ip_vs_dest *

ip_vs_rr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)

{

struct list_head *p, *q;

struct ip_vs_dest *dest;

IP_VS_DBG(6, "%s(): Scheduling...\n", __func__);

write_lock(&svc->sched_lock);

p = (struct list_head *)svc->sched_data;

if(i==n) // 이부분이 실행되면, 서버가 바뀜. 사용한 조건으로 인해, n번만큼 할당됨.

p = p->next;

q = p;

do {

/* skip list head */

if (q == &svc->destinations) {

q = q->next;

continue;

}

dest = list_entry(q, struct ip_vs_dest, n_list);

if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) &&

atomic_read(&dest->weight) > 0)

/* HIT */

goto out;

q = q->next;

} while (q != p);

write_unlock(&svc->sched_lock);

IP_VS_ERR_RL("RR: no destination available\n");

return NULL;

out:

svc->sched_data = q;

write_unlock(&svc->sched_lock);

IP_VS_DBG_BUF(6, "RR: server %s:%u "

"activeconns %d refcnt %d weight %d\n",

IP_VS_DBG_ADDR(svc->af, &dest->addr), ntohs(dest->port),

atomic_read(&dest->activeconns),

atomic_read(&dest->refcnt), atomic_read(&dest->weight));

if(i==n){

n++;i=0;

}

i++;

return dest;

}

 


'LVS' 카테고리의 다른 글

IPVS Configuration : DR (Direct Routing)  (0) 2010.12.29
LVS 구축에 관한 이론 (NAT 부터 WLC 까지)  (2) 2010.12.23
커널 소켓 프로그래밍  (0) 2010.11.20
모듈 프로그래밍  (1) 2010.11.10
ipvsadm 소스 파일 make하기  (1) 2010.11.09
 
LVS

커널 소켓 프로그래밍

2010. 11. 20. 21:13
1. 서론

이번주는 CPU 점유율을 고려한 Round Robin 알고리즘 수정을 진행하였는데요, 그 중 핵심은 커널 소켓 프로그래밍이 되겠습니다. 제가 주중에 시험을 보는관계로, 여기에 내용을 정리해 두도록 하겠습니다.

2, 방법

Round Robin 알고리즘을 담고있는 ip_vs_rr.c 파일에, tcp_vs_h_dslb.c 의 일부 코드를 이식하는 작업을 진행해 나가면 됩니다.

2.1 이식되어야 할 주요 함수

가장 중요한 함수로는 sock_recvmsg()함수를 담고 있는
example_thread()

Thread 방식(?) 이기 때문에, thread를 시작하고 종료해주는
launch_thread()
kill_thread()
이 세 함수 정도가 가장 중요하다고 볼수 있겠구요, 나머지 연결된 함수들은 make 를 하시면서 하나씩 첨부해 주시면 되겠습니다.

연결된 함수들은 기본적으로 tcp_vs_h_dslb.h 내에서 참고하여 이식하는 방법이 가장 좋으며, 없을 경우 해당 함수를 품고있는 헤더파일을 찾아 include 시켜주는 방법이 좋겠습니다.

커널이 2.4에서 2.6으로 업그레이드 되면서 몇가지 struct 구조에 변화가 생겼습니다. 그것들은 에러가 났을경우 구글링을 통해 검색하셔서 조금씩 수정해주시면 되겠습니다.(argument 문제가 두곳, struct의 변화가 두군데 정도 되었던것으로 기억이 납니다;;)

이식을 끝내신후에는 ip_vs_rr.c 모듈에 시작 함수(module_init 부분 참조) launch_thread()를 첨부하여 thread를 동작하게 만들어 주시고, 종료 함수(module_exit(?) 부분 참조) 에는 kill_thread()를 첨부하여 모듈이 종료되었을 경우 thread또한 종료될수 있도록 만들어 주시기 바랍니다.

P.S. : kill_thread()내부의 kill_proc() 함수가 커널버젼이 바뀌면서 적용이 되지 않고있는데, 아직 이문제는 해결이 되지않았습니다. 때문에 모듈제거가 안되요..ㅠㅠ 해결해 주세요!

3, 결과 확인

최종적으로 만드신 ip_vs_rr 모듈을 실제로 올려보시고, host_info로 만든 어플리케이션을 동작시킨 후 실제로 커널에서 메세지를 수신하고 있는지 dmesg 확인합니다. (printk()는 example_thread() 함수 내부에 주석 처리되어있는 두 곳중 cpu_use 관련 내용을 출력하는 곳의 주석을 해제하시면 되겠습니다.)

NCLab 화이팅!

'LVS' 카테고리의 다른 글

LVS 구축에 관한 이론 (NAT 부터 WLC 까지)  (2) 2010.12.23
RR 알고리즘 개선 -> N번째 N번 부하 분산  (0) 2010.12.20
모듈 프로그래밍  (1) 2010.11.10
ipvsadm 소스 파일 make하기  (1) 2010.11.09
LVS server 구축  (2) 2010.11.06
 
LVS

모듈 프로그래밍

2010. 11. 10. 21:10

어느 프로그램이든지 만들려면 Makefile을 만들어야 합니다. 디바이스 드라이버도 역시 Makefile을 만들어 놓고 사용하면 편리합니다. 더욱이 커널 2.6에서는 gcc 를 이용하여 빌드하는 것이 아니기 때문에 반드시 Makefile을 만들어야 한다고 합니다.

저도 간단하게 프로그램을 작성해서 컴파일하려고 Makefile을 만들어 보았습니다.

Makefile 오류

MS-Windos에서 매우 편리한 RAPID 툴만 사용했던 저로서는 Makefile을 만들어야 한다는 것이 별로 반갑지 않습니다. 반갑지 않은 정도가 아니라 성가시고 때로는 알지 못하는 에러 때문에 고생해야 했습니다.

일반 에플리케이션을 만들기 위한 Makefile은 나름대로 큰 수정없이 사용할 수 있는 Makefile을 만들어서 사용할 정도가 되었습니다만 디바이스 드라이버를 학습하면서, 이것도 새로운 영역이라고 새로운 Makefile 형식에 사뭇 당황했습니다. 이것 또 암호문이네...으~

나름 빠르게 해본다고 책에 딸려 온 CD에 있는 소스 파일을 복사해서 main.c를 만들고 역시 CD에 있는 Makefile을 수정했습니다만 제대로 컴파일이 되질 않더군요. 가장 큰 잘못은 책에서 Makefile 부분을 대충 내용만 흝어 본 것이었습니다. 다시 책 내용을 정독하고 Makefile을 수정하고 컴파일해 보았지만 아래와 같은 에러가 계속 나더군요.

]$ make
make -C /lib/modules/2.6.9-42.0.8.ELsmp/build SUBDIRS=/home/jwjw/prjs/forum_sample/115 DeviceDriver modules
make[1]: Entering directory `/usr/src/kernels/2.6.9-42.0.8.EL-smp-i686'
make[1]: *** 타겟 `DeviceDriver'를 만들 규칙이 없음. 멈춤.
make[1]: Leaving directory `/usr/src/kernels/2.6.9-42.0.8.EL-smp-i686'
make: *** [default] 오류 2
]$ make

아~! 정말 미치겟더군요. 이런 기억이 예전에도 있었습니다. 바로  Tab 문자 때문이었죠.

그렇다면 이번에 발생한 에러는 무엇 때문일까요?

make[1]: *** 타겟 `DeviceDriver'를 만들 규칙이 없음. 멈춤.

문제는 바로 작업 디렉토리에 공백 문자가 있어서 였습니다. 공백만 없다면 한글 이름의 디렉토리 명을 사용해도 컴파일할 수가 있었습니다.

115_디바이스드라이버]$ make
make -C /lib/modules/2.6.9-42.0.8.ELsmp/build SUBDIRS=/home/jwjw/prjs/forum_sample/115_디바이스드라이버 modules
make[1]: Entering directory `/usr/src/kernels/2.6.9-42.0.8.EL-smp-i686'
CC [M] /home/jwjw/prjs/forum_sample/115_디바이스드라이버/main.o
Building modules, stage 2.
MODPOST
CC /home/jwjw/prjs/forum_sample/115_디바이스드라이버/main.mod.o
LD [M] /home/jwjw/prjs/forum_sample/115_디바이스드라이버/main.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.9-42.0.8.EL-smp-i686'
115_디바이스드라이버]$

다른 프로그램 컴파일에서는 현재 디렉토리 정보가 중요하지 않았습니다만 디바이스 드라이버, 즉 모듈 프로그래밍에서는 현재의 디렉토리 명을 Makefile에 넘겨 주어야 하므로 Makefile 이 헤깔리지 않도록 디렉토리 명에 공백 문자가 있어서는 안되겠습니다.

또한 커널 별로 컴파일하는 방법이 다릅니다. 다음에 소개되는 커널별 Makefile을 참고하시기 바라며, 혹 사용하시는 시스템의 커널 버전을 확인하시려면 uname -r 을 이용하십시오.

]$ uname -r
2.6.9-42.0.8.ELsmp
]$

Makefile에 대해서는 리 눅스 디바이스 드라이버, 저자 유영창의 책 내용 중 4장 4절의 내용을 그대로 사용하면서 읽기 편하게 편집했습니다. 원저자에 누를 끼치지 않기 설명 글은 원문 그대로 가져 오지 않고 요점만 간추렸음을 말씀드립니다.

2.4 커널 외부 모듈 컴파일 용 Makefile

우선 Makefile의 전체 모습을 보시겠습니다. 예에서는 소스 파일 이름이 test.c 라고 가정하겠습니다.

KERNELDIR   = /lib/modules/$(shell uname -r)/build
CFLAGS = -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -O

all: test.o

clean:
rm -rf *.o
Makefile 설  명
KERNELDIR = /lib/modules/... 모듈은 커널과 밀접하게 연관되어 있으므로 버전 문제를 방지하기 위해서는 모듈이 동작하는 커널 소스와 일치시켜야 하는데, 이를 위해 컴파일할 모듈이 참조할 커널 소스의 디렉토리를 지정한다.
CFLAGS = -D__KERNEL__ ...

D__KERNEL__ : 커널과 관련된 내용을 활성화 하라
DMODULE : 모듈과 관련된 내용을 활성화 하라
O : 최적화 옵션

test.o 만들어낼 오브젝트
clean:
    rm -rf $*.o
컴파일 결과로 생긴 모든 파일을 삭제

test.o 가 하나의 소스가 아니라 여러 개의 소스 파일로 만들어 진다면 아래와 같이 내용을 추가하시면 됩니다.

all: test.o

test.o : test1.o test2.o test3.o

2.6 커널 외부 모듈 컴파일 용 Makefile

2.6 커널 용은 2.4보다 조금 복잡해 보이는 듯 합니다. 프로그램 소스가 어디에 있는지도 보여 주어야 하고 말이죠. 그러다 보니 위에서 말씀드린 Makefile 오류 경험도 했습니다만 내용을 보면 모듈을 만들어 내기 위해서 2.4보다는 더욱 전문적이고 체계적으로 보입니다.

KERNELDIR = /lib/modules/$(shell uname -r)/build

obj-m := test.o

KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
rm -rf *.ko
rm -rf *.mod.*
rm -rf .*.cmd
rm -rf *.o
Makefile 설  명
KERNELDIR = /lib/modules/... 모듈은 커널과 밀접하게 연관되어 있으므로 버전 문제를 방지하기 위해서는 모듈이 동작하는 커널 소스와 일치시켜야 하는데, 이를 위해 컴파일할 모듈이 참조할 커널 소스의 디렉토리를 지정한다.
obj-m := test.o

생성할 모듈 이름

KDIR := /lib/modules/$(shel ... 커널의 소스 위치
PWD := $(shell pwd) 컴파일 대상 프로그램 소스 위치
default:
   $(MAKE) -C $(KDIR) ...
모듈 컴파일 명령
clean:
   rm -rf *.ko .....
컴파일 결과로 생긴 모든 파일을 삭제

test.o 가 하나의 소스 파일로 되어 있지 않고 여러 파일로 만들어져 잇다면 아래와 같이 행을 추가하시면 됩니다.

obj-m	:= test.o
module-objs := test1.o test2.o test3.o

이제 컴파일해서 모듈을 만들어 내는 방법까지 알게 되었으므로 다음 시간부터는 디바이스 드라이버 프로그램에 작성에 대해 하나씩 알아 보도록 하겠습니다.

 

태그: *디바이스드라이버

참조: http://forum.falinux.com/zbxe/?document_srl=406210&mid=device_driver

'LVS' 카테고리의 다른 글

LVS 구축에 관한 이론 (NAT 부터 WLC 까지)  (2) 2010.12.23
RR 알고리즘 개선 -> N번째 N번 부하 분산  (0) 2010.12.20
커널 소켓 프로그래밍  (0) 2010.11.20
ipvsadm 소스 파일 make하기  (1) 2010.11.09
LVS server 구축  (2) 2010.11.06
 
LVS
 http://www.linuxvirtualserver.org/
사이트를 접속해서 ipvsadm-1.25.tar.gz 을 받습니다.

압축을 풀어 줍니다.

압춘 폴더에 들어가 make를 실행시켜주면

[root@namyong ipvsadm-1.25]# make install
make -C libipvs
make[1]: Entering directory `/home/namyong/바탕화면/ipvsadm-1.25/libipvs'
gcc -Wall -Wunused -Wstrict-prototypes -g -fPIC -DLIBIPVS_USE_NL  -DHAVE_NET_IP_VS_H -c -o libipvs.o libipvs.c
In file included from libipvs.h:13,
                 from libipvs.c:23:
ip_vs.h:15:29: error: netlink/netlink.h: 그런 파일이나 디렉터리가 없습니다
ip_vs.h:16:31: error: netlink/genl/genl.h: 그런 파일이나 디렉터리가 없습니다
ip_vs.h:17:31: error: netlink/genl/ctrl.h: 그런 파일이나 디렉터리가 없습니다
In file included from libipvs.h:13,
                 from libipvs.c:23:
같은 에러가 발생합니다.

위 에러를 해결하기 위해서는 http://www.infradead.org/~tgr/libnl/에
들어가서 libnl-2.0.tar.gz 파일을 다운로드 하여 압축을 풀어줍니다.

libnl은 netlink socket를 다루는 프로그램을 위한 라이브러리입니다.

압축이 풀린 폴더를 들어가보면 inclued/netlink/version.h.in이라는 파일이 있습니다.
그 파일의 이름을 version.h로 변경해줍니다.
그리고 include폴더를 통째로
/usr/include에 덮어쓰기를 합니다.

덮어쓸때 에러가 발생한다면 chmod 명령어를 이용해 잠깐 권한을 풀어준 후 다시 시도하면 됩니다.

덮어쓰기가 끝나면

make clean을 한후
make를 실행시키면 됩니다.

혹시 make 실행 도중 popt.h 파일 등등 기타 파일을 찾을수 없다고 나오면
chmod - R 777 /usr/include와 같이 권한을 잠시 풀어주고 다시 시도하면 해결할 수 있습니다.


'LVS' 카테고리의 다른 글

LVS 구축에 관한 이론 (NAT 부터 WLC 까지)  (2) 2010.12.23
RR 알고리즘 개선 -> N번째 N번 부하 분산  (0) 2010.12.20
커널 소켓 프로그래밍  (0) 2010.11.20
모듈 프로그래밍  (1) 2010.11.10
LVS server 구축  (2) 2010.11.06
 
LVS

LVS server 구축

2010. 11. 6. 14:50


 

 IP 설정 및 구축

  ◇LVS server(ipvsdm) : LAN1 - IP Addr   : 220.70.2.xxx             >> Real address

                                                  - Netmask : 255.255.255.0

                                                  - Gateway : 220.70.2.254

                                                  - DNS       : 168.126.63.1

 

                                        LAN2 - IP Addr    : 192.168.1.1             >> Virtual address

                                                 - Netmask : 255.255.255.0

 

 ◇Real Server1      :     IP Addr   : 192.168.1.2

                                     Netmask : 255.255.255.0

                                    Gateway : 192.168.1.1

                                    DNS       : 192.168.1.1

 

 ◇Real Server2     :     IP Addr   : 192.168.1.3

                                     Netmask : 255.255.255.0

                                    Gateway : 192.168.1.1

                                    DNS       : 192.168.1.1

 





 

 LVS Server 설정

◇ipvsadm 설치

  # yum -y install ipvsadm

 

동작확인

# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

ProtProt LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

 

◇시스템을 통해 다른 시스템으로패킷이 포워딩 될수 있도록 수정

# vi  /etc/sysctl.conf

     net.ipv4.ip_forward=1

        -> 적용

            # sysctl -p



ipvsadm 구동

  # service  ipvsadm  start

 

ipvsadm 설정

# ipvsadm -A -t  220.70.2.xxx:80 -s rr

# ipvsadm -a -t  220.70.2.xxx:80 -r 192.168.1.2:80 -m

# ipvsadm -a -t  220.70.2.xxx:80 -r 192.168.1.3:80 -m

                                                                       >> -m : 마스커레이드 방법 사용

 

>>> 목록 저장 - SELinux를 disabled 시켜야 함.

    #service ipvsadm save


SELinux disabled :
  #vim /etc/selinux/config

line#7  SELINUX=enforcing    -->> SELINUX=disabled 로 수정



 

ipvsadm 설정 확인

# ipvsadm -L

IP Virtual Server version 1.2.11.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 220.70.2.x:http rr

-> 192.168.1.2:http Route 1 0 0

-> 192.168.1.3:http Route 1 0 0

 

 

 REAL Server 설정

server 페이지 만들기

# vim /var/www/html/index.html

<내용 입력, 저장 후 종료(wq)>

 

server 구동

 # service httpd start

 

 

 

 

 

 

 

 

 

1. ipvsadm의 기본 문법

- 서비스

ipvsadm [명령] [프로토콜 옵션] [서비스] [스케줄링 방법] [세션유지 옵션]

 

- 리얼서버

ipvsadm [명령] [프로토콜 옵션] [서비스] -r [리얼서버 옵션] [가중치 옵션]

 

서비스/리얼서버 관련 >명령<

-A : 서비스 추가

-E : 서비스 수정

-D : 서비스 삭제

-a : 리얼서버 추가

-e : 리얼서버 수정

-d : 리얼서버 삭제

 

 

>프로토콜<

-t     TCP

-u    UDP

-f     firewall 서비스 추가(NAT 방식에서 사용)



기타

-s [ rr | wrr | lc | wlc | lblc | lblcr | dh | sh | sed | nq ] : 스케줄링 방법을 설정한다.

-p [timeout]: 세션 타임아웃 설정

-r [서버주소:서비스포트] : 리얼서버를 설정한다.

-w [가중치] : 가중치를 설정한다.

   

설정 확인

-L : 서비스/리얼서버 리스트를 출력한다.

-n : 숫자형식(호스트네임->아이피주소)로 출력한다.

-c : 현재 연결을 출력한다.

   

입/출력

-S : 표준출력(화면프린트)으로 현재 설정을 내보낸다.

-R : 표준입력을 통해 설정을 가져온다

 

 

2. 스케줄링 방식 정리(rr,wrr,lc,wlc)

ipvsadm에서 지원하는 스케줄링 방식은 총 8개가 있지만 이 문서에서는 네개의 방식만 정리.

(1) rr

round-robin방식은 가장 기본적인 스케줄링 방식으로 "순차적으로" 작업을 각각의 노드에 분배하는 방식이다. 만약 3 대의 노드(A,B,C)에 round robin 방식을 사용하면, A->B->C->A->B->C와 같이 실행이 된다.

 

 

(2) wrr

노드별로 가중치를 설정하여 작업을 순차적으로 분배하는 방식으로 여러대의 서버가 각각 성능이 다른경우 성능에 맞춰 가중치를 설정해 주면 성능이 낮은 서버에 과도한 부하가 걸리는 것을 방지할 수 있다.

 

 

(3) lc

"현재 활성화 되어있는(ESTABLISHED)" 접속량이 적은 서버부터 작업을 할당하는 방식으로, 불필요한 유휴자원이 발생하는 것을 막을 수 있다. 만약 접속이 오래 유지되지 않는 경우(http) 이 방식을 사용하면, A->A->A->A->...와 같이 리스트 위쪽에 있는 노드 위주로 작업이 할당된다.

 

 

(4) wlc

노드별로 가중치를 설정하여 접속량이 적은 서버부터 작업을 할당하는 방식으로 lc보다 효율적인 자원분배가 가능하다.

 

 

3. 타임아웃

(1)세션 타임아웃

ipvsadm에서 -p 옵션을 이용하여 어떤 서비스에 세션 타임아웃 시간을 설정하면, 한번 세션이 열린후 타임아웃 시간 내에 동일한 주소에서 세션이 다시 열렸을 때 처음에 접속했던 RIP로 접속이 된다.

   

(2)Idle 타임아웃

ipvsadm --set옵션을 이용하면 프로토콜의 Idle timeout 시간을 설정할 수 있다. timeout 시간이 지나면 연결이 끊어지게 된다. 예를 들어,

ivpsadm --set 10 20 30

로 설정을 해 주게 되고 ftp연결후 10초간 아무것도 하지 않으면 연결이 끊어진다. 이는 http와 같이 한번 보내면 해당 연결이 끊겨도 별 문제가 없는 서비스의 경우는 상관없지만, ftp, nfs와 같은 서비스를 사용할 때에는 신중하게 값을 설정해야 한다.

 





'LVS' 카테고리의 다른 글

LVS 구축에 관한 이론 (NAT 부터 WLC 까지)  (2) 2010.12.23
RR 알고리즘 개선 -> N번째 N번 부하 분산  (0) 2010.12.20
커널 소켓 프로그래밍  (0) 2010.11.20
모듈 프로그래밍  (1) 2010.11.10
ipvsadm 소스 파일 make하기  (1) 2010.11.09
 

플래시 메모리 접근하기

2010. 10. 28. 21:53
목적 : 플래시 메모리는 어디서 어떻게 초기화되고 작동이 되는지 알아보자.

필자가 사용하는 망고보드의 부트로더는 U-boot이다. U-boot안에 있는 Startup.S파일이 가장 먼저 실행이 되는데 Startup.S의 메모리 컨트롤러 초기화 부분이 있다. 바로 이부분부터 접근해보도록 하자.

Startup.S는 메모리 컨트롤러 레지스터 설정을 해준다. 왜냐하면 시피유가 SD RAM에 접근이 가능하도록 메모리 컨트롤러 레지스터에 테이타 값을 넣어 초기화가 요구되기 떄문이다.

Startup.S 파일은 시피유가 에스디램 메모리를 읽기, 쓰기 가능하도록 하기 위해서 메모리 컨트롤러를 초기화한다. 이 과정이 끝나면 프로그램이 동작하기 위한 스택 영역을 지정해 주고 씨 언어의 메인 함수로 점프한다.

그럼 Startup.S 파일을 컴파일 과정을 거쳐서 바이너리 파일이 완성이 되었다고 치자. 그럼 이 파일을 임베디드 보드에 어디에 저장할것인가?

보드의 메모리 종류에 따라 바이너리 파일을 전송해야 할 위치가 다르다.
흔히 사용되는 NAND 플래시 메모리 경우에는 바이너리 파일이 바로 동작되지 않기 때문에 부트로더가 반드시 필요하다. 부트로더를 통해서 Startup.S의 바이너리 파일이 실행될 수 있도록 sd램으로 복사해주기 때문이다. 그래서 Startup.S파일은 부트로더 안에 존재해야 한다.
그러나 노어 플래시 메모리는 바로 바이너리 파일을 실행시킬수 있기 때문에 부트로더 필요없이 Startup.S의 바이너리 파일만 있으면 된다.
 SDRAM은 프로그램을 수행하며 주기적으로 변하는 데이타를 저장하거나 읽기를 함
 앞에 낸드 플래시에 대해 짧막하게 소개가 되었다. 지금부터는 필자가 사용하는 mango-100이라는 보드에 낸드플래시를 지원하기 때문에 이에 관련되어 좀 더 알아보도록 하자.
낸드플래시는 부트로더가 필요하다고 언급했는데 아래와 같은 방법으로 동작하게 된다.
 보드에 전원이 들어가면 CPU는 어떤 플래시 메모리를 사용하는지 판단을 한다. (mango-100에서는 스위치를 조절하여 설정을 할 수 있다.) 낸드 플래시로 설정이 되어 있다면, 낸드 컨트롤러에 의해 낸드 플래시에 있는 부트로더를 시피유 내에 있는 인터널램으로 자동으로 복사하여 부트로더를 실행한다. 이 부트로더는 보드에서 실행시킬 바이너리 파일을 에스디렘으로 복사를 하여 실행되게 하는 역할을 한다.

 낸드 플래시는 읽기/쓰기는 페이지 단위, 지우기는 블록단위로 동작을 한다. 또한, 모든 동작 사이클은 CLE로 동작되는 커맨드 사이클, ALE로 동작되는 어드레스 사이클, 그리고 데이타 사이클과 같이 크게 3가지로 분류된다. 낸드 플래시는 주소의 개념이 없기 떄문에 낸드 플래시 컨트롤러를 사용하여 위 과정을 수행할 수 있다. 

위 회로도는 망고100보드에서 사용하는 NAND메모리다. 모든 동작 사이클은 CLE로 동작되는 커맨드 사이클, ALE로 동작되는 어드래스 사이클, 그리고 데이타 사이클과 같이 크게 3가지로 분류된다. 
 핀 I/O(input/output Pin)0~7은 비동기 통신을 할 뿐 아니라 기존의 메모리와 다르게 Address 및 Data Line이 하나의 포트에서 공용으로 사용하고 있다. 이러한 I/O 구분을 위해 사용되는 Pin이 ALE와 CLE입니다. 






 위 Timing Chart는 1page를 READ 할때의 타이밍 동작이다. 
1. 처음에 CLE가 High가 된걸 알수 있는데 이떄 I/O에 있는 값은 Command로 인식하게 된다.
2. ALE 사이클이 긴 이유는 용량에 따라 필요한 만큼 주소를 할당해야 하기 떄문이다.
3. ALE와 CLE가 둘다 내려가면 실제 Data가 처리가 된다. DATA의 READ는 RE, WRITE는 WE로 구분      된다.
4. WP은 쓰기 방지 기능으로 low일떄 Erase 및 Write동작이 금지한다.
5.  RD/BY은 NAND 메모리가 자신의 동작상태를 유저에게 알려주는 역할을 한다.

Read 동작 뿐만 아니라 다른 동작에 대해 좀 더 알아보도록 하자.
NAND의 크게 5가지 동작이 있다. 
1) ID Read
NAND메모리의 가장 기본 동작으로 NAND가  잘 연결되어 있는지 확인하는 Command이다. ID Read를 하고 나면 Factory, Device(메모리 고유 번호), 용량, Bus 정보도 얻을 수 있다.
2) Read
제조사 별로 약간은 상이하나, 기본적으로는 첫 Start Address를 지정하면 순차적으로 page단위로 계속 읽어드리는게 NAND의 Read 방식입니다.
3) Erase
Flash의 기본 특성상 Write 동작을 하기 위해서는 꼭 해당 영역을 Erase하고 난 후에 Write를 해주어야 하고 Erase는 Block단위로 수행이 된다. Write가 되면 '0', Erase가 되면 '1'의 상태로 나타낸다. 예를 들어, Erase가 끝난 후 각 page를 read해보면 전부 FFFFF....로 되어 있는걸 볼 수 있다.
4) Write
Erase가 끝난 Cell에 대해 쓰기를 하는 동작이다. 페이지 단위로 수행을 하며, 1 -> 0으로 바꾸는 과정이다. 참고로 0 -> 1로 바꾸는건 Erase이다.
5) Status Check
Erase, Write 동작이 끝난 후 수행하는 동작으로 메모리가 이와같은 동작을 정상적으로 잘 수행했는지 확인 하는 역할을 한다. 해당 기능이 동작후 Pass/Fail 중 하나의 결과를 리턴하는데 Fail이 발생한 경우에는 배드블럭 가능성이 높아서 Retry를 해보거나 배드블록으로 설정을 해서 다른 블럭에 Erase,Write를 다시 수행한다.


※ 위와 같은 동작을 하기 위해서는 메모리가 자동적으로 수행하는게 아니라, FTL을 통해서 수행됩니다. 파일시스템 <-> FTL <-> 플래시메모리, 즉 중간단계라고 생각하면 된다. 이 FTL을 통해서 우리는 파일시스템으로부터 오는 논리 주소를 플래시 메모리의 물리주소로 추상화하여 사용이 가능하다.
 
FTL에 대한 이야기는 추후에 더 알아보도록 하겠습니다.



 

NAND 작업 진행 상황(2)

2010. 10. 28. 21:09

NAND 작업 진행 상황(1) 까지의 내용을 계속하여 진행.


가정 : mango-2010-6 버전에 s5pc100의 nand driver가 존재 할 것이다.

근거 : mango-2010-6/cpu/s5pc1xx/nand.c 파일 존재.



진행 : mango-2010-6/cpu/s5pc1xx/nand.c   ->  U-Boot-2010.6.29   이식

결과 : NAND 드라이버 인식 .




진행과정 :
NAND 작업 진행 상황(1) 에서


다른 보드의 driver 이식
.../drivers/mtd/nand/s5pc100_nand.c 파일 생성 (s3c64xx.c 파일을 기반으로 복사 생성)

# cd drivers/mtd/nand
# cp s3c64xx.c ./s5pc100_nand.c

의 과정을,

   [mango-2010-6/cpu/s5pc1xx/]#  cp nand.c  U-Boot-2010.6.29/drivers/mtd/nand/s5pc100_nand.c

  로 대체하여 진행.


U-Boot-2010.6.29/drivers/mtd/nand/s5pc100_nand.c 수정내용
[C] line27>  #define <regs.h> -> #define <asm/arch-s5pc1xx/s5pc100.h>
변경이유 : regs.h의 내용은, s5pc100의 레지스터 내용을 참고하므로, 대체.

[D] line44, 55, 77>  .useecc
삭제이유 : 컴파일 에러, 정확한 원인은 확인하지 못했음. 삭제처리 후, 정상적인 컴파일 실행.

U-Boot-2010.6.29/include/nand.h 수정내용

[D] line33>  extern int board_nand_init(struct nand_chip *nand);
삭제이유 : s5pc100_nand.c 에서, 이미 #include <nand.h> 이므로, extern erro발생.




작업 결과의 의미
prompt를 띄우기 위해서는 NAND 초기화 sequence를 지나야 한다.
NAND가 동작하던 그렇지 않던, 부팅을 해야 한다.
부팅이 되어야, 다른 것들에 접근해보고, 생각해볼 수 있기 때문이다.
prompt를 띄우는 것. 불완전 하더라도, 부팅을 완료하는 것.
그런의미에서, 의미 있는 결과가 아닌가 생각된다.


 


생각해본 내용
드라이버의 동작을 이해하고 있다면, "NAND 작업 진행 상황(1)"  에서, s3c64xx.c을 기반하여,간단한 코드 수정만으로 nand를 초기화 시킬 수 있을 것이라 생각된다. ID를 추가시키는 것등으로 말이다.(nand의 동작상으로 버전상 큰차이는 없을 것이라 생각되기 때문이다. LAN9220의 경우 가 그 예이며, 실제로 No NAND DEVICE found!!! 라는 메세지를 출력했다.)  하지만, 우리는 드라이버의 동작을 알지 못하기 때문에, mango-2010-6(망고버전)에서 제공하는 nand driver를 U-Boot-2010.6 버전에 맞게 수정하여, NAND를 인식 시켰다.

NAND 다음 단계는  serial 관련 초기화라고 추측 된다.

NAND는 정상적으로 인식되었지만, In: serial , Out: serial, Err: serial 에서 멈춘 것인지,
아니면,
NAND가 정상적으로 동작되지 않아서, In: serial , Out: serial, Err: serial로 진입하지 못한 것인지를 판단하기 위해여 더 많은 공부와 분석이 필요할 것으로 생각된다.


하나를 해결하면, 하나가 막히고, 하나를 해결하면 하나가 막히고...
해결을 하기위해선 엄청난 시간이 걸린다.
근본적으로 드라이버가 코드로 어떻게 동작 하는지를 공부해야할 필요성을 느낀다.


 
다음 작업?
NAND 가 올바로 인식되었나 확인.
다음단계 초기화 내용 확인. (In: serial , Out: serial, Err: serial 이라 추측됨)

'Boot Loader > NAND' 카테고리의 다른 글

NAND 작업 진행 상황 (1)  (3) 2010.10.16
 

New Post