RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'분류 전체보기'에 해당되는 글 379
출처 블로그 > 브라이언 블로그
원본 http://blog.naver.com/jk997600/110005991932
* 리눅스에서 파일 검색
- Tips/Linux | 2006/06/10 10:17
문자열찾기 방법 1 - 영어만 주로 가능
grep -rw "찾는문자열" ./

문자열찾기 방법 2 - 대/소문자 구분 안하고 검색
grep -i -l "찾는문자열" * -r 2> /dev/null

문자열찾기 방법 3 - 한글, 영어 모두 가능
find . -exec grep -l "찾는문자열" {} \; 2>/dev/null

문자열찾기 방법 4 - 한글,영어, 대소문자 안가리고 검색
find . -exec grep -i -l "찾을문자열" {} \; 2>/dev/null

문자열찾은 후 치환
find . -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \; 2>/dev/null

파일명 찾기
find / -name 파일명 -type f

파일명 찾기(대소문자 구별없음)
find / -iname 파일명 -type f

디렉토리 찾기
find / -name 파일명 -type d

디렉토리 찾기(대소문자 구별없음)
find / -iname 파일명 -type d
2006/09/08 15:52 2006/09/08 15:52
이 글에는 트랙백을 보낼 수 없습니다
Linux/FTP  2006/09/08 14:43
### ftp 명령어 모음 ###

ascii : 전송모드를 ASCII모드로 설정한다.(ascii또는 as)

binary : 전송모드를 BINARY모드로 설정한다.( binary또는 bi)

bell : 명령어 완료시에 벨소리를 나게한다.(bell)

bye : ftp접속을 종료하고 빠져나간다.(bye)

cd : remote시스템의 디렉토리를 변경한다.(cd 디렉토리명)

cdup : remote시스템에서 한단계 상위디렉토리로 이동한다.(cdup)

chmod : remote시스템의 파일퍼미션을 변경한다.(chmod 755 index.html)

close : ftp접속을 종료한다. (close)

delete : remote시스템의 파일을 삭제한다.(delete index.old)

dir : remote시스템의 디렉토리 내용을 디스플레이한다.(dir)

disconnect : ftp접속을 종료한다.(disconnect)

exit : ftp접속을 종료하고 빠져나간다.(exit)

get : 지정된 파일하나를 가져온다.(get index.html)

hash : 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.(hash)

help : ftp명령어 도움말을 볼 수 있다.(help또는 help 명령어)

lcd : local시스템의 디렉토리를 변경한다.(lcd 디렉토리명)

ls : remote시스템의 디렉토리 내용을 디스플레이한다. (ls 또는 ls -l)

mdelete : 여러개의 파일을 한꺼번에 지울 때 사용한다.( mdelete *.old)

mget : 여러개의 파일을 한꺼번에 가져오려할 때 사용한다. ( mget *.gz)

mput : 한꺼번에 여러개의 파일을 remote시스템에 올린다.(mput *.html)

open : ftp접속을 시도한다.(open 168.126.72.51또는 open ftp.kornet.net)

prompt : 파일전송시에 확인과정을 거친다. on/off 토글 (prompt)

put : 하나의 파일을 remote시스템에 올린다.(put index.html)

pwd : remote시스템의 현재 작업디렉토리를 표시한다.(pwd)

quit : ftp접속을 종료하고 빠져나간다.(quit)

rstatus : remote시스템의 상황(version, 어디서, 접속ID등)을 표시한다.(rstatus)

rename : remote시스템의 파일명을 바꾼다.(remote 현재파일명 바꿀파일명)

rmdir : remote시스템의 디렉토리을 삭제한다.(rmdir 디렉토리명)

size :remote시스템에 있는 파일의 크기를 byte단위로 표시한다.(size index.html)

status : 현재 연결된 ftp세션모드에 대한 설정을 보여준다.(status)

type : 전송모드를 설정한다.(type 또는 type ascii 또는 type binary)
2006/09/08 14:43 2006/09/08 14:43
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > What you see is what you get
원본 http://blog.naver.com/etwas0227/60014878338

공부하기


  1. 시스템을 항상 PPP로 접속시켜두자.(1998/07/31)
  2. SGML 문서 작성법 (1998/09/04)
  3. SGML에 관한 개론 (1999/01/17)
  4. PROC mail 이용하기 I (영문) (1998/10/30)
  5. Linux in Hospitals (영문) (1998/10/30)
  6. 리눅스 설치하기 (1998/12/26)
  7. PHP에서 아파치 기본 인증 이용하기 (1999/1/2)
  8. 이운억님이 작성한 SSH2 시작하기 (1999/01/06)
  9. 조희진님이 작성한 BitchX 사용하기 (1999/01/07)
  10. 한글 도메인 시스템 구축 및 운영 (1999/01/12)
  11. 이운억님이 작성한 RCS mini-HOWTO (1999/01/17)
  12. CGI/ver 1.1의 변수들 (1999/01/19)
  13. PHPLib 설명서 (1999/01/22)
  14. 아파치에서 mod_auth_pgsql 모듈 사용하기 (1999/02/09)
  15. Cocoja님께서 작성한 CVS 한글 가이드 (1999/03/10)
  16. 이운억님이 작성한 Apache에서 suexec의 활용 (1999/06/18)
  17. 차세대 IP표준인 IP v6에 관한 글 (1999/08/31)
  18. LDAP directory service에 관한 글 I - 한글 (1999/08/31)
  19. LDAP directory service에 관한 글 II - PRESENTATION (2000/03/07)
  20. Introduction to LDAP (2000/03/07)
  21. X.500 directory service에 관한 글 (1999/08/31)
  22. Linux Device Driver(1999/09/19)
  23. Porting Applications to Linux(1999/09/19)
  24. PROC mail 이용하기 II (영문) (1999/09/20)
  25. GPS에 관하여 (1999/09/25)
  26. GNU Plot 이용하기 (1999/11/15)
  27. GNU EMACS 메뉴얼 (2001/03/18)
  28. GNU EMACS EMACS Lisp 메뉴얼 (2001/03/20)
  29. Emacs 사용법 강좌 (1999/11/15)
  30. Emacs Reference (1999/11/15)
  31. Hanemacs 에디터 강좌 (1999/11/15)
  32. Apache PostgreSQL 인증모듈 (1999/11/30)
  33. GDB 사용법 (미지 참조) (1999/12/01)
  34. Accelerated GLX FAQ (1999/12/16)
  35. C study 클럽 (1999/12/27)
  36. Unix 기초 (I) (1999/12/27)
  37. Unix 기초 (II) (1999/12/27)
  38. Unix 기초 (PDF, PS)(2000/07/03)
  39. UNIX shell 기초 (2001/07/24)
  40. UNIX shell Programming (2001/07/24)
  41. X Window 기초 (2001/07/24)
  42. SGML Guide KLDP 문서 (1999/12/29)
  43. 한글 TeX 설치 Guide KLDP 문서 (1999/12/29)
  44. TeTeX HOWTO 한글문서 (1999/12/29)
  45. vim tip을 모아 놓은 글 (1999/12/31)
  46. vim tip을 모아 놓은 글 (1999/12/31)
  47. vim Manual (v5.6) (Booklet, PDF) (2001/07/30)
  48. vim Manual (v5.6) (Plain, PDF) (2001/07/30)
  49. vim HOWTO (영문) (1999/12/31)
  50. JARGON 한글 번역 (1999/12/31)
  51. BASH Reference (영문,317KB) (2000/03/13)
  52. BASH Reference card (영문,pdf 파일) (2000/03/13)
  53. GCC Reference (영문) (2000/03/13)
  54. readline library Reference card (영문,pdf 파일) (2000/03/13)
  55. make 강좌 (2000/03/20)
  56. WEB Server의 최적화 (2000/03/28)
  57. TCP/IP 에 관한 설명 (2000/03/29)
  58. Virtual Hosting (2000/03/28)
  59. Cookie 사용법 (2000/03/28)
  60. JAVA 1.1로 옮겨가기 (I) (2000/03/28)
  61. JAVA 1.1로 옮겨가기 (II) (2000/03/28)
  62. JAVA 1.1로 옮겨가기 (III) (2000/03/28)
  63. Unix 에 대해서 (2000/03/29)
  64. Perl! 초보자를 위한 안내서 (2000/03/29)
  65. Perl 5 Reference Guide (2000/06/19)
  66. Apache에서 Tomcat 설치하기 (2000/03/29)
  67. Apache에서 Serverlet 이용하기 (2000/03/29)
  68. Apache에서 GNUJSP 설치하기 (2000/03/29)
  69. SQL Gateway for JAVA (Servlet용 Class) (2001/07/30)
  70. Apache에서 JServ 설치하기 (2000/03/29)
  71. Servlet 에 관해서 (2001/05/05)
  72. AWK 사용법 (2000/03/30)
  73. Intranet 을 위한 요소 기술 (2000/03/30)
  74. 인터넷 방송국 운영하기 (2000/04/10)
  75. Icecase, Shsout, Icelive 설정 및 사용법 (2000/05/29)
  76. Unix Kernel 완전분석으로 가는길 (HWP 파일) (2000/04/17)
  77. Unix C 기초 (2000/04/17)
  78. Win32 환경에서의 PHP3의 설치 (2000/05/17)
  79. Unix System Administeration (2000/07/03)
  80. X Window 기초 (2000/07/03)
  81. Unix Help v1.3 (2000/08/22)
  82. HTML tag Reference (from Netscape) (2000/09/04)
  83. Readline Library Reference (2000/09/14)
  84. SGML docbook DTD 이용법 (2000/09/14)
  85. AWK 메뉴얼 (2000/10/06)
  86. SED 메뉴얼 (2000/10/06)
  87. Creating your own OS (2000/10/13)
  88. Unix C & C++ 메뉴얼 (2000/10/18)
  89. HLaTeX 가이드 (2000/10/18)
  90. Python 2.0 Document (2000/10/26)
  91. Linux Programming Guide 한글 번역 (2000/11/02)
  92. GNU Make 사용하기 (2000/11/02)
  93. GNU GNU C Library 한글 메뉴얼 (2000/11/02)
  94. ADSL 에서 리눅스 이용하기 (2000/11/04)
  95. ANSI C Reference(ZIP 포맷) (2000/04/17)
  96. Gtk 한글 Tutorial (ZIP파일,PS파일) (2000/11/07)
  97. Introduction to Object Oriented Programming Using C++ (2000/11/07)
  98. Unix Command Summary (2000/11/07)
  99. Servlet Tutorial (2000/11/23)
  100. Servlet API Document (2000/11/23)
  101. JAVA Document (2000/11/23)
  102. 내가 필요한 RFC 문서들(2000/12/11)
  103. IP masquerading 에 관한 글?2000/12/31)
  104. GNU C 한글 메뉴얼 (2001/01/13)
  105. Exploring /proc/net (2001/01/14)
  106. 손쉬운 리눅스 관리 (2001/01/28)
  107. DocBook 사용하기 (2001/01/28)
  108. SED FAQ (2001/02/04)
  109. Glibc (HWP 문서) (2001/02/06)
  110. Glibc 문서(HTML,한글) (zip파일) (2001/02/16)
  111. GNU Make (HTML,한글) (zip파일) (2001/02/16)
  112. Handheld Device Markup Language (HTML,한글) (zip파일) (2001/02/16)
  113. JSDK 및 JServ 의 설치 및 환경 설정 (한글) (2001/02/16)
  114. Kornet ADSL 의 사용법 (2001/02/16)
  115. HylaFax 로 FAX server 만들기 (ZIP 파일) (2001/02/18)
  116. Problem Solving using c++ (C++ 가이드 한글) (2001/02/18)
  117. GCC lecture (2001/02/18)
  118. C++ Guide (2001/02/18)
  119. 표준 C 강좌 (2001/02/18)
  120. 유닉스에서의 C 프로그래밍 (2001/02/18)
  121. Unix 에서 C 를 이용한 프로젝트 (2001/02/18)
  122. Mutt 메뉴얼 (2001/02/26)
  123. Mutt 사용자 가이드 (2002/10/14)
  124. Unix Introduction by Rob Func, OSU (2001/03/16)
  125. Unix Introduction by TUS, OSU (2001/03/16)
  126. 관리자가 기본적으로 봐야할 4가지 문서 (보안관련, HTML문서, ZIP파일임) (2001/03/16)
  127. HTML 4.0 Reference - Windows 95/98/NT4 Help (222 kB) (2001/04/14)
  128. HTML 4.0 Reference - Zipped HTML (292 kB) (2001/04/14)
  129. CSS Guide - Windows 95/98/NT4 Help (119 kB) (2001/04/14)
  130. CSS Guide - Zipped HTML (221 kB) (2001/04/14)
  131. Network 용어 (기초) (2001/04/25)
  132. Linux Assembly tutorial (2001/04/25)
  133. Windows 2000에서 IIS+PHP+MySQL 설정법 (2001/04/28)
  134. Javascript Tutorial (1) (2001/05/01)
  135. Javascript Tutorial (2) (2001/05/14)
  136. Dynamic Web 기반 마련하기 (프세 2001/4월호 기사) (2001/05/01)
  137. KDE 와 GNOME 개발환경 (2001/05/01)
  138. Port Forwarding (2001/05/01)
  139. Windows & Linux Multi-booting (2001/05/05)
  140. JAVA2 설치및 환경 설정 (2001/05/05)
  141. JSDK 및 JSERVE 의 설치 및 환경 설정 (2001/05/05)
  142. Apache + JSERVE + SSL 의 설치(2001/05/05)
  143. JAVA 2 v1.3 Standard Ed API (2001/05/11)
  144. Unix 개론 (2001/05/18)
  145. Linux에서 DHCP 이용하기 (2001/05/27)
  146. JSP FAQ & JSPBOOK site (2001/05/29)
  147. Design and Implement Servlets/JSPs/EJBs for IBM WebSphere (2001/07/28)
  148. 대용량 스토리지에 관한 이야기 (프로그램세계 기사) (2001/07/28)
  149. Real-Time JAVA Specification (PDF) (2001/07/30)
  150. JADE TeX Installation 문서 (PDF) (2001/07/31)
  151. DocBook Installation 문서 (PDF) (2001/07/31)
  152. Servlet API (2001/07/31)
  153. Java 2 Platform Enterprise Edition Specification, v1.3 (Final Draft, Feb 2001) (2001/07/31)
  154. Java Message Service (2001/07/31)
  155. CVS Tutorial (2001/09/01)
  156. tomcat on Linux (2001/09/29)
  157. GLIBC 한글 메뉴얼 (2001/12/25)
  158. IRC 프로토콜 (RFC 1459) 한글문서 (2002/07/09)
  159. mutt HOWTO (2002/07/26)




