OS/SOLARIS2005. 7. 12. 21:43
반응형

    2. Memory

Doc Rev: 2.0   junsoft.com

2.1   가상 메모리(Virtual Memory)

Solaris는 가상 메모리(Virtual Memory) 시스템을 사용한다. 가상 메모리 시스템이란 물리적 메모리(physical memory)와 하드 디스크(swap device)를 결합하여 하나의 큰 메모리 처럼 사용하는 것을 말한다.
즉, 물리적 메모리가 100M 이고 swap device가 100M이면 가상 메모리량은 약 180MB 정도 된다.

physical memory + swap device - VM management overhead = swap(VM)

		== simple ==

(physical memory + swap device) * about 90% ~= swap(VM)

	(100M + 100M) * 0.9 ~= 180M

Solaris는 이러한 가상 메모리를 관리하기 위하여 메모리를 페이지 단위(8KB)로 나누어 관리한다. 이러한 페이지들을 모아서 세그먼트로 구성하여 사용한다. 프로세스가 동작하기 위해서는 그 프로세스가 필요한 메모리가 있다. 그러나 그 메모리가 물리적 메모리에 모두 적재되어야 실행되는 것은 아니다. 프로세스가 실재 액세스하는 메모리만 물리적 메모리에 적재되어 있어도 프로세스는 실행된다.
그런데 여유 있는 물리적 메모리가 없어서 프로세스에게 필요한 메모리를 줄 수 없을 때 커널은 현재 사용하고 있는 물리적 메모리 중에 최근에 사용되지 않은 메모리를 선택하여, (필요하면, 선택된 메모리를 swap partition에 저장하고) 그 메모리를 그 프로세스에게 준다.

Solaris에서는 가상 메모리(Virtual Memory)를 swap으로 명칭한다(swap partition과 구별해 주십시오). 이 swap(VM)은 운영체제가 사용할 수 있는 메모리이다. vmstat 명령어의 4번째 필드 swap은 사용 가능한 가상 메모리의 크기를 KB 단위로 나타내고 5번째 필드 free는 사용 가능한 물리적 메모리(Physical Memory)를 KB 단위로 나타낸다.

가상 메모리에 대한 자세한 사항은 다음과 같이 swap -s 명령어로 알 수 있다.

# swap -s total: 664720k bytes allocated + 53320k reserved = 718040k used, 485160k available

swap 공간에서 718040KB가 사용되고, 485160KB?사용 가능하다. 사용된 718040KB 중에서 실재 할당 받아서 사용한 것은 664720KB이고 53320KB는 예약된 메모리 이다.
할당 받은 것과 예약한 것의 차이는 다음과 같다.
만일 프로세스가 데이타를 관리하기 위하여 10MB의 메모리가 필요하여 10MB의 메모리를 요청했다면 10MB의 메모리가 그 프로세스가 사용할 수 있도록 예약해 둔다. 그리고 그 프로세스가 메모리를 실재 액세스할 때, 그 메모리가 할당된다.
예를 들어 10MB 메모리를 요청하여 1MB의 메모리만 액세스하였다면, 1M은 allocated된 영역에 더 해지고, 9MB는 reserved 영역에 더 해진다.

응용 프로그램이 동작할 때, 필요한 메모리는 swap(VM)에서 가져온다. 물리적 메모리가 많든 적든 관계없이 swap 공간이 충분하면 프로그램이 실행되는 데에는 전혀 문제가 없다. 만일 물리적 메모리가 절대적으로 부족하다면, 실행속도가 늦어질 뿐, 메모리 부족으로 애플리케이션이 중단되는 일은 없다.

swap partition에 대한 정보는 다음과 같이 swap -l 명령어로 확인할 수 있다.

# swap -l swapfile dev swaplo blocks free /dev/dsk/c0t0d0s1 151,1 16 1638992 933104

blocks은 전체 swap partition의 크기이며 512 바이트 단위의 블럭이고, free는 그 중에 사용 가능한 swap partition의 크기이며 512 바이트 단위의 블럭이다. 즉,

(blocks - free) / 2 = 현재 스왑 아웃된 양(KB)

위의 swap -l 명령어의 결과에서 보면, 352944KB의 메모리가 swapout 되었음을 알 수 있다.

(1638992 - 933104) / 2 = 352944KB ~= 344.67MB

실제 swap이 좀 더 구체적으로 어떻게 관리되는지 자세히 알아보자.


available
swap(VM) = DSP (disk swap partition) + PM (physical memory)
	       (        DA	   ) +    (    MC + MA    )

* Memory allocation:

reserved

allocated

1. request:

p = malloc( 100MB );

100M

0M

2. use:

for( i = 0; i < 10M; i++ ) *(p+i) = 1;

90M

10M

첫번째 프로세스가 메모리를 요청하면, 요청한 메모리 만큼 예약하여 둔다. 그리고 그 메모리를 실재로 액세스할 때 그 메모리가 물리적 메모리에 할당된다.


vmstat 명령어의 결과물에 있는 다음과 같은 필드와 함께 Solaris 메모리 관리 방법을 설명한다.

# vmstat 1 procs memory page disk faults cpu r b w swap free re mf pi po fr de sr aa dd s1 s4 in sy cs us sy id 0 0 0 952128 87416 0 24 35 0 0 0 0 0 2 0 1 264 1327 272 7 2 90 0 0 0 931344 48384 0 2 0 0 0 0 0 0 0 0 0 204 191 94 0 1 99 0 0 0 931344 48384 0 137 0 0 0 0 0 0 0 0 0 204 449 102 12 2 86

swap: 

amount of swap space currently available (Kbytes)

free: 

size of the free list (Kbytes)

re: 

page reclaims

mf: 

minor faults

pi: 

kilobytes paged in

po: 

kilobytes paged out

fr: 

kilobytes freed

de: 

anticipated short-term memory shortfall (Kbytes)

sr: 

pages scanned by clock algorithm

Solaris에서 여유 있는 물리적 메모리를 화일 시스템의 캐쉬로 사용한다. 디폴트로 프리 메모리(free physical memory)가 전체 물리적 메모리 양의 1/64(lotsfree)보?크면, 화일 시스템을 통한 디스크 I/O는 모두 메모리에 남겨두어 화일 시스템의 캐쉬로 사용한다. 프리 메모리가 물리적 메모리 양의 1/64보다 적으면, Solaris는 프리 메모리를 1/64로 채우기 위하여 시스템에 있는 페이지를 조사하여, 최근에 사용되지 않은 페이지를 찾아서 프리시킨다.
이때 운영체제가 조사한 페이지의 갯수가 sr(scan rate)값이다. sr값이 높으면(30초 단위로 측정한 값이 초당 200-300 이상), 그 순간에 메모리가 부족하다고 판단할 수 있다.
프리시킨 페이지 수는 KB 단위로 환산되어 fr(free)에 보여준다. 페이지를 프리시킬 페이지의 내용이 변경되었을 경우, 그 페이지를 disk에 저장한다. (변경된 페이지가 프로그램의 데이타일 경우, 스왑 파티션에 저장되고, 화일 시스템의 케쉬이면 해당 디스크 파티션에 저장된다.) 이때, 디스크에 저장된 페이지를 KB 환산하여 po(page out)에 보여준다.
Solaris에서 화일 시스템은 페이지 서브 시스템을 통하여 이루어 진다. 즉, 화일 시스템의 입출력은 모두 page I/O로 이루어 진다. 화일 시스템을 통하여 화일을 읽을 때, 읽은 양은 KB로 환산되어 pi(page in)에 보여준다.

프로그램을 실행할 경우에 운영체제는 프로세스에 대한 어드레스 맵핑 테이블을 만들고, 프로세스를 실행한다. 프로세스가 실행되다가 필요한 페이지가 자신의 어드레스 맵핑 테이블에 연결되어 있지 않으면, 페이지 폴트가 발생하는데, 그 페이지가 메모리에 있으면(minor page fault라고 함), 그 페이지를 자신의 어드레스 맵핑 테이블에 등록한다. vmstat의 mf(minor fault)는 minor page fault 횟수를 나타낸다.

프리 메모리가 부족할 경우, paging이 발생하여 최근에 사용되지 않은 페이지를 찾아서 프리시켜 부족한 메모리를 보충하게 되는데, 이렇게 프리되는 페이지의 내용은 훼손되지 않고 프리 메모리 영역에서 관리된다. 이렇게 프리된 페이지가 프로세스의 요청에 따라 다시 사용될 수 있다. 이렇게 다시 사용된 페이지 수를 re(reclaim)에 보여준다.

페이지의 크기는 pagesize 명령어로 확인할 수 있다.(sun4u 시스템은 8KB이고 sun4m은 4KB이다)

# pagesize 8192

특별히 메모리를 많이 사용하는 프로그램이 없는데도, 보통 Solaris 시스템의 free memory의 크기가 아주 작게 보인다. 이것은 정상적이라고 말할 수 있다. 이것은 앞에서 설명한 바와 같이 화일 시스템의 캐쉬로 많은 부분이 사용되고 있기 때문이다. 이것을 테스트해 볼 수 있는 방법으로 다음과 같이 할 수 있다. 시스템을 부팅한 직후에는 free memory가 많이 남아 있다. 이 상태에서 화일 시스템 I/O를 많이 발생시키는 tar 명령어를 다음과 같이 실행시키면서 vmstat 명령어로 free memory가 어떻게 줄어 드는지 살펴 보십시오.

# tar cvf /dev/null / ... skip ...

tar 명령어가 루트 디렉토리에서 부터 모든 화일을 읽어 들여서 /dev/null로 저장한다. /dev/null은 특수화일이고, 이 곳에 쓰기를 하면 그 내용은 없어진다.

(Solaris 8부터는 메모리 관리 기법이 조금 다르다. 여기서 기술하는 내용은 Solairs 7 이하에 대하여 언급한다) 다음은 vmstat 명령어의 결과물에서 메모리 관련 값에 대하여 설명한다.

2.2   메모리 튜닝 파라메터

메모리 튜닝 파라메터에는 다음과 같은 것이 있다. 이 값을 잘 못 수정하면, 시스템에 안 좋은 영향을 줄 수 있다. 그러므로 메모리 관리 기법에 대하여 충분한 지식이 없는 경우, 아래에 열거하는 파라메터를 수정하지 않은 것이 바람직 하다.
여기서는 메모리 관리 방법을 이해하기 위하여 설명한다.

cachefree:

cachefree는 priority_paging이 설정되어 있는 경우에 사용되며, 디폴트로 lotsfree의 2 배로 설정되어 있다.

커널은 자유메모리(free memory)가 cachefree 보다 적을 경우, cachefree 만큼 유지하기 위하여 시스템에서 최근에 사용되지 않았던, 메모리를 찾아서 프리시키고, 그 메모리를 자유 메모리에 포함시킨다. 이때, 프리시킬 페이지를 찾기 위해서 커널은 물리적 메모리를 다음과 같은 4가지의 분류로 관리한다.

