레이블이 Linux인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Linux인 게시물을 표시합니다. 모든 게시물 표시

2010년 8월 16일 월요일

xen에서 VM의 CPU 점유율 변경하기

Credit-Based CPU Scheduler

Introduction

The credit scheduler is a proportional fair share CPU scheduler built from the ground up to be work conserving on SMP hosts. It is now the default scheduler in the xen-unstable trunk. The SEDF and BVT schedulers are still optionally available but the plan of record is for them to be phased out and eventually removed.

Description

Each domain (including Host OS) is assigned a weight and a cap.

Weight

A domain with a weight of 512 will get twice as much CPU as a domain with a weight of 256 on a contended host. Legal weights range from 1 to 65535 and the default is 256.

Cap

The cap optionally fixes the maximum amount of CPU a domain will be able to consume, even if the host system has idle CPU cycles. The cap is expressed in percentage of one physical CPU: 100 is 1 physical CPU, 50 is half a CPU, 400 is 4 CPUs, etc... The default, 0, means there is no upper cap.

SMP load balancing

The credit scheduler automatically load balances guest VCPUs across all available physical CPUs on an SMP host. The administrator does not need to manually pin VCPUs to load balance the system. However, she can restrict which CPUs a particular VCPU may run on using the generic vcpu-pin interface.

Usage

The xm sched-credit command may be used to tune the per VM guest scheduler parameters.

xm sched-credit -d <domain>

lists weight and cap

xm sched-credit -d <domain> -w <weight>

sets the weight

xm sched-credit -d <domain> -c <cap>

sets the cap

Algorithm

Each CPU manages a local run queue of runnable VCPUs. This queue is sorted by VCPU priority. A VCPU's priority can be one of two value: over or under representing wether this VCPU has or hasn't yet exceeded its fair share of CPU resource in the ongoing accounting period. When inserting a VCPU onto a run queue, it is put after all other VCPUs of equal priority to it.

As a VCPU runs, it consumes credits. Every so often, a system-wide accounting thread recomputes how many credits each active VM has earned and bumps the credits. Negative credits imply a priority of over. Until a VCPU consumes its alloted credits, it priority is under.

On each CPU, at every scheduling decision (when a VCPU blocks, yields, completes its time slice, or is awaken), the next VCPU to run is picked off the head of the run queue. The scheduling decision is the common path of the scheduler and is therefore designed to be light weight and efficient. No accounting takes place in this code path.

When a CPU doesn't find a VCPU of priority under on its local run queue, it will look on other CPUs for one. This load balancing guarantees each VM receives its fair share of CPU resources system-wide. Before a CPU goes idle, it will look on other CPUs to find any runnable VCPU. This guarantees that no CPU idles when there is runnable work in the system.

Glossary of Terms

  • ms: millisecond

  • Host: The physical hardware running Xen and hosting guest VMs.

  • VM: guest, virtual machine.

  • VCPU: Virtual CPU (one or more per VM)

  • CPU/PCPU: Physical host CPU.

  • Tick: Clock tick period (10ms)

  • Time-slice: The time-slice a VCPU receives before being preempted to run another (30ms)

  • Period: The accounting period (30ms). Once per period, credits earned are recomputed.

  • Weight: Proportional share of CPU per guest VM

  • Cap: An optional upper limit on the CPU time consumable by a particular VM.

2010년 7월 19일 월요일

openvpn인스톨

1. 패키지 다운로드
a. lzo 2.0 : http://www.oberhumer.com/opensource/lzo/download/
b. OpenSSL 0.9.7a : http://www.openssl.org/source
c. OpenVPN : http://www.openvpn.net/index.php/downloads.html

2. 패키지 설치
-lzo
cd /usr/local/src
tar xvzf lzo-xxxx.tgz
cd lzo-xxxx
./configure --prefix=/usr/local/lzo
make
make install

-openssl 0.9.7a
cd /usr/local/src
tar xvzf openssl-xxxx.tgz
cd openssl-xxxx.tgz
./config --prefix=/usr/local/openssl
make
make install

-openvpn
./configure --prefix=/usr/local/openvpn --with-lzo-headers=/usr/local/lzo/include --with-lzo-lib=/usr/local/lzo/lib --with-ssl-headers=/usr/local/openssl/include --with-ssl-lib=/usr/local/openssl/lib
make
make install

3.주요 디렉토리 생성
mkdir /usr/local/openvpn/plugin
mkdir /usr/local/openvpn/clientkeys
mkdir /usr/local/openvpn/keys
mkdir /usr/local/openvpn/log

4. plugin컴파일
cd /usr/local/openvpn/plugin/auth-pam
make
-생성된 openvpn-auth-pam.so를 openvpn이 설치된 디렉토리에 plugin 디렉토리로 복사
cp /usr/local/src/openvpn/plugin/auth-pam/openvpn-auth-pam.so /usr/local/openvpn/plugin/openvpn-auth-pam.so

5. openvpn설정파일 조정
샘플 openvpn.conf를 openvpn설치 폴더로 복사
cp /usr/local/src/sample-config-files/server.conf /usr/local/openvpn/openvpn.conf
b. 파일을 열어 수정
vi /usr/local/openvpn/openvpn.conf
--------------------------------------------------------------
local 210.xxx.xxx.xxx
port 1194
proto udp
dev tun

#실제로 서버에서 생성한 key파일 및 certificates에 대한 위치를 지정
ca /usr/local/openvpn/keys/ca.crt          
cert /usr/local/openvpn/keys/server.crt   
key /usr/local/openvpn/keys/server.key  # This file should be kept secret

#key negociation에 필요한 Diffie hellman parameter설정(기본은 1024나 보안을 위하여 2048로 변경)
dh /usr/local/openvpn/keys/dh2048.pem


#vpn 서브넷 마스크 구성

server 10.8.0.0 255.255.255.0


#접속허가된 IP들에 대한 list저장 파일 지정
ifconfig-pool-persist /usr/local/openvpn/ipp.txt


#client의 모든 traffic을 VPN을 통하도록 설정
push "redirect-gateway 10.8.0.1"
push "route 210.xxx.xxx.xxx 255.255.255.255"
push "route 10.8.0.0 255.255.255.0"
push "route 210.xxx.xxx.xxx 255.255.255.255"
push "route 118.xxx.xxx.xxx 255.255.255.255"


#동일한 키로 접속여부가 가능할수 있도록

duplicate-cn

# 10초에 한번씩 핑,120초동안 연락이 없을시 다운 간주
keepalive 10 120


#lzo가 가능하게 한다

comp-lzo

#동접
max-clients 100

#
persist-key
persist-tun


#현재 VPN의 접속상태를 기록하는 log위치 지정
status /usr/local/openvpn/log/openvpn-status.log


#VPN 데몬의 모든 로깅 파일 위치 지정

log         /usr/local/openvpn/log/openvpn.log


#

verb 3


#개인key를 개인들에게 배포하기가 힘들기 때문, auth-pam사용 접속
plugin /usr/local/openvpn/plugin/openvpn-auth-pam.so login
client-cert-not-required
username-as-common-name
---------------------------------------------------------------------

5. openssl설정 조정 및 필요한 key및 certificate생성
샘플 openssl.cnf를 복사 :
cp /usr/local/src/easy-rsa/openssl.cnf /usr/local/openvpn/
수정
vi /usr/local/openvpn/openvpn.conf
--------------------------------------------------------------
#기본적으론는 소스가 설치된 디렉토리에 작성을 하도록 되어 있었으므로 이를 수정
dir             = /usr/local/openvpn/keys          # Where everything is kept
--------------------------------------------------------------

6.환경변수 설정
export D=/usr/local/openvpn/
export KEY_CONFIG=$D/openssl.cnf
export KEY_DIR=$D/keys
export KEY_SIZE=2048
export KEY_COUNTRY=KR
export KEY_PROVINCE=NA
export KEY_CITY=SEOUL
export KEY_ORG="abc inc"
export KEY_EMAIL="admin@hanbiro.jp"

7. openssl이 사용하는 중요 파일들 설정
touch /usr/local/openvpn/keys/index.txt -> index.txt파일 생성
echo 01 > /usr/local/openvpn/keys/serial -> serial파일을 만들면서 01로 초기화

8. 서버에서 사용할 key생성(*ca.crt의 경우 client로도 전달이 되어야 함)
/usr/local/openssl/bin/openssl req -days 365 -nodes -new -x509 -keyout /usr/local/openvpn/keys/ca.key -out /usr/local/openvpn/keys/ca.crt -config /usr/local/openvpn/openssl.cnf

/usr/local/openssl/bin/openssl req -days 365 -nodes -new -keyout /usr/local/openvpn/keys/server.key -out /usr/local/openvpn/keys/server.csr -extensions server -config /usr/local/openvpn/openssl.cnf

