OS/UNIX 공통2009. 10. 7. 14:05
반응형

저자 - Sheryl Calish

가장 강력하면서도 한편으로는 혼란스러운 유비쿼터스 명령어인 find 명령어에 대한 개요.

게시일 : 2008년 7월

Linux find 명령어는 모든 Linux 명령어 가운데 가장 유용하면서도 혼란스러운 명령어 가운데 하나입니다. 다른 Linux 명령어의 표준 구문과 다른 구문을 가지고 있다는 점에서 어렵습니다. 하지만, 파일명, 파일 유형, 사용자, 더 나아가 타임 스탬프 별로 파일을 찾을 수 있다는 점에서 강력한 명령어이기도 합니다. find 명령어를 사용하면 이러한 속성을 자유롭게 조합해 파일의 위치를 찾을 수 있을 뿐만 아니라, 찾은 파일에 대해 연산을 수행할 수 있습니다.

본 글의 목적은 find 명령어와 그 잠재적 이점을 개략적으로 설명함으로써 find 명령어를 손쉽게 학습 및 사용할 수 있도록 돕는 것입니다. 동시에, find 명령어의 특성 중 가장 강력하면서도 한편으로는 혼란스러운 측면에 대한 개요 및 참조를 제공할 것입니다.

[주: 여기에서 사용된 find 명령어는 GNU 버전이기 때문에 일부 세부 내용은 다른 버전의 find 명령어와 다를 수 있습니다.]

기본 형식

먼저, find 명령어의 기본 구조부터 살펴보겠습니다:

find   start_directory  test  options   criteria_to_match

action_to_perform_on_results

                       
아래 명령어에서 find는 이름에 “java” 확장자를 가지고 있는 모든 파일을 대상으로 “.”가 표시된 현재 디렉토리를 찾기 시작할 것입니다:
find . -name  "*.java"   

아래에는 검색 결과에 대한 간단한 목록이 나열되어 있습니다:

find . -name  "*.java"

./REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java

./REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java

..

[주: 본 글에서 잘라 붙이기를 해 find 명령어를 실행하는 경우에는 자체 키보드를 사용해 큰따옴표(“”)를 바꿔야 올바른 결과를 얻을 수 있습니다.]

아 래 명령어 역시 동일한 연산을 수행할 것입니다. 어떤 경우든, find 명령어에 전달되도록 escape 문을 통해 와일드카드 문자를 일반 문자로 처리해야 하며 쉘에 의해 해석되지 않아야 합니다. 따라서, 검색 문자열에 큰타옴표를 붙이거나 그 앞에 역슬래시(\)를 붙이십시오:

find . -name  \*.java

find 에 대한 인수는 옵션이기는 하지만, 검색 시작 위치를 지정하지 않은 경우에는 현재 디렉토리에서 기본적으로 검색이 시작됩니다. 옵션 사항이기는 하지만 테스트 조건을 지정하지 않은 경우에는 불완전하거나 선별되지 않은 결과값이 출력됩니다.
 
아래 3개의 find 명령어를 실행하면 똑같이 현재 디렉토리와 숨겨진 파일을 포함하는 모든 서브디렉토리의 모든 파일 목록이 검색됩니다:

find 

find .

find . -print

이는 –la 옵션을 가진 ls 명령어를 실행하는 것과 비슷합니다. 백업을 위해 위 명령어의 출력물에 전체 경로 이름이 포함되기를 원하는 경우라면 시작 디렉토리에 대한 전체 경로를 지정해야 합니다:

find /home/bluher -name \*.java

/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java

/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java/

...

또 한, 검색 문자열에 1개 이상의 시작 디렉토리를 지정할 수도 있습니다. 적정 권한을 가진 사용자로서 실행되는 경우, 아래 명령어는 모든 jar 파일을 찾기 위해 /usr, /home 및 /tmp 디렉토리 순서로 내려갈 것입니다:  

find /usr /home  /tmp -name "*.jar"

적정 권한이 없는 사용자라면 많은 시스템 디렉토리를 검색하기 시작할 때 다음과 같은 오류 메시지가 나올 수 있습니다:

find:  /tmp/orbit-root: Permission denied

다음과 같이 검색 문자열을 추가함으로써 불명확한 결과가 나오는 것을 피할 수 있습니다:

find /usr /home  /tmp -name "*.jar" 2>/dev/null

이렇게 하면 모든 오류 메시지가 널(null) 파일로 전송되기 때문에 보다 정제된 출력물이 제공됩니다.

기본적으로 find 명령어는 대/소문자를 구별합니다. 대/소문자가 구별되는 find에서는 -name 테스트를 대신해 -iname 테스트를 사용하십시오.

find downloads  -iname "*.gif"

downloads/.xvpics/Calendar05_enlarged.gif

downloads/lcmgcfexsmall.GIF
또한, 파일명 외에도 유형에 따라 파일을 검색할 수 있습니다. 예를 들어, 아래 명령어를 통해 디렉토리의 모든 서브디렉토리를 찾을 수 있습니다:
find . -type d          

아래 명령어를 사용하면 /usr 디렉토리의 모든 심볼릭 링크(symbolic link)를 찾을 수 있습니다:

find /usr -type l

위 명령어를 실행하면 3,000개 이상의 링크 목록이 나타날 것입니다. 슈퍼유저(root) 권한을 통해 아래 명령어 가운데 하나를 실행하면 /usr 디렉토리의 링크 목록과 이것이 가리키는 파일이 나타납니다:

# find /usr/bin  -type l  -name "z*" -exec ls  -l {} \;

lrwxrwxrwx 1 root root 8 Dec 12 23:17 /usr/bin/zsh -> /bin/zsh

lrwxrwxrwx 1 root root 5 Dec 12 23:17 /usr/bin/zless -> zmore

lrwxrwxrwx 1 root root 9 Dec 12 23:17 /usr/bin/zcat -> /bin/zcat
find /usr/bin -type  l  -name "z*" -ls

하지만, 보다 짧은 두 번째 명령어를 실행하면 디렉토리와 inode 정보를 가진 긴 파일 목록이 나올 것입니다. -exec 및 –ls 실행에 대해서는 후반부에서 다룰 것입니다

find가 찾을 수 있는 다른 파일 유형으로는 다음과 같은 것들이 있습니다

• b—block (buffered) special
• c—character (unbuffered) special
• p—named pipe (FIFO)
• s—socket

find 명령어의 시작점으로 루트를 사용하면 시스템 속도가 크게 느려질 수 있습니다. 반드시 명령어를 실행해야 하는 경우에는 사용량이 적은 시간대나 야간에 실행하는 것이 좋습니다. 아래 구문을 사용해 출력물을 파일로 보낼 수 있습니다.:

find  /   -print > masterfilelist.out

원치 않는 출력물을 대량 생산하는 find 명령어를 실수로 입력한 경우에는 CTRL-C를 누르기만 하면 가장 최근에 실행된 명령어가 중단됩니다.

여 러 파일 시스템을 갖춘 엔터프라이즈 네트워크에서는 특히 find 명령어가 검색한 파일을 제한하는 것이 좋습니다. 필요한 수 만큼 옵션 및 테스트를 사용함으로써 시스템 상의 로드를 줄일 수 있습니다. 이를 위해 가장 유용하게 사용할 수 있는 옵션은 –xdev와 -mount입니다. 이들 옵션은 find 명령어가 MS-DOS, CD-ROM 또는 AFS와 같은 다른 파일 시스템 상의 디렉토리로 내려가지 않도록 함으로써 검색 범위를 좁혀줍니다. 따라서, 시작 디렉토리와 동일한 유형의 파일 시스템으로 검색을 제한할 수 있습니다.

듀얼 부팅 시스템 사용자는 mount 명령어가 실행되는 경우에 이러한 옵션을 사용할 수 있습니다. Windows 파티션이 관련되어 있다고 가정하면, 아래와 같은 명령어를 통해 마운팅 할 수 있습니다.:

mount -t vfat  /dev/sda1 /mnt/msdos

여러분이 사용하는 실제 명령어는 시스템 설정 방법에 따라 달라집니다. df를 실행하거나 아래 명령어를 수행함으로써 파티션 마운팅 여부를 확인할 수 있습니다:

find /mnt/msdos  -name "*.txt" 2> /dev/null

MS Windows 파티션에서는 파일 목록이 길 수 밖에 없습니다. 이제부터는 -mount 또는 -xdev 옵션을 통해 아래 명령어를 실행하십시오:

find / -name  "*.txt" -mount 2> /dev/null

또는

find / -name  "*.txt" -xdev 2> /dev/null

아래 예에서와 같이 -fstype 테스트를 사용해 find 명령어에 찾고자 하는 파일 시스템을 명확하게 알려줄 수도 있습니다:

find / -name  "*.txt" -fstype vfat 2> /dev/null

시간 찾기

find 명령어는 시스템의 타임 스탬프를 토대로 파일 검색에 사용할 수 있는 여러 개의 옵션을 가지고 있습니다. 이러한 타임 스탬프로는 다음이 포함됩니다

mtime파일 내용이 마지막으로 수정된 시간
atime—파일을 읽기 또는 액세스한 시간
ctime—파일 상태가 변경된 시간

mtime 및 atime의 의미는 그 자체로 쉽게 알 수 있지만, ctime는 좀 더 설명이 필요합니다. inode는 각 파일에 메타 데이터를 가지고 있기 때문에 파일에 연결된 메타 데이터가 변경되면 inode 데이터도 변경됩니다. 파일에 대한 심볼릭 링크 생성, 파일에 대한 권한 변경, 파일 이동 등과 같은 다양한 작업으로 인해 이러한 메타 데이터 변경이 야기될 수 있습니다. 이러한 경우, 파일 내용에 대한 읽기나 수정은 수행되지 않기 때문에 themtime 및 atime은 변하지 않지만 ctime은 변합니다. 

이러한 시간 옵션은 각기 -n, n 또는 +n로 지정된 n 값을 함께 사용해야 합니다.

• -n은 n 이하를 반환
• +n은 n 이상을 반환
• n은 정확히 n에 해당되는 값을 반환

보다 명확한 설명을 위해 몇 가지 예를 살펴 보겠습니다. 아래 명령어는 최근 1시간 동안 수정된 모든 파일을 찾아줍니다:

find . -mtime -1

./plsql/FORALLSample

./plsql/RegExpDNASample

/plsql/RegExpSample

-1 대신 1을 가진 동일 명령어를 실행하면 정확하게 1시간 전에 수정된 모든 파일을 찾을 수 있습니다:

find . -mtime 1 

위 명령어는 정확하게 일치하는 값을 요청하기 때문에 모든 결과값이 나오지는 않습니다. 아래 명령어는 1시간 이전에 수정된 파일을 찾아줍니다:

find . -mtime +1 
기본적으로 -mtime, -atime 및 –ctime는 최근 24 시간에 대한 타임 스탬프입니다. 하지만, 뒤에 daystart 옵션을 붙이면 오늘을 시작으로 24시간 주기가 시작됩니다. 또한, mmin, amin 및 cmin을 사용하면 분 단위로 변경된 타임 스탬프를 찾을 수 있습니다.

여러분의 계정으로 로그인한 후 즉시 아래 명령어를 실행하면 최근 1분 내에 읽은 모든 파일을 찾을 수 있습니다:

find . -amin -1

./.bashrc

/.bash_history

./.xauthj5FCx1

find 명령어만으로 파일의 위치를 찾으면 메타 데이터의 일부인 파일의 액세스 시간이 변경된다는 사실에 유의하십시오.

-newer, -anewer 및 –cnewer 옵션을 사용하면 특정 파일과 비교해 수정 또는 액세스된 파일을 찾을 수도 있습니다. 이는 -mtime, -atime 및 –ctime과 비슷합니다.
 
• -newer : 보다 최근에 내용이 수정된 파일
• -anewer : 보다 최근에 읽기가 수행된 파일
• -cnewer : 보다 최근에 상태가 변경된 파일

마지막 tar 파일 이후로 어떤 방법으로든지 수정된 홈 디렉토리의 파일을 모두 찾으려면 아래 명령어를 사용하십시오:

find . -newer  backup.tar.gz

크기에 따른 파일 찾기

-size 옵션은 지정된 크기 기준에 부합하는 파일을 찾아줍니다. 크기가 5MB 이상인 모든 파일을 찾으려면 아래와 같이 하십시오

find / -size  +5000000c 2> /dev/null

/var/log/lastlog

/var/log/cups/access_log.4

/var/spool/mail/bluher

마 지막에 “c”를 붙이면 결과가 바이트 단위로 보고됩니다. 기본적으로 find 명령어는 512 바이트 블록의 수로 크기를 보고합니다. 또한, “c”를 “k”로 교체하는 경우에는 킬로바이트 수로, “w”를 사용하는 경우에는 2바이트 워드의 수로 결과를 표시할 수 있습니다.

-size 옵션은 모든 제로 바이트 파일을 찾거나 이들 파일을 /tmp/zerobyte 폴더로 이동하기 위해 자주 사용됩니다. 아래 명령어가 바로 이러한 연산을 수행합니다.

find test -type f  -size 0 -exec mv {} /tmp/zerobyte \;

-exec 옵션은 find 명령어가 만나게 되는 파일의 모든 쉘 명령어를 수행할 수 있도록 해줍니다. 후반부에서 이 옵션의 보다 다양한 사용 예를 확인할 수 있습니다. 중괄호를 사용하면 빈 파일 각각을 이동시킬 수 있습니다