1. 프로세스의 코드 (process's code)
2. 프로세스의 데이타 (process's data)
3. 화일 시스템의 캐쉬 (file system cache)
4. 자유 메모리 (free memory)

여기서 자유 메모리가 cachefree 보다 작고, lotsfree 보다 크면, 프리시킬 메모리를 화일 시스템의 캐쉬 중에 최근에 사용하지 않은 페이지를 찾는다.

cachefree 보다 적은 부족분을 채우기 위해서 초당 일정량의 페이지를 조사한다. (slowscan, fastscan 참조)

lotsfree + pages_before_pager:

pages_before_pager는 디폴트로 200 설정되어 있다.

만일 자유 메모리가 lotsfree + pages_before_pager 보다 적을 경우, 다음과 같이 동작한다.

- write 수행한 페이지를 프리시킨다.
- UFS와 NFS 화일 시스템에서 sequential read한 페이지를 프리시킨다.
- NFS에서 read-ahead 기능을 중단한다.
- NFS write를 synchronous write 한다.

lotsfree:

lotsfree는 디폴트로 물리적 메모리의 1/64로 설정되어 있다.

만일 자유 메모리가 lotsfree보다 적을 경우에는 메모리의 분류와 상관없이 최근에 사용되지 않았던 메모리를 찾아서 프리시킨다.
이 경우에 프리시킬 메모리가 프로그램의 데이타이고 그 내용이 변경되어 있다면, 그 내용은 swap partition에 저장된다.

desfree:

desfree는 디폴트로 lotsfree의 1/2로 설정되어 있다.

자유 메모리의 크기가 최근 30초 동안 평균이 desfree보다 적으면,
NFS version3 write operation이 중지되고, kernel async I/O도 중지되고, idle process(maxslp(20) 이상 sleep한 프로세스)는 swap out된다(Soft swaping).

이때 Swap out된 프로세스의 정보가 vmstat의 w 컬럼에 보여진다. w의 값은 쓰레드(thread)의 갯수이다. 멀티 쓰레드 프로세스가 아닌 경우에는 하나의 프로세스는 하나의 쓰레드를 가진다. 한번 swap out된 프로세스는 그 프로세스가 다시 실행될 때 메모리로 들어온다. 예를 들어, 프린터 데몬 lpsched가 swap out되었다면, 프린터를 사용하는 작업을 하지 않은 한 메모리로 들어오지 않는다.

minfree:

minfree는 디폴트로 desfree의 1/2로 설정되어 있다.

만일 run queue에 2개 이상의 프로세스가 CPU를 사용하기 위하여 대기하고 있고, 자유 메모리의 크기가 최근 30초 동안 평균이 desfree보다 작고, 최근 5초 동안 평균이 minfree보다 작고, 페이지 I/O가 과도하게(pagein+pageout > maxpgio) 발생하면,
현재 엑티브하지 않은 커넬 모듈과 화일 시스템의 캐쉬를 프리시키고, 그래도 부족한 메모리를 확보하지 못 하면 프로세스를 추가적으로 swap out한다(Hard swaping).

throttlefree:

throttlefree는 디폴트로 minfree의 값으로 설정되어 있다.

치명적인 메모리 요구를 제외한 메모리 요청은 중단된다(blocked).

pageout_reserve:

throttlefree는 디폴트로 throttlefree의 1/2로 설정되어 있다.

모든 메모리 요청이 중단된다(blocked). (pageout and sched thread 제외)

slowscan:
fastscan:

slowscan은 디폴트로 100이다
fastscan은 디폴트로 8192이다

물리적 메모리가 lotsfree 이하로 떨어지면, 부족한 메모리를 보충하기 위하여 일정량의 페이지를 조사한다. 조사할 페이지 수는 부족한 메모리의 양에 따라 slowscan과 fastscan사이의 페이지 수에서 결정된다. 이렇게 결정된 페이지는 1/4씩 page scanner에 의해 1초에 4 차례씩 페이지 수를 조사한다. page scanner가 페이지를 조사할 때, 최대로 사용할 수 있는 CPU 사용율은 CPU 한 개의 95% 이다. 부족한 페이지가 보충된 경우에 scan을 중단한다.

maxpgio:

초당 page out할 수 있는 최대 페이지 수

handspreadpages:

handspreadpages는 디폴트로 fastscan 값으로 설정되어 있다.

클럭 알고리즘에서 front hand와 rear hand사이에 있는 페이지 수

Solaris에서 부족한 메모리을 보충하기 위하여 기존에 사용하고 있던 페이지 중에 최근에 사용하지 않은 페이지를 찾아서 프리시킨다.
최근에 사용하지 않은 페이지를 찾는 방법으로 Solaris에서 클럭 알고리즘을 사용한다. 시스템에 있는 모든 메모리를 연결하여 원을 만들고 시계처럼 두개의 바늘을 둔다. 그 중에 앞 바늘과 뒷 바늘과의 간격이 handspreadpages 이다. 시스템에 물리적 메모리가 부족하면 page scanner 기동한다. 이때 두시계 바늘을 동시에 움직이면서 front hand는 해당 페이지의 access bit를 클리어하고 rear hand는 그 해당 페이지에 access bit가 설정되어 있는지 조사하여 access bit가 설정되어 있지 않으면 그 페이지를 프리시킨다. access bit는 해당 페이지를 access하면 H/W MMU에 의해 자동으로 설정된다.

priority_paging:

priority paging을 사용하려면, 다음과 같은 내용을 /etc/system 화일에 넣고 시스템을 리붙하면 된다.

set priority_paging = 1

priority paging을 사용하면, scan rate가 좀 더 높아진다. 그러나 페이지를 프리할 때, 화일 시스템의 케쉬를 먼저 프리하기 때문에 프로그램의 데이타나 코드가 보호되어 시스템 성능이 향상된다.

Solaris 8에서는 새로운 캐쉬 메카니즘을 사용한다. 또한 priority paging을 지정하면 안 된다. Solaris 8에서는 케쉬로 사용되고 있는 물리적 메모리를 free memory에 포함시킨다.

2.3   시스템 메모리 사용량 확인

시스템이 사용하고 있는 메모리를 확인할 수 있는 시스템 명령어로는 다음과 같은 명령어들이 있다.

# swap -s total: 482240k bytes allocated + 47560k reserved = 529800k used, 674056k available # vmstat 1 2 procs memory page disk faults cpu r b w swap free re mf pi po fr de sr aa dd f0 s1 in sy cs us sy id 0 0 6 1464 4184 0 4 2 0 3 0 1 0 0 0 0 211 715 191 5 1 94 0 0 18 673968 16072 0 2 0 0 0 0 0 0 0 0 0 204 514 199 0 0 100 # sar -r 1 1 SunOS king 5.6 Generic_105181-25 sun4u 12/22/01 09:56:19 freemem freeswap 09:56:20 1922 1308132

사용 가능한 가상 메모리는 각각의 명령어의 결과에서 확인할 수 있다.


	 swap -s     vmstat    sar -r
	------------------------------------------------
	 674056KB   673968KB  1308132 Block(=654066 KB)

사용 가능한 물리적 메모리는 vmstat의 free(단위 KB)와 sar -r의 freemem(단위 Page)에서 확인할 수 있다.

free = freemem * pagesize in Kilobye (UltraSparc의 pagesize는 8KB이다) free = freemem * 8

Parm에 포함된 perfmon과 ParmView의 SWAP(단위 MB)과 FREE(단위 MB)에서도 확인할 수 있다.

2.4   프로세스 메모리 사용량 확인

프로세스가 사용하는 메모리 양은 다음과 같은 시스템 명령어로 확인할 수 있다.

# /usr/bin/ps -eafl
 F S      UID   PID  PPID  C PRI NI     ADDR     SZ    WCHAN    STIME TTY      TIME CMD
 8 S    guest 19345 19325  0  51 20 623ab780   1176 616138ae   Dec 14 ?        5:11 dtwm
 8 S    guest 10699 19347  0  61 20 62ee1678    218 62ee16e8 14:29:07 pts/11   0:00 /bin/ksh
 ... skip ...

# /usr/ucb/ps -aux
USER       PID %CPU %MEM   SZ  RSS TT       S    START  TIME COMMAND
guest    19345  0.5  1.6 9408 7968 ?        S   Dec 14  5:10 dtwm
guest    10699  0.0  0.3 1744 1368 pts/11   R 14:29:07  0:00 /bin/ksh
 ... skip ...  

프로세스가 사용하고 있는 메모리 양는 /usr/bin/ps의 SZ(단위 Page)와 /usr/ucb/ps의 SZ(단위 KB)이다. 그리고 /usr/ucb/ps의 RSS는 프로세스의 메모리(SZ) 중에서 물리적 메모리에 로드된 메모리 양이다. 또한 Parm에 포함된 psinfo 명령어에서도 확인할 수 있다.

psinfo 명령어에는 HP+STK라는 항목이 있는데, 이것은 프로세스의 heap과 stack를 더한 양이다. heap과 stack은 프로세스가 실행되면서 다이나믹하게 할당 받는 공간이며, 다른 프로세스들과 공유되지 않는 공간이다.
프로세스가 실행되면서 다이나믹하게 메모리를 할당 받으면, 그것은 heap 영역에 잡힌다. 메모리 관리를 잘 못 하는 프로세스가 있는지 여부를 판단하기 위해서는 heap 영역의 크기가 얼마인지를 먼저 확인하여야 한다. 그 프로세스가 동작하는 역할에 비하여 너무 많은 heap 영역을 사용하면 메모리 관리에 오류가 있을 가능성이 높다.
Parm의 psinfo 명령어에서 -h 옵션을 사용하면, HP+STK가 큰 순서로 정렬하여 보여준다. 또한 psinfo 명령어의 header에는 전체 프로세스가 사용하는 HP+STK를 합계한 정보도 보여준다.

# /opt/JSparm/bin/psinfo -h
Date.time 1207.17:34:23 proc 518 zomb 339 run 0 lwp 422 cpu 10.06% load1m 0.11 ptime 128742.41 hp+stk 250.1M
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED        TIME CMDLINE
11455 10585 guest    70.35M 60.51M 48.71M S    1   2.34%  2.34% 12.2%  1d10496    16:06.70 netscape
29795     1 guest    92.63M 76.16M 34.40M S   17   4.06%  4.06% 15.4%  3d25550 02:46:58.48 senddata -p 1200
29135 29110 guest    34.92M 16.95M 27.82M S    1   0.27%  0.27%  3.4%  3d30359    02:14.12 recvdata -p 1201
  323   322 nobody   46.03M 7.164M 27.07M S   71   0.00%  0.00%  1.4%  24d3926       34.04 checkdata
29320 29319 guest    38.35M 24.10M 26.02M S   12   0.00%  0.00%  4.9%  3d29489    03:28.75 /usr/dt/bin/dtmail
17664   395 root     56.68M 41.97M 16.44M S    1   2.06%  2.06%  8.5%  8d84118    23:52.56 savelog -f sv.conf
 ... skip ...  

SIZE와 RSS와 HP+STK 크기 관계는 다음과 같다.

SIZE >= RSS
SIZE > HP+STK

RSS와 HP+STK와의 크기에 대한 상관관계는 없다. 

프로세스의 메모리 상태를 좀 더 자세히 보고 싶으면, pmap 명령어를 사용할 수 있다.

# /usr/proc/bin/pmap -x 10699
10699:  /bin/ksh
Address   Kbytes Resident Shared Private Permissions       Mapped File
00010000     184     184     184       - read/exec         ksh
0004C000       8       8       -       8 read/write/exec   ksh
0004E000      56      56       -      56 read/write/exec    [ heap ]
EF580000     592     584     584       - read/exec         libc.so.1
EF622000      32      32       -      32 read/write/exec   libc.so.1
EF62A000       8       8       -       8 read/write/exec    [ anon ]
EF650000      64      64      64       - read/exec         ko.so.1
EF66E000       8       8       -       8 read/write/exec   ko.so.1
EF680000     456     424     368      56 read/exec         libnsl.so.1
EF700000      40      40       8      32 read/write/exec   libnsl.so.1
EF70A000      16       8       -       8 read/write/exec    [ anon ]
EF720000       8       8       8       - read/exec         methods_ko.so.1
EF730000       8       8       -       8 read/write/exec   methods_ko.so.1
EF740000      16      16      16       - read/exec         libc_psr.so.1
EF750000      16      16      16       - read/exec         libmp.so.2
EF762000       8       8       -       8 read/write/exec   libmp.so.2
EF780000       8       8       -       8 read/write/exec    [ anon ]
EF790000      32      32      32       - read/exec         libsocket.so.1
EF7A6000       8       8       -       8 read/write/exec   libsocket.so.1
EF7A8000       8       -       -       - read/write/exec    [ anon ]
EF7B0000       8       8       8       - read/exec         libdl.so.1
EF7C0000     128     128     128       - read/exec         ld.so.1
EF7EE000      16      16       -      16 read/write/exec   ld.so.1
EFFFC000      16      16       -      16 read/write         [ stack ]
--------  ------  ------  ------  ------
total Kb    1744    1688    1416     272 

2.5   Q & A

  2.5.1   특별히 메모리를 많이 사용하는 것이 없는데 메모리 양이 매우 적게 보입니다.

위에서 언급한 바와 같이 Solaris 운영체제는 물리적 메모리의 여유 공간을 화일 시스템의 캐쉬로 사용한다. 애플리케이션 프로그램이 화일을 읽고 쓸 경우, 커널 메모리를 거쳐서 I/O가 발생한다. 이때 화일을 읽거나 쓴 후에, 커널 메모리에 남아 있는 화일의 내용을 바로 지우는 것이 아니고, 캐쉬 용도로 사용하기 위하여 메모리에 남겨둔다. I/O가 많이 발생하면 화일 시스템의 캐쉬가 시스템의 메모리를 다 사용하게 될 것이다. 이것을 관리하기 위하여 커널은 물리적 메모리 양이 lotsfree(전체 물리적 메모리 양의 1/64(1.5%)) 이하로 줄어들 경우에 시스템에 있는 메모리를 조사하여 최근에 사용하지 않은 페이지를 찾아, 프리시켜서 lotsfree 양 만큼의 메모리를 유지한다.

그래서 일반적으로 시스템의 물리적 메모리의 양은 적게 보인다. 이것으로 시스템의 메모리가 부족하다고 판단할 수 없다. 일반적으로 시스템의 메모리가 부족하다고 판단할 수 있는 근거는 scan rate의 값으로 판단한다. 30초 간격으로 조사하여 약 200 - 300 이상이면 그 순간에 메모리 로드가 있다고 판단한다.

priority_paging을 사용하면 메모리 양이 cachefree(전체 물리적 메모리 양의 1/32(3%)) 보다 적게되면, 시스템이 있는 메모리를 조사하여 최근에 사용하지 않은 페이지를 찾아, 프리시켜서 cachefree 양 만큼의 메모리를 유지한다. 메모리가 lotsfree 양보다 클 경우에는 화일 시스템의 캐쉬로 사용되는 메모리만 프리시킨다. priority_paging가 사용되면, scan rate 값이 좀 더 크게 측정될 수 있다.

(Solaris 8에서는 화일 시스템의 캐쉬로 사용되는 메모리을 물리적 메모리 사용량으로 포함시키지 않는다.)

  2.5.2   어떤 프로세스가 메모리를 비정상적으로 많이 사용하는지 알 수 있읍니까?

애플리케이션 프로그램을 작성하면 프로그램이 사용하는 코드나 초기 데이타의 크기는 고정된다. 그리고 프로그램이 실행되어 프로세스로서 동작하게 되면 다이나믹하게 메모리를 할당 받을 수 있는데, 일반적으로 비정상적으로 메모리를 사용하는 프로세스는 다이나믹하게 메모리를 할당 받고, 그것을 제대로 관리하지 않아서 발생한다. 이렇게 할당 받은 데이타는 프로세스의 힙(heap) 영역에 포함된다. 따라서 힙(heap)이 큰 프로세스가 있다면, 그 프로세스가 그 만큼의 힙(heap)을 사용할 프로세스인지 아니지를 판단하여야 한다. 만일 비정상적으로 힙(heap)을 사용한다고 판단이 되면, 그 프로그램의 개발자에서 알려서 프로그램을 수정하여야 할 것이다.
프로세스가 얼마나 많은 힙(heap)을 사용하는가를 확인하려면, Parm에 포함된 psinfo 명령어로 확인할 수 있다. psinfo에 -h 옵션을 사용하면 힙(heap)을 많이 사용하는 순서로 화면에 보여준다.

# /opt/JSparm/bin/psinfo -h
Date.time 0123.12:27:07 proc 518 zomb 339 run 0 lwp 422 cpu 15.26% load1m 0.20 ptime 128706.45 hp+stk 249.9M
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED        TIME CMDLINE
19440 19438 guest    131.0M 84.38M 107.4M R    1   4.90%  4.90% 17.0%  8d73139 03:00:59.86 netscape
13217 13216 nobody   44.42M 10.82M 26.12M S   59   0.00%  0.00%  2.2%   1d7702       16.18 ns-httpd -d config
  200     1 root     6.070M 1.555M 2.875M S   10   0.00%  0.00%  0.3% 58d11424       16.60 /usr/sbin/syslogd
  283     1 oracle   63.89M 41.88M 2.547M S    1   0.00%  0.00%  8.5% 58d11409       09.85 ora_pmon_SOL
19345 19325 guest    9.258M 6.805M 2.141M S    7   0.68%  0.68%  1.4%  8d73245    05:59.89 dtwm
19904 19903 guest    7.172M 4.438M 1.594M S    1   0.00%  0.00%  0.9%  8d66806       09.37 dtpad -server
19339     1 guest    4.383M 3.250M 1.266M S    4   0.00%  0.00%  0.7%  8d73246       26.76 senddata -p 1200
  285     1 oracle   63.02M 44.93M 1.258M S   22   0.00%  0.00%  9.1% 58d11409       02.33 ora_dbw0_SOL
  287     1 oracle   62.78M 45.05M 1.203M S   14   0.00%  0.00%  9.1% 58d11409       02.66 ora_lgwr_SOL
  289     1 oracle   62.72M 44.91M 1.172M S   11   0.00%  0.00%  9.1% 58d11409       02.42 ora_ckpt_SOL
  ... skip ...  

HP+STK는 프로세스의 힙(heap)과 스택(stack)을 합계한 크기이다. 만일 프로세스의 메모리 크기 순서(SIZE)로 정열할 경우에 oracle과 같이 큰 공유메모리를 사용하는 프로세스가 있다면, 그 프로세스들이 상위를 차지할 것이다. 전체 크기(SIZE)로 보아서는 그 프로세스가 얼마나 많이 다이나믹한 메모리를 할당 받았는지 알 수 없다.
프로세스 메모리 맵에 대한 자세한 정보는 /usr/proc/bin/pmap 명령어를 사용하여 확인할 수 있다.

  2.5.3   vmstat의 w값이 30으로 계속해서 보입니다.

vmstat의 w가 의미하는 것은 swap out된 쓰레드(thread) 갯수를 나타내며, 멀티 쓰레드 프로세스가 아닌 경우에는 하나의 프로세스는 하나의 쓰레드를 가진다.
한번 swap out된 프로세스는 그 프로세스가 다시 실행될 때 메모리로 들어온다. 예를 들어, 프린터 데몬 lpsched가 swap out되었다면, 프린터를 사용하는 작업을 하지 않은 한 메모리로 들어오지 않는다.
vmstat의 w값에 0이 아닌 값이 나타날 무렵에 시스템의 메모리 로드가 극심했다는 것을 알 수 있다.

이렇게 메모리 로드를 극심하게 야기시킬 수 있는 경우는 다음과 경우가 있을 수 있다.

1. 프로세스를 동시에 많이 실행하여 메모리 요청이 집중되었을 경우
2. 화일 시스템 backup과 같이 광범위하게 많은 양의 화일을 동시에 액세스할 경우
3. 프로세스가 큰 메모리를 요구하여 짧은 시간에 초기화 할 경우

  2.5.4   df -k 에서 swap의 크기가 변합니다

# df -k /tmp Filesystem kbytes used avail capacity Mounted on swap 845712 196248 649464 24% /tmp # ... skip .... # df -k /tmp Filesystem kbytes used avail capacity Mounted on swap 706336 196248 510088 28% /tmp

실제로 df -k 명령어에서 보여주려고 하는 값은 swap의 값이 아니라 /tmp의 값을 보여주려고 한다. / 화일 시스템의 저장공간은 하드 디스크의 특정 파티션(예, /dev/dsk/c0t0d0s0)이고 이 크기는 화일 시스템을 다시 만들기 전까지는 불변이다. 그러나 /tmp 화일 시스템의 저장공간은 하드 디스크의 특정 파티션이 아니고 가상 메모리를 저장공간으로 사용한다. / 화일 시스템은 ufs 라는 화일 시스템을 사용하는 반면에, /tmp 화일 시스템은 tmpfs 라는 특수한 화일 시스템을 사용한다. 이것은 화일 시스템의 저장공간으로 가상 메모리(VM: swap)를 사용한다. 그래서 프로세스들이 메모리를 많이 사용하면 가상 메모리 공간이 줄어든다. 그 결과 /tmp 디렉토리에 화일들이 더 이상 만들어 지지 않았음에도 불구하고 swap 공간이 줄어서 /tmp 디렉토리가 100%로 될 수 있다.

  2.5.5   vmstat 명령어의 결과에서 프리 메모리량에 대하여 그래프를 만들 수 있읍니까?

Parm에는 vmstat, iostat, mpstat, netstat, sar의 결과물에서 주요 필드에 대하여 그래프를 만들 수 있는 명령어들(gvmstat, giostat, gmpstat, gnetstat, gsar)이 있다. 뿐만 아니라, 행과 열로 된 데이타에 대하여 그래프를 만들 수 있는 명령어(mkgraph)가 있다.
vmstat 명령어의 결과를 수집한 화일이 vmstat.log가 있고(09시 정각에 30초 간격으로 수집했다고 가정), 이 화일에 대하여 다음과 같이 free 메모리 그래프를 만들 수 있다.

# gvmstat -t 09:00:00 -i 30 -G free -o output vmstat.log

위의 명령어는 output.gif 화일을 만든다. 다음은 output.gif의 내용이다.

  2.5.6   swap -s 에서 실제로 할당된 메모리의 크기를 모니터하여 그래프를 그려볼 수 있읍니까?

# swap -s total: 664720k bytes allocated + 53320k reserved = 718040k used, 485160k available

swap -s 명령어를 실행하여 allocated 된 부분과 reserved 된 부분과 이 두개를 합계한 used 된 부분에 대하여 다음과 같이 그래프를 만들 수 있다.

# dolog -o swap-s -t -T 30,480 swap -s # ls -l swap-s.021105.091020.30 # mkgraph -G 2::allocated,6::reserved,9::used -A -i 30 -t 091020 -o swap swap-s.021105.091020.30 # ls -l swap-s.021105.091020.30 swap.gif

dolog 명령어는 Parm V6.1에 포함된 명령어이다. 이것은 지정한 명령어를 일정 시간간격으로 실행하여 그 결과을 화일에 저장한다. 이렇게 저장된 결과에 대하여 mkgraph 명령어로 그래프를 그린다.
다음은 swap.gif 화일의 내용이다.

반응형

'OS > SOLARIS' 카테고리의 다른 글

[펌] 솔라리스 백업 정책  (0) 2005.07.14
[펌] 백업과 복구  (0) 2005.07.12
[펌] Fast Ethernet Duplex 설정  (0) 2005.07.12
[펌] /etc 파일 설명  (0) 2005.07.12
[펌] [Solaris] 솔라리스 환경설정  (0) 2005.07.12
Posted by [PineTree]
OS/SOLARIS2005. 7. 12. 20:58
반응형
Fast Ethernet Duplex 설정

 

 

1. Duplex란?

 

Duplex는 시스템 상호간 통신시 송신과 수신이 어떤 형식으로 이루어 지는 지에 대한 mode를 말한다. Simplex는 단방향 통신을 말하고 즉, 일방적으로 송신자는 송신만을 하고 수신자는 수신만을 하는 통신 형태를 말한다. Duplex는 쌍방이 서로 송신과 수신을 수행하는 형태를 말하며 세부적으로 Half Duplex와 Full Duplex로 구분한다.

 

Half Duplex는 우리나라 말로 반 이중방식이라고 하며 데이터를 송신하는 동안에는 데이터를 수신하지 못하는 방식이다. 예를 들면, 무전기와 같은 통신방식이 예가 될 수 있다.

 

Full Duplex는 우리나라 말로 전 이중방식이라 하며 통신하는 쌍방은 데이터 송신과 동시에 수신할 수 있는 방식이다. 일반적인 데이터 통신은 대부분 Full duplex  형식이다.

 

고전적인 Ethernet 네트워크 구성은 동축 케이블이나 HUB를 통해 구성되며, 프로토콜 특성상 공유 매체를 통해서는 송신이나 수신 트래픽에 관계없이 하나의 트래픽만이 매체를 통해 전달될 수 있다. 결국 통신 형태는 Half Duplex 형식으로 이루어지게 된다.

그러나 Switch의 출현으로 인해 Full Duplex로 Ethernet 네트워크를 구성할 수 있게 되었고 Full Duplex로 연결 구성된 모든 컴퓨터들은 송신과 동시에 데이터를 수신할 수 있게 되었다. 결과적으로 송/수채널의 분리로 100Mbps Ethernet의 경우 총 Throughput은 200Mbps를 갖게된다.

 

2. Duplex 설정 문제로 인한 장애현상들

 

Duplex 설정은 서버와 같은 시스템의 네트워크 인터페이스와 Switch 포트 간, Switch 포트와 Router 인터페이스간 서로 일치하여야 한다. 100/10 Ethernet 카드와 Switch의 경우  상호 auto-negotiation을 수행하여 speed와 duplex mode를 자동적으로 설정하게 되지만 장비간 auto-negotiation protocol의 차이로 인해 제대로 연결되지 않는 경우가 발생하게 된다.

따라서, 100Mbps 속도를 지원하고 Full Duplex를 지원하는 장비들 간에는 Auto-negotiation기능을 disable하고 100Mbps-Full Duplex로 fix하여 운영하는 것이 바람직하다.

 

Application

Duplex 문제로 인해 발생되는 현상은 Application 사용시에 응답속도가 느리다는 것과 응답속도가
전반적으로 느린 것이 아니라 순간적인 delay가 발생한다는 것이다. 따라서 현상 자체로 보면 system 자체의 성능문제나 Application의 문제로 생각하기 쉽다. 만약 서버시스템이 100Mbps로 Switch와 연결되어 있다면 이 Duplex 설정을 확인해 볼 필요가 있다.

Switch/Server NIC Statistics

Duplex 설정문제가 있는 경우, 서버와 연결된 Switch의 Port Statistics를 확인할 때 일반적으로 다음의 error들이 발생하게 된다.

- Collision

Collision 현상은 Full Duplex 환경에서는 거의 발생하지 않아야 한다. 매우 Busy한 서버인 경우는 예외이지만, 대부분의 경우, Collision 현상은 매우 적게 나타난다. 그러나 Duplex 설정이 서로 맞지 않는 경우는 매우 많은 collision들이 발생하게 된다.

- Runt, CRC

서버와 스위치간 또는 스위치와 라우터간 Duplex 설정이 서로 맞지 않는 경우, 한편에서는 2차선을이용하여 송신과 수신 데이터를 처리하려하고 다른 한편은 단지 1차선으로 모든 데이터를 처리하다보니 충돌이 빈번히 발생하고 그에 따라 Runt 패킷과 그에 따른 CRC 패킷들이 다수 발생하게 된다. Duplex 설정 문제로 인해 발생되는 collision은 CRC를 유발한다는 것이 일반적인 collision 현상과 구별된다. 다수의 CRC는 Application 계층에서 재 전송을 일으키게 되고 재 전송 메카니즘은 사용자의 응답속도 저하를 유발하게 된다.

 

3.  OS별 Duplex 설정

OS별로 NIC의 duplex를 설정하는 방법이 다르다. 따라서 대표적인 OS별로 Duplex를 설정하는 방법을 설명하도록 한다.

 

3.1. Solaris


Full Duplex Configuration

Solaris는 NIC를 Full Duplex로 설정하는 데 3가지 방법이 있다.
 

Driver dependent config

설치된 네트워크 인터페이스 driver의 구성을 직접 config한다. 그 구성 파일은 "/kernel/drv/hme.conf" 이다. 이 구성은 Solaris에 hme NIC이 장착된 경우이다.

/kernel/drv/hme.conf

adv_autoneg_cap = 0
adv_100fdx_cap = 1
adv_100hdx_cap = 0
adv_10fdx_cap = 0
adv_10hdx_cap = 0


/etc/system config

/etc/system 파일을 수정하여 Full Duplex를 지정한다.

/etc/system

set hme:hme_adv_autoneg_cap=0
set hme:hme_adv_100hdx_cap=0
set hme:hme_adv_100fdx_cap=1


ndd utility를 이용한 config

ndd utility를 이용하여 Full Duplex를 지정하는 경우는 시스템 reboot 시 다시 설정을 하여야 한다.

#ndd -set /dev/hem adv_autoneg_cap 0
#ndd -set /dev/hem adv_100hdx_cap 0
#ndd -set /dev/hem adv_100fdx_cap 1

 

NIC Duplex mode와 Speed를 확인하는 방법
ndd utility 이용

#ndd  /dev/hem link_speed <return>
1  ;      100Mbps
#ndd  /dev/hem link_mode <return>
1  ;      Full Duplex Mode

Full Duplex mode를 enable한 후에는 성능향상을 위해 TCP의 송신과 수신 buffer size를 증가시키는 것이 좋다. TCP 송/수신 buffer를 증가시키기위해서 다음의 command를 이용하며 시스템 reboot시에도 적용되디위해서는 rc script에 해당 command line를 입력하도록 한다.

#ndd  -set  tcp_recv_hiwat 65536
#ndd  -set  tcp_xmit_hiwat  65536


3.2. HP-UX 11.0


Full Duplex Configuration

설치된 네트워크 카드에 따라 /etc/rc.config.d 디렉토리 안에 있는 다음의 파일들을 수정하여야 한다.

/etc/rc.config.d/

hpsppci100conf  ; LAN, 10/100 Base-TX LAN Adapter(PCI Slot)
hppci100conf     ; LAN, 10/100 Base-TX LAN Adapter(PCI Slot)
hpgsc100conf    ; LAN, 10/100 Base-TX LAN Adapter(GSC Slot)
hpgelanconf      ; LAN, 10/100 Base-TX LAN Adapter(PCI Slot)


위 나열된 구성파일 중에서 설치된 NIC에 해당하는 파일을 편집한다. 파일 안에서 설치된 네트워크 인터페이스의 이름을 찾은 다음
"_SPEED[0]" 행을 수정하여야 한다. 예를 들면,

HP_PCI100_SPEED[0]=100FD

와 같이 수정한다. 수정한 다음 변경사항을 적용하기위하여 "/sbin/init.d/net start"를 실행한다.
 

NIC Duplex mode와 Speed를 확인하는 방법

HP-UX 11.0에서 NIC의 Speed와 Duplex mode를 확인하기 위해서는 "lanadmin"이라는 프로그램을 수행하여 확인한다. 수행한 화면에서 "lan" 그리고 "dis" 메뉴를 선택하면 "Description" 행에 현재 Duplex mode가 어떻게 설정되어있는 지를 확인할 수 있고 "Speed" 행은 현재 적용된 Speed를 Mbps단위로 보여준다.

 

3.3. Linux
 

Full Duplex Configuration

Linux의 경우 다양한 LAN Card를 지원하는 관계로 실제 설치된 LAN Card driver에 따라 Options를 다르게 설정하여야 한다. 따라서 설치한 Driver의 설정 방법을 반드시 확인한 뒤 설명에 따라 duplex를 지정하여야 한다. 일반적으로 modprobe 명령을 이용하여 Duplex 설정 및 Speed를 설정하거나 /etc/modules.conf 파일에 필요한 설정을 지정하여 매 reboot시 마다 적용될 수 있도록 한다.

아래에는 가장 일반적인 LAN card인 Intel 계열 LAN card의 duplex 설정 방법을 설명한다.

 

insmod or modprobe 명령사용
인텔 e100 driver를 이용하는 LAN card의 경우

#insmod e100.o e100_speed_duplex=4,4 (for two adapters)


/etc/modules.conf 설정

/etc/modules.conf

alias  eth0  e100
alias  eth1   pcnet32
options e100 e100_speed_duplex=4
options pcnet32 options=14

e100 driver Options
e100_speed_duplex
Valid Range: 0-4 (1=10half;2=10full;3=100half;4=100full)
Default Value: 0

pcnet32 driver Options
options pcnet32 options=0          #(Autonegotiation)
options pcnet32 options=9
          #(MII, 10Mbps, Half duplex)
options pcnet32 options=10
          #(MII, 10Mbps, Full duplex)
options pcnet32 options=13
          #(MII, 100Mbps, Half duplex)
options pcnet32 options=14          #(MII, 100Mbps, Full duplex) 

NIC Duplex mode와 Speed를 확인하는 방법

Linux의 경우는 NIC 의 현재 speed 설정과 Duplex를 확인할 수 있는 방법이 OS 차원에서 제공되지 않는다. 따라서 확인할 수 있는 방법은 Linux 시스템과 연결된 Switch의 port 상태를 확인하여 알 수 있다.

 

* 원본자료 : http://www.enclue.com/operation/guide/duplex.html

 

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

qfe interface는 디폴트로 네트웍에 연결된 상대방의 interface와 negotiation하여
10/100 half/full duplex에 맞게 연결이 된다. 그러나 이 negotiation 기능이 없는
장비나 다른 이유로 하여 negotiation을 하지 못 하여 interface가 UP 되지 못할 경우가
있다. 이 경우에는 negotiation 기능을 사용하지 말고, 연결될 장비의 setting에
맞추어 수동으로 10/100 half/full duplex 설정하여야 한다.

qfe interface의 parameter를 변경하기 위한 방법에는 2 가지가 있다.

        a) ndd 명령어를 사용하는 방법
        b) /etc/system 화일을 수정하는 방법