출처: http://database.sarang.net/study/study.phtml

database.sarang.net

2006/09/08 14:37 2006/09/08 14:37
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:36
출처 블로그 > hyperlancer님의 블로그
원본 http://blog.naver.com/hyperlancer/120014817994
1. 약간의 이론

1.1 소개

LinuxThreads는 다중 쓰레드 프로그래밍을 위한 리눅스 라이브러리이다. LinuxThreads는 커널 수준의 쓰레드를 제공한다; 쓰레드들은 clone() 시스템콜에 의해 만들어지고 모든 스케줄링은 커널에서 이루어진다. Posix 1003.1c API를 구현하였고 커널 2.0.0이상의 커널과 적절한 C 라이브러리를 가지고 있는 어떠한 리눅스 시스템에 동작한다.

1.2 쓰레드란 무엇인가?
쓰레드는 프로그램을 통한 제어의 순차적인 흐름이다. 그래서 다중 쓰레드 프로그래밍은 여러 제어 쓰레드가 한 프로그램에서 동시에 수행하는 병렬 프로그래밍의 한 형태이다.
다중 쓰레드 프로그래밍은 모든 쓰레드가 같은 메모리 공간을 (그리고 파일 디스크립터와 같은 일부 시스템 자원들을) 공유하는 유닉스 스타일의 다중 프로세싱과는 다르다. 대신에 유닉스의 프로세스와 같이 자신만의 고유 메모리상에 동작한다. 그래서 한 프로세스의 두 쓰레드 사이의 문맥 교환(context switch)는 두 프로세스 사이의 문맥 교환보다 굉장한 수월하다.
쓰레드를 사용하는 두 가지 이유가 있다:
  • 어떤 프로그램들은 하나의 제어 흐름 보다는 서로 통신하는 여러 쓰레드로 작성될 때만 최고의 성능을 낼 수 있다. (즉, 서버들)
  • 다중 프로세서 시스템에서, 쓰레드들은 여러 프로세서상에서 병렬적으로 수행될 수 있다. 이는 한 프로그램이 다른 프로세서에 작업을 분배할 수 있게 해준다. 이런 프로그램은 한 번에 한 CPU만을 사용할 수 있는 단일 쓰레드 프로그램보다 훨씬 더 빠르다.
1.3 원자성(atomicity)과 휘발성(volatility)
쓰레드에 의해 공유되는 메모리를 접근하는데는 더 주의가 필요하다. 병렬 프로그램은 일반적인 지역 메모리처럼 공유 메모리 객체를 접근할 수 없기 때문이다.
원자성(atomicity)는 어떤 객체에 대한 연산은 분리될 수 없는, 인터럽트 되는 않는 과정으로 이루어져야 된다는 개념을 말한다. 공유 메모리상의 데이터에 대한 연산은 원자적으로 이루어질 수 없다. 게다가 GCC 컴파일러 는 종종 레지스터에 공유 변수들의 값을 버퍼링하는 최적화를 수행할 것이다. 이렇게 메모리 연산을 피하는 것이라도 모든 프로세서가 공유 데이터의 값이 변경된 것은 알 수 있어야만 한다.
레지스터에 공유 메모리의 값을 버퍼링하는 GCC의 최적화를 막기 위해 공유 메모리 상의 모든 객체는 volatile 속성의 타입으로 선언되어야 한다. 단 한 word의 volatile 객체를 읽고 쓸는 것은 원자적으로 이루어지기 때문이다.

1.4 Lock (잠금)
결과값을 읽어오기 저장하는 것은 독립된 메모리 연산이다: ++i은 항상 공유 메모리 상의 i을 1만큼 증가시키지는 않는다. 두 연산 사이에 다른 프로세서가 i을 접근할 수 있기 때문이다. 그래서 두 프로세스가 둘 다 ++i을 수행한다면 2가 아닌 1만 증가될 수도 있다.
그래서 한 쓰레드가 변수의 값을 바꾸는 동안은 다른 쓰레드가 그 변수에 대한 작업을 할 수 없게 하는 시스템 콜이 필요하다. 이는 아래 설명한 lock 방법으로 구현된다. 공유 변수의 값을 바꾸는 루틴을 수행하는 두 쓰레드가 있다고 가정을 하자. 그 루틴이 정확한 결과를 얻기 위해서는 다음과 같이 해야 한다.
  • i 변수에 대해 lock을 건다.
  • 잠긴 변수의 값을 수정한다.
  • lock을 제거한다.
한 변수에 대한 lock이 걸릴 때 그 lock을 건 쓰레드만이 그 값을 바꿀 수 있다. 잠근 때문에 다른 쓰레드들은 블럭이 될 것이다. 한 변수에 대해서 는 한 번에 하나의 lock만이 허용되기 때문이다. ㅍ첫번째 쓰레드가 lock 을 제거할 때만 두번째 쓰레드가 lock을 걸 수 있다. 그 결과 공유 변수를 이용하는 것은 다른 프로세서들의 활동을 느리게 할지도 모든다. 하지만 일반적인 참조는 지역 캐시를 이용한다.

2. 그리고 약간의 실제

2.1 pthread.h 헤더
LinuxThreads가 제공하는 것은 쓰레드 루틴들의 프로토타입을 선언하는 /usr/include/pthread.h 헤더를 통해서 이용 가능하다.
다중 쓰레드 프로그램의 작성은 기본적으로 두 단계의 과정이다:
  • 공유 변수들에 lock을 걸고 쓰레드를 만들기 위한 pthread 루틴들을 사용한다.
  • 쓰레드 서브 루틴에 넘겨야 할 모른 인자들을 포함하는 구조체를 만든다.
몇 가지 기본적인 pthread.h의 루틴들을 간단히 설명하면서 이 두 단계를 실펴보자.

2.2 lock의 초기화
해야만 하는 첫번째 행동들 중의 하나는 모든 lock들을 초기화하는 것이다. POSIX lock들은 pthread_mutex_t 타입의 변수로 선언된다; 각 lock을 초기화하기 위허 다음 루틴을 호출할 필요가 있다:
int pthread_mutex_init(pthread_mutex_t *mutex,  const pthread _mutexattr_t *mutexattr); 
묶어서 보면:
#include〈pthread.h〉... pthread_mutex_t lock; pthread_mutex_init(&lock, NULL); ... 
pthread_mutex_init 함수는 mutex 인자가 가1르키는 mutex 객체를 mutexattr에 의해 명시된 mutex 속성에 따라 초기화를 한다. mutexattr의 NULL이면, 디폴트 속성이 사용된다. 계속해서 이 초기화된 lock들을 어떻게 사용하는지 보겠다.

2.3 쓰레드 생성하기
POSIX는 각 쓰레드를 나타내기 위해 사용자가 pthread_t 타입의 변수를 선언하도록 한다. 다음 호출로 쓰레드가 생성된다:
int pthread_create(pthread_t *thread, pthread_attr_t *attr,  void *(*start_routine)(void *), void *arg); 
성공한다면 새로이 생성된 쓰레드의 id가 thread 인자가 지시한 영역에 저장되고 0인 리턴된다. 에러가 발생하면 0이 아닌 값이 리턴된다.
f() 루틴을 수행하는 쓰레드를 만들고 f()에 arg 변수를 가르키는 포인터를 넘기기 위해서는 다음과 같이 한다:
#include〈pthread.h〉... pthread_t thread; pthread_create(&thread, NULL, f, &arg). ... 
f() 루틴은 다음과 같은 프로토타입을 가져야 한다:
void *f(void *arg); 
2.4 깨끗한 종료
마지막 단계로 f() 루틴의 결과를 접근하기 전에 만든 모든 쓰레드가 종료 할 때까지 기다려야 한다. 다음을 호출한다:
int pthread_join(pthread_t th, void **thread_return); 
th가 가르키는 쓰레드가 종료할 때까지 위의 함수를 호출한 쓰레드의 수행 을 멈춘다. 만약 thread_return이 NULL이니면 th의 리턴값은 thread_return이 가리키는 영역에 저장된다.