/usr/local/openssl/bin/openssl ca -days 365 -out /usr/local/openvpn/keys/server.crt -in /usr/local/openvpn/keys/server.csr -extensions server -config /usr/local/openvpn/openssl.cnf

/usr/local/openssl/bin/openssl dhparam -out /usr/local/openvpn/keys/dh2048.pem 2048

9. 서버 실행
/usr/local/openvpn/sbin/openvpn --config /usr/local/openvpn/openvpn.conf --daemon --mode server
라이브러리 에러 발생시
"AUTH-PAM: BACKGROUND: could not load PAM lib libpam.so" 에러가 발생함
ln -s /lib/libpam.so.0.75 /lib/libpam.so
libpam.so로 추가 link

10. VPN을 통한 VPN서버외 다른서버(internet상의 모든 서버 포함)로 접근을 위해 네트웍 세팅 변경
echo 1 > /proc/sys/net/ipv4/ip_forward
vi /etc/sysctl.conf
----------------------------
net.ipv4.ip_forward = 1
----------------------------
/etc/sysctl.conf를 변경한 후 적용
sysctl -p
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

VPN에서 사용하는 tun device에 대해서 ipforward기능 on
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

다른 서버로 접근이 가능하도록 nat설정
iptables설정값을 시스템 재시작 때도 적용이 되도록 영구 저장
/sbin/service iptables save

11. 서버 작동 확인
-OpenVPN log
tail -f /usr/local/openvpn/openvpn.conf

-tcpdump를 통한 해당 port(1194) 패킷 모니터링
 tcpdump -n udp port 1194

-실제 traffic이 VPN을 통해서 나가고 있는지 연결된 client의 packet확인
 tcpdump -n host XXX.XXX.XXX.XXX

12. 서버 스타트/스톱/재시작 스크립트
vi /etc/init.d/openvpn
------------------------------------------------------------
#!/bin/sh
#
# chkconfig: - 91 35
# description: Starts and stops the Openvpn server.
#
# config:  /usr/local/openvpn/openvpn.conf


# Source function library.
if [ -f /etc/init.d/functions ] ; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi

# Avoid using root's TMPDIR
unset TMPDIR

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Check that smb.conf exists.
[ -f /usr/local/openvpn/openvpn.conf ] || exit 0

# Check that we can write to it... so non-root users stop here
#[ -w /user/local/openvpn/openvpn.conf ] || exit 0

RETVAL=0
KIND="OpenVPN"

start() {
        echo -n $"Starting $KIND services: "
        daemon /usr/local/openvpn/sbin/openvpn --config /usr/local/openvpn/openvpn.conf --daemon --mode server
        RETVAL=$?
        [ $RETVAL -eq 0 ]
        echo ""
        return $RETVAL
}

stop() {
        echo -n $"Shutting down $KIND services: "
        killproc openvpn
        RETVAL=$?
        [ $RETVAL -eq 0 ]
        echo ""
        return $RETVAL
}