1. ndd 명령어를 사용하여 변경

    1.1. qfe interface의 속도를 10MB full duplex로 설정하려면 다음과 같이 한다.

         # ndd -set /dev/qfe adv_100T4_cap 0
         # ndd -set /dev/qfe adv_100fdx_cap 0
         # ndd -set /dev/qfe adv_100hdx_cap 0
         # ndd -set /dev/qfe adv_10fdx_cap 1
         # ndd -set /dev/qfe adv_10hdx_cap 0
         # ndd -set /dev/qfe adv_autoneg_cap 0

    1.2. qfe interface의 속도를 10MB half duplex로 설정하려면 다음과 같이 한다.

        # ndd -set /dev/qfe adv_100T4_cap 0
        # ndd -set /dev/qfe adv_100fdx_cap 0
        # ndd -set /dev/qfe adv_100hdx_cap 0
        # ndd -set /dev/qfe adv_10fdx_cap 0
        # ndd -set /dev/qfe adv_10hdx_cap 1
        # ndd -set /dev/qfe adv_autoneg_cap 0

    1.3. qfe interface의 속도를 100MB full duplex로 설정하려면 다음과 같이 한다.

        # ndd -set /dev/qfe adv_100T4_cap 0
        # ndd -set /dev/qfe adv_100fdx_cap 1
        # ndd -set /dev/qfe adv_100hdx_cap 0
        # ndd -set /dev/qfe adv_10fdx_cap 0
        # ndd -set /dev/qfe adv_autoneg_cap 0

    1.4. qfe interface의 속도를 100MB half duplex로 설정하려면 다음과 같이 한다.

        # ndd -set /dev/qfe adv_100T4_cap 0
        # ndd -set /dev/qfe adv_100fdx_cap 0
        # ndd -set /dev/qfe adv_100hdx_cap 1
        # ndd -set /dev/qfe adv_10fdx_cap 0
        # ndd -set /dev/qfe adv_autoneg_cap 0