또한, -empty 옵션을 사용하면 빈 파일을 찾을 수 있습니다.

find test -empty        

test/foo

test/test

권한 및 소유권에 따른 파일 찾기

find 명령어는 시스템 보안 모니터링을 위해 없어서는 안될 명령어입니다. 아래와 같이 기호법이나 8진법을 통해 사용 권한이 널리 열려있는 파일을 찾을 수 있습니다.

find . -type f  -perm a=rwx -exec ls -l {} \; 

또는

find . -type f  -perm 777 -exec ls -l {} \;

-rwxrwxrwx 1 bluher users 0 May 24 14:14 ./test.txt

위의 명령어나 아래 명령어의 경우 -exec ls –l을 수행하고 있기 때문에, 반환된 파일의 실제 사용 권한을 확인할 수 있습니다. 이 명령어는 “기타 사용자” 및 그룹이 모두 쓰기를 수행할 수 있는 파일을 찾아줍니다.

find plsql -type f  -perm -ug=rw -exec ls -l {} \; 2>/dev/null

또는

find plsql -type f  -perm -220 -exec ls -l {} \; 2>/dev/null 

-rw-rw-rw- 1 bluher users 4303 Jun  7  2004 plsql/FORALLSample/doc/otn_new.css

-rw-rw-rw- 1 bluher users 10286 Jan 12  2005 plsql/FORALLSample/doc/readme.html

-rw-rw-rw- 1 bluher users 22647 Jan 12  2005 plsql/FORALLSample/src/config.sql

..
아래 명령어들을 실행하면 사용자, 그룹 또는 둘 모두가 쓰기 작업을 할 수 있는 파일을 찾을 수 있습니다  
find plsql -type f  -perm /ug=rw -exec ls -l {} \; 2>/dev/null, or,

find plsql -type f -perm /220 -exec ls -l {} \; 2>/dev/null

-rw-r--r-- 1 bluher users 21473 May  3 16:02 plsql/regexpvalidate.zip

-rw-rw-rw- 1 bluher users 4303 Jun  7  2004 plsql/FORALLSample/doc/otn_new.css

-rw-rw-rw- 1 bluher users 10286 Jan 12  2005 plsql/FORALLSample/doc/readme.html

-rw-rw-rw- 1 bluher users 22647 Jan 12  2005 plsql/FORALLSample/src/config.sql

웹이나 기존 매뉴얼에는 아래 명령어로 나와 있을 것입니다.

find . -perm +220  -exec ls -l {} \; 2> /dev/null 

+ 기호는 / 기호와 동일한 역할을 하지만, 새로운 버전의 GNU findutils에서는 권장되지 않고 있습니다.

시스템에서 쓰기 가능한 모든 파일을 찾으려면 아래 명령어를 사용하십시오

find / -wholename  '/proc' -prune  -o  -type f -perm -0002 -exec ls -l {} \;

-rw-rw-rw- 1 bluher users 4303 Jun  7  2004/home/bluher/plsql/FORALLSample/doc/otn_new.css

-rw-rw-rw- 1 bluher users 10286 Jan 12  2005 /home/bluher/plsql/FORALLSample/doc/readme.html

...

4 번째 사용 권한에 대해 앞으로 조금 더 다루겠지만, 마지막 필드의 “2”는 쓰기 비트로도 알려져 있는 파일 사용 권한의 “기타 사용자”에 해당됩니다. 우리는 설정된 다른 사용 권한이 무엇이든 관계 없이 기타 사용자를 위해 설정된 쓰기 권한을 가진 파일을 보고 싶다는 표시로 0002라는 사용 권한 모드 앞에 대시를 사용했습니다.

위의 명령어에서는 3가지 새로운 개념이 도입되었습니다. 패턴이 발견된 경우, – prune은 파일 패턴 “/proc”에서 -wholename 테스트를 사용함으로써 find 명령어가 이 디렉토리로 내려오지 않도록 막아줍니다. 불린 연산자 “-o”를 통해 find 명령어는 다른 디렉토리에서 명령어의 나머지 부분을 처리할 수 있습니다. 각 표현식 간에 가정된 암시적 and 연산자(-a)가 있기 때문에 좌측 표현식이 거짓(false)으로 평가된 경우 and 뒤에 나오는 표현식은 평가되지 않습니다. 따라서, -o 연산자가 필요합니다. 강제 우선 순위 적용을 위해 괄호를 사용하는 것처럼 find 명령어는 불린 연산자 -not, !,도 지원합니다.

시스템 관리자는 자주 find 명령어를 통해 해당 사용자나 그룹의 이름 또는 ID를 사용해 특정 사용자나 그룹의 정규 파일을 검색하고 있습니다:

[root] $  find / -type f -user bluher -exec ls -ls {}  \;

여기, 이러한 명령어의 출력에 대한 간단한 예제가 나와 있습니다:

4 -rw-r--r-- 1 bluher users 48  May  1 03:09  /home/bluher/public_html/.directory

4 -rw-r--r-- 1 bluher users 925 May  1 03:09 /home/bluher/.profile

또한, find 명령어를 사용해 그룹 별로 파일을 검색할 수도 있습니다:

[root] $ find /  -type f -group users
find / -type d -gid  100

이 명령어를 실행하면 그룹 ID 100이 소유하고 있는 디렉토리 목록이 나옵니다. 해당되는 uid 또는 gid를 찾기 위해 /etc/passwd 또는 /etc/group 파일에서 more 또는 cat 명령어를 실행할 수 있습니다

이 명령어는 알려진 특정 사용자 및 그룹에 관한 파일을 찾는 것 외에도 사용자나 그룹이 지정되지 않은 파일을 찾는 데도 유용합니다. 아래 명령어는 /etc/passwd 또는 /etc/group 파일에서 리스트를 가지고 있지 않은 파일을 식별합니다.

find / -nouser -o  -nogroup

위 명령어는 실제로 시스템 상에 결과를 제공하는 것은 아니지만, 파일을 이동한 후에 사용자나 그룹이 지정되지 않은 파일을 식별하는 데 사용할 수 있습니다

이제, 본 섹션 초반부에 언급한 별도의 높은 사용 권한 문제를 해결할 수 있게 되었습니다.

SGID 및 SUID는 UNIX 기반 운영 체제 상의 파일 및 디렉토리에 할당할 수 있는 특별 액세스 권한 플래그입니다. 컴퓨터 시스템 액세스에 있어 일반 권한을 가진 사용자가 일시적으로 높아진 권한을 가지고 바이너리 실행 파일을 수행할 수 있습니다.

find /  \( -perm -2000 -o -perm -4000 \) -ls

167901   12 -rwsr-xr-x   1 root     root         9340 Jun 16  2006 /usr/bin/rsh

167334   12 -rwxr-sr-x   1 root     tty         10532 May  4  2007 /usr/bin/wall

위 명령어에서 괄호가 escape 처리된 것을 볼 수 있습니다. 또한, 권한 간의 차이점을 확인할 수 있습니다. 첫 번째 파일에는 SGID 권한이 설정되어 있으며 두 번째 파일에는 SUID 권한이 설정되어 있습니다. 위 명령어의 마지막 연산은 -exec ls -dils 연산의 find 명령어와 유사합니다

find 명령어 제어

Linux 의 많은 명령어와 달리, find 명령어는 -r 또는 -R 옵션이 없이도 서브디렉토리로 내려가지 않습니다. 이는 기본적으로 지원됩니다. 하지만, 때에 따라 이를 제한하고 싶을 수 있습니다. 이럴 경우, -depth, -maxdepth 및 –mindepth 옵션과 –prune 연산이 유용합니다

-prune이 얼마나 유용한지는 이미 확인했기 때문에 이제는 -depth, -maxdepth 및 -mindepth 옵션에 대해 살펴보겠습니다.

-maxdepth 및 -mindepth 옵션을 사용하면 find 명령어를 통해 검색하고자 하는 디렉토리 트리의 수준을 지정할 수 있습니다. find 명령어가 단 한 수준의 디렉토리를 찾도록 하고 싶은 경우에는 maxdepth 옵션을 사용할 수 있습니다.

아래 명령어를 실행해 디렉토리 트리의 상위 3개 수준의 로그 파일을 검색하면 –maxdepth의 효과를 확인할 수 있습니다. 이렇게 하면 –maxdepth 없이 실행할 때 보다는 훨씬 적은 출력 결과가 나옵니다

find / -maxdepth 3  -name "*log"

또한, find 명령어에게 디렉토리 트리에서 최소 3개 수준까지 디렉토리를 검색할 것을 지시할 수 있습니다.

find / -mindepth 3  -name "*log"

-depth 옵션은 내용 평가에 앞서 디렉토리를 평가할 수 있도록 해줍니다. 아래 명령어는 한 예입니다.:

find -name "*test*" -depth

./test/test

./test

./localbin/test

./localbin/test_shell_var

./localbin/test.txt

./test2/test/test

./test2/test

./test2

find 명령어의 세계

지 금까지 find 명령어의 유용하지만 다소 혼란스러운 일부 기능에 대해 알아보았지만, find 명령어가 수행할 수 있는 추가 작업이 있습니다. 예를 들어, find 명령어가 기존 버전의 UNIX 및 기타 운영 체제와 호환 가능하도록 하고 여러 파일로 출력을 인쇄하도록 하는 등 연산을 수행할 수 있도록 하는 옵션이 있습니다. 본 자료를 읽은 다음에는 find 명령어에 대한 맨페이지(man page)를 이해할 수 있는 배경 지식을 갖추었을 것으로 생각하기 때문에 이 강력하면서도 유용한 툴을 직접 경험해 볼 것을 권합니다


Sheryl Calish는 Linux 전문 IT 컨설턴트입니다. Blue Heron Consulting을 거쳐 현재는 EquityBuild에서 IT 디렉터를 맡고 있습니다

반응형

'OS > UNIX 공통' 카테고리의 다른 글

ls 파일용량크기로 정렬하기  (0) 2015.02.08
세마포어에 대하여  (0) 2012.05.11
linux/unix date로 어제(yesterday) 날짜 출력  (0) 2010.05.05
Posted by [PineTree]
OS/LINUX2009. 9. 7. 21:29
반응형
256MB의 스왑파일을 만들어 보겠습니다. 먼저 스왑파일을 만들 공간을 설정합니다. 다음과 같은 명령을 내리면 /boot 디렉토리 밑에 256MB짜리 NULL 파일이 만들어 집니다. /dev/zero는 Null byte의 source를 뜻하며 생성하고자 하는 swap파일의 명칭은 편의상 swapfile로 하였습니다.
#dd if=/dev/zero of=/boot/swapfile bs=1024 count=262144


만든 파일이 스왑파일로 작동할 수 있도록 설정을 합니다. v0 옵션은 old 스타일이고, v1은 new 스타일입니다.
#mkswap -v1 /boot/swapfile

활성화를 시킵니다.
#swapon /boot/swapfile

free명령으로 스왑영역이 늘어난 것을 확인할 수 있습니다.
#free


부팅 시 스왑공간이 활성화되게 하려면 /etc/fstab 파일에 아래 한 줄을 추가합니다.
/boot/swapfile swap swap defaults 1 1
반응형

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

리눅스 rm삭제햇을 때 복구  (0) 2009.11.06
RedHat Linux Network 설정하기  (0) 2009.10.29
Linux 성능 조정 - tcp  (0) 2009.03.13
RHEL 4 에 YUM 설치  (0) 2009.02.10
LINUX 해킹당했을 때 대처요령  (0) 2008.11.17
Posted by [PineTree]
OS/SOLARIS2009. 8. 3. 15:03
반응형
출처 :http://blog.tinyfall.net/142

기본 ftp 삭제

# pkginfo | grep ftp
로 FTP에 관련된 패키지 목록 확인

# svcs | grep ftp
확인
# svcadm disable /network/ftp
라고 쳐서 ftp 정지

ftp 삭제
# pkgrm SUNWftpr SUNWftpu


Solaris10에서 일반적인 형태로 (ssl 와 익명접속 제외,  tcp_wrappers 포함) 설치하는 것을 정리해 볼까 합니다.

간단설명
VsFTPD는 Very Secure FTP Daemon의 약자이며, 이름에서 그대로 나오듯이 보안에 매우 신경을 쓴 데몬입니다. 레드햇, 데비안 등의 기본 패키지에 포함이 될 정도라고 하며 사이트에서도 그렇게 홍보하고 있군요. 제 개인적으로는 별다른 신경을 안써도 손쉽게 컴파일 및 설치가 된다는 장점이 가장 큰 것 같습니다.


vsftpd 다운로드


vsftpd 홈페이지 : http://vsftpd.beasts.org

vsftpd-2.0.5.tar.gz 다운로드

한글을 위한 소스 수정
기본적으로 UTF8같은 유니코드를 지원하지 않으므로 source 파일을 수정해 주어야 한글이 제대로 로그파일이나 전송처리가 됩니다. 그렇지 않으면 표준 ASCII 문자 외에는 모두 ?(물음표)로 처리해 버립니다.

logging.c 파일을 vi로 불러들여 아래 라인을 주석처리합니다. (157 라인입니다.)

원본 : str_replace_unprintable(p_str, '?');
변경 : /* str_replace_unprintable(p_str, '?'); */

postlogin.c 파일을 vi로 불러들여 아래 라인을 주석처리합니다. (121 라인입니다.)

