레이블이 Server 공부인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Server 공부인 게시물을 표시합니다. 모든 게시물 표시

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년 7월 16일 금요일

PBX 의 기능 특성 설명

Abnormal Trunk I/C Call Process(비정상적인 중계선착신 발생시 처리):
중계선으로 호가 착신시에 정상적으로 착신자를 호출 할 수 없는 경우에 해당 호를 처리하기 위한 기능이다.
Alternative Route Selection(ARS-중계선 우회):
하나의 시스템에서 목적지 시스템까지 연결된 여러 개의 중계선 경로가 있는 경우에 사용되는 기능으로, 가입자가
중계선 발신을 시도 시에 해당 중계선이 모두 통화중이면 자동으로 지정된 우회 경로의 중계선을 순차적으로 검사하여
사용 가능한 중계선이 존재하는 경로를 선택하여 해당 발신호가정상적으로 이루어지게 한다.

Announcement(음성안내):
가입자가 시스템의 기능을 사용시에 시스템에서 제공하는 Tone 대신하여 관련한 음성 안내 멘트를 들을 수 있게 할 수
있는 기능으로 별도의 외부장치를 필요로 한다.
Assign Flexible Button:
디지털 전화기 전화기 또는 IP 전화기에 부착되어 있는 유동버튼의 용도를 자유롭게 변경하여 사용할 수 있도록
유동버튼에 특정 용도를 지정하는 기능.

Attendant Call Pick Up(중계대 대리응답):
교환원이 자신과 통화중인 가입자를 다른 가입자에게 잘못 전환 시켰을 경우에 전환을 취소하고 해당 가입자와
재 통화를 할 수 있으며, 다른 내선 가입자에 착신되는 호를 당겨받을 수 있는 기능.

Attendant Calling(중계대 호출):
내선 가입자가 교환원 호출 코드 혹은 교환원 번호를 다이얼 하여 교환원과 통화할 수 있으며, 교환원의 호출에
응답하여 통화할 수 있다.

Attendant Hold(중계대 보류):

교환원은 통화하던 중계선이나 내선 가입자를 보류시키거나 보류된 가입자에 응답하고, 또는 보류된 가입자를
확인하여, 통화중 가입자와 보류된 가입자의 연결을 시킬 수 있다.

Attendant Night Transfer(중계대 야간 서비스):

교환원이 야간 등록 상태시에 중계대로 착신되는 전화는 야간서비스 가입자에게 연결되는 기능.

Attendant Overflow(중계대 보조교환):

특정 내선 가입자를 지정하여 중계대로 착신되는 호가 순간적으로 급증하는 경우 중계대 보조교환 등록 이후 중계대에
일정수 이상의 대기호가 발생시 착신되는 모든 호를 특정 내선 가입자에게로 착신토록 하는 기능이다.

Auto Group Hunting(자동 인접전화 호출):

호출한 가입자가 통화중인 경우 자동으로 통화중인 가입자와 동일한 Hunting Group에 속한 가입자와 통화가 이루어
지는 기능.

Auto Hold(자동보류):

사용중인 디지털 전화기 또는 IP 전화기 가입자에 일반 내선 착신호나 중계선 착신호가 발생하였을 경우에 자동으로 보
류되어 호출음을 주며, 디지털 전화기 가입자가 보류된 가입자에 응답하여 통화할 수 있는 기능이다.

Automatic Network Dialing(AND-자동 망 다이얼):

중계선 점유 코드에 원하는 Digits를 지정하면 중계선 발신시에 가입자가 최초 다이얼한 외부 번호 앞 또는 뒤에
자동으로 지정된 Digits를 추가하여 주는 기능으로, 일반적으로 여러 개의 교환기가 연결되어 하나의 망으로 운용시에
특정 교환기의 가입자가 몇 개의 중계 교환기를 거쳐 착신 교환기의 내선 가입자를 호출하고자 하는 경우 착신 교환기의
국번(일반적으로 착신 교환기를 호출하기 위하여 발신 교환국에서 지정한 중계선 점유 코드)과 해당 내선번호만
다이얼하면 자동으로 중계 교환기를 통과하여 착신이 가능하게 하기 위한 기능으로 사용한다.

Alternative Route Selection(ARS-중계선 우회):

