아직 DBCP 와 Connection Pooling 의 차이를 잘 모르겠지만 일단 기초적인 Connection Pooling 을 사용하고 있다.

다음은 Connection Pooling 을 지원하는 클래스이다.

ConnectionManager.java


package net.rukikuki.db;

import java.sql.Connection;
import java.sql.SQLException;

import snaq.db.ConnectionPoolManager;

/**
 * Connection Pooling의 Connection 객체를 관리하는 클래스.
 */
public class ConnectionManager {
   
    /**
     * Connection 객체를 반환하는 메써드.
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
       
   
        ConnectionPoolManager dbm = ConnectionPoolManager.getInstance();
         return dbm.getConnection("mysql");
        }
}

이 ConnectionManager 를 사용하기 위해서는 일단 dbpool.properties 를 설정해서 jdbc드라이버를 통해 DB에 접속해야 한다.

오늘 MySQL 에 간단한 질의를 던지고 결과를 받는 프로그램을 만들어 봤다. 폼에 검색조건을 입력하고  버튼을 누르면 데이터를 가져오는 프로그램이다.

문제는 submit 하면 다음 페이지로 넘어가지도 않고 Exception 도 발생하지 않는 애매한 상황이 발생했다.

일단 my.cnf 에 Error Log 외의 일반 로그도 기록하도록 설정했다.

[mysqld]
log            = /opt/local/var/run/mysql5/mysql/mysqld.log   //일반로그
log-error    = /opt/local/var/run/mysql5/mysql/mysqld.err   //에러로그


일반로그의 내용은 주로 쿼리의 실행과 결과를 리턴하는 과정이다.

추적하여 얻어낸 결론은 JDBC 설정의 지정된 인코딩과 DB의 인코딩이 다르면 UserID 와 Password 가 제대로 전달되지 못해 로그인 처리에 실패한다는 것이다.

 26925 Init DB     Access denied for user ''@'localhost' to database 'devspace'
          26926 Connect     nobody@localhost as anonymous on

=>  사용자 아이디 가 전달되지 않았다.

3003 Connect     Access denied for user '"devid"'@'localhost' (using password: YES)

=> mysql.user="devid" 로 설정했을 때 (아이디를 "devid"  로 인식)


47639 Connect     Access denied for user 'devid'@'localhost' (using password: YES)

=> mysql.password="패스워드" 로 설정했을때 (패스워드를 "패스워드" 로 인식)


여튼 다음과 같이 설정하면 된다.


dbpool.properties

drivers=org.gjt.mm.mysql.Driver
 
#mysql.url=jdbc:mysql://localhost:3306/devspace?useUnicode=true&characterEncoding=utf8
mysql.url=jdbc:mysql://localhost:3306/devspace?useUnicode=false&characterEncoding=euckr

mysql.user=devid

mysql.password=1234321

mysql.initsize=5

mysql.maxpool=10


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

my.cnf


[mysqld]
#skip-networking
#user                           = mysql
default-character-set          = euckr
character-set-server           = euckr
default-collation              = euckr_korean_ci
#port                           = 3306
#default-character-set          = utf8
#character-set-server           = utf8
#default-collation              = utf8_general_ci
#socket                         = /opt/local/var/run/mysql5/mysqld.sock
socket                         = /tmp/mysqld.sock
#pid-file                       = /opt/local/var/run/mysql5
log-error                      = /opt/local/var/db/mysql5/mysqld.err
log                            = /opt/local/var/db/mysql5/mysqld.log
datadir                         = /opt/local/var/db/mysql5
#default-character-set           = utf8
lower_case_table_names=1

#Path to the character-sets directory.
character_sets-dir=/opt/local/share/mysql5/mysql/korean




[client]
#default-character-set=utf8
character-sets-dir=/usr/share/mysql/charsets
default-character-set=euckr

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

euc-kr 환경과 utf8 환경으로 바꾸려면 각각의 코멘트처리를 바꿔주면 된다.







,
원글 : http://wiki.bawi.org/index.php/MacPorts


1. xcode 다운로드 및 설치 / X11 설치
   
    - 처음 샀을때 동봉된 xcode 보단 최신버전 쓰는게 좋다.
    - X11 은 DVD에 있는거 쓰는게 나은듯.


2. MacPorts 다운로드 및 설치
 
    - Leopard / Tiger / 10.4 이전버전 용이 따로 준비되어 있으니 알맞는걸 설치


3. 명령어 소개

   - 설치
     port -v install    [패키지 명]
     port -v upgrade [패키지 명]
  
  
  - 정보갱신
     port -v selfupdate
     패키지 트리를 갱신한다.

  - 현황파악
     port -v outdated
        최신버전이 나와, 구버전이 되어버린 패키지를 확인
     port -v upgrade outdated
        구 버전이 된 패키지들을 업그레이드함.
     port -vf uninstall inactive
        구 버전이 된 패키지들을 삭제.
 
  - 패키지 정보 파악
     port -v  info [패키지 명]      -  패키지 정보 파악
     port -v  deps [패키지 명]     -  패키지 의존성 정보 파악

  - 기타 옵션
      -v   :  Vervose
      -f    : Force
      -u   : upgrade 시 Deactivated 된 패키지 자동삭제


원글 : http://wiki.bawi.org/index.php/MacPorts
원글을 제가 다시 요약한 것입니다.


  


,


크게 바이너리 설치와 소스 설치로 나눌 수 있다.

바이너리 패키지는 설치가 쉬운 반면, 업그레이드 시 기존 DB를 덮어쓰는 문제가 있다고 한다.

소스설치는 번거롭긴 한데, 업그레이드가 쉽고 세밀하게 권한설정을 줄 수 있어 좀 더 보안성을 높일 수 있고, 그밖에도 여러모로 유연한 점이 많은 모양이다.

이런 소스설치의 강점과 바이너리 패키지의 편리함을 같이 누릴 수 있는 방법이 있는데 BSD계열의 ports 패키지 관리시스템을 사용하는 것이다.

일단 ports를 설치하고 설정(요약본)한 다음 MySQL을 설치해 보자.

I. 설치

sudo port -v upgrade mysql5 +server

II. 환경설정

/opt/local/etc/mysql5/my.cnf 에 환경설정.
(Mac OS X 10.4 Tiger 의 경우에는 /etc/my.cnf 에 설정파일이 있었던걸로 기억한다)

환경설정 파일 예제(my.cnf)
------------------------------------------------------------------
[mysqld]
#skip-networking
user                           = mysql
#default-character-set          = euckr
#character-set-server           = euckr
#port                           = 3306
#socket                         = /opt/local/var/run/mysql5/mysqld.sock
#socket                         = /tmp/mysqld.sock
#pid-file                       = /opt/local/var/run/mysql5
log-error                      = /opt/local/var/db/mysql5/mysqld.err
log                              = /opt/local/var/db/mysql5/mysqld.log
datadir                         = /opt/local/var/db/mysql5
default-collation               = utf8_general_ci
default-character-set           = utf8
lower_case_table_names=1

[client]
default-character-set=utf8

------------------------------------------------------------------
위는 my.cnf 예제이다 기동을 위해 필수적인 기본사항만 여기서 일단 소개하기로 한다.
(# 은 아시다시피 주석입니다. 아래 내용을 참고하여 자신의 상황에 맞게 설정하시고 주석을 해제하셔야 합니다!! )

1. 인코딩 설정

ㄱ, EUC-KR

default-chracter-set = euckr
character-set-server = euckr
default-collation = euckr_korean_ci
default-character-set = euckr


ㄴ. UTf-8

default-character-set = utf8
character-set-server  = utf8
default-collation         = utf8_general_ci
default-character-set           = utf8


2. Logging 설정

log-error                      = /opt/local/var/db/mysql5/mysqld.err
log                              = /opt/local/var/db/mysql5/mysqld.log


여기서 log-error 지시자는 mysql 쿼리중 에러만 기록하는 로그파일을 지정한다
log 지시자는 mysql 접속부터 쿼리 내역, 성공적인 실행 여부까지 저장하는 로그파일을 지정한다

물론 log 지시자는 Deployment 머신에서 쓰면 로그파일로 루트드라이브가 꽉 찰 수 있으니 개발시에만 사용하도록 하자.

3. MySQL DB 유형 및 세부셋팅

MySQL 에서 DB타입이 3가지가 있다는 것은 알고 계실것이다.
각 타입에 맞는 cnf 파일이 /opt/local/share/mysql5/mysql 디렉토리에 있으니 참조하시길 바란다.
--------------

III. 기본 데이터베이스 설치 및 관리자 암호 설정

그리고 기본 DB를 install

sudo -u mysql  mysql_install_db5 --user=mysql

(만일 뒤에 --user 스위치를 붙이지 않고 실행했다면.. DB디렉토리 및 하위파일의 소유자를 mysql:admin 으로 바꿔줘야 한다. )


IV. MySQL 기동 및 관리자 암호 설정

mysql5.wrapper 스크립트를 /opt/local/bin 으로 카피.

sudo -u mysql mysql5.wrapper start 로 띄워보자.

만약 설치 명령시 +server 라는 Variant 를 추가해서 설치하지 않았다면 mysql5.wrapper 가 없을 것이다. 그럴 경우 아래 명령을 통해 기동할 수 있다

cd /opt/local ; /opt/local/lib/mysql5/bin/mysqld_safe &


만약 실패한다면 다음것을 체크.
1) /opt/local/var/run/mysql5 디렉토리가 존재하며 소유자가 mysql:admin 인가.

2)  /opt/local/var/db/mysql5 (DB디렉토리) 가 존재하며 소유자가 mysql:admin 인가.

그래도 뭔가 문제가 있다면, /opt/local/var/db/mysql5 내에 로그파일이 생성되나 확인하고 생성된다면 tail  이나 콘솔로 에러를 확인해 본다.


DB 기동을 확인했다면 마지막으로 mysql 관리자 암호를 설정해야 한다.

sudo /opt/local/lib/mysql5/bin/mysqladmin -u root password '암호문자열'


원격 호스트의 암호를 변경하려면 아래와 같이 호스트를 지정할 수 있다

/opt/local/lib/mysql5/bin/mysqladmin - u root -h '호스트이름' password 'new-password'
(위의 명령은 한줄이다.. 한줄에 다 칠 것 -_-;;; )

여기서 new-password 부분을 자신의 암호로 대체해서 명령하면 된다

암호문자열 부분을 여러분이 원하는 암호로 치환하여 관리자 암호를 설정한 다음  접속해 보자

mysql5 -u root -p

암호를 물을것이다. 정한 암호를 넣어  콘솔이 기동된다면 성공.

만약 기동되지 않는다면 /opt/local/var/run/mysql5/mysqld.sock 파일이 생성되었는지 확인할 것.
my.cnf 에서 이 소켓파일 생성을 지정하였음에도 불구하고 생성되지 않았다면 시스템상에 다른 문제가 있는것이다.


끗. ㅋㅋ

----------------------
내가 설정한것

1.  시스템 시작시 MySQL 이 시작되게 하지 않는다.
     Lingon 에서 자동시작 끔.
     아니면 /opt/local/etc/LaunchDaemons/org.macports.mysql5/org.macpots.mysql5.plist 를
     Property List Editor 나 vim 으로 RunAtLoad 항목을 No 로 설정하면 된다.
  
2.  소켓이 /tmp 에 생성되어야  CocoaMysql 을 사용할 수 있다고 한다.
     다른 프로그램들도 /tmp/mysqld.sock  을 많이 찾는다는 듯
    
my.cnf 에서 소켓파일생성을 지정한 부분에서 기본값을  /tmp/mysqld.sock  로 바꾸고 mysql5.wrapper 시작시 /tmp/mysqld.sock -> /opt/local/var/run/mysql5/mysqld.sock 으로 심볼릭링크를 작성하게 함
 
   

3. 인코딩 euckr 설정.  잘 된다.
4. 일반쿼리로그 작성.
    일단 위의 my.cnf 대로 하면 로그인,쿼리내역등이 로깅된다. 필요할 때만 활용하자.
5. ODBC로 데이터가 깨져서 들어갈때 인코딩 주의할 것. (서버인코딩과 클라이언트 ODBC 드라이버 인코딩이 일치해야 함)


----------------
ports 같은 사심어린 툴 따위 사용하지 않고, 직접 소스컴파일 설치하시겠다는 분들은 여기.
또는 인스톨 프로그램을 사용하지 않고,  직접 바이너리 설치하시겠다는 분들은 이것을 참고하세요
추가로 MySQL 보다는 "남자라면 오라클" 이라고 하시는 분들은... Mac OS X Server 를 구매하셔야 합니다 ;;


사족 :

이번에 제 머신에 재 설치를 하기위해 이 메뉴얼을 보다가, 최근에 변경된 부분인, 환경설정 파일의 경로와 이전에 미쳐 신경쓰지 못했던 관리자암호 변경 부분을 추가했습니다.

환경설정 파일 내역은 당연히 사용하시는 분들께서 customize 하실거라고 생각해서 저렇게 주석을 포함한 상태로 보여드렸었는데,  한번도 mysql 을 *nix 계열에서 설치해 보지 않으신 분들께 혼란을 드릴 여지가 있기에 설명을 추가했습니다.
,

Mac OS X 에서 NTFS Read/Write 가 된다며 기뻐하시던 많은 분들께 이 글을 바칩니다.

얼마전 NTFS-3g 를 통한 엑세스를 소개해 드렸습니다만, 한글 파일을 읽거나 쓰는데 많은 불편함이 있었던게 사실입니다.

어떤 때는 인식조차 안되기도 하고, 파일이름이 깨져  chkdsk 에 의해 뜯겨나가는 경우도 많았습니다만, 여튼 NTFS-3g 를 사용해 한글 파일을 사용하기 입니다.

아래와 같은 명령어를 터미널에서 타이핑 후 엔터 해주시면 되겠습니다.

echo 'ko_KR.UTF-8' > /Volumes/드라이브볼륨이름/.ntfs-locale


출처 : http://x86osx.com/bbs/view.php?id=osxtips&no=258&ksn=0&kss=0&ksc=0&kst=1&ksm=0&kw=:ntfs:


,
예전에 windows에서 경로의 최대 길이(MAX_PATH)가 너무 작아서 고생을 한적이 한번 있다. 실제로 사용할수 있는 최대 길이는 230자가 조금 넘었던 걸로 기억하는데, 그 한계를 극복할 만한 해결책을 결국은 못 찾아서 결국은 꼼수로 피해가고 말았었는데, 그 한계를 피해 가는 방법을 우연히 발견했다.


여기에서 보다시피 경로명의 시작을 "//?/"로 하면, 즉 "\\?\D:\" 처럼 써주면 win32 api level에서는 32,000자까지 받아 들인다고 한다(중간의 shell이 잘라먹지 않는이상).

출처 : http://reply.tistory.com
,

시작부터 이야기 하면 이것은 /proc 에 관한 이야기이다

mount -t proc proc /mnt/gentoo/proc 명령은 젠투를 설치한 사람이라면 한번씩은 사용하는 명령어인데

이 proc 라는건 현재 실행중인 리눅스 시스템의 각종 상태를 보여주는 가상 파일시스템이다.
(실제로는 파일이 아니라, 상태를 파일화 해서 보여주는 것이라는 뜻)

상태를 보여준다는 측면도 있지만 실제로 이 상태가 커널의 파라미터로써 현재 동작하고 있는 커널의 설정값으로 이해한다면, 이 값을 변경해서 커널의 동작을 변경함으로써 시스템을 조절할 수 있음 역시 알 수 있을 것이다.

예를들면 /proc/sys/net/ip_forward 의 내용을 1 로 변경하여 ip 프로토콜의 포워딩을 가능하게 설정할 수 있다.
(리눅스로 라우터를 만든다면 반드시 패킷포워드가 설정되어야 하므로 필수적인 셋팅이다)

다만 실제 파일이 아니며, 커널이 특정 작업의 결과를 반영하여 보여주는 것 이므로 에디터로 내용을 바꾸는 것은 그다지 좋은 방법이 아니다.

그래서 리다이렉션등을 사용해서 변경해 주는것이 좋음을 잊지 말자.


이정도가 내가 원문에서 가장 기억에 남는 내용이고
더 자세한 정보와 팁은 아래 원문을 참조하길 바란다.

출처 : ibm

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

실행중인 리눅스 관리하기
/proc 파일시스템은 리눅스의 탁월한 특징 중 하나이다. 이를 통해 머신을 끄고 재부팅 하지 않고 OS의 상세한 부분들을 관리할 수 있다.

상업적으로 매우 중요한 시스템을 관리해 본 사람이라면 업타임(uptime)의 가치를 안다. 역으로 말하면 다운타임(downtime)으로 인해 사용자들로부터 듣게될 원성으로 인한 두통을 알 것이다. 기업이 유닉스 서버를 실행하는 이유 중 하나는 유닉스의 신뢰성과 안정성 때문이다. 주의 깊게 관리된다면 한 동안 재부팅 할 필요 없이 지내게 된다. 게다가 서버를 실행상태로 유지하면서 커널 레벨에서 관리 작업도 수행할 수 있다. 하드웨어를 업그레이드하기 위해 시스템을 재시작 해야 하거나 누군가가 전원 코드를 실수로 뺄 수 있다면 서비스에 피해를 주지 않고 관리작업을 수행하는 것을 알아두는 것이 좋다.

이 글에서는 재부팅 없이 다양한 관리 작업을 수행하고 시스템을 변경할 수 있는 방법이 소개되어 있다. 리눅스는 시스템을 실행 상태로 유지 시킨 채 리눅스 기저의 값과 설정을 변경하는 다양한 방법을 제공한다.

Note: 본 자료는 2.4 레벨 커널 기준이다. 일부 옵션과 기능은 다른 커널 버전과 다를 수 있다.

실행중인 커널 매개변수 변경하기

리눅스는 시스템이 실행중인 동안 커널/시스템을 재부팅 할 필요 없이 관리자들이 커널을 변경할 수 있는 깔끔한 방법을 제공한다. 이는 /proc 이라고 하는 가상 파일시스템으로 수행된다. Linux Gazette는 /proc에 관한한 가장 간단하고 쉬운 레퍼런스를 제공한다. (참고자료) 기본적으로 /proc 파일시스템은 실행 커널을 볼 수 있는 시각을 제공한다. 이는 퍼포먼스를 감시하고 시스템 정보를 발견하며 시스템이 어떻게 설정되었는지를 파악하고 그 설정을 변경할 때 유용하다. 이러한 파일시스템을 가상 파일시스템(virtual filesystem)이라고 한다. 실제 파일시스템이 아니기 때문이다. 이것은 일반적인 파일시스템 구조에 어태치된 커널에 의해 제공되어 이에 액세스 할 수 있게 한다.

시스템이 실행중일 때 실행중인 커널 매개변수를 변경하는 몇 가지 방법이 있다는 사실은 커널 설정 변경에 상당한 힘과 유연성을 시스템 관리자들에게 제공해준다고 볼 수 있다. 이러한 유형의 구현은 일부의 리눅스 커널 개발자들에게 영감을 주는 생각이었다. 하지만 힘도 너무 크면 오히려 나쁠 수도 될 수 있지 않은가? 가끔 그렇다. /proc 파일시스템에 있는 무엇인가를 변경한다면 변경하려는 것이 무엇이고 시스템에 미칠 영향에 대해 반드시 알아야한다. 이들은 실제로 유용한 기술이지만 잘못된 행동은 원치 않는 결과를 가져다 줄 수 있다. 이런 작업이 처음이거나 변경으로 인한 결과를 확신하지 못한다면 중요하지 않는 머신에 연습을 먼저 하기 바란다.

어떻게 변경 할 것인가?

우선 커널에 변경을 가하지 않는 방법을 생각해보자. /proc 파일시스템으로 곧바로 뛰어들어 텍스트 에디터에 있는 파일을 열고 변경을 수행하고 파일을 저장하면 안될 두 가지 중요한 이유가 있다:

  • 데이터 무결성: 모든 파일들은 실행 시스템을 나타내고 있고 커널이 언제라도 이들 파일 중 어떤 것이라도 변경할 수 있기 때문에 시스템이 데이터를 실행중일 때 에디터를 열고 데이터를 변경한다면 저장을 한다고 해도 커널이 기대하는 것과 다를 수 있다.
  • 가상 파일: 모든 파일들은 실제로 존재하는 것이 아니다. 저장된 데이터가 어떻게 동기화 될 수 있겠는가?

따라서 이러한 파일들을 변경할 때의 답은 에디터를 사용하지 않는 것이다. /proc 파일시스템에 있는 모든 것을 변경할 때 echo 명령어를 사용하고 명령행에서 온 아웃풋을 /proc 밑의 선택된 파일에 리다이렉트 해야한다:

echo "Your-New-Kernel-Value" > /proc/your/file

이와 비슷하게 /proc 에서 정보를 보고싶다면 그 목적에 맞게 설계된 명령어를 사용하거나 cat 명령어를 사용한다.

무엇을 변경 할 것인가?

/proc을 잘 사용하기 위해 커널 해커가 될 필요가 없다. 이 파일시스템의 구조에 대한 기본적인 이해만으로도 충분히 도움이 된다.

/proc에 있는 각각의 파일들은 매우 특별한 파일 권한들을 할당받았고 특별한 사용자 아이디에 의해 소유된다. 이는 매우 신중하게 수행되어 정확한 기능이 관리자와 사용자들에게 보일 수 있도록 한다. 특별한 권한이 개별 파일에 어떤 일을 수행하는지를 다음과 같이 요약했다:

  • Read-only: 사용자가 변경할 수 없는 파일: 시스템 정보를 나타내는데 사용됨.
  • Root-write: 파일이 /proc에서 쓰기가 가능하다면, 루트(root) 사용자만 쓸 수 있음.
  • Root-read: 일반적인 시스템 사용자는 볼 수 없고 루트 사용자만 볼 수 있는 파일.
  • Other: 여러가지 이유로 위 세 개의 경우가 섞인 것도 있다.

/proc에 대한 매우 광범위한 일반화는 /proc/sys 디렉토리를 제외하고 대부분 읽기 전용이라는 것을 알게 될 것이다. 이 디렉토리는 대부분의 커널 매개변수를 갖고 있으며 시스템이 실행되는 동안 변경되도록 설계되었다.

Making changes

/proc의 각 파일에 대한 정확한 정보와 사용법을 이 글에서는 다루지 않겠다. 이 글에서 다루어지지 않은 /proc 파일에 대한 자세한 정보의 경우, 최상의 소스는 리눅스 커널 소스 그 자체일 것이다. 매우 훌륭한 문서까지 포함되어 있다. /proc에 있는 다음 파일들은 시스템 관리자들에게 유용하다.

/proc/scsi

시스템 관리자로서 배워두면 가장 유용할 것 중 하나이다. 사용가능한 핫스왑(hot-swap) 드라이브가 있을 때 시스템을 재부팅하지 않고 더 많은 디스크 공간을 추가하는 방법이다. /proc을 사용하지 않고, 드라이브를 삽입할 수 있으나 시스템이 새로운 디스크를 인식하도록 하려면 재부팅해야 한다. 다음과 같은 명령어로 새로운 드라이브를 시스템이 인식하도록 할 수 있다:

echo "scsi add-single-device w x y z" > /proc/scsi/scsi

이 명령어가 올바르게 작동하도록 하려면 매개변수 값인 w, x, y, z를 정확히 해야한다:

  • w는 첫 번째 어댑터가 0 인 호스트 어댑터 ID 이다.
  • x는 첫 번째 채널이 0 인 호스트 어댑터 상의 SCSI 채널이다.
  • y는 디바이스의 SCSI ID 이다.
  • z는 첫 번째 LUN이 0 인 LUN 넘버이다.

디스크가 시스템에 추가되면 이전에 포맷된 파일시스템들을 마운트하거나 포맷을 시작할 수 있다. 디스크가 어떤 디바이스가 도리지 불확실하거나 기존에 존재하는 파티션을 점검하고 싶다면 fdisk -l 같은 명령어를 사용하면 된다.

바꿔 말하면 재부팅 필요 없이 시스템에서 디바이스를 제거하는 명령어는 다음과 같다:

echo "scsi remove-single-device w x y z" > /proc/scsi/scsi

이 명령어를 입력하고 시스템에서 핫스왑 SCSI 디스크를 제거하기 전에 디스크에서 파일시스템을 먼저 언마운트한다.

/proc/sys/fs/

/proc/sys/fs/file-max
이것은 할당받을 수 있는 최대 파일 핸들 수를 지정한다. 열린 파일의 최대 수가 다 되었기 때문에 더 이상의 파일을 열 수 없다는 에러 메시지를 사용자가 받는다면 이 값을 늘려야한다. 수는 제한 없이 설정될 수 있고 파일에 새로운 숫자 값을 작성하여 변경할 수 있다.

기본 설정: 4096

/proc/sys/fs/file-nr
이 파일은 file-max와 관련이 있고 세 개의 값을 보유하고 있다:

  • 할당받은 파일 핸들의 수
  • 사용된 파일 핸들의 수
  • 최대 파일 핸들의 수
이 파일은 읽기 전용이며 정보 전달만을 목적으로 한다.

/proc/sys/fs/inode-*
"inode"라는 이름으로 시작하는 모든 파일은 "file"로 시작하는 파일과 같은 작동을 수행하지만, 파일 핸들 대신 inode와 관련된 작동을 수행한다.

/proc/sys/fs/overflowuid & /proc/sys/fs/overflowgid
이것은 16 비트 사용자와 그룹 ID를 지원하는 모든 파일시스템용 User ID (UID)와 Group ID (GID)를 갖고있다. 이 값들은 변경될 수 있지만 원하면 그룹과 패스워드 파일 엔트리를 변경하는 것이 더 쉽다.

기본 설정: 65534

/proc/sys/fs/super-max
이것은 수퍼 블록 핸들러의 최대 수를 지정한다. 마운트 한 모든 파일시스템은 수퍼 블록을 사용하여 많은 파일시스템들을 마운트하더라도 실행 될 수 있도록 할 수 있다.

기본 설정: 256

/proc/sys/fs/super-nr
현재 할당된 수퍼 블록의 수 이다. 이 파일은 읽기 전용이며 정보 전달만을 목적으로 한다.

/proc/sys/kernel

/proc/sys/kernel/acct
프로세스 어카운딩이 로그를 포함하고 있는 파일시스템 상의 빈 공간의 양을 기반을 해서 발생할 경우를 제어하는 세 개의 설정 가능한 값을 갖고있다:

  1. 빈 공간이 이 비율 이하가 되면 프로세스 어카운팅은 멈춘다.
  2. 빈 공간이 이 비율 이상이 되면 프로세스 어카운딩이 시작된다.
  3. 다른 두 개의 값이 검사되는 (초당) 빈도수.
이 파일에서 값을 변경하려면 스페이스로 분리된 숫자 리스트로 echo 해야한다.

기본 설정: 2 4 30

이 값들은 로그를 포함하고 있는 파일시스템의 빈 공간이 2% 미만이라면 어카운팅을 멈춘다. 그리고 빈 공간이 4% 이상 이라면 다시 시작한다. 검사는 30초 마다 이루어진다.

/proc/sys/kernel/ctrl-alt-del
이 파일은 시스템이 ctrl+alt+delete 키 조합을 받을 때 어떻게 반응하는지를 제어하는 바이너리 값을 갖고 있다. 두 개의 값은 다음과 같은 것을 나타낸다:

  1. 0 값은 ctrl+alt+delete가 트랩(trap)되어 init 프로그램으로 보내지는 것을 의미한다. 셧다운 명령어를 입력한 것 처럼 시스템이 정지하고 재시작하도록 한다.
  2. 1 값은 ctrl+alt+delete 트랩되지 않고 어떤 깨끗한 셧다운도 수행되지 않을 것을 의미한다. 전원을 끈 것과 같은 이치이다.

기본 설정: 0

/proc/sys/kernel/domainname
이를 사용하여 네트워크 도메인 이름을 설정할 수 있다. 기본 값이 없으며 이미 설정되었을 수도 아닐 수도 있다.

/proc/sys/kernel/hostname
기본 값이 없으며 이미 설정되었을 수도 아닐 수도 있다. 네트워크 호스트 이름을 설정할 수 있다.

/proc/sys/kernel/msgmax
이것은 하나의 프로세스에서 다른 프로세스로 보내질 수 있는 최대 메시지 사이즈를 지정한다.

기본 설정: 8192

/proc/sys/kernel/msgmnb
하나의 메시지 큐에서의 최대 바이트 수를 지정한다.

기본 설정: 16384

/proc/sys/kernel/msgmni
최대 메시지 큐 식별자의 수를 지정한다.

기본 설정: 16

/proc/sys/kernel/panic
"커널 패닉"으로 인해 재부팅 되기 전에 커널이 기다려야 할 시간을 나타낸다. 0초 설정은 커널 패닉 시 재부팅 할 수 없다.

기본 설정: 0

/proc/sys/kernel/printk
중요성을 기준으로 해서 로깅 메시지가 전송될 곳을 지정하는 숫자 값을 갖고 있다:

  1. Console Log Level: 이 값보다 높은 우선순위를 지닌 메시지들은 콘솔에 프린트된다.
  2. Default Message Log Level: 우선순위가 없는 메시지들은 이 우선순위로 프린트된다.
  3. Minimum Console Log Level: Console Log Level이 설정될 수 있는 최소(가장 높은 우선순위) 값.
  4. Default Console Log Level: Console Log Level 용 기본 값.

기본 설정: 6 4 1 7

/proc/sys/kernel/shmall
주어진 지점의 시스템에서 사용될 수 있는 총 공유 메모리 (바이트) 양.

기본 설정: 2097152

/proc/sys/kernel/shmax
커널에 허용된 최대 공유 메모리 세그먼트 사이즈 (바이트)를 지정한다.

기본 설정: 33554432

/proc/sys/kernel/shmmni
전체 시스템을 위한 최대 공유 메모리 세그먼트의 수.

기본 설정: 4096

/proc/sys/kernel/sysrq
0이 아닐 때 System Request Key를 활성화한다.

기본 설정: 0

/proc/sys/kernel/threads-max
커널에서 사용할 수 있는 최대 쓰레드의 수.

기본 설정: 2048

/proc/sys/net

/proc/sys/net/core/message_burst
새로운 경고 메시지를 작성하는데 필요한 시간 (1/10 초); 이 시간동안 받은 다른 경고 메시지들은 누락된다. 시스템을 메시지로 넘쳐나게 하려는 사람들의 "Denial of Service" 공격을 방지하는데 사용된다.

기본 설정: 50 (5초)

/proc/sys/net/core/message_cost
모든 경고 메시지와 관련된 비용의 값을 보유하고 있다. 값이 높을 수록 경고 메시지가 더욱 무시된다.

기본 설정: 5

/proc/sys/net/core/netdev_max_backlog
인터페이스가 커널이 처리할 수 있는 것보다 빠른 패킷을 받았을 때 큐에 허용된 최대 패킷 수를 제공한다.

기본 설정: 300

/proc/sys/net/core/optmem_max
소켓 당 할당된 최대 버퍼 사이즈를 지정한다.

/proc/sys/net/core/rmem_default
수신 소켓 버퍼의 기본 사이즈(바이트) 이다.

/proc/sys/net/core/rmem_max
수신 소켓 버퍼의 최대 사이즈(바이트) 이다.

/proc/sys/net/core/wmem_default
송신 소켓 버퍼의 기본 사이즈(바이트) 이다.

/proc/sys/net/core/wmem_max
송신 소켓 버퍼의 최대 사이즈(바이트) 이다.

/proc/sys/net/ipv4
모든 IPv4와 IPv6 매개변수는 커널 소스 문서에 모두 문서화되었다. /usr/src/linux/Documentation/networking/ip-sysctl.txt 파일을 참조하기 바란다.

/proc/sys/net/ipv6
IPv4와 같다.

/proc/sys/vm

/proc/sys/vm/buffermem
버퍼 메모리에 사용될 총 시스템 메모리(퍼센트) 양을 제어한다. 파일에 공간 분리 리스트를 작성하여 설정될 수 있는 세 개의 값을 갖고 있다:

  1. 버퍼에 사용될 최소 메모리 비율.
  2. 남아있는 시스템 메모리가 적을 경우 시스템 메모리가 없어질 때 시스템은 이 정도의 버퍼 메모리를 유지하려고 한다.
  3. 버퍼에 사용될 최대 메모리 비율.

기본 설정: 2 10 60

/proc/sys/vm/freepages
시스템이 다른 레벨의 빈 메모리에 어떻게 반응할 것인지를 제어한다. 공간 분리 리스트를 파일에 작성하여 설정할 수 있는 세 개의 값이 있다:

  1. 시스템에서 비어있는 페이지의 수가 최소 한계에 다다랐다면 커널에만 더 많은 메모리를 할당하도록 허용된다.
  2. 시스템에서 비어있는 페이지의 수가 이 한계 밑으로 떨어지면 커널은 공격적으로 빈 메모리로 스와핑을 시작하며 시스템 퍼포먼스를 유지한다.
  3. 커널은 이 정도의 시스템 메모리를 빈 상태로 유지할 것이다. 이 밑으로 떨어지면 커널 스와핑이 시작된다.

기본 설정: 512 768 1024

/proc/sys/vm/kswapd
커널이 메모리를 스와핑하도록 어떻게 허용할 지를 제어한다. 공간 분리 리스트를 파일에 작성하여 설정할 수 있는 세 개의 값이 있다:

  1. 커널이 한번에 빈 공간으로 둘 최대 페이지의 수. 스왑으로 대역폭을 늘리려면 이 숫자를 늘린다.
  2. 각 스왑에 대해 커널이 페이지를 빈 곳으로 유지하는 최대 시간.
  3. 한 스왑에서 커널이 작성할 수 있는 페이지의 수. 이것은 시스템 퍼포먼스에 가장 큰 영향을 미친다. 값이 클수록 스와핑 될 데이터는 많아지고 디스크 검색에 사용되는 시간은 줄어든다. 하지만 값이 너무 크면 시스템 퍼포먼스에 역효과를 가져온다.

기본 설정: 512 32 8

/proc/sys/vm/pagecache
/proc/sys/vm/buffermem과 같은 작업을 수행하지만 메모리 매핑과 일반적인 파일 캐싱을 위해 작동한다.




위로


영속적인 커널 설정

/proc/sys 디렉토리에는 어떤 커널 매개변수라도 변경할 수 있도록 편리한 유틸리티가 있다. 이를 사용하여 실행 커널을 변경할 수 있지만 시스템 부트에서 실행되는 설정 파일 또한 있다. 이것은 실행 커널을 변경하고 그들을 설정 파일에 추가시켜 시스템 재부팅 후에도 어떤 변경이라도 남아있게 된다.

이 유틸리티는 sysctl 이라고 하며 sysctl(8)의 맨페이지에 모두 문서화 되어 있다. sysctl용 설정 파일은 /etc/sysctl.conf이며 편집 될 수 있다. sysctl.conf(8)에 문서화되어 있다. Sysctl/proc/sys 밑에 있는 파일들을 변경될 수 있는 개별 변수들로 취급한다. 따라서, 예를 들어, 시스템에 허용된 최대 파일 핸들의 수를 나타내는 /proc/sys 밑의 파일인 /proc/sys/fs/file-maxfs.file-max로 나타난다.

이 예제는 sysctl 표기에서 몇 가지 이상한 점을 드러낸다. sysctl은 can only change variables under the /proc/sys 디렉토리 밑에 있는 변수들을 변경할 수 있기 때문에 변수 이름의 일부는 이 디렉토리 밑에 있는 것으로 가정되는 변수로서 무시된다. 디렉토리 분리자(슬래시, /)는 마침표(.)로 변경되었다.

/proc/sys 에 있는 파일들과 sysctl의 변수들 간 변환에 적용되는 두 개의 간단한 규칙이 있다:

  • 시작부터 /proc/sys를 누락한다.
  • 파일이름에서 슬래시를 마침표로 바꾼다.

이 두 개의 규칙으로 /proc/sys에 있는 모든 파일 이름을 sysctl의 모든 변수 이름으로 바꿀 수 있다. 변수 변환에 대한 일반적인 파일은 다음과 같다:

/proc/sys/dir/file --> dir.file
dir1.dir2.file --> /proc/sys/dir1/dir2/file

변경될 수 있는 모든 변수들을 볼수 있고 이에 더하여 sysctl -a 명령어를 사용하여 그들의 현재 설정을 볼 수 있다.

sysctl를 사용하여 변수들이 변경될 수 있는데 이는 위에 사용된 echo 메소드와 같은 작업을 수행한다:

sysctl -w dir.file="value"

file-max 예제를 다시 사용하여, 다음과 같이 두 개의 메소드 중 하나를 사용하여 이 값을 16384로 변경할 수 있다:

sysctl -w fs.file-max="16384"

또는:

echo "16384" > /proc/sys/fs/file-max

sysctl은 설정 파일을 변경하지 않음을 기억하라. 수동으로 하도록 남겨두었다. 재부팅 후에도 변경을 영속성있게 유지하려면 이 파일을 유지하라.

Note: 모든 배포판이 sysctl을 지원하는 것은 아니다. 이는 특정 시스템의 경우이며, 시스템 부팅 시 실행되도록 하려면 위에 설명된 에코와 리다이렉트 메소드를 사용하여 시작 스크립트에 이 명령어를 추가한다.




위로


시스템 설정을 위한 명령어

시스템이 실행되는 동안 다른 비커널 시스템 매개변수를 변경하고 또한 재부팅 필요 없이 설정을 발효시킬 수 있다. 이들은 주로 서비스, 데몬, 서버로 분류되며 /etc/init.d 디렉토리에 있다. 이 디렉토리에 리스팅될 수 있는 스크립트가 점점 광범위해지기 때문에 여기에서 모든 다양한 설정을 다루기엔 불가능하다. 아래 몇 가지의 예제는 /etc/init.d 스크립트가 다양한 리눅스 배포판에서 어떻게 조작될 수 있는지를 설명하고 있다. 재부팅 필요 없이 설정 데몬과 리로드를 변경하는 것은 유용한 예제이다:

  • 웹 서버 설정 변경과 Apache 리로딩
  • 원하지 않는 inetd 로그인 서비스 제거
  • 네트워크 설정 조작
  • NFS를 통한 새로운 파일시스템 반출
  • 방화벽 시작/중지

우선, 시스템 서비스를 조직하는 일반적인 방법은 직접 /etc/init.d에 있는 스크립트를 통해서이다. 이 스크립트들은 매개변수를 취하여 그들이 제어할 서비스를 조작한다. 유효한 작동이 무엇인지 보기위해 매개변수 없이 스크립트 이름을 입력할 수 있다. 일반적인 매개변수들은 다음과 같다:

  • start: 중지된 서비스 시작
  • stop: 실행되는 서비스 중지
  • restart: 멈춘 후 실행 서비스 시작. 또는 중지된 서비스 시작
  • reload: 연결을 끊지 않은 채 서비스 설정 리로드
  • status: 서비스의 실행 여부를 나타내는 아웃풋

예를 들어 다음의 명령어는 연결된 사용자 세션을 종료하지 않고 xinetd 설정을 리로드 한다:

/etc/init.d/xinetd reload

Red Hat은 service 명령어를 제공하는데 이는 서비스를 조작한다. service 명령어는 스크립트 이름을 타이핑할 때와 같은 기능을 제공한다. 신택스는 다음과 같다:

service script-name [parameter]

예를 들어:

service xinetd reload

SuSE 역시 rc 라는 명령어를 제공한다. 이는 서비스 명령어와 비슷하다. 하지만 명령어와 스크립트 이름 사이에 공간이 없다:

rc{script-name} parameter

예:

rcapache start




위로


참고자료




위로

출처 : http://www-128.ibm.com/developerworks/kr/library/l-adfly.html
,

서버 복구 완료

from My Life/한 일 2007. 3. 2. 01:50


2월28일에 모든 system 패키지를 모두 설치하여 Stage2 로 진입했었다.
이날 Stage2를 백업한 다음, 네트워크 관리도구와 기타 유틸리티, 설정을 잡고 커널다운로드까지 마쳤다

3월1일 어제 커널 컴파일과 삼바, sshd, iptables 설정을 마쳤다.
커널컴파일은 프레임버퍼를 분명 넣었는데도 인식하지 못하고 현재 일반모드로 동작하고 있다.
나머지 모든 셋팅은 성공적이다.

iptables 셋팅을 백업해 둔 것이 너무나 기쁘고 감사했다.

여기에 stage3까지 잡은 셋팅 내역을 잠시 적어둔다

1. ntp-client
2. ntop
3. samba
4. syslog-ng
5. iptables

이 정도이고 /etc/make.profile 은 2006.1의 server 프로필을 가리키도록 했다.


여튼 현재는 데이터 복원중.

지금까지 했던 서버 구축작업 중 (젠투로만!) 가장 빨리 끝났다 ^-^


하나님 감사합니다 (_ _)
,


시스템 이미지 백업본을 믿고 있던 나는, 데이터 파티션을 마운트 해 놓은것을 깜빡 하고

rm -rf / 

.......하는 만행을 저질렀다.. (터얼써억) oTL


뭐 어쩔 수 없지 재설치 하지 뭐. 하고 툭툭 털고 일어났던 것도 잠시.

분명 2006.1 의 stage1 타르볼인데. /usr/portage/scripts/bootstrap.sh 하는 중 다음과 같은 에러를 내며 뻗어버렸다!!

an't locate ExtUtils/MakeMaker/Config.pm in @INC (@INC contains: /etc/perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux /usr/lib64/perl5/vendor_perl/5.8.8 /usr/lib64/perl5/vendor_perl /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux /usr/lib64/perl5/site_perl/5.8.8 /usr/lib64/perl5/site_perl /usr/lib64/perl5/5.8.8/x86_64-linux /usr/lib64/perl5/5.8.8 /usr/local/lib/site_perl .) at /usr/lib64/perl5/5.8.8/ExtUtils/MakeMaker.pm line 7.
BEGIN failed--compilation aborted at /usr/lib64/perl5/5.8.8/ExtUtils/MakeMaker.pm line 7.
Compilation failed in require at Makefile.PL line 11.
BEGIN failed--compilation aborted at Makefile.PL line 11.

!!! ERROR: perl-core/Test-Simple-0.64 failed.
Call stack:
ebuild.sh, line 1546: Called dyn_compile
ebuild.sh, line 937: Called src_compile
ebuild.sh, line 1255: Called perl-module_src_compile
perl-module.eclass, line 136: Called perl-module_src_prep
perl-module.eclass, line 125: Called die

!!! Unable to build! (are you using USE="build"?)
!!! If you need support, post the topmost build error, and the call stack if relevant.


사용자 삽입 이미지

<<< 문제의 사건현장 #1 >>>

실제 /usr/lib/perl5/5.8.8/ExtUtils/MakeMaker 에는 Config.pm 이 없었다.

다른 Config.pm 을 넣으면 에러가 발생하는것은 물론이다.

이럴때 Perl 을 재 설치 할 수 있음 좋겠는데. 하던 차에 모 루마니아 인의 블로그에서 해답을 찾았다.

바보같이.. emerge 에는 --nodeps 라는 스위치가 있었다!! man emerge 해서 생각해 보면 쉬운 문제였는데!!  (rpm 의 -i 와 동일한 역활).

이것으로 Perl 과 Perl 에 필수적이면서 의존적인 패키지들을 설치한다.
(혹시나 해서 libperl만 설치해 봤는데 안된다.. ;ㅅ; )

emerge --nodeps gdbm libperl perl

이런다음 부트스트래핑을 진행하면 잘 된다! >_<
,

서버 깨먹다.

from My Life/한 일 2007. 2. 26. 00:53


사용자 삽입 이미지


모든 삽질은 여기서 시작되었따!! ㅠ_ㅠ




정확하게 말하면 서버를 깨먹었다기 보다도, 하드웨어 이주에 실패했다는 표현이 더 정확하겠다.

내가 패키지 설치에 실패했거나, 설정 오류나 명령어 실패로 OS 를 날린건 아니니까..
(한편으로는 그렇기도 하다 ;ㅅ; )


원래 내 개인 서버는 Pentium 3 Coopermine 에서 돌던 녀석이다 보드는 i815 고 부두 그래픽 카드에 Realtek NIC가 탑재된 녀석.

그런데 문제는 보드의 USB가 인식되지 않아 프린터 설치가 불가능했다.

/dev/lp0 로 (일반 패러렐) 어떻게든 해 보려고 했지만 USB 인터페이스가 아니면 드라이버는 소용이 없을 것이란 구글 형님의 훈수가 결국 Duron 850 으로의 이주를 결정하게 했다.

문제는 여기서 발생했다.

/etc/make.conf 에서 CFLAGS 를 march=pentium3 로 -fomit-frame-pointer 루프 어레이인가를 4까지 최적화 하고 -O3 로 설정했었다.

설마 했는데 CPU가 Duron (AMD)로 바뀌었다고 부팅이 안되는 것이다.

결국 커널 중 2.6.18 대를 버리고 2.6.14 로 부팅하니 어떻게든 부팅은 되었다.

문제는 ntop 이나 gcc, python 이 동작하질 않았고 당연하게도 portage 마저 동작하지 않았다.

(illegal instuction 에러를 냄)

소프트웨어를 하드웨어에 꼭 맞게 최적화 하는것이 양날의 검이라는 사실을 이때서야 깨달았다.
나중에 하드웨어를 새로 구성할 것을 고려하지 않았고 좋지 않은 사양이기에 최적화를 위해 한 일이 이렇게 발목을 잡을줄은 생각하지 못했다.


결국 Gentoo LiveCD 로 부팅해서 system 패키지와 glibc 를 재 컴파일/설치 하기로 방향을 잡았다.

그.러.나





chroot로 진입한 환경에서 아까 동작하지도 않던 gcc 가 동작할 리 없지 않은가.. [털썩]


이럴때는  gcc만 새로 설치해서 작업하면 좋은데,  얽히고 섥힌 라이브러리의 의존성과 해당 파일의 목록을 외워둔 것도 아니고.


프로그램 목록(파일목록) 은 그렇다 치더라도, 그것을 배치해야 할 디렉토리 위치조차 모른다는게 결정적이다.

젠투 리눅스 개발자들과 LFS로 수많은 삽질에 삽질을 거듭하시는 분들은 잘 아시겠지만.


결국 gcc를 사용하기 위해 stage1 타르볼을 덮어 써 보았다.
무슨일이 일어날지 궁금하기도 했고, 어차피 시스템 전체 백업은 되어 있으니 망가뜨리면서 공부해 보는것도 나쁜일은 아니라고 생각했다.


그 결과, 당연하게도 gcc 기동은 성공. 하지만 하나라도 emerge 시도를 하면  glibc 와 호환이 안되는 건지 /lib 디렉토리의 pthread 동적 라이브러리에서 에러를 뿜어냈다.

그 이후에는 어떤 프로그램을 실행해도, 심지어 ls 따위를 실행해도 동일한 반응.

하는 수 없이 타르볼을 다시 덮어쓰고 glibc 를 재 컴파일 했다.

이후 bootstrap 시 perl 모듈 중  (dev-perl/Locale-gettext-1.05)

* Using ExtUtils::MakeMaker
Can't locate ExtUtils/MakeMaker/Config.pm in @INC (@INC contains: /etc/perl /usr/lib/perl5/vendor_perl/5.8.8/i686-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl /usr/lib/perl5/site_perl/5.8.8/i686-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/5.8.8/i686-linux-thread-multi /usr/lib/perl5/5.8.8 /usr/local/lib/site_perl .) at /usr/lib/perl5/5.8.8/ExtUtils/MakeMaker.pm line 7.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.8/ExtUtils/MakeMaker.pm line 7.
Compilation failed in require at Makefile.PL line 2.
BEGIN failed--compilation aborted at Makefile.PL line 2.

!!! ERROR: dev-perl/extutils-pkgconfig-1.07 failed.
Call stack:
ebuild.sh, line 1568: Called dyn_compile
ebuild.sh, line 937: Called src_compile
ebuild.sh, line 1261: Called perl-module_src_compile
perl-module.eclass, line 136: Called perl-module_src_prep
perl-module.eclass, line 125: Called die

!!! Unable to build! (are you using USE="build"?)
!!! If you need support, post the topmost build error, and the call stack if relevan

이런 오류가 나는데 일단 관련 링크 첨부

http://www.gentoo.ro/forum_viewtopic.php?19.8292


하아.. 루마니아 어다.. ㅠ ㅠ

이후 하드디스크를 초기화 하고 재 셋팅에 들어갔지만, 역시 bootstrap 시 오류 발생..

대체 뭐란 말인가..

일단 오늘의 삽질 일기는 여기까지..

나머지는 내일 불타오르도록 하자!!


,

NAT 를 linux 에서

from My Life/한 일 2007. 2. 25. 23:14

커 널 2.4에서 IP 공유(ip masquerade), 서버 부하분산(port forwarding), 투명 프락시(redirection)를 사용하려면 iptables 프로그램을 사용해야 한다. 물론 커널 쪽 세팅도 필요하다. 2.2에서는 ipchains와 ipmasqadm으로 분리되어 있었는데 이를 하나로 통합했을 뿐 아니라 사용법도 훨씬 쉬워졌다. 또한 확장성을 고려해서 설계되었다는 장점이 있다.

iptables는 NAT 기능뿐 아니라 filtering 기능도 들어 있다. filtering은 패킷을 걸러 내는 즉 없애는(거부하는) 기능을 담당하므로 주로 방화벽을 구축하는데 사용한다. NAT는 패킷의 내용 즉 주소, 포트번호 등을 변경한다. 한 개의 IP 주소를 여러 대의 피시에서 공유하여 인터넷을 사용하는 데는 NAT 기능을 사용해야 한다.(2.2에서의 ip masquerade) 한 개의 도메인 네임에 대해 여러 대의 서버가 서비스를 제공하는 서버 부하분산에도 역시 NAT가 사용된다.(2.2에서의 port forwarding)

이 글에서는 커널 2.4에서 IP 공유와 서버 부하분산을 구현하는 방법을 설명한다.


I. 참고자료


II. 준비작업

    커널 2.4에서 NAT를 구현하려면 커널에 해당 코드를 올리고(모듈로도 가능) 사용자 프로그램 (iptables)을 설치해야 한다. 아래의 모든 작업은 데비안 2.2(potato)에서 테스트하였다. 커널은 2.4.2를 사용했다.

    1. iptables 프로그램 설치

      1) 파일 다운로드

      iptables의 최신버전은 1.2이다. Netfilter Project 사이트(http://netfilter.kernelnotes.org/ )에서 다운받아 설치한다. 위 사이트에서 아래 파일을 다운 받는다.

      -rwxr--r--    1 bae      root       151774 Feb 24 18:00 iptables-1.2.tar.bz2

      2) 압축 해제

      bunzip2 iptables-1.2.tar.bz2
      tar xvf iptables-1.2.tar

      iptables-1.2 디렉토리가 만들어지고 그 안에 소스가 위치한다.

      3) cd iptables-1.2

      4) 2.4 커널 소스를 /usr/src/linux에 설치한다.

      5) make

      ·2.4 커널 소스가 다른 디렉토리에 있으면 아래 명령이 필요하다.
        make KERNEL_DIR=<<커널 디렉토리명>>

      6) make install

      실행파일은 /usr/local/sbin/iptables 이다. 라이브러리도 동시에 설치된다. 다른 곳에서 iptables 파일만 복사해서는 NAT를 사용할 수 없다. 라이브러리도 같이 설치해야 하므로 컴파일하거나 rpm으로 설치해야 한다.

    2. 커널 코드 올리기

    filtering이나 NAT를 사용하려면 필히 커널에 해당 코드가 올라가야 한다. 모듈로 올리는 방법과 컴파일해서 코드에 포함시키는 방법이 있다.

    여기서는 커널을 컴파일해서 코드를 설치하는 경우의 make menuconfig(make config, make xconfig) 에서  필요한 선택사항을 설명한다.(커널 2.4.2) NAT와 직접 관련된 선택사항만 설명했다. 네트워크나 랜카드에 관련된 부분은 자신의 시스템에 맞게 선택해야 한다.

      1) 메인 메뉴의 “Networking options  “ 에서 아래 부분을 선택한다.

      [*]Network packet filtering
      [*]Socket Filtering
      [*]Unix domain sockets
      [*]Unix domain sockets
      [*]TCP/IP networking

      IP: Netfilter Configuration  --->

      <*> Connection tracking (required for masq/NAT)
      <*> FTP protocol support
      <*> IP tables support (required for filtering/masq/NAT)

      아래 항목 중에서 일반적인 IP 공유나 서버부하분산을 구현하려면 <*> 표시가 있는 항목을 선택한다. 나머지는 패킷 필터링을 사용하거나 특수한 NAT 기능 구현시만 필요하다.

            < >   limit match support
      < >   MAC address match support
      < >   netfilter MARK match support
      < >   Multiple port match support
      < >   TOS match support
      < >   Connection state match support
      < >   Unclean match support (EXPERIMENTAL)
      < >   Owner match support (EXPERIMENTAL)
      < >   Packet filtering
      <*>   Full NAT
      <*>   MASQUERADE target support : 유동 IP 사용시 필요하다.
      < >   REDIRECT target support     : 투명프락시 사용시 필요하다.
      < >   Packet mangling
      < >   LOG target support

      2) 아래 메뉴를 선택하면 NAT 기능을 사용할 수 없다.

      "Networking options"에서 "Fast switching (read help!)"


III. NAT에 대한 이해

    iptables를 정확히 사용하려면 iptables에서 정의하는 NAT의 개념을 알아야 한다.

    1. NAT 사용 예

    아래 그림을 기준으로 설명한다. 아래 그림에서 리눅스C에는 두 개의 랜카드가 설치되어 있고 인터넷 쪽의 랜카드(eth0) 에는 공인 IP(고정) 가 부여되어 있다.(211.217.xxx.yyy) 두번째 랜카드에는 내부어드레스(192.168.1.1)가 부여되어 있고 내부 랜(192.168.1.0/24)에 연결되어 있다.

         <그림 1>

      1) 여러 대의 피시에서 한 개의 IP를 공유하여 인터넷을 사용

      adsl 이나 케이블모뎀으로 인터넷을 연결하는 경우 보통은 1개의 IP 주소를 받는다. (여러 개를 받을 수 있는 서비스가 있으나 비용이 많이 든다.) 이때 한 개의 IP주소를 여러 대의 피시에서 공유하여 인터넷을 사용하려 할 경우 NAT가 사용된다.  우리가 IP Masquerade라 불러왔다. 그림 1] 에서 윈도우A, 윈도우B 두 대의 피시에서 리눅스C의 공인 IP(211.217.xxx.yyy)를 공유해서 인터넷을 사용하게 설정하는 경우이다.

      2) 한 개의 IP 주소(도메인네임)에 여러 대의 서버를 연결하는 경우

      부하분산을 위해 한 개의 도메인네임(FQDN)에 대해 여러 대의 서버를 운영하는 경우도 NAT를 사용한다.  즉 www.linuxlab.co.kr 도메인 한 개에 웹서버, 메일서버, FTP 서버를 따로 운영하는 경우이다. 부하평준화(load balance) 기능도 구현이 가능하다. 즉 www.linuxlab.co.kr 도메인에 대한 웹서비스를 여러 대의 서버가 담당하게 하는 경우이다. 2.2에서는 port forwarding이라 불리웠다.

      (커널 2.2에서 port forwarding 사용법은 리눅스 월드 2000년 3월호에 있다.)

      그림 1] 에서 윈도우C에서 bae@www.linuxlab.co.kr로 메일을 보내면 메일은 192.168.1.10 서버로 전달되고 웹을 검색하면(http://www.linuxlab.co.kr) 192.168.1.11 서버가 응답하게 설정하는 것이다.

      3) 투명 프락시

      학원에서 인터넷 강의를 하는 경우는 동일 네트워크에 연결된 여러 대의 피시에서 동시에 같은 사이트를 연결한다. 이 경우 프락시 서버를 설치하면 모든 피시는 우선 프락시 서버에서 방문하려는 사이트의 페이지가 있는지를 확인하고 여기에 없을 경우는 프락시서버에서 해당 사이트를 연결해 페이지를 가져다 피시에게 준다.

      프락시 서버를 사용하려면 피시의 웹브라우저에 프락시서버를 지정해 주어야 한다. 그런데 투명프락시의 경우는 클라이언트 피시의 웹브라우저에 프락시서버를 지정할 필요가 없다.

      리눅스에 투명프락시를 설정하면 리눅스를 통과하는 패킷은 자동으로 리눅스에 설치된 프락시서버 프로그램(예: squid)으로 연결된다.(리눅스를 각 피시의 디폴트게이트로 지정하면 모든 패킷은 리눅스를 통과한다.) 예전에는 리다이렉션이라고 불리웠다.

      그림 1]에서 윈도우A에서 www.debian.org의 페이지를 검색하면 리눅스C에 설치된 프락시서버프로그램(squid)이 www.debian.org를 연결해 대신 데이터를 가져다 윈도우A에 넘겨주는 설정이다. 이 글에서는 투명프락시 설정은 설명하지 않는다. Transparent Proxy with Squid mini-HOWTO를 참고 하라.

    2. iptables에서 NAT 의 분류

    iptables에서는 크게 두 부류의 NAT로 분류한다. 위의 1) 의 경우를 SNAT(Source NAT) 위의 2) , 3)의 경우는 DNAT(Destination NAT) 라 분류한다.

    SNAT는 패킷의 소스 어드레스를 변경한다는 의미이다. 즉 내부 어드레스인 192.168.1.100 윈도우A 에서 www.debian.org 리눅스서버를 연결하면 debian 서버에서 볼 때 패킷의 소스가 192.168.1.100이 아닌 211.217.xxx.yyy로 나타나기 때문이다.

    SNAT는 라우팅(경로) 결정 이후에 이루어진다.(post-routing) 패킷의 목적지 주소는 이미 정해져 있으므로(www.debian.org) 라우팅 경로는 결정되어 있고 패킷의 소스 주소가 리눅스를 떠나기 직전에 변경된다.(192.168.1.100 -> 211.217.xxx.yyy)

    DNAT는 이와는 반대다. 리눅스C에서 패킷의 목적지 주소를 변경한다. 윈도우C에서 bae@www.linuxlab.co.kr 주소로 메일을 보내면 리눅스C에 도착한 패킷의 목적지가 리눅스 B의 주소로 변경된다. 즉 패킷의 목적지 주소가 먼저 변경되고(211.217.xxx.yyy -> 192.168.1.10) 그 변경된 주소에 의거하여 새로운 라우팅 경로가 찾아진다. 즉 DNAT는 라우팅 이전 단계에서 작용한다.(pre-routing)

    post-routing와 pre-routing 은 무척 혼동된다. 즉 내가 왼쪽이라 하면 상대에서 나를 볼 때는 오른쪽이다. 결국 NAT 가 routing 보다 전에 작용하느냐 후냐의 구분으로 보면 된다. (iptables 파라메터 지정에서 이 둘을 혼동하면 에러가 난다.)


IV. IPTABLES 설정

    1. Source NAT 는 아래와 같이 지정한다.(기존의 IP Masquerade를 말함.)

    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6
    iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023

    -t -A 는 위의 글(2)을 읽으면 이해가 되리라고 본다. -o 는 패킷을 보내는 인터페이스 장치이다. SNAT 에서는 패킷을 내 보내는 장치(랜카드)를 지정할 수 있다.  --to 는 나가는 패킷에 부여할  소스 주소이다. IP 공유라면 --to 는 인터넷 쪽의 공인 IP 를 지정하면 된다.(지정 않아도 상관없다.)
     

    주의]

    리눅스에 NAT를 설치하는 경우 리눅스는  게이트웨이로 작용하므로 IP Forwarding이
    필요하다.
    아래 명령을 포함하는 스크립트를 /etc/rc.boot/ 디렉토리에 넣는다.(데비안)

    #!/bin/bash
    echo “IP forwarding setting..”
    echo “1” > /proc/sys/net/ipv4/ip_forward

    IP forwarding 이 활성화되었는지를 확인하려면 아래 명령을 준다.

    churlsu:/etc/rc.boot# cat /proc/sys/net/ipv4/ip_forward
    1

    값이 1이면 활성화(enable) 되어 있다.


    1.1 실제 사용 예

      1) 한국통신 ADSL을 리눅스에 연결해 인터넷을 공유(IP MASQUERADING)하는
          경우의 설정은 아래와 같다.(라이트나 프리미엄처럼 유동 IP를 받는 서비스의
          경우에만 해당한다.)

          iptables  -t  nat  -A  POSTROUTING  -o  ppp0  -j  MASQUERADE

      2) 그림1] 에서 리눅스C의 eth0에 부여된 IP(고정)를 윈도우 A,B에서 공유하여
          인터넷을 사용하게 설정하려면 아래와 같다. 전용선 또는 ADSL My IP, Multi IP
          사용시에 해당한다.

          iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to
          211.217.xxx.yyy

          * -s 192.168.1.0/24는 지정 않아도 된다.

      3) 그림 1] 에서 리눅스 C의 eth0가 케이블모뎀에 연결되어 있다면 아래처럼
          지정한다.(유동 IP)

          iptables  -t  nat  -A  POSTROUTING  -o  eth0  -j  MASQUERADE

    1.2 확인

      - iptables 설정 내용을 확인하려면 아래 명령을 준다.

         iptables -t nat -L

      - 192.168.1.0 네트워크에서 211.217.xxx.yyy 공인 IP를 공유하도록 설정한 경우
         (위의 1.1의 2) 의 출력
       

      Chain PREROUTING (policy ACCEPT)
      target     prot opt source               destination

      Chain POSTROUTING (policy ACCEPT)
      target     prot opt source             destination
      SNAT       all  --  192.168.1.0/24  anywhere       to:211.217.xxx.yyy

      Chain OUTPUT (policy ACCEPT)
      target     prot opt source            destination


    2. DNAT

    DNAT 는 부하분산이나 평준화에만 사용하는게 아니다. 간단한 방화벽으로도 꽤 유용하다. 즉 위의 리눅스C에 DNAT를 설정하여 웹서버와 메일서버를 내부 주소인 리눅스 A와 B에서 서비스 하도록 지정하고 인터넷에서 다른 연결은 리눅스C로 지정하면 리눅스 C가 간단한 방화벽 구실을 담당한다.

    2.1 사용 예

    -  그림1]에서 처럼 윈도우C에서 www.linuxlab.co.kr 의 홈페이지를 검색하려 할 때 이를
        리눅스A에서 담당하게 하려면 아래처럼 설정한다.

        iptables -A PREROUTING -t nat -p tcp  -d 211.217.xxx.yyy  --dport 80 \
        -j DNAT --to  192.168.1.11:80

      1)  -A PREROUTING  : DNAT 는 먼저 목적지 주소를 변경하고(211.217.xxx.yyy를
           192.168.1.11로) 다음에 라우팅이 이루어진다.

      2)  -t nat  : 부하분산도 nat 기능이다.

      3)  -p tcp  : 웹(www)은 tcp 를 사용한다.

      4)  -d 211.217.xxx.yyy  --dport 80 : 들어오는 패킷의 목적지 주소가
           211.217.xxx.yyy 이고 포트번호가 www(80번) 인 경우만 이 규칙을 적용한다.

      5)  -j DNAT : destination Nat

      6)  --to  192.168.1.11:80 : 패킷의 목적지 주소를 192.168.1.11 포트번호를 80번으로
          설정하라는 뜻. 따라서 192.168.1.11 서버에는 80번 포트에서 웹서버 프로그램이
          가동 되야 한다.

    - 메일서버를 리눅스B (192.168.1.10)로 설정하려면 아래처럼 지정한다.

    iptables -A PREROUTING -t nat -p tcp  -d 211.217.xxx.yyy  --dport 25 \
    -j DNAT --to  192.168.1.10:25

    - DNS 서버를 192.168.1.10으로 변경하려면 아래처럼 지정한다.

    iptables -A PREROUTING -t nat -p udp  -d 211.217.xxx.yyy  --dport 53 \
    -j DNAT --to  192.168.1.10:53

    주의]  DNS 는 udp 를 사용한다.

    2.2 DNAT 설정 확인

    웹을 192.168.1.11 로 DNAT 설정을 하면 아래처럼 나온다.(리눅스C에서 아래 명령을 준다.)

    churlsu:~# iptables -t nat -L
    Chain PREROUTING (policy ACCEPT)
    target     prot opt  source      destination
    DNAT     tcp  --  anywhere   churlsu.linuxlab.co.krtcp dpt:www to:192.168.1.11:80

    3. iptables 설정 해제

    - 기존에 설정돼 있는 모든 nat 설정을 지우려면 아래 명령을 준다.

      iptables -t nat -F

    - iptables 의 모든 설정이 해제된 경우는 아래와 같다.

    churlsu:~# iptables -t nat -L
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination

    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination

    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination


V.  iptables  옵션

    아래는 nat 에서 사용하는 중요한 옵션만 설명했다. 나머지는 man 페이지를 참고 하라.

    1) -t  : --table

    table 을 선택한다. filter, nat, mangle 세가지 선택이 있다. 커널에 해당 테이블을 지원하는 코드가 들어 있어야 한다. 모듈 자동적재를 사용한다면 해당 테이블을 선택하면 그와 관련된 커널 모듈이 적재된다.  디폴트는 filter 이므로 nat를 사용하려면 필히 nat 를 지정해야 한다.

    2) -A  : --append

    규칙을 추가한다.

    INPUT, FORWARD :  -t가 filter인 경우 사용 가능
    POSTROUTING, PREROUTING: -t가 nat인 경우 사용 가능
    OUTPUT: 양쪽 다 사용

    3) -i :   --in-interface

    패킷이 들어오는(incoming) 인터페이스(장치)를 지정한다. (-t 가 nat 이면 PREROUTING에서만 지정 가능하다.) 인터페이스명 앞에 “!” 을 추가하면 그 장치는 제외한다는 의미가 된다. 뒤에 “+”를 추가하면 그 이름으로 시작하는 모든 장치를 의미한다. 디폴트는 +이다.

    4) -o :  --out-interface

    outgoing 인터페이스 즉 패킷이 나가는 네트워크 장치를 지정한다. (-t가 nat이면 POSTROUTING 에서만 지정 가능하다) “!” 과 “+” 은 -i 와 동일한다.

    5) -s  :  --source

    소스 어드레스/netmask 를 지정한다. SNAT에서 밖으로 나가는 패킷의 소스어드레스에 따라 규칙을 적용하려 할 때 지정한다.  주소는 호스트네임, 네트워크네임, IP 주소 등을 사용할 수 있다. 아래 형식이 가능하다. 앞에 “!”을 넣으면 반대의 개념이 된다.

            - 192.168.1.100
            - 192.168.1.0/24
            - 192.168.1.0/255.255.255.0

    6) -d :  --destination

    목적지 주소/netmask 를 지정한다. DNAT 에서 들어오는 패킷의 목적지 주소에 따라 규칙을 적용하려 할 때 지정한다. 위의 -s 와 사용법이 같다.

    7) -p :  --protocol

    tcp 나 udp 를 지정한다.

    8) --to :  --to-source,  --to-destination,  

    --to 는 SNAT  에서는 --to-source의 의미이다. 즉 내보내는 패킷에 새로 부여할 소스 IP 주소를 지정한다.  보통은 인터넷 쪽에 연결된 랜카드의 주소이다.

    DNAT 에서는 --to-destination 의 의미이다. 즉 패킷의 새로운 목적지 주소이다. Port forwarding 에서 는 내부 랜에 설치된 서버의 주소이다.

    9) --dport :

    -p 와 같이 사용된다. DNAT에서 들어오는 패킷의 목적지 포트에 따라 규칙을 적용하려 할 때 지정한다.


    출처 : http://www.schkorea.zc.bz/bbs/view.php?id=programming_unix&no=42

,