원본 : str_replace_unprintable(&proctitle_str, '?');
변경 : /* str_replace_unprintable(&proctitle_str, '?'); */

또한 tcp_wrappers를 지원하기 위해서는 builddefs.h 파일을 불러서 아래와 같이 수정합니다.

원본 : #under VSF_BUILD_TCPWRAPPERS
변경 : #define VSF_BUILD_TCPWRAPPERS

그리고 solaris는 PAM을 지원하지 않으므로 바로 밑에 있는 PAM 지원부분을 무효화시켜줍니다.(이 부분을 설정하지 않으면 컴파일시 에러가 줄줄줄주루루루루루 뜹니다.)

원본 : #define VSF_BUILD_PAM
변경 : #undef VSF_BUILD_PAM


vsftpd 컴파일 및 설치
vsftpd는 기본적으로 configure 작업이 없습니다. 그냥 make 하시면 됩니다. 조심하실 것은 INSTALL 문서에 있는대로 make install 을 하시면 안됩니다. vsftpd는 리눅스 계열의 운영체제를 기본으로 만들어져 있으므로 xinetd 등을 이용하도록 설정되어 있는데, solaris에서는 해당 데몬이 존재하지 않습니다. 게다가 solaris10으로 올라오면서 서비스 관리를 svcs 또는 svcadm, inetadm 등 패키지로 분리되어 운영됩니다. 그러므로 make 만 실행하셔서 컴파일만 하시고 나머지 설치작업은 수동으로 하셔야 합니다.

컴파일 화면(성공)

컴파일 화면(성공)


만일 위의 builddefs.h 부분에서 PAM 부분을 undeine 시켜주시기 않았다면 아래와 같은 경고가 뜨고 운영중에 로그인이 안되거나 에러가 발생하는 경우가 생깁니다.(PAM을 undefine 시키면 shadow 모드로 동작하는 듯 합니다.)

사용자 삽입 이미지

컴파일이 무사히 넘어갔다면 vsftpd 파일이 생성되어있습니다.

사용자 삽입 이미지

vsftpd 파일의 생성을 확인하셨다면 아래와 같이 관련 파일들을 세팅합니다.

# mkdir /usr/local/sbin   ;; 없는 경우만 만들어 주시면 됩니다.
# cp vsftpd /usr/local/sbin 
# chmod 755 /usr/local/sbin/vsftpd

# cp vsftpd.conf.5 /usr/share/man/man5   ;; vsftpd.conf 매뉴얼 복사
# cp vsftpd.8 /usr/share/man/man8          ;; vsftpd 매뉴얼 복사
# mkdir /usr/share/empty
# chown root:root /usr/share/empty
# chmod 755 /usr/share/empty
# cp vsftpd.conf /etc                 ;; 설정파일 복사


vsftpd를 Solaris 10의 SMF에 연결
이젠 남은것은 실행하는 방법입니다.
solaris10 에서는 inetd 서비스가 SMF(Service Management Facility)로 통합운영되어 집니다. 모든 서비스 관리는 svcadm 명령으로 제어할 수 있는데, 네트워크 관련 서비스는 inetadm 이라는 명령을 이용하여 특별히 관리할 수 있습니다. vsftpd를 SMF 서비스로 등록하여 이용하면 편리하게 관리할 수 있도록 합니다. (자세한 기타 내용은 마지막에 참고사이트를 보세요.)

우선 첫번째로 /etc/services 파일 내용중 ftp 가 기술되어 있는지 확인합니다.
사용자 삽입 이미지

현재 디렉토리에 아래와 같은 내용을 /etc/inetd.conf 라는 내용으로 저장합니다.

ftp stream tcp nowait root /usr/sfw/sbin/tcpd /usr/local/sbin/vsftpd

※ 미리 tcp_wrappers 가 설치되어 있어야 합니다.

그리고 아래 명령을 수행하면 smf 관련 명령으로 확인하거나 관리하실 수 있습니다.

# inetconv -i inet.ftp
# svcs -a | grep ftp
online          21:02:07    svc:/network/ftp/tcp:default      <== vsftpd 데몬이 서비스로 등록된 모습

이후부터 서비스의 시작과 중지를 아래와 같이 수행할 수 있습니다.

# svcadm enable /network/ftp/tcp:default     ;; vsftpd 서비스 시작
# svcadm disable /network/ftp/tcp:default  ;; vsftpd 서비스 중지

svcs 명령으로 보았을 때 online 은 동작중, offline은 중지된 상태, maintenance 는 문제가 있어서 작업이 필요하다는 의미입니다. online 상태로 서비스를 시작하고 localhost 로 접속하여 정상적으로 FTP 접속이 되는지 확인합니다. 현재는 제대로 설정이 되어 있지 않으므로 anonymous (익명)으로 접속하셔야 하며, 접속되더라도 OOPS! 라는 메세지가 보입니다.(웁스~)


vsftpd.conf 설정
구글링이나 기타 인터넷상에 올라온 자료들을 검색해 본 결과 예전 버젼이거나 linux 계열의 운영체제에 맞게 설정되어 있어서 제가 사용할려는 solaris 운영체제에는 전혀 맞지가 않더군요. 로그처리 부분도 마찬가집니다. 그래서 제가 사용하는 Solaris 10 환경에 맞게 나름대로 설정파일을 세팅하는 과정에서 겪은 시행착오을 줄이기 위해 vsftpd.conf 파일의 옵션을 정리해 보았습니다. SSL 은 사용하지 않으므로 자세한 설명은 생략하며 익명도 사용하지 않는 환경임을 미리 인지하시고 참고하여 주시면 되겠네요. (해당 환경과 관련된 옵션은 설명에서 몽땅 제외입니다. 뷁~~~~)

또한 위에서 manpage 파일을 정상적으로 설치하셨다면 man vsftpd.conf 명령으로도 옵션들을 확인하실 수 있습니다.

옵션을 사용하기 전에 주의할 점 : 반드시 옵션명=값 으로 설정하셔야 합니다. 즉 =(equal) 좌우에 공백이 있어서는 절대 안됩니다. 반드시 옵션과 값사이에 =(equal)을 딱!!! 붙여서 주셔야 합니다.


anonymous_enable=NO ( 기본값 : YES )
  익명 사용자의 접속을 허용할 것인지를 결정합니다.


background=YES ( 기본값 : NO )
listen_port=21 ( 기본값 : 21 )
listen_ipv6=NO ( 기본값 : NO )
  기본적으로 vsftpd는 inetd 또는 xinetd 또는 Solaris10의 서비스로 등록하여 사용이 가능하도록 설정되어있습니다. 위 옵션대로 설정하게 되면 standalone(proftpd 의 standalone 동작과 동일) 모드로 동작합니다. Solaris10에서는 위에서 서비스로 등록해 놓았으므로 모두 주석처리합니다. 일반적으로 FTP 접속이 그리 많지가 않는 경우에는 기본 동작모드(inetd 등)가 유리하며 FTP 접속자가 많은 경우에는 standalone 모드가 유리하다고 합니다.

listen_address=none ( 기본값 : none )
listen_address6=none ( 기본값 : none )
  standalone 모드로 동작시 대기할 IP를 지정합니다.(멀티 IP 서버를 이용할때) address6는 IPV6 상황에서 사용합니다.

pasv_address=none ( 기본값 : none )
  Use this option to override the IP address that vsftpd will advertise in response to the PASV command. Provide a  numeric IP address, unless pasv_addr_resolve is enabled, in which case you can provide a hostname which will be DNS resolved for you at startup. (해석불가)

nopriv_user=nobody ( 기본값 : nobody )
  vsftpd가 구동할 유저명을 지정합니다.

max_clients=50 ( 기본값 : 0 )
  최대 접속자수를 결정합니다. 0으로 두면 무제한입니다.

max_per_ip=5 ( 기본값 : 0 )
  하나의 IP에서 동시에 접속할 수 있는 수를 결정합니다.

local_max_rate=0 ( 기본값 : 0 )
  로컬 사용자의 접속시 업/다운로드 속도 제한을 지정합니다. 단위는 초당 Bytes 입니다.

trans_chunk_size=0 ( 기본값 : 0 )
  한번에 전송할 크기를 지정합니다. 단 일정단위로 묶어서 전송하게 되는데 이 항목은 전송량 조절 옵션인 rate 관련 옵션들과 연관성이 있습니다. 되도록이면 이 옵션은 수정하지 않는 것이 좋다고 제작자는 밝히고 있군요. 다만 8192로 하면 부드럽게 대역폭 제한이 가능하다고 하는데 당최 무슨 뜻인지;;;;;;

use_localtime=YES ( 기본값 : NO )
  파일의 시간을 보여줄 때 시스템의 Local time에 맞춰서 보여줍니다. 기본적으로 vsftpd는 GMT를 따르고 있습니다. 우리나라의 시간은 GMT + 9 입니다.

setproctitle_enable=YES ( 기본값 : NO )
  FTP의 현재 상황을 PS 로 볼 수 있도록 해줍니다. 즉 현재 세션의 상황을 ps 명령으로 나오는 값을 조작하여 접속자 등을 파악할 수 있습니다.

user_config_dir=none ( 기본값 : none )
  특정 사용자의 접속 환경을 vsftpd.conf 가 아닌 파일로 저장시켜 두고 적용시킬 수 있게 해줍니다. 여기서 지정하는 값은 디렉토리를 의미합니다. 예를 들어 /etc/vsftpd_user/chris 라는 파일을 생성한 후 파일속에 vsftpd.conf 와 같은 각종 지시어를 이용하여 환경을 구축해 놨을 때 chris라는 사용자가 접속하면 vsftpd.conf 가 아닌 /etc/vsftpd_user/chris 라는 파일의 환경에 적용을 받습니다. 물론 /etc/vsftpd_user/chirs 안에 없는 옵션은 vsftpd.conf 옵션에 적용을 받습니다. 다만 /etc/vsftpd_user/chris 파일내에 유저의 환경과는 관계가 없는 옵션들(banner_file, max_per_ip, max_clients, xferlog_file 등)은 무시됩니다.

local_enable=YES ( 기본값 : NO )
  시스템에 등록된 유저의 접속을 허용합니다.

userlist_enable=NO ( 기본값 : NO )
  유저 목록을 담고 있는 파일속의 내용에 있는 사용자만 접속을 허용합니다. 이 옵션은 userlist_deny 옵션이 비활성화된 상태에서만 효과가 있습니다.(userlist_deny 옵션과 반대역활입니다.)

userlist_deny=YES ( 기본값 : YES )
  유저 목록을 담고 있는 파일속의 내용에 있는 사용자만 접속을 불허합니다. userlist_enable 옵션과 반대 역활을 합니다. 특정 유저의 접속을 허용하지 않고자 할때 주로 사용합니다.

userlist_file=/etc/vsftpd.user_list ( 기본값 : /etc/vsftpd.user_list )
  userlist_enable 옵션과 userlist_deny 옵션에서 사용되는 유저 목록을 담고 있는 파일입니다.

text_userdb_names=YES ( 기본값 : NO )
  디렉토리 목록을 보여줄 때 유저명과 그룹명을 문자로 표시할 것인지를 결정합니다. 성능상과 보안문제상 NO로 되어 있는 듯 하며 개인적으로는 YES를 좋아라 합니다.

pam_service_name=vsftpd ( 기본값 : ftp )
  Solaris10과는 관계없는 옵션이며, pam 사용자 인증을 할때 사용할 인증파일을 지정합니다.

tcp_wrappers=YES ( 기본값 : NO )
  TCP wrappers에 의해서 FTP 접속을 제어할 것인지를 설정합니다. 미리 tcp_wrappers가 설치되어 있어야 하며, sunfreeware 에서는 현재날짜 기준으로(2008. 08. 04) 7.6 버젼이 공개되어 있으므로 vsftpd 설치전에 tcp_wrappers를 설치하시길 바랍니다. 참고로, solaris10 을 기본으로 설치할 경우 tcp_wrappers가 설치되어 있습니다만, 버젼이..... 전 7.6 버젼을 새로 설치하였습니다.

ssl_enable=NO ( 기본값 : NO )
  ssl 접속을 허용할 것인지를 결정합니다. 이 옵션을 사용할려면 컴파일 하기전에 builddefs.h 파일에서 SSL 옵션을 활성화시켜야 하며 관련 라이브러리 및 데몬들도 설치가 되어 있어야 합니다. 솔라리스에서는 SSL 연결이 좀 까탈스럽더군요. OTL;;;;;;

ssl_tlsv1=NO ( 기본값 : YES )
ssl_sslv2=NO ( 기본값 : NO )
ssl_sslv3=NO ( 기본값 : NO )
  ssl 접속시 어떤 프로토콜을 사용할 것인지를 결정합니다. 각각 TLS, V2, V3 를 의미하며 ssl_enable 옵션이 활성화되어 있을 때 기본 프로토콜은 SSL v1 프로토콜을 이용하여 접속합니다.

dsa_cert_file=none ( 기본값 : none - RSA certificate suffices 를 사용 )
  SSL의 암호화 접속시 사용할 DSA 인증서의 위치를 지정합니다.

dsa_private_key_file=none ( 기본값 : none )
  SSL의 암호화 접속시 사용된 DSA 개인키 파일의 위치를 지정합니다.

rsa_cert_file=/usr/share/ssl/certs/vsftpd.pem ( 기본값 : none )
  SSL 접속시 RSA 인증서를 지정합니다.