하나의 시스템에서 목적지 시스템까지 연결된 여러 개의 중계선 경로가 있는 경우에 사용되는 기능으로, 가입자가
중계선 발신을 시도 시에 해당 중계선이 모두 통화중이면 자동으로 지정된 우회 경로의 중계선을 순차적으로 검사하여
사용 가능한 중계선이 존재하는 경로를 선택하여 해당 발신호가 정상적으로 이루어지게 한다.

Least Cost Routing(LCR-최소 경비 중계선 우회):

ARS 서비스 와 AND 서비스를 합친 서비스와 비슷한 목적으로 사용되어지는 서비스이지만 특정 중계선을 선택 후
단순하게 Digit 추가만 제공 하는 것이 아니라 Digit 추가 / 삭제 / 대체 등의 과정을 통해 다이얼한 Digit를 변경하여
송출하는 기능이다.
일반적으로 요일별 / 시간대별 / 착신 지역별로 사용 금액이 다른 여러 개의 별정 통신 사업자가 존재하는 경우에
사용되어진다.

Automatic Recall(자동 재착신):

보류된 호나 다른 가입자에게 전환한 호의 경우에 일정시간 동안 응답이 없으면, 자동으로 호를 원가입자에게 재착신 시키는 기능이다.

Billing(charge-요금 등산):
국선
, 내선, 전용선 발신호와 착신호의 통화정보를 저장.출력하여 통화에 대한 과금을 처리하는 기능이다.

Busy Lamp Field(BLF-통화중표시):

내선 가입자가 모든 전화를 받지 않고자 할 때, 응답 회피를 등록하여 자신에게 발생되는 모든 호를 거부할 수 있으며,
이것을 취소할 수도 있다.
중계선이나 내선그룹을 Busy Group으로 지정하여 해당 그룹내의 가입자의 상태를 확인할 수 있도록 해주는 기능이다.
Busy Override(할입):
내선 가입자나 교환원이 통화중인 다른 가입자와의 통화에 할입할 수 있는 기능으로, 시스템은 기능을 수행하는 첫
단계에서 상대 가입자에게 할입을 알리기 위한 할입음(Break In Tone)을 송출하게 되며 할입음의 종료와 함께
1:1 통화인 가입자와 3자간의 회의 통화 상태로 전환한다.

Call Forward – All Call(무조건 착신전환):
내선 가입자에게 착신되는 모든  통화를 가입자가 지정하는 다른 내선 가입자 혹은 외부가입자 에게 착신되도록 할 수
있는 기능이다

Call Forward – All External Call(외부가입자 호출에 대한 무조건 착신전환):

외부 가입자로부터 내선 가입자에게 착신되는 모든 통화를 가입자가 지정하는 다른 내선 가입자 혹은 외부가입자에게
착신되도록 할 수 있는 기능이다

Call Forward – Busy/No Answer(사용중/무응답시 착신전환):

내선 가입자가 사용중이거나 무응답일 때 착신되는 통화를 가입자가 지정하는 다른 내선 가입자 혹은 외부 가입자에
착신되도록 할 수 있는 기능이다.

Call Forward – Busy(통화중 착신전환):

가입자가 사용중일 때 착신되는 통화를 가입자가 지정하는 다른 내선가입자나 외부 가입자에게 착신되도록 할 수 있는 기능이다.

Call Forward – Cancel(착신전환 취소):

내선 가입자에게 등록되어 있는 착신전환 정보를 삭제하는 기능이다 .

Call Forward – Follow Me(원거리 착신전환):
내선 가입자가 착신 전환을 등록하지 않고 자리를 옮겼을 때, 원격지의 내선단말을 사용해서 착신 전환될 전화기에서
특정 전화기에 무조건 착신 전환을 등록하는 기능이다.

Call Forward – No Answer(무응답 시 착신전환):
가입자가 무응답일 때 착신되는 통화를 가입자가 지정하는 내부가입자나 외부가입자에 착신되도록 할 수 있는 기능이다.

Call Transfer(호 전환):
일반 가입자나 중계대 가입자가 다른 내선 또는 중계선과 통화중 다른 내선 가입자로 전환할 수 있는 기능이다.

Call Waiting(통화중 긴급호출):
통화중인 내선 가입자를 긴급하게 호출할 필요가 있을 때 긴급 호출 코드를 다이얼하여 상대방에게 지금 자신을 긴급
호출하는 통화가 있음을 알릴 수 있다.
통화중인 상대방은 통화중에 경고음을 듣게 되고 현재 자신과  통화중이던
가입자를 대기시키고 긴급호출을 요하는 가입자와 통화를 할 수 있는 기능이다.