2.5 쓰레드 루틴에 데이터 전달하기
호출한 루틴의 정보를 쓰레드 루틴에 넘기는 두 가지 방법이 있다:
  • 전역 변수
  • 구조체
첫번째의 전역변수로 정보를 넘기는 방법은 각각의 쓰레드들이 그 값을 변경해 버리므로 그렇게 좋은 방법이 아니다. 물론 하나의 쓰레드만 실행되는 경우에는 상관이 없겠지만, 하나 이상의 쓰레드가 같은 변수를 참조할 경우 변경된 값을 가진 변수가 다른 쓰레드에 영향을 미치게 될 것이다.
두번째 것이 코드의 모듈성을 보전하는 데 가장 좋은 선택이다. 구조체는 세 가지 단계의 정보를 포함해야 한다; 첫째로 공유 변수들과 lock들에 관한 정보, 두번째로 루틴에서 필요로 하는 모든 데이터에 대한 정보, 세번째로 쓰레드를 구분해주는 id와 쓰레드가 이용할 수 있는 CPU의 수에 대한 정보 (런타임에 이 정보를 제공하는 것이 더 쉽다). 구조체의 첫번째 요소을 살펴보자; 넘겨진 정보는 모든 쓰레드들 사이의 공유된 것이어야한다. 그래서 필요한 변수들과 lock들의 포인터를 사용 해야 한다. double 타입의 공유 변수 var와 그 에 대한 lock을 넘기기 위해 구조체는 두 멤버 변수를 가져야만 한다:
double volatile *var; pthread_mutex_t *var_lock; 
volatile 속성의 사용 위치에 주목하라. 이는 포인터 자체가 아니라 var가 volatile임을 나타낸다.

2.6 병렬 코드의 예
쓰래들를 이용하여 쉽게 병렬화를 할 수 있는 프로그램의 예는 두 벡터의 스칼라곱을 계산이다. 주석을 붙인 코드를 제시한다.
/* 컴파일 하려면 gcc -D_REENTRANT -lpthread */
#include〈stdio.h〉#include〈pthread.h〉/* 알맞은 구조체 선언 */ typedef struct {     double volatile *p_s; /* 스칼라 곱의 공유 변수 */     pthread_mutex_t *p_s_lock; /* 변수 s의 lock */     int n; /* 쓰레드의 수 */     int nproc; /* 이용할 수 있는 프로세서의 수 */     double *x; /* 첫번째 벡터의 데이터 */     double *y; /* 두번째 벡터의 데이터 */     int l; /* 벡터의 길이 */ } DATA; void *SMP_scalprod(void *arg) {     register double localsum;     long i;     DATA D = *(DATA *)arg;     localsum = 0.0;     /* 각 쓰레드는 i = D.n에서 부터 스칼라 곱을 시작한다.     D.n = 1, 2, ...     D.nproc 값을 갖는다. 정확히 D.nproc개의 쓰레드가 있기     때문에 i의 증가 같은 D.nproc이다. */     for(i = D.n; i〈 D.l; i += D.nproc)         localsum += D.x*D.y;     /* s에 대한 lock을 건다 ... */     pthread_mutex_lock(D.p_s_lock);     /* ... s의 값을 바꾼다. ... */     *(D.p_s) += localsum;     /* ... 그리고 lock를 제거한다. */     pthread_mutex_unlock(D.p_s_lock);     return NULL; } #define L 9 /* 벡터의 차원 */ int main(int argc, char **argv) {     pthread_t *thread;     void *retval;     int cpu, i;     DATA *A;     volatile double s = 0; /* 공유 변수 */     pthread_mutex_t s_lock;     double x[L], y[L];     if (argc != 2) {         printf("usage: %s n", argv[0]);         exit(1); }    cpu = atoi(argv[1]);     thread = (pthread_t *) calloc(cpu, sizeof(pthread_t));     A = (DATA *) calloc(cpu, sizeof(DATA));     for (i = 0; i〈 L; i++)         x = y = i;     /* lock 변수를 초기화한다. */     pthread_mutex_init(&s_lock, NULL);     for (i = 0; i〈 cpu; i++) {         /* 구조체를 초기화한다. */         A.n = i; /* 쓰레드의 수 */         A.x = x;         A.y = y;         A.l = L;         A.nproc = cpu; /* CPU의 수 */         A.p_s = &s;         A.p_s_lock = &s_lock;         if (pthread_create(&thread, NULL, SMP_scalprod, &A)) {             fprintf(stderr, "%s: cannot make threadn", argv[0]);         exit(1);         }     }     for (i = 0; i〈 cpu; i++) {         if (pthread_join(thread, &retval)) {             fprintf(stderr, "%s: cannot join threadn", argv[0]);         exit(1);         }     }     printf("s = %fn", s);     exit(0); }
  출처 : http://kldp.org/Translations/html/Thread_Programming-KLDP/Thread_Programming-KLDP-2.html
2006/09/08 14:36 2006/09/08 14:36
이 글에는 트랙백을 보낼 수 없습니다