rsa_private_key_file=none ( 기본값 : none )
  SSL 접속시 RSA 인증에 사용할 RSA 개인키 값 파일을 지정합니다.

force_local_data_ssl=YES ( 기본값 : YES )
  ssl_enable 옵션이 활성화되어 있을때만 활성화되는 옵션이며, 로컬 사용자가 데이터를 전송시 SSL을 사용하도록 강제적으로 규정합니다.

force_local_logins_ssl=YES ( 기본값 : YES )
  ssl_enable 옵션이 활성화되어 있을때만 활성화되는 옵션이며, 로컬 사용자가 로그인시 강제적으로 SSL을 이용하도록 합니다.

connect_timeout=60 ( 기본값 : 60초 )
  Port 모드로 접속시 사용자의 접속 허용 시간을 설정합니다. 지정된 시간내에 접속이 완료되지 않으면 접속이 끊어집니다.

accept_timeout=60 ( 기본값 : 60초)
  Pasv 모드로 접속시 사용자의 접속 허용 시간을 설정합니다. connect_timeout 옵션과 동일하게 동작합니다.

data_connection_timeout=300 ( 기본값 : 300초)
  데이타를 전송한 후 (업/다운) 지정된 시간동안 아무런 동작이 없을 경우 접속을 끊습니다.

idle_session_timeout=300 ( 기본값 : 300초)
  접속 완료 후 지정된 시간동안 아무런 동작을 하지 않으면 접속을 끊습니다.

banner_file=/etc/vsftpd.banner_file ( 기본값 : none )
  사용자가 접속했을 때 보여줄 환영 메세지를 가진 파일을 지정합니다.

ftpd_banner=Welcome to FTP Service ( 기본값 : none - vsftpd의 기본 메세지가 보입니다.)
  사용자가 접속했을 때 보여줄 안내 메세지를 지정합니다.
 
dirmessage_enable=NO ( 기본값 : NO )
  디렉토리로 접속할때 해당 디렉토리에 message_file 옵션에서 지정한 파일의 내용을 보여줄 것인지를 결정합니다.

message_file=.message ( 기본값 : .message )
  dirmessage_enable 옵션이 YES로 되어있다면 읽어서 보여줄 파일명을 지정합니다.

port_enable=YES ( 기본값 : YES )
  FTP의 Port 모드를 활성화홥니다. 일명 Active 모드라고도 합니다.

connect_from_port_20=YES ( 기본값 : NO )
  Port 모드로 동작시 데이터 전송의 기본 포트인 20번 포트의 사용 여부를 결정합니다.

ftp_data_port=20 ( 기본값 : 20 )
  Port 모드로 동작시 데이터 전송에 사용할 포트 번호를 지정합니다. 이 옵션은 connect_from_port_20 옵션이 활성화되어 있어야 정상적으로 작동합니다.

port_promiscuous=NO ( 기본값 : NO )
  Port 모드에서의 보안 체크 기능을 해제합니다. FXP(서버대 서버전송) 기능 사용시 활성화시켜줍니다.

pasv_enable=YES ( 기본값 : YES )
  Pasv 모드로 동작할 것인지를 결정합니다.

pasv_promiscuous=NO ( 기본값 : NO )
  동일한 IP에서 접속이 이루어질때 PASV 보안체크를 해제시켜 줍니다? 영어가 딸려서 해석이 꼬이네요. FXP (서버 대 서버 전송) 기능을 사용할 때나 SSH를 이용한 터널링 기능을 이용할 때 활성화시켜주는 옵션입니다.

pasv_min_port=0 ( 기본값 : 0 )
pasv_max_port=0 ( 기본값 : 0 )
  Pasv 모드로 접속시 할당할 최저(min) 포트번호와 최고(max) 포트번호를 지정합니다. 기본값인 0을 설정하게 되면 1024 이상 무작위로 할당합니다. 1024 이하의 포트번호는 일반적으로 well kown port 번호라고 하여 부르며 root 권한만 해당 포트를 제어할 수 있도록 되어있습니다. ( /etc/services 파일 참고 )

ascii_download_enable=NO ( 기본값 : NO )
ascii_upload_enable=NO ( 기본값 : NO )
  ASCII 모드로 전송을 허용할 것인지를 결정합니다. 일반적으로 UNIX 모드의 텍스트 파일과 PC(or Windows) 모드의 텍스트 파일은 LF/CR 처리부분에서 다르므로 이 옵션을 활성화(YES)시켜주면 전송시 자동으로 변환이 됩니다. 하지만 요즘 텍스트 에디터들은 자동으로 변환해주므로 크게 문제되지 않는다면 보안문제상 기본값으로 설정된 NO로 해주심을 권장합니다.

local_umask=022 ( 기본값 : 077 )
  파일 생성 umask 값을 지정합니다. 이 값을 보면 vsftpd가 보안에 까칠하다는게 확실히 알 수 있겠군요. 기본적으로 파일 생성시 할당되는 퍼미션은 최대퍼미션 - umask 의 값을 가집니다. 최대퍼미션은 디렉토리의 경우 0777, 파일인 경우 0666 으로 결정됩니다. 그러므로 디렉토리의 경우 vsftpd의 기본 umask를 적용하면 0700 ( 0777 - 077 = 0700 ) 으로 설정됩니다. 즉 올린 사람외에는 손대지마!!! 라는 것이 되죠. 다만 이렇게 된다면 웹서버를 운영할 경우 웹상에서 접근을 못하게 되는 사태가 벌어집니다. 일반적인 umask 옵션인 022 로 정해줍시다.

file_open_mode=0644 ( 기본값 : 0666 )
  업로드되는 파일의 기본 퍼미션을 지정합니다. 이 옵션은 반드시 local_umask 옵션보다 뒤에서 지정되어야 하며, 기본값을 주게 되면 업로드된 파일이 아무나 읽기쓰기로 되어버리기 떄문에 가능하면 0644 로 설정하는 것이 좋습니다.

dirlist_enable=YES ( 기본값 : YES )
  디렉토리 목록을 볼 수 있게 합니다. NO로 할 경우 목록을 볼 수가 없게 됩니다.

force_dot_files=NO ( 기본값 : NO )
  .(dot)로 시작하는 파일들의 표시 여부를 결정합니다. 보안관계상 기본 값은 NO로 되어있습니다.

tilde_user_enable=NO ( 기본값 : NO )
  일반적으로 사용하는 ~crhis/pics 와 같은 지정을 해석할 수 있도록 합니다. 사용자 계정명앞에 ~(틸드)가 오게 되면 해당 사용자 계정의 홈디렉토리를 의미하게 되는데 이것을 해석할 수 있도록 해주는 것입니다. 다만 이 옵션은 /etc/passwd 파일을 찾을 수 있을 경우에 정상적으로 작동합니다.

hide_ids=NO ( 기본값 : NO )
  이 옵션이 활성화되면 모든 파일의 사용자는 FTP로 표시됩니다. 보안에 도움이 될 수도 있는 옵션입니다.

write_enable=YES ( 기본값 : NO )
  사용자가 기록을 할 수 있도록 합니다. (STOR, DELE, RNFR, RNTO, MKD, RMD, APE, SITE 등의 명령이 실행가능해 집니다.)

download_enable=YES ( 기본값 : YES )
  파일을 다운로드할 수 있게 합니다.

chmod_enable=YES ( 기본값 : YES )
  로컬 사용자가 퍼미션을 변경할 수 있도록 합니다. 익명 접속 사용자는 불가능합니다.

use_sendfile=YES ( 기본값 : YES )
  서버 운영체제의플랫폼에서 sendfile() 시스템 호출을 허용합니다. 내부 세팅인것 같은데 그냥 YES~~~

cmds_allowed=none ( 기본값 : none )
  사용자에게 허용할 명령어를 지정합니다. 이 명령은 지정한 명령만 사용할 수 있도록 만드는 것입니다. 적용하지 않으면 모든 명령을 사용할 수 있으며 지정하게 되면 지정한 명령어만 사용가능합니다. 단 로그인 전의 명령어나 로그아웃 등의 명령어는 해당되지 않습니다. ( USER, PASS, QUIT 등 )

deny_file=none ( 기본값 : none )
  업로드를 거부할 파일명을 지정합니다. { 와 } 으로 묶으며, 와일드 카드 ( ? , * )를 사용할 수 있습니다. 각각의 파일은 ,(comma)로 구분하도록 되어있습니다. 예) deny_file={*.mp3,*.mov,.private}

hide_file=none ( 기본값 : none )
  숨길 파일명을 지정합니다. 즉 존재는 하되 파일목록에서는 보이지 않습니다. deny_file 옵션과 동일한 형식으로 지정가능합니다.

async_abor_enable=NO ( 기본값 : NO )
  특정 클라이언트가 파일 전송중 취소했을 때 정상적으로 취소되지 않는 경우가 발생하는데 이때 이 옵션을 enable 하게 되면 이런 증상을 막을 수 있습니다. 제작자는 오직 ill adviced FTP clients가 이런 증상을 발생시킨다고 하며 보안관계상 NO를 권장하고 있습니다.

ls_recurse_enable=NO ( 기본값 : NO )
  ls 명령의 옵션중 하위 디렉토리의 구조까지 모두 읽어올 수 있는 -R 옵션 사용 여부를 결정합니다. 서버에 대한 부하가 크므로 기본적으로 NO 로 설정되어 있습니다.

chroot_local_user=YES ( 기본값 : NO )
  로컬 사용자가 접속하면 자신의 상위 디렉토리로 접근할 수 없도록 설정합니다.

passwd_chroot_enable=YES ( 기본값 : NO )
  If enabled, along with chroot_local_user,  then a chroot() jail location may be specified on a per-user basis. Each user's jail is derived from their home directory  string in /etc/passwd. The occurrence of /./ in the home directory string denotes that the jail is at that particular location in the path. (해석불가 -.-;;)

chroot_list_enable=NO ( 기본값 : NO )
  이 옵션을 활성화하면 명시된 사용자만이 자신의 홈상위 디렉토리에 접근할 수 없게 되어 있습니다. 단 chroot_local_user 옵션이 비활성화되어 있어야 작동합니다.

chroot_list_file=/etc/vsftpd.chroot_list ( 기본값 : /etc/vsftpd.chroot_list )
  chroot_list_enable 옵션이 활성화되어 있다면 chroot() 기능을 적용시킬 사용자 목록을 가지게 되며, chroot_local_user 옵션이 활성화되어 있다면 chroot() 기능에서 제외할 사용자 목록을 가지게 됩니다.

secure_chroot_dir=/usr/share/empty ( 기본값 : /usr/share/empty )
  secure chroot()에서 사용될 디렉토리를 지정하며 반드시 비어있어야 합니다. 또한 ftp user에 대한 쓰기 권한이 없어야 합니다. (이게 왜 있는건지......) 참고로, 저 디렉토리는 반드시 생성되어 있어야 하며 조건에 맞지 않게 되어 있다면 vsftpd 실행시 에러가 발생합니다. 그냥 /usr/share/empty 디렉토리를 만들고 root:root 로 권한을 주고 755로 퍼미션 주시면 됩니다.

check_shell=YES ( 기본값 : YES )
  이 옵션은 non-PAM 시스템에서만 정상적으로 동작하며, 접속자의 Shell 체크 여부를 결정합니다.

delay_failed_logins=5 ( 기본값 : 1 초 )
  로그인이 실패하고 난 뒤 다음 로그인 시도까지의 딜레이 시간을 지정합니다.

delay_successful_logins=0 ( 기본값 : 0 초 )
  로그인이 성공하고 난 뒤 다음 과정으로 넘어가기 전까지의 딜레이 시간을 지정합니다.

max_login_fails=3 ( 기본값 : 3 회)
  지정한 횟수만큼 연속적으로 로그인을 실패하면 연결을 끊어버립니다.

local_root=none ( 기본값 : none )
  로컬 사용자(익명 사용자가 아닌) 로그인을 하게 되면 해당 디렉토리로 이동시킵니다. 로그인을 실패한 경우에는 아무런 동작을 하지 않습니다.

lock_upload_files=NO ( 기본값 : NO )
  이 옵션을 활성화하면 모든 업로드되는 파일들은 기록 lock이 설정됩니다. 단 모든 다운로드 파일들은 공유 읽기 lock이 설정되는데 이 옵션을 활성화화면 악의적인 목적으로 업로드를 방해할 수 있으므로 주의해서 사용해야 합니다.

mdtm_write=YES ( 기본값 : YES )
  mdtm 기능을 사용할 수 있게 합니다. mdtm은 업로드되는 파일의 시간과 날짜를 변경할 수 있게 하는 기능힙니다.

pasv_addr_resolv=NO ( 기본값 : NO )
  이 옵션을 사용하게 되면 IP 주소가 아닌 호스트 네임을 pasv_address에서 사용할 수 있게 합니다. 

vsftpd_log_file=/var/log/vsftpd.log ( 기본값 : /var/log/vsftpd.log )
  vsftpd의 로그파일을 지정합니다. 단 xferlog_enable 옵션이 활성화되고 xferlog_std_format 옵션이 비활성화되어야 동작합니다. 또는 dual_log_enable 옵션아 활성화될 경우에도 동작합니다. 주의할 점은 syslog_enable 옵션이 활성화되면 모든 로그들은 system log로 보내어지므로 vsftpd_log_file 옵션에 기록된 파일에는 로그가 기록되지 않습니다.