Calling/Connected Line Identification(CLIP, COLP) :

발신자/착신자 번호 표시

Camp On(연결대기):

호출한 내선 가입자가 다른 가입자와 통화하고 있을 때 호출이 있음을 알려주어 호출한 상대 가입자의 응답을 기다리는 기능이다.

Changeable System Ring Parameter(시스템 Ring Data변경):

시스템에서 정의된 모든 종류의 Ring은 주기(Ring Cadence) 및 시간(Ring Lock)을 변경하여 다양한 Ring Pattern을
구성할 수 있으며
내부 통화, 외부 통화 등 통화의 종류별로 착신 링의 소리가 다르게 할 수 있는 기능이다.

Changeable System Tone Parameter(시스템 Tone Data변경):

시스템에서 정의된 모든 종류의 Tone은 종류(시스템의 기본 Tone, 음성 안내) 및 시간(Tone Lock)을 변경하여 운용 가능한 기능이다.

Class Of Service (COS-서비스 등급):

모든 내선 및 중계선 가입자는 서비스 등급을 가질 수 있으며, 해당 급수에 따라 아래의 시스템에서 제공하는 서비스의 허용/제한 여부가 결정되어지는 기능이다.

Conference(회의통화):
통화중인 내선 가입자나 중계대 가입자가 다른 가입자를 호출하여 회의통화를 할 수 있는 기능이다.

Consultation Transfer to Conference(협의전환 후 회의통화):
일반 내선 가입자가 협의 전환을 위해서 현재 통화중이던 가입자를 보류시키고 다른 가입자를 호출하여 협의 통화 후에 3자 회의통화를 수행하는 기능이다.

Consultation Transfer(협의 전환):
일반 내선 가입자나 중계대 가입자가 호 전환을 위해서 현재 통화중이던 가입자를 보류시키고 다른 가입자를 호출하여 협의 통화한 후, 호전환 여부를 결정한 다음에 호를 전환시켜주는 기능이다.

DDI Divert(DDI 착신호 대피):

시스템의 착신 모드가 야간이나 휴일인 경우에 라우트별로 착신되는 모든 DDI 중계선호를 호출된 가입자에게 착신시키지 않고 지정된 가입자에게로 착신대피 시킬 수 있는 기능이다.

DID Incoming Digit Remove & Convert(DID 착신 Digit 제거 및 변환):
중계선의 DID호 착신시 상대국으로부터 수신하는 Digit정보는 해당 상대국의 번호 계획에 따라 유동적이며, 특히 라우트
별로 연결된 상대국이 이질적인 경우에는 착신자 번호 구성 형태가 이질적이기 때문에 시스템의 번호계획 수립이
제한적이며, 경우에 따라서는 불가능할 때도 있다.
그러한 문제점을 해결하여 시스템의 번호 계획을 융통성 있게 사용 가능하게 지원하는 기능으로 착신 Digit 제거, 착신
Digit 변환의 두 가지 형태를 지원한다.
두 가지의 기능은 동시 또는 개별로 운용도 가능하기 때문에 설치 지역의 특성을 고려하여 선택적으로 운용할 수 있다.

Dial Memo:

상대방 가입자와 통화 상태를 유지하면서 자신의 디지털 전화기 전화기에 외부 전화번호를 기록할 수 있는 기능.

Direct Inward Dialing(DID-내선 번호 직접 호출):
외부 중계선 가입자가 교환원의 도움 없이 원하는 내선 또는 국선 가입자를 직접 다이얼하여 호출할 수 있는 기능이다.

Direct In Line(DIL-중계선호 개별 착신):

특정 중계선에 착신호가 발생하면 교환원의 도움 없이 직접 지정된 내선 가입자에게 연결하는 기능이다.

Direct Inward System Access(DISA-직접 내부 시스템 호출):

DIL의 단점을 보완하여 외부가입자가 내선 또는 중계선 가입자를 교환원의 도움 없이 직접 다이얼하여 호출할 수 있는
기능으로 아래의 2가지 형태로 서비스 된다.
외부 가입자는 추가의 다이얼이 필요하며, 인증절차(생략 가능)를 수행해야 한다.

Direct Outward Dialing(DOD-중계선호 직접 발신):
내선 가입자가 교환원의 도움 없이 직접 외부 가입자를 호출할 수 있는 기능이다.