2. /etc/system 화일을 변경

    /etc/system 화일에 변경한 내용은 바로 적용되지 않고, 시스템을 리부팅한
    후에 적용된다.

    2.1 qfe interface의 속도를 10MB full duplex로 설정하려면 다음과 같이 한다.

        set qfe:qfe_adv_autoneg_cap=0
        set qfe:qfe_adv_100T4_cap=0
        set qfe:qfe_adv_100fdx_cap=0
        set qfe:qfe_adv_100hdx_cap=0
        set qfe:qfe_adv_10fdx_cap=1
        set qfe:qfe_adv_10hdx_cap=0

   2.2 qfe interface의 속도를 10MB half duplex로 설정하려면 다음과 같이 한다.

        set qfe:qfe_adv_autoneg_cap=0
        set qfe:qfe_adv_100T4_cap=0
        set qfe:qfe_adv_100fdx_cap=0
        set qfe:qfe_adv_100hdx_cap=0
        set qfe:qfe_adv_10fdx_cap=0
        set qfe:qfe_adv_10hdx_cap=1

    2.3 qfe interface의 속도를 100MB full duplex로 설정하려면 다음과 같이 한다.

        set qfe:qfe_adv_autoneg_cap=0
        set qfe:qfe_adv_100T4_cap=0
        set qfe:qfe_adv_100fdx_cap=1
        set qfe:qfe_adv_100hdx_cap=0
        set qfe:qfe_adv_10fdx_cap=0
        set qfe:qfe_adv_10hdx_cap=0

   2.4 qfe interface의 속도를 100MB half duplex로 설정하려면 다음과 같이 한다.

        set qfe:qfe_adv_autoneg_cap=0
        set qfe:qfe_adv_100T4_cap=0
        set qfe:qfe_adv_100fdx_cap=0
        set qfe:qfe_adv_100hdx_cap=1
        set qfe:qfe_adv_10fdx_cap=0
        set qfe:qfe_adv_10hdx_cap=0

3. 위와 같이 하면 시스템에 설치되어 있는 모든 qfe interface의 속도를 10MB 또는
   100MB로 지정할 수 있다. 그러나 각 interface별로 각각 다른 속도를 지정하고
   싶은 경우에는 아래와 같이 interface를 먼저 지정한후 1 또는 2번 과정을 실행
   한다.

   3.1 ndd 명령어를 사용하는 경우

        ndd -set /dev/qfe instance "instance-number"

   3.2 /etc/system 화일을 수정하는 경우

        set qfe:qfe_instance="instance-number"

   위의 설명에서 "instance-number"는 qfe0 interface는 "0", qfe1 interface는
   "1", qfe2 interface는 "2"... 와  같이 정의 된다.