서버점검사항
1. SUID 점검하기.(root 소유의 SetUID및 SetGID 파일들 점검

    find / -user root -perm -4000 -print (SetUID)
    find / -user root -perm -2000 -print (SetGID)
    find / -user root -perm -4000 -print -xdev

2. 파티션별 디스크사용량 점검
    df -h

3. 파일무결성 점검.

    http://weblog.websea.co.kr/tripwire/tripwire

4. 백도어 설치여부 점검.(/dev 체크 및 rootkit 점검)

    find /dev -type f -exec ls -l {} \;
    ./chkrootkit
   
5. 현재 열려진 포트 및 응답가능한 포트 점검.

    netstat -atp | grep LISTEN (사용 프로토콜 : TCP인가? 또는 UDP인가?
사용중인 포트번호
서버와 연결된 IP 및 도메인명
생성 PID
서비스중인 프로세스명
현재 응답가능상태인가?
    lsof | grep LISTEN(현재 서비스 중인 프로세스명(데몬명)
    현재 생성중인 PID번호.
현재 서비스중인 프로세스의 소유자
프로토콜 버전 : Ipv4 또는 Ipv6
TCP 또는 UDP의 여부
응답가능 상태인가?

6. 실생중인 프로세스 및 데몬점검.(프로세스의 생성관계)

    pstree

7. 시스템 운용상황 점검.

   top -d2

8. 백업점검.

   /home2/backup/nexfor/
   /home2/backup/websea/

9. 스팸메일 점검.(메일큐 디렉토리 점검)

  /var/spool/mqueue    (동일한 날짜, 동일한 사이즈를 가진 다수 파일구분)

10. Core 점검.

  서버내에 긴급한 이상이 발생하였을 경우나 시스템의 정확한 분석을 위해
  서버의 메모리 상태를 순간적으로 dump 받는 경우의 파일
  find / -name core -exec ls -l {} \;
 
11. 파일용량 점검

  repquota -av -ag
  df -h

12. 최근 서버 접속자 점검.

  vi /var/log/secure
  last -n 10  최근 10번째까지의 접속기록을 확인.

13. 계정별 최후접속기록 점검.

lastlog는 현재 /etc/passwd에 존재하는 모든 계정을 대상으로 하
여 언제 마지막으로
서버에 접속을 했는가를 확인.
Mail, adm, bin 등의 계정들은 모두 "** Never logged in **" 이라
고 되어 있는것이 정상.

  lastlog

14. 현재 서버접속자 보기

   w (telnet)
   ftpwho(ftp)

15. root명령어 사용기록 점검.

vi /root/.bash_history  (.set nu)
cat /root/..bash_history | wc -l    (1000라인 이상 되어야 정상)

16. 계정별 사용명령어파일 점검.

find / -name .bash_history -exec ls -l {} \;    (각 계정
별 .bash_history 파일의 존재여부)
find / -name .bash_history -exec cat {} \;     (파일의 내용까
지 모두 확인해 볼 수 있음)

17. root소유자 점검(UID와 GID가 0인 사용자 점검)

cat /etc/passwd | grep 0:0

18. 서버내에 중요한 디렉토리 점검

/etc/xinetd.d/    (xinetd로 서비스되는 인터넷서비스 파일들이 존재하는 디렉토리)
/etc/rc.d/           (부팅에 관계된 파일) (파일들을 복사 후 파일용량등을 비교하기) (커널패닉의원인)
/etc/rc.d/init.d/ (부팅시에 특정 서비스나 데몬들을 시작시키는 스키립트 파일)

19. .rhosts 파일 점검

원격에서 패스워드등의 확인과정없이 바로 접속하기 위해서 사용되는 파일

find / -name .rhosts -exec ls -l {} \;
find / -name .rhosts -exec cat {} \;

20. 메모리사용량 점검.

free -m
cat /proc/meminfo   (free 와 top 는 이 파일을 참조하여 보여준다.)
top -d2

21. 중요 관리자용명령어 점검.

아래의 명령어들을 퍼미션을 100으로 설정한다. 변경 후 퍼미션 변경여부를 확인.

chmod 100 /usr/bin/top
chmod 100 /usr/bin/pstree
chmod 100 /usr/bin/w
chmod 100 /bin/ps
chmod 100 /usr/bin/who
chmod 100 /usr/bin/find
chmod 100 /bin/df
chmod 100 /bin/netstat
chmod 100 /sbin/ifconfig
chmod 100 /usr/sbin/lsof
chmod 100 /usr/bin/make
chmod 100 /usr/bin/gcc
chmod 100 /usr/bin/g++
chmod 100 /usr/bin/c++

22. su 명령어를 이용한 root권한 사용자 점검.

su 명령어의 사용내역을 확인할 수 있음.

cat /var/log/messages | grep root

23. 최근 n 일전 변경된 파일 점검. (단위는 일)

find / -ctime -1 -print | more

24. http://weblog.websea.co.kr/

25. find 를 이용한 특정파일 점검하기.

.exec 파일찾기
find / -name '.exec' -exec cat {} \; -print

.forward 파일체크
find / -name '.forward' -exec cat {} \; -print

write 퍼미션이 있는 파일(디렉토리)찾기
find / -type f  \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;
find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \;

SteUID SetGID 체크하기
find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -
lg {} \;

/dev 체크
find /dev -type f -exec ls -l {} \;

소유자없는 파일 및 디렉토리 찾기
find / -nouser -o -nogroup -print

원격리모트 접속허용 파일(.rhosts)찾기
find / -name .rhosts -print

최근 변경된 파일들 찾기.(파일or디렉토리) 단위는 일
find / -ctime -20 -type f or d

현재 서버에서 열려진 포트 및 접근저보 점검

netstat -an | grep LISTEN   (포트들과 열결되어 있는 실행데몬들을 확인)
lsof | grep LISTEN   (좀 더 자세히 확인)

26. 관리자용 명령어 퍼미션 수정하기.

chmod 100 /usr/bin/top
chmod 100 /usrbin/pstree
chmod 100 /usr/bin/w
chmod 100 /bin/ps
chmod 100 /usr/bin/who
chmod 100 /usr/bin/find
chmod 100 /bin/df
chmod 100 /bin/netstat
chmod 100 /sbin/ifconfig
chmod 100 /usr/sbin/lsof
chmod 100 /usr/bin/make
chmod 100 /usr/bin/gcc
chmod 100 /usr/bin/g++
chmod 100 /usr/bin/c++

27. 중요한 파일퍼미션과 소유권 제한 및 점검.

chmod 644 /etc/service
chmod 600 /etc/xinetd
chmod 644 /etc/mail/aliases
chmod 600 /etc/httpd/conf/httpd.conf
chmod 644 /var/log/wtmp
chmod 644 /var/run/utmp
chmod 644 /etc/motd
chmod 644 /etc/mtab
chmod 600 /etc/syslog.conf

/etc, /usr/etc, /bin, /usr/bin, /sbin, /usr/sbin

chmod 1777 /tmp
chmod 1777 /var/tmp

28. umask 값 확인하기.

root의 umask 값 확인하기.
umask
022 -->파일은 644 디렉토리는 755로 생성됨.
027 -->파일은 640 디렉토리는 750로 생성됨.

29. /dev 에 device 파일 이외의 것이 존재하고 있는지 확인.

find /dev -type f -exec ls -l {} \;

30. 일반사용자의 명령어 패스

/usr/local/bin:usr/local/mysql/bin:/home/hosting/bin/
일반사용자가 사용가능한 명령어를 모두 이것에 둠.

31. 관리자의 명령어 패스

:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin

/X11:/usr/X11R6/bin:/usr/kerberos/bin:/root/bin

32. 특정 그룹만의 su 사용권한 허용하기

vi /etc/group  (wheel구릅에 su 사용권한을 가질 유저 추가하기)
wheel:x:10:root,cream

vi /etc/pam.d/su (두줄 추가하기)

auth sufficient /lib/security/pam_rootok.so
auth required  /lib/security/pam_wheel.so allow group=wheel

vi /var/log/message 에서 확인

33. chmod 400 /etc/shadow

34. 시스템 기본로그파일.

/var/log/messages
/var/log/secure
/var/log/wtmp
/var/run/utmp
/var/log/lastlog

35. utmp, wtmp, lastlog 파일

utmp파일 : 현재시스템에 접속해 있는 사용자의 정보를 가지고 있음.

strings utmp | more

정보 이용 명령어
login(1), who(1), init(8), last(8), lastcomm(8)

wtmp파일 : 처음부터 접속했던 모든 사용자의 로그인정보와 로그아웃정보를 가지고 있음.

strings wtmp | more

정보 이용 명령어
login(1), who(1), init(8), last(8), lastcomm(8)

lastlog 파일

가장 최근에 로그인한 정보를 저장함.

last 라는 명령어로 확인할 수 있음.

36.  패스워드 유출대처방안(웹)

perl을 이용한 방법.


   AllowOverride FileInfo AuthConfig Limit
   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
   Options Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
   Options Indexes SymLinksIfOwnerMatch IncludesNoExec
  
       Order allow,deny
       Allow from all
  
  
       Order deny,allow
       Deny from all
  


SSI의 exec 명령어를 이용하는 방법

#    AddType text/html .shtml
#    AddHandler server-parsed .shtml

27. PortSentry를 이용한 실시간 해킹방어 구현.(잘못 사용할시 서버접속 안됨)

tar -xvzf portsentry-1.1.tar.gz
make linux
make install

/usr/local/psionic/portsentry/portsentry -tcp
/usr/local/psionic/portsentry/portsentry -udp
/usr/local/psionic/portsentry/portsentry -stcp
/usr/local/psionic/portsentry/portsentry -atcp
/usr/local/psionic/portsentry/portsentry -stdp

vi /etc/hosts.deny 점검.

28. Chkrootkit 로 백도어 점검.

tar -xvzf chkrootkit.tar.gz
make sense
./chkrootkit     (점검명령어)

29 ping 을 이용한 DOS 공격 막는 방법.

vi  /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_broadcasts = 1

sysctl -w
/etc/rc.d/init.d/network restart
sysctl -a | grep ignore_broadcasts

30. Nmap를 이용 포트스켄 하여 해킹가능성 체크.

nmap -sS -p80 211.42.48.110 -O -v www.armian.net
nmap -sS -O -v 211.42.48.114

2006/09/08 14:36 2006/09/08 14:36
이 글에는 트랙백을 보낼 수 없습니다
출처 카페 > 사일런트밥 / art4linux
원본 http://cafe.naver.com/art4linux/3

작성자 : 좋은진호(truefeel, http://coffeenix.net/)
작성일 : 2003.10.01(수)
수정일 : 2004.01.08(목), chroot_list_enable 글 추가

이 글은 7월에 썼던 'vsftpd에서 한글파일로그와 lastlog 로긴확인하기'를 기초로 작성하였다.

1. vsftpd FTP 서버에 대해

vsftpd는 UNIX 시스템에서 사용할 수 있는 free FTP 서버(라이센스는 GPL)이다.
vsftpd가 내세우고 있는 것은 보안, 성능, 안정성이다. 지금까지 vsftpd의 자체 보안 문제가 있어
보안권고가 나온 적은 없다.(Redhat의 rpm 패키지중에 tcp_wrappers 지원없이 만들어져서 업데이트
rpm은 나온 적 있음)

* 지원 및 테스트된 OS

- Linux (Redhat, SuSE, Debian)
- Solaris (버전에 따라 IPv6나 inet_aton함수때문에 설치가 잘 안될 수 있음)
- FreeBSD, OpenBSD
- HP-UX
- IRIX

* 주요 기능

- 가상 IP별 별도의 환경 설정 기능 (설정파일의 listen_address= 이용)
- 가상 사용자 설정
- 전송 대역폭 지정
- PAM 지원 (버전 1.2.0부터는 PAM을 통한 wtmp에 로긴 로그를 남김)
- xferlog 표준 로그 파일보다 상세한 자체 로그 파일 형식 지원
- Standalone 방식과 inetd(xinetd)를 통한 운영 모두 지원
- IP별 다른 환경 파일 지정 기능 (tcp_wrappers와 함께 사용할 때)
- ...

2. vsftpd 설치

※ 설치는 Redhat 기준. 솔라리스의 PAM에 대한 것은 README.solaris 파일 참조한다.

http://vsftpd.beasts.org/ 에서 최신버전(현재 1.2.0)의 소스를 받아온다.

-------------------------------------------------------------
# tar xvfz vsftpd-1.2.0.tar.gz
# cd vsftpd-1.2.0
-------------------------------------------------------------

한글로 된 파일명을 전송할 때 로그에 파일명이 ???? 로 남지 않도록
logging.c 파일을 연 후 140번째 줄의

str_replace_unprintable(p_str, '?');

를 다음처럼 주석 처리한다.

/* str_replace_unprintable(p_str, '?'); */

또한 tcp_wrappers를 통한 접속제어를 사용하려면 builddefs.h 에서

#undef VSF_BUILD_TCPWRAPPERS 를
#define VSF_BUILD_TCPWRAPPERS 로 바꾼다.

-------------------------------------------------------------
# make
# make install (vsftpd 데몬, man page, xinetd 용 설정 파일 설치)
# cp vsftpd.conf /etc (환경설정 파일 복사)
# chmod 600 /etc/vsftpd.conf
# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd (PAM 설정 파일 복사)
-------------------------------------------------------------

/etc/pam.d/vsftpd 첫번째 줄에 다음과 같이 있다.

pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

즉, /etc/ftpusers 파일에 존재하는 ID는 접속할 수 없게된다.(sense=deny)

-------------------------------------------------------------
# FTP 접속을 허용하지 않을 ID를 등록한다.
# /etc/passwd를 참조해서 설치할 서버의 환경에 맞게 등록
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
smmsp
xfs
gdm
mysql
-------------------------------------------------------------

3. vsftpd.conf 의 주요 설정

-------------------------------------------------------------
# anonymous 사용자의 접속 허용 여부 (default = YES)
# 공개된 형태의 FTP 서버로 운영할 것이 아니라면 NO로 한다.
anonymous_enable=NO
# 로컬 계정 사용자의 접속 허용 여부 (default = NO)
local_enable=YES

# write 명령어 허용 여부 (defualt = NO)
write_enable=YES
# 로컬 계정 사용자용 umask (default = 077)
local_umask=022

# anonymous 사용자가 파일을 업로드 할 수 있는지 여부 (default = NO)
# anon_upload_enable=YES
# anonymous 사용자의 디렉토리 생성 허용 여부 (default = NO)
# anon_mkdir_write_enable=YES

# 파일 전송 로그를 남길 것인지 여부 (default = YES)
xferlog_enable=YES
# xferlog 표준 포맷으로 로그를 남길지 여부 (기본 설정파일은 YES)
# 아래에서 NO로 설정했을 때를 설명함
xferlog_std_format=YES
# 파일 전송 로그 파일명
xferlog_file=/var/log/vsftpd.log

# FTP 서버 접속할 때 로긴 메시지 (default = vsFTPd 버전번호)
# 한글 사용 가능
# ftpd_banner=Welcome to blah FTP service.

# 사용자의 홈디렉토리를 벗어나지 못하도록 제한하기 위한 설정 (default=NO)
# 제한이 필요할 경우 YES로 바꾼 후 제한할 사용자 ID를 chroot_list_file= 에 설정한 파일에
# 지정한다.
# chroot_local_user= 설정과 관련이 있으니 '3. 문제 해결'을 꼭 읽어보라.
#
# chroot_list_enable=YES
# chroot_list_file=/etc/vsftpd.chroot_list

# -------------------------------------------------------------------
# 기본 설정 파일에는 없는 설정값으로 필요한 설정만 추가한다.
# ※ 중요한 설정은 굵은 글씨로 표시
# -------------------------------------------------------------------

# PAM 파일명을 지정 (설치할 때 /etc/pam.d/vsftpd명으로 복사함)
pam_service_name=vsftpd

# wtmp에 로그 남기기 (YES로 해야만 last 명령어로 접속 여부 확인 가능)
session_support=YES

# 사용자가 자신의 home directory를 벗어나지 못하도록 설정
chroot_local_user=YES

# 새로운 디렉토리에 들어갔을 때 뿌려줄 환경 메시지를 저장한 파일명
# message_file=.message

# xferlog 형식으로 log를 남기려면 (위에서 이미 YES로 했음)
# xferlog_std_format=NO
#
#  - xferlog 표준 포맷은 로긴, 디렉토리 생성등의 로그를 남기지 않음
#   그러나 vsftpd 스타일 로그는 이를 포함한 보다 상세한 로그를 남김
#  - vsftpd 스타일 로그 예
#
#  Sun Jul 12 01:38:32 2003 [pid 31200] CONNECT: Client "127.0.0.1"
#  Sun Jul 12 01:38:34 2003 [pid 31199] [truefeel] FAIL LOGIN: Client "127.0.0.1"
#  Sun Jul 12 01:38:38 2003 [pid 31199] [truefeel] OK LOGIN: Client "127.0.0.1"
#  Sun Jul 12 01:38:41 2003 [pid 31201] [truefeel] OK MKDIR: Client "127.0.0.1", "/mp3"
#  Sun Jul 12 01:39:06 2003 [pid 31201] [truefeel] OK UPLOAD: Client "127.0.0.1", "/델리
#  스파이스 5집 - [04]키치죠지의 검은 고양이.mp3", 6855473 bytes, 3857.39Kbyte/sec

# 전송속도 제한 (0은 제한없음, 단위는 초당 bytes)
anon_max_rate=0
local_max_rate=0
trans_chunk_size=0

# 최대 접속 설정 (단 xinetd를 통하지 않고 standalone으로 동작할 때만 사용 가능)
# standalone을 위해서는 listen=YES 추가하고 별도로 vsftpd를 띄워야 함
#
# max_clients=최대 접속자 수, max_per_ip=IP당 접속 수
# max_clients=100
# max_per_ip=3

# Standalone 으로 운영할 때 listen=YES. 포트 변경을 원할 경우 listen_port 설정
# 디폴트 포트는 21번 포트이다.
# listen=YES
# listen_port=21
-------------------------------------------------------------

필요한 설정이 끝났으면 xinetd를 재실행한다.

-------------------------------------------------------------
# /etc/rc.d/init.d/xinetd restart
-------------------------------------------------------------

4. 문제 해결

1) ftpwho 같은 명령은 있나?
  또한 last를 해도 접속된 걸 확인할 수가 없는데 방법이 없나?

 ftpwho 형태의 명령은 없으며 임시적으로 다음 명령어 등으로 확인할 수 있다.

 # ps -ef|grep vsftpd
 # fuser -v ftp/tcp

 vsftpd v1.2.0이상부터 PAM을 통해 wtmp에 로그를 남기므로 last로 접속여부를 확인할 수 있다.

2) 한글 파일명이 전송될 때는 vsftpd.log 에 ???? 로 남는다. 해결책은?

 vsftpd는 출력할 수 없다고 판단하는
 ASCII 코드 31 이하, 128~159, 177 문자를 모두 ? 로 바꿔서 저장을 한다.
 따라서 이 부분을 처리하지 않고 저장하도록 소스를 수정한 후 컴파일하면 해결된다.

3) 사용자가 홈디렉토리를 못 벗어나게 하고 싶는데?

/etc/vsftpd.conf에 다음을 추가하면, 모든 사용자는 자신의 홈디렉토리만 접근할 수 있다.

chroot_local_user=YES

또한 특정 사용자로만 제한을 하고 싶다면 다음과 같이 한다. /etc/vsftpd.chroot_list에는 제한할
사용자 ID를 한줄에 하나씩 나열하면 된다.

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

주의할 것은 chroot_local_user=YES와 chroot_list_enable=YES를 함께 사용할 경우에는
/etc/vsftpd.chroot_list에 포함된 사용자 ID만 제한없이 홈디렉토리를 벗어날 수 있다.
즉, 반대로 작용한다.

standalone으로 FTP서버가 동작중이면 재실행 필요. standalone에 대해서는 6)번에서.