Do Not Disturb(DND-응답회피):내선 가입자가 모든 전화를 받지 않고자 할 때, 응답 회피를 등록하여 자신에게 발생되는 모든 호를 거부할 수 있다.

Emergency Call(비상전화):

긴급한 전화번호를 미리 생산해 두고 유사시에 비상 전화번호만을 눌러 국선이 모두 통화중일 경우에도 내선의 서비스
등급에 관계없이 통화할 수 있도록 하는 기능.

Exclusive Call Hold(개별 보류):
통화중인 내선/국선 가입자를 보류시키는 기능으로, 상대 가입자는 보류음을 들으며 기다리게 되고 보류시킨 가입자
만이 보류된 가입자와 다시 통화할 수 있는 기능.

Extension Call Back(내선 통화예약):
내선 가입자를 호출하였으나 그 내선 가입자가 사용중인 경우에 통화를 예약하여, 상대방의 통화가 복구된 후에
자동적으로 내선 통화를 예약한 가입자에게 호출 신호를 주어 수화기를 들면 상대방 가입자에게 다시 호출 신호를
주어서 통화할 수 있는 기능이다.

External Paging(외부 방송):
시스템에 복수의 외부 방송 장비를 연결하고, 사용자가 전화기를 통해 원하는 방송 장비를 선택하여 방송을 할 수 있는
기능이다.
사용자는 지정된 외부 방송 중계선 점유 코드만 다이얼 하면 연결된 방송용 중계선 Line이 점유되면서 방송이 가능하다.

Forced Release(강제 복구):
중계대에서 사용중인 특정 내선/중계선을 선택하여 강제로 복구 시킬 수 있는 기능을 말한다.

Group Hunting(인접전화 호출):
내선가입자 또는 교환원이 내선 호출을 하였으나, 해당  내선 가입자가 통화중이면 그 내선 가입자가 속한 그룹의
다른 내선 가입자를 자동으로 호출하게 되는 기능이다.

Hot Line(직통전화):
특정 내선 가입자간에 서로 전화번호를 다이얼하지 않고 송수화기만을 들어서 상대 내선 가입자를 호출하거나 특정한
내선 가입자가 송수화기만을 들어서 미리 등록된 외부 가입자를  호출하여 통화할 수 있는 기능이다.

Individual Call Park(개별대기):
통화중인 가입자를 개별대기 시켜 두었다가 재통화를 원하는 시점에 개별대기 된 가입자와 재 통화를 할 수 있는 기능.

Individual Speed Dia
l(
Personal Abbreviated Dialing-개별 단축 다이얼):개별적으로 사용 빈도가 많은 외부 가입자 전화 번호를 단축 번호로 등록하여 사용할 수 있는 기능이다.

Individual Trunk Access(개별 중계선 발신):

시스템에 생산된 중계선을 내선 가입자별, 중계선 점유 코드별로 지정하여 사용을 제한하는 기능이다.
지정된 중계선 그룹(개별 중계선 그룹)의 사용 권한을 지정된 가입자들(개별 중계선 사용자 그룹)만 사용 가능하게
한정 하는 기능으로 가입자가 다이얼하는 중계선 점유 코드 별로 다른 중계선 그룹을 사용하게 운용 가능하다.

Internal Zone Paging(구내방송):
특정 구내방송 그룹에 속해 있는 내부 구역의 모든 디지털 전화기 또는 IP 전화기의 스피커를 통하여 방송할 수 있는 기능이다.

Last Number Redial(마지막 번호 재다이얼):

내선 가입자/교환원 가입자가 마지막으로 다이얼 했던 가입자의 전화번호는 자동 기억되었다가 마지막 번호 재다이얼
코드를 눌렀을 때 그 저장된 번호가 재 송출 되는 기능이며, 이 번호는 가입자가 송수화기를 들고 다이얼 할 때마다
기존 저장되었던 번호는 지워지고 현재 다이얼 중인 전화번호로 갱신된다.
단, 특수 서비스 코드 등은 재발신 되지 않는다.

Laud Bell Service(공동벨):
테난트별로 착신되는 모든 중계선을 해당 테난트의 모든 내선 가입자가 호 착신을 알리는 외부 부저를 이용해 공동으로
응답 가능한 기능이다.

Least Cost Routing(LCR-최소 경비 중계선 우회):