restart() {
        stop
        start
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $?
--------------------------------------------------------------
chmod 700 /etc/init.d/openvpn

13.openvpn 클라이언트(윈도우용gui)
openvpn.ovpn 수정
--------------------------------------------------------------
remote  210.xxx.xxx.xxx  
dev tap
port 1194
tls-client
proto udp
comp-lzo
verb 4
nobind
ca ca.crt
cert server.crt
key server.key
pull
persist-local-ip
auth-user-pass

dev tun

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

config폴더 안에
위에서 수정한 openvpn.ovpn 파일과
서버에서 생성한 ca.crt 파일 server.crt파일 server.key파일을
config폴더 안에 넣고 연결을 시도한다.


기타. 방화벽 혹은 ipwrap등의 설정을 풀어준다.

프로세서의 확인
netstat -nap
udp포트의 확인

[출처] openvpn인스톨|작성자 양상

2010년 6월 30일 수요일

명령어 하나로 여러대 자원 관리하기 (SSH 인증키 사용)

문제의 요점은 여러대의 동일한 시스템을 관리하는데 있어서 반복되는 작업이 잦다는것..
이걸 어떻게하면 좀더 편리하게 할수 있느냐에서 출발한다.

물론 주기적으로 반복되는 명령어 작업이라면 CRON을 통해서 스케줄을 걸어두면 되겠지만 문제는 비정기적인 작업이다.

원리는 SSH 인증키를 가지고 스크립트를 만들어서 작업하면 100대, 1000대라도 문제 없다는것!!
SSH 인증키란 간단히 말해서 나와 서버간의 약속된 키이다.


인증키 생성하기
인증키는 ssh-keygen를 통해서 만든다. 키를 생성할때 사용할 키의 형태를 지정해 주는데 원격 서버가 SSH 프로토콜 버전 2를 지원한다면(요즘은 기본지원한다.)  rsa, dsa  프로토콜 1만을 지원한다면 rsa1 을 사용하면 된다.
컨트롤할 서버에서 인증키를 생성한다.

키가 저장될 곳과 이름을 물어 오는데 디폴트로 그냥 엔터를 치고 넘어가면, 다음과 같이 인증키 암호를 물어온다. 원하는 암호를 두번 반복해서 입력해주면 키가 생성된다.
인증키 생성시 인증키 암호를 공백으로 (passphrase 를 물어올때 그냥 엔터를 치면 된다) 만들경우에는 ssh 접속시 암호를 입력하지 않아도 그냥 접속이 되므로 편리하나 키관리에 주의를 기울여야 한다...

우리는 암호없이 접근하려고 하니깐 그냥 엔터 (Enter)  

[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
ea:24:ca:36:af:99:e6:4f:96:d2:b6:0f:25:75:fc:ea mojily@chonnom.com

※ -t : type   Specify type of key to create.


공개키 사용하기
기본 경로에 키를 저장하였다면 /root/.ssh/ 위치에 id_rsa 와 id_rsa.pub가 생성되어 있다.
.pub 확장자가 붙은 것이 공개키로 이 파일을 관리할 원격서버들의 ~/.ssh/ 에 authorized_keys 라는 이름으로 복사해준다.
scp 를 이용해서 파일을 밀어 넣어준다.

[root@localhost .ssh]# scp id_rsa.pub root@xxx.xxx.xxx.xxx:/root/.ssh/authorized_keys
root@xxx.xxx.xxx.xxx's password:
id_rsa.pub                                                                                                                  100%  397     0.4KB/s   00:00


관리대상의 서버들에 접속해서 보면 authorized_keys 부분이 확인된다.

[root@localhost .ssh]# ls -al
total 24
drwxr-xr-x 2 root root 4096 Jan 26 11:29 .
drwxr-x--- 5 root root 4096 Jan 26 11:29 ..
-rw-r--r-- 1 root root  397 Jan 26 11:29 authorized_keys


기본적인 작업은 다 끝났다...
컨트롤할 서버에서 작업대상 원격 서버로 ssh 접근을 시도해보면...암호인증없이 로그인이 되는걸 확인가능하다.

[root@mojily .ssh]# ssh -lroot xxx.xxx.xxx.xxx
Last login: Tue Jan 26 11:32:28 2010 from xxx.xxx.xxx.xxx
[root@localhost ~]#


2010년 6월 16일 수요일

grep 옵션

출처 : 유닉스 쉘 바이블 (엘리 퀴클리 지음)에서 발췌.
3.1 grep 명령어

grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.
fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정규표현식의 메타문자도 일반 문자로 취급한다.

3.2 정규표현식을 사용하는 grep의 예제
# grep NW datafile
# grep NW d* (d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.)
# grep '^n' datafile (n으로 시작하는 모든 행을 출력한다.)
# grep '4$' datafile (4로 끝나는 모든 행을 출력한다.)
# grep TB Savage datafile (TB만 인자이고 Savage와 datafile은 파일 이름이다.)
# grep 'TB Savage' datafile (TB Savage를 포함하는 모든 행을 출력한다.)
# grep '5.' datafile (숫자 5, 마침표, 임의의 한 문자가 순서대로 나타나는 문자열이 포함된 행을 출력한다.)
# grep '.5' datafile (.5가 나오는 모든 행을 출력한다.)
# grep '^[we]' datafile (w나 e로 시작하는 모든 행을 출력한다.)
# grep '[^0-9]' datafile (숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다.)
# grep '[A-Z][A-Z] [A-Z]' datafile (대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)
# grep 'ss* ' datafile (s가 한 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다.)
# grep '[a-z]{9}' datafile (소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다.)
# grep '(3).[0-9].*1 *1' datafile (숫자 3,마침표,임의의 한 숫자,임의 개수의 문자,숫자 3(태그),임의 개수의 탭 문자,숫자 3의 순서를 갖는 문자열이 포한된 모든 행을 출력한다.)
# grep '
(north로 시작하는 단어가 포함된 모든 행을 출력한다.)
# grep '' datafile (north라는 단어가 포함된 모든 행을 출력한다.)
# grep '<[a-z].*n>' datafile (소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다. 여기서 .*는 공백을 포함한 임의의 문자들을 의미한다.)

3.3 grep에 옵션 사용
# grep -n '^south' datafile (행번호를 함께 출력한다.)
# grep -i 'pat' datafile (대소문자를 구별하지 않게 한다.)
# grep -v 'Suan Chin' datafile (문자열 Suan Chin이 포함되지 않은 모든 행을 출력하게 한다. 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.
# grep -v 'Suan Chin' datafile > black
# mv black datafile
# grep -l 'SE' * (패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다.)
# grep -w 'north' datafile (패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.)
# grep -i "$LOGNAME" datafile (환경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다. 작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)

3.4 egrep
egrep(extended grep) : grep에서 제공하지 않는 확장된 정규표현식 메타문자를 지원 한다. grep와 동일한 명령행 옵션을 지원한다.

3.4.1 egrep 예제
# egrep 'NW|EA' datafile (NW나 EA가 포함된 행을 출력한다.)
# egrep '3+' datafile (숫자 3이 한 번 이상 등장하는 행을 출력한다.)
# egrep '2.?[0-9]' datafile (숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
# egrep ' (no)+' datafile (패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
# egrep 'S(h|u)' datafile (문자 S 다음에 h나 u가 나오는 행을 출력한다.)
# egrep 'Sh|u' datafile (패턴 Sh나 u를 포함한 행을 출력한다.)

3.5 고정 grep 과 빠른 grep
fgrep : grep 명령어와 동일하게 동작한다. 다만 정규표현식 메타문자들을 특별하게 취급하지 않는다.
# fgrep '[A-Z]****[0-9]..$5.00' file ([A-Z]****[0-9]..$5.00 이 포함된 행을 출력한다. 모든 문자들을 문자 자체로만 취급한다.)

2010년 6월 7일 월요일

eAccelerator설치

eAccelerator는 PHP가속, 최적화, 동적 컨텐츠 캐시입니다.(PHP Op-Code Caching) 공유 메모리에 컴파일된 상태에서 캐싱으로 PHP 스크립트의 성능을 향상시킵니다. 실행 속도를 높여 스크립트를 최적화합니다.
tomcat 과 같은 was 에서는 jsp파일을 데몬이 서비스를 올리면서 메모리 상에 올리는것과 같은 역할을 합니다.
한번 접속된 페이지는 일정시간 메모리에 올리기에 동일 사이트 및 페이지에 접속했을 때 디스크 I/O 가 아닌 메모리 I/O가 일어남으로 빠르게 페이지를 보여줄수 있습니다.

다운로드
wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2

설치
# yum -y install autoconf-*   를 먼저 설치해준후

다운받은 파일을 압축을 푼후
# ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php/bin/php-config
# make && make install

make install을 하면 아래와 같이 eacclerator.so 파일의 위치를 알려줍니다.
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20060613/

설치가 완료 되면 캐싱된 파일이 저장될 디렉토리를 지정 해줘야 합니다.
저는 /var/tmp/eaccelerator 를 사용하겠습니다 혹은 다른위치에 생성해 준뒤에 owner를 http를 실행하는 유저로 바꿔주시고 위치를 바꿨다면 위 php.ini 파일 중 당연히 eaccelerator.cache_dir="/var/tmp/eaccelerator" 항목을 편집해주어야겠죠

# mkdir /var/tmp/eaccelerator
# chown nobody.nobody /var/tmp/eaccelerator
# chmod 700 eaccelerator

그리고 php.ini을 편집합니다.(추가)
[eAccelerator]
extension_dir=/usr/local/php/lib/php/extensions/no-debug-zts-20060613  // 모듈위치
extension="eaccelerator.so"
eaccelerator.shm_size="0"  // eAccelerator가 사용할 공유 메모리량. 단위 MBytes. 0을 지정하면 기본값 16MBytes. default = 0
eaccelerator.cache_dir="/var/tmp/eaccelerator"  // 캐쉬 디렉토리
eaccelerator.enable="1"  // eaccelerator 사용 여부
eaccelerator.optimizer="1" // 최적화 여부
eaccelerator.log_file = "/usr/local/apache/logs/eaccelerator_log"   // 로그 파일 위치
eaccelerator.check_mtime="1" // php 파일 변경 시간 체크 여부
eaccelerator.debug="0"  
eaccelerator.filter=""  // 캐싱할 php 파일을 지정한다. *.php *.html *.php3 처럼 지정할 수있으며 "" 로 비워두면 모든 php 파일이 캐싱된다.
eaccelerator.shm_max="0" // 자체 함수인 eaccelerator_put() 를 할당할 메모리 크기 (예. 10240, 10K, 1M)
eaccelerator.shm_ttl="0" // 메모리 공간이 부족할 경우 지정한 시간동안  엑세스가 없다면 스크립트 제거. 0은 삭제 안함
eaccelerator.shm_prune_period="0" //지정한 초보다 생성이 오래된 스크립트 제거. 0은 삭제 안함
eaccelerator.shm_only="0" //컴파일된 스크립트를 디스크에 캐싱할 것인지의 여부 판단
eaccelerator.compress="1" // 캐쉬된 내용 압축 여부
eaccelerator.compress_level="9"  // 압축 레벨 지정. 9는 최대 압축
eaccelerator.keys     = "shm_and_disk"
eaccelerator.sessions = "shm_and_disk"
eaccelerator.content  = "shm_and_disk"
eaccelerator.allowed_admin_path = "" // 모니터링 파일이 있는 경로

extension_dir=/usr/local/php/lib/php/extensions/no-debug-zts-20060613
위의 경로는 eacclerator.so 파일의 경로를 기술해줍니다.

저장후 아파치를 재시작한 뒤에 php -v 를 해보면 아래와같이 이전과 다르게 eAccelerator의 내용이 추가 되신걸 보실수 있습니다.

Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator    with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
    with Suhosin v0.9.27, Copyright (c) 2007, by SektionEins GmbH
    with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies

마지막으로 한가지만 더해주면 됩니다
모니터링 페이지를 생성하는것입니다
eaccelerator.allowed_admin_path 설정한 디렉토리에 control.php 파일을 복사합니다
control.php 파일은 압축푼 디렉토리안에 있습니다

control.php 파일을 편집

$auth = false;   => false 을 true 로 수정
$user = "admin";         ----> 사용자 아이디를 원하는것으로 수정
$pw = "eAccelerator";    ----> 암호도 원하는것으로 변경하면 됩니다

접속 : http://주소또는IP/control.php

top 화면 내용중 load average와 PRI : priority(우선순위) 정리

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

load average

서버에 걸리는 평균 부하율 1분, 5분, 15분

load average 는 process 작업의 대기를 의미합니다. 즉, 1분간 평균 load average가 1 이라면, 1분동안 1개의 작업이 대기하고 있다는 얘기입니다.
즉 값이 높으면 높을수록 대기하는 작업이 많아지게 되고, 이는 곧 서버가 부하를 받고 있다는 얘기가 됩니다.

즉, 서버가 아주 좋은 상태는 load average 가 1 보다 작은 값이고, 1보다 클 경우 는 서버가 부하를 받기 시작한다고 보게 됩니다.

평균적으로 4정도를 넘으면 부하를 받는다고 판단을 하며, 이 기준은 관리자마다 주관적인 차이가 있습니다.
또한 같은 사람이라도, 서비스에 따라, load average 15 가 양호한 상태라고 판단하는 경우가 있습니다.
즉, load average 는 절대적인 판단 기준이 되는 것은 아니라는 의미입니다.

예를 들어 서버에서 별로 하는 것이 없는데 15가 넘는다면, 그건 심각한 문제가 있다는 얘기가 될수 있지만, 서버에서 DB 돌리고, ftp 돌리고, 대량메일 발송하고, 웹 동시 접속자가 1000명 정도 되는 서버인데 15라면 잘 버티고 있는 것이라 봐야 겠습니다.

우리 서비스상의 서버의 load average 값이 5이상이라면 이때는
커널 튜닝 and or 하드웨어의 업그래이드가 필요한데 이것은 메모리의 사용률을 함께 참조 해야 합니다.

먼저 필요 없는 프로세스가 실행되고 있나 확인 하고
필요 없는 프로세스라고 판단되는 경우 과감하게 종료 시킵니다.
※ Zombie : process는 죽었는데 자원을 차지하고 있는 것(전염성이 있음)
반드시 강제 종료해야 한다.
강제 종료 안 되면 시스템 재부팅 합니다.

커널의 튜닝의 경우 로그 파일을 확인 하여 file limit과 같이 프로세스 관련 항목을 튜닝해야 하며
메모리의 자원이 부족하거나 swap메모리의 양이 늘어나면
메모리를 추가 하여야 하며
메모리에 여유가 있으나 load average값이 늘어나면 CPU를 업그레이드 해야 합니다.



PRI : priority(우선순위)

CPU 스케줄링에서 필요한 순위입니다.

현재 OS는 한번에 여러개의 프로세스가 동시에 실행되도록 함으로써 CPU의 노는 시간을 줄이고 자원사용의 효율성을 최대화 시키기 위해서 다중프로그래밍이라는 알고리즘을 이용합니다.

※ 다중 프로그래밍 : CPU 점유방법

CPU는 사용자가 계산을 요구하면 그 작업에 대한 header 를 가지고 작업을 메모리에서 수행합니다.
메모리에서 작업을 하는 동안 사용자가 또다른 요구를 하게 되면 CPU는 우선되는 값을 체크합니다.
나중에 사용자가 요구한 계산값이 우선권이 더 높으면 CPU는 처음에 사용자가 요구한 계산값을 메모리사용량을 줄이고 나중에 요구한 값에 더 많은 메모리 영역을 분배하여 계산을 하도록 합니다.
이렇게 작업영역을 배분해주는 것이 스케줄링이라고 보시면 됩니다.

이 다중 프로그래밍에서 프로세스 순서에서 순위를 나타내는 값을 우선 순위 라고 합니다.

2010년 4월 28일 수요일

ethtool로 nic 설정 변경하기

[root@XENPBX ~]# ethtool peth0
Settings for peth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: umbg
        Wake-on: g
        Current message level: 0x00000007 (7)
        Link detected: yes
[root@XENPBX ~]# ethtool -s peth0 100 duplex full autoneg on

[root@XENPBX ~]# ethtool peth0
Settings for peth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes:  100baseT/Full
        Advertised auto-negotiation: Yes
        Speed: 100Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: umbg
        Wake-on: g
        Current message level: 0x00000007 (7)
        Link detected: yes

2010년 4월 26일 월요일

phpmyadmin 설치 세팅

[출처] [MYSQL] PHPMyadmin 설치 및 간단한 사용방법|작성자 홍이얌

 

아래의 설정파일에대한 설명은 원본문서를 번역한것입니다.
저의 영문번역 실력이 미약한 관계로 잘못 번역된것이 있을수도있습니다.
이 글을 보는 분들은 이점을 유의하시고, 영문메뉴얼을 기초로해서 아래의 내용은참고로 하시기 바랍니다.

../phpmyadmin/config.sample.inc.php 파일을

config.inc.php 로 복사

$cfg['blowfish_secret'] = '';
''안에 값 입력(도메인이름 넣어주면 될듯)




phpMyAdmin Project Homepage : http://www.phpwizard.net/projects/phpmyadmin/
Sourceforge phpMyadmin download page : http://phpmyadmin.sourceforge.net/


[ 소 개 ]

phpMyadmin 으로 MYSQL-server 의 전반적인것을 관리할수있다.

- 데이타베이스의 생성 및 삭제
- 테이블의 생성,삭제,수정
- 필드의 수정,추가,삭제
- SQL 문의 실행과 batch-queries
- Fields 의 Key 관리
- text 파일을 데이타베이스에 입력하기
- Table 의 Dump
- export(*) and import data to CSV values
- 여러대의 서버와 단 하나의 데이타베이스를 관리할수있다.
- 20여개국의 언어와 호환된다.

[ 설 치 ]

note : phpmyadmin 은 mysql_database server 의 특별한 보안에관한 어떠한것도 지원하지않는다.

Quick Install

[root@angelsoma]# tar xvfz phpMyadmin-2.2.2-rc1.tar.gz

이것으로 phpmyadmin에 대한 설치는 끝이다.
중요한것은 config.inc.php 의 설정이다.

[ 설정하기 - config.inc.php ]

[root@angelsoma phpmyadmin-2.2.2-rc1]# vi config.inc.php

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

$cfgPmaAbsoluteUri string

- phpmyadmin 을 설치한 디렉토리의 완벽한 경로를 입력한다.Version 정보까지입
력해야한다.

$cfgPmaAbsoluteUri = 'http://www.angelsoma.com/home/phpMyadmin-2.2.2-rc1/';

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

$cfgServers array

- phpmyadmin-1.4.2 버전 이후부터 여러대의 서버에대한 관리가 가능해졌다.
여기에는 여러대의 mysql-server에대한 정보를 설정한다.
$cfgServers[1] 은 Mysql-server의 첫번째 서버에대한 설정내용이고,
$cfgServers[2] 은 두번째 서버에대한 설정이다.
..
..
..
$cfgServers[n] 은 n 번째 서버에대한 설정이다.

$cfgServers[1]['host'] = 'localhost';
- Mysql-server의 hostname

$cfgServers[1]['port'] = '';
- Mysql-server의 port. 공백이면 default port를 의미 = 3306

$cfgServers[1]['socket'] = '';
- Socket 사용시의 path, 공백은 default

$cfgServers[1]['connect_type'] = 'tcp';
- Mysql-server에대한 connection 방법을 설정한다. socket & tcp 두가지 옵션이
있다.기본은 tcp 로 설정되어있다.

$cfgServers[1]['stduser'] = '';
-

$cfgServers[1]['stdpass'] = '';

$cfgServers[1]['adv_auth'] = FALSE;
- Mysql-server를 advanced authentication mode로 사용한건지 basic으로 사용할
것인지를 결정한다.
- authentication mode는 PHP 가 아파치의 MODULE로 사용될때만 사용가능하다.
- cgi 와는 사용할수없다.

$cfgServers[1]['user'] = 'soma';
- Mysql-server에 접속할 사용자를 입력한다.

$cfgServers[1]['password'] = 'test;
- Mysql-server에 접속할 사용자의 패스워드를 입력한다.

$cfgServers[1]['only_db'] = 'testdb';
- user,password 사용자가 사용한 데이타베이스 명을 입력한다.

$cfgServers[1]['verbose'] = '';
- 여러대의 서버를 관리할때 사용된다.만약 이곳에 설정을 하였다면 Menu의 호
스트네임대신에 이곳에 설정한 목록들이 출력된다.

$cfgServers[1]['bookmarkdb'] = '';
$cfgServers[1]['bookmarktable'] = '';
- phpMyadmin-2.2.0 버전 이후부터 bookmark query 가 가능하게되었다.
이 기능은 자주쓰이는 query문에 적용하기 유용한다
- 공백은 bookmark를 지원하지않는다.
- 이 기능은 아래처럼 사용한다.

CREATE TABLE bookmark (
id int(11) DEFAULT '0' NOT NULL auto_increment,
dbase varchar(255) NOT NULL,
user varchar(255) NOT NULL,
label varchar(255) NOT NULL,
query text NOT NULL,
PRIMARY KEY (id)
);

이렇게 table을 만들고 $cfgserver[n]['bookmarkdb']에 해당 db 명을 입력하고
$cfgserver[n]['bookmarktable']에 bookmark를 설정하면 phpmyadmin에서 bomakr
를 선택할수가 있다.

- stduser 은 bookmark table에서 select,insert,delete privileges 해야하며,
여기에서는 privileges 설정을 아래처럼 해야한다.

GRANT SELECT,INSERT,DELETE . to 'stduser'@localhost;

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

$cfgServerDefault integer
- 한대이상의 서버를 설정하였다면 여기에 정의된 번호의 서버가 자동으로좁속
된다. integer의 번호는 phpmyadmin에 설정된 서버의 번호값이된다.
- 만약 하나의 서버만 설정이되어있다면, 반드시 그 번호를 정의해야한다.
- 0 은 기본 서버설정이 아니다.
.............................................................................

$cfgOBGzip boolean
- gzip output buffering을 사용할것인지 여부를 결정한다.
- 이 설정이 true 이면 http 전송속도를 증가시킨다.
.............................................................................

$cfgPersistentConnections boolean
- 지속적인 mysql_connect를 사용할것인지의 여부
.............................................................................

$cfgExecTimeLimit integer [number of seconds]
- 최대실행시간을 설정한다
- 0 는 제한시간을 두지않는다는 의미이다.
- 이 설정은 PHP가 안전모드로 구동중일때는 효가가 없다.

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

$cfgSkipLockedTables boolean
- 사용중인 테이블을 표시하고,Lock이걸린 테이블의 데이타베이스를 보여준다.
.............................................................................

$cfgShowSQL boolean
- phpmyadmin에서의 query 과정을 보여줄것인지 아닌지를 결정한다.
.............................................................................

$cfgAllowUserDropDatabase boolean
- administrator를 제외한 일반 사용자들이 자기자신의 데이타베이스를 삭제를할
수있게 할것인지 아닌지에대한 설정
- FALSE 로 설정된다면, Drop Database 라는것을 보여주지않을뿐더러
DROP DATABASE mydatabase 을 reject한다.
.............................................................................

$cfgConfirm boolean
- 테이블이나,데이타베이스를 삭제할때 메시지를 출력할것이냐 아니냐를 설정.

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

$cfgShowTooltip boolean
- 왼쪽 프레임에 tooltip를 보여줄것인지 아닌지를 결정한다.

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

$cfgShowMysqlInfo boolean
- Mysql runtime 정보를 출력할것인지,아닌지를 설정한다.
.............................................................................

$cfgShowMysqlVars boolean
- Mysql system variables 정보를 출력할것인지 아닌지를 설정한다.
.............................................................................

$cfgShowPhpInfo boolean
- Php information를 출력할것인지 아닌지를 결정한다.
.............................................................................

$cfgShowStats boolean
- database의 세밀한부분과 table의 속성에대한 페이지의 사용밥법 및 통계치를
보여줄것이지에대한 설정.
.............................................................................

$cfgNavigationBarIconic boolean
- navigation bar 버튼을 text 보여줄것인지,상징으로만 사용할것이지결정.
.............................................................................

$cfgShowAll boolean
- 모든 레코드를 보여줄것인지 아니지를 설정.
.............................................................................

$cfgMaxRows integer
- 결과값에대한 출력의 한계를 설정한다.

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

$cfgOrder string [DESC|ASC|SMART]
- 정열방법을 결정한다.
.............................................................................

$cfgProtectBinary boolean
- BLOB or BINARY fields가 수정시에 보호되어지는것에대한 설정.

- FALSE to allow edition of all fields;
- blob to allow edition of all fields except BLOBS;
- all to disallow edition of all BINARY or BLOB fields.
.............................................................................

$cfgZipDump boolean
$cfgGZipDump boolean
$cfgBZipDump boolean
- 데이타를 dump 받을때 위의 압축형식을 지원할것인지 아닌지를 결정.
.............................................................................

$cfgManualBase string
- Mysql 문서메뉴얼이있는 URL 정보를담고있다.
.............................................................................

$cfgDefaultLang string
- 기본언어를 설정한다.
.............................................................................

$cfgLang string
- 강제로 사용할 언어를 설정한다.
.............................................................................
Customization & design

$cfgLeftBgColor = '#D0DCE0'; // background color for the left frame
$cfgRightBgColor = '#F5F5F5'; // background color for the right frame
$cfgBorder = 0; // border width on tables
$cfgThBgcolor = '#D3DCE3'; // table header row colour
$cfgBgcolorOne = '#CCCCCC'; // table data row colour
$cfgBgcolorTwo = '#DDDDDD'; // table data row colour, alternate
$cfgPointerColor = '#CCFFCC'; // color of the pointer in browse mode
$cfgTextareaCols = 40; // textarea size (columns) in edit mode
$cfgTextareaRows = 7; // textarea size (rows) in edit mode
$cfgLimitChars = 50; // max field data length in browse mode
$cfgModifyDeleteAtLeft= TRUE; // show edit/delete links on left side of browse
$cfgModifyDeleteAtRight= FALSE // show edit/delete links on right side of browse
$cfgLeftWidth = 150; // left frame width

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

$cfgColumnTypes array
- Mysql 에사 사용가능한 칼름에대한 정의.
.............................................................................

$cfgAttributeTypes array
- 사용가능한 필드에대한 속성
.............................................................................

$cfgFunctions array
- Mysql에 지원대는 함수에대한 정의
.............................................................................

많은 설정들이있지만 가장단순하게 사용하려면 아래의 사항만 입력하시고 확인할수있습니다.

$cfgServers[1]['host'] = 'localhost';
$cfgServers[1]['port'] = '';
$cfgServers[1]['socket'] = '';
$cfgServers[1]['connect_type'] = 'tcp';
$cfgServers[1]['stduser'] = '';
$cfgServers[1]['stdpass'] = '';
$cfgServers[1]['adv_auth'] = FALSE;
$cfgServers[1]['user'] = 'soma';
$cfgServers[1]['password'] = 'password';
$cfgServers[1]['only_db'] = 'somadb';
$cfgServers[1]['verbose'] = '';
$cfgServers[1]['bookmarkdb'] = '';
$cfgServers[1]['bookmarktable'] = '';


이상으로 설정에대한 간단한 설명을 마치겠다.
이 문서는 phpMyadmin 소스에대한 압축을 풀면 html / txt 라는 두가지 유형으로메뉴얼이 만들어져있다. 이부분을 꼭 참고하기 바랍니다. 

VI 단축키

Vi 시작하기

  • $ vi : vi 시작하기
  • $ vi aaa.txt : aaa.txt 파일을 편집하면서 vi 시작
  • $ vi -R aaa.txt : 읽기 전용으로 열기
Esc : 또는 /
편집상태
명령대기상태
(Esc모드)

명령줄상태
삽입명령어
i,a,A,I,o,O
Esc 또는 Enter
  • 명령대기상태 → 편집상태 : 삽입명령어 (아래참조.)
  • 편집상태 → 명령대기상태 : Esc글쇠.
  • 명령대기상태 → 명령줄상태 : : 또는 / (아래참조)
  • 명령줄상태 → 명령대기상태 : Esc 또는 Enter (아래참조)

커서의 이동

  • h, l, j, k : 왼쪽(←, Back space), 오른쪽(→, space), 위(↑), 아래(↓)
  • b, w : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동.
  • B, W : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동. (문장부호 무시)
  • e : 다음 단어의 끝 글자로 이동.
  • E : 다음 단어의 끝 글자로 이동. (문장부호 무시)
  • H, M, L : 화면의 맨 위/ 중간 / 맨 아래로
  • 0 : 그 줄의 맨 처음으로 (숫자 0이다.)
  • $ : 그 줄의 맨 끝으로
  • + : 다음 줄의 처음으로
  • - : 윗 줄의 처음으로
  • 3| : 현재 줄의 3번째 열로
  • 4H : 화면 상의 처음 줄부터 4줄 밑으로
  • 4L : 화면 상의 마지막 줄부터 4줄 위로
  • (, ) : 이전 문장의 시작으로 / 다음 문장의 시작으로
  • {, } : 이전 문단의 시작으로 / 다음 문단의 시작으로
  • [[, ]] : 이전 섹션의 시작으로 / 다음 섹션의 시작으로

편집 버퍼를 통한 이동

  • ^F, ^B : 한 화면 앞으로 / 뒤로 (^는 Ctrl글쇠를 의미.)
  • ^D, ^U : 반 화면 앞으로 / 뒤로
  • 4^B : 4화면 위로 이동
  • 4^F : 4화면 아래로 이동
  • 7^U : 7줄 위로 이동
  • 7^D : 7줄 아래로 이동
  • ^Y : 커서는 현재 위치 그대로 화면만 한 줄씩 아래로 이동
  • ^E : 커서는 현재 위치 그대로 화면만 한 줄씩 위로 이동

행 단위 이동

  • :0 : 파일의 첫 번째 행으로 가기 (숫자 0)
  • :10 : 10번째 행으로 가기
  • :$ : 파일의 마지막 행으로 가기
  • G : 파일의 마지막 행으로 가기
  • 10G : 10번째 행으로 가기

삽입명령어

  • i : 커서 위치부터 삽입 시작
  • a : 커서 위치 오른쪽부터 삽입 시작
  • A : 현재 줄의 맨 끝 부터 삽입 시작
  • I : 현재 줄의 맨 처음 부터 삽입 시작
  • o : 커서 아래에 행 삽입
  • O : 커서 위에 행 삽입

삭제명령

  • x : 현재 커서위치의 한 문자 삭제
  • X : 현재 커서 왼쪽의 한 문자 삭제
  • dd : 한 줄 지우기
  • 4dd : 4 줄 지우기
  • dw : 한 단어 지우기
  • d2w : 2 단어 지우기
  • D : 커서 오른쪽 행 삭제
  • :5 d : 5 째 행 삭제
  • :5,10 d : 5-10 째 행 삭제

파일의 저장 및 종료

  • :wq : 저장 후 vi 종료
  • :w : 저장 (종료는 하지 않고 계속 편집)
  • :q! : 저장하지 않고 vi 빠져나가기
  • :w filename : filename으로 저장 후 계속 편집
  • ZZ : 변경사항 저장 후 vi 종료

내용의 복사 및 이동

  • yy : 현재의 행 복사
  • 5yy : 현재의 행 위치부터 5행 복사
  • p : 아래(오른쪽)에 붙여넣기
  • P : 위(왼쪽)에 붙여넣기
  • f4yy : 현재의 행 위치부터 4행을 'f'라는 이름의 버퍼에 복사
  • fp : 'f'라는 이름의 버퍼에 복사된 내 용을 현재 행 위치에 붙여넣기
  • :3 co 7 : 3 행을 7행 다음으로 복사
  • :1,3 co 7 : 1-3 행을 7행 다음으로 복사
  • :3 m 7 : 3 행을 7행 다음으로 이동
  • :1,3 m 7 : 1-3 행을 7행 다음으로 이동

내용 고치기

  • J : 현재 행과 아래 행 결합
  • 3J : 3줄 합치기
  • u : 이전 명령 취소
  • cw : 단어 변경
  • cc : 행 변경
  • C : 커서 오른쪽의 행 변경
  • s : 커서가 위치한 문자열 대체
  • r : 한 글자만 변경 (입력 모드로 바뀌지 않음)
  • R : 입력하는 대로 겹쳐써서 변경
  • xp : 커서 위치 문자와 오른쪽 문자 교환
  • - : 문자형(대,소문자) 변경
  • U : 행 변경사항 취소
  • :u : 이전의 최종행 취소

명령 취소 및 반복

  • . : 마지막 명령 반복
  • 2. : 마지막 명령 2회 반복
  • u : 마지막 명령 취소
  • U : 현재 줄을 저장

행 번호 설정 및 화면표시

  • :set nu : 행 번호 표시
  • :set nonu : 행 번호 숨기기
  • := : 현재 줄번호 보여주기
  • :/pattern/ = : pattern이 위치한 줄번호 보여주기

시스템이 다운된 후에 파일 되살리기

  • vi -r : 되살릴 수 있는 모든 파일 이름 보여주기
  • vi -r file.txt : vi를 시작하여 지정한 파일 되살리기

다른 파일을 파일 내로 삽입

  • :r filename : 커서 다음에 파일 삽입
  • :20 r filename : 파일을 20번째 행 다음에 삽입

새로운 파일 편집하기

  • :e fine.txt : file.txt 편집하기
  • :e! : 현재의 편집중인 내용 무시하고 가장 최근에 편집한 내용 다시 편집하기

다중 편집하기

    % vi file1 file2 file3
    혹은
    :e file1 file2 file3
    했을 때,
  • :args : 편집 중인 파일목록 보여주기
  • :n[ext] : 다음 파일로 넘어가기
  • :prev[ious] : 이전 파일로 넘어가기 (단 편집 중인 파일이 저장되지 않으면 다음 파일로 넘어갈 수 없다.)

문자열 탐색

  • /aaa : 'aaa' 찾기 (현재 위치부터 뒤로)
  • ?aaa : 'aaa' 역방향 찾기 (현재 위치부터 앞으로)
  • / : 가장 최근에 검색한 문자열 다시 검색
  • ? : 가장 최근에 검색한 문자열 다시 역방향 검색
  • :set noh : 문자열 검색 후 문자열 강조 끄기

치환

vi에서 치환은 정규표현식이 이용된다. (실제로 이 상태에서 실행하는 명령어는 ed나 ex라는 프로그램이 처리하게 된다. 그래서 보통 이 상태를 "ed-모드"라고 한다.) 문서에서 원하는 패턴을 찾으려면 바로 위에 '문자열 탐색'에서 설명된 바와 같이 /문자열 이나 ?문자열 을 사용한다. 문자치환 명령은 다음과 같다.

[형식] :범위s/변경전/변경후/수정자

'범위'는 명령이 실행될 범위(예: 10,20 이면 10행 부터 20행 까지)를 나타낸다. 's'는 치환(substitute)의 약자이며 '수정자'는 치환 명령의 세부사항을 결정한다. 필요한 것만 뒤에 적어주면 된다. (중복 가능)

  • g (global) - 한 줄에서 일치하는 부분을 여러개 찾았을 때 전부 치환한다. 이것을 사용하지 않으면 처음 것만 치환.
  • c (confirm) - 만족하는 정규표현식을 찾았을 때 치환하기 전에 확인한다.
  • i (ignore-case) - 대소문자를 구별하지 않는다.

"변경전"과 "변경후"에 치환할 내용을 입력한다. "변경전"에 정규표현식을 적는다. 정규표현식으로 ., *, ^, $, [], \(...\), \<...\>, POSIX.2 단축 표현을 사용할 수 있다. 여기서 여러 문자를 묶여서 단위를 만들고 찾은 내용을 기억하는 특수문자가 \(, \)임을 주의해야 한다. 반대로 (, )가 일반문자이다. vim(VI iMproved)에서는 vi에 추가로 |, +, (?와 같은) =, {n,m}을 사용할 수 있지만, 앞에 \ 를 붙여야 한다. 또, vim에는 \i, \k, \p, \s 등의 단축 표현들이 있다.

"변경후"에 \n & 를 사용할 수 있다. \n 는 "변경전"에서 n번째 \(...\) 에 대응하는 부분이고, & 는 "변경전"에 만족한 전체를 나타낸다. 예를 들어,
:%s/\([0-9][0-9]*\) \([Cc]hapter\)/\2 \1/
는 문서에서 12 Chapter같은 부분을 Chapter 12와 같이 치환하고,
:%s/F[1-9][12]*/&/g
는 HTML 문서에서 "F1" ~ "F12"란 단어 모두를 굵은 체로 바꿉니다. (주의! &는 정규표현식의 특수문자는 아니지만 vi의 특수문자이므로, 문자그대로의 &를 사용하려면 대신 \& 를 사용해야 한다.) 이외에도 (뒤를 모두 대문자로) \u 나 (뒤를 모두 소문자로) \l 같은 기능이 있다.

    :%s/aaa/bbb/g - 파일 전체(g)에서 'aaa'을 'bbb' 로 치환
    :%s/^M//g - 파일 전체(g)에서 ^M 을 삭제. ^M은 Ctrl+V+Enter로 입력한다.
    :s/aaa/bbb/ - 현재 행에서 'aaa'을 'bbb' 로 치환
    :1,10 s/aaa/bbb/ - 1행부터 10행 까지 'aaa'을 'bbb' 로 치환
    :1,. s/str/rep/ - 1부터 현재행까지 'aaa'를 'bbb' 로 전부 바꾸기
    :g/감자/s//바위/gc - 각 발생 확인 후 대체

주의할 점은 치환명령어가 / 문자로 각 부분을 구분하기때문에 "변경전"이나 "변경후"에 / 문자를 사용하려면 \/ 같이 써야한다.
필요하다면 / 대신 다른 문자를 사용해도 된다. 예를 들어,
:%s/\/usr\/local\/bin\//\/usr\/bin\//g
대신
:%s#/usr/local/bin/#/usr/bin/#g
가 알아보기 더 쉽다.

2010년 4월 16일 금요일

CentOS5,Fedora7 네임서버 설정법

CentOS5.0/Fedora7 에서 네임서버 설정법

 

 최근OS에서 DNS관련 설정부분에 변화가 있어 간단히 정리합니다.

 

설정하면서 확인한  CentOS 5.0에서 변경된 부분   (fedara 7도 동일)

1. OS설치시 DNS설치를 선택하여 설치했는데 named.conf 및 Zone File들이 안보여 당황하셨을거 같습니다. - -

2. 이번버전은 기본이 View사용으로 바뀌어서 처음접하시는분은 혼란스러울거 같습니다. - -

3. 최근의 버전은 chroot를 기본으로 사용됩니다.  zone file이 /var/named/chroot/var/named에..

4. named.conf 파일은 include기능을 이용하여 기본 zone정보는 named.rfc1912.zones 파일 안에 있습니다.

 

아래는 CentOS5.0 , Fedora 7 에서 DNS설정하는 법을 간략히 정리해봤습니다.

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

1. 버전 및 라이블러리 정보
[root@localhost ~]# more /etc/redhat-release
CentOS release 5 (Final)

[root@localhost ~]# rpm -qa |grep glibc
glibc-2.5-12

 

2. OS설치시 Firewall mode로 설치한경우 우선 iptables해제함.
# service iptables stop

firewall mode로 설치시 , DNS53번포트가 막혀서, 서버자체에서는 되는데 외부에서는 포트가 막혀있음 서비스가 안되거든요. TCP,UDC 53만 열어주셔도 됩니다


3. named.conf 및 Zone file들  복사하기
[root@localhost ~]# locate named.conf
/usr/share/doc/bind-9.3.3/sample/etc/named.conf


# cp -rf /usr/share/doc/bind-9.3.3/sample/etc/*  /var/named/chroot/etc/
# cp -rf /usr/share/doc/bind-9.3.3/sample/var/named/* /var/named/chroot/var/named/


4. ddns_key 우선 주석처리
# vi /etc/named.conf
//key ddns_key
//{
//      algorithm hmac-md5;
//      secret "use /usr/sbin/dns-keygen to generate TSIG keys";
//};

 

5. acl과 match-clients  설정

 # vi named.conf

 

acl "localarea" {
        127.0.0.1;
        59.6.177.1;
};

view "local" {
       match-clients           {  localarea; };
        recursion yes;

zone "." IN {
        type hint;
        file "named.ca";
};

계속..

 

view    "external"
{
/* This view will contain zones you want to serve only to "external" clients
 * that have addresses that are not on your directly attached LAN interface subnets:
 */
        match-clients           { any; };

        recursion no;
//      match-destinations      { !localnets; !localhost; };

          
 

6. 네임데몬 시작
# service named restart

[root@localhost etc]# ps -ef |grep named
named     3610     1  0 06:22 ?        00:00:00 /usr/sbin/named -u named -t /var/named/chroot

root      3620  2794  0 06:23 pts/1    00:00:00 grep named


7. 서비스 도메인추가시

etc]# vi named.rfc1912.zones 에 추가

 

zone file 만들기

[root@localhost named]# cp localdomain.zone yahooms.com.zone

[root@localhost named]# vi yahooms.com.zone
$TTL    10
@               IN SOA  localhost root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
                IN NS           ns1.yahooms.com.
                IN NS           ns2.yahooms.com.
localhost       IN A            59.6.177.172
ns1             IN A            59.6.177.172
ns2             IN A            59.6.177.172
www             IN A            59.6.177.172
~

 

8.적용
# rndc reload

 

 

기타 정보
#  도메인 등록  또는 네임서버 정보변경하는법

1) GTLD에 등록확인

C:\Documents and Settings\thseo.SS>dig @a.gtld-servers.net serverchk.com ns +short
ns1.serverchk.com.
ns2.serverchk.com.

 

2) 도메인등록기관에 ns3추가할경우 호스트를 추가, 네임서버변경

확인

C:\Documents and Settings\thseo.SS>dig @a.gtld-servers.net serverchk.com ns +short
ns1.serverchk.com.
ns2.serverchk.com.
ns3.serverchk.com.

 

 

9.4.2 이상 버전 설치시 다음 내용도 참고해주시기 바랍니다. http://cafe.naver.com/dnspro/8955

 

#  IPTABLES 로 포트허용하기

최근 linux OS는 기본설치시 Firewallmode로 설치되어 iptables로 53번포트가 막혀있어 허용해야합니다. 

bind zone파일 세부설명

모든 zone파일은 SOA 레코드로 zone파일의 시작을 알린다.
꼭 다음과 같은 형식을 지켜야 된다.

@               IN         SOA              ns1.rootman.co.kr.      yunil.rootman.co.kr.  (
                                            20010504            ; serial
                                            10800               ; refresh
                                            3600                ; retry
                                            3600000             ; expire
                                            43200  )            ; mininum

SOA 레코드의 data 부분은 여러개의 요소로 구성된다. 각 data 부분의 설명은 다음과 같다.

ns1.rootman.co.kr.    

1차 네임 서버를 정의하고 있다.

yunil.rootman.co.kr.  
관리자 메일 주소를 정의하고 있다. @는 zone파일에서 특별한 의미를 갖고 있기 때문에 yunil@rootman.co.kr.
yunil.rootman.co.kr. 로 표기 해야 된다.

주의 : bind 9 (bind 8.2.3 이후) 부터는 SOA 레코드의  2차 네임 서버와 관련된 data 설정을 시작하는  여는 괄호 " ( " 는
꼭 SOA 레코드의 첫행의 마지막에 위치 해야 된다. 다른 곳에 위치 할 겨우 bind 9에서 error을 발생시킬 수 있다.

20010504               ; serial
zone 파일의 버젼을 의미한다. 보통 zone파일을 수정하거나 생성한 날을 숫자로 설정한다.
2차 네임  서버는 정기적으로 1차 네임 서버의 이 값을 확인하고 2차 네임 서버의 사본을 나타내는 일련 번호보다 크면
1차 네임 서버로 부터 zone파일을 전송해서 2차 네임 서버 정보를 갱신한다.
즉 1차 네임 서버의 정보가 갱신 되었는지를 2차 네임 서버는 이 값을 통해서 확인한다.

10800                  ; refresh
2차 네임 서버가 1차 네임 서버의 갱신 내용을 확인하기 위해 주기적으로 체크하는 시간을 초(s)로 설정한다.

3600                   ; retry
2차 네임 서버가 refresh값에 의해 1차 네임 서버로 접속시도 때 1차 서버의 문제가 접속을 못한 경우 다시 접속 시도할
시간을 설정한다. (예 : 1차 네임 서버의 정전, 네트웍 과부하 등)


3600000                ; expire
2차 네임 서버가 1차 네임 서버의 정보를 얼마나 오랫동안 신임 할 것인가를 설정한다.
만약 1차 네임 서버가 오랫동안 다운 된다거나 시스템 파괴로 인해 2차 네임 서버가 1차 네임 서버에 접속할 수 없을 때
전에 백어 받아온 1차 네임 서버 정보를 이 값이 초과 할때 까지 신임한다.
루트맨의 설정은 1000일(3년)동안 1차 네임 서버가 소식이 없더라도 그 전에 백업 받아온 파일로 2차 네임서버를 운영하라는것이다. 보통 한달 정도를 설정해서 쓴다.
즉 위의 설정값이 초과하면 2차 네임 서버는 자신이 가지고 있는 1차 네임 서버 정보를 파기한다.  
루트맨이 3년으로 설정한 것은 저의 특이한 성격 때문에 설정한 값으로 말도 않되는 값이기 때문에 따라 하는 사람이 없기를 바란다..  저처럼 특이한 성격의 소유자라면 상관 없지만.


43200                  ; mininum
TTL 값 설정 부분이다. TTL 설명을 참고

::NS 레코드의 데이타 설정
NS 레코드는 해당 호스트의 네임서버 호스트를 지정하는 레코드이다.
루트맨의 네임 서버 호스트는 ns1.rootman.co.kr. 이다.

rootman.co.kr.                 IN                NS                 ns1.rootman.co.kr

::HINFO 레코드의 데이타 설정

HINFO 레코드는 시스템의 정보를 제공하기 위해 사용하느 레코드이다.

rootman.co.kr.                 IN                HINFO                "Inter Pentium" "RedHat"
HINFO 레코드의 데이터 부분인 문자열은 사용자 마음대로 설정하면 된다.

::A 레코드의 데이터 설정
A 레코드는 host_name의 IP 주소를 지정하는 레코드이다.

linux.rootman.co.kr.           IN                 A                  203.241.205.91
rootman.co.kr의 서브 도메인인 linux.rootman.co.kr의 IP 주소를 203.241.205.91로 지정했다.
A 레코드로 하나의 호스트에 대해서 여러개의 IP 주소를 지정할 수도 있다.
예를 들어 호스트 linux.rootoman.co.kr 에 대해 zone 파일에서 A 레코드로 203.241.205.91 과 203.241.205.92 로 설정했을 경우 클라이언트에서 linux.rootman.co.kr 로 접근 시도할 때 클라이언트는 IP 주소 203.241.205.91 과 203.241.205.92 를 랜덤으로 접속하게 된다. 즉 사용자가 상황에 따라 203.241.205.91에 접속될 수도 있고 203.241.205.92에 접속될 수도 있다.
이러한 설정은 방문자수가 많은 웹 사이트에서 부하를 줄이기 위해 종종 사용하는 방법이다.
실예로
www.daum.net은 총 14개의 IP로 랜덤하게 접근하도록 설정되어 있다.

::MX 레코드의 데어터 설정
MX 레코드는 Mail Exchange 설정을 해준다.
host_name에 해당하는 주소로 오는 메일을 다른 호스트로 exchange 한다.
실제로는 이 설정만으로는 Mail Exchange를 완벽하게 할 수 없다.
실제 메일이 들어오는 서버를 큐잉 서버로 만들어야 되고 MX 레코드에 의해 설정된 메일의 최종 도착지에서는 메일 수신
자를 설정해야 되는데 이에 대한 자세한 설명은 sendmail 강좌중에 독립 메일 서버 만들기를 참고하기를 바란다.
host_name에 해당하는 IP 주소와 Mail Exchange 될 호스트의 IP 주소가 같을 경우 이 설정을 사용하지 않도록 한다.  
가끔 쓸데없이 같은 IP 주소에 mail 호스트를 설정하고 MX 레코드로 지정해 주는 분들이 있는데 이런 설정은 시스템에
아무런 도움도 주지 못한다.  zone 파일을 최대한 줄일수 있는것이 시스템 리소스를 절약하는 방법이다.

::CNAME 레코드의 데이터 설정
CNAME 레코드는 host_name에 대한 alias 기능을 한다.

linux.rootman.co.kr.              IN                  A                      203.241.205.91
ftp.rootman.co.kr.                IN                  CNAME                  linux.rootman.co.kr.


위의 경우는 linux.rootman.co.kr. 이라는 호스트에 A 레코드를 이용하여 IP 주소 203.241.205.91을 설정하고 ftp.rootman.co.kr은 A 레코드가 아닌 CNAME 레코드로 linux.rootman.co.kr로 alias 설정을 한 것이다.
쉽게 생각하면
ftp.rootman.co.kr을 linux.rootman.co.kr에 링크를 시켰다고 생각하면 된다.
물론 CNAME 레코드 부분을 A 레코드로 바꾸고 IP 주소를 지정해도 똑같은 효과를 줄 수 있다.

제가 많은 네임서버를 수정해 주면서 느낀 것인데 Inverse Domain을 보유하고 있지 않으면서도 Inverse Domain을 설정하고reserve zone 파일을 설정한 경우를 많이 보았다. 이유를 물어 보니 남들이 설정하니까 설정했다고 말하는 사람이 대부분이었다. 항상 얘기하는 것이지만 네임 서버 뿐만이 아니라 리눅스에서의 모든 설정들은 남들이 설정한 것을 그냥 아무 생각없이 따라 하면 절대 리눅스에 대해서 깊이 알지 못할 것이다.
왜 그런 설정들이 필요한 것인지 .. 또 이런 설정들이 본인의 시스템에 필요한 것인지를 알고 설정했으면 한다. 제가 바로 설명을 시작하지 않고 이런 얘기를 따분하게 늘어 놓는 이유는 네임서버를 설정함에 있어서 Inverse Domain을 운영할 권한이
없는 시스템에서 Inverse Domain을 설정한 경우를 너무 많이 보았고 지금도 제 글을 읽고 바로 이해하지 못하고 쓸데없이 시스템에 Inverse Domain에 대한 설정을 하는 분들이 분명히 있을 것이기 때문이다.
루트맨을 이용하는 방문자들만은 리눅스를 운영함에 있어서 올바른 이해를 가지고 서버를 운영했으면 하는 바램이다.
물론 저도 아직까지 실수 투성이 운영자이다.

Reverse Mapping이란 무엇인가?
우리가 흔히 생각하는 네임서버는 Forward Zone 기능을 하는 네임서버를 말한다. 즉 도메인을 IP 주소로 변경해 주는 네임 서버를 말하는데 Reverse Zone은 Forward Zone과 반대로 IP 주소를 도메인으로 변경하는 역활을 한다.
특정 도메인을 운영할 목적으로 네임서버를 설정할 때 Reverse Mapping에 대한 설정 부분은 필수 조건은 아니다. 분명히 말해서 도메인의 소유권과 Inverse Domain과는 아무런 상관이 없다. Inverse Domain은 도메인을 신청할 때 받는 것이 아니라
ISP로 부터 IP주소를 부여 받을 때 같이 부여 받는 것이다. 학교에서 아이피를 부여 받아 사용하는 사용자는 학교 전산실에서 관리하는 C클래스 주소에 대한 Inverse Domain을 보유하고 설정하기 때문에 reverse zone을 설정할 필요가 없다.
ISP 업체로 부터 몇개의 도메인을 부여받아 사용하는 경우에도 대부분 reverse zone을 설정할 필요가 없지만 ISP 업체에 문의해 보기 바란다.

DNS 의 Cache Poisoning 취약점

■ DNS 의 Cache Poisoning 취약점

   DNS 프로토콜에 Cache Poisoning 취약점으로 공격자는 취약한 DNS 를 사용하는 시스템에 조

   작된 DNS 쿼리를 전송하여 캐쉬의 정보를 변경, 정상적인 사이트에 접속 시 다른 사이트의 ip로

   변조시키는 방법입니다.

 

■ 대상

   DNS 프로토콜이 적용된 소프트웨어

 

■ 취약점 내용

   공격자는 조작된 DNS 쿼리를 다량으로 전달하여 DNS 캐쉬서버의 내용을 임의로 변경할 수 있습

   니다. 요청한 주소의 원래 주소가 아닌 공격자가 지정한 주소로 변경하여 캐쉬를 변경할 수 있으

   므로 악성코드가 설치된 임의의 주소 등으로 변경이 가능합니다.
  

  이 취약점은 특정 DNS 소프트웨어에 한정되지 않고 DNS 프로토콜을 따르는 모든 소프트웨어에

  영향을 줍니다. DNS(Domain Name System)는 인터넷 인프라의 중요한 요소로 호스트 이름을 IP

  주소로 변경해 주거나 또는 반대의 역할을 수행합니다. 공격자는 조작된 DNS 정보를 전달하여 조

  작된 DNS 정보가 캐쉬 네임서버에 기록될 수 있도록 합니다. 이 공격기법은 Cache Poisoning 으

  로 불리며 다음과 같은 경우에 이번 취약점 영향을 받을 수 있습니다.

 

   DNS 프로토콜은 Transaction ID 라는 16비트의 필드를 가지고 있습니다. 쿼리 요청시 이 ID 번호

  가 임의로 선택되어 지는것을 예측하여 캐쉬 조작이 가능하고, ID 값은 32,768 개의 값이 존재하

  여 추측하기 힘들지만 취약점을 내포한 DNS 의 경우는 이보다 더 작은 번호로 예측하여 공격시도

  가 가능해 집니다.
  

  또한, 요청된 쿼리에 대해 응답되는 쿼리는 같은 소스포트 번호를 사용하여 스푸핑이 더욱 쉽게

  가능해 집니다. 요청한 DNS 쿼리에 대해 응답을 주는경우 출발지와 목적지 포트가 동일하고 트랜

  젝션 ID 까지 같은 경우는, 올바른 것으로 판단되어 캐쉬에 잘못된 정보를 기록할 수 있게 됩니다.

 

  현재 이 취약점의 공격코드가 7/24일(한국시간) 공개되어 각별한 주의가 필요합니다.

 

■ 취약점 확인방법

  - 다음 명령 실행
    $dig @localhost +short porttest.dns-oarc.net TXT 또는 아래와 같이 IP로 조회
    $dig @해당서버IP +short porttest.dns-oarc.net TXT

 

  - 취약한 경우 응답 내용
     porttest.y.x.w.v.u.t.s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a.pt.dns-oarc.net.
     "해당서버IP is POOR: 26 queries in 3.6 seconds from 1 ports with std dev 0"  

  - 취약하지 않은경우 DNS 확인 결과
     z.y.x.w.v.u.t.s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a.pt.dns-oarc.net.
     "IP-of-GOOD is GOOD: 26 queries in 2.0 seconds from 26 ports with std dev 17685.51"
 
■ 패치방법

   - 업그레이드

    캐시 DNS 서버로 사용되는 시스템을 운영 중이라면, 패치가 된 버전으로 업그레이드 합니다.
    패치버전: BIND 9.3.5-p1, BIND 9.4.2-p1, BIND 9.5.0-p1

   - 업그레이드 외에 recursive query 제한
    
     $ vi /etc/named.conf

      acl xxx { 127.0.0.1; 해당서버IP; };

      options { version "unknown";
       .
       .
       .
      allow-recursion { xxx; };
      };
 
       acl 리스트에 있는 IP에만 recursive query 허용하도록 설정합니다.


■ windows OS 사용자의 경우 아래 URL을 참조하여 해당 DNS취약점 패치를 업그레이드 하시기

   바랍니다.

   - 마이크로소프트
     http://www.microsoft.com/korea/technet/security/bulletin/ms08-037.mspx
   - ISC BIND
     http://www.isc.org/index.pl?/sw/bind/bind-security.php

 

■ 언급되지 않은 소프트웨어는 사용하는 해당 DNS의 확인 후 취약점 여부를 반드시 확인할 것을

    권고합니다.

 

■ 참고정보

- CVE 정보 : CVE-2008-1447
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1447
- US-CERT 취약점 노트, VU#800113
http://www.kb.cert.org/vuls/id/800113