4) root로 접속할 수는 없나?

 가능하면 root 접속은 허용하지 않기를 바란다.
 /etc/ftpusers 파일에서 root를 빼면 접속이 가능하다.

5) ID/비밀번호가 정확히 맞는데 로긴할 때 자꾸 530 Login incorrect. 라고 나온다.

 /etc/ftpusers (또는 vsftpd.ftpusers)에 등록된 사용자인지 확인한다.
 여기에 등록된 사용자는 로긴할 수 없다. 이럴 때 /var/log/messages에 다음과 같은 로그가 남는다.

 Aug 16 22:21:52 truefeel vsftpd: PAM-listfile: Refused user xxxxxxxx for service vsftpd

6) standalone으로 운영하고 싶다.
  (즉, apache나 sendmail처럼 xinetd 통하지 않고 운영을 원한다.)

 /etc/xinetd.d/vsftpd (vsftpd가 아닌 다른 파일명일 수 있음) 에서 disable = yes 로 변경하여
 xinetd로 서비스 하지 않도록 설정한다. xinetd 를 재실행하면 이제 xinetd를 통한 ftp 서비스는 종료된다.

 레드햇의 경우 /etc/rc.d/init.d/xinetd restart

 이제 vsftpd 데몬를 실행한다. (소스로 설치시 기본 경로는 /usr/local/sbin)

 # /usr/local/sbin/vsftpd &

7) 다른 포트(기본 21번)를 사용하고 싶다. (예를 들어 11121번 포트를 원할 때)

 * xinetd를 이용하는 경우

  /etc/service 에 'ftp2  11121/tcp' 한 줄을 추가한다.
  그리고 /etc/xinetd.d/vsftpd (vsftpd가 아닌 ftp와 같은 다른 파일명일 수 있음) 에서
  service ftp 를 service ftp2로 바꾸고, xinetd 를 재실행한다.

 * standalone으로 운영하는 경우

  /etc/vsftpd.conf 에서 listen_port=11121 을 추가하고 vsftpd 서버를 재실행한다.

 바뀐 포트로 운영중인지 확인은 netstat -atnp(리눅스) 또는 netstat -an(그 이외 유닉스)

8) 업로드 파일 크기를 제한하는 방법은 없나요? 이를테면 5MB이상의 파일은 업로드 못한다든지.

현재 1.2.1버전까지 vsftpd 자체에 설정하는 방법은 없습니다.

5. 참고할만한 문서

* vsftpd 1.2.0 설치 문서
 ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-1.2.0/INSTALL
* vsftpd.conf man page
* vsftpd에서 한글파일로그와 lastlog 로긴확인하기 (좋은진호)
 http://coffeenix.net/board_view.php?bd_code=4
* vsftpd에서 전송속도 제한 (bandwidth limit) (좋은진호)
 http://coffeenix.net/board_view.php?bd_code=21

2006/09/08 14:35 2006/09/08 14:35
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 영혼의 소리...카리스마 그리고 이성
원본 http://blog.naver.com/kill_9/100004874536

#!/bin/bash


# 이 스크립트는 해당 디렉토리 이하, 확장자가 txt인 파일의 문자열을 교체한다.

# 서브사이드 스크립트(Server Side Script)의 일괄적인 문자열 교체에 유용하다.


target_dir="/www/htdocs"

target_files=$(find "$target_dir" -name "*.txt" -type f)


# shell 내부변수 조정, 단, bash 버전 2.xx 이상에선 아래의 코드를 사용하지 않아도 된다.

IFS='

'

from_str='원본 문자열'

to_str='치환할 문자열'


# 루프로 해당 디렉토리내의 모든 파일(/www/htdocs 내의 *.txt 파일)을 조사한다

# 파일에 일치하는 패턴이 있으면 치환, redirection 시켜 새로운 파일(파일명.newfile)을 만든다

# 새로운 파일을 기존의 파일명으로 바꾼다.

# 하나의 파일 실행이 끝나면 특정 메세지를 띄운다.

for file in $target_files ; do

  result=$(grep "$from_str" "$file")

  if [ X"$result" != "X" ] ; then

     sed "s;${from_str};${to_str};g" "$file" > ${file}.newfile

     mv -f "${file}.newfile" "$file"

     echo "Changed String : $file"

  fi

done

exit 0

find 로 문자열 찾아서 치환

* 리눅스에서 파일 검색
- Tips/Linux | 2006/06/10 10:17
문자열찾기 방법 1 - 영어만 주로 가능
grep -rw "찾는문자열" ./

문자열찾기 방법 2 - 대/소문자 구분 안하고 검색
grep -i -l "찾는문자열" * -r 2> /dev/null

문자열찾기 방법 3 - 한글, 영어 모두 가능
find . -exec grep -l "찾는문자열" {} \; 2>/dev/null

문자열찾기 방법 4 - 한글,영어, 대소문자 안가리고 검색
find . -exec grep -i -l "찾을문자열" {} \; 2>/dev/null

문자열찾은 후 치환
find . -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \; 2>/dev/null

파일명 찾기
find / -name 파일명 -type f

파일명 찾기(대소문자 구별없음)
find / -iname 파일명 -type f

디렉토리 찾기
find / -name 파일명 -type d

디렉토리 찾기(대소문자 구별없음)
find / -iname 파일명 -type

xargs - 명령 결과를 다른 명령의 아규먼트로 넣기
find . -name "*py" -print | xargs  -i -t cp {} backup