요일별 / 시간대별 / 착신 지역별로 사용 금액이 다른 여러 개의 별정 통신 사업자가 존재하는 경우에 가입자는 추가의
고려 없이 지정된 중계선 점유 코드와 착신 가입자 번호를 다이얼하면 자동으로 현재 요일 / 시간 / 발신 Digit를 고려
하여 현재 최소의 경비를 지불하는 중계선을 통해 호가 연결되는 기능이다.

Manager/Secretary Calling(중역/비서간 호출):
일반적으로 중역 가입자는 일반가입자가 직접 호출을 할 수 없고, 비서를 통하여 호출되며, 중역과 비서간에는 상호
호출이 가능하다.

Message Waiting(메시지 대기):
호출한 상대 가입자가 부재중인 경우, 메시지를 등록하여 호출이 있었음을 상대 가입자가 돌아왔을 때 알려줄 수 있다.

Mute(송화 차단):
디지털 전화기 또는 IP 전화기 가입자가 통화중에 상대방 음성을 수신만 하고 자신의 음성은 송출되지 않도록 하는 기능.

Other Group Call Pick-Up(타 그룹 대리응답):
다른 Pickup Group내의 내선가입자에 착신되는 Ring에 대해 대리로 응답하는 기능.

Outgoing Call Duration Restriction(OG CDR-중계선 발신 통화 시간 제한):
내선 가입자가 중계선 발신 통화를 하는 경우에 통화의 사용 시간을 제한(강제 복구)하거나  경고음으로 알려주는
기능이다.

Outgoing Restriction(발신제한):
서비스등급(COS)에 의하여 외부발신이 제한되거나 다른 가입자가 자신의 전화기 단말에서 외부 발신을 하는 것을 막기
위해 비밀 번호를 이용하여 외부 발신을 제한하는 기능이다.

Outgoing Trunk Queuing(국선 통화예약):
내선 가입자가 국선 호출코드를 눌렀으나 모두 사용중인 경우 중계선 통화를 미리 예약해 놓음으로써 사용 가능한
중계선이 발생하면 자동적으로 중계선을 점유하여 예약한 내선 가입자가 사용할 수 있도록 하는 기능이다.

Password Change(비밀번호 변경):

내선 가입자는 고유의 비밀 번호를 가질 수 있으며, 그 비밀 번호를 변경할 수 있는 기능이다.
Priority Call (우선통화) :통화에 대한 우선 순위를 부여하여 우선 순위가 높은 호에 대해서 우선적으로 처리할 있는 기능

Privacy(비밀통화 보호):
중요한 통화이거나 데이터 통신을 하고 있는 가입자의 통화를 어떠한  다른 가입자에서도 통화에 개입하게 못하게
보호하는 기능이다.

Revertible Ring(자기번호 확인) :

내선 가입자가 자신의 전화번호를 확인하고자 할 때, 또는 제대로 호출 신호가 울리는지를 확인할 수 있는 기능이다.

Group Call Pick-Up(동일그룹 대리응답):

자신 Pickup Group과 동일한 Pickup Group내에 있는 다른 내선가입자에 착신되는 Ring에 대해 대리로 응답하는 기능.

System Hold(시스템 보류):

통화중인 내선/국선 가입자를 시스템에 보류시키는 기능으로, 상대 가입자는 보류음을 들으며 기다리게 되고 시스템
내의 가입자가 보류된 가입자와 다시 통화할 수 있는 기능.

System Call Park(시스템 대기):
통화중인 가입자를 시스템에 대기 시켜 두고, 이 시스템대기 된 가입자와 통화하고자 하는 내선가입자가 통화할 수
있도록 해주는 기능.

System Speed Dial(시스템 단축 다이얼):
이용 빈도가 많은 외부 가입자의 전화 번호를 단축 코드를 이용하여 가입자가 단축 코드만 다이얼하여 상대 가입자를
호출하여 통화할 수 있는 기능으로 최대 2000개 까지 지정 가능하고 사용자 그룹을 최대 24까지 나눌 수 있다.
각각의 단축 코드는 사용 가능한 내선 가입자의 급수를 지정할 수 있고, 외부 가입자의 이름도 가질 수 있다.

테난트 Service(분산 서비스):
시스템을 다수의 그룹으로 분리하여 사용하는 기능으로 한 대의 시스템을 여러 회사가 공유하거나, 동일회사 내에서
부서별로 서비스를 분리하여 사용하고자 할 경우에 편리한 기능이다.