dual_log_enable=YES ( 기본값 : NO )
  이 옵션이 활성화되면 /var/log/xferlog 와 /var/log/vsftpd.log 파일 둘다 로그 기록에 사용합니다.

syslog_enable=NO ( 기본값 : NO )
  이 옵션이 활성화되면 모든 로그들은 system log(syslogd 데몬을 이용한)에 기록되며 /var/log/vsftpd.log 파일은 사용되지 않습니다.

xferlog_file=/var/log/xferlog ( 기본값 : /var/log/xferlog )
  이 옵션 wu-ftpd 형식의 로그들을 기록할 파일을 지정하는 것입니다. 반드시 xferlog_enable 옵션이 활성화되어야 정상적으로 동작하며 xferlog_std_format 옵션과 연관성이 있습니다. 또는 dual_log_enable 옵션이 활성화되어도 본 옵션이 동작합니다.

xferlog_enable=YES ( 기본값 : NO )
  상세한 파일의 전송상황을 로그파일에 기록할 것인지를 결정합니다. 기본값은 /var/log/vsftpd.log 에 기록하며, 이 파일의 위치는 xferlog_file 옵션에서 변경가능합니다.

xferlog_std_format=NO ( 기본값 : NO )
  xferlog_enable 옵션으로 기록되는 로그 형식을 표준으로 할 것인지를 결정합니다.

log_ftp_protocol=YES ( 기본값 : NO )
  아주 상세한 FTP 이용 상황을 로그에 기록할 지를 결정합니다.

no_log_lock=NO ( 기본값 : NO )
  로그 파일을 기록할 때 로그 파일에 lock 을 걸 것인지를 결정합니다. 일반적으로 걸지 않아도 되지만, 솔라리스 OS에서 베리타스(Veritas) 파일 시스템을 사용할 경우 문제점이 발생할 수 있으므로 해당 OS와 파일시스템을 사용하고 있을 경우 YES로 설정하시기 바랍니다.

session_support=YES ( 기본값 : NO )
  세션 기록을 wtmp 또는 utmp 에 남길것인지를 결정합니다. wtmp/utmp를 이용하게 되면 last 명령으로 접속여부를 확인할 수 있으므로 YES를 권장합니다.

one_process_model=NO ( 기본값 : NO )
  하나의 접속자에 하나의 프로세스 모델을 생성하여 할당합니다. 효율면에서는 좋으나 보안면에서는 조금 떨어질 수 있다고 제작자는 밝히고 있습니다. 단 리눅스 커널이 2.4 이상일때만 권장하는 것 같군요. 솔라리스10에서 서비스로 등록을 해 놓았으므로 이 옵션과는 무관하게 접속자별로 2개씩의 프로세스가 생성됩니다. OTL;;;;;;

기타 설명하지 않은 옵션들
  가상 사용자나 익명사용자에 대한 설정은 본인이 사용하지 않으므로 설명을 생략합니다. 인터넷상에 많이 알려져 있으므로 해당 문서를 검색하시거나 아래 참고사이트를 이용하시면 상세하게 설명되어 있습니다.
guest_enable=NO
guest_username=ftp
virtual_use_local_privs=NO
user_sub_token=none
allow_anon_ssl=NO
deny_email_enable=NO
banned_email_file=/etc/vsftpd.banned_emails
secure_email_list_enable=NO
email_password_file=/etc/vsftpd.email_passwords
ftp_username=ftp
no_anon_password=NO
anon_root=none
anon_max_rate=0
anon_upload_enable=NO
anon_world_readable_only=YES
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chown_uploads=NO
chown_username=root
anon_umask=077
force_anon_data_ssl=NO
force_anon_logins_ssl=NO


참고용 설정파일
제가 사용하고 있는 옵션들을 간단하게 옮겨봅니다. Solaris10에서 익명과 SSL을 사용하지 않으며, 웹서버 운영 용도로 사용하고 있는 서버입니다. 이중 로그파일을 한 이유는 xferlog.log 에서 전송량을 체크하기 위함이며, vsftpd.log 에서는 접속현황 및 계정 관리를 위해서 세팅하였습니다.

anonymous_enable=no
max_clients=50
max_per_ip=10
use_localtime=YES
setproctitle_enable=YES
local_enable=YES
ftpd_banner=Welcome to KYUNGSUNG University Web server......
port_enable=YES
max_login_fails=1
write_enable=YES
local_umask=022
file_open_mode=0644
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog.log
session_support=YES
xferlog_std_format=NO
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
text_userdb_names=YES
tcp_wrappers=YES


참고사이트
기존 vsftpd 관련 자료들이 많긴 합니다만, 대부분 티니님의 자료를 옮겨 놓은 듯 하더군요. 다만 티니님의 자료는 1.0.1 버젼을 기준으로 하여 없는 옵션이나 내용이 조금 바뀐 옵션들이 있어서 따로 정리를 해봤습니다. 정말 항상 글을 쓸때마다 느끼는 것이지만, 글 제대로 쓰시는 분들 존경스럽네요. ;;;;;

- VsFTPD FTP 서버 설치 by 티니님 ( http://coffeenix.net/board_view.php?bd_code=1470 )
- FTP 설정하기 by 아햏햏님 ( http://blog.naver.com/ssanzing2?Redirect=Log&logNo=140025729151 )


Error 수정

vsftp를 설치하고 난 뒤 아래의 메세지가 표시되면서 접속이 안되는 경우가 있다.

500 OOPS: tcp_wrappers is set to YES but no tcp wrapper support compiled in
: 위의 메세지는 sunfreeware.com 에서 다운받아서 pkgadd 로 설치했을 경우 tcp_wrapper가 지원되지 않도록 컴파일되어 있기 때문입니다. 결론은, 소스 받아서 컴파일 하세요~

500 OOPS: vsftpd: cannot locate user specified in 'ftp_username':ftp
: 위의 메세지는 ftp라는 그룹과 유저가 생성되어 있어야 합니다. 아래 명령으로 유저와 그룹을 생성하세요.
: groupadd -g 199 ftp
: useradd -u 199 -g 199 -s /bin/false -m ftp

500 OOPS: could not bind listening IPv4 socket

SMF(Service Management Facility) 사용시에 /etc/vsftp.conf 파일에서  listen=YES 로 설정시에 NO로 변경
listen=NO


포트 변경 하는 방범

/etc/services 파일 포트 수정

 

수정 전

ftp-data        20/tcp
ftp-data        20/udp
# 21 is registered to ftp, but also used by fsp
ftp             21/tcp
ftp             21/udp                fsp fspd

 

수정 후

ftp-data        6500/tcp
ftp-data        6500/udp
# 21 is registered to ftp, but also used by fsp
ftp             6500/tcp
ftp             6500/udp                fsp fspd

 

 

/etc/vsftpd/vsftpd.conf

 

수정 전

# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES

 

수정 후

# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=NO

 

추가

listen_port=6500

 


 

변경 작업 후 리스타트

svcadm disable /network/ftp/tcp

svcadm enable /network/ftp/tcp

포트 변경 완료

반응형

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

solaris cd-rom mount 하기  (0) 2010.03.05
solaris root 패스워드 복구  (0) 2009.10.28
SWAT SVM RAID  (0) 2009.05.25
미러 디스크 장애시 디스크 교체하기  (0) 2009.05.07
samba  (0) 2008.02.28
Posted by [PineTree]
OS/WINDOWS2009. 7. 16. 16:50
반응형

대부분은 경우를 보면 윈도우 서비스를 추가하거나 제거하는 방법을 잘 몰라서 그냥 방치를 하거나

불필요한 서비스인 경우는 중지만 해놓고 있는 경우가 많다.

 

인터넷에서 윈도우 서비스를 관리 할 수 있는 유틸리티를 받아서 관리를 하는 분도 있기도 하지만

만약 해킹으로 인하여 인터넷이 불가능한 상황이라면 인터넷에서 이런 유틸리티를 받을수도 없다.

 

하지만 Windows Control (이하 SC)를 이용하면

윈도우 서비스를 쉽게 생성 할수도 있고, 사용하지 않는 서비스는 삭제 할 수있다.

 

 

사용법도 무지 간단하다

 

서비스를 삭제를 하고자 하는 경우에는  아래와 같이 입력하면 된다.

 

sc delete 서비스명

ex) sc delete msdtc

 

서비스에 대한 정보를 보고자 할 경우에는 아래와 같이 입력하면 된다.

 

sc query 서비스명

ex) sc query msdtc

 

서비스 Start Stop은 아래와 같다

 

sc start 서비스명

ex) sc start abel

 

sc stop 서비스명

ex) sc stop abel

 

서비스 설정을 바꾸고자 할때에는 config를 입력하면 된다.(그림 참고)

 

 

윈도우 서비스를 생성하고자 하는 경우에는 추가적으로 실행해주는 옵션이 많은데,

친절하게 옵션 설명이 나오므로 참고 하면 되겠다.

 

 

 

 

 

반응형
Posted by [PineTree]
OS/SOLARIS2009. 5. 25. 15:22
반응형
출처 : http://moonlite.tistory.com/trackback/29

swat : samba가 제공하는 웹 관리 도구
  예) SWAT ----------------------------------------------------
          #cp /etc/apache/httpd.conf-example /etc/apache/httpd.conf
          #/usr/apache/bin/apachectl start
         웹브라우저에서 http://ip:901/ 입력후 swat화면으로 접속

삼바클라이언트 : 윈도우서버의 공유자원을 클라이언트(솔라리스 삼바)가 접속할 때 사용
    #smbclient //컴퓨터이름(IP)/공유폴더이름
    #smbclient -U username //moonlite/share     :: username에 해당하는 사용자로 접속


SVM (Solaris Volume Manager) : 다수의 디스크와 디스크상의 데이터를 관리 할 수 있게 하는 소프트웨어 (논리적인 디스크 = metadevice)
       - 물리적인 디스크와 데이터를 논리적인 디스크로 구성
       - 논리적인 디스크 구성 시 기본단위는 slice또는 disk partition
      장점> 디스크의 I/O 성능 향상
               저장용량과 데이터의 가용성 향상
               디스크 장애 발생시 복구 방안 제공

SVM 오브젝트
    - Metadevice : 물리적인 슬라이스 그룹을 논리적인 단일 디바이스로 표현
                            RAID기법을 이용하여 스토리지 용량과 데이터 가용성을 향상
         Raid : 논리적으로 대용량의 저장공간을 만들 수 있으면서 데이터 입출력을 향상과 관리향상을 가진 S/W기법
 
    - MetaDB : SVM(Metadevice)구성 상태에 관한 디스크 정보를 저장하고 있는 데이터 베이스
    - Hot Spare Pool : 물리적인 슬라이스 장애 발생시 자동으로 복구할 슬라이스나 디스크

 Metadevice
     device파일은 /dev/md/rdsk, /dev/md/dsk에 목록 생성
     metadevice name은 기본적으로 128개의 디바이스 이름 사용 (/dev/md/dsk/d0~127)
       + 1024까지 사용하려면 /kernel/drv/md.conf에서 수정
     metadevice에 대해 파일 시스템 명령어 사용이 가능하지만, format명령어는 사용할 수 없음
       + mount, umount, ufsdump, ufsrestore 등..

MetaDB
    MetaDB의 크기는 기본적으로 517KB이며 파티션의 시작부분에 저장됨
    메타디바이스를 생성하기 전에 반드시 먼저 생성해야 함
    저장공간을 할당해야 하기 때문에 사용하지 않는 슬라이스에 생성하는 것이 좋다
    MetaDB는 여러개의 복제 metaDB를 생성하며, 단일 metaDB의 장애로 인한 데이터 손실을 방지함 (기본적으로 3개의 복제본이 요구되며, 디스크의 분산저장함)
   최대 50개의 metaDB 생성 가능
    디스크 또는 슬라이스의 장애로 인해 MetaDB의 손실이 일어날 경우 50%이상일 경우는 running, 이하일경우 panic이나 reboot

--------------------------------
실습1) Metadb를 만드는 명령어
     c0d0 - s0 : solaris
                 s1 : swap
                 s3 : metadb
                 s4 : metadb 복제
┌────┐
│    c0d1 │      s0 : 100m
│ c2t0d0 │       s1 : 100m
│ c2t2d0 │       s3 : 100m
│ c2t1d0 │       s4 : 100m - metadb
└────┘
 
 #metadb -a -f c0d0s3      :: c0d0디스크의 슬라이스3번에 metadb를 생성함
 #metadb      :: metadb정보를 확인
 #metadb -a c0d0s4         :: c0d0디스크의 슬라이스4번에 복제metadb 생성
 #metadb      :: metadb정보를 확인
 #metadb -d c0d0s4         :: c0d0디스크의 슬라이스4번의 생성된 metadb 삭제
 #metadb -a -c3 c0d0s4  :: c0d0디스크의 슬라이스4번에 복제metadb를 3개 생성
 #metadb      :: metadb정보를 확인하면 제일 위에있는것이 실제 서비스하는 metadb이며 나머지것은 레플리카라고 함

 다시셋팅>
 #metadb -a -f -c3 c0d0s4
 #metadb -a -f -c3 c2t1d0s4
 #metadb -a -f -c3 c2t2d0s4

concatenate volume
 - RAID 0 : 여러개의 물리적인 디스크를 하나의 논리적인 디스크로 구성하는 방식 (concat / stripe)
           장점 - 대용량의 디스크를 구성할 수 있으며, 파일시스템의 변경 없이 추가적으로 용량을 늘려 사용할 수 있다
           단점 - 물리적인 디스크 장애가 발생할 경우 데이터 손실이 발생함

       #metainit d10 2 1 c2t0d0s2 1 c2t1d0s2   :: 2개의 물리적 디스크를 d10이라는 이름으로 1개의 논리적인 디스크로 만듬