응용은 요고와 같다
find ./* -exec grep -l '찾는문법' {} \; | xargs -i -t perl -pi -e 's/찾을문자열/바꿀문자열 {}
2006/09/08 14:33 2006/09/08 14:33
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:33
출처 블로그 > 유아
원본 http://blog.naver.com/uad0kz0n/100006393481
리눅스 시스템의 기본 로케일을 EUC-KR로 지정합니다.
/etc/sysconfig/i18n의 LANG 변수를 ko_KR.eucKR 로 셋팅함으로 설정할 수 있습니다.
현재 로케일 설정은 '#echo $LANG' 으로 확인할 수 있습니다.
제 시스템의 설정입니다.

# cat /etc/sysconfig/i18n
LANG="ko_KR.eucKR"
SUPPORTED="en_US.UTF-8:en_US:en:ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-16"
SYSFONTACM="iso01"

먼저 서버측 설정을확인합니다. 바로 이것이 한글 로케일링이라는
것으로 리눅스하에서 기본 캐릭터 셋팅을 한글로 해주는 것입니다.
2006/09/08 14:33 2006/09/08 14:33
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 나라사랑하세
원본 http://blog.naver.com/cain2332/40009924489

[ Home | Freetime works | FreeBSD | KFUG ]

프로그램세계 2002년 8월분

웹 캐시 서버 도전하기

최준호, Korea FreeBSD Users Group <cjh at kr.FreeBSD.org>

이번달에는 가장 많이 사용하는 인터넷의 도구인 웹에 관련된 캐시 서버에 대해서 알아 보자. 일반적으로 웹 서버에 대한 설정이나 관련 내용은 많지만 상대적으로 캐시에 관련된 내용은 적은 편이다. 웹 캐시는 이용도에 따라 다양한 활용이 가능하므로 꼭 한번 살펴보기 바란다.

이달의 FreeBSD 소식

새 한국인 커미터 탄생

오랜 동안의 토의의 결과로, 장혜식 (perky at freebsd.org) 님이 새로운 FreeBSD 포트 커미터가 되었다. 장혜식님은 그간 python이나 다른 여러가지 포트에 대해 활발한 활동을 보여 주었고, 특히 apache2와 같은 중요한 포트를 몇 관리하고 있다. 따라서 현재 FreeBSD의 한국인 커미터는 필자와 장혜식님의 두명이 되었으며, 더 많은 분들의 활약을 기대한다. 이 글을 읽으신다면 축하의 메일이라도 보내 주시길 바란다.

4.6 릴리즈의 보안 버그 세가지

4.6 릴리즈가 나온 직후 세가지의 큰 보안 문제가 제기되어 있다. 다른 것도 있지만 이는 모든 사용자에게 해당되므로 꼭 점검해 보자.

  • FreeBSD Security Notice FreeBSD-SN-02:04 (2002/06/25) apache의 chunked encoding 보안 취약점에 대해서 지적하고 있다. FreeBSD용 worm이 돌아다니고 있는 실정이니 FreeBSD 사용자는 꼭 갱신해야 한다.
  • FreeBSD Security Advisory FreeBSD-SA-02:28.resolv (2002/06/27) 이는 libc 안의 DNS 관련 코드(지난호 기사 참조)에 버퍼 넘침 버그가 있다는 것을 의미한다. RELENG_4_6 브랜치로 업데이트하면 4.6-p1이 되어 있을 것이다.
  • FreeBSD Security Advisory FreeBSD-SA-02:31.openssh (2002/07/16) 이 문제는 sshd의 설정을 조정하여 임시로 막을 수 있지만 sshd를 업데이트해야 하는 문제이다.
  • FreeBSD와 웹 캐시

    웹 캐시란?

    인터넷상의 대부분의 트래픽을 차지하는 HTTP 프로토콜은 주로 웹 페이지 또는 파일이라는 객체 단위의 전송을 지원하는 프로토콜이라 생각하면 되며, 접근할 수 있는 각 객체에는 URL이라는 유일한 이름이 붙어 있다(여기에 쿠키나 CGI 인수 등이 추가되기도 한다). 일반적으로는 사용자의 웹 브라우저에서 웹 서버까지 직접 접속하여 URL로 지정된 웹 객체를 전송해 와서 적절한 MIME 타입에 따라 사용자 화면에 표시하는 구조로 되어 있다.

    사람들이 많이 몰리는 웹 사이트의 경우 접속이 빈번해지면 웹 서버는 부하를 많이 받게 된다. 웹 서버의 부하를 낮추는 방법에는 여러가지가 있지만, 가장 편리한 방법 중의 하나는 사용자의 웹 브라우저와 웹 서버 사이에 웹 캐시를 중간에 두어 지나가는 내용을 캐싱하도록 하는 것이다. 웹 캐시는 HTTP 프로토콜의 서버와 클라이언트 양방향으로 동작하여 웹 브라우저 입장에서는 웹 서버로, 웹 서버 입장에서는 웹 클라이언트의 형태로 동작하며, 브라우저와 서버 사이의 URL 객체를 조건에 따라 캐시의 저장 공간에 저장하고 이용자의 요청이 웹 서버에게 불필요한 경우 캐시가 직접 처리하도록 되어 있다.

    하지만 캐시라는 것은 여러 수준에서 존재할 수 있다. 웹에 관련된 것이라면, 일차적으로 웹 브라우저가 있는 PC에서 메모리와 디스크에 각 객체를 캐싱하고(인터넷 익스플로러나 넷스케이프 네비게이터, 모질라의 경우 각각 메모리와 디스크 캐시에 대한 설정을 찾아볼 수 있다) 있으므로 직접 연결시에도 전혀 캐시가 적용되지 않는 것은 아니다.

    웹 캐시의 종류

    웹 캐시에는 크게 두가지의 용법이 있다.

    • 프록시 캐시(proxy cache)

      이 형태의 캐시는 일반적으로 사용자 측에 설치되어서, 사용자의 HTTP 프로토콜 접속을 캐싱하여 기본적으로 사용자측 - 서버측 구간의 트래픽을 줄여주는 역할을 한다. 사용자가 있는 랜에 직접 설치되기도 하고, ISP의 라우터 구간에 존재하기도 한다. 이 방법은 특정 서버의 부담을 크게 줄이지는 못하지만 여러 사람이 웹 접속을 많이 하는 경우 랜 구간의 트래픽을 줄일 수 있다. 가령 T1 회선(1.5Mbps)를 사용하는 일반 사무실의 경우 프록시 캐시를 도입하면 사내 트래픽을 많이 줄일 수 있다. 또한 방화벽이 있는 경우, 프록시 캐시는 일반 사용자의 웹 접속을 프록시 캐시만을 통하여 외부에 접속할 수 있도록 해 준다.

    • 리버스 캐시(reverse cache)

      이 형태의 캐시는 서버 바로 앞에 붙어서 사용자의 HTTP 프로토콜 접속을 캐싱하여 기본적으로 서버측 구간의 트래픽을 줄이는 역할을 해 준다. 이는 서버의 증설 없이 웹 사이트의 성능을 향상시킬 수 있는 좋은 방법이기도 하다. 인버스 캐시, httpd 엑셀러레이터 등의 다른 이름으로 불리기도 한다.

    대부분의 캐시 소프트웨어는 이 두가지 방법을 모두 지원할 수 있다. 기본적으로는 프록시 캐시의 경우 불특정 다수의 웹 서버의 요청을 캐싱하게 되며, 리버스 캐시의 경우 특정 웹 서버의 요청만을 캐싱하게 된다. 또 한가지 많이 이용되는 방법은 투명 캐시(transparent cache)라는 것으로, 실제로는 프록시 캐시의 역할을 하지만 이용자의 별도 지정 없이도 모두 캐시를 통하게 하는 방법이다. 이는 일일이 캐시 설정을 하기 어려운 중규모 이상의 랜 환경이나 이용자가 많은 ISP의 경우 유용하다.

    결국 캐시라는 것은 사용자 - 웹 서버 간의 구간 어디엔가에 놓여서 트래픽을 줄이기 위한 목적으로 사용되는 것이지만, HTTP 프로토콜 자체가 모두 캐시를 통해 지나가는 특성상 이를 응용하여 여러가지 일이 가능하다. 예를 들면 다음과 같다.

    • 웹 페이지 내의 광고 배너 삭제
    • 음란물 등의 필터링
    • 특정 웹사이트의 접속 제한
    • 캐싱된 객체의 압축 전송
    이러한 일을 하는 캐시의 경우(또는 전혀 캐싱하지 않는 경우도 있다) 캐시라기 보다는 필터의 성격에 더 가깝다고 말할 수 있다. 대표적으로 광고 배너 삭제를 해 주는 프록시를 들 수 있는데, 이는 지나가는 HTTP 요청을 분석하여 광고 이미지로 판명될 경우 해당 사이트에서 배너 그림을 받아오는 대신 에러 메시지나 빈 그림을 돌려주게 하여 광고 이미지가 사용자의 웹 브라우저로 전송되지 못하게 한다.

    캐시 관련 포트

    웹 캐시에 관련된 포트는 대부분 www 카테고리에 존재한다. 대부분의 포트는 웹 캐시 또는 캐시에 관련된 유틸리티(통계, 캐시 브라우저 등)이다.

    squid (www/squid)

    오픈 소스로 된 웹 캐시 중 가장 유명한 것은 squid(www/squid)이다. squid는 원래 Harvest라는 프로젝트의 일부였으나 Harvest 프로젝트가 종료된 뒤에 웹 캐시 부분이 따로 계속 발전하여 현재의 형태에 이르고 있다.

    squid는 웹 캐시에 필요한 모든 기능을 제공하고 있는 완전한 웹 캐시 소프트웨어이다. 상용 웹 캐시에 비해 성능이 조금 떨어질지는 모르겠지만, 실제 중소규모의 네트워크에서 사용하기에는 조금도 부족함이 없는 수준이다. squid 프로젝트의 홈페이지는 아래 주소이다.

    Squid Web Proxy Cache: http://www.squid-cache.org
    현재의 안정 버전은 2.4이이다. 이 글에서는 2.4 버전을 간단히 설정하고 사용하는 방법에 대해 알아 보자. 이 글에서는 주로 프록시 캐시의 사용법에 대해서 알아보겠다. 리버스 캐시의 경우 L4 스위치 등과 같이 이용해야 하는 경우가 많으므로 이 부분에 대해서는 독자에게 맡기겠다.

    squid의 설치와 설정: 프록시 캐시

    squid의 설치에 대해서는 별다르게 말할 것이 없다. 기본적으로는 패키지를 설치하거나 www/squid24 포트에서 설치하면 되는데, 포트 설치시 많은 옵션을 줄 수 있으므로 www/squid24/Makefile을 꼭 보기 바란다. 기본적인 캐시 설정을 위해서는 추가로 해 주어야 할 것은 없으므로 잘 모르면 그대로 설치하기 바란다.

    설치 후를 보면 대몬의 시작/정지 스크립트는 /usr/local/etc/rc.d/squid.sh 에 설치되어 있다는 것을 알 수 있다. 실제로는 RunCache라는 명령을 부르게 되며, RunCache는 다시 squid라는 프로그램을 대몬 형태로 실행시킨다.

    설정 파일은 /usr/local/etc/squid/squid.conf를 설정하면 된다. 이 파일은 매우 크기가 크고 다양한 설정이 가능한데, 여기서는 최소한의 설정에 대해서 알아 보자. 나머지는 squid의 문서 등을 참고해서 스스로 해 보기 바란다.


    # 캐시 서버의 포트를 지정한다. 보통 프록시 캐시로 쓰는 경우는# 3128번이고, 리버스 캐시로 사용한다면 80번으로 쓰는 경우가 많다.http_port 3128# 캐시용 메모리 크기를 지정한다.cache_mem 8 MB# 캐싱할 수 있는 최대 객체 크기를 정한다.maximum_object_size 4096 KB# 캐시 보관용의 디스크 영역을 지정한다.# 첫번째 인수인 ufs는 디스크 관리 방법(가장 보통인 것)을 나타내며,# aufs, diskd 등의 대체 키워드를 사용할 수 있다.# 두번째 인수는 캐시의 디렉토리이다. 용량이 충분한 디렉토리를# 지정한다.# 세번째 인수는 캐시의 최대 크기를 M바이트 단위로 지정한다.# 1500의 경우 1500M(1.5G) 를 나타낸다.# 네번째 인수와 다섯번째 인수는 캐시 디렉토리의 갯수를 나타내는데,# 캐시 디렉토리 아래 네번째 인수만큼의 디렉토리를 만들고, 그 아래# 다섯번째 인수만큼의 디렉토리를 만든다. 이를 통해 빠르게 캐시# 객체를 찾아갈 수 있다.cache_dir ufs /spool/cache/spool 1500 16 256# 캐시의 접근 로그를 저장한다. webalizer같은 로그 분석 도구로# 분석할 수 있다.cache_access_log /spool/cache/logs/access.log# 캐시에 대한 행동 로그 파일을 지정한다.cache_log none# 캐시 저장에 관련된 로그를 기록한다. 보통은 필요 없다.cache_store_log none# squid는 FTP 캐시도 가능한데, 이 경우 사용자 대신 실제 FTP 서버에# 익명 로그인할 경우의 id를 지정한다. 웹 캐시는 FTP 접속을 대신하는# 경우, 알맞은 인덱스 파일을 생성해 준다.ftp_user Squid@# 접근 제어 목록을 지정한다. 캐시에 아무나 접근할 수 있다면 불필요한# 외부 접속과 트래픽을 발생할 수 있다.# acl 다음은 그룹 이름, 그 다음에 포트, IP 주소 등을 지정할 수 있다.acl all src 0.0.0.0/0.0.0.0acl manager proto cache_objectacl localhost src 127.0.0.1/255.255.255.255acl SSL_ports port 443 563acl Safe_ports port 80          # httpacl Safe_ports port 21          # ftpacl Safe_ports port 443 563     # https, snews# http_access 뒤에는 allow/deny의 동작을 지정하고 acl 에서 지정했던# 그룹을 지정한다.# 아래의 경우 manager 그룹과 localhost 그룹은 접근을 허가,# 다음 행에 의해 localhost 이외의 manager 그룹은 접근이 안되는 것을# 알 수 있다.http_access allow manager localhosthttp_access deny manager# Safe_ports 이외는 거부(!은 not의 의미를 갖는다)http_access deny !Safe_ports# SSL_ports(443, 563 포트)가 아니면 CONNECT 그룹을 허가하지 않는다.# CONNECT 그룹은 acl에서 CONNECT 메소드를 나타낸다.http_access deny CONNECT !SSL_ports# 아래 예는 자신의 네트워크를 정의하고 여기에 대해 접속을 허가하는# 경우이다. 자신의 네트워크는 여기서 192.168.1.0/24 이다.acl myhome src 192.168.1.0/255.255.255.0http_access allow myhome# 가장 끝에는 명시적으로 allow all이나 deny all을 적어주기 바란다.# 아래와 같이 적어주면 위의 allow 규칙에 해당되지 못한 요청은 이 줄에# 의해서 모두 거부된다.http_accessde deny all

    대략 설정이 끝났으면 squid를 실행해 보자. 실행하기 전에 해야 할 일은 먼저 캐시 디렉토리를 만드는 일이다. 위에서 cache_dir 에서 지정한 디렉토리를 만들고, squid -z 를 이용해서 캐시 디렉토리 아래의 하부 디렉토리를 생성한다.

    # mkdir -p /spool/cache/spool# chown -R nobody:nogroup /spool/cache/spool# squid -z

    잠시 후에 디렉토리 생성이 종료될 것이다. squid는 nobody 권한으로 실행되기 때문에 (cache_effective_user, cache_effective_group 으로 설정한다) 해당 사용자가 읽고 쓰기 가능하도록 권한을 변경해 주어야 한다. /tmp 처럼 sticky 비트를 지정하는 것도 좋은 생각일 것이다.

    다 되었다면 이제 캐시를 실행해 보자.

    # /usr/local/etc/rc.d/squid.sh start

    실행이 잘 되고 있는지는 사용자의 웹 브라우저에서 프록시를 해당 IP와 포트(기본인 경우 3128)번으로 설정하고, 다시 브라우저를 실행한 후 웹 브라우징이 잘 되는지 확인해 보면 된다. IE의 경우, "도구" - "인터넷 옵션" 탭을 선택한 후 "연결" 탭, "LAN 설정(L)..." 을 선택하면 프록시 입력 화면으로 이동할 수 있다. 여기서 "프록시 서버 사용"을 선택하고 서버 IP와 포트 이름을 적어주면 된다. 넷스케이프라면 "편집" - "설정" 메뉴의 "고급" - "프락시" - "프락시 수동 설정" 탭을 이용하면 된다.


    IE의 프록시 캐시 설정


    Netscape 4.x의 프록시 캐시 설정

    그러면 이후의 HTTP 접속은(FTP나 Gopher도 프록시 캐시를 이용할 수 있다) 모두 지금 설정한 캐시를 통하게 된다. 정상적으로 웹 브라우징이 되는 경우라면 잘 되는지의 여부를 확인할 수 있다.

    만약 이 방법으로 연결이 잘 안되거나, proxy가 어떤 오류 메시지를 내보낸다면(squid가 아예 제대로 떠 있지 않은 경우를 제외한다면 오류 메시지는 브라우저에 표시된다) 이를 보고 적절히 대처해 주면 된다. 대부분이 경우 squid.conf의 설정 변경으로 해결할 수 있다.

    다음 사이트를 사용하면 캐시의 사용 여부와 캐시가 외부에서 이용 가능한지를 점검할 수 있다. 만약 외부에서 접근이 가능하다고 나오는 경우 일부러 열어둔 것이 아니라면 squid.conf의 acl 부분을 다시 보고 한정된 범위만 프록시 연결을 허가하기 바란다. 가장 아래쪽의 "Environment Variable Check"를 선택하고 "Show Proxy related Variable"을 선택하면 HTTP_VIA 헤더에 현재 사용하고 있는 캐시의 IP와 포트 번호가 나온다. 만약 자신이 사용하고 있지 않은 프록시가 출력되는 경우 대부분 ISP에서 직접 설치해 놓은 캐시인지 의심해 볼 필요가 있다. 대형 ISP의 경우 HTTP 접속을 줄이기 위해 라우터 수준에서 투명 프록시를 설치해 둔 경우가 많다.

    Proxy Checker: http://cache.jp.apan.net/proxy-checker/
    FreeBSD에서는 HTTP_PROXY와 FTP_PROXY 환경 변수를 사용해서 fetch, lynx 등의 명령이 프록시를 거치도록 할 수 있다. 방화벽 내에 있는 환경이라든가 프록시를 써야 하는 환경이라면 포트 등의 설치에서 이 변수를 지정하도록 할 수 있다. ports의 경우 많이 쓴다면 make.conf 에서 지정해 두자.

    FETCH_ENV=     HTTP_PROXY=http://192.168.1.1:3128

    squid의 관리

    squid는 -k 옵션을 통해 여러가지 관리 명령을 실행할 수 있으므로 대몬 관리에 조금 도움이 될 것이다.

      squid -k reconfigure|rotate|shutdown|interrupt|kill|debug|check|parse

    특히 reconfigure, shutdown, kill 등은 웹 캐시 프로세스를 빠르게 제어할 수 있다. 설정이 변경된 경우 reconfigure를, 서버를 중지시키고 싶은 경우 shutdown이나 kill(kill이 더 강제적이다)을 사용하기 바란다. squid의 경우 프로세스가 비정상적으로 종료되어도 다시 시작하기 때문에 프로세스를 직접 kill로 정지시키는 일이 잘 안되는 경우가 많다.

    # squid -k reconfigure

    squid의 설치와 설정: 투명 캐시

    프록시 캐시는 설치가 간단하고 이용이 비교적 쉽다는 점이 있지만, 대상이 되는 네트워크에 많은 수의 클라이언트 PC가 있다면 일일이 환경 설정을 열어서 프록시 캐시를 지정해 주기는 어려운 점이 많다. 이러한 경우 방화벽을 사용하고 있다면 투명 캐시라는 기능을 사용하면 사이트 전체의 전역 설정으로 바꿀 수 있다. 투명 캐시는 웹 서버로 가는 패킷의 흐름을 강제적으로 캐시로 돌려주고, 캐시가 대신 웹 서버에 접속하도록 한다.

    이번 경우는 다음 네트워크를 예로 들도록 하자. 지금은 ipfw를 사용하는 예를 들지만, 대부분의 패킷 필터 방화벽은 비슷한 설정을 제공한다.

  • 네트워크: 192.168.1.0/24
  • 라우터/NAT 서버: 192.168.1.1 (외부 인터페이스: fxp0)
  • 프록시 캐시: 192.168.1.1
  • 방화벽: ipfw(8)
  • 그리고 ipfw를 사용하는 경우 사전에 커널에 다음과 같은 설정이 포함되어 있어야 한다. 이것이 없으면 아래 기능이 동작하지 않는다.
    options         IPFIREWALL_FORWARD      #enable transparent proxy support
    먼저 squid.conf 에서 필요한 설정은 다음과 같다. 다른 부분은 위에서 설정한 것과 동일하다. 자세한 내용은 squid 웹 사이트의 FAQ에 여러 운영체제에서 설정하는 방법에 대해 잘 나와 있다.


    # 가상 호스트 기반의 리버스 캐시를 사용하도록 한다.httpd_accel_host virtualhttpd_accel_port 0# 프록시 캐시와 리버스 캐시의 기능을 모두 사용하도록 한다.httpd_accel_with_proxy on# Host: 헤더에 기반하여 서로 다른 호스트를 캐싱할 수 있도록 한다.httpd_accel_uses_host_header on

    점검이 끝났으면 squid를 다시 시작해 두자. 그 다음은 방화벽인데, 보통은 NAT를 사용하는 경우 다음과 같이 방화벽이 설정되어 있을 것이다.

    00050 divert 8668 ip from any to any via fxp000100 allow ip from any to any via lo000200 deny ip from any to 127.0.0.0/800300 deny ip from 127.0.0.0/8 to any65000 allow ip from any to any
    여기서 divert 룰 앞에 다음과 같은 규칙을 집어넣는다.
    # ipfw add 30 fwd 192.168.1.1,3128 tcp from 192.168.1.0/24 to any 80 via fxp0
    이 규칙의 의미는 fxp0를 통해 192.168.1.0/24 네트워크에서 외부의 80번 포트(웹 접속을 뜻한다)로 가는 모든 TCP 접속을 192.168.1.1의 3128번 포트로 재전송하라는 의미이다. 여기서 3128번 포트에 투명 방화벽으로 설정된 웹 캐시가 떠 있는 경우, 외부로 나가는 모든 HTTP 접속은(80번 포트만) 이 캐시를 거치게 된다. 이렇게 설정하면 클라이언트의 모든 HTTP 접속은 강제적으로 캐시를 통하게 된다. squid.conf에서는 더 복잡한 접근 제어 설정이 가능하므로 이를 응용하면 특정 사이트의 접근을 막거나(물론 anonymizer 등을 사용하는 접근에 대해서는 통제할 수 없다) 하는 여러가지 응용이 가능하다. 캐시를 정말 통하고 있는지를 알아보려면 위에서 사용하였던 Proxy Checker를 사용해 보자. 브라우저 설정 없이도 지금 설정한 프록시를 사용하고 있다고 나와야 한다.

    wwwoffle (www/wwwoffle)

    조금 다른 주제로 오프라인 캐시에 대해서 다루어 보자. 최근의 브라우저는 오프라인 기능이 있어서 인터넷 접속이 안되는 경우에도 이미 캐시에 존재하는 페이지만으로 브라우징이 가능한 기능을 제공하지만, 이를 캐시 수준에서 할 수 있지 않을까? 하는 생각으로 만들어진 것이 wwwoffle 등의 오프라인 캐시이다. 이러한 캐시는 프록시 캐시의 형태로 동작하며, 최대한 캐싱하고 있다가 원래 사이트에 접근이 안되는 경우에도 사용자가 잘 모를 정도로 캐싱하고 있는 데이터를 전송해 준다. 이러한 캐시는 모뎀 등의 저속 환경 사용자, 빈번이 끊어지는 네트워크 환경을 이용하고 있는 사용자에게 매우 유용하다. 가정에서 인터넷 환경을 사용하는 경우라면 조금 무거운 squid보다는 이러한 캐시가 더 유용할 지도 모른다. 대신 wwwoffle는 리버스 캐시 등의 다양한 기능은 이용할 수 없다.

    wwwoffle는 www/wwwoffle 포트를 설치하면 된다. 설치 후에는 설정 파일을 만들기 위해 다음과 같이 템플릿에서 한부 복사해 오면 된다.

    # cd /usr/local/etc# cp wwwoffle.conf.install wwwoffle.conf

    wwwoffle.conf의 설정은 squid보다 더 친절하게 설명되어 있는 관계로 쉽게 설정할 수 있을 것이다. 가장 기본적인 것은 StartUp 부분이다.


    StartUp{ bind-ipv4         = 0.0.0.0#bind-ipv6         = :: bind-ipv6         = none http-port         = 8080 wwwoffle-port     = 8081 spool-dir         = /var/spool/wwwoffle run-uid           = nobody run-gid           = nogroup use-syslog        = yes password          = none max-servers       = 32 max-fetch-servers = 8}

    spool-dir은 squid의 cache_dir과 동일한 옵션이고, wwwoffle는 대몬의 제어를 위해 8081이라는 별도의 포트를 사용한다. 위 사항이 가장 기본적인 것이고, 다른 옵션에 대해서는 나머지 설정 파일을 읽어보면 충분할 것이다. 인상적인 기능은 URL에 따라 캐싱 여부를 결정하는 것과, URL에 따라 또 다른 프록시 서버를 지정할 수 있다는 것이다.

    wwwoffle 대몬을 실행한 후(/usr/local/etc/rc.d/wwwoffle.sh), 이 대몬의 제어는 squid -k와 비슷하게 wwwoffle 프로그램을 사용하면 된다. squid에 없는 재미있는 설정은 온/오프라인 설정이다.

    # wwwoffle -online

    프록시 서버를 온라인 모드로 한다. 모든 웹사이트에 직접 접근 가능한 경우이다.

    # wwwoffle -autodial

    모뎀이나 ISDN 등의 사용자의 경우 필요하면 외부에 접속하지만 네트워크 연결 없이 캐시에서 바로 돌려줄 수 있다면 그렇게 한다.

    # wwwoffle -offline

    외부와 접속이 끊어진 경우, 오프라인 모드로 동작한다. -online이나 -offline의 경우 모뎀 등의 ppp의 시동/종료 스크립트에 넣어두면 편리하다.

    # wwwoffle -fetch

    현재 캐싱된 요청을 모두 다시 읽어들인다.

    그외 설정을 다시 읽으려면 -config, 캐시를 비우려면 -purge, 대몬을 정지시키려면 -kill 옵션을 사용한다. 아마 이정도로도 충분히 재미있게 사용할 수 있을 것이다. 또한 특정 URL을 지정하여 읽어들여 두는 옵션도 가능하다(-O URL). 그외 wwwoffle은 목적에 따라 HTML을 그대로가 아니라 약간 변형하여 캐시에 저장할 수 있는(animated gif를 정지 이미지로 바꾸거나 스크립트 실행을 금지시키는 등) 기능을 제공하므로 설정 파일을 읽어보고 따라해 보도록 하자. 단 이러한 대몬의 단점은 캐싱 기능에 초점을 맞춘 것이므로 조금은 오래된 데이터를 바로 돌려줄 수 있다는 것이 단점이다. 브라우저의 다시 읽기 단추를 사용하거나 항상 online 모드로 두도록 하자.

    그 외의 캐시 활용

    그 외 캐시 서버로 동작하는 것은 광고 제거 서버인 www/junkbuster, www/adzapper 등을 들 수 있다. 이러한 프록시는 웹 페이지 내의 광고 이미지를 빈 이미지로 돌려 주거나 아예 돌려주지 않는다. 이렇게 하면 광고가 많은 사이트의 접속을 빠르게 할 수 있다. dansguardian (www/dansguardian) 도 비슷한 역할을 할 수 있지만 이는 squid와 같이 사용한다. 이외 oops, tinyproxy 등 프록시 역할을 할 수 있는 다양한 프로그램들이 있다.

    고급 주제

    이번 기사에서 다루지 않은 내용 중 더 배워 볼 만한 주제는 다음과 같다. 이후에 웹 캐시 서버를 관리하게 된다면 꼭 한번씩 해 보자.

    • ICP, WCCP 프로토콜 등 캐시에 관련된 다른 보조 프로토콜 배우고 설정하기
    • 리버스 캐시 설정해 보기
    • IE의 자동 프록시 검색 기능을 이용할 수 있도록 설정하기

    끝으로

    이번 기사에서는 웹 캐시의 다양한 활용 방법에 대해 알아보았는데, 집이나 사무실이라면 광고 제거 서버 등은 한번 사용해 보면 편할 것이다. 물론 윈도 등에 설치하는 광고 제거용 프록시(이것도 결국 프록시 캐시로 동작하는 프로그램이다)들도 많이 있지만, 사이트 전체에 적용해 보는 것도 재미있을 것이다.

    2006/09/08 14:32 2006/09/08 14:32
    이 글에는 트랙백을 보낼 수 없습니다
    출처 카페 > ARM Core Commun.. / 한미소
    원본 http://cafe.naver.com/armcore/187

    자료 출처 : http://wiki.kldp.org/KoreanDoc//html/EmbeddedKernel-KLDP/index.html

    임베디드 시스템 엔지니어를 위한 리눅스 커널 분석

    남상규

    http://ruby.medison.co.kr/~halite
    선임 연구원
    (주)메디슨
    초음파 연구소

    halite (at) medison.com

    $Date: 2002/05/21 01:10:08 $

    이 문서는 리눅스 커널을 임베디드 시스템에 포팅하려는 엔지니어들을 위한 기본 지식 습득을 위해 만들어졌다. 리눅스 커널 자체의 원론적인 것 보다는 임베디드 시스템에 리눅스 커널을 포팅할 때 엔지니어가 리눅스 커널에 쉽게 접근하기 위한 정보나 혹은 방법을 제공하는 것이 목적이다. 그러므로 OS에 대한 이론 보다는 OS가 만들어지는 방법이나 부팅되는 순서 메모리에 적재되고 실행되는 순서 등에 대해 기술하고 더불어 커널을 만들기 위해 필요한 도구들의 사용법에 대해 알아본다.

    원문은 http://ruby.medison.co.kr/~halite 에있고 가장 먼저 업데이트될 것이다.

    틀린 내용이 있을 수도 있다. 이런 것에 대해선 으로 연락 바란다.

    $Revision: 1.13 $

    차례
    1. 리눅스 커널 컴파일하기
    1.1. 리눅스 일반
    1.1.1. 왜 리눅스인가?
    1.1.2. 리눅스 소스 디렉토리 구조
    1.2. LXR
    1.3. 소스 코드 얻기
    1.4. 소스 코드 풀기
    1.5. 컴파일 준비
    1.6. 커널 설정
    1.7. 커널 컴파일
    1.8. 커널 테스트 및 설치
    2. Makefile 분석
    2.1. 부팅 과정의 이해[1]
    2.2. 커널 이미지 파일의 구조
    2.2.1. 커널의 부팅
    2.2.2. zimage와 bzImage의 차이
    2.3. bzimage가 만들어지는 과정 추적-Makefile 분석
    2.3.1. $(topDIR)/Makefile
    2.3.2. $(topDIR)/arch/i386/Makefile
    2.3.3. $(topDIR)/arch/i386/boot/Makefile
    2.3.4. $(topDIR)/arch/i386/boot/compressed/Makefile
    2.3.5. $(topDIR)/arch/i386/boot/tools/build.c
    2.4. bzImage가 만들어지는 과정 추적-Log 분석
    2.4.1. make bzImage 순서 정리
    2.4.2. Log
    2.5. 단계별 자세한 분석
    2.5.1. -Ttext 0x0의 의미
    2.5.2. 분석
    3. 크로스 컴파일러 만들기
    3.1. 크로스?
    3.2. 툴체인
    3.2.1. 배경
    3.2.2. 미리 만들어진 툴체인
    3.2.3. 툴체인 만들기
    4. ARM 리눅스
    4.1. ARM 프로세서 MMU(Memory Management Unit)
    4.1.1. 개요
    4.1.1.1. TLB
    4.1.1.2. 메모리 접근
    4.1.1.3. 변환 테이블
    4.1.1.4. 도메인
    4.1.2. 변환 절차
    4.1.3. 변환 테이블 베이스
    4.1.4. 1레벨 읽기
    4.1.5. 1레벨 디스크립터
    4.1.6. 섹션 디스크립터와 섹션 변환
    4.1.7. 페이지 테이블 디스크립터
    4.1.8. 2레벨 디스크립터
    4.1.9. 큰 페이지 변환
    4.1.10. 작은 페이지 변환
    4.1.11. 캐시와 쓰기 버퍼 제어
    4.1.12. 접근 권한
    4.2. Assabet 보드용 커널 컴파일
    4.3. ARM 리눅스 Makefile 분석
    4.3.1. $(TOPDIR)/arch/arm/Makefile
    4.3.2. $(TOPDIR)/arch/arm/vmlinux.lds
    4.3.3. $(TOPDIR)/arch/arm/boot/compressed/vmlinux.lds
    4.3.4. Log 분석
    4.4. 소스 분석
    4.4.1. arch/arm/boot/compressed/head.S
    4.4.2. arch/arm/kernel/head-armv.S
    5. 리눅스 커널 부팅
    5.1. 커널 시작
    5.2. lock_kernel()
    5.2.1. Lock이 왜 필요하지?
    5.2.2. Lock - 기초적 설명
    5.2.3. i386, ARM의 스핀락
    5.3. setup_arch()
    5.4. trap_init()
    5.5. init_IRQ()
    5.6. sched_init()
    5.7. init()
    5.8. dmesg 정리
    6. 디바이스 드라이버
    6.1. 디바이스 번호
    6.2. 샘플 디바이스 드라이버
    6.3. 모듈 동작의 이해
    6.4. 알아야할 것 들
    A. SEGA DreamCast Linux
    A.1. LinuxSH
    A.2. 드림캐스트에서 리눅스 실행해 보기
    B. 리눅스에 시스템 콜 만들어 넣기
    B.1. 시스템 콜의 흐름
    B.2. IDT(Interrupt Descriptor Table)
    B.3. 시스템 콜 테이블
    B.4. 시스템 콜 추가
    C. Inline Assembly
    C.1. 인라인 어셈블리 기초
    C.1.1. 알아야할 것 들
    C.1.2. 어셈블리
    C.1.3. Output/Input
    C.1.3.1. Constraints
    C.1.3.2. Modifier
    C.1.3.3. ARM Family Constraints
    C.1.3.4. i386 Family Constraints
    C.2. 사례 분석
    C.2.1. strcpy()
    C.2.2. _set_gate()
    2006/09/08 14:29 2006/09/08 14:29
    이 글에는 트랙백을 보낼 수 없습니다
    웅쓰:웅자의 상상플러스
    웅자의 상상플러스
    전체 (379)
    게임 (5)
    영화 (2)
    기타 (23)
    맛집 (5)
    영어 (2)
    대수학 (3)
    형태소 (5)
    Hacking (9)
    Linux (112)
    HTML (48)
    Application_developing (48)
    Web_developing (102)
    Window (11)
    «   2025/04   »
        1 2 3 4 5
    6 7 8 9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30      
    1. 2016/01 (1)
    2. 2015/12 (3)
    3. 2015/10 (3)
    4. 2015/03 (2)
    5. 2015/01 (4)