반응형
Posted by [PineTree]
OS/SOLARIS2005. 7. 12. 20:53
반응형
CORBA/==CORBA(Common Object Request Broke Architecture)에 파일을 저장한다
DIR_COLORS==컬러-ls 명령어 표시색의 설정파일
HOSTNAME==FQDN(Fulley Quallified Domain Name)형식으로 호스트명으로 쓰여있는 파일
Muttrc==메일소프트웨어 Mutt의 설정파일
TextConfig==콘솔 화면의 해상도,커서모양,폰트정보
X11==X Window System 설정파일군을 저장하는 디렉토리
adjtime==시각을 설정하는 hwclock의 파라미터 파일
aliases==메일의 앨라이어스 설정파일
aliases.db==메일의 앨라이어스 데이터베이스 파일
amd.conf,amd.net==amd 데몬의 설정 파일
anacrontab==24시간 가동하지 않는 시스템을 위한 cron
at.deny==at 명령어 이용을 금지하는 유저를 기술하는 파일
auto.master==automount 데몬의 설정 파일
auto.misc==automount데몬이 이용하는 맵 파일
bashrc==bash 기동시에 실행되는 설정 파일(~/.bashrc)의 템플릿
cdrecord.conf==cdrecord 명령어의 설정 파일
charsets/==Mutt 캐릭터세터 정의 파일을 저장하는 디렉토리
codepages/==삼바에서 이용하는 codepage 정보를 저장하는 디렉토리
conf.linuxconf==linuxconf의 모듈을 기술한 파일
conf.modules==modeprobe가 이용하는 로더블 모듈 설정 파일(테보리눅스는 modules.conf)
cron.d/==crontable 명령어의설정 파일을 저장하는 디렉토리
cron.daily/==하루에 1회 자동 실행시키고 싶은 스크립트를 저장하는 디렉토리
cron.hourly/==1시간에 1회 자동 실행시키고 싶은 스크립트를 저장하는 디렉토리
cron.monthly/==1개월에 1회 자동 실행시키고 싶은 스크립트를 저장하는 디렉토리
cron.weekly/==1주일에 1회 자동 실행시키고 싶은 스크립트를 저장하는 대렉토리
crontab==crontab명령어의 설정 파일
csh.cshrc==C 쉘 기동시에 실행되는 설정 파일(~/.cshrc)의 디렉토리
csh.login==C 쉘이 로그인시에 시랳하는 설정파일(~/.login)의 디렉토리
default/==신규유저용 디폴트 설정을 저장하는 디렉토리
dhcpc/==DHCP 클라이언트 데몬 dhcpcd가 네트웍 정보를 저장하는 디렉토리
dumpdates==dump명령어로 디스크의 백업을 한 일시와 시각등이 기록된다
enscript.cfg==텍스트 파일을 PostScript로 변환하는 enscript 의 설정 파일
esd.conf==Enlightened Sound Daemon 설정 파일
exports==nfs(Network File System)서버의 설정파일
fb.modes==프레임버퍼 디바이스의 데이타베이스파일(레드햇 리눅스만)
fdprm==플로피 디스크의 패러미터 파일
filesystems==이용할수 있는 파일 시스템의 리스트가 기술된 파일
fnrc==폰터렌더링 라이브러리 fnlib의 설정 파일
fstab==파일 시스템과 마운트 포인터를 기술하는 파일
ftpaccess==ftp서버의 설정 파일
ftpconversions==ftp서버에서 압축/아카이브 전송시의 명령어와 확장자의 설정파일
ftpgroups==ftp서버의 설정 파일
ftphosts==ftp서버에 액세스를 허가/금지하는 호스트를 설정하는 파일
ftpusers==ftp 액세스를 금지하는 유저를 설정하는 파일
gated.conf.sample==동적경로 설정 데몬 gated의 설정 파일 견본
gettydefs==getty가 이용되는 시리얼의 설정 일람
gnome/==GTK+의 국제화 대응 캐릭터 세트 정의 파일을 저장하는 디렉토리
gpm-root.conf==컷&페이스트와 마우스서버(gpm)의 디폴터핸들러의설정파일
group==유저그룹을 정의한 파일
group-==그룹파일의 백업
gshadow==암호화된 그룹 패스워드를 기술한 파일
gshadow-==gshadow의 백업
gtk/==The Gimp Toolkit(GTK+)의 국제화 대응 캐릭터세트 정의 파일을 저장하는 데렉토리
host.conf==name resolve 에 사용되는 방법.우선순위의 설정파일(libc5)
hosts==로컬에서 이름을 해결하기 위한 호스트명,IP 어드레스 정의 파일
hosts.allow==inetd 경유에서 기동된 서버의 액세스 제어 파일,접속 허용 호스트를 기록
hosts.deny==inetd 경유에서 기동ㄷ횐 서버의 액세스 제어파일,접속 불허 호스트를 기록
httpd/==웹서버 Apache의 설정파일 등을 저장하는 디렉토리
identd.conf==개인 인증에 사용되는 identd의 설정 파일
im_palette-small.pal,im_palette-tiny.pal,im_palette.pal,imrc==
화상이미지 묘사 라이브러리 imlib의 파레트 설정 파일
inetd.conf==인터넷 수퍼서버 inetd 설정 파일
info-dir==info명령어가 디폴트로 표시하는 파일
initlog.conf==init가 출력하는 로그인에 관한 설정 파일
inittab==기동시의 런 레벨과 init설정을 기술하는 파일
inputrc==bash등이 이용한느 행입력 컬러 라이브러리의 Readline의 설정 파일
ioctl.save==싱글유저 모드에서 이용하는 콘솔 디바이스 설정(init가 작성한다)
irda/==적외선 통신을 하기위한 irda-utils 패키지의 초기화 스크립트 저장 디렉토리
isapnp.gone==ISA plug&play로 인식할수 없는 리소스를 기술하는 파일
isdn/==ISDN카드 지원 설정 파일을 저장하는 디렉토리
issue==로컬에서 로그인 시 표시하는 메시지
issue.net==리모트에서 로그인 할때 표시하는 메시지
krb5.conf==케로베로스의 설정 파일
ld.so.cache==공유라이브러리를 검색할 떄 이용하는 캐시파일
ld.so.conf==공유라이브러리를 저장하는 디렉토리를 기술하는 파일
ldap.conf==LDAP(Lightweight Directory Access Protocol)모듈 nss_ldap 설정 파일
lilo.conf==lilo 설정 파일
linux-terminfo/==사용되고 있는 콘솔에 대한 데이타가 저장되어 있다
lmhosts==Samba가 NetBios명 해결에 이용하는 호스트명,IP 어드레스 정의 파일
localtime== 머신의 타임존이 쓰여져 있는 바이너리 파일
login.defs==로그인의 설정
logrotate.conf==로그 관리 유틸리티 logrotate의 설정 파일
logrotate.d/==RPM파일에서 인스톨한 데몬을 위한 logrotate설정 파일을 저장한다
ltrace.conf==라이브러리 트레이서의 설정 파일
lvs.cf==레드햇 클러스트링 서비스의 데몬 콘솔 설정 파일
lynx.cfg==텍스트 베이스 웹 브라우저lynx의 설정 파일
mail/==Send mail이 이용한 데이타베이스 파일 등을 저장한다
mail.rc==메일 명령어의 설정 파일
mailcap==metamail 설정 파일
mailcap.vga==metamail 설정 파일(멀티미디어 메일 처리)
man.config==man 명령어의 설정 파일
mc.global==파일 매니저 GNU Midnight Commander의 설정 파일
mesa.conf==OpenGL호환 3D 라이브러리 mesa의 설정 파일
mgetty+sendfax/==mgetty+sendfax 패키지의 설정 파일을 저장하는 디렉토리
midi/==MIDI플레이어의 playmidi 등이 이용한느 음색파일 저장 디렉토리
mime-magic==파일 내용에서 마임 형식을 판단하기 위한 정의 파일
mime-magic.dat==mime-magic에서 만들어진 데이타베이스 파일
mime.types==웹서버 아파치(Apache)가 이용하는 MIME 정의 파일
minicom.users==시리얼통신 프로그램 minicom의 유저 설정 파일
motd==로그인할 때 표시되는 메시지를 기술하는 파일
mtab==마운트 되어있는 파일 시스템의 일람이 쓰여져 있는 파일
mtftpd.conf==리모트 부트 데몬 pxe에서 이용하는 MTFTP서버의 설정 파일
mtools.conf==도스의 패키지를 읽고 쓰는 툴 패키지의 mtools의 설정 파일
named.boot==DNS서버 BIND4의 설정 파일
named.conf==DNS server BIND8의설정 파일
news/==net news server inn의 설정 파일을 저장한다
nmh/==MH를 베이스로 한 메일 툴 패키지 mtools의 설정 파일
nscd.conf==네임서비스 참조개시 데몬 nscd의 설정 파일
nsswitch.conf==시스템데이타베이스와 네임서비스 스위치 설정 파일
ntp/==Network Time Protocol서버 xntp3 패키지가 데이타를 저장
ntp.conf==Network Time Protocol서버 xntpd의 설정 파일
newserv.conf==mars(Netware 에뮬레이터) 설정 파일
newserv.stations==mars용 네트웨어 설정 파일을 저장한다
openldap/==OpenLDAP(Light Weight Directory Access Protocol) 설정 파일 등을 저장
pam.d/==PAM(Pluggable Authentication Modules)의 설정 파일을 저장한다
paper.config==용지 크기의 정의 파일
passwd==모든 유저의 유저명,유저id,그룹id등이 기술되어 있는 파일
passwd-==passwd의 백업
pbm2ppa.conf==portable bitmap 이미지 파일을 HP프린터로 사용하는 PPA 파일로 변환하는 툴의 설정 파일
pcmcia/==pcmcia의 설정 파일을 저장하는 디렉토리
phhttpd.conf==http 엑셀레이터 phhttpd의 설정파일
pine.conf==메일/뉴스 리더 pine의 설정 파일
pine.conf.fixed==메일/뉴스리더 pine의 설정 파일
pnm2ppa.conf==portable anymap 이미지 파일을 HP프린터로 사용하는 PPA 파일로 변환하는 툴의 설정 파일
ppp/==ppp데몬의 설정 파일을 저장하는 디렉토리
printcap==프린터의 설정 파일
profile==bash가 로그인 할떄 실행되는 설정 파일
profile.d/==로그인시 프로파일에서 불려나와 실행된 스크립트의 저장 디렉토리
protocols==프로토콜 설정 파일 (변경 불가)
pwdb.conf==pwdb의 설정 파일
pxe.conf==리모트 부트 데몬 pxe의 설정 파일
rc.d/==기동시에 데몬 등을 기동하는 스크립트를 저장하는 디렉토리
redhat-release등==디스트리뷰션의 릴리스명.issue로 전송된다.
resolv.conf==이름 해결 수단의 우선순위 등 리졸버의 설정 파일
rmt@==/sbin/rmt로의 링크,백업때 사용된다
rpc==RPC(Remote Procedure Call)서버 명과 번호의 대응이 기술된 파일
rpm/==RPM명령어 패키지에 이용하는 디렉토리
rpm2html.config==RPM 레포지터리에서 HTML 데이타베이스를 작성하는 rpm2html 설정파일
rpbfind.conf==인터넷상의 RPM 파일을 검색하는 rpm2html 설정파일
rpmlint/==RPM파일의 에러를 체크하는 rpmlint의 설정파일을 저장한다
screenrc==화면관리 프로그램,스크린의 설정파일 템플릿
security/==PAM(pluggable authentication modules)에서 이용하는 모듈을 저장
sendmail.cf==sendmail의 동작 설정 파일
sendmail.cw==sendmail에서 호스트 명을 이용하는 경우 별명을 정의 하는 파일
sendmail.mc==sendmail.cf를 만들기 위한 매크로 정의 파일,매크로 프로세서 m4로 이용
services==네트웍 서비스명으로 사용하는 포트,프로토콜의 대응을 정의 하는 파일
shadow==각 유저의 새도우 패스워드에 관한 저옵를 기술하는 파일
shadow-==shadow의 백업 파일
shells==로그인 쉘로서 설정 가능한 쉘을 기술하는 파일
skel/==도트파일의 템플릿을 저장하는 디렉토리
slip/==SLIP(Serial Line Internet Protocol)로그인을 위한 설정 파일 저장
smb.conf==삼바의 설정 파일
smbpasswd==삼바의 패스워드 파일
smbusers==리눅스 유저명과 삼바 유저명을 대응 시키는 설정 파일
smrsh/==sendmail용 제한 쉘로 이용할 수 있는 프로그램을 저장한다.
snmp/==SNMP(Simple Network Management Protocol)에이전트의 설정 파일
sound/==GNOME의 이벤트에 나누어 붙인 사운드 파일의 설정 파일을 저장한다
squid/==웹캐시프록시 Squid의 설정 파일을 저장한다
sysconfig/==기동시에 참조된 디바이스 등의 설정 파일을 저장한다
sysctl.conf==기동시에 네트웍을 설정하는 파일
syslog.conf==syslog데몬의 설정 파일
termcap==이전에 사용되어진 단말 정의 데이타베이스 화일
up2date.conf==up2date설정 파일
uucp/==UUCP(Unix To Unix Copy)의 설정파일을 저장한다
vfontcap@==Vflib에서 사용하는 트루타입 폰트의 설정 파일
vga==SVGALIB가 이용하는 트루타입 폰트의 설정 타입
wegtrc==HTTP/FTP대응 파일 다운로드 툴 wfget의 설정 파일
yp.conf==NIS의 설정 파일
ypserv.conf==NIS 서버의 옵션을 기술하는 파일
ytalkrc==ytalk 설정 파일
zlogin,zlogout,zprofile,zshenv,zshrc==zsh의 설정 파일
반응형
Posted by [PineTree]
OS/SOLARIS2005. 7. 12. 20:47
반응형

(1) 자신의 개인적인 환경 설정


(1-1) login shell을 변경
# passwd -e
old shell : /sbin/sh
new shell : /bin/ksh <--- 기본적으로 대부분의 관리자는 ksh을 사용한다.

 

(1-2) $HOME/.profile 생성 및 편집
기본적으로 root(관리자)에게는 .profile이 존재하지 않는다.
그래서 원형파일을 복사하여 사용한다.
# cp /etc/skel/local.profile $HOME/.profile
# vi $HOME/.profile

# @(#)local.profile 1.8 99/03/26 SMI
stty istrip
ENV=/.kshrc
EDITOR=vi
PATH=/usr/local/bin:/usr/sadm/admin/bin:/usr/dt/bin:/usr/openwin/bin:/usr/ccs/bin:/usr/sbin:/sbin:/bin:/usr/bin:/usr/ucb:/etc:.

MANPATH=/usr/share/man:/usr/dt/man:/usr/local/man/usr/openwin/share/man:/usr/man
export PATH ENV EDITOR DISPLAY MANPATH
#
# If possible, start the windows system
#
if [ "`tty`" = "/dev/console" ] ; then
if [ "$TERM" = "sun" -o "$TERM" = "sun-color" -o "$TERM" = "AT386" ]
then
if [ ${OPENWINHOME:-""} = "" ] ; then
OPENWINHOME=/usr/openwin
export OPENWINHOME
fi
echo ""
echo "Starting OpenWindows in 5 seconds (type Control-C to interrupt)"
sleep 5
echo ""
$OPENWINHOME/bin/openwin
clear # get rid of annoying cursor rectangle
exit # logout after leaving windows system
fi

# . $HOME/.profile

 

(1-3) $HOME/.kshrc 생성 및 편집

 