-----------------------
실습 ) c0d1s0 과 c2t0d0s0을 묶음
 #metainit d10 2 1 c0d1s0 1 c2t0d0s0
 #metastat            :: meta device 구성 정보를 확인하는 명령어
 현재는 파일시스템 구성이 안되어있으니 사용할 수 없다
 #newfs /dev/md/rdsk/d10   :: ufs로 파일시스템 구성
 #mkdir lab     :: 마운트 할 디렉토리 구성
 #mount /dev/md/dsk/d10 /lab     :: /lab에 마운트
 #df -h    :: 확인
-----------------------
 실습2 ) File system이 구성된 disk의 volume 구성방법
  #newfs c2t1d0s0    ::  c2t1d0s0에 ufs 파일 시스템 구성
  #mkdir /lab/test1    ::  마운트할 디렉토리 생성
  #mount /dev/dsk/c2t1d0s0 /lab/test1     ::  /lab/test1에 마운트
  #cd /lab/test1        :: 디렉토리 이동
  #mkfile 5m testtest   :: testtest라는 5mb짜리 파일을 만듬
  #metainit -f d11 2 1 c2t1d0s0 1 c2t2d0s0     :: -f 옵션을 이용하여 강제로 raid 구성
  #metastat    ::  확인
  #df -h          :: mount정보 확인하면 아까 마운트 한 정보만 있음,
  #mkdir /lab/test2    :: 마운트 할 디렉토리를 생성
  #mount /dev/md/dsk/d11 /lab/test2       :: raid 한 metadevice를 test2에 마운트
  #umount /lab/test1  :: /lab/test1 마운트 해제
  #growfs -M /lab/test2 /dev/md/rdsk/d11  :: 파일시스템을 재구성
  #df -h        :: mount정보 확인 (용량)
  #cd /lab/test2
  #ls    :: 파일이 존재하는것을 알 수 있음
----------------------------------
실습3 ) 실습1의 용량이 꽉차있다고 가정하고, c0d1s1을 하나 더 붙이기
  #metattach d10 c0d1s1 :: 이미 만들어진 metadevice에 물리적인 디스크를 추가하여 size 확장
  #metastat  ::  확인
  #df -h       ::  파일시스템 갱신이 안되어 size가 안늘어 나있음
  #growfs -M /lab /dev/md/rdsk/d10  :: 파일시스템을 재구성
  #df -h       :: size가 늘어나 있음을 확인
-----------------------------------

Raid 0 - stripe volume
 여러개의 물리적인 디스크를 하나의 논리적인 디스크로 구성하지만 데이터기록을 지정된 stripe size로 분산하여 동시에 디스크를 사용함, 장점은 file access 속도가 빨라짐

 명령어 : metainit d20 논리적인디스크 갯수, 물리적인디스크 갯수 장치명

-------------------------------
실습4) stripe raid 0 생성
 #metainit d20 1 2 c0d1s3 c2t0d0s3  :: stripe raid 0 구성
 #metastat  :: start block 확인해보면 둘다 0인것을 확인
 #newfs /dev/md/rdsk/d20  :: 파일시스템 생성
 #mkdir /lab/test3        :: 마운트 할 디렉토리 생성
 #mount /dev/md/dsk/d20 /lab/test3  :: /test3에 마운트
 #mkfile 150m /lab/test3/test         ::  150m용량의 test파일을 만들어서 hdd엑세스 확인
-------------------------------
실습5) 파일시스템을 미리 만들어놓고 metadevice 생성
#newfs /dev/rdsk/c2t1d0s3      :: c2t1d0s3에 대해 파일시스템 생성
#mkdir /lab/test3 /lab/test4      ::  마운트 할 test3,4 디렉토리 생성
#mount /dev/dsk/c2t1d0s3 /lab/test3   :: test4에 마운트
#metainit -f d21 1 2 c2t1d0s3 c2t2d0s3  :: raid 0 구성
#mount /dev/md/dsk/d21 /test5  :: 마운트 하지만 결과는 안됨
  ★stripe는 동시에 파일시스템을 만들어야하기 때문에, 데이터가 있는것에 대해 설정할 수 없음
--------------------------------
실습 6) 실습4의 결과물에 stripe volume size 확장          
  #metaclear d21       :: 실습 5에 한 metadevice 제거
  #metaattach d20 c2t1d0s3 c2t2d0s3     :: d20에 device 추가 (장치를 2개써야 완벽한 확장)
  #metastat  :: 확인
  #growfs -M /lab/test3 /dev/md/rdsk/d20   :: 파일시스템 재구성
  #cd /lab/test3
  #mkfile 350M testfile   :: 350mb테스트파일을 만들어서 hdd access 확인


volume제거
Metaclear device_name
    -r : 연결된 것까지 지움
    -a : all metadevice clear
    -f : force clear


Metadevice 손상
 stripe의 물리적인 디스크 손상시, 전체적인 metadevice 볼륨이 손상됨



RAID 5  (Parity Volume) : raid0의 단점을 보안하기 위해 패리티 데이터생성하여 각 디스크에 데이터와 패리티데이터를 동시에 분산 저장함
     장점 : 대용량의 디스크를 구성할 수 있다
               데이터의 가용성을 제공함
               디스크 장애시 추가적인 백업없이 복구 기능을 제공
              읽기 성능이 향상
     단점 : 패리티 데이터를 저장할 공간을 낭비함 (최소 디스크3개, 볼륨 공간에 1/3을 소요)
              쓰기성능이 다소 느려짐. (패리티연산 때문)
---------------------------
실습 7) raid5 구성
#umountall          :: 전 실습에 쓰인 mount 해제
#metaclear -a    ::  전 실습에 쓰인 metadevice 해제

#metainit d10 -r c0d1s0 c2t0d0s0 c2t1d0s0
#newfs /dev/md/dsk/d10
#mount /dev/md/dsk/d10 /lab/test1
#cd /lab/test1
#mkfile 100m filename
----------------------------------------


반응형

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

solaris root 패스워드 복구  (0) 2009.10.28
solaris10 vsftp 설치 및 포트변경  (0) 2009.08.03
미러 디스크 장애시 디스크 교체하기  (0) 2009.05.07
samba  (0) 2008.02.28
VMSTAT  (0) 2007.12.07
Posted by [PineTree]
OS/SOLARIS2009. 5. 7. 14:19
반응형
[root@tiger /]metastat
d11: 이중화
    서브미러 0: d21
      상태: 확인        
    서브미러 1: d31
      상태: 확인        
    전달: 1
    읽기 옵션: roundrobin (기본값)
    쓰기 옵션: parallel (기본값)
    크기: 2099106 블록(1.0 GB)

d21: d11의 Submirror
    상태: 확인        
    크기: 2099106 블록(1.0 GB)
    스트립 0:
        장치       시작 블록    Dbase         상태 Reloc 핫 스패어
        c0t0d0s1          0     아니          확인    예


d31: d11의 Submirror
    상태: 확인        
    크기: 2099106 블록(1.0 GB)
    스트립 0:
        장치       시작 블록    Dbase         상태 Reloc 핫 스패어
        c0t8d0s1          0     아니          확인    예


d10: 이중화
    서브미러 0: d20
      상태: 확인        
    서브미러 1: d30
      상태: 관리 필요   
    전달: 1
    읽기 옵션: roundrobin (기본값)
    쓰기 옵션: parallel (기본값)
    크기: 33555384 블록(16 GB)

d20: d10의 Submirror
    상태: 확인        
    크기: 33555384 블록(16 GB)
    스트립 0:
        장치       시작 블록    Dbase         상태 Reloc 핫 스패어
        c0t0d0s0          0     아니          확인    예


d30: d10의 Submirror
    상태: 관리 필요   
    호출: metareplace d10 c0t8d0s0 <새 장치>
    크기: 33555384 블록(16 GB)
    스트립 0:
        장치       시작 블록    Dbase         상태 Reloc 핫 스패어
        c0t8d0s0          0     아니          관리    예


Device Relocation Information:
Device   Reloc  Device ID
c0t8d0   예     id1,sd@SSEAGATE_ST318404LC______3BT18QVH0000V1060DM0
c0t0d0   예     id1,sd@SSEAGATE_ST318404LC______3BT1083K000021073AZM
[root@tiger /]metastat -p
d11 -m d21 d31 1
d21 1 1 c0t0d0s1
d31 1 1 c0t8d0s1
d10 -m d20 d30 1
d20 1 1 c0t0d0s0
d30 1 1 c0t8d0s0


[root@tiger /]format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c0t0d0 <SEAGATE-ST318404LC-0006 cyl 14187 alt 2 hd 6 sec 421>
          /pci@1f,4000/scsi@3/sd@0,0
       1. c0t8d0 <drive not available>
          /pci@1f,4000/scsi@3/sd@8,0
       2. c0t9d0 <SUN18G cyl 7506 alt 2 hd 19 sec 248>
          /pci@1f,4000/scsi@3/sd@9,0

1번 디스크 교체

metadetach -f d10 d30
metadetach -f d11 d31

metaclear d30
metaclear d31

metadb -d -f c0t8d0s7

디스크 교체

디스크 파티션 구성

prtvtoc /dev/rdsk/c0t0d0s2 | fmthard -s - /dev/rdsk/c0t8d0s2

newfs /dev/rdsk/c0t8d0s0
newfs /dev/rdsk/c0t8d0s7

metadb -a -f -c 3 c0t8d0s7

metainit d30 1 1 c0t8d0s0
metattach d10 d30

metainit d31 1 1 c0t8d0s1
metattach d11 d31

반응형

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

solaris10 vsftp 설치 및 포트변경  (0) 2009.08.03
SWAT SVM RAID  (0) 2009.05.25
samba  (0) 2008.02.28
VMSTAT  (0) 2007.12.07
솔라리스에서 xmanager 접속을 차단하거나, 통제하기  (0) 2007.11.17
Posted by [PineTree]
OS/Shell Script2009. 4. 15. 16:19
반응형

 

 

sed 명령어
sed는 데이터 편집을 위해 사용화는 프로그램이다. 이는 stream editor를 뜻한다. ed와 다르게 sed는 상호 작용적으로 사용되지 않는다. 그러나, sed 명령은 ed와 매우 비슷하다.
 sed 명령의 일반 형식은

   sed  command  file
이다. 이는 예시된 파일의 각 라인에 적용되는 ed스타일의 명령이다. 만일 예시된 파일이 없다면 표준 입력으로 추정한다. sed는 지시된 명령을 입력의 각 라인에 적용하기 때문에 결과를 표준 출력으로 기록한다.
 이전의 예에서 intro 파일을 살펴보자.

 $ cat intro
 The Unix operating system was pioneered by Ken
 Thompson and Dennis Ritchie at Bell Laboratories
 in the late 1960s. One of the primary goals in
 the design of the Unix system was to create an
 environment that promoted efficient program
 development.
 $
 사용자가 "Unix"라는 모든 결과를 "UINX"로 바꾸려 한다고 가정해 보자. 여기서 우리는 sed를 통해 쉽게 할 수 있다.

 $ sed 's/Unix/UNIX/' intro                        substitute Unix with UNIX
 The Unix operating system was pioneered by Ken
 Thompson and Dennis Ritchie at Bell Laboratories
 in the late 1960s. One of the primary goals in
 the design of the Unix system was to create an
 environment that promoted efficient program
 development.
 $
이제 한 쌍의 인용 부호 안에 sed명령을 에워싸는 습관을 들이도록 하자. 후에 언제 인용부호가 필요하고 언제 한 쌍의 인용 부호를 쓰는지 배우도록 한다.
 sed 명령 s/unix/UNIX는 intro의 모든 라인에 적용된다. 명령에 의해 바뀌어진 라인인지 아닌지는 표준출력으로 얻는다. sed는 본래의 입력 파일을 바꾸지는 못한다. 바꾸지 못하는 파일을 바꾸기 위해선 sed로부터 일시적 파일로 들어가도록 하여 출력 방향을 변경시키고 intro 파일로부터 뒤의 파일로 옮긴다.

 $ sed  ' s/Unix/UNIX/ '  intro  >  temp      Make the changes And now make them pernanent
 $ mv  temp  intro
 $
 사 용자들은 항상 본래 파일을 고쳐 쓰기 전에 정확하게 변화시킬 파일을 만들어야 한다는 것을 명심해야 한다. temp파일의 cat(파일 내용을 표준 출력으로 출력하는 것) 명령이 sed가 계획한 대로 성공되기를 보증하기 위해서는 위에 보여 준 두 가지 명령 사이에 포함되어야 한다.
 만일 사용자 텍스트가 한 라인에 하나 이상의 "Unix"를 포함하고 있다면 위의 sed명령은 각 라인 위에 첫 번째 발생한 것을 "UNIX"로 변환시켜야 한다. s명령으 끝에 global 옵션 g를 붙임으로써 사용자들은 한 줄 위에 많이 발생하는 문자열이 변환될 것이라 확신하게 된다. 이 경우 sed 명령은 다음을 판독할 것이다.

 $ sed  's/Unix/UNIX/g'  intro  >  temp
 who명령의 출력으로부터 사용자 이름을 추정하기를 원한다고 하자. 이제 여러분들은 cut 명령으로 하는 방법을 이미 알고 있다.

 $ who | cut  -c1-8
 root
 ruth
 steve
 pat
 $