Through Dialing(대리발신):
교환원이 중계선 발신이 제한되는 내선 가입자들을 대신하여 중계선을 점유한 후, 해당 내선 가입자를 대신하여 발신해
주는 기능.

Timed Reminder(Wake Up-기상벨):
일반 내선 가입자가 자신의 단말로 특정 시간을 지정하여 놓으면 해당 시간이 되었을 때 자동으로 그 가입자에게로
호출 신호를 송출하여 해당 시간이 되었음을 알려주는 기능이다.
Trunk-To-Trunk Transfer(중계선 중계):착신된 중계선이 내선이나 교환원의 도움을 받지 않고 직접 다른 전용선을 점유할 있는 기능이다

Trunk Outgoing Pause Digit(외부 발신 지연 Digit):
중계선으로 발신시 다이얼한 Digit 송출을 일정 시간 지연 시키는 기능이다.
일반적으로 가입자가 직접 다이얼하지 않고 한 번에 많은 Digit를 동시에 송출하는 방식의 시스템 서비스에 주로
사용한다.

Trunk Route Separation(중계선 라우트 분리 운용) :

테난트와는 별도로 시스템에 생산된 중계선들을 라우트로 분리하여 운용이 가능한 기능으로 아래의 서비스들을
분리하여 적용 가능하다.

Direct Trunk Selection(DTS-직접 국선 선택):
중계대에서 특정 중계선의 Serial 번호를 dial하여 그 중계선을 선택하고 점유할 수 있는 기능이다.

Verify Busy Line Status(가입자 사용 상태 확인):
교환원이 다른 가입자를 호출할 때/다른 가입자가 교환원을 호출할 때/가입자와 통화중일때/다른 가입자의 착신전환
으로 호가 착신되었을 때, 중계대 LCD를 통하여 내선번호 표시(Digital Display - Station), 중계선번호 표시(Digital Display - Trunk), 착신호 형태 표시(Incomming Call Identification), 중계대 착신 가입자 표시(Called Number Display - Attendant), 호 진행상태 확인(Call Processing Indication)등이 중계대의 LCD에 표시되는 기능이다.

Virtual Dial Tone(가상 다이얼 톤):
중계선 발신시 아래의 경우에 발신자에게 중계선 점유 후 바로 발신음(Dial Tone)을 보내줄 수 있는 기능이다.
  + 착신국에서 발신음(Dial Tone)을 늦게 보내주거나  안 보내주는 경우
  + 착신국에서 발신음(Dial Tone)을 못 보내주는 경우(R2 Dial Type)

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월 21일 월요일