# vi $HOME/.kshrc
PS1=[$LOGNAME@`hostname`:'$PWD]# ' <--- 쉘 변수 설정
export PS1 <--- 변수를 export한다.

set -o vi <--- korn shell을 설정한다.

alias ls='\ls -F' <--- alias을 설정한다.
alias ll='\ls -alF | more'
alias mv='\mv -i'
alias cp='\cp -i'
alias rm='\rm -i'

# ksh
# . $HOME/.kshrc

그럼 아래와 같이 프롬프트가 변경이 된다.
[root@test:/]#

 

(2) vi 편집기에 대한 환경설정
# vi $HOME/.exrc
set showmode sm nu
set ai nolist

# . $HOME/.exrc


(3) 전체적인 설정을 확인


(3-1) 로그인 쉘을 확인
# cat /etc/passwd | grep root
root:x:0:1:Super-User:/:/bin/ksh

 

(3-2) 쉘 프롬프트를 확인
[root@test:/]#

 

(3-3) vi 환경설정 확인
# vi testfile
( ) <--- ( )을 입력해 보면 커서가 움직이게 된다.

반응형
Posted by [PineTree]
OS/SOLARIS2005. 7. 12. 20:40
반응형
제목 : 테이프 명령어 및 사용 방법 요약
촐처 : SUN 기술문서, http://kr.sun.com/service/techdocs/0001/000516.html

----------------------------------------------------------------------------------
설명:                             

테이프 명령어
명령:mt - 자기 테이프 용도:테이프 상태 확인, 되감기, 지우기 등 경로:/usr/bin/mt

구문:mt [ -f 테이프 장치 이름 ] 명령 [ 반복 횟수] 여기서 테이프 장치 이름은 보통
   /dev/rmt/0입니다.

   명령은 다음과 같습니다.

   status  -테이프 드라이브의 상태 정보를 표시합니다
   rewind  -테이프를 되감습니다.
   retension  -테이프를 팽팽한 상태로 만듭니다.
   erase  -테이프 전체를 지웁니다.
   fsf   -지정된 반복 횟수만큼 파일을 앞으로 건너뜁니다.
   bsf   -지정된 반복 횟수 만큼 파일을 뒤로 건너뜁니다.
   eom   -기록된 미디어의 끝부분으로 건너 뜁니다.

   반복 횟수는 요청된 작업을 수행하는 횟수를 말합니다.
   기본적으로 mt는 명령을 한 번 수행합니다.
   하나의 명령을 두 번 이상 반복하려면 반복 횟수를 지정하면 됩니다.

   예:mt -f /dev/rmt/0 status ---> 테이프의 상태를 표시합니다.
   mt -f /dev/rmt/0 rewind ---> 테이프를 되감습니다.
   mt -f /dev/rmt/0n fsf 2 ---> 첫 번째 두 개의 파일을 건너뜁니다.
   mt -f /dev/rmt/0n bsf 2 ---> 두 개의 파일만큼 뒤로 건너뜁니다.

명령: tar - 테이프 아카이브
용도: 테이프 아카이브를 만들거나 복원합니다.
    디렉토리 구조를 유지하면서 하나 또는 여러 개의 파일을 백업하는데 사용합니다.
경로: /usr/bin/tar
구문: tar [옵션] [장치 이름] [파일 이름]

   옵션은 다음과 같습니다.
   c    tar 파일을 새로 만듭니다.
   r    기존 tar 파일을 대체합니다.
   t    테이프 아카이브의 목차를 표시합니다.
   u    업데이트합니다.
       업데이트할 파일이 tar 파일에 없거나 마지막으로 tar 파일을 쓴 후
       수정된 경우에는 tar 파일의 끝에 씁니다. 업데이트 수행은 다소
       느릴 수 있습니다. 5.x 시스템에서 만든 tar 파일은 4.x 시스템에서
       업데이트할 수 없습니다.
   x    추출하거나 복원합니다.
      추출하거나 복원할 파일은 tar 파일에서 추출하고 현재 디렉토리에서
      tar 파일에 지정된 디렉토리에 씁니다. 추출할 파일 및 디렉토리에
      대해 상대 경로 이름을 사용하십시오.
   v    자세한 정보를 표시합니다.
      기능 문자 다음에 각 파일의 이름을 출력합니다.

여기서 장치 이름은 대개 /dev/rmt/0입니다. 또는 파일 이름일 수도 있습니다. 파일
이름은 아카이브로 만들 파일 이름입니다.

예:
tar cvf /dev/rmt/0 /export/home/user1 --> /dev/rmt/0 테이프에 /export/home/user1의
테이프 아카이브를 만듭니다.
tar tvf /dev/rmt/0 ---> /dev/rmt/0의 목차를 표시합니다.
tar xvf /dev/rmt/0 ---> /dev/rmt/0에서 데이터를 복원합니다.

참고: 위의 명령에서 /dev/rmt/0 대신 /dev/rmt/0n을 사용할 수 있습니다.
/dev/rmt/0n을 사용하면 백업 수행 후 테이프를 되감지 않습니다.
명령: ufsdump
용도: 파일 시스템, 파일 또는 디렉토리를 백업하는데 사용합니다.
   전체 백업이나 증분 백업을 수행할 수 있습니다.
경로: /usr/sbin/ufsdump
구문: ufsdump [옵션] [장치 이름] [덤프할 파일]

옵션은 다음과 같습니다.

0 ~ 9 덤프 레벨 옵션을 지정합니다.
    레벨 0은 가장 낮은 수준으로 전체 백업을 수행합니다. 레벨 1 ~ 9는 증분
    백업을 수행합니다.
u   현재 백업의 날짜와 덤프 레벨을 /etc/dumpdates 덤프 기록에 업데이트합니다.
f   파일이 쓰여질 장치를 지정합니다.이 옵션은 장치 이름이 필요합니다.
v   테이프에 있는 데이터를 파일 시스템에 있는 데이터와 비교하고 검사합니다.

여기서 장치 이름은 /dev/rmt/0입니다.
덤프할 파일은 초기 파일 시스템 /dev/rdsk/c0t2d0s0이나 블록 파일 시스템
/dev/dsk/c0t2d0s0입니다. 또한 /export/home과 같이 파일 시스템 이름이나
/export/home/user1과 같이 파일 이름 또는 디렉토리 이름을 사용할 수도 있습니다.

예:
ufsdump 0uf /dev/rmt/0 /export/home ---> /export/home 파일 시스템을 /dev/rmt/0
으로 덤프하고 전체 백업을 수행합니다.

ufsdump 1uf /dev/rmt/0 /dev/dsk/c0t2d0s4 --> /dev/dsk/c0t2d0s4 파일 시스템을
/dev/rmt/0로 덤프합니다. 이 명령은 레벨 1의 증분 백업을 수행합니다.

ufsdump 4uf dbserver:/dev/rmt/0 /export/home/user1 --> /export/home/user1에 대한
레벨 4의 증분 백업을 Remote Box dbserver에 마운트된 dev/rmt/0 테이프 장치에 덤프
합니다.   여기서 테이프 장치는 로컬 시스템이 아니라원격 시스템인 dbserver에 있는
장치입니다.

명령: ufsrestore
용도: ufsdump 명령으로 만들어진 백업본에서 파일을 복구하거나 추출하는데 사용합니다.
경로: /usr/sbin/ufsrestore
구문: ufsrestore [옵션] [장치 이름] [복원할 파일]

옵션은 다음과 같습니다.
i    대화형 모드로 파일을 복원합니다.
r    백업 전체를 복원합니다.
t    백업의 목차를 표시합니다.
x    명령행에서 지정한 파일을 복원합니다.
f    /dev/rmt/0과 같이 장치 이름을 지정합니다.
v    파일을 복원하고 있는 경로 이름을 표시합니다(세부 정보 표시 모드).

참고: 이 옵션은 ufsdump 명령에서 사용하는 v(verify) 옵션과 다릅니다.

예:
ufsrestore xvf /dev/rmt/0 ./etc/hosts ---> /etc/hosts 파일을 현재 디렉토리로
                   복원합니다.   
ufsrestore ivf /dev/rmt/0 ---> 복원될 파일을 선택합니다.
ufsrestore rvf /dev/rmt/0 ./opt ---> /opt 파일 시스템을 현재 디렉토리로 복원합니다.
ufsrestore tvf /dev/rmt/0 ---> /dev/rmt/0의 목차를 표시합니다.

해결 방법 요약

내부 요약

제출자:    Ramakrishna Mandava 전자 메일:Ramakrishna.Mandava@Sun.Com
적용 대상:   네트워크 - OS
반응형
Posted by [PineTree]
OS/SOLARIS2005. 7. 12. 20:38
반응형
# vi /.profile
PATH=/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/ccs/bin:/usr/ucb:.
MANPATH=/usr/share/man:/usr/local/man
EDITOR=vi
LANG=ko
ENV=/.kshrc
export PATH MANPATH EDITOR LANG ENV
 
# vi /.kshrc
stty erase ^H ( Backspace key 사용가능)
alias ls='ls -aF'
alias c=clear
alias h=history
alias cp='cp -i'  (overwrite 방지)
set -o vi  (command line에서 'esc' 누르고 vi 편집기와 같은 형식으로 사용)
set -o noclobber  (overwrite 방지)
PS1=`uname -n` '[$PWD]# '
export PS1
반응형
Posted by [PineTree]
OS/SOLARIS2005. 7. 12. 20:38
반응형

(1) 자신의 개인적인 환경 설정


(1-1) login shell을 변경
# passwd -e
old shell : /sbin/sh
new shell : /bin/ksh <--- 기본적으로 대부분의 관리자는 ksh을 사용한다.

 

(1-2) $HOME/.profile 생성 및 편집
기본적으로 root(관리자)에게는 .profile이 존재하지 않는다.
그래서 원형파일을 복사하여 사용한다.
# cp /etc/skel/local.profile $HOME/.profile
# vi $HOME/.profile

# @(#)local.profile 1.8 99/03/26 SMI
stty istrip
ENV=/.kshrc
EDITOR=vi
PATH=/usr/local/bin:/usr/sadm/admin/bin:/usr/dt/bin:/usr/openwin/bin:/usr/ccs/bin:/usr/sbin:/sbin:/bin:/usr/bin:/usr/ucb:/etc:.

MANPATH=/usr/share/man:/usr/dt/man:/usr/local/man/usr/openwin/share/man:/usr/man
export PATH ENV EDITOR DISPLAY MANPATH
#
# If possible, start the windows system
#
if [ "`tty`" = "/dev/console" ] ; then
if [ "$TERM" = "sun" -o "$TERM" = "sun-color" -o "$TERM" = "AT386" ]
then
if [ ${OPENWINHOME:-""} = "" ] ; then
OPENWINHOME=/usr/openwin
export OPENWINHOME
fi
echo ""
echo "Starting OpenWindows in 5 seconds (type Control-C to interrupt)"
sleep 5
echo ""
$OPENWINHOME/bin/openwin
clear # get rid of annoying cursor rectangle
exit # logout after leaving windows system
fi

# . $HOME/.profile

 

(1-3) $HOME/.kshrc 생성 및 편집

 

# vi $HOME/.kshrc
PS1=[$LOGNAME@`hostname`:'$PWD]# ' <--- 쉘 변수 설정
export PS1 <--- 변수를 export한다.

set -o vi <--- korn shell을 설정한다.

alias ls='\ls -F' <--- alias을 설정한다.
alias ll='\ls -alF | more'
alias mv='\mv -i'
alias cp='\cp -i'
alias rm='\rm -i'

# ksh
# . $HOME/.kshrc

그럼 아래와 같이 프롬프트가 변경이 된다.
[root@test:/]#

 

(2) vi 편집기에 대한 환경설정
# vi $HOME/.exrc
set showmode sm nu
set ai nolist

# . $HOME/.exrc


(3) 전체적인 설정을 확인


(3-1) 로그인 쉘을 확인
# cat /etc/passwd | grep root
root:x:0:1:Super-User:/:/bin/ksh

 

(3-2) 쉘 프롬프트를 확인
[root@test:/]#

 

(3-3) vi 환경설정 확인
# vi testfile
( ) <--- ( )을 입력해 보면 커서가 움직이게 된다.

반응형
Posted by [PineTree]
OS/SOLARIS2005. 6. 13. 19:26
반응형

Sun 서버 시스템에서의 negotiation 설정

네트워크의 negotiation
 
network 상에서 negotiation 이란 네트워크 장비와 서버간의 속도를
맞춰주는 것을 말한다. 이는 10/100/1000 이냐 아니면 half/full
duplex 인가를 맞춰주는 것이다.
 
hme interface는 디폴트로 네트웍에 연결된 상대방의 interface에
negotiation하여 10/100 half/full duplex에 맞게 연결이 된다.
그러나 이 negotiation 기능이 없는장비나 다른 이유로 하여
negotiation을 하지 못 하여 interface가 UP 되지 못할 경우가
있다. 이 경우에는 negotiation 기능을 사용하지 말고, 연결될 장비의
 setting에 맞추어 수동으로 10/100 half/full duplex 설정하여야 한다.
 
hme interface의 parameter를 변경하기 위한 방법에는 2 가지가 있다.
 
        a) ndd 명령어를 사용하는 방법
        b) /etc/system 화일을 수정하는 방법
 
 
1. ndd 명령어를 사용하여 변경
 
    1.1. hme interface의 속도를 10MB full duplex로 설정하려면
다음과 같이 한다.
 
         # ndd -set /dev/hme adv_100T4_cap 0
         # ndd -set /dev/hme adv_100fdx_cap 0
         # ndd -set /dev/hme adv_100hdx_cap 0
         # ndd -set /dev/hme adv_10fdx_cap 1
         # ndd -set /dev/hme adv_10hdx_cap 0
         # ndd -set /dev/hme adv_autoneg_cap 0
 
    1.2. hme interface의 속도를 10MB half duplex로 설정하려면
다음과 같이 한다.
 
        # ndd -set /dev/hme adv_100T4_cap 0
        # ndd -set /dev/hme adv_100fdx_cap 0
        # ndd -set /dev/hme adv_100hdx_cap 0
        # ndd -set /dev/hme adv_10fdx_cap 0
        # ndd -set /dev/hme adv_10hdx_cap 1
        # ndd -set /dev/hme adv_autoneg_cap 0
 
    1.3. hme interface의 속도를 100MB full duplex로 설정하려면
다음과 같이 한다.
 
        # ndd -set /dev/hme adv_100T4_cap 0
        # ndd -set /dev/hme adv_100fdx_cap 1
        # ndd -set /dev/hme adv_100hdx_cap 0
        # ndd -set /dev/hme adv_10fdx_cap 0
        # ndd -set /dev/hme adv_10hdx_cap 0
        # ndd -set /dev/hme adv_autoneg_cap 0
 
    1.4. hme interface의 속도를 100MB half duplex로 설정하려면
다음과 같이 한다.
 
        # ndd -set /dev/hme adv_100T4_cap 0
        # ndd -set /dev/hme adv_100fdx_cap 0
        # ndd -set /dev/hme adv_100hdx_cap 1
        # ndd -set /dev/hme adv_10fdx_cap 0
        # ndd -set /dev/hme adv_10hdx_cap 0
        # ndd -set /dev/hme adv_autoneg_cap 0
 
 
2. /etc/system 화일을 변경
 
    /etc/system 화일에 변경한 내용은 바로 적용되지 않고, 리부팅한
후에  시스템에 적용된다.
   
    2.1 hme interface의 속도를 10MB full duplex로 설정하려면
다음과 같이 한다.
 
        set hme:hme_adv_autoneg_cap=0
        set hme:hme_adv_100T4_cap=0
        set hme:hme_adv_100fdx_cap=0
        set hme:hme_adv_100hdx_cap=0
        set hme:hme_adv_10fdx_cap=1
        set hme:hme_adv_10hdx_cap=0
 
   2.2 hme interface의 속도를 10MB half duplex로 설정하려면
다음과 같이 한다.
 
        set hme:hme_adv_autoneg_cap=0
        set hme:hme_adv_100T4_cap=0
        set hme:hme_adv_100fdx_cap=0
        set hme:hme_adv_100hdx_cap=0
        set hme:hme_adv_10fdx_cap=0
        set hme:hme_adv_10hdx_cap=1
 
    2.3 hme interface의 속도를 100MB full duplex로 설정하려면
다음과 같이 한다.
 
        set hme:hme_adv_autoneg_cap=0
        set hme:hme_adv_100T4_cap=0
        set hme:hme_adv_100fdx_cap=1
        set hme:hme_adv_100hdx_cap=0
        set hme:hme_adv_10fdx_cap=0
        set hme:hme_adv_10hdx_cap=0
 
   2.4 hme interface의 속도를 100MB half duplex로 설정하려면
다음과 같이 한다.
 
        set hme:hme_adv_autoneg_cap=0
        set hme:hme_adv_100T4_cap=0
        set hme:hme_adv_100fdx_cap=0
        set hme:hme_adv_100hdx_cap=1
        set hme:hme_adv_10fdx_cap=0
        set hme:hme_adv_10hdx_cap=0
 
3. hme 카드가 2개 이상 있는 경우에 개별적인 instance에 대해서
각각 지정하여야 한다.
 
        # ndd -set /dev/hme instance 0
 
               hme0에 대하여 위에 지정한 파라메터를 여기에 지정한다.
 
 
        # ndd -set /dev/hme instance 1
 
               hme1에 대하여 위에 지정한 파라메터를 여기에 지정한다.
 
 
4. 실제 시스템에 설정된 상태를 확인하려면 다음과 같은 명령어로
확인할 수 있다.
 
        # ndd -get /dev/hme link_status
        # ndd -get /dev/hme link_speed
        # ndd -get /dev/hme link_mode
 
        link_status (read only)
               0 for Link Down
               1 for Link up
 
        link_speed (read only)
               0 for 10 Mbps
               1 for 100 Mbps
 
        link_mode (read only)
               0 for Half-Duplex mode
               1 for Full-Duplex mode
 

 

 

 

qfe interface는 디폴트로 네트웍에 연결된 상대방의 interface와
negotiation하여 10/100 half/full duplex에 맞게 연결이 된다.
그러나 이 negotiation 기능이 없는 장비나 다른 이유로 하여
negotiation을 하지 못 하여 interface가 UP 되지 못할 경우가 있다.
이 경우에는 negotiation 기능을 사용하지 말고, 연결될 장비의
setting에 맞추어 수동으로 10/100 half/full duplex 설정하여야 한다.
 
qfe interface의 parameter를 변경하기 위한 방법에는 2 가지가 있다.
 
        a) ndd 명령어를 사용하는 방법
        b) /etc/system 화일을 수정하는 방법
 
1. ndd 명령어를 사용하여 변경
 
    1.1. qfe interface의 속도를 10MB full duplex로 설정하려면
다음과 같이 한다.
 
         # ndd -set /dev/qfe adv_100T4_cap 0
         # ndd -set /dev/qfe adv_100fdx_cap 0
         # ndd -set /dev/qfe adv_100hdx_cap 0
         # ndd -set /dev/qfe adv_10fdx_cap 1
         # ndd -set /dev/qfe adv_10hdx_cap 0
         # ndd -set /dev/qfe adv_autoneg_cap 0
 
    1.2. qfe interface의 속도를 10MB half duplex로 설정하려면