또 다른 방법으로 ed명령에서의 정규식을 사용함으로써 첫 전째 공백에서부터 마지막 라인 끝까지 모든 문자를 삭제하기 위해 sed를 사용할 수 있다.

 $ who  |  sed  's/  .*$//'
 root
 ruth
 steve
 pat
 $
 sed명령은 //와 함께 공백으로부터 마지막 라인(.*$)까지의 임의의 문자들을 치환하라는 것을 뜻한다. 즉 입력된 각 라인의 첫 번 공백에서 시작하여 라인의 끝까지 문자를 삭제한다.

 -n 옵션
 sed 는 항상 표준 출력에서 입력 받은 각 라인을 나타낸다는 것을 알아냈다. 그러나 때때로 한 파일로부터 몇 개의 라인들을 추출해 내기 위해 sed를 사용하기를 원할 때도 있다. 이러한 경우에 -n옵션을 사용한다. 이 옵션은 사용자가 만약 해야 할 일을 정확히 말해 주지 않는다면 임의의 라인을 프린트하는 것을 원하지 않는다고 sed에게 말한다. 따라서 p명령이 같이 쓰인다. 라인 번호와 라인 번호의 범위를 나타냄으로써 sed를 사용하여 텍스트의 라인들을 선택적으로 프린트할 수 있게 한다. 다음에서 볼 수 있는 바와 같이, 한 파일로부터 첫 번째 두 라인이 프린트되었다.

 $ sed  -n  '1,2p'  intro                 Just print the first 2 lines
 The UNIX operating system was pioneered by Ken
 Thompson and Dennis Ritchie at Bell Laboratories
 $
 만 약 라인 번호 대신에 슬래시로 에워 싸인 문자열과 함께 p명령이 쓰인다면 sed는 이들 문자들이 포함하고 있는 표준 입력을 통해서 라인들을 프린트하게 된다. 따라서 하나의 파일로부터 처음의 두 라인을 프린트하기 위하여 다음과 같이 사용될 수 있다.

 $ sed  -n  /UNIX/p'  intro              Just print lines containing UNIX
 The UNIX operating system was pioneered by Ken
 The design of the UNIX system was to create an
 $

 라인 삭제
 텍 스트의 모든 라인들을 삭제하기 위해서는 d명령을 사용한다. 라인 번호나 번호의 범위를 예시함으로써 입력에서부터 특수한 라인들을 삭제할 수 있다. 다음 예는 sed가 intro로부터 텍스트의 첫 번 두 라인을 지운 것을 보여 준다.

 $ sed  '1,2d'  intro                     Delete lines 1 and 2
 in the late 1960s. One of the primary goals in
 the design of the Unix system was to create an
 environment that promoted efficient program
 development.
 $

 sed는 디폴트에 의해서 표준 출력을 통해서 입력 받은 모든 라인들 - 즉 세 번째 라인에서 마지막까지 - 은 표준출력으로 단순히 나타내진다.
 텍스트의 문자열에 d명령을 선행시킴으로써 텍스트에 포함된 모든 라인들을 삭제하기 위해 sed를 사용할 수 있다. 다음 예에서 sed가 UNIX란 단어를 포함하는 텍스트 안의 모든 라인들이 삭제하는 것을 보여 준다.

 $ sed  '/UNIX/d'  intro                   Delete all lines containing UNIX
 Thompson and Dennis Ritchie at Bell Laboratories
 in the late 1960s. One of the primary goals in
 environment that promoted efficient program
 development.
 $
 sed 의 힘과 유연성은 여기서 살펴본 것 이상으로 여겨진다. sed는 사용자로 하여금 loop할 수 있고 버퍼에 텍스트를 만들고, 한 개의 편집 문자 안에 많은 명령을 결합할 수 있게 해주는 편리함을 준다. 표 3-2는 sed명령의 몇몇 예를 보여 준다.

sed 명령
내      용
sed  '5d'
라인 5를 삭제
sed  '/[Tt]est/d'
Test 또는 test를 포함하는 모든 라인들을 삭제
sed  -n  '20,25p'  text
text로부터 20에서 25까지의 라인들만 프린트
sed  '1,10s/unix/UNIX/g'  intro
intro의 처음 10개의 라인들의 unix를 UNIX로 변경
sed  '/jan/s/-1/-5'
jan을 포함하는 모든 라인들 위의 첫 번째 -1을 -5로 변경
sed  's/...//'  data
각 data라인으로부터 처음 세 개의 문자들을 삭제
sed  's/...$//'  data
각 데이터 라인으로부터 마지막 3문자들을 삭제
sed  -n  '1'  text
비 프린트 문자들을 \nn으로 (여기서 nn은 그 문자의 8진수 값임), 그리고 탭 문자들을 > 로 나타내는 각 텍스트로부터의 모든 라인들을 프린트

 

 

 


awk 명령어
1. Pattern scanning and Processing Utility
 awk command는 비교수행, 산술조작 또는 c-programming feature와 같은 것을 이용하여 주어진 pattern을 text file내에 있는 각 line들의 fields를 scanning하는 command이다.

 SYNTAX
       awk  /pattern/{action} filename(s)
* pattern       character string 또는 match 될 관계 표현식
* action        pattern을 포함하는 각 line의 field를 가지고 수행할 processing을 말한다.
* Filename(s)   awk command로 search할 file(s)

2. Awk pattern
 awk pattern은 정규 표현식, 산술 관계 표현식, 정규와 산술 표현식의 조합을 말한다.

Regular Expression!s (정규 표현식)
 가 장 간단한 정규 표현식은 salsh로 닫혀져 있는 character string을 가르키는데 예를 들어   / george /  georgetown과 같이 george를 포함하고 있는 어떤 line과도 match가 되고 / the /는 the의 앞뒤로 space가 있는 것과 match가 된다. Awk command는 grep command에서 사용되는 많은 regular expression!s를 포함한다.

 regular expression!s는 다음의 것들로 이루어 진다.
    ( )     grouping을 할 때
    [ ]     범위를 지정할 때
    |      or로 사용된다.(pattern field내에서)

&&, || 비교할 때 and 와 or 로 사용된다. ( pattern field내에서)
    +     하나 또는 그 이상
    ?     ZERO 또는 그 이상
    ^     line의 시작
    $     line의 끝
    !     부정
    \     meta-character의 뜻을 인용하여 사용한다.
비교는 주어진 pattern과 field를 비교하는데 $1 - / [Ss]am /은 첫 번째 field가 Sam, sam과 match되는 line을 의미한다.

* Relational Expression!s ( 관계 표현식 )
 관 계 표현식의 set은 두 개의 정규 표현식 ( regular expression!s ) 사이의 관계를 비교 선택 할 때 사용되는데 관계 표현식의 character에는 >,  <,  ==,  <=,  >=,  != 이 있다.

   * Example *
 $1  >=  $2       $3  ==  "s"     $4  !=  2
 $1  ==  "t"  &&  $2  <=  100

* Record와 Field의 지정
 awk command에서 사용되어지는 input은 record와 field로 나누어 지는데 record는 default로 line이고, record의 terminator는 ENTER키이다.
 각 record는 field로 나누어 지며 field의 delimiter는 space 또는 다른 character가 될 수도 있고 각 record는 dollar sign ($)을 이용하여 access가 가능하며 field 1번은 $1, field 2번은 $2,... 로 표현이 가능하다.  Number of record의 variable name은 NR, record variable은 RS, field delimiter는 FS로 표현한다. 아래의 예제는 text file의 내용이 field로 어떻게 나누어 지는지 보여준다.

Field           $1            $2           $3           $4
               ITEM         QUANTITY   PRICE       PARTNO
               x             30            21.40        1234
               y             45            30.00        8888
               z             100           .78          2225

3. Awk action
awk action은 new line 혹은 semicolon (;) 으로 끝나는 statement의 sequence를 말한다. 모든 awk actions은 반드시 brace (  {}  )로 닫혀져야 한다.
{ print  $1,  $2 }
field variables는 비교, change가 가능하다.
{ $1  -  $2  +  $3 ; print $3 }
{ if  ( $3  >  250  ; print $3 )

 

 


   *  Example  *
1. 아래의 예제는 while1이라는 file내의 모든 line을 print한다.
% awk  ' { print }'  while1
2. 아래의 예제는 while1이라는 file내에 "echo"를 포함하는 모든 line을 print한다.
% awk  ' / echo / '  while1
3. 아래의 예제는 /etc/rc* 라는 file내에서 각 line의 첫번째 두번째 field내에 있는 "if"를 포함하는 모든 line을 print한다.
% awk  ' / if /  { print  $1, $2 } '  /etc/rc*
4. 아래의 예제는 /etc/rc* 라는 file내에서 "if"를 포함하는 각 line을 "else if "로 change하여 print한다.
% awk  ' / if /  { $1 = "else if " ;  print } '  /etc/rc*
5. 아래의 예제는 /etc/passwd 라는 file내에서 user-id가 50인 login-name을 print한다.
% awk  -F : ' / 50 /  { if  ( $3 == 50 )  print $1 }'  /etc/passwd
6. line printer daemon에 관련된 PID와 command name을 print한다.
% ps  -ef  | awk  ' / \ / usr \ / lib \ / lpd /  { print $1, $5 } '
7. 아래의 예제는 다섯번째 field가 /usr/lib/lpd가 아니고, record가 awk command를 포함하고 있지 않을 때 line printer daemon에 관련된 PID와 command name을 print한다.
% ps  -ef  | awk  ' / \ / usr \ / lib \ / lpd /  { if  ( $5 != "/usr/lib/lpd " && $0 != "awk " )  print $1, $5 } '

4. Introduction to the Desktop Calculator
 Desktop Calculator ( dc) 는 precidion arithmetic package이고 보통 decimal integer로 operate한다. 그러나 inputbase, outputbase, 소수 부분 등은 따로 지정할 수 있고 dc의 대략적인 structure는 stacking ( reverse Polish ) calculator이다. 만일 argument가 주어진다면 dc package가 끝날 때 까지 주어진 file로부터 input을 가지고 그렇지 않으면 standard input으로부터 input을 가진다.

* Number
stack에 push할 numeric value를 말하며 0에서 9사이의 숫자로 이루어진 string을 말한다. Negative number는 underscore (_)로 구분한다.

* +,  -- ,  / ,  * ,  % ,  ^
stack 상의 두개의 value를 add( + ), subtracted ( -- ) , multiplied ( * ), divided ( / ), reminder ( % ), exponentiated ( ^ )를 할 수 있고 pop 된 두개의 entries는 stack에서 사라지고 계산결과만 stack상에 남는다. exponent의 소수 부분(fractional part)는 무시된다.


* s%
%라는 이름의 register에 어떤 값을 store시키거나 pop할 수 있다. %는 어떤 character라도 가능하며 s가 대문자로 사용되어지면 %는 stack과 같이 다루어지며 어떤 값을 push할 수 있다.

* l%
stack 상에 push된 register 값 %를 가르키며 register %는 고칠 수 없다. 모든 register는 zero value로 시작하고 만일 l이 대문자로 사용되어지면 register %는 stack과 같이 다루어지고 그것의 top value는 main stack상에서 pop되어진다.

* d
stack의 top value가 중복됨을 뜻한다.

* p
stack의 top value를 print한다. 대문자 P는 stack의 top value를 ASCII string처럼 번역하여 print 하고 remove시킨다.

* f
stack의 모든 value와 register를 print한다.

* q
program에서 exit한다.
<!-- sqlca.sqlcode : 0 -->
반응형

'OS > Shell Script' 카테고리의 다른 글

쉘 반복 스크립트  (0) 2010.04.28
IO 리다이렉션 csh VS sh  (0) 2007.03.28
Posted by [PineTree]
OS2009. 3. 13. 14:59
반응형

Tuning TCP/IP TIME_WAIT For Systems With High Connection Rates
Applies To: VDE / DFE / DSE (all versions, all operating systems)

Description: When using the "netstat" command to look at open TCP/IP connections, a large number of connections in the TIME_WAIT state are observed. The system exhibits poor throughput possibly coupled with high CPU use on the VDE/DFE/DSE server.

TCP uses a special handshake to close completed sessions. The TIME_WAIT state is used to handle possible problems that may occur in the network relating to unreliable or delayed packet delivery. Accordingly, TCP holds connections for a temporary waiting period (TIME_WAIT) to ensure that any delayed packets are caught and not treated as new connection requests. The size of TIME_WAIT is supposed to be twice the maximum segment lifetime or twice the time a packet can remain alive on a particular IP network. For some operating systems, this can be as high as 4 minutes!

On busy systems, this can lead to a depleation of TCP port resources. Low throughput may occur due to many connections sitting in TIME_WAIT state.

Explanation/Workaround: OctetString recommends reducing the operating system setting for TIME_WAIT substantially. If VDE / DFE / DSE is the only server product on the system, this can be reduced to the operating system minimum of 15 or 30 seconds (depending on OS).

For Windows:
Use regedit and create a REG_DWORD named TcpTimedWaitDelay under

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TcpIp\Parameters

Set it to a decimal value of 30 which is for 30 seconds - the minimum.

For AIX:
To see the current TCP_TIMEWAIT value, run the following command:
/usr/sbin/no 뻕 | grep tcp_timewait

To set the TCP_TIMEWAIT values to 15 seconds, run the following command:
/usr/sbin/no 뻩 tcp_timewait =1

The tcp_timewait option is used to configure how long connections are kept in the timewait state. It is given in 15-second intervals, and the default is 1.

For Linux:
Set the timeout_timewait paramater using the following command:
/sbin/sysctl -w net.ipv4.vs.timeout_timewait=30

This will set TME_WAIT for 30 seconds.

For Solaris:
Set the tcp_time_wait_interval to 30000 milliseconds as follows:
/usr/sbin/ndd -set /dev/tcp tcp_time_wait_interval 30000


=================================================================================================

WebSphere Commerce Payments -고성능 환경의 조정
각 비즈니스 모델은 고유한 요구사항을 가지므로 WebSphere Commerce Payments 기능을 다소 다르게 이용합니다. 종종 주어진 비즈니스 환경에 대해 성능과 기능성을 극대화하기 위해 WebSphere Commerce Payments를 조정할 수 있습니다.

TCP/IP 소켓에 대한 대기 시간
WebSphere Commerce Payments에 대한 각 요청 시에 TCP 소켓이 TIME_WAIT 상태가 되고 몇 분 동안 해당 상태에 머물게 됩니다. 다량의 요청을 서비스하는 시스템의 경우, 다수의 소켓이 TIME_WAIT 또는 TIME_CLOSED 상태에 있으므로 요청이 거부됩니다(예: Cannot connect to WebSphere Commerce Payments 리턴 코드). 이 행위는 모든 TCP를 연결하는 데 예상된 것으로 반드시 필요합니다.

TCP 소켓은 소켓에서의 모든 차후 통신이 새로 바운드되는 소켓에 대한 새 통신으로 오해되지 않도록 보장하기 위해 일정한 시간 동안 TIME_WAIT 상태로 이동합니다. 이 시간은 이론적으로 2MSL(최대 세그먼트 수명의 두 배)입니다. 실제로는 TIME_WAIT 기본값이 Windows 운영체제 및 Solaris에서는 4분이고 AIX에서는 2분입니다. iSeries 시스템에서 기본값은 약 2분입니다. 사용자 운영체제에서 TIME_WAIT 값을 변경하면 대용량 사용자가 이러한 문제점을 줄일 수 있습니다. 다음은 Windows, AIX 및 Solaris 운영체제에서 간격을 재구성하는 방법의 예입니다.

예외:

대체 스택이 사용 중일 경우, 다른 방법이 필요할 수 있습니다.


레지스트리에서 다음을 찾으십시오.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\tcpip\Parameters
\TcpTimeWaitDelay
이 항목이 Windows 레지스트리에 없는 경우, 아래 2단계에 따라서 항목을 작성해야 합니다.

이 항목을 새 DWORD 항목으로 편집하십시오
항목을 30 - 300(값은 초 수를 표시함) 범위의 임의의 값을 설정하십시오. 이 값을 30으로 설정할 것을 권장합니다.

no -o tcp_timewait=1
값(1)의 증가 단위는 15초입니다. 예를 들어, 1은 15초이고 2는 30초에 해당합니다. 값을 1 또는 2로 설정하는 것이 바람직합니다.


ndd -set /dev/tcp tcp_close_wait_interval 30000
값(30000)의 단위는 밀리초입니다.

관련 태스크

WebSphere Commerce Payments 성능 조정 매개변수
피드백

(C) Co/pyright IBM Corporation 1996, 2004.

=======================================================================

Windows 2000 server에서 가능합니다.

물론, 다른 버젼에서도 가능하겠지만, 제가 확인해본 곳이 W2K Server입니다.

System Registry중 TcpIp 옵션 설정에 SynAttackProtect항목을 추가할 수 있습니다.


-------------------------------- Registry File --------------------------------

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters]
"SynAttackProtect"=dword:1
"KeepAliveInterval"=dword:3e8
"KeepAliveTime"=dword:493e0

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