MS 서버제품

  • .NET Framework
  • Antigen(영문)
  • BizTalk Server
    • BizTalk 2009
  • Commerce Server
  • Essential Business Server
  • Exchange Server
    • Exchange 2010
  • Expression
  • Forefront 제품군
  • Forefront Client Security
  • Forefront Edge Security(영문)
  • Forefront 관리 콘솔(영문)
  • Forefront Security for Exchange
  • Forefront Security for SharePoint(영문)
  • Forefront Stirling
  • Forms Server
  • Groove Server
  • Host Integration Server (영문)
  • Identity Lifecycle Manager(영문)
  • Office Communications Server
  • Project Server
  • Search Server
  • SharePoint Server
  • 소규모 기업 센터
  • Speech Server(영문)
  • SQL Server
    • SQL Server 2008R2
  • System Center 제품군
    • System Center Configuration Manager R2(영문)
    • System Center Operations Manager
    • System Center Data Protection Manager
    • System Center Virtual Machine Manager 2008
    • System Center Essentials
    • 그외 시스템센터 제품
    • System Center Capacity Planner(영문)
    • System Center Mobile Device Manager(영문)
    • ystem Center Service Manager (Beta 버전)(영문)  

     

    • 관련제품
    • Microsoft Application Virtualization(영문)  
      Microsoft Desktop Optimization Pack(영문)
    • Systems Management Server

     

  • System Center Configuration Manager(영문)
  • System Center Data Protection Manager
  • System Center Essentials
  • System Center Mobile Device Manager(영문)
  • System Center Operations Manager
  • System Center Virtual Machine Manager
  • Virtual Server
  • Visual Studio
  • Visual Studio Team System
  • Windows High Performance Computing
  • Windows Server
  • Windows Server Update Services
  • Windows Storage Server
  • 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월 29일 목요일

    mysql 바이너리 로그 표시 및 삭제

    바이너리 로그 리스트 표시
    mysql > show binary logs;
    mysql > show master logs;


    바이너리 로그 삭제mysql > purge master logs to 'mysql-bin.000001';

    지정된 바이너리 로그 보다 작은 숫자 파일이 제거된다.
    즉, 000025번으로 한 경우 000001 ~ 000025 까지의 번호 파일이 삭제된다.


    바이너리 로그 변환

    /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 > /tmp/1.txt

    보통 바이너리 로그는 용량이 큰 경우도 있으므로, 변환하여 저장될 곳은 넉넉한 곳을 지정해주도록 한다.

    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

    회원중복검사 자바스크립트(펌)

    우선 먼저 답변하신 분의 의견이 있기는한데 중요한 부분이 빠져 있어서 추가적으로

     

    글을 남깁니다.

     

    프로그램의 순서를 알아보면

     

    <input name="chk_Id" id="_chk_id" type="hidden" value="0">

     

    을 만들어 두시고요 회원가입 버튼을 클릭하면 체크하는 자바스크립트 함수에다가

     

    if(document.getElementById("_chk_id").value=="0"){

           alert("아이디 중복 체크를 해주세요.");

           return;

    }

     

    위의 루틴을 적어 줍니다. 여기까지는 전에 답변 하신 분하고 비슷하구요.

    제일 중요한 아이디 중복 체크 프로그램을 넣어야 합니다.

     

    <input name="chk_dup_id" type="button" value="중복체크" onclick="check_id();">

     

    이렇게 버튼을 만들고 온클릭 이벤트에 위와 같은 함수를 집어 넣습니다.

    그리고 함수를 제작 하는데 함수의 내용은 다음과 같습니다.

     

    function check_id(){

           // ex : <input name="id" id="_id" type="text" /> 만약에 아이디를 적는 인풋창이 왼쪽과 같다면

           //  밑에와 같이 적어줍니다. 만약 id="" 속성이 없다면  id="_id" 부분을 추가한다음 아래와 같이 적어줍니다.

     

          document.getElementById("_chk_id").value="0";

           var userid = document.getElementById("_id").value;

           window.open("./check_id.php?userid="+userid,"아이디 중복체크","width=0,height=0;");

    }

     

    그런 다음 check_id.php 파일을 만듭니다. 여기서는 실제 DB에 접속해서 중복되는 아이디가 있는지

    없는지를 검사합니다.

     

    check_id.php

    <?

           $userid = $_REQUEST["id"];

           $ret = 0;

           //DB접속을 합니다.

           //쿼리문은 이렇게 만드세요. "select count(*) as `id_count` from 테이블이름 where userid=$userid"

           //그런다음 DB에서 $res[id_count]; 값을 불러옵니다. 위의 쿼리문 내용은 같은 아이디가 있으면 1을

           //리턴 할것이고 없다면 0을 리턴 할겁니다. $ret = $res[id_count]; 왼쪽과 같이 DB에서 나온값을

           //$ret 변수에다가 담습니다.

         

    ?>

    <script type="text/javascript">

            //이제 이부분에서는 여기에서 검사한 정보를 회원가입 페이지로돌려줍니다.

            var ret = "<?=$ret ?>";

            if(ret=="1"){

              opener.document.getElementById("_chk_id").value="0";

            }else{

              opener.document.getElementById("_chk_id").value = "1";

            }

    </script>

     

     

    위의 스크립트는 같은 아이디가 있을 경우에는 젤처음 만들었던 hidden속성의 chk_id 부분의 값을

    0으로 만들어서 회원가입을 못하게 만듭니다.

    같은 아이디가 없을경우에는 chk_id 의 값을 1로 만들어 회원가입을 할수있도록 만듭니다.

     

    이게 기본적인 오퍼레이션 입니다. 이런식으로 하시면 실제 DB에 접속해 현재 회원가입이 되어 있는가

    없는가 하는 부분을 알수가 있습니다. 그리고 실제 서버스크립트를 실행해 회원가입을 할때역시 한번더

    아이디가 있는지를 중복체크 해주시면 완벽한 프로그램이 되겠습니다.

     

    그럼 성공 하시길 ^^*

    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
    가 알아보기 더 쉽다.