다음과 같이 한다.
 
        # ndd -set /dev/qfe adv_100T4_cap 0
        # ndd -set /dev/qfe adv_100fdx_cap 0
        # ndd -set /dev/qfe adv_100hdx_cap 0
        # ndd -set /dev/qfe adv_10fdx_cap 0
        # ndd -set /dev/qfe adv_10hdx_cap 1
        # ndd -set /dev/qfe adv_autoneg_cap 0
 
    1.3. qfe interface의 속도를 100MB full duplex로 설정하려면
다음과 같이 한다.
 
        # ndd -set /dev/qfe adv_100T4_cap 0
        # ndd -set /dev/qfe adv_100fdx_cap 1
        # ndd -set /dev/qfe adv_100hdx_cap 0
        # ndd -set /dev/qfe adv_10fdx_cap 0
        # ndd -set /dev/qfe adv_autoneg_cap 0
 
    1.4. qfe interface의 속도를 100MB half duplex로 설정하려면
다음과 같이 한다.
 
        # ndd -set /dev/qfe adv_100T4_cap 0
        # ndd -set /dev/qfe adv_100fdx_cap 0
        # ndd -set /dev/qfe adv_100hdx_cap 1
        # ndd -set /dev/qfe adv_10fdx_cap 0
        # ndd -set /dev/qfe adv_autoneg_cap 0
 
2. /etc/system 화일을 변경
 
    /etc/system 화일에 변경한 내용은 바로 적용되지 않고, 시스템을
리부팅한 후에 적용된다.
 
    2.1 qfe interface의 속도를 10MB full duplex로 설정하려면
 다음과 같이 한다.
 
        set qfe:qfe_adv_autoneg_cap=0
        set qfe:qfe_adv_100T4_cap=0
        set qfe:qfe_adv_100fdx_cap=0
        set qfe:qfe_adv_100hdx_cap=0
        set qfe:qfe_adv_10fdx_cap=1
        set qfe:qfe_adv_10hdx_cap=0
 
   2.2 qfe interface의 속도를 10MB half duplex로 설정하려면
다음과 같이 한다.
 
        set qfe:qfe_adv_autoneg_cap=0
        set qfe:qfe_adv_100T4_cap=0
        set qfe:qfe_adv_100fdx_cap=0
        set qfe:qfe_adv_100hdx_cap=0
        set qfe:qfe_adv_10fdx_cap=0
        set qfe:qfe_adv_10hdx_cap=1
 
    2.3 qfe interface의 속도를 100MB full duplex로 설정하려면
다음과 같이 한다.
 
        set qfe:qfe_adv_autoneg_cap=0
        set qfe:qfe_adv_100T4_cap=0
        set qfe:qfe_adv_100fdx_cap=1
        set qfe:qfe_adv_100hdx_cap=0
        set qfe:qfe_adv_10fdx_cap=0
        set qfe:qfe_adv_10hdx_cap=0
 
   2.4 qfe interface의 속도를 100MB half duplex로 설정하려면
다음과 같이 한다.
 
        set qfe:qfe_adv_autoneg_cap=0
        set qfe:qfe_adv_100T4_cap=0
        set qfe:qfe_adv_100fdx_cap=0
        set qfe:qfe_adv_100hdx_cap=1
        set qfe:qfe_adv_10fdx_cap=0
        set qfe:qfe_adv_10hdx_cap=0
 
3. 위와 같이 하면 시스템에 설치되어 있는 모든 qfe interface의
속도를 10MB 또는 100MB로 지정할 수 있다. 그러나 각 interface
별로 각각 다른 속도를 지정하고 싶은 경우에는 아래와 같이 interface
를 먼저 지정한후 1 또는 2번 과정을 실행 한다.
 
   3.1 ndd 명령어를 사용하는 경우
        ndd -set /dev/qfe instance "instance-number"
 
   3.2 /etc/system 화일을 수정하는 경우
 
        set qfe:qfe_instance="instance-number"
 
   위의 설명에서 "instance-number"는 qfe0 interface는 "0",
qfe1 interface는 "1", qfe2 interface는 "2"... 와  같이 정의 된다.

반응형
Posted by [PineTree]
OS/SOLARIS2005. 6. 13. 19:25
반응형

 

# ifconfig -a
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
ce0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 223.222.222.9 netmask ffffff00 broadcast 222.222.222.255
ce2: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3
        inet 50.222.222.2 netmask ffffff00 broadcast 50.222.222.255

 

# ndd -get /dev/ce '?'

....

instance                      (read and write)
adv_autoneg_cap               (read and write)
adv_1000fdx_cap               (read and write)
adv_1000hdx_cap               (read and write)
adv_100T4_cap                 (read and write)
adv_100fdx_cap                (read and write)
adv_100hdx_cap                (read and write)
adv_10fdx_cap                 (read and write)
adv_10hdx_cap                 (read and write)
.....

 

# cat /etc/rc2.d/S69inet

......

######## 100FDX ERI ###############
ndd -set /dev/ce instance 0
ndd -set /dev/ce adv_1000fdx_cap 0
ndd -set /dev/ce adv_1000hdx_cap 0
ndd -set /dev/ce adv_100T4_cap 0
ndd -set /dev/ce adv_100fdx_cap 1
ndd -set /dev/ce adv_100hdx_cap 0
ndd -set /dev/ce adv_10fdx_cap 0
ndd -set /dev/ce adv_10hdx_cap 0
ndd -set /dev/ce adv_autoneg_cap 0

 

ndd -set /dev/ce instance 2
ndd -set /dev/ce adv_1000fdx_cap 0
ndd -set /dev/ce adv_1000hdx_cap 0
ndd -set /dev/ce adv_100T4_cap 0
ndd -set /dev/ce adv_100fdx_cap 1
ndd -set /dev/ce adv_100hdx_cap 0
ndd -set /dev/ce adv_10fdx_cap 0
ndd -set /dev/ce adv_10hdx_cap 0
ndd -set /dev/ce adv_autoneg_cap 0

ndd -set /dev/ce instance 0

반응형
Posted by [PineTree]
OS/SOLARIS2005. 6. 13. 19:24
반응형

Solaris Network Kernel Tunning for Security           출처:  http://blog.naver.com/uliel7719.do


1. 소개

 

Solaris Kernel은 TCP/IP스택에 여러가지 사용자 인터페이스를 제공한다. Cache 테이블의 ifetime 및 다수의 TCP 연결에 대한 여러가지 옵션을 통하여 Kernel Parameter의 설정 및 제어가 가능하다. 하지만 이러한 Kernel Parameter들을 Tunning하기 위하여 각각의 kernel parameter들에대한 정확한 기능들의 이해가 반드시 요구되어진다. 그리고 많은 시스템관리자들은 이러한 Kernel Parameter들을 사용 및 설정하는 등의 일련의 Security 업무에 소홀히 해왔다. 이 보고서에서는 solaris에서 제공되어지는 Network Security Kernel들에 관련하여 올바르게 이해해고 설정하여 Tunning하는 방법을 소개하고자 한다.

 

2. Solaris Kernel Tools

 

solaris에서는 TCP/IP 커널에 대한 드라이버로서 "ndd"가 유일한 도구이며 Solaris 시스템의 네트워크 커널 변수들을 Tunning하기 위한 가장 유용한 Tool이 "ndd"이다.

 

3. Solaris 네트워크 커널 변수들

 

일반적으로 TCP/IP 커널에 대한 변수들을 보는 방법은 다음과 같은 명령어를 실행함으로써 가능하다.

# ndd /dev/<driver> <parameter>

여기서 TCP/IP 커널에 대하여 <driver>는 ARP, IP, TCP, UDP중에 하나이며 각각의 드라이버에 대하여 모든 변수들을 보는 명령어는 다음과 같다.

 

# ndd /dev/<driver> \?

 

IP 드라이버에 대한 명령어를 실행하면 다음과 같이 출력된다.

 

[phoenix:root]:/ >ndd /dev/ip \?

? (read only)

ip_forwarding (read and write)

ip_respond_to_address_mask_broadcast(read and write)

ip_respond_to_echo_broadcast (read and write)

ip_respond_to_timestamp (read and write)

ip_respond_to_timestamp_broadcast(read and write)

ip_send_redirects (read and write)

ip_forward_directed_broadcasts(read and write)

ip_debug (read and write)

ip_mrtdebug (read and write)

ip_ire_cleanup_interval (read and write)

ip_ire_flush_interval (read and write)

ip_ire_redirect_interval (read and write)

ip_def_ttl (read and write)

ip_forward_src_routed (read and write)

ip_wroff_extra (read and write)

ip_ire_pathmtu_interval (read and write)

ip_icmp_return_data_bytes (read and write)

ip_send_source_quench (read and write)

ip_path_mtu_discovery (read and write)

ip_ignore_delete_time (read and write)

ip_ignore_redirect (read and write)

ip_output_queue (read and write)

ip_broadcast_ttl (read and write)

ip_icmp_err_interval (read and write)

ip_reass_queue_bytes (read and write)

ip_strict_dst_multihoming (read and write)

ip_addrs_per_if (read and write)

ip_ill_status (read only)

ip_ipif_status (read only)

ip_ire_status (read only)

ip_ipc_status (read only)

ip_rput_pullups (read and write)

ip_enable_group_ifs (read and write)

 

ndd를 사용하여 커널 변수를 설정하기 위하여는 다음과 같이 명령어를 실행하면 된다.

 

# ndd -set /dev/<driver> <parameter> <value>

 

ndd를 사용하여 커널 변수를 변경할때는 주의하여야 할 사항이 있다. 한번 설정된 parameter는 시스템을 재부팅할 경우에는 이전에 설정된 값이 원래의 기본설정값으로 변경된다는 점이다. 설정된 값을 계속적으로 사용하기 위해서는 시스템 관리자가 shell script등을 이용해서 시스템 부팅시 자동으로 시스템관리자가 원하는 설정값으로 설정되게 운영하여야 많다. 예를들어 /etc/init.d/inetinit나 개별적인 shell script로 운영하여야만 한다.

 

4. ARP (Address Resolution Protocol)

 

ARP는 Layer3의 네트워크 주소를 data-link 주소(MAC Address)로 동적 맵핑(mapping)하는데 사용된다. 하나의 시스템이 한 네트워크 상에서 다른 시스템과 통신하고자 한다면 broadcast주소인 ff:ff:ff:ff:ff:ff로 ARP 패킷을 첫번째로 보낸다.

그 패킷은 단순한 패킷으로서 해당 주소를 어떤 시스템이 사용하고 있는지에 대한 질의 패킷이다. 예를 들어 누가 주소 A를 사용하고 있느지에 대하여 ARP패킷을 broadcast하면, 한 network 상에 존재하는 모든 호스트들이 이 패킷을 수신하게 된다. 이때 시스템 A는 ARP 요구에 대한 응답으로서 답을 보내게된다.

ARP Broadcast패킷을 보냈던 해당 시스템은 32bit IP주소를 layer-2인 MAC주소로 매핑하면서 table과 cache를 구성하여 운영하게 된다. 이때 해당 시스템은 network layer에의한 두번째 테이블을 구성하게 된다. 이 테이블은 data-link layer에의해 제공되어지는 정보로부터 구성되어지며, 활성화된 연결에대한 네트워크 라우팅 정보를 포함하고 있다. network layer는 data-link layer로부터 MAC주소를 요청하며, 요청된 결과로부터 수신된 이러한 주소를 네트워크 라우팅 테이블에 저장되어진다. Network layer의 정보는 20분 후에 만료된다.

 

하나의 네트워크에서 호스트는 다른 시스템과 통신하기 우히아여 첫번째로 IP layer의 ARP cache를 체크한다. 이때 네트워크 peer에대한 엔트리가 cache에 존해하지 않으면 ARP 요청이 broadcast되어 진다. ARP Cache 엔트리는 5분후에 만료된다. ARP Cache를 이용한 공격은 두가지 종류가 있다. 하나는 ARP cache poisoning이며 다른 하나는 ARP spoofing이다.

 

ARP cache poisoning은 존재하지 않는 ARP주소나, 잘못된 ARP주소를 시스템의 ARP cache에 삽입시키는 것이다. 이것은 target시스템이 peer의 IP주소로 패킷을 보내지만 MAC주소가 잘못되어 있기때문에 해당 시스템으로 하여금 서비스 거부를 일으킬수 있다,

 

ARP spoofing은 system compromise결과를 초래할 수 있다. IP spoofing처럼 ARP spoofing은 네트워크상에 존재하는 하나의 호스트를 네트워크 기능을 정상적으로 처리하지 못하게 해서 모든 ARP 요청 broadcast에 대한 응답을 못하도록 한다. 이것이 행해지기만 하면 공격자는 무능력해진 호스트의 IP주소를 공격 호스트로서 구성하여 사용할 수가 있게 되어진다. 피해 호스트가 무능력해진 호스트와 통신하려 할때 공격자의 시스템이 모든 ARP broadcast의 요청에 응답하게 된다. 이렇게 하면 그것의 MAC주소가 피해시스템의 ARP Cache에 저장되어지게 되서 피해시스템은 disable된 시스템이 공격자의 시스템으로 알게되서 공격시스템과 피해시스팀과의 정상적인 통신이 가능하게 되어진다.

 

ARP 공격에 대응하기는 매우 어렵다. ARP공격에 대한 한가지 대응방법은 cache 엔트리의 lifetime을 줄이는 것이다. cache lifetime은 네트워크 커널 변수인 arp_cleanup_interval에 의하여 결정되어 진다. IP routing 테이블 엔트리의 lifetime은 커널 변수인 ip_ire_flush_interval에 의해서 조정되어 질 수 있다. 이에 대한 커널 변수는 다음과 같은 명령어의 실행에 의해서 가능하다.

 

# ndd -set /dev/arp arp_cleanup_interval <time>

# ndd -set /dev/ip ip_ire_flush_interval <time>

 