여기에서 첫 번째 SynAttack Protect가 바로 Syn Flood Attack 방지 옵션을 활설화할 것인지를

결정짓는 것입니다.

다음으로 KeepAliveInterval값은, Tcp에서 Keep Alive 옵션을 사용할 경우 Keep alive packet을

전송하는 시간 간격을 의미합니다.

마지막 KeepAliveTime은 Keep alive packet이 수신되어야 하는 시간의 최대 값을 의미합니다.

결국 KeepAliveInterval값보다는 큰 값으로 설정해야겠죠.

출처 : http://ariswear.com/new_blog/entry/Socket-TIMEWAIT-%EB%8C%80%EA%B8%B0%EC%8B%9C%EA%B0%84-%EC%84%A4%EC%A0%95-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0?category=10&TSSESSIONariswearcomnewblog=78e085655f2789d73cdf9d485de8552f
반응형

'OS' 카테고리의 다른 글

OS별 NTP 설정  (0) 2010.01.07
find, grep을 조합한 검색  (0) 2009.01.07
Posted by [PineTree]
OS/LINUX2009. 3. 13. 14:49
반응형

Linux 성능 조정

서버의 성능을 향상시키기 위해 Linux 시스템을 사용자 정의해야 할 수 있습니다. 구성을 조정하는 데 필요한 팁이 아래에 나와 있습니다. 이러한 시스템이 변경되어 다음 제안을 사용하지 못하게 될 수 있으며 결과가 다를 수 있습니다.

성능 향상을 위해 변경사항을 작성하기 전에 현재 성능을 측정했는지 확인하십시오. 트랜잭션 비율, 응답 시간, 최대 동시 사용자 수 또는 몇몇 기타 성능 기준에 관심이 있는지 여부에 관계없이 변경사항 작성 전후에 성능 조정 매개변수 변경으로 인해 차이가 발생했는지 여부를 알 수 있을 정도로 정확하게 측정해야 합니다.

timeout_timewait 매개변수

timeout_timewait 값은 TCP/IP가 닫힌 연결을 해제하여 자원을 다시 사용하기 전에 경과되어야 하는 시간을 결정합니다. 닫기와 해제 사이의 이 간격은 TIME_WAIT 상태 또는 최대 세그먼트 지속 시간의 두배(2MSL) 상태로 알려져 있습니다. 이 시간 동안 클라이언트 및 서버로의 연결을 다시 여는 것이 새 연결을 설정하는 것보다 비용이 적게 듭니다. 이 항목의 값을 줄이면 TCP/IP는 닫힌 연결을 더욱 빨리 해제할 수 있으며 새 연결에 더 많은 자원을 제공합니다. TIME_WAIT 상태에 있는 여러 연결로 인해 발생한 낮은 처리량 때문에 실행 중인 응용프로그램에 빠른 해제, 새 연결 작성 또는 조정이 필요할 경우 이 매개변수를 조정하십시오.

기본값은 240초(4분)입니다.

최소 권장 값은 30초입니다. 다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/ipv4/tcp_fin_timeout

여기서 X는 필요한 시간(초)으로 바뀝니다.

연결 백로그

수신 연결 요청의 버스트를 승인하기 위해 연결 백로그 값을 늘려야 할 수 있습니다. 동시에 많은 연결 요청이 수신될 경우 더 큰 값을 사용하면 지원될 수 있는 보류 연결 수가 증가되어 연결 장애를 줄일 수 있습니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/core/netdev_max_backlog
echo X > /proc/sys/net/core/somaxconn

여기서 X는 버스트에서 예상되는 연결 요청 수보다 큽니다.

tcp_keepalive_time

tcp_keepalive_time 값은 TCP/IP가 대기 연결이 계속 원래 상태를 유지하는지 확인을 시도하는 빈도를 제어합니다. 이 시간 동안 활동이 없었을 경우 활성화 상태 지속 전송이 제출됩니다. 네트워크가 원래 상태를 유지하며 상대가 활성 상태일 경우 상대가 응답합니다. 손실된 상대에 대해 민감하게 되려는 경우(즉, 상대가 손실되었음을 더 빨리 인식해야할 경우) 이 값을 줄여 보십시오. 오랜 기간 동안 비활성 상태를 유지하는 연결은 공통이고 손실된 상대는 공통이 아닐 경우 이 값을 늘려 오버헤드를 줄여도 됩니다.

7,200초(2시간) 동안 대기 연결이 비활성 상태일 경우 Linux에서는 활성화 상태 지속 메시지를 전송하는 것이 기본값입니다. 종종 값에 1,800초를 선택하여 반쯤 닫힌 연결을 30분마다 감지합니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/ipv4/tcp_keepalive_time

여기서 X는 필요한 시간(초)으로 바뀝니다.

tcp_keepalive_intvl 값

tcp_keepalive_intvl 값은 상대로부터 활성화 상태 지속 응답이 수신되지 않을 경우 TCP/IP에서 활성화 상태 지속 전송을 반복하는 빈도를 결정합니다. 응답이 없는 연속적인 활성화 상태 지속 전송 수가 tcp_keepalive_probes의 값을 초과할 경우 연결이 중단됩니다. 응답 시간이 길 것으로 예상될 경우 이 값을 늘려 오버헤드를 줄여야 할 수 있습니다. 상대가 손실되었는지 확인하는 데 소비되는 시간을 줄여야 할 경우 이 값 또는 tcp_keepalive_probes 값을 줄여 보십시오.

Linux에서는 활성화 상태 지속 메시지를 재전송하기 전에 75초 동안 활성화 상태 지속 응답을 대기하는 것이 기본값입니다. 종종 값에 15초를 선택하여 손실된 상대를 더 빨리 감지합니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/ipv4/tcp_keepalive_intvl

여기서 X는 필요한 시간(초)으로 바뀝니다.

tcp_keepalive_probes 값

tcp_keepalive_probes 값은 TCP/IP가 기존 연결에 대한 수신확인되지 않은 활성화 상태 지속 메시지를 재전송하는 횟수를 결정합니다. 네트워크 품질이 낮을 경우 이 값을 늘려 효과적인 통신을 유지해야 할 수 있습니다. 네트워크 품질이 높을 경우 이 값을 줄여 상대가 손실되었는지 확인하는 데 걸리는 시간을 줄여도 됩니다.

Linux에서는 연결 중단을 결정하기 전에 9개의 수신확인되지 않은 활성화 상태 지속 메시지를 전송하는 것이 기본값입니다. 종종 값에 5를 선택하여 손실된 상대를 더 빨리 감지합니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/ipv4/tcp_keepalive_probes

여기서 X는 필요한 수신확인되지 않은 활성화 상태 지속 재전송 수로 바뀝니다.

대용량 페이지 지원

가 상 기억장치를 관리하기 위해 대용량 페이지 지원을 사용하면 JVM(Java Virtual Machine)에서 대용량 힙을 관리하는 CPU 오버헤드를 줄일 수 있습니다. 이 지원을 사용하려면 대용량 페이지를 사용 가능하도록 시스템을 구성하고 가상 시스템을 시작할 때 -Xlp JVM 옵션을 지정해야 합니다.

대용량 페이지 지원을 사용 가능하게 하는 단계는 사용하는 Linux 분배에 따라 다릅니다. 일반적으로 sysctl.conf 파일을 편집하여 다음을 수행합니다.

  • 최대 Java 힙을 보유하는 데 필요한 대용량 페이지의 수 설정
  • 최대 Java 힙을 보유하도록 최대 공유 세그먼트 설정
  • 최대 Java 힙을 보유하도록 공유 메모리 총량 설정

그런 다음 프로그램을 낮은 가상 메모리 주소로 재배치하여 더 큰 힙에 더 많은 주소 공간을 제공하십시오.

대용량 페이지에 대한 지원 구성에 대한 자세한 정보는 Linux 문서를 참조하십시오.

반응형

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

RedHat Linux Network 설정하기  (0) 2009.10.29
LINUX SWAP파일 추가하기  (0) 2009.09.07
RHEL 4 에 YUM 설치  (0) 2009.02.10
LINUX 해킹당했을 때 대처요령  (0) 2008.11.17
RPM src install  (0) 2008.06.24
Posted by [PineTree]
OS/WINDOWS2009. 3. 13. 14:45
반응형

Configuring Windows for high network connection rates

When a TCP/IP socket is closed, it goes into TIME_WAIT state before closing, for a period of time determined by the operating system. A socket in TIME_WAIT state cannot be reused; this can limit the maximum rate at which network connections can be created and disconnected.

The Java Client application normally closes the socket; if the application is on a different machine from the CICS Transaction Gateway, the limitation usually applies to the machine running the application. The symptoms of a machine that is reaching these limits include:

  • All of the TCP/IP resources of the operating system are in use, and requests for new connections fail. This causes JavaGateway open requests to fail intermittently, and throw a java.net.BindException.
  • Running the netstat -a command on the application machine shows a large number of sockets in TIME_WAIT state.
  • Performance deteriorates.

To improve the ability of the Windows operating system to deal with a high rate of network connections, add the following registry entries in

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
TcpTimedWaitDelay
A DWORD value, in the range 30-300, that determines the time in seconds that elapses before TCP can release a closed connection and reuse its resources. Set this to a low value to reduce the amount of time that sockets stay in TIME_WAIT.
MaxUserPort
A DWORD value that determines the highest port number that TCP can assign when an application requests an available user port. Set this to a high value to increase the total number of sockets that can be connected to the port.

For example, a system making a large number of connection requests might perform better if TcpTimedWaitDelay is set to 30 seconds, and MaxUserPort is set to 32678. See the operating system documentation for more details.

반응형
Posted by [PineTree]