여기서 time은 millisecond를 의미한다. ARP Cache 만료 및 IP routing 테이블의 만료시간을 줄이는 것은 공격의 피해를 줄일수 는 있으나 근본적이 해결책은 아니다. 또다른 옵션은 일부 시스템에 대하여 정적(static)인 ARP 주소를 사용하면 가능하다. 정적인 ARP cache 엔트리는 영구적이어서 만료되지 않는다. 이러한 정적인 entry는 명령어 arp -d를 사용하여 제거되어 질수 있다.

 

5. IP Parameters

 

Solaris 커널은 IP 네트워크 프로토콜의 다양한 특징들에 대한 제어방법을 제공한다. 이러한 기능들은 몇몇의 파라미터들들을 통하여 제공된다. 많이 사용되는 parameter들은 다음과 같다

 

ip_forwarding

ip_strict_dst_multihoming

ip_forward_directed_broadcasts

ip_forward_src_routed

 

IP forwarding은 동일 시스템에 두개이상의 네트워크 인터페이스사이에 IP 패킷들을 라우팅하는 것을 일컷는다. 전형적으로로 이러한 기능은 라우터의 기능과 동일하다. Solaris를 가지고 설치된 시스템은 이러한 IP Forwarding을 잘 수행한다. 이러한 IP forwarding은 ip_forwarding 파라미터을 0으로 세팅하여 차단할 수 있다. IP Forwarding기능을 차단하기 위한 명령어는 다음과 같다.

 

#ndd -set /dev/ip ip_forwarding 0

 

침입자는 IP 패킷들을 forwarding하지 않는 multihomed server에 연결된 네트워크 경로로 패킷들을 발생 시키는 또다른 공격이 있을 수 있으므로 이러한 공격을 차단하기 위해서는 시스템의 IP 커널 변수인 ip_strict_dst_multihoming을 0으로 세팅하여 차단할 수 있다. 이렇게 시스템을 설정함으로써 연결된 하나의 네트워크로부터 또다른 네트워크 인터페이스로 발생되는 모든 패킷들이 차단되게 할 수 있다. 커널 설정은 다음과 같은 명령으를 실행함으로써 가능하다.

 

#ndd -set /dev/ip ip_strict_dst_multihoming 0

 

Directed Broadcast는 외부 네트워크의 한 시스템으로부터 또 다른 네트워크의 모든 시스템에 보내어지는 패킷들을 말한다. Directed Broadcast는 "smurf"공격의 근간으로써 강제된 ICMP 패킷들이 하나의 호스트로부터 리모트 네트워크의 broadcast 주소로 보내어진다. ICMP패킷들의 출발지 주소는 피해를 입히고자 하는 시스템의 주소를 갖도록 강제로 설정할 수 있다. 그러면 원격의 네트워크에 있는 시스템들은 ICMP 패킷들을 받으면 이에 대한 응답으로서 응답 패킷이 피해호스트로 전송되어 진다. 대용량의 패킷을 받은 호스트은 flooding되게 된다.

IP forwarding이 설정된 모든 솔라리스 시스템은 directed broadcast역시 forwarding할 것이다. directed broadcast의 forwarding기능을 해제하기 위해서는 ip_forward_directed_broadcasts 커널변수를 0으로 설정하면 될 것이다.

 

#ndd -set /dev/ip ip_forward_directed_broadcasts 0

 

패킷들이 한 네트워크의 호스트로부터 다른 호스트로 전달되어 질때, 라우팅서비스를 제공하는 호스트들이나 전용 라우터들에 의해 그들이 경로가 결정되어 진다. 그래서 IP는 출발지와 목적지사이에서 경로를 지정하는 기능을 가지고 있다. 이러한 기능들은 두가지 형태를 취할 수 있으며 하나는 strict source routing로서 패킷의 송신시스템이 출발지와 목적지사의의 중간의 모든 HOP마다 라우팅부소를 제공해주는 경우와, 다른 하나는 loose source routing으로서 송신측의 두 시스템 사이의 모든 경로를 선택함에 있어서 일부 몇개의 HOP만 지정해주고 나머지는 자유롭게 도달하도록 하는 방법이다.

source routing은 네트워크 토폴로지상에서 보안체계를 우회하도록 사용될 수 있다. 물론 하나의 네트워크상에서 source-route된 패킷은 특별한 경우를 제외하고는 사용되지 않는다. 그렇기 때문에 IP Forwarding을제공하는 모든 호스트들은 Solaris kernel 변수인 ip_forward_src_routed를 0으로 세팅하여 source-route된 패킷들이 자동으로 드롭되도록 설정하여 운영하여야 한다. 설정방법은 다음과 같다.

 

#ndd -set /dev/IP ip_forward_src_routed 0

 

6. TCP Parameters

 

1997년 hrack Magazine의 기사에서 SYN flood로서 알려진 하나의 서비스거부공격을 기술하였다. 이러한 공격의 목적은 특정 시스템을 파괴하기 보다는 internet이나 intranet상에서 시스템이 네트워크 서비스를 불가능하게 만드는 것이다. 이러한 서비스 거부공격은 TCP연결의 기본방법을 이용하여 개발되었다.

하나의 시스템이 한 서버에 TCP를 사용하여 연결하고자 할때 sender는 처음 TCP/IP 패킷에 SYN bit를 설정하여 목적지에 발송한다. 이 SYN패킷은 TCP헤더에 SYN과 ACK 비트가 설정된 패킷을 가지고 목적지 시스템으로부터 응답받는다. 이 때 sender는 SYN-ACK패킷에 대한 응답으로서 ACK패킷을 보낸다. 이러한 방식을 "3-way handshake"방식이라 한다. 다음은 이러한 일련의 과정을 그림으로 설명한다.

 

sender(client) destination(server)

SYN -------------------------->

(sequence #: X)

<-------------------------- SYN-ACK

(sequence #:X+1, sequence #: Y)

ACK -------------------------->

(sequence #: Y+1)

 

이러한 과정에서 목적지 시스템이 sender에게 SYN-ACK패킷을 응답하고 ACK패킷을 sender가 응답하지 않을때 발생한다. 목적지 호스트는 "half-open"상태로 connection이 확립되기를 기다린다. 이때 srouce호스트가 목적지의 모든 가능한 TCP소켓 리소스를 고갈시킬때까지 이러한 half-open connection을 계속하게되면 목적지 시스템은 더이상의 TCP SYN패킷을 처리하지 못할 것이다. Solaris 시스템이 TCP SYN공격하에 있는지를 결정하는 한가지 방법은 SYN_RCVD상태에 있는 TCP connection의 갯수를 모니터링하는 것이다. SYN_RCVD상태의 connection은 다음과 같은 명령어를 통하여 확인 할 수 있다.

 

#netstat -an -f inet | grep SYN_RCVD

 

다음은 Solaris 7시스템이 SYN Flooding공격을 받고있는 동안에 위의 명령어를 실행한 결과이다.

 

[search:root]/user/ksch/dos > netstat -an -f inet | grep SYN_RCVD | more

127.0.0.1.80 172.16.10.1.14059 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.33931 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.61628 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.37302 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.27227 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.8350 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.52729 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.6407 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.63538 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.5467 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.33539 0 0 9112 0 SYN_RCVD

127.0.0.1.80 172.16.10.1.59230 0 0 9112 0 SYN_RCVD

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

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

127.0.0.1.80 172.16.10.1.59230 0 0 9112 0 SYN_RCVD

 

시스템이 정상적인 상태에서는 SYN_RCVD상태의 connection의 횟수가 거의 0이다.

다음은 SYN flooding공격을 받고있는 상태에서 SYN_RCVD상태를 카운트 한것이다.

 

[search:root]/user/ksch/dos > netstat -an -f inet | grep SYN_RCVD | wc -l

898

 

이러한 값은 시스템이 정상적인 환경하에서 작동할때의 기본적인 값과의 비교를 통하여 수행되어 질 수 있다.

Solaris는 시스템이 TCP SYN공격하에 있는지를 결정해주는 또다른 방법이 있다. 다음과 같은 명령어를 사용해서 하나의 TCP SYN공격이 확인되어질 수 있는 tcpHalfOpenDrop, tcpTimRetransDrop, tcp_ListenDrop 파라미터들의 값을 조사하면서 가능하다.

 

#netstat -s -P tcp

 

다음은 정상적인 시스템의 상태에서 TCP SYN Flooding공격을 받고있는 상태의 파라미터값들을 조사한 결과이다.

 

정상적인 상태에서는 tcpTimRetransDrop = 0, tcpListenDrop = 0,

tcpHalfOpenDrop = 0의 값을 유지하고 있었으나,

공격을 받은 상태에서는 tcpTimRetransDrop = 4243 , tcpListenDrop = 0,

tcpHalfOpenDrop = 140336

 

의 값을 나타내었다. 다음은 TCP SYN Flooding공격을 받고있는 Solaris 7시스템의 커널 파라미터값을 조회한 결과이다.

 

[search:root]:/ > netstat -s -P tcp

TCP tcpRtoAlgorithm = 4 tcpRtoMin = 200

tcpRtoMax = 60000 tcpMaxConn = -1

tcpActiveOpens = 72503 tcpPassiveOpens =207964

tcpAttemptFails = 10067 tcpEstabResets = 27

tcpCurrEstab = 18 tcpOutSegs =3220622

tcpOutDataSegs =2857020 tcpOutDataBytes =270559996

tcpRetransSegs =315847 tcpRetransBytes =577759

tcpOutAck =363525 tcpOutAckDelayed = 10315

tcpOutUrg = 3 tcpOutWinUpdate = 42

tcpOutWinProbe = 118 tcpOutControl =734882

tcpOutRsts = 14378 tcpOutFastRetrans = 353

tcpInSegs =3872088

tcpInAckSegs =2909440 tcpInAckBytes =270664796

tcpInDupAck =189991 tcpInAckUnsent = 0

tcpInInorderSegs =2845248 tcpInInorderBytes =300182637

tcpInUnorderSegs = 1428 tcpInUnorderBytes =1034420

tcpInDupSegs = 2487 tcpInDupBytes = 23404

tcpInPartDupSegs = 76 tcpInPartDupBytes = 45970

tcpInPastWinSegs = 0 tcpInPastWinBytes = 0

tcpInWinProbe = 0 tcpInWinUpdate = 118

tcpInClosed = 27 tcpRttNoUpdate = 359

tcpRttUpdate =2841174 tcpTimRetrans = 110

tcpTimRetransDrop = 4243 tcpTimKeepalive = 1498

tcpTimKeepaliveProbe= 64 tcpTimKeepaliveDrop = 1

tcpListenDrop = 0 tcpListenDropQ0 = 0

tcpHalfOpenDrop =140336 tcpOutSackRetrans = 0

 

파라미터 tcpTimRetransDrop은 시스템 부팅후에 SYN 요구나 연결확립된 TCP 연결에 대하여 시간만료된 패킷의 수이며, 파라미터 tcpListenDrop은 시스템이 부팅한 후에 TCP queue backlog때문에 거절된 SYN 요구의 횟수를 의미한다. 또한 tcpTimRetransDrop의 값에 따라 tcpListenDrop 및 tcpHalfOpenDrop값이 빠르게 증가하면 해당 시스템이 TCP SYN 공격을 당하고 있을 확율이 상당히 높음을 나타낸다. 이러한 공격을 상쇄하기 위해서 관리자는 다음의 두가지 작업을 수행할 수 있다. 하나는 abort timer의 값을 더 짧게 하는 것이고 다른 하나는 TCP 연결 큐(queue)를 더 길게하는 것이다. abort timer를 짧게하기 위해서는 milli-second로 설정하는 커널 변수인 tcp_ip_abort_cinterval를 사용할 수 있다. 시스템 디폴트값은 180초로 설정되어 있다. abort timer를 60초로 설정하기 위해서는 다음과 같은 명령어를 실행하면 될것이다.

 

#ndd -set /dev/tcp tcp_ip_abort_cinterval 60000

(60000 = 60 * 1000)

 

연결확립(connection established)이 이루어지지 않은 패킷에대한 큐 크기는 커널 변수인 tcp_conn_req_max_q0(Solaris 2.6이상)를 사용할 수 있다. solaris 2.5.1은 patch 103581-11를 패치하여야만 한다. tcp_conn_req_max_q0의 디폴트 값은 1024이다. queue 크기를 증가시키기 위햐여 다음의 명령어를 실행시키면 된다.

 

#ndd -set /dev/tcp tcp_conn_req_max_q0 2048

 

SYN Attack의 또다른 방법은 연결확립된 TCP의 queue를 고갈시키는 것이다. 이러한 방법은 출발지 주소가 노출되기 때문에 SYN공격으로서는 잘 사용되지 않는 방법이다. 하지만 해킹에 성공한 서버등을 사용하는 방법을 통하여 사용될 수 있는 방법이기도 하다. Solaris 2.6이상(Solaris 2.5.1은 103582-11로 패치필요)에 대하여 tcp_conn_req_max_q의 커널 변수를 통하여 queue 크기를 증가시킬수 있다.

 

#ndd -set /dev/tcp tcp_conn_req_max_q <size>

 

여기서 <size>는 호스트에서 허용하는 TCP연결확립의 총 수를 의미한다. established 및 unestablished TCP연결에 대한 queue 크기를 증가시키기 위해서는 더 많은 메모리를 필요로한다. 따라서 충분한 메모리의 확보 없이 queue 크기를 증가시키면 서버의 performance에 영향을 줄수 있다. 뿐만아니라 서버가 처리할 수 있는 것보다 더 많은양의 half-open이나 established에 대한 TCP Connections을 발생시키면 이러한 서비스 거부공격은 성공할 것이다.

 

7. 결론

 

Solaris Kernel은 많은 Security관련 환경 파라미터를 가지고 있다. 이러한 파라미터들의 조정을 통하여 시스템의 security 대응능력을 증가시킬 수 있다. 이러한 Solaris Security 커널 변수들은 ARP timeout, 패킷들의 IP forwarding, 패킷들의 IP Source routing, TCP connection queue size, network connection들을 통제하는 많은 다른 요소들로 구성된다. 커널 변수들을 올바르게 tunning함으로써 시스템관리자는 Solaris System을 외부의 Security위협에 대하여 저항력 있는 서버시스템을 구성할 수 있을것이다.

 

출처 : 솔라리스 운영자 모임.

반응형
Posted by [PineTree]