RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'2006/09'에 해당되는 글 206
2006/09/08  scp 사용법  
2006/09/08  LINUX = SCP --원격 파일 전송  (1)
2006/09/08  rpm 패키지 뽑아내기  
2006/09/08  RPM이란?  
2006/09/08  로드밸런싱  
2006/09/08  리눅스 팁  
2006/09/08  Redhat 9.0 - Setting Info  
Linux  2006/09/08 14:15
출처 블로그 > 시작..
원본 http://blog.naver.com/iuwe1126/60013251653
scp 사용법
scp는 자신의 컴퓨터에서 원격의 컴퓨터로 또는 원격의 컴퓨터에서 자신의 컴퓨터로 간단하게
파일을 전송할 수 있는 프로그램이다.
다음은 현재 디렉토리에 있는 sshd.txt 라는 파일을 IP가 192.168.1.154 인 컴퓨터에 root 라는 계정으로
접속하여 /usr/local/src/ 디렉토리 밑에 복사해 넣는 명령이다.
[root@in4nux root]# scp ./sshd.txt root@192.168.1.154:/usr/local/src/

다음은 IP가 192.168.1.154 인 컴퓨터에 root 라는 계정으로 접속하여 /usr/local/src/ 디렉토리 밑에 있는
sshd.txt 라는 이름의 파일을 자신의 컴퓨터로 현재 위치한 디렉토리에 복사하는 명령이다.

[root@in4nux root]# scp root@192.168.1.154:/usr/local/src/sshd.txt ./
2006/09/08 14:15 2006/09/08 14:15
이 글에는 트랙백을 보낼 수 없습니다
출처 카페 > LINUX - 관련 JOB / 맥슬
원본 http://cafe.naver.com/passwd/5


...리눅스를 좀 더 재미있게!
암호없이 scp
By Dave Sirof

한글번역 전정호

이 글은 한글번역판입니다. 원문은 여기에서 볼 수 있습니다.

암호없이 scp

이 글은 암호없이 scp를 사용하는 방법을 설명하고, 두 근사한 스크립트를 소개한다. 한 스크립트는 파일을 네트웍으로 연결된 여러 리눅스 컴퓨터에 복사하고, 다른 스크립트는 리눅스 컴퓨터를 쉽게 백업할 수 있다.

리눅스 시스템 관리자는 자주 컴퓨터간에 파일을 복사하거나 파일을 여러 컴퓨터로 전송한다. ftp를 사용해도 되지만, scp를 사용하면 많은 이점이 있다. ftp는 LAN/WAN에 내용(심지어 암호도)을 그대로 전송하지만, scp는 암호화하여 전송하기때문에 ftp보다 안전하다.

scp의 장점은 쉽게 스크립트에서 사용할 수 있는 점이다. 파일을 리눅스 컴퓨터 100대로 복사한다고 가정하다. 직접 100번 복사 명령어를 실행하는 것보다 스크립트를 작성하고 싶을 것이다. 스크립트에서 ftp를 사용하면 로그인할때마다 암호를 물어보기때문에 힘들다 (역주; netrc 파일을 사용하여 암호를 자동으로 입력하게 만들 수 있지만 보안상 위험하다). 대신 scp를 사용하는 경우 원격 리눅스 컴퓨터가 암호를 물어보지 않도록 설정할 수 있다. 믿거나 말거나 이 방법은 ftp보다 훨씬 더 안전하다!

scp의 기본 문법은 다음과 같다. 현재 컴퓨터에 있는 'abc.tgz' 파일을 'bozo'라는 원격컴퓨터의 /tmp 디렉토리로 복사하려면:

scp abc.tgz root@bozo:/tmp


그러나 이 경우 bozo의 root 암호를 물어본다. 암호를 물어본다면 스크립트에서 쉽게 사용할 수 없다. 해결책은 다음과 같다 (한번만 해주면 "암호없이" 무제한 scp로 복사할 수 있다):

1. 나중에 scp를 사용하여 파일을 복사할 사용자를 결정한다. 물론 root가 가장 강력하고, 난 개인적으로 root를 사용한다. 여기서 root를 사용할때 발생할 수 있는 보안상 문제점을 강의할 생각은 없다. 내가 지금 무슨 말을 하는지 모르겠다면 root가 아닌 일반 사용자를 사용하라. 결정했다면 이제 그 사용자로 로그인하여 다음 단계를 진행한다.


2. 컴퓨터에 공개키(public key)와 비밀키(private key)를 만든다. 이게 뭔가? 공개키 암호화 방식을 모른다면 15초간 설명하겠다. 공개키 암호화 방식은 수학적으로 연관된 공개키와 비밀키를 만든다. 그런 다음 공개키는 누구에게라도 줄 수 있지만, 비밀키는 아무에게도 알려주면 안된다. 키들의 수학적 구성상 신기하게도 누구나 공개키를 가지고 내용을 암호화할 수 있지만, 비밀키를 가진 당신만이 암호화한 결과를 해독할 수 있다. 어쨋든 두 키를 만드는 명령은:

ssh-keygen -t rsa


3. 다음과 같이 출력한다:
"Generating public/private rsa key pair"
"Enter file in which to save the key ... "
그냥 enter를 누른다.

4. 그러면 다음과 같이 출력한다:
"Enter passphrase (empty for no passphrase):"
passphrase를 사용하지 않기때문에 enter를 두번 누른다.


5. 그러면 마지막으로:
"Your identification has been saved in ... "
"Your public key has been saved in ... "
방금 만든 공개키 파일명과 위치를 기억하라 (항상 파일명이 .pub로 끝난다).

6. 공개키를 파일을 복사할 모든 원격 리눅스 컴퓨터에 복사한다. scp나 ftp를 사용하여 복사한다. root를 선택했다면 (다시 단계 1의 경고를 주의하라), 키는 /root/.ssh/authorized_keys (철자 조심!)에 있어야 한다. root가 아니고 예를 들어 clyde로 로그인한다면, /home/clyde/.ssh/authorized_keys 에 있어야 한다. authorized_keys 파일이 다른 컴퓨터의 키를 저장하고 있을 수 있기때문에, 파일에 이미 내용이 있다면 (새파일을 덮어쓰지않고) 공개키 파일 내용을 뒤에 추가해야 한다.

이제 끝이다. 별다른 문제가 없다면 파일을 암호없이 원격컴퓨터로 scp할 수 있다. 다시 한번 테스트해보자. 컴퓨터에 있는 'xyz.tgz' 파일을 'bozo'라는 원격컴퓨터의 /tmp 디렉토리로 복사한다

scp xyz.tgz root@bozo:/tmp

와 !!! 암호를 물어보지 않고 복사가 된다!!

일단 암호 하나로 컴퓨터에 로그인하면 모든 원격컴퓨터에 접근할 수 있기때문에 보안에 대해서 주의하라. 그래서 암호를 더 잘 보호해야 한다.

이제 즐길 차례다. 컴퓨터에 있는 'houdini'란 파일을 10개 도시에 흩어져있는 원격컴퓨터의 /tmp 디렉토리로 복사하는 짧은 스크립트를 (5분 안에) 작성해보자. 물론 원격컴퓨터가 100대거나 1000대라도 마찬가지다. 원격컴퓨터들의 이름은: brooklyn, oshkosh, paris, bejing, winslow, rio, gnome, miami, minsk, tokyo. 스크립트는 다음과 같다:

#!/bin/sh
for CITY in brooklyn oshkosh paris bejing winslow rio gnome miami minsk tokyo
do
scp houdini root@$CITY:/tmp
echo $CITY " is copied"
done

신기한 마술같다. 스크립트에서 echo 줄은 현재 진행상황을 알려준다.

혹시 쉘스크립트가 생소하다면 좋은 투토리얼이 있다:
http://www.freeos.com/guides/lsst/.

알다시피 scp는 더 강력한 ssh의 일부이다. 위의 6 단계를 마쳤다면 원격컴퓨터에서 명령어를 실행할 수 있다 (물론 암호없이!). 예를 들어, brooklyn 이라는 원격컴퓨터의 시간을 보려면:

ssh brooklyn "date"

이제 두 개념을 합쳐서 진짜로 멋진 스크립트를 만들어보자. 모든 원격 리눅스 컴퓨터를 백업하기란 쉬운 일이 아니다. 아래 스크립트는 각 컴퓨터의 /home 디렉토리를 백업한다. 상용 백업 소프트웨어와 비교하면 기능은 매우 기본적이지만, 가격면에서는 따라올 수 없다. 대부분의 상용 백업 소프트웨어는 백업할 컴퓨터 대수대로 가격을 매긴다. 이런 패키지를 사용한다면 원격컴퓨터 100대에 대한 비용을 지불하는 대신 원격컴퓨터를 한 컴퓨터로 백업하는 스크립트를 사용한라. 그리고 그 컴퓨터에서만 상용 패키지를 사용하면 99대분 가격을 절약할 수 있다 ! 어쨌던 스크립트를 참고하여 자신의 상황에 알맞는 스크립트를 작성할 수 있다. 이 스크립트를 cron 작업에 걸어둔다 (원격컴퓨터에는 필요없다). 주석을 보면 자세한 내용을 알 수 있다:

#!/bin/sh

# 변수는 구별하기위해 대문자로 지었다

# 스크립트를 실행하기 전에 원격컴퓨터마다 '/tmp/backups'라는 디렉토리를
# 만들고, 컴퓨터에는 '/usr/backups'라는 디렉토리를 만들어야 한다


# 컴퓨터에서,
# date 명령어 결과를 보기 좋게 만들어서 "DATE" 변수를 설정한다
#
DATE=$(date +%b%d)

# 'for 반복문'은 세가지 작업을 한다

for CITY in brooklyn oshkosh paris bejing winslow rio gnome miami minsk tokyo
do

# 1) 원격컴퓨터의 하드디스크가 꽉차지 않도록 저번에 실행한 스크립트가 만든 tarball을 삭제하고
# 확인을 위해 echo한다
#
ssh -1 $CITY "rm -f /tmp/backups/*.tgz"
echo $CITY " old tarball removed"

# 2) 원격컴퓨터마다 /home 디렉토리를 tarball로 만들어서 /tmp/backups에 저장한다
# tarball 파일명은 구별하기위해 도시명과 시간으로 짓는다
#
ssh $CITY "tar -zcvpf /tmp/backups/$CITY.$DATE.tgz /home/"
echo $CITY " is tarred"

# 3) 원격컴퓨터에 있는 tarball을 /usr/backups 디렉토리로 복사해온다
#
scp root@$CITY:/tmp/backups/$CITY.$DATE.tgz /usr/backups
echo $CITY " is copied"

done


# 나머지 부분은 오류검사용으로 없어도 된다:

# 파일명에 날짜를 포함한 오류파일을 만든다.
# 백업이 안된 컴퓨터가 있다면 이 파일에 기록한다
#
touch /u01/backup/scp_error_$DATE

for CITY in brooklyn oshkosh paris bejing winslow rio gnome miami minsk tokyo

do

# tarball이 복사되었는지 검사한다. 없다면 오류파일에 기록한다
# '||'은 앞에 있는 부분이 참이 아닐때만 뒤에 있는 부분을 실행한다는 뜻이다
#
ls /u01/backup/$CITY.$DATE.tgz || echo " $CITY did not copy" >> scp_error_$DATE


# tarball을 정상적으로 열 수 있는지 검사한다. 문제가 있다면 오류파일에 기록한다.
tar ztvf /u01/backup/$CITY.$DATE.tgz || echo "tarball of $CITY is No Good" >> scp_error_$DATE

done

끝이다. 이 글에서 나는 단지 개념을 설명하려고 예를 들었다. 예제를 "그래로" 사용할 필요가 없다. 배포본에 따라 문법이 다를 수 있지만, 나는 모든 가능성을 다룰 수는 없었다. 예를 들어, Red Hat 6.2 이전 배포본을 사용한다면 문법을 조금 수정해야 한다 (메일을 주면 알려주겠다). 잘 활용하길 바란다.
2006/09/08 14:15 2006/09/08 14:15
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:15
출처 블로그 > 패킷 탄 풍경
원본 http://blog.naver.com/jabusunin/20012727371
신의 PC에 현재 설치된 RPM 리스트를 추출하고 이것을 기준으로 rpm 패키지 리스트에서 설치된 패키지 들을 선별해 내는 기능을 가진 스크립트이다.(패키지 버전 무시)

이 스크립트는 sed 와 awk 가 어떻게 사용되는지 보여주기 위한 것이다.

#!/bin/sh
########################################################
clear
echo -en "Make installed rpm list... \n"
rpm -qa > $1

# 시스템에 설치된 패키지 리스트 추출

echo -en "Abstracting Package Names except Version information...\n"
echo -en "SED...\n"
sed 's/-[0-9]/ /' $1 > list.rpm.sed-temp
echo -en "SED... done\n"

# 패키지 리스트에서 버전 정보를 구분하기 위해 공백 생성(단 패키지 이름과 버전은 “-”으로 구분

echo -en "Abstracting Package Names except Version information...\n"
echo -en "SED...\n"
sed 's/-[0-9]/ /' $1 > list.rpm.sed-temp
echo -en "SED... done\n"

# 패키지 리스트에서 패키지 이름만을 추출하여 저장

echo -en "TEMP files delete...\n"
cp list.rpm.awk-temp $1.new
rm -rf list.rpm.sed-temp list.rpm.awk-temp
echo -en "TEMP file delete... done\n"
echo -en "Check this file : $1.new\n"
a=`cat $1.new | wc -l`
echo -en "Total LIST-NUM : $a\n"

# 작업 진행중에 생성된 temp 파일을 삭제하고 추출된 패키지의 개수를 보여준다.

# 아래는 모든 패키지를 모아놓은 디렉토리에서 전 단계에서 추출된 패키지 리스트를 기준으로 패키지를
# 복사해오는 것이다. 각 과정에서 성공인지 실패인지 카운트 하여 결과값을 보여준다.

echo -en "Make dir [pkglist] & copy packagelist...\n"
if [ ! -f pkglist ]; then
mkdir pkglist
fi



# 패키지를 복사해 놓을 디렉토리 생성
b=0
c=0

#패키지 복사 진행 성공과 실패시 카운트

or i in `cat list.rpm.new`
do
cp /경로/RPMS/$i* pkglist/ > /dev/null 2>&1
if [ $? -eq 0 ]; then
b=`expr $b + 1`
echo -en "OK-NUM: $b, COPY : $i\n"
echo "$i" >> OK-LIST
else
c=`expr $c + 1`
echo -en "ERROR-NUM: $c, COPY : $i\n"
echo "$i" >> ERROR-LIST
fi
done
echo -en "...... done\n"
rm -rf list.rpm.new


# 진행 결과 출력

echo -en "Total LIST-NUM:$a, OK-NUM:$b, ERROR-NUM:$c\n"

위 스크립트에서 쓰인 여러 가지 방법들을 응용하면 프로세서의 정보 캐취 라던지, 특정 파일의 검사. 생성, 삭제 등 다양한 스크립트 작성에 도우이 될것이다.


출처 : 리눅스원(주) OS개발팀 (http://www.linuxone.co.kr/bbs/bbsAcademyView.php?id=BBSCAFACATRM&idx=877&perPage=15&pageNum=1&searchOption=&searchText=)

2006/09/08 14:15 2006/09/08 14:15
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:14
출처 블로그 > Micom Study
원본 http://blog.naver.com/salt_mp3/40016208980

리눅스에서 프로그램을 설치하는 방법에는 어떠한 것들이 있을까요?

레드헷에서는 rpm 방식의 설치를 지원하고,
데비안에서는 apt-get 방식을 지원하고,
기타 등등...

리눅스 배포판의 수가 많은 만큼, 프로그램을 설치하는 방식 또한 다양합니다.

이중에서 많은 리눅스 배포판들이 사용하는 패키지 설치 방식은 RPM 방식입니다.

RPM은 Redhat Package Management의 약자로서 레드헷에서 제공하는 패키지 관리툴을 말합니다.

레드헷 리눅스 상에서 다양한 소프트웨어들의 설치, 추가, 삭제 등이 용이하도록 제공되는 툴로서 초기에는 레드헷 계열의 리눅스 배포판에서만 사용되었으나, 그 사용법이 용이하고 편리해서 현재는 대부분의 리눅스 배포판에서 패키지 설치툴로 사용되고 있습니다.



■ RPM 패키지의 구조

[패키지 이름]-[버전]-[릴리이즈 번호].[아키텍쳐].rpm

ex) postgresql-6.3.2-5kr.i386.rpm

지금까지 많은 분들이 리눅스 배포판에서 제공되는 rpm을 가지고,
설치와 제거를 해보셨을 거라 생각됩니다.

오늘 이 강좌를 통해서... 이제는 간단한 패키지들을 직접 만들어서 사용할 수 있는 고급 유저로 거듭나시길 바랍니다. ^^

rpm을 만든다는 것은

① 개발자에 의해 소스RPM(SRPM)으로 1차 만들어진 파일을 받아서 RPM을 추출해 내는 방법

② 원본 소스바이너리 파일을 받아서, 현재의 리눅스 시스템에 맞도록 제작하는 방법

위의 2가지 방법을 말할 수 있습니다.


1번에서의 SRPM은... 개발자가 원본 소스바이너리를 받아서 1차적으로 RPM형식으로 만든 파일을 말하는 것으로, 이것을 이용해 사용자는 쉽고 편리하게 rpm을 만들어서 사용할 수 있습니다.
그리고, 프로그램을 개발하는 개발자 또는 리눅스 프로그램을 수정하여 사용하고자하는 고급유저들에 있어서도 이 소스RPM은 유용하게 사용됩니다.

코어리눅스 2004 Workstation에는 코어리눅스에서 사용되는 프로그램에 대한 SRPM을 CD로 제공하고 있습니다.
4번,5번 CD에 이러한 소스RPM을 제공하고 있으므로,
소스RPM을 필요로 하는 사용자는 유용하게 사용할 수 있습니다.

2번의 방식은 개발자에 의해 SRPM으로 만들어지지 않은 원초적인 소스바이너리를 가지고, RPM을 만드는 방법으로, SRPM에 비해 사용자가 조금더 작업을 해줘야 하는 차이점을 가지고 있습니다.

2번째의 방식을 익히면 1번째의 방식은 자연히 아시게 되리라 생각되어, 아래에는 소스바이너리를 통해 직접 RPM을 제작하는 방법에 대해 설명을 드리겠습니다.

==============================================================================
아래에서 예를 드는, GKrellm이라는 프로그램은, 시스템 정보를 실시간으로 보여주는 모니터링 툴로서, 별다른 의존성 등의 문제없이 쉽게 설치할 수 있는 프로그램으로 교육용으로 적합하다 생각되어 예로 들었습니다.

실제 프로그램 패키징 작업에서는 이외에도 많은 기술 및 방법들이 필요한 관계로, 비교적 간단한 GKrellm을 통해서 설명을 드리겠습니다.
==============================================================================


1. 소스파일 구하기

리눅스배우기에 올려져 있는 GKrellm의 소스파일을 다운로드 합니다.
오픈자료실 GKrellm 받으러 가기

압축을 풀면, gkrellm-2.2.4 라는 디렉토리가 생성됩니다.
# tar xzvf gkrellm-2.2.4.tar.gz

이렇게 다운로드한 소스파일은 컴파일 방식으로 설치를 할 수도 있지만,
여기서는 RPM 제작을 설명해야 하므로, RPM 제작 방식으로 진행하도록 하겠습니다.
※ 소스컴파일 방법은 오픈자료실의 해당 게시물을 참조해 주시기 바랍니다.


2. SPEC 파일 확인하기

보통 리눅스 관련 프로그램을 개발하게 되면, 해당 프로그램을 RPM으로 만들수 있도록 SPEC 파일을 함께 포함하고 있는 경우가 많습니다.
압축을 푼 디렉토리에 가보시면, gkrellm.spec 이라는 파일이 있습니다.
이 파일을 통해서 RPM을 제작할 수 있게 됩니다.


3. 설치를 위한 파일 복사

위의 gkrellm.spec 파일을 아래의 경로에 복사합니다.
# cp gkrellm.spec /usr/src/Kore/SPECS/

다운받은 원본 파일을 아래의 경로에 복사합니다.
# cp gkrellm-2.2.4.tar.gz /usr/src/Kore/SOURCES/

RPM을 제작하기 위해서는 제작 내용을 기술하고 있는 SPEC 파일을 /usr/src/Kore/SPECS/ 디렉토리에 넣어두고, 해당 프로그램의 원본파일을 /usr/src/Kore/SOURCES/ 디렉토리에 넣어두고 작업을 해야 합니다.


4. SPEC 파일의 내용 확인 및 수정

방금 복사한 gkrellm.spec을 열어서 내용을 확인하고 수정이 필요한 부분이 있으면 적절히 수정합니다.

패키징을 해본 결과, 소스파일의 경로가 적절치 않아 패키징이 진행되지 않으므로, 아래 문자을 찾아서 다음과 같이 수정해 줍니다.

Source: http://web.wt.net/~billw/gkrellm/%{name}-%{version}.tar.bz2

(수정)

Source: %{name}-%{version}.tar.gz

※ 이외에는.... 크게 수정하지 않아도 코어리눅스에서 잘 동작하는 환경이므로, 내용만 한번 둘러보시면 되겠습니다.


5. RPM 패키징 시작

드뎌 기다리고 기다리던 패키징 시간입니다.
아래와 같이 입력하고 패키징을 시작해 봅니다.

# rpmbuild -ba -v gkrellm.spec

이상한 문자들이 주루룩~~ 나오면서 리눅스가 혼자서 뭔가를 만들어 냅니다.
정상적으로 종료가 되면, /usr/src/Kore/RPMS/i386/ 디렉토리에 RPM 파일이 만들어 집니다.

# cd /usr/src/Kore/RPMS/i386/
# ls
  gkrellm-2.2.4-1.i386.rpm


6. RPM 파일 설치

이제 패키징이 끝났습니다.
위 파일을 가지고, rpm 설치를 진행하면 됩니다.

# rpm -Uvh gkrellm-2.2.4-1.i386.rpm



7. 실행

이제 실행을 해볼까요. ^^

# gkrellm &

화면 귀퉁이에 시스템 모니터링 프로그램이 실행된 것이 보일 겁니다.

이상과 같은 방식으로 다른 패키지들도 RPM으로 만들 수 있습니다.
간단한 프로그램들로부터 시작해서, 하나하나 만들어 보는 기쁨을 느껴 보시기 바랍니다.

출처 : 코어리눅스

2006/09/08 14:14 2006/09/08 14:14
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > wooya510님의 블로그
원본 http://blog.naver.com/wooya510/60005129890

Detailed Steps

* Prepare a Chroot-ed File System

  1. Set up the tree anywhere (preferably another disk or a non-system partition to discourage others from making hard links to files outside your web tree), but use a symlink (eg /www) to reference it.
    ROOT# mkdir /export/misc/www
    ROOT# ln -s /export/misc/www /www

  2. Create the basic directories; bin will be a link to usr/bin
    !! NOTE the lack of leading slashes in this example, except where I copy files from the regular file system. Do NOT mix up your chroot-ed tree with your real '/'!

  3. You have been warned!
    I have indicated the chroot-ed files in magenta
    ROOT# cd /www
    ROOT# mkdir -p usr/bin usr/lib lib etc tmp dev webhome
    ROOT# ln -s usr/bin bin

  4. /tmp is given special perms.
    ROOT# chmod 777 tmp
    ROOT# chmod +t tmp

  5. Make the special device /dev/null
    ROOT# mknod -m 666 dev/null c 1 3

  6. Set up the timezone info for YOUR timezone (this example uses MET):
    ROOT# mkdir -p usr/share/zoneinfo
    ROOT# cp -pi /usr/share/zoneinfo/MET usr/share/zoneinfo/
    ROOT# cd etc
    ROOT# ln -s ../usr/share/zoneinfo/MET localtime
    ROOT# cd ..

  7. You will find that perl and/or mod_perl will complain about the lack of locale settings. To fix this install your locale files in the chroot-ed tree:
    ROOT# set |grep LANG
    LANG=en_US

    ROOT# mkdir /www/usr/share/locale
    ROOT# cp -a /usr/share/locale/en_US /www/usr/share/locale/

  8. Now copy in the shared libraries that provide a very basic chroot-ed file system
    ROOT# cp -pi /lib/libtermcap.so.2 /lib/ld-linux.so.2 /lib/libc.so.6 lib/

  9. Test your tree ('cat' will be needed by 'apachectl' later, but is not strictly necessary):
    ROOT# cp -pi /bin/ls /bin/sh /bin/cat bin/
    ROOT# chroot /www /bin/ls -l /
    lrwxrwxrwx   1 0        0               7 Jan 29 09:24 bin -> usr/bindrwxr-xr-x   2 0        0            1024 Jan 29 09:28 devdrwxr-xr-x   2 0        0            3072 Jan 29 13:17 etcdrwxr-xr-x   2 0        0            1024 Jan 29 13:12 libdrwxrwxrwt   2 0        0            1024 Jan 29 09:23 tmpdrwxr-xr-x   5 0        0            1024 Jan 29 09:23 usrdrwxr-xr-x   2 0        0            1024 Jan 29 10:41 webhome
  10. You can remove 'ls'; it was only used for testing:
    ROOT# rm bin/ls

* Prepare a User and the Naming Service

Here we create the user whom apache will run as, and the necessary naming services for this configuration.
  1. Create a new user that doesn't exist on the system, and give the user a unique name (eg: www) and user id (eg:888). Note that it isn't actually necessary for the user:group to exist in the real authentication (/etc/passwd /etc/group) files. It's up to you..
    ROOT# cd /www
    ROOT# touch etc/passwd etc/group etc/shadow
    ROOT# chmod 400 etc/shadow

  2. Edit these three files. For the sake of this example I am just echoing the data into the files:
    ROOT# echo 'www:x:888:888:Web Account:/webhome:/usr/bin/False' > etc/passwd
    ROOT# echo 'www:x:888:' > etc/group
    ROOT# echo 'www:*:10882:-1:99999:-1:-1:-1:134537804' > etc/shadow

  3. I have given this user no login, and no shell. Just to be complete, compile a 'no-go' shell called False:
    ROOT# echo 'int main(int argc, char *argv[]) { return(1); }' > /tmp/False.c
    ROOT# cc -o /www/usr/bin/False /tmp/False.c

  4. While we are at it, lets mark the binaries as execute-only:
    ROOT# chmod 111 usr/bin/*

  5. Some naming services will be required. With glibc and the Name Service Switch libraries the necessary libraries are not immediately obvious. See 'man nsswitch' for details.
    I chose to rely on files and DNS, even though I also run NIS on my home machines.

    Note: The libresolv library will be needed as well (This will become evident when PHP is installed).
    ROOT# cp -pi /lib/libnss_files.so.2 lib/
    ROOT# cp -pi /lib/libnss_dns.so.2 lib/

  6. We will need 3 files to complete the configuration for Naming Service. The contents of these files will depend on your IP and DNS setup. Here we assume that the web server is named ns.mynet.home with IP address 192.168.196.2 (it is actually also my naming server):
    # ---- Contents of    etc/nsswitch.conf ----#
    passwd: files
    shadow: files
    group: files
    hosts: files dns

    # ---- Contents of    etc/resolv.conf ----#
    domain mynet.home
    ## use the IP address of your naming server
    ## if bind is not installed on your web server
    #nameserver 192.168.196.xxx
    ## use this if your web server is a (caching) name server
    nameserver 127.0.0.1

    # ---- Contents of    etc/hosts ----#
    127.0.0.1 localhost loopback
    192.168.196.2 ns.mynet.home ns www

* Compile and Install Apache

  1. Make the top-level directory for the apache install (in this example: /apache); and create a symlink to it in the real tree:
    ROOT# mkdir /www/apache
    ROOT# ln -s /www/apache /apache

  2. I normally compile and install as an ordinary user (in this example: softs), rather than as 'root'. Note, however, that the installation of apache should be done as root. (See the 'security tips' in the online apache documentation)
    In this case I compile sources in /usr/local/src/chr, which is owned by softs:softs
    $ cd /usr/local/src/chr
    $ tar zxf /path/to/apache_1.3.12.tar.gz
    $ cd apache_1.3.12

  3. Edit config.layout so that it includes a special layout called chroot
    #   chroot layout.<Layout chroot>   prefix:        /apache   exec_prefix:   $prefix   bindir:        $exec_prefix/bin   sbindir:       $exec_prefix/bin   libexecdir:    $exec_prefix/libexec   mandir:        $prefix/man   sysconfdir:    $prefix/conf   datadir:       $prefix   iconsdir:      $datadir/icons   htdocsdir:     $datadir/htdocs   cgidir:        $datadir/cgi-bin   includedir:    $prefix/include   localstatedir: $prefix/var   runtimedir:    $localstatedir/logs   logfiledir:    $localstatedir/logs   proxycachedir: $localstatedir/proxy</Layout>
  4. Now configure and make:
    • non-DSO:
      $ ./configure --with-layout=chroot \
      --enable-module=most --enable-module=so

      By enabling the module 'so' you have the possibility of extending your Apache installation later via 3rd-party modules through the DSO+APXS mechanism.
    • DSO:
      $ ./configure --with-layout=chroot \
      --enable-module=most --enable-shared=max


    $ make
    ROOT# make install ## I am root!

  5. Copy the other shared libraries that will be needed by Apache as configured in this example. NOTE that other configurations may require other libraries (use ldd to find out).
    ROOT# cd /www
    ROOT# cp -pi /lib/libm.so.6 /lib/libcrypt.so.1 /lib/libdb.so.3 lib/
    ROOT# cp -pi /lib/libdl.so.2 lib/

  6. Do a quick test to see that it worked. The main fields to edit in the configuration file /www//apache/conf/httpd.conf for a quick test are:
    User www
    Group www
    ServerName yourserver.yourdomain.here
    Port 8088
      ## pick your favourite test port
    Here are sample configuration files:
    non-DSO:httpd.conf (colorized)httpd.conf (plain text)
    DSO:httpd.conf (colorized)httpd.conf (plain text)

  7. Start the daemon (you need to be root):
    ROOT# chroot /www /apache/bin/apachectl start

  8. Test the URL:
    $ lynx -dump http://yourserver/
    Test the URL if on another port, eg: 8088:
    $ lynx -dump http://yourserver:8088/

  9. Here is a small perl script that removes most of the comments from the generated config files, for those who want to simplify the file.

  10. This would be a good time to give ownership of the htdocs tree to the web tree 'owner':
    ROOT# chown -R 888:888 /www/apache/htdocs

* Compile and Install MySQL

MySQL is not installed in the chroot-ed tree; indeed, it should probably be installed on another system. But on my home system it is installed on the same server as apache.

This example includes creating the user and the place where the database will reside, and the creation of the initial database.

  1. Create the user who will own the mysql database -- for example, 777:777 in /home/mysql:
    ROOT# groupadd -g 777 mysqldba
    ROOT# useradd -c "mysql DBA" -d /home/mysql -u 777 -g 777 -m -n mysql

  2. unpack the source and give ownership of the mysql source tree to the mysql user:
    ROOT# mkdir /usr/local/mysql
    ROOT# chown mysql:mysqldba /usr/local/mysql
    ROOT# cd /usr/local/src
    ROOT# tar zxf /path/to/mysql-3.22.27.tar.gz
    ROOT# chown -R mysql:mysqldba /usr/local/src/mysql-3.22.27

  3. Now as the mysql user, make a directory for the database, and compile and install mysql:
    $ mkdir ~/db ## where the DB will reside
    $ cd /usr/local/src/mysql-3.22.27
    $ ./configure --localstatedir=/home/mysql/db --prefix=/usr/local/mysql
    $ make
    $ make install

  4. Create the *MySQL* grant tables (necessary only if you haven't installed *MySQL* before):
    $ ./scripts/mysql_install_db

  5. Install and modify the database startup script, changing the database owner from root to 'mysql':
    ROOT# cd /usr/local/src/mysql-3.22.27/
    ROOT# cp support-files/mysql.server /etc/rc.d/init.d/
    ROOT# chmod 755 /etc/rc.d/init.d/mysql.server
    ROOT# [ edit /etc/rc.d/init.d/mysql.server: ]
    mysql_daemon_user=mysql ## so we can run mysqld as this user.
    ROOT# chkconfig --add mysql.server ## permanently add server to rc scripts

  6. It may be necessary to refresh the shared library cache after installing mysql:
    ROOT# /sbin/ldconfig -nv /usr/local/lib

  7. Edit the PATH variable for the mysql owner, and set up the 'root' password for the database (read the documentation!) (and you will probably want to delete the test database and associated entries):
    $ [ Edit shell login script .bash_profile: ]
         PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
    $ . ~/.bash_profile ## source it!
    $ mysqladmin -u root password '2mUch!data' ## pick your own password!

* Compile and Install PHP

  1. Stop the apache daemon, if it is running:
    ROOT# chroot /www /apache/bin/apachectl stop

  2. You must first compile PHP, then for non-DSO installs only you must recompile Apache. (You will need to do this each time you upgrade either software package for non-DSO installs.)
    $ cd /usr/local/src/chr ## I am NOT root!
    $ tar zxf /path/to/php-4.02.tar.gz
    $ cd php-4.02
    • non-DSO:
      $ ./configure --with-mysql=/usr/local/mysql \
      --with-apache=../apache_1.3.12 --enable-track-vars \
      --with-config-file-path=/apache/conf --sharedstatedir=/tmp
    • DSO:
      $ ./configure --with-mysql=/usr/local/mysql \
      --with-apxs=/apache/bin/apxs --enable-track-vars \
      --with-config-file-path=/apache/conf --sharedstatedir=/tmp
    • DSO:
      (or add CFLAGS switch when mod_ssl was also configured as a DSO module)
      $ CFLAGS=-DEAPI ./configure --with-mysql=/usr/local/mysql \
      --with-apxs=/apache/bin/apxs --enable-track-vars \
      --with-config-file-path=/apache/conf --sharedstatedir=/tmp
    $ make
    • non-DSO:
      $ make install
    • DSO:
      ROOT# make install
      (You will need to be root for the DSO 'make install' of PHP, since the module goes directly into the module tree: /apache/libexec/ and additionally the apache configuration file is altered.)

  3. Now for the non-DSO installation only, recompile Apache, activating the PHP module:
    $ cd ../apache_1.3.12/
    $ ./configure --with-layout=chroot \
    --enable-module=most --enable-module=so \
    --activate-module=src/modules/php4/libphp4.a

    $ make
    ROOT# make install ## I am root!

  4. More shared libraries (for PHP) are needed in the chrooted tree; check with 'ldd':
    • For non-DSO: ldd /apache/bin/httpd
    • For DSO: ldd /apache/apache/libexec/libphp4.so
    A little for-loop can be used to copy the needed files from /lib and from /usr/lib:
    ROOT# cd /www
    ROOT# for i in libresolv.so.2 libnsl.so.1 libpam.so.0 ; do
    > cp -pi /lib/$i /www/lib/ ; done

    ROOT# for i in libgd.so.1 libgdbm.so.2 libz.so.1; do
    > cp -pi /usr/lib/$i /www/usr/lib/ ; done


  5. If you will be needing mysql, you must install that library as well from the place it was compiled into:
    ROOT# cp -pi /usr/local/mysql/lib/mysql/libmysqlclient.so.6 /www/usr/lib/

  6. You must edit httpd.conf so that it recognizes .php files, if you have not already done so:
    ROOT# cd /apache/conf
    ROOT# [ edit /apache/conf/httpd.conf ]
     AddType application/x-httpd-php .php
     AddType application/x-httpd-php-source .phps


  7. Restart the daemon:
    ROOT# chroot /www /apache/bin/apachectl start

  8. For non-DSO installs you can check for compiled-in PHP:
    ROOT# chroot /www /apache/bin/httpd -l | grep php
    mod_php4.c

  9. Here is a 'hello world' script to test PHP. It should be installed as 'hello.php' (save as type 'text' from netscape), with a copy or a symlink as 'hello.phps' for source-code viewing if you wish. Do not leave it lying around for the public after you have finished testing!

* Compile and Install Perl

You can get away with simply copying /usr/lib/perl5 into /www/usr/lib/ ; and copying /usr/bin/perl5.00503 (assuming Red Hat 6.0) into /www/usr/bin/. You would need to check for, and install any missing shared libraries. You should also make a hard link from usr/bin/perl5.00503 to usr/bin/perl in /www as well.

The easy way:

ROOT# cp -a /usr/lib/perl5 /www/usr/lib/perl
ROOT# cp -p /usr/bin/perl5.00503 /www/usr/bin/
ROOT# cd /www/usr/bin
ROOT# ln perl5.00503 perl

Nonetheless (the slightly less easy way :o), I show how to compile and install perl. If you are going to install mod_perl then you really must compile perl here:

  1. Make the nessary links to install into the chroot-ed tree. This example uses /usr/Local inside the tree. The choice of /usr/Local is deliberate -- do not confuse it with /usr/local.
    Ever fearful :-O, I installed as 'softs':

    ROOT# mkdir /www/usr/Local
    ROOT# ln -s /www/usr/Local /usr/Local
    ROOT# chown softs:softs /www/usr/Local

  2. Get the source RPM from the redhat sources:
    ROOT# rpm -i /path/to/perl-5.00503-2.src.rpm

  3. As the owner (softs) of the source tree, unpack perl.
    $ cd /usr/local/src/chr
    $ tar zxf /usr/src/redhat/SOURCES/perl5.005_03.tar.gz

  4. Red Hat supplies some patches in the SRPM. You can apply these patches for this distribution as well. This exemple illustrates patching perl from a Red Hat 6.0 distribution.
    $ cp /usr/src/redhat/SOURCES/perl*.patch .
    $ cd perl5.005_03
    $ patch -p1 <../perl5-installman.patch
    $ patch -p1 <../perl5.005_02-buildsys.patch
    $ patch -p1 <../perl5.005_03-db1.patch

  5. You need to run Configure, accepting most of the defaults from the script. You will also probably want to specify 'none' for the man pages. A few of the defaults to change in my example are listed below:
    $ ./Configure
    • architecture name? i386-linux
    • Installation prefix to use? /usr/Local
    • Directories to use for library searches? /lib /usr/lib /usr/Local/lib
    • install perl as /usr/bin/perl? n

  6. Compile and install it.
    $ make
    $ make test
    $ make install

  7. Create symlink to perl in the usr/bin tree. If you are not installing mod_perl (see ahead), then you could change ownership of the perl tree to root (but not necessary as long as the permissions on the perl tree are read-only for the web-tree owner: uid '888' in this example):
    ROOT# cd /www/usr/bin
    ROOT# ln -s ../Local/bin/perl perl

  8. Check the shared libraries and install any missing libraries (depends on your configuration options). No extra libraries are needed in this example:
    ROOT# ldd /www/usr/bin/perl
      libnsl.so.1 => /lib/libnsl.so.1 (0x4001b000)  libdl.so.2 => /lib/libdl.so.2 (0x40031000)  libm.so.6 => /lib/libm.so.6 (0x40035000)  libc.so.6 => /lib/libc.so.6 (0x40052000)  libcrypt.so.1 => /lib/libcrypt.so.1 (0x40147000)  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
  9. Test your installation:
    ROOT# chroot /www /usr/bin/perl -v

    This is perl, version 5.005_03 built for i386-linux...
  10. Set up the example perl cgi bin script installed with the apache server:
    ROOT# cd /www/apache/cgi-bin
    ROOT# chmod ugo+x *

  11. Start your apache server, and test the example perl cgi bin script installed with the server:
    ROOT# chroot /www /apache/bin/apachectl start
    $ lynx -dump http://yourserver/cgi-bin/printenv
    While you are at it, check test-cgi for shell CGI access as well:
    $ lynx -dump http://yourserver/cgi-bin/test-cgi

  12. Finally, REMOVE the execute bit from the example cgi-scripts, or remove them entirely. Don't let the general public have access to these scripts:
    ROOT# chmod ugo-x /www/apache/cgi-bin/*

* Compile and Install mod_perl

  1. This process assumes that your chroot-ed perl tree is owned by your source-code owner. It this is not the case then change ownership:
    ROOT# chown -R softs:softs /www/usr/Local

  2. Extract the source code for mod_perl:
    $ cd /usr/local/src/chr
    $ tar zxf /path/to/mod_perl-1.24.tar.gz
    $ cd mod_perl-1.24

  3. IMPORTANT: Put /usr/Local/bin first in the path before starting configuration. This helps to avoid problems with the configuration finding /usr/bin/perl or /usr/local/bin/perl first in your environment:
    $ which perl
    /usr/bin/perl

    $ export PATH=/usr/Local/bin:$PATH ## assuming a bourne shell
    $ which perl
    /usr/Local/bin/perl


  4. Now configure mod_perl; configure the Perl-side of mod_perl, and prepare the mod_perl subdirectory inside apache:
    • non-DSO:
      $ perl Makefile.PL APACHE_SRC=../apache_1.3.12/src \
      DO_HTTPD=1 USE_APACI=1 PREP_HTTPD=1 EVERYTHING=1


    • DSO:
      $ perl Makefile.PL USE_APXS=/apache/bin/apxs \
      EVERYTHING=1


    • DSO:
      ( or add the CFLAGS switch when mod_ssl was also configured as a DSO module [and respect any message about apache include files being in unusal places!] )
      $ CFLAGS=-DEAPI perl Makefile.PL USE_APXS=/apache/bin/apxs \
      EVERYTHING=1


  5. Now make and install mod_perl into the chroot-ed tree:
    $ pwd
    /usr/local/src/chr/mod_perl-1.24

    $ make
    • non-DSO:
      $ make install
    • DSO:
      ROOT# make install
      (You will need to be root for the DSO 'make install' of mod_perl, since the module goes directly into the module tree: /apache/libexec/ and additionally the apache configuration file is altered.)

  6. For the non-DSO installs only you must recompile apache and reinstall it:
    $ cd /usr/local/src/chr/apache_1.3.12/
    $ ./configure --with-layout=chroot \
    --enable-module=most --enable-module=so \
    --activate-module=src/modules/php4/libphp4.a \
    --activate-module=src/modules/perl/libperl.a

    $ make
    Stop apache if it was previously running, and install it:
    ROOT# chroot /www /apache/bin/apachectl stop
    ROOT# make install ## I am root!

  7. For non-DSO installs you can check for compiled-in PHP and mod_perl:
    ROOT# chroot /www /apache/bin/httpd -l | grep -E '(php|perl)'
    mod_php4.c
    mod_perl.c


  8. Test your mod_perl setup with the Hello.pm. perl module written by Doug MacEachern. You need to install it, edit httpd.conf and restart apache:
    $ cp -i Hello.pm \
    /www/usr/Local/lib/perl5/site_perl/5.005/i386-linux/Apache/


    Insert the mod_perl configuration necessary for Hello.pm into httpd.conf -- example:
    <Location /hello>  SetHandler perl-script   PerlHandler Apache::Hello</Location> ### Section 3: Virtual Hosts
    ROOT# chroot /www /apache/bin/apachectl restart
    $ lynx -dump http://yourserver:yourPort/hello
       Hello, I see you see me with Lynx/2.8.3dev.18 libwww-FM/2.14.
  9. If you are finished testing then comment out this entry in httpd.conf. Don't leave unnecessary functionality enabled in your apache configuration.

  10. NOTE: If you need to install other perl modules, you must put /usr/Local/bin first in your path before running perl Makefile.PL:
    $ export PATH=/usr/Local/bin:$PATH ## assuming a bourne shell

* Compile and Install mod_ssl

I hope you have read the additional notes section if you are planning a DSO install of mod_ssl.

You must compile both openSSL and mod_ssl. I have also elected to compile rsaref version 2.0. You should read the documentation for mod_ssl in the source code table to understand the issues and the options for mod_ssl.

Note that openssl and rsaref provide the include files, libraries and tools to allow you to compile mod_ssl and generate keys, and therefore they are not part of, nor installed into, the chroot-ed tree.

  1. Extract the source code for mod_ssl, openssl and rsaref20:
    $ cd /usr/local/src/chr
    $ tar zxf /path/to/mod_ssl-2.6.6-1.3.12.tar.gz
    $ tar zxf /path/to/openssl-0.9.5a.tar.gz
    $ mkdir rsaref-2.0
    $ cd rsaref-2.0
    $ tar Zxf /path/to/rsaref20.1996.tar.Z

  2. Configure and build the RSA Reference library. Note that on 64-bit architectures you MUST read the documentation in the INSTALL file in the mod_ssl package about portability problems/solutions with rsaref.
    $ cd /usr/local/src/chr/rsaref-2.0
    $ cp -rpi install/unix local
    $ cd local
    $ make
    $ mv rsaref.a librsaref.a

  3. Configure and build the OpenSSL library.
    $ cd /usr/local/src/chr/openssl-0.9.5a
    $ ./config -L/usr/local/src/chr/rsaref-2.0/local -fPIC
    $ make
    $ make test
       # inspect output for anomolies

  4. You may want to install the package. Of course, it is not installed in the chroot-ed tree. Here I assume that softs:softs owns the /usr/local/ tree, because the default install prefix for openssl is /usr/local/ssl. However, it is not necessary to install this package; you can operate out of the src tree for building mod_ssl (but do NOT run make clean!)
    $ make install

  5. Configure mod_ssl:
    $ cd /usr/local/src/chr/mod_ssl-2.6.6-1.3.12
    $ ./configure --with-apache=../apache_1.3.12

  6. Go into the apache tree to complete the build. Run configure and then make:
    $ cd /usr/local/src/chr/apache_1.3.12
    • non-DSO:
      $ SSL_BASE=../openssl-0.9.5a RSA_BASE=../rsaref-2.0/local \
      ./configure --prefix=/apache --with-layout=chroot \
      --enable-module=most --enable-module=so --enable-module=ssl \
      --disable-rule=SSL_COMPAT --enable-rule=SSL_SDBM \
      --activate-module=src/modules/php4/libphp4.a \
      --activate-module=src/modules/perl/libperl.a

    • DSO:
      $ cd src/modules
      $ make clean
      ## seems to be necessary if you previously compiled in the apache tree
      $ cd ../../
      $ SSL_BASE=../openssl-0.9.5a RSA_BASE=../rsaref-2.0/local \
      ./configure --prefix=/apache --with-layout=chroot \
      --enable-module=most --enable-shared=max --enable-shared=ssl \
      --disable-rule=SSL_COMPAT --enable-rule=SSL_SDBM
    $ make

  7. Install apache again. Stop apache if it was previously running, and then install it:
    ROOT# chroot /www /apache/bin/apachectl stop
    ROOT# make install ## I am root!

  8. For non-DSO installs you can check for the compiled-in modules:
    ROOT# chroot /www /apache/bin/httpd -l | grep -E '(php|perl|ssl)'
    mod_ssl.c
    mod_php4.c
    mod_perl.c


  9. Create the random devices in the chroot-ed tree:
    ROOT# cd /www/dev
    ROOT# mknod random c 1 8
    ROOT# mknod urandom c 1 9

  10. Merge the default configuration file into your current httpd.conf file. I test on a different port from the standard port 80 because I usually already have a web server running on port 80. But for the secure port (port 443) I have no web server running, so I use it immediately.

    For the default configuration file the main fields to change for this example follow (and
    here is an example httpd.conf file):
    • User www
    • Group www
    • ServerName yourserver.yourdomain.here
    • Port 8088   ## pick a test port
    • Listen 8088   ## in 'IfDefine SSL' section
    • Listen 443   ## this is the standard secure port!
    • <VirtualHost _default_:443>
    • AddType application/x-httpd-php .php
      AddType application/x-httpd-php-source .phps
    • # your Hello.pm script for mod_perl testing:
      <Location /hello>
      SetHandler perl-script
      PerlHandler Apache::Hello
      </Location>
    • SSLCertificateFile /apache/conf/server.crt
    • SSLCertificateKeyFile /apache/conf/server.key
      # in this example I generate the key and crt files into /apache/conf

  11. If you do not already have a server key and certificate then create them. In this example I assume that openssl is in your path because you have installed it. If not, then you should add it to your path (according to this example it is in /usr/local/src/chr/openssl-0.9.5a/apps).

    Note also that I am certifying my own key. Presumably you will get a Certifying Authority to sign your key if you are doing any serious work with your web tree (eg: commericial work):

    • ROOT# cd /www/apache/conf

    • # set up a path of random files:
      ROOT# randfiles='/var/log/messages:/proc/net/unix:/proc/stat:/proc/ksyms'

    • # generate the server key
      ROOT# openssl genrsa -rand $randfiles -out server.key 1024

    • # generate the signing request (don't add a password when certifying it yourself).
      Note that it is important that the Common Name match your fully-qualified web server name!
      ROOT# openssl req -new -nodes -out request.pem -key server.key

    • # sign your own key (validity for one year in this example):
      ROOT# openssl x509 -in request.pem -out server.crt -req \
      -signkey server.key -days 365


    • Protect your key and certificate:
      ROOT# chmod 400 server.*

    • Delete the request file:
      ROOT# rm request.pem

    • Optionally encrypt your key (you will have to provide the password each time your start apache, but you may have a very good reason for doing this!):
      ROOT# mv server.key server.key.unencrypted
      ROOT# openssl rsa -des3 -in server.key.unencrypted -out server.key
      ROOT# chmod 000 server.key.unencrypted ## better yet delete it!

    • Oops, you changed your mind. You decide to remove the encryption password from your key:
      ROOT# openssl rsa -in server.key -out server.key.un
      ROOT# mv server.key.un server.key
      ROOT# chmod 400 server.key

  12. Start apache first without ssl to make sure it still works:
    ROOT# chroot /www /apache/bin/apachectl start
    $ lynx -dump http://yourserver:8088/

  13. Re-start apache with ssl and test it with netscape (note that the URL is specified as https):
    ROOT# chroot /www /apache/bin/apachectl stop
    ROOT# chroot /www /apache/bin/apachectl startssl
    $ netscape https://yourserver/

  14. At this point you probably want to edit your web server configuration and set the server on the standard ports 80 and 443 if your test configuration did not use these ports.

* Some Security Considerations

  1. See the 'security tips' in the online apache documentation for some help in this area. One extra precaution to take is to change the permissions on the httpd scripts and binaries:
    ROOT# chmod ugo-rw /www/apache/bin/*

* Escaping Your Chroot-ed Environment

  1. You should be very careful when you set about deliberately escaping from your chroot-ed environment -- you need to assess the risks and benefits. In the UNIX world there is always more than one way to accomplish a task, and you should think about other ways of solving your problem.

    Never the less, I provide an example C-utility that implements a customised remote-shell command to email a file generated by forms output to someone. It might be invoked via a cgi-bin script, or via PHP. Example:
          <?php      ...      /** construct the file name as $f  **/      $cmd = "/bin/mail \"-s Some-subject-line -t webmaster@localhost -f $f\"";      $op = exec( $cmd, $arr, $retval );      ...      ?>   
    The file is called wwwmail.c and it is linked here.

    Almost anything can be done this way if you code-up your own small utility. I have written a similar utility to exec sqlplus macros for example. But these sorts of utilities are risky, and need to be carefully evaluated.

    For this particular problem (emailing forms-output to someone) you might be better off putting files to be mailed in a directory and having a cron job pass through every few minutes and process them...

* Cleanup, etc. After Installation

  1. Remove temporary links needed for installation of apache and perl ( remember to put them back if you need to rebuild or upgrade any package ):
    ROOT# rm /apache /usr/Local

  2. Automate the startup of Apache by installing a startup script called httpd in /etc/rc.d/init.d/ Here are two examples:
  3. Standard appache on port 80
  4. Apache on ports 80 and 443 (startssl)

  5. Then run chkconfig on it to set the runlevel symbolic links (and verify it with '--list'):
    ROOT# chkconfig --add httpd
    ROOT# chkconfig --list httpd
    httpd       0:off   1:off   2:on    3:on    4:on    5:on    6:off
  6. Automate log file trimming. On a Red Hat system you can specify which log files and which parameters to use in /etc/logrotate.conf. Here is an example file

* New: Harvesting files based on RPMs

    I haven't had time to totally document this, but you can use the RPM contents from RPMs and create a chroot-ed web tree without compiling the sources. To this end, I have two scripts. I will document this technique more completely later...
  1. Script file based on Red Hat 7.0 that will harvest the RPMs
  2. Script file for creating temporary SSL key and certificate (testing purposes only!!!)
2006/09/08 14:13 2006/09/08 14:13
이 글에는 트랙백을 보낼 수 없습니다

### Hostname 변경하기 ###

/etc/HOSTNAME 파일은

부팅 시 /etc/sysconfig/network 파일의 HOSTNAME 부분을 참조하여 저장합니다.


따라서 호스트명을 바꾸고자 할 때에는 /etc/sysconfig/network 파일의 HOSTNAME 부분을 변경한 후, 리부팅을 하거나 네크워크 재시작 명령을 내리면 됩니다.

[root@ ~]# /etc/rc.d/init.d/network restart

[root@ ~]# hostname "hostname"   -라우터 호스트네임 변경하는것 같이 해주시면 됩니다

2006/09/08 14:11 2006/09/08 14:11
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:10
출처 블로그 > 인생의 자유는 모두의 권리입니다....
원본 http://blog.naver.com/hdchong/100006713656

로드밸런싱 (load balancing)


만약 www.naver.com으로 접속한다고 치고 네이버에 웹서버가 두대가 있다면

그 서버가 211.218.150.200과 211.218.150.201이라고 치고 각 서버가

L4스위치에 물려있고 사용자는 www.naver.com으로 서비스 요청을 하겠져

처음 사용자가 www.naver.com에 접속을 한다면 211.218.150.200으로 접속이

된다고 칩시다 그러면 그다음 사용자는 211.218.150.201로 접속이 되고요.

이렇게 한쪽으로 치우치지 않게 사용량을 분배하는 것이 서버로드벨런싱입니다.

그리고 한쪽 서버(211.218.150.200)가 죽어버리면 그 서버가 정상동작

을 할때까지 그 포트를 차단시키는 기능도 있읍니다. 이렇게 되면 211.218.150.201

에만 접속이 되고 속도도 처하됩니다. 빨리고쳐야 정상적인 속도를 찾겠져.

만약에 이 기능이 정상적으로 동작을 안하면 어떤 때에는 접속이 되고

어떤 때에는 안돼고 그렇겠져...--; 쓰바 왜 안돼는 거야...TT

그리고 서버는 여러개인데 순차적으로 첫번째 것에만 사용자가 달라붙으면

느려 지겠고요 - 접속 서버가 여러대일 경우 로드밸런싱이 적용 안됀 경우는


서버1-사용자1 서버2-사용자2 서버3-사용자3 서버4-사용자4 서버5-미접속

서버1-사용자1 서버2-접속해제 서버3-사용자3 서버4-사용자4 서버5-미접속

서버1-사용자1 서버2-사용자5 서버3-사용자3 서버4-사용자4 서버5-미접속

서버1-접속해제 서버2-사용자5 서버3-사용자3 서버4-사용자4 서버5-미접속

서버1-사용자6 서버2-사용자2 서버3-사용자3 서버4-사용자4 서버5-미접속

이런식으로 서버5부터 다음 서버는 놀겠져...--;


이런 것을 해결하기 위한 기능이져.

이 로드벨런싱은 회선에서도 적용이되져 어느정도 트래픽이 한쪽으로

치우치면 트래픽이 사용량이 적은 쪽으로 데이타를 보내는 기능 등이져....


로드 벨런싱 한마디로 여러 경로를 한쪽으로 치우침없이 균등하게 사용하겠다는 겁니다.

단점이 있다면 하나가 다운되면 트래픽이 한쪽으로 치우쳐서 둘다 퍼지는 경우도 있읍니다.



금강제화 로드밸런싱 구축 사례
NETWORK TIMES 2004년 02월호

지난 1954년부터 ‘최고가 아니면 판매하지 않는다’를 모토로 국내 제화산업을 이끌어온 금강제화

(대표 신용호 www.kumkang.com)는 지난해 늘어나는 내부 트래픽을 제어하기 위해 파이오링크 ‘핑크박스 3000’을 구매했다.

핑크박스가 막 출시된 시점이라 안정성에 대한 검증 등에 대해 의문이 많았지만 최신제품으로 최고의 네트워크를 구축하자는 신념으로 성공적으로 구축, 안전하게 쓰고 있다. 금강제화의 핑크박스 활용

사례를 들여다본다.

지난해 금강제화는 파이어월과 VPN 통합장비를 구입, VPN을 도입하면서 부하분산에 대한 필요성이 두드러졌다. 이에 따라 늘어나는 내부 트래픽 증가를 효율적으로 처리해주기 위해 파이어월과 VPN

통합장비를 추가로 구매할 계획을 세웠다. 또 파이어월/VPN 통합장비 2대 사용으로 이중화 구성을

위한 로드밸런싱 장비가 필요했고 내부 서버 트래픽 부하분산을 위해서 L4 스위치 도입을 고려하게 됐다.

외산장비를 포함한 여러 장비업체들의 제안서를 검토한 결과 금강제화는 신속한 지원과 커스트마이징이 용이한 국산장비를 도입하는 것이 낫겠다는 판단 아래 파이오링크의 L4스위치를 도입하기로 결정했다.


빠른 속도·관리 용이성으로 ‘업무능률 향상’

금강제화가 로드밸런싱을 위해 파이오링크의 L4 스위치 도입을 결정했을 당시는 핑크박스 3000이 출시되기 전이었다. 핑크박스 1508을 도입하기로 결정하고 프로젝트를 진행하던 중 파이오링크에서 핑크박스 3000을 출시했고 금강제화는 내부회의를 거쳐 3000을 도입하기로 변경했다. 물론 이 선택에

대해 반대하는 의견도 만만찮았다.

신규 출시되는 장비에 대한 안정성, 신뢰성 등을 의심, 3000보다 검증된 1508로 가는 게 더 낫지 않겠냐는 의견이 지속적으로 제기됐지만 기왕이면 앞선 성능의 제품으로 더 나은 네트워크를 구성해보자는 전산실의 의견을 수렴하게 됐다.

금강제화 기획조정본부 전산실 김경준 과장은 “1508의 경우 파이어월 로드밸런싱(FLB)과 서버

로드밸런싱(SLB)를 별도로 수행해야했지만 3000은 FLB와 SLB를 한 장비에서 통합 구현할 수 있다”

며 “이런 통합기능으로 인해 5대 이상 구입해야할 L4 스위치 장비를 3대로 줄여 네트워크 구성이

간편해졌다”고 만족해했다.

또 그는 “프로젝트 초기에는 처음 설치해보는 제품이라 여러 가지 문제도 발생했지만 파이오링크에서 최대한 지원해줬고 장기적으로도 최신장비를 구입해야 몇 년동안 업그레이드에 대한 걱정 없이 운영할 수 있을 것 같아 초기의 어려움을 감수했다”고 덧붙였다. 현재 금강제화는 파이어월/VPN용으로

한 대와 파이어월/VPN/SLB용으로 2대, 3세 대의 핑크박스 3000, 그리고 지점망에 핑크박스 1508을 운영하고 있다.

지난해 2월 L4 스위치 장비 도입 계획을 세운 후 자체 개발기간 6~7개월을 거쳐 실제로는 9월부터

설치에 들어갔고 약 한달간의 안정화기간을 거쳐 지난해 10월말부터 본격적으로 가동하고 있는 상태다. 현재까지는 아무런 장애 없이 늘어난 트래픽을 효과적으로 제어하며 만족스럽게 쓰고 있다.

김 과장은 “핑크박스 3000이 내부 트래픽을 각 서버의 상황에 따라, 트래픽의 종류에 따라 로드밸런싱이 가능해 약 50% 이상 속도가 향상됐다”며 “빨라진 속도로 인해 직원들의 만족도도 높아져 업무능률이 향상됐다”고 언급했다.


금강제화 네트워크 구성도


가격대비 우수한 성능·부하부산 ‘탁월’

금강제화에 설치된 다계층 스위치 ‘핑크박스 3000’은 로드밸런싱 기능을 통해 서버, 캐시 서버, 네트워크 보안 장비(파이어월, VPN), IDS 등의 높은 가용성은 물론이고, 원활한 처리 속도를 제공하는 제품이다. 이 제품은 패킷을 고속 처리하고 동시에 100만 개 이상의 세션을 처리할 수 있어 사용자가 많은

대규모 환경에 적합하다.

일반적인 다계층 스위치의 용도가 웹 서버, 캐싱 서버, 파이어월 등 각종 서버의 로드밸런싱, 장애복구 기능을 돕는 데 있는 만큼, 핑크박스 3000도 이런 기능을 기본으로 제공한다. 여러 종류의 로드밸런싱 기능을 동시에 지원할 수 있도록 설계돼 핑크박스 3000 1대로 다양한 로드밸런싱 용도로 사용할 수

있다. 금강제화가 특히 만족하는 부분도 바로 이러한 여러 종류의 로드밸런싱 기능을 동시에 지원할 수 있다는 점이다.

금강제화는 VPN 로드밸런싱, 서버 로드밸런싱, 파이어월 로드밸런싱 등 다양한 로드밸런싱 기능을 한 장비에서 동시에 구현함으로 관리 편이성과 네트워크 구성 용이성 등의 이점을 톡톡히 누리고 있다.

김경준 과장은 “VPN 구축과 함께 문제로 대두된 VPN 트래픽을 효과적으로 처리해줄 방법을 찾고

있었는데 핑크박스의 VPN 로드밸런싱의 경우, 지점 VPN 장비에서 센터 장비로의 접속 뿐 아니라,

센터에서 지점으로의 접속도 허용함으로써 VPN 네트워크를 100% 활용할 수 있는 환경을 제공한다”며 “따라서 이런 다양한 로드밸런싱을 통해 인터넷 서비스의 성능을 극대화하고 트래픽 관리를 고차원적으로 수행할 수 있다”고 언급했다.

또 핑크박스 3000은 중요한 대역폭 관리를 위한 QoS (Quality of Service)기능은 트래픽 유형별

대역폭 보장, 사용자의 우선 순위 설정에 따른 대역폭 제한을 통해 제공한다. IP 어드레스, 포트 번호 수준의 트래픽 구분 외에도 URL, 쿠키, HTTP 헤더 등 7계층 정보에 의한 트래픽 구분을 통해 정교한 대역폭 관리 기능을 제공하는 것도 강점이다. 이런 QoS 기능으로 인해 주요 트래픽과 단순 인터넷

접속 트래픽 등을 분류, 업무에 중요한 트래픽에 우선 순위를 할당할 수 있어 업무효율성도 증가했다.


침입탐지· 바이러스월 등 보안 기능 추가 예정

한편 금강제화는 강남지점에 네트워크 로드밸런싱 장비인 ‘핑크박스 1508’을 설치, 운영중이다. 이 장비는 전용선을 포함한 다수(7회선)의 초고속인터넷 회선을 결합해 하나의 회선처럼 동작하게 함으로써 대용량(최대 100Mbps)의 안정적인 인터넷 접속을 제공해 최고 100Mbps의 대역폭 확보가 적은

비용으로 가능하다. 다중의 회선을 사용하기 때문에 안정성도 매우 뛰어나다.

김 과장은 “지난 1년동안 강남지점에 핑크박스 1508을 설치 후 128Kbps의 전용선과 ADSL 3회선을 동시에 사용하게 될 경우와 E2 1회선을 사용하는 경우를 비교해봤더니 전자의 경우가 속도에서도 월등할 뿐만 아니라 최소 천 만원 이상의 비용절감이 가능한 것으로 나타났다”며 “향후에는 보안 등의 문제로 인해 E1, T3 등으로 회선을 증설, 양재동 본사쪽으로 트래픽을 통합해야겠지만 현재로서는 강남지점의 운영상태가 좋아 강남지점외의 타 지점, 영업소 등을 같은 방법으로 운영할 것으로 고려하고 있다”고 언급했다.

향후 금강제화는 전국 매장 280곳과 계열사 등을 통합하면 약 600노드 이상이 될 것으로 예상, 이를 통합하게 되면 발생할 대량 트래픽에도 로드밸런싱 장비로 적절히 제어할 수 있을 것으로 기대하고 있다. 또 침입탐지, 바이러스월 등 보안장비를 추가로 도입, 안전한 네트워크 구성을 위해 만전을 기할 방침이다.

[생각]===============================================================

저희도 L4장비를 검토중에 있는데..제품에 대한 기술적인 자료등이 오픈이 안되어 비교하기가

수월하지 않더군요..L4장비는 서버,VPN,방화벽등의 장비 사이에 설치하며 트래픽 로드밸런싱

기능으로 장비를 효율적으로 사용하고 장애시에 트래픽을 우회함으로써 장애예방이 주 목적이지요

인터뷰에서는 50% 속도 향상이라고 표현했는데 방화벽 이중화로 인한 향상이며 L4장비는

보조적인 지원이라고 봐야 하겠지요 ^^

대기업에서도 수익율로 네트워크 장비개발에 미온적인데 국내벤쳐에서 개발하여 동남아 시장에

판로개척을 하는것을 보면 흐믓합니다

지난 1954년부터 ‘최고가 아니면 판매하지 않는다’를 모토로 국내 제화산업을 이끌어온 금강제화(대표 신용호 www.kumkang.com)는 지난해 늘어나는 내부 트래픽을 제어하기 위해 파이오링크 ‘핑크박스 3000’을 구매했다.

핑크박스가 막 출시된 시점이라 안정성에 대한 검증 등에 대해 의문이 많았지만 최신제품으로 최고의 네트워크를 구축하자는 신념으로 성공적으로 구축, 안전하게 쓰고 있다. 금강제화의 핑크박스 활용사례를 들여다본다.

지난해 금강제화는 파이어월과 VPN 통합장비를 구입, VPN을 도입하면서 부하분산에 대한 필요성이 두드러졌다. 이에 따라 늘어나는 내부 트래픽 증가를 효율적으로 처리해주기 위해 파이어월과 VPN 통합장비를 추가로 구매할 계획을 세웠다. 또 파이어월/VPN 통합장비 2대 사용으로 이중화 구성을 위한 로드밸런싱 장비가 필요했고 내부 서버 트래픽 부하분산을 위해서 L4 스위치 도입을 고려하게 됐다.

외산장비를 포함한 여러 장비업체들의 제안서를 검토한 결과 금강제화는 신속한 지원과 커스트마이징이 용이한 국산장비를 도입하는 것이 낫겠다는 판단 아래 파이오링크의 L4스위치를 도입하기로 결정했다.

빠른 속도·관리 용이성으로 ‘업무능률 향상’

금강제화가 로드밸런싱을 위해 파이오링크의 L4 스위치 도입을 결정했을 당시는 핑크박스 3000이 출시되기 전이었다. 핑크박스 1508을 도입하기로 결정하고 프로젝트를 진행하던 중 파이오링크에서 핑크박스 3000을 출시했고 금강제화는 내부회의를 거쳐 3000을 도입하기로 변경했다. 물론 이 선택에 대해 반대하는 의견도 만만찮았다.

신규 출시되는 장비에 대한 안정성, 신뢰성 등을 의심, 3000보다 검증된 1508로 가는 게 더 낫지 않겠냐는 의견이 지속적으로 제기됐지만 기왕이면 앞선 성능의 제품으로 더 나은 네트워크를 구성해보자는 전산실의 의견을 수렴하게 됐다.

금강제화 기획조정본부 전산실 김경준 과장은 “1508의 경우 파이어월 로드밸런싱(FLB)과 서버 로드밸런싱(SLB)를 별도로 수행해야했지만 3000은 FLB와 SLB를 한 장비에서 통합 구현할 수 있다”며 “이런 통합기능으로 인해 5대 이상 구입해야할 L4 스위치 장비를 3대로 줄여 네트워크 구성이 간편해졌다”고 만족해했다.

또 그는 “프로젝트 초기에는 처음 설치해보는 제품이라 여러 가지 문제도 발생했지만 파이오링크에서 최대한 지원해줬고 장기적으로도 최신장비를 구입해야 몇 년동안 업그레이드에 대한 걱정 없이 운영할 수 있을 것 같아 초기의 어려움을 감수했다”고 덧붙였다. 현재 금강제화는 파이어월/VPN용으로 한 대와 파이어월/VPN/SLB용으로 2대, 3세 대의 핑크박스 3000, 그리고 지점망에 핑크박스 1508을 운영하고 있다.

지난해 2월 L4 스위치 장비 도입 계획을 세운 후 자체 개발기간 6~7개월을 거쳐 실제로는 9월부터 설치에 들어갔고 약 한달간의 안정화기간을 거쳐 지난해 10월말부터 본격적으로 가동하고 있는 상태다. 현재까지는 아무런 장애 없이 늘어난 트래픽을 효과적으로 제어하며 만족스럽게 쓰고 있다.

김 과장은 “핑크박스 3000이 내부 트래픽을 각 서버의 상황에 따라, 트래픽의 종류에 따라 로드밸런싱이 가능해 약 50% 이상 속도가 향상됐다”며 “빨라진 속도로 인해 직원들의 만족도도 높아져 업무능률이 향상됐다”고 언급했다.

가격대비 우수한 성능·부하부산 ‘탁월’

금강제화에 설치된 다계층 스위치 ‘핑크박스 3000’은 로드밸런싱 기능을 통해 서버, 캐시 서버, 네트워크 보안 장비(파이어월, VPN), IDS 등의 높은 가용성은 물론이고, 원활한 처리 속도를 제공하는 제품이다. 이 제품은 패킷을 고속 처리하고 동시에 100만 개 이상의 세션을 처리할 수 있어 사용자가 많은 대규모 환경에 적합하다.

일반적인 다계층 스위치의 용도가 웹 서버, 캐싱 서버, 파이어월 등 각종 서버의 로드밸런싱, 장애복구 기능을 돕는 데 있는 만큼, 핑크박스 3000도 이런 기능을 기본으로 제공한다. 여러 종류의 로드밸런싱 기능을 동시에 지원할 수 있도록 설계돼 핑크박스 3000 1대로 다양한 로드밸런싱 용도로 사용할 수 있다. 금강제화가 특히 만족하는 부분도 바로 이러한 여러 종류의 로드밸런싱 기능을 동시에 지원할 수 있다는 점이다.

금강제화는 VPN 로드밸런싱, 서버 로드밸런싱, 파이어월 로드밸런싱 등 다양한 로드밸런싱 기능을 한 장비에서 동시에 구현함으로 관리 편이성과 네트워크 구성 용이성 등의 이점을 톡톡히 누리고 있다.

김경준 과장은 “VPN 구축과 함께 문제로 대두된 VPN 트래픽을 효과적으로 처리해줄 방법을 찾고 있었는데 핑크박스의 VPN 로드밸런싱의 경우, 지점 VPN 장비에서 센터 장비로의 접속 뿐 아니라, 센터에서 지점으로의 접속도 허용함으로써 VPN 네트워크를 100% 활용할 수 있는 환경을 제공한다”며 “따라서 이런 다양한 로드밸런싱을 통해 인터넷 서비스의 성능을 극대화하고 트래픽 관리를 고차원적으로 수행할 수 있다”고 언급했다.

또 핑크박스 3000은 중요한 대역폭 관리를 위한 QoS (Quality of Service)기능은 트래픽 유형별 대역폭 보장, 사용자의 우선 순위 설정에 따른 대역폭 제한을 통해 제공한다. IP 어드레스, 포트 번호 수준의 트래픽 구분 외에도 URL, 쿠키, HTTP 헤더 등 7계층 정보에 의한 트래픽 구분을 통해 정교한 대역폭 관리 기능을 제공하는 것도 강점이다. 이런 QoS 기능으로 인해 주요 트래픽과 단순 인터넷 접속 트래픽 등을 분류, 업무에 중요한 트래픽에 우선 순위를 할당할 수 있어 업무효율성도 증가했다.

침입탐지· 바이러스월 등 보안 기능 추가 예정

한편 금강제화는 강남지점에 네트워크 로드밸런싱 장비인 ‘핑크박스 1508’을 설치, 운영중이다. 이 장비는 전용선을 포함한 다수(7회선)의 초고속인터넷 회선을 결합해 하나의 회선처럼 동작하게 함으로써 대용량(최대 100Mbps)의 안정적인 인터넷 접속을 제공해 최고 100Mbps의 대역폭 확보가 적은

비용으로 가능하다. 다중의 회선을 사용하기 때문에 안정성도 매우 뛰어나다.

김 과장은 “지난 1년동안 강남지점에 핑크박스 1508을 설치 후 128Kbps의 전용선과 ADSL 3회선을 동시에 사용하게 될 경우와 E2 1회선을 사용하는 경우를 비교해봤더니 전자의 경우가 속도에서도 월등할 뿐만 아니라 최소 천 만원 이상의 비용절감이 가능한 것으로 나타났다”며 “향후에는 보안 등의 문제로 인해 E1, T3 등으로 회선을 증설, 양재동 본사쪽으로 트래픽을 통합해야겠지만 현재로서는 강남지점의 운영상태가 좋아 강남지점외의 타 지점, 영업소 등을 같은 방법으로 운영할 것으로 고려하고 있다”고 언급했다.

향후 금강제화는 전국 매장 280곳과 계열사 등을 통합하면 약 600노드 이상이 될 것으로 예상, 이를 통합하게 되면 발생할 대량 트래픽에도 로드밸런싱 장비로 적절히 제어할 수 있을 것으로 기대하고 있다. 또 침입탐지, 바이러스월 등 보안장비를 추가로 도입, 안전한 네트워크 구성을 위해 만전을 기할 방침이다.

[미니 인터뷰] 김경준 금강제화 기획조정본부 전산실 과장

통합관리·성능우수·업무 효율성 ‘만족’

■ 핑크박스 3000을 도입한 이유는.

장애 발생 시 빠른 지원을 받으려면 외산보다 국산이 낫고 위치도 가까운 곳에 있는 회사가 좋겠다는 판단 아래 여러 외산벤더의 솔루션을 포함, 다양한 제품들을 검토해본 끝에 파이오링크의 로드밸런싱 장비를 구입하기로 결정했다. 실제로 예전에 통합보안의 중앙관리를 위해 국산 보안제품을 쓰다가 외산으로 바꿨더니 특별한 문제, 우리가 원하는 요구에 대한 세심한 관리가 부족한 것을 경험했다. 따라서 커스터마이징이 손쉽고 원할 때 지원이 가능한 국산장비가 낫다고 판단했고 실제 운영해본 결과 파이오링크의 빠른 지원에 만족한다.

■ 도입한 핑크박스 3000에 만족하는지.

핑크박스 3000을 도입할 당시 초기 출시된 장비라 실제 구축경험, 운영 안정성 등에 대한 검증이 없어 초반에는 좀 애를 먹었다. 물론 현재는 만족스럽게 잘 쓰고 있고 우리는 초기 출시에 따른 위험을 감수하면서 도입을 결정했으니 약간의 어려움도 감수할 수 있었다.

그러나 로드밸런싱을 위해 장비를 신규 도입하려는 회사들은 레퍼런스를 통해 테스트를 끝낸 장비를 도입했으면 한다. 신규장비를 도입한다고 해서 기존 업무에 있어 지장을 줘서는 안된다. 따라서 기존업무의 안정성을 보장할 수 있는 검증된 장비를 도입하는 것이 좋다.

■ 향후 추가도입이나 활용계획은.

현재 구축된 네트워크 상태에 만족하지만 침입탐지, 바이러스월 등을 보강, 해킹이나 바이러스 등에서 네트워크를 안전하게 보호할 계획이다. 또 향후 전국 지점, 계열사 등을 통합, 운영하게 될 경우를 대비해 네트워크 안정성, 대역폭 용량 등을 풍부히 갖춰놓을 방침이다.

금강제화 전산실은 타 회사들에 비해 전산인원이 많은 편이다. 최대 48명까지 전산담당 인원이 있었을 정도인데 이는 자체 개발, 자체 유지보수를 기본으로 하기 때문이다. 또 각 매장마다 설치돼 있는 수 백대의 POS 장비들을 관리하기 위해서는 전산인원이 많이 필요하다. 이번 로드밸런싱 장비 설치에도 도입을 결정한 시점이 2월이었지만 장비의 네트워크 구성, 설치 등 SI적인 작업은 자체적으로 수행했다. 앞으로도 금강제화는 자체 관리, 자체 개발을 기본으로 효율적인 네트워크 구축을 위해 최선을 다할 방침이다.




Windows2000Pro를 사용해서 로드밸런싱게이트웨이를 구성하신다는것이신지(이건 윗분말씀처럼 다른OS와 추가로 더 깔아야합니다.) 아니면 Windows2000들을 로드밸런싱을 하신다는것이신지...

보통 로드밸런싱은 후자쪽을 말하는데
장비로 해결하는경우(L4스위치,SLB장비 같은말)가있고
고전적으로 DNS round robin방식으로 하는방법도 있고..

L4로 하는경우에는 L4가 어떤모드인지...

하여튼 복잡합니다. --;;

관련내용은 궵검색에서 SLB나 L4 switch등을 검색해보시면 많은 솔류션이 나올껍니다.

돈안들이고 하는방법은 DNS round robin이죠. 효율성은 떨어지지만 돈이안드니...

그저 밑에서버가 IP가 111.111.111.1부터 4까지 4대라면

www.aaa.com에 IP를 111.111.111.1부터 4까지 등록을해놓으면

www.aaa.com을 접근할때 차례대로 순번대로 1부터4까지 골고루 나누어서 접속하게 해줍니다.

참고로 지금 nslookup을 해보니

www.naver.com은 IP가 한갠데..이건 L4를 사용해서 할테고...

naver.com은 DNS round robin이네요.
Name: naver.com
Addresses: 211.218.150.81, 211.218.150.82, 211.218.150.93, 211.218.150.96
211.218.150.98, 211.218.150.115, 211.218.150.132, 211.218.150.134, 211.218.150.135
211.218.150.139, 211.218.150.140, 211.218.150.152, 211.218.150.157, 211.218.150.193
211.218.150.53


이럴경우에는 위에꺼중에 아무거나 하나잡아서 쓰게됩니다.(실제로는 위의 IP중 몇개는 역시 L4를 사용하여 또 로드밸런싱을 할 경우도 있죠)

========추가

쪽지로 물어보셨는데...

NIC(LAN카드) 두개를 묶는거는

로드발란싱이라기보다는 그저 Network Bandwidth를 늘리는(100메가 두개면 200M로)쪽이겠지요.

그런건 보통 딜리게이션(맞나-.-ㅋ)이나 Bonding이라고 부릅니다.

윈도에서는 잘 모르겠구요 --;;; (L4등을 사용한다면 그저 L4에 메인IP를 주고 각 NIC에 private address를 부여해서 L4에서 밸런싱을하는방법과 L2스위치(흔히 우리가 아는 스위치허브)에서 기능을 지원하고 서버에서 지원할경우 하는방법도 있는데 그런걸 주로사용합니다.)

제가 MS쪽은 잘 몰라서 --;;;

다른 머신들에서는 보통 그런전용의 NIC이 나옵니다.

예를들어 Sun의 경우에는 Quad Lan Card(qfe)라고해서 100M NIC 4개가 붙은걸 팝니다.(400M bandwidth가 나오겠죠. 뭐 원래 100M가 full 100M가 나오는경우는 없지만요)
그리고 요즘은 기가빗장비들이 많아져서 그냥 기가빗NIC을 사용해버리는 추세입니다.(기가빗하나붙이면 뭐 거의 Bandwidth는 끝나버리니까요. 어짜피 전용선이 못봐쳐주는데요 ^^)

그리고 포트별로 NIC을 다르게한다던지 그런건 L4의 도움으로 보통 구현합니다. 서버단에서의 설정은 귀찮기만하고 뭐 그렇거든요 ^^




로드밸런싱 (리눅스 편)

심마로, 리눅스원(주) 연구원

목차

1. 리눅스 로드 밸런싱

(1) 로드밸런싱이란?

(2) 리눅스 로드 밸런싱의 목적

(3) 리눅스 로드 밸런싱의 구성

2. 리눅스 로드 밸런싱 솔루션

(1) 리눅스 가상 서버 LVS(Linux Virtual Server)

(2) 레드햇의 피라냐(RedHat Piranha)

(3) 기타 상용 솔루션

3. 리눅스 고가용성 솔루션

(1) 리눅스 고가용성 솔루션의 개요

(2) Kimberlite/Convolo Cluster

(3) OPS(Oracle Parallel Server)

4. 프로세스 마이그레이션

(1) 프로세스 마이그레이션 개요

(2) Mosix

(3) Scyld

5. 맺음말

 

1. 리눅스 로드 밸런싱

 

(1) 로드밸런싱이란?

로드밸런싱을 간단히 정의하자면, 여러 컴퓨터에 작업을 균등하게 분산시킴으로써 한 대의 컴퓨터를 사용하는 것에 비해 짧은 시간에 사용자가 원하는 작업을 수행하고자 하는 것이다. 수십 대의 컴퓨터를 사용한다고 하더라도 주로 한 대의 컴퓨터에서 작업이 이루어진다면 원하는 성능 향상을 얻을 수 없을 것이기 때문에, 작업을 "균등"하게 분산시키는 것이 중요하다.

로드밸런싱을 위해서 전용 하드웨어를 사용할 수도 있고, 일반적인 컴퓨터와 일반적인 운영체제를 사용할 수도 있으며, 또한 처리 수준 측면에서는 응용 프로그램 레벨과 IP 레벨에서 로드 밸런싱을 처리할 수 있다. 이 글에서는 주로 일반적인 운영체제를 사용하는 경우, 그리고 IP 레벨에서 로드밸런싱을 처리하는 경우를 다룰 것이다.

 

(2) 리눅스 로드밸런싱의 목적

리눅스 로드밸런싱의 목적은 리눅스 서버를 클러스터로 연결하여 전체적으로 저렴한 가격에 높은 성능을 제공하는 것이다. SMP 시스템이라고 부르는 공유 메모리 방식의 서버 시스템의 경우, CPU 갯수가 2개, 4개, 8개 등으로 증가함에 따라서 가격이 기하급수적으로 증가하기 때문에, 확장성이 좋지 못하다. 따라서 수십 ~ 수백 대의 서버가 요구되는 경우 클러스터 설정을 사용하게 된다. 또한 수십 ~ 수백 대의 서버에서 사용하는 운영체제로서 리눅스를 사용하는 것이 안정적이고 성능이 우수하며, 가격도 저렴하기 때문에 효과적이다. 클러스터 설정을 위해 사용되는 하드웨어는 공간 비용을 절약하기 위해 1.75"(약 4.5cm) 높이의 1U 랙 마운트 케이스를 사용하는 추세이다.

물론, 응용에 따라서는 수십 개의 CPU가 공유 메모리 방식으로 연결된 SMP 시스템을 요구하는 경우도 있다. 예를 들어 Sun사의 Starfire 구조(Sun Enterprise 10000)의 경우 64 CPU까지 지원한다. 하지만 응용 프로그램의 수정을 통해서 로드밸런싱 클러스터에서 실행시키는 것이 가능하다면, SMP 시스템에 비해 높은 가격대 성능비를 얻을 수 있다.

그리고, 서버의 수가 증가함에 따라 에러가 발생할 확률이 증가하므로 이를 해결하기 위해 추가적으로 고가용성(High Availability)을 제공한다. 고가용성은 전체 시스템의 각 부분에서 모두 필요한데, 이에 대해서는 3절에서 설명한다.

(3) 리눅스 로드밸런싱의 구성

이 글에서는 리눅스 로드 밸런싱을 위해 다음과 같은 일반적인 구성을 가정하였다.

<논리적인 구성>

 

 

<물리적인 구성>

<전체적인 시스템 구성>

  • 로드밸런서 2대 failover

  • 서버 노드 8대

  • 데이타베이스 서버 노드 두 대

  • 공유 SCSI 외장형 스토리지

  • 100 Mbps 이더넷 스위치 * 2

로드 밸런서 2대는 Active-Passive 설정(두 대의 서버가 동시에 사용자의 요청을 처리하는 것이 아니라, Active 상태인 하나의 서버만 사용자의 요청을 처리하며, Passive 상태인 서버는 Acitve 상태인 서버가 제대로 동작하는지 감시하고 있다가, 오동작을 하는 경우 사용자의 요청을 넘겨 받아 작업을 처리한다)이며, 한 대로 설정하는 경우 발생할 수 있는 로드 밸런서의 에러로 인한 전체 서비스의 중단을 막기 위해 2대로 설정한다. 로드 밸런서를 위한 하드웨어는 CPU 성능이나 메모리 용량이 크게 요구되지 않지만, 하드웨어의 안정성이 중요하다.

서버 노드는 로드 밸런서에서 작업을 분배시켜 준 것을 받아서 실제로 작업을 수행한다. 여기서는 8대의 서버 노드를 가정하였다. 그렇지만, 실제로는 설정에 따라서 수십 ~ 수백 대의 서버 노드를 연결할 수 있다. 1U 랙마운트 케이스에 듀얼 CPU 설정을 많이 사용한다.

데이터베이스 서버 노드 두 대 역시 Active-Passive 설정이며, 이 부분에 대해서는 3절, "리눅스 고가용성 솔루션"에서 자세히 설명한다.

공유 SCSI 외장형 스토리지는 데이터베이스 서버 노드 두 대에 외장 SCSI 케이블로 연결되며, 스토리지 내부는 RAID로 구성되어 서비스의 중단을 방지한다.

100Mbps 이더넷 스위치는 이 시스템의 로드 밸런서 및 서버 노드들 사이의 연결을 위해 사용된다. 앞의 설정에서는 외부 인터넷과 서버의 연결, 서버와 데이터베이스 연결을 위해 별도의 이더넷 스위치를 사용한다고 가정했다. 그러나, 이더넷 스위치의 포트가 넉넉하다면, 로드밸런서와 서버 노드 사이의 연결과, 서버 노드와 데이터베이스 서버 노드 사이의 연결을 모두 하나의 이더넷 스위치로 연결할 수 있다.

이와 같은 시스템 설정에서 오동작으로 인해 전체 시스템의 서비스 중단을 일으킬 수 있는 부분은 개별 서버가 아니라 서버간의 연결을 담당하는 네트워크 스위치이다. 따라서 품질이 우수한 이더넷 스위치를 사용할 필요가 있다.

(로드밸런싱 솔루션 중에서 로드 밸런서 2대에 의한 failover만으로는 로드 밸런서의 에러에 의한 서비스 중단을 방지하기에 불충분하다고 주장하며, 따라서 살아 있는 다른 서버로 로드 밸런서의 이전을 제공하는 솔루션들도 있다. 하지만, 필자의 생각으로는 이와 같은 시스템 설정에서 과부하 상황에서 문제가 발생할 수 있는 부분은 이더넷 스위치를 비롯한 네트워크 인터커넥션 부분이며, 이에 대한 충분한 품질 검사가 필요하다고 생각한다. 또한, 계속되는 과부하 상황에서 로드밸런서가 다른 서버로 이전되기 위한 네트워크 부하의 증가와, 이전 후의 충분하지 못한 서버 용량 때문에 정상적인 서비스 지속은 불가능할 것으로 생각한다)

박스 : <IBM의 올림픽 사이트 관련>

1998년 나가노 동계 올림픽 공식 홈페이지는 당시에 다음과 같은 기록을 세웠다. (기네스북 인증)

* 사상 최고의 가장 인기있는 인터넷 이벤트 - 공식적으로 감사된 수치는 올림픽

게임 16일동안 6억 3천4백만 요청.

* 1분동안 가장 많은 히트를 기록한 인터넷 사이트 - 공식적으로 감사된 수치는 여자

자유종목 피겨스케이팅 경기중의 1분동안 110,414히트를 기록.

이 사이트의 구축을 위해 TCP 수준에서의 라우팅에 기반한 로드 밸런싱 기법을 사용하였다. 클러스터의 한 노드는 TCP 라우터라고 불리는데, 클라이언트의 요구를 라운드 로빈 또는 다른 방법을 사용해서 클러스터 내의 웹 서버 노드로 전송한다. 라우터의 도메인 이름과 IP 주소는 외부에 공개되어 있고, 클러스터의 다른 노드들은 클라이언트에서는 보이지 않는다. (만약 둘 이상의 TCP 라우터 노드가 있는 경우, RR-DNS가 하나의 도메인 이름을 여러 TCP 라우터로 대응시킨다) 클라이언트는 요청을 TCP 라우터 노드로 보내고, 이 TCP 라우터 노드는 특정 TCP 연결에 속한 모든 패킷을 서버 노드들 중의 하나로 보낸다. TCP 라우터는 어느 노드로 라우팅 할 것인지 결정하기 위해 부하(load)에 기반한 다른 알고리즘을 사용할 수도 있고, 부하에 기반한 알고리즘보다 성능이 떨어지는 라운드-로빈 방법을 사용할 수도 있다. 서버 노드는 TCP 라우터를 건너뛰고 클라이언트에 직접 응답한다. 요구 패킷은 응답 패킷에 비하면 작기 때문에, TCP 라우터에는 작은 부하만 걸린다.

TCP 라우터 스킴은 DNS 기반 솔루션보다 좋은 로드 밸런싱을 제공하고, 클라이언트나 네임 서버의 캐싱 문제를 피할 수 있다. 라우터는 개별 서버 노드의 부하를 고려한 더 좋은 로드 밸런싱 알고리즘을 사용할 수도 있다. TCP 라우터는 웹 서버 노드의 고장을 인식하여 사용자의 요청을 사용 가능한 웹 서버 노드로만 전송할 수 있다. 시스템 관리자는 TCP 라우터의 설정을 변경하여 웹 서버 노드를 추가, 삭제할 수 있고, 이를 통해 웹 서버 클러스터를 관리할 수 있다. 백업 TCP 라우터를 설정하여, TCP 라우터 노드의 고장을 처리할 수 있고, 백업 라우터는 정상 동작시에는 웹 서버로 동작할 수 있다. 1차 TCP 라우터의 고장을 인식하면, 백업 라우터는 클라이언트의 요청을 자신을 제외한 남아있는 웹 서버 노드로 전송한다.

1998 동계 올림픽 웹 사이트의 구조는 1996년 하계 올림픽 웹 사이트에서의 경험에서 발전한 것이다. 1996년에 우리가 수집한 서버 로그로부터 1998년 웹 사이트 설계의 중요한 통찰을 얻을 수 있었다. 우리는 대부분의 사용자가 기본적인 정보, 메달 순위, 최근의 결과, 현재 뉴스 등을 찾기 위해 너무나 많은 시간을 소비한다는 것을 알게 되었다. 클라이언트는 최소한 세 번 이상의 웹 서버 요청을 통해서야 결과 페이지에 도달할 수 있었다. 사이트의 뉴스, 사진, 스포츠 섹션 등에 대해서도 비슷한 브라우징 패턴을 보였다. 더 나아가, 한 클라이언트가 한 마지막 페이지에 도착하고 나면, 거기엔 다른 섹션에 있는 적절한 정보로 이동하는 직접 링크가 아무 것도 없었다. 이 계층적 탐색 순서 때문에, 중간에 탐색되는 페이지들은 가장 자주 접근되는 것들에 포함되었다.

1998 사이트의 주요 목표 중의 하나는 히트 수 감소였는데, 1996년의 웹 사이트 디자인과, 1998 사이트에서 제공되는 추가된 컨텐츠를 고려하여 예측하면 하루 2억 히트 이상을 기록하기 때문이었다. 따라서 우리는 페이지를 재설계하여 클라이언트가 관계된 정보들을 더 적은 수의 웹 페이지를 보면서 얻을 수 있도록 하였다. 1998 올림픽 게임 웹 사이트의 자세한 설명은 이전의 연구에서 얻을 수 있다.

가장 중요한 변화는 매일 새로운 홈페이지를 생성하고, 이전의 홈 페이지를 클라이언트들이 볼 수 있도록 하는 최상위의 탐색 레벨을 추가한 것이었다. 우리 예상으로는 개선된 페이지 설계로부터 3배 이상의 히트 수 감소를 얻을 수 있었다. 웹 서버 로그 분석에 의하면 25%의 사용자는 개선된 홈페이지에서는 그날의 홈페이지 하나만 보면 원하는 정보를 찾을 수 있었다.

위에서 볼 수 있듯이 고성능 서버의 구현은 전체적인 시스템 설계, 로드밸런싱과 같은 구현 기법, 그리고 웹 사이트의 구축 과정에서의 튜닝 등 다양한 요소가 성공적으로 결합될 때 이루어질 수 있다.

필자가 번역한 전체 문서는 국내의 검색 엔진에서 고성능 웹 사이트 검색 기법이라는 문서를 찾아보기 바란다.

</IBM의 올림픽 사이트 관련>

 

 

2. 리눅스 로드 밸런싱 솔루션

(1) 리눅스 가상 서버 LVS (Linux Virtual Server)

리눅스 가상 서버 LVS 프로젝트의 홈페이지는 http://www.linuxvirtualserver.org이다. LVS(Linux Virtual Server)는 중국의 Wensong Zhang에 의해서 시작되었다. LVS의 기본적인 아이디어는 IBM에서 유래한 것이며, 애틀란타 올림픽과 시드니 올림픽과 같이 하루 동안 최대 접속이 10억번에 가까운 사이트의 구성을 위해 활용되었다. IBM은 이와 관련한 몇 개의 특허를 갖고 있다.

LVS 프로젝트는 그 이전부터 개발되어 오고 있던 HA Linux project를 활용하고 있으며 HA Linux 프로젝트는 mon, fake 등을 사용하고 있다. http://www.linux-ha.org 사이트에서 heartbeat 등의 패키지를 구할 수 있다. (HA Linux 프로젝트와 LVS 프로젝트, RedHat의 Piranha 패키지는 오픈 소스의 진화적인 발전 과정을 잘 보여준다고 생각한다. 이전의 상업적인 소프트웨어 개발 모델의 경우, 같은 이론이나 알고리즘을 사용하더라도 소스 코드의 활용이나 라이브러리화가 거의 이루어지지 못했는데, 오픈 소스 프로젝트에서는 다른 프로젝트의 소스 코드를 활용하는 것이 오히려 일반적이라고 할 수 있다.)

LVS에서 HA Linux 프로젝트는 Active-Passive 설정에서 상대편 서버가 정상적으로 동작하는지 판단하기 위해 사용되며, mon은 실제 서버 노드의 부하 수준을 판단하기 위해 사용된다.

이와 유사한 기본 아이디어를 갖고 있는 솔루션으로는 RedHat의 Piranha, Ultra Monkey, Turbo Linux의 Cluster 등이 있다. RedHat의 Piranha는 LVS를 바탕으로 재구성하고 기능을 추가한 패키지이다. Ultra Monkey의 경우 VA Linux에서 제시하고 있는 공개 솔루션으로서 LVS를 바탕으로 하고 있다. 터보 리눅스의 클러스터 서버도 기본 아이디어는 유사한데, 새로 구현된 코드로 구성되어 있다. 터보리눅스의 클러스터 서버는 설치되는 서버 노드의 수에 따라 비용을 지불해야 하는 상용 제품이다.

1) 로드밸런싱의 구조

로드밸런싱을 위한 구조는 다음과 같이 몇 가지 설정이 가능하다.

  • NAT

  • IP 터널링(Tunneling)

  • 직접 라우팅(Direct Routing)

 

NAT는 사용자의 요청 패킷과 실제 서버의 응답 패킷이 모두 로드밸런서를 거치는 구조이다. 실제 서버에 다양한 OS를 사용할 수 있지만, 확장성이 좋지 못하다. IP 터널링은 로드밸런서와 실제 서버에 모두 IP 터널링을 처리할 수 있는 커널이 설치되어 있어야 한다. 시스템 설정은 유연하게 할 수 있다. 터널링을 위한 패킷변환 부하가 약간 증가한다. Direct Routing은 시스템 설정의 제약이 있으나, 높은 성능을 얻을 수 있다.

로드밸런싱 구조의 선택은 시스템 설정이 모두 끝난 다음 이루어지는 것이 아니라, 시스템의 용도에 따라 시스템 설정 이전에 선택해야 한다.

  • NAT

<시스템 구성>

 

 

<패킷의 변환>

패킷 변환은 다음과 같이 동작한다.

입력 패킷의 출발 주소와 도착주소가 다음과 같다고 하자.

SOURCE 202.100.1.2:3456 DEST 202.103.106.5:80

로드밸런서는 실제 서버를 선택한다. 예를 들어 172.16.0.3:8000을 선택했다고 하면 패킷을 다음과 같이 변환하여 서버로 전송한다.

SOURCE 202.100.1.2:3456 DEST 172.16.0.3:8000

응답 패킷은 로드밸런서에 다음과 같이 돌아온다.

SOURCE 172.16.0.3:8000 DEST 202.100.1.2:3456

패킷은 원래의 가상 서버 주소에서 돌아오는 것처럼 보이기 위해 다시 다음과 같이 변환된다.

SOURCE 202.103.106.5:80 DEST 202.100.1.2:3456

NAT는 패킷을 변환하여 실제 서버에 전달하고, 실제 서버에서 돌아오는 응답 패킷은 다시 NAT를 거쳐서 사용자에게 전달된다. NAT가 양방향 패킷에 대해서 모두 처리하므로 실제 서버에 임의의 OS를 사용할 수 있어서 응용 분야가 넓지만, 일반적으로 사용자의 요청 패킷에 비해서 실제 서버에서 돌아오는 응답 패킷의 크기가 훨씬 크기 때문에 (웹 서버의 경우, 사용자의 요청 패킷은 URL 요청으로 구성되지만, 실제 서버의 응답 패킷은 해당 URL에 대한 HTML 문서이다) NAT를 거쳐 가는 네트워크 패킷의 부하가 증가한다. 따라서 실제 서버가 10 노드 이하인 경우에만 NAT를 쓰는 것이 바람직하다.

NAT의 장점은 실제 서버에 임의의 OS를 사용할 수 있다는 것이고, 단점은 확장성이 떨어진다는 것이다.

  • IP Tunneling

<시스템 그림>

<패킷의 변환>

IP 터널링(Tunneling)은 로드밸런서가 사용자의 요청 패킷을 실제 서버에 전달하기 위해 다른 패킷 구조로 한겹 씌워서 실제 서버에 전달하면, 실제 서버가 새로운 패킷에서 사용자의 요청 패킷을 꺼내서 처리하는 방식이다. 따라서 IP 터널링은 실제 서버의 커널도 요청 패킷을 처리하기 위해 터널링을 지원해야만 하는 구조이다. 그러므로 리눅스로 전체 시스템을 설정하게 된다. 실제 서버의 응답 패킷은 이더넷 스위치를 거쳐서 바로 사용자에게 전달된다. 다음에 설명하는 직접 라우팅(Direct Routing) 보다 좋은 점은, 실제 서버가 IP 터널링을 지원하기만 하면 실제 서버는 지리적으로 멀리 떨어져 있어도 인터넷 상에서 연결되어 있기만 하면 된다는 것이다. 따라서 WAN 환경에서 로드밸런싱을 설정할 경우 IP 터널링을 고려할 수 있다.

IP 터널링의 장점은 확장성이 좋고(100 노드 정도까지), 실제 서버의 위치나 네트워크 연결의 제약이 적다는 것이며, 단점은 실제 서버에서 IP 터널링을 지원하도록 커널이 설정되어 있어야 한다는 것이다.

  • 직접 라우팅(Direct Routing)

<시스템 그림>

직접 라우팅(Direct Routing)의 시스템 구조는 앞의 IP 터널링과 동일하다. 그렇지만, 로드밸런서와 실제 서버는 반드시 동일한 물리적 세그먼트에 존재해야 한다. 직접 라우팅은 이더넷의 브로드캐스팅을 사용하기 때문이다.

<패킷의 변환>

직접 라우팅은 로드밸런서와 실제 서버를 물리적으로 같은 네트워크 세그먼트에 위치시키고, 이 특성을 활용하여 IP 터널링처럼 패킷을 덧씌우는 것이 아니라, 단지 패킷의 MAC 어드레스를 목적지 주소로 변경시킨 다음 실제 서버로 전달하는 방식을 사용한다. 실제 서버는 IP 터널링의 패킷 변환 부하도 없으며, 실제 서버의 응답 패킷은 이더넷 스위치를 거쳐서 바로 사용자에게 전달된다.

직접 라우팅의 장점은 확장성이 좋고(100 노드 정도까지), IP 터널링을 처리하기 위한 오버헤드도 없다는 점과, 실제 서버에 특별한 설정이 필요하지 않다는 점이다. 단점은 로드 밸런서와 실제 서버가 물리적으로 같은 네트워크 세그먼트에 속해 있어야 한다는 점이다.

2) 스케줄링 알고리즘

또한 스케줄링을 위해 다음과 같은 몇 가지 알고리즘을 적용할 수 있다. 스케줄링 알고리즘은 앞의 로드밸런싱 구조에 달리 시스템 설정이 끝난 다음에도 알고리즘을 변경할 수 있다.

  • 라운드-로빈(round-robin)

  • 가중 라운드-로빈(weighted round-robin)

  • 최소 연결(least connection)

  • 가중 최소 연결(weighted least connection)

라운드-로빈 방식은 로드밸런서에 들어오는 요청 패킷들을 차례대로 실제 서버에 할당하는 방식이다. 이 방식에서 실제 서버의 현재 부하 상황 등은 고려되지 않는다. 단지 차례대로 할당할 뿐이다. 하지만, 이렇게 하더라도 로드밸런싱을 위해 이전에 사용되던 라운드-로빈 DNS 방식에 의해 서버를 할당하는 방식에 비해서는 우수한데, DNS의 경우는 한번 서버가 지정되면 해당 서버에 수많은 요청 패킷이 몰릴 수 있기 때문이다.

가중 라운드-로빈 방식은 기본적으로 라운드-로빈 방식인데, 각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다. 이 방식을 사용해야 하는 경우는 실제 서버들이 CPU의 수와 성능, 메모리 용량 등 서로 다른 성능을 가지고 있어서, 각 서버를 동등하게 취급할 수 없는 경우이다.

최소 연결 방식은 실제 서버들 중에서 현재 가장 적은 수의 요청을 처리하고 있는 서버를 선택하여 요청 패킷을 할당하는 방식이다. 이 방식은 실제 서버의 현재 부하 상황을 동적으로 판단하여 요청을 처리하기 때문에, 앞의 두 방식에 비해서 동적으로 우수한 부하 분산 효과를 얻을 수 있다.

가중 최소 연결 방식은 기본적으로 최소 연결 방식인데, 가중 라운드-로빈 방식과 마찬가지로 각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다.

3) 설정 예제

NAT의 경우 웹 서버를 위한 간단한 설정 예는 다음과 같다. 다음 설정은 모두 로드밸런서에서 설정한다.

로드밸런서가 패킷 매스커레이딩을 처리하도록 하기 위해 다음과 같이 설정한다.

echo 1 > /proc/sys/net/ipv4/ip_forward

ipchains -A forward -j MASQ -s 172.16.0.0/24 -d 0.0.0.0/0

그리고 웹 서버를 설정하는 경우, 가상 서버의 80 포트에 대해 스케줄링 알고리즘을 설정한다. wlc는 가중 최소 연결 방식을 나타낸다.

ipvsadm -A -t 202.103.106.5:80 -s wlc

그리고 로드밸런서에 실제 서버를 다음과 같이 추가한다.

ipvsadm -a -t 202.103.106.5:80 -R 172.16.0.2:80 -m

ipvsadm -a -t 202.103.106.5:80 -R 172.16.0.3:8000 -m -w 2

그러면 좀 더 자세히 설정을 알아보도록 하자.

패킷 매스커레이딩을 설정하는 것은 위에서 설정한 내용으로 충분하다.

다음으로, 스케줄링 알고리즘의 설정은 로드밸런서 설정 과정에서 ipvsadm에서 -s 옵션을 사용하여 설정한다. 다음 예제는 rr(round robin)으로 설정한 경우이고, wrr(weighted round robin), lc(least-connection), wlc(weighted least-connection) 옵션을 사용할 수 있다.

ipvsadm -A -t 207.175.44.110:80 -s rr

그 다음으로 실제 서버를 다음과 같이 설정한다.

ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1 -m

ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2 -m

ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3 -m

ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4 -m

ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.5 -m

직접 라우팅 설정의 경우 다음과 같이 설정한다. 시스템이 사용하고 있는 주소는 172.26.20.xxx이고, 여기에서 로드밸런서의 주소는 111번, 실제 서버의 주소는 112번 이후, 그리고 가상 서버의 주소는 110번이다.

로드밸런서의 경우는 다음과 같이 설정한다.

ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up

route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0

ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up

route add -host 172.26.20.110 dev eth0:0

echo 1 > /proc/sys/net/ipv4/ip_forward

ipvsadm -A -t 172.26.20.110:23 -s wlc

ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -g

실제 서버 1번에서 다음과 같이 설정한다. 다른 실제 서버의 경우 112를 113, 114 등으로 변경해야 한다.

ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up

route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0

ifconfig lo:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up

route add -host 172.26.20.110 dev lo:0

또는 숨은(Hidden) 디바이스를 사용하여 다음과 같이 설정할 수도 있다.

로드밸런서에서 다음과 같이 설정한다.

echo 1 > /proc/sys/net/ipv4/ip_forward

ipvsadm -A -t 172.26.20.110:23 -s wlc

ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -g

그리고 실제 서버에서 다음과 같이 설정한다.

echo 1 > /proc/sys/net/ipv4/ip_forward

ifconfig lo:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up

route add -host 172.26.20.110 dev lo:0

echo 1 > /proc/sys/net/ipv4/conf/all/hidden

echo 1 > /proc/sys/net/ipv4/conf/lo/hidden

LVS를 직접 사용하는 경우의 자세한 설명은 LVS Documentation (http://www.linuxvirtualserver.org/Documents.html)을 참조하기 바란다.

 

(2) 레드햇의 피라냐 (RedHat Piranha)

레드햇의 피라냐(piranha) 패키지는 LVS를 바탕으로 하여 재구성한 패키지로서 다음과 같은 세 개의 패키지로 구성되어 있다.

piranha 피라냐의 기본 패키지

piranha-docs 피라냐의 문서 패키지

piranha-gui 피라냐의 GUI 패키지

(piranha-gui 패키지의 경우, 피라냐 설정을 X 터미널을 통해서나 웹을 통해 원격으로 관리할 수 있도록 해 주는데, 이전의 패키지에서 기본 패스워드를 설정한 채로 출시되어 문제가 된 적이 있다. 현재는 piranha-gui 패키지를 선택한 다음 패스워드를 설정해 주는 프로그램인 piranha-passwd을 사용하여 원격 관리를 위한 패스워드를 설정하도록 하고 있다)

레드햇의 피라냐 패키지는 레드햇 6.x 버전의 경우는 기본 패키지에 포함되어 있었고, 7.x의 경우는 레드햇 ftp 사이트에서 구할 수 있다.

피라냐의 핵심은 로드밸런서 두 개 노드에서 동작하는 lvs와 pulse, 그리고 실제로 작업을 처리하는 실제 서버에서 동작하는 nanny 데몬으로 구성되어 있다.

lvs는 로드밸런서에서 사용자의 요청 패킷을 실제 서버에 분배하는 역할을 수행하며 pulse에 의해 실행된다. pulse는 로드밸런서가 정상적으로 동작하고 있는지 여부를 백업 로드밸런서가 알 수 있도록 하기 위해 사용된다. 그리고 nanny 데몬은 실제 서버와 로드밸런서에서 서로 다른 옵션을 사용하여 실행되는데, pulse에 의해 서버들의 상태를 모니터하기 위해 사용되는 데몬이다.

ntsysv에서 pulse 서비스를 선택함으로써 로드밸런서를 설정할 수 있다. 이렇게 설정함으로써, 로드밸런서가 매번 리부팅될 때마다 pulse 데몬이 실행되며, pulse 데몬이 실행되면 lvs 데몬과, fos 데몬이 실행되고, lvs 데몬은 nanny 데몬을 실행시킨다.

피라냐의 설정은 /etc/lvs.cf 설정 파일과, ipvsadm 관리 프로그램을 통해 이루어진다. 웹을 통해 설정할 수도 있지만, 웹을 통해 이와 같은 로드밸런싱 시스템을 설정하는 것 보다는 설정 파일을 사용하여 설정하는 것이 좋을 것 같다.

/etc/lvs.cf는 다음과 같은 세 부분으로 구성되어 있다.

  • Global Settings

  • Virtual Servers

  • Failover Services

다음은 sample.cf라는 샘플 화일에서 뽑은 것이다.

  • Global Settings부분은 다음과 같다.

service = lvs

primary = 207.175.44.150

backup = 207.175.44.196

backup_active = 1

heartbeat = 1

heartbeat_port = 1050

keepalive = 6

deadtime = 18

두 개의 로드밸런서 서버의 IP 주소를 설정하고, 백업 로드밸런서가 있으므로 backup_active를 1로 설정하며, heartbeat를 사용할 것이므로 heartbeat를 1로 설정한다.

  • Virtual Servers부분은 다음과 같다.

virtual server1 {

address = 207.175.44.252 eth0:1

active = 1

load_monitor = uptime

timeout = 5

reentry = 10

port = http

send = "GET / HTTP/1.0\r\n\r\n"

expect = "HTTP"

scheduler = wlc

persistent = 60

pmask = 255.255.255.255

protocol = tcp

server Real1 {

address = 192.168.10.2

active = 1

weight = 1

}

server Real2 {

address = 192.168.10.3

active = 1

weight = 1

}

}

가상 서버의 주소는 207.175.44.252이고, 실제 서버의 주소는 192.168.10.2, 192.168.10.3 등이다. port=http는 port=80과 같이 쓸 수도 있다.

  • Failover Services부분은 다음과 같다.

failover ftp {

active = 0

address = 207.175.44.252 eth0:1

port = 21

send = "\n"

timeout = 10

start_cmd = "/etc/rc.d/init.d/inet start"

stop_cmd = "/etc/rc.d/init.d/inet stop"

}

위의 예는 ftp에 대한 failover 설정이며, 21번 포트에 대해 설정하고 있다.

ipvsadm은 LVS 패키지에서 바뀐 것이 거의 없다. 그리고 레드햇의 피라냐 패키지에서는 lvs.cf를 통해 시스템을 설정하도록 하고 있으므로, ipvsadm을 사용하지 않는 것이 바람직하다.

 

(3) 기타 상용 솔루션

1) Resonate

Resonate사의 홈페이지는 http://www.resonate.com이다. Resonate는 상용 로드 밸런싱 솔루션을 공급하는 회사로서 Resonate Central Dispatch와 Resonate Global Dispatch 등의 로드 밸런싱 솔루션을 제공한다.

Resonate Central Dispatch는 LAN 기반의 로드밸런싱 솔루션으로서, 기본적으로 LVS나 이를 바탕으로 한 RedHat Piranha 솔루션과 유사하다.

Resonate Global Dispatch는 WAN 기반의 로드밸런싱 솔루션으로서, 지역적으로 분산된 광역 시스템 설정을 위한 솔루션이다.

2) PolyServe underSTUDY

PolyServe사의 홈페이지는 http://www.polyserve.com이다. PolyServe는 underSTUDY라는 상용 로드 밸런싱 솔루션을 공급하는 회사이다. 현재는 LocalCluster enterprise라는 제품명으로 바뀌었다.

 

 

3. 리눅스 고가용성 솔루션

(1) 리눅스 고가용성 솔루션의 개요

1) 고가용성(High Availability) 클러스터란?

엔터프라이즈 컴퓨팅 환경에서 24 x 7 서비스란 1년에 시스템의 정지시간이 수분에서 1시간 이내여야만 한다. 이와 같은 무정지 서비스를 가능하게 해주는 클러스터를 고가용성(High Availability) 클러스터라고 한다.

고가용성 클러스터는 일반적으로 폴트 톨러런트(Fault Tolerant) 시스템과는 달리 보편적인 하드웨어와 네트웍 장비, 스토리지, UPS등으로 구성되며 서비스의 예정된 중단 혹은 불시의 중단에 의한 중단 시간(downtime)을 최소화하여 서비스 중단으로 인한 비용 손실을 최소화하도록 구성된다.

두대의 시스템이 Active-active (각각의 노드가 각각 서비스를 수행) 혹은 Hot-standby(한 노드가 서비스를 수행하고 다른 노드가 standby 상태로 대기) 형태로 구성되며 서비스중에 문제가 발생하거나(unplanned outages) 혹은 서비스 업그레이드 등을 위한 예고된 시스템 정지(planned outages)시 정지된 서버에서 가동되던 서비스가 나머지 노드로 fail-over 하도록 구성된다.

2) 고가용성(High Availability)

로드밸런싱 클러스터는 기본적으로 성능을 높이기 위한 클러스터이다. 그러나 여기서도 서비스 노드가 정상적으로 동작하지 않는 경우 해당 노드를 제외함으로써 전체적인 서비스를 계속하도록 한다.

반면에 로드 밸런서의 경우 하나의 서버의 오동작으로 인해 전체 시스템의 서비스 중단을 일으킬 수 있으므로, 이 경우에 대해 로드 밸런서를 중복시켜 문제를 해결할 수 있다.

로드 밸런서 두 개가 모두 오동작 하는 경우에 대해 이론적으로는 다른 서비스 노드들이 로드 밸런서의 역할을 이어받아 하도록 설정할 수 있으나, 실제 서비스 상황에서 이런 설정은 불필요한 경우가 대부분이다. RAID 스토리지의 경우에도 하나의 디스크의 오류에 대해서 고려하는 것과 마찬가지이다.

 

(2) Kimberlite/Convolo 클러스터

미국의 Mission Critical Linux 사에서 Active-Passive HA 솔루션을 두 가지 버전으로 제공하고 있다. Kimberlite는 소스가 공개되어 있는 GPL 버전이고, Convolo는 상용 버전이다. 이 회사의 홈 페이지는 http://www.missioncriticallinux.com이며, GPL 버전인 Kimberlite는 http://oss.missioncriticallinux.com/projects/Kimberlite 에서 받을 수 있다.

이들 클러스터는 데이타베이스 백엔드 등과 같이 저장 장치를 공유하는 경우에 적합하다. 예를 들어 MySQL, Oracle, NFS 등에 대해서 HA 솔루션을 제공하고자 하는 경우이다.

1) 하드웨어 설정

다른 클러스터와 마찬가지로, Kimberlite 클러스터의 경우에도 다음 그림과 같이 기본적인 시스템 설정이 중요하다. 기본적인 시스템 설정이 구성된 다음에 소프트웨어를 설치하고 소프트웨어적인 설정을 하게 된다.

두 서버 노드는 시스템의 상태를 저장하기 위해 quorum이라는 공유 디스크 파티션을 사용하고, 상대방의 상태를 검사하기 위해 이더넷, 시리얼 라인을 모두 사용한다.

 

2) 소프트웨어 설정

Kimberlite 패키지를 http://oss.missioncriticallinux.com/projects/Kimberlite/download.php에서 다운로드한 경우, Kimberlite 패키지는 소스 코드의 형태로만 배포되므로, 직접 빌드를 해야 한다. 빌드를 하기 위해서는 먼저 http://www.swig.org에서 swig 패키지를 받아서 설치해야 한다. (swig은 simplified wrapper and interface generator의 약어이다) swig 홈페이지의 다운로드 페이지를 보면 여러 버전이 있는데, stable release를 설치해야 한다. 압축을 풀고, ./configure, make, make install 과정을 거쳐서 swig을 설치한다. swig이 설치되고 나면 Kimberlite 패키지의 압축을 풀고, ./configure를 실행한 다음 make 하고, make install 하면 설치가 끝난다. 쉽게 설치가 될 수도 있고, 그렇지 않을 수도 있다. swig1.1p5와 Kimberlite-1.1.0을 받아서 빌드했다면 잘 설치될 것이다. Kimberlite는 /opt/cluster에 설치된다.

위의 그림과 같이 시스템을 설정하고, 소프트웨어를 설치하고 나면, Kimberlite 패키지를 설정하여 사용할 수 있다.

클러스터의 설정은 member_config 프로그램을 사용하여 이루어진다. 이 프로그램은 사용자가 어떤 정보를 입력해야 하는지 자세히 설명하고 있으므로, 쉽게 설정할 수 있을 것이다.

설정 내용을 간단히 요약하자면, 파워 스위치를 포함하고 있는지 여부, 클러스터 멤버의 이름, 상대편 시스템의 상태를 검사하기 위해 시리얼, 이더넷 등의 heartbeat를 몇 가지 사용할 것인지, 두 개의 quorum 파티션을 위한 raw 디바이스의 이름, 파워 스위치가 연결된 시리얼 라인 등이며, 먼저 자신의 시스템의 설정을 입력한 다음, 상대방 시스템의 설정을 입력해야 한다.

한 노드에서 member_config의 실행이 끝나고 나면, 다른 노드에서도 member_config을 실행시켜 주어야 한다.

새로운 노드에서 member_config을 실행하기 전에, 새로운 노드에서 다음과 같은 명령을 실행시켜 준다.

# /opt/cluster/bin/clu_config --init=/dev/raw/raw1

그리고 나서 새로운 노드에 대해서도 자신의 설정과 상대방의 설정을 순서를 바꾸어 입력해 준다.

이렇게 해서 모든 설정이 끝나고 나면, 다음 명령을 사용하여 클러스터를 실행한다.

# /etc/rc.d/init.d/cluster start

다음으로는 클러스터의 관리를 위해서 사용할 수 있는 명령들을 정리해 보도록 하자. 이들 명령은 모두 /opt/cluster/bin에서 찾을 수 있다.

diskutil : quorum 파티션의 설정 상태를 볼 수 있다.

pswitch : 파워 스위치의 설정 상태를 볼 수 있다.

cluadmin : 명령 방식으로 HA 클러스터를 관리할 수 있는 도구이다. 이 명령에서 지원하는 기능은, 서비스의 추가, 변경, 삭제, 그리고 서비스의 활성화/비활성화, 클러스터와 서비스의 상태 보기, 클러스터 데이타베이스의 백업과 복구 등이다.

cluadmin을 실행시키면, 다음과 같은 프롬프트를 볼 수 있다.

cluadmin>

이 프롬프트에서 help 명령을 사용함으로써 도움말을 볼 수 있으며, clear는 화면을 지우는 명령, exit는 프로그램을 종료하는 명령이다.

cluster에 대한 명령과 service에 대한 명령은 각각 cluster와 service 명령으로 시작하며, 다음과 같은 명령들이 있다.

cluster status 클러스터의 상태를 보여준다.

monitor 클러스터의 상태를 5초 간격으로 보여준다.

loglevel 데몬에 대해 로그를 어떤 수준으로 남길 것인지 지정한다.

reload 데몬들이 변경된 클러스터 설정 화일을 다시 읽도록 한다.

name 클러스터의 이름을 변경한다.

backup 클러스터 설정 데이터베이스를 백업 파일에 저장한다

restore 클러스터 설정 데이터베이스를 백업 파일에서 읽어들여 복구한다.

saveas 클러스터 설정 데이터베이스를 지정한 파일에 저장한다.

restorefrom 클러스터 설정 데이터베이스를 지정한 파일에서 읽어들여 복구한다.

Service add 클러스터 데이터베이스에 클러스터 서비스를 추가한다.

modify 지정된 서비스에 대한 자원이나 속성 등을 변경한다.

show state 모든 서비스 또는 지정한 서비스의 현재 상태를 보여준다.

show config 지정한 서비스의 현재의 설정을 보여준다.

disable 지정한 서비스를 중단한다.

enable 지정한 서비스를 시작한다.

delete 지정한 서비스를 클러스터 설정 데이터베이스에서 삭제한다.

웹을 통해 시스템 설정을 모니터하거나, 변경할 수도 있는데, GPL 버전인 Kimberlite의 경우는 시스템 설정의 모니터 기능만 제공한다. /opt/cluster/clumon 디렉토리를 웹 서버에서 참조할 수 있는 디렉토리로 옮기고, 이 디렉토리의 clumon.cgi 프로그램을 사용하여 시스템 설정을 모니터할 수 있다. 상용 버전인 Convolo의 경우는 웹을 통해 시스템 설정을 변경할 수도 있다.

현재 Kimberlite 패키지에서 기본적으로 사용할 수 있는 서비스는 Oracle, MySQL, NFS, Apache, IBM DB2 등이다. 예제 디렉토리인 /opt/cluster/doc/services/examples에서 Oracle과 MySQL을 위한 설정 파일을 볼 수 있으며, 다른 서비스에 대해서는 다음 문서를 참조할 수 있다. 오라클의 경우는 /opt/cluster/doc/services/examples/oracle/oracle 파일을 /etc/rc.d/init.d에 서비스로 등록하여 사용하면 되고, MySQL의 경우는 /opt/cluster/doc/services/examples/mysql.server를 서비스로 등록하여 사용하면 된다.

Kimberlite 패키지의 설정을 위한 가장 충실한 문서는 Kimberlite 패키지 안의 doc 디렉토리의 HTML 문서이다. 자세한 내용은 이 문서를 참조하기 바란다.

 

(3) OPS (Oracle Parallel Server)

1) 오라클 병렬 서버 OPS

오라클은 1998년 가을, 오라클 8 버전을 리눅스로 포팅한 제품을 발표한 이래, 오라클 8i, 오라클 8i Release2 등의 제품에 대해 리눅스 버전을 꾸준히 공급하고 있다. 오라클의 리눅스 버전은 리눅스 커널과 glibc 라이브러리 버전에만 의존하므로, 호환성은 좋은 편이다.

(오라클의 리눅스 버전은 다른 유닉스 환경으로 포팅하는 작업에 비해 짧은 시간에 이루어졌다고 실제 작업의 담당자가 인터뷰에서 밝힌 바 있다. 그리고, 현재 오라클에서 리눅스 버전을 지원하기 위한 인력도 100명을 넘어섰다고 한다. 또한, 오라클 내부에서는 인텔 리눅스 버전 뿐만 아니라, 다른 아키텍처, 즉 Compaq Alpha, Sun Sparc 등의 아키텍처에서 동작하는 리눅스를 위한 오라클 버전도 사용중이라고 한다. 그리고, 인텔에서 발표할 Itanium (IA-64) 64bit CPU를 위해서도 리눅스와 윈도우 64에서 동작하는 오라클의 베타 버전을 http://technet.oracle.com에서 얻을 수 있다. 그러나 이 오라클 베타 버전은 너무 오래된 Itanium 버전의 베타 리눅스 배포판을 대상으로 했기 때문에, 최근의 리눅스 베타 버전에는 설치되지 않았다.)

그리고 가장 최근의 Oracle 8i Release 3(Oracle 8.1.7)의 경우는 오라클 병렬 서버(OPS, Oracle Parallel Server)를 포함하고 있다. 국내 시장에서는 유닉스 시장에서 특히 오라클의 시장 점유율이 높은데(시장이 작기 때문에 1위 제품에 비해 다른 제품에 대해서 기술 지원이 충분히 이루어지지 못하기 때문인 것 같다), 앞에서 설명한 Kimberlite 클러스터나 OPS를 사용하면 상대적으로 저렴한 가격에 다른 상용 유닉스 제품에 못지 않은 가용성을 제공할 수 있다.

OPS를 사용하여 백엔드 데이타베이스를 Active-Active HA 클러스터의 형태로 구축할 수 있다. 물론 OPS를 사용하는 경우 두 대의 컴퓨터에 대해서 뿐만 아니라, 세 대 이상의 컴퓨터에 대해서도 HA 클러스터의 구축이 가능하다. Active-Passive 설정에 비해서 두 서버를 모두 서비스에 사용할 수 있다는 장점이 있으나, 두 서버 모두 오라클 엔터프라이즈 라이센스가 필요하며(Active-Passive 설정의 경우는 라이센스 하나로 충분하다), Active-Passive 설정에 비해 두배까지의 성능을 얻기는 어렵기 때문에, 앞의 설정에 비해 반드시 더 좋은 가격대 성능비를 제공한다고 말하기는 어렵다.

그림에서 보는 것처럼 오라클 병렬 서버는 분산 락 매니저(Distributed Lock Manager, DLM) 소프트웨어가 중요한 역할을 수행하며, 디스크를 공유하는 구조로 되어 있다.

오라클의 http://technet.oracle.com에서 OPS를 검색함으로써 자세한 OPS 관련 자료들을 구할 수 있다.

2) OPS의 설치

http://technet.oracle.com/software/products/oracle8i/software_index.htm 에서 Oracle 8i R3의 개발용 버전을 얻을 수 있으며, 설치 가이드도 얻을 수 있다.

오라클의 OPS는 디스크 공유 구조로 설계되어 있으며, 따라서 시스템의 기본적인 하드웨어 구성은 앞에서 설명한 Kimberlite 클러스터와 유사하다. OPS는 두 개 이상의 서버와, 이들 서버에서 모두 공유하고 있는 디스크 장치로 구성된다.

OPS를 설치하기 위해서는 공유 디스크에 노드 모니터를 위한 raw 디바이스를 설정해야 한다. 리눅스에서 raw 디바이스의 설정은 raw 명령을 사용하여 하드디스크 파티션에 대해 일종의 링크를 생성하는 방법으로 이루어진다. 그리고 watchdog 서버를 설정해야 하며, rsh과 rcp를 위해 /etc/hosts.equiv 파일을 설정하여 서버 노드 사이에서 패스워드 검사 없이 다른 노드에서 명령을 실행할 수 있도록 해야 한다.

오라클 설치과정에서 root.sh을 실행하는 과정이 있는데, OPS 설치 과정에서 각 서버 노드에서 이 스크립트를 실행해 주어야 한다.

OPS의 설치를 위해서는 오라클 설치 프로그램에서 Enterprise Edition을 선택하고, 설치 타입은 Custom을 선택하며(Typical에서는 OPS를 선택할 수 없다), Available Products에서 Oracle Parallel Server를 선택하여 설치한다. 설치 과정에서 OPS에 참여하는 원격 노드들의 노드 이름을 입력해 주어야 한다.

설치가 끝나고 나면, OPS에 참여하는 각 서버 노드에서 OCMS(Oracle Cluster Management Software)를 실행시켜 주어야 하며, 그 다음으로 설치 프로그램을 실행시킨 서버에서 dbassist와 netca를 실행시켜 데이터베이스와 네트워크를 설정한다.

* 오라클 병렬 서버 OPS는 오라클 8i Release 3에 포함되어 있지만, 별도의 라이센스를 요구하는 패키지이므로, technet에서 다운로드 받아서 사용하는 것은 개발 및 테스트용에 한정된다.

 

(4) SteelEye

SteelEye사의 홈페이지는 http://www.steeleye.com이다. 리눅스, 유닉스, 윈도우 NT 등의 OS에서 동작하는 LifeKeeper 솔루션을 공급하고 있다. LifeKeeper 솔루션은 AT&T에 합병되었다가 다시 분리된 NCR에서 파생된 솔루션으로서, 고가용성(High Availability. 99.9%의 가용성, 1년에 8.8시간 미만의 다운 타임)를 넘어서 Fault Resilience (99.99%의 가용성, 1년에 53분 미만의 다운 타임)을 보장한다고 말한다.

 

LifeKeeper 솔루션은 여러 노드로 구성된 시스템에서 가용성을 보장하기 위한 failover 기능을 다양한 시스템 연결 모델에 대해서 제공하고 있다. LifeKeeper 솔루션도 TCP, TTY, 공유 디스크 등 다양한 연결을 사용하여 상대 서버가 살아 있는지 계속 확인하며, N+1 설정에서 특정 서비스에 대한 자신의 상대 서버가 정상적으로 동작하지 않는 경우 해당 서비스에 대해서 서비스를 이전받아서 계속 서비스하는 구조이다. 자세한 내용은 LifeKeeper for Linux 페이지를 참조하기 바란다.

또한 LifeKeeper 솔루션은 MySQL, Informix, Oracle, Sendmail, Apache, Print 서비스에 대해서 recovery kit을 제공하고 있다.

SteelEye사의 홈페이지에서 특히 LifeKeeper Tutorial의 슬라이드를 보면 LifeKeeper에 대해 잘 설명하고 있으므로 참조하기 바란다.

필자의 판단으로는 Mission Critical Linux에서 제공하는 Kimberlite/Convolo 클러스터에 비해 SteelEye의 솔루션이 더 많은 기능을 제공하는 솔루션임은 분명하다. 그렇지만, Mission Critical Linux의 솔루션으로 충분한 응용에 대해서는 Mission Critical Linux의 솔루션이 더 가볍고 깨끗한 솔루션이라는 생각이다. 물론 비용 측면에서도 상대적으로 저렴하고, GPL 버전을 사용할 수도 있다. 두 제품 모두 훌륭하지만, 사용 목적에 따라서 선택해야 할 것이라고 생각한다.

 

 

4. 프로세스 마이그레이션

2장에서 살펴본 로드밸런싱은 사용자의 요청을 적절히 분산시켜 줌으로써 여러 서버 노드에 부하를 분산시키는 기법이다. 따라서 사용자의 요청이 빈번하며, 각 요청이 오래 실행되지 않는 응용의 경우에 바람직하다. 그러나, 사용자의 요청이 그렇게 많지 않고, 각 요청이 상대적으로 오래 실행되는 경우, 특정 노드에만 여러 프로세스가 실행되고 있을 때, 이를 다른 노드로 옮김으로써 로드밸런싱을 이룰 수 있다.

(1) 프로세스 마이그레이션 개요

프로세스 마이그레이션은 한 컴퓨터에서 너무 많은 작업이 실행중일 때, 로드 밸런싱을 위해 프로세스를 현재 많은 작업을 실행하고 있지 않은 다른 컴퓨터로 이동시키는 기법이다. 즉, 프로세스를 정적으로 처리하지 않고, 사용자의 요청에 따라 동적으로 할당할 뿐만 아니라, 프로세스가 실행 중에 다른 서버로 이동할 수 있다. 2장에서 살펴본 로드밸런싱 기법은 사용자의 요청을 처리하기 위한 프로세스를 어떤 서버에서 실행할지 결정하고 나면 실행이 끝날 때까지 해당 서버에서 프로세스가 실행되는 것에 비해서, 프로세스 마이그레이션에서는 프로세스가 실행 중에 다른 서버로 이동하는 것이기 때문에 더 많은 기술적인 제약을 갖는다. 특히 프로세스가 이동할 때 현재 열려있는 파일이나 소켓등에 대해서 어떻게 처리할 것인가 하는 문제가 중요하다.

프로세스 마이그레이션을 위해서는 기본적으로 각 서버 노드가 파일 시스템 등 외부 환경에 대해 동일한 인터페이스를 제공해야 한다. 즉 서버 노드의 투명성을 제공해야 한다. 그 다음으로 프로세스가 마이그레이션될 때 프로세스 상태를 어떤 서버가 관리할 것인가의 문제가 있다. 프로세스 마이그레이션의 구현은 커널 수준 또는 사용자 수준에서 이루어질 수 있으며, 관리 방식도 중앙 집중식과 , 분산 제어 방식으로 구분된다. 현재 MOSIX, Condor, Sprite 등의 프로젝트가 있다.

 

(2) MOSIX

MOSIX 프로젝트의 홈페이지는 http://www.mosix.cs.huji.ac.il/ 이다. MOSIX의 소스코드의 저작권은 GPL로 명시되어 있다. 이스라엘의 헤브루 대학에서 계속 연구되어 왔으며, 리눅스 버전은 버전 0부터 시작된 이 프로젝트의 버전 7이라고 한다. (홈페이지의 정보에 따르면 첫번째 버전은 PDP-11 상에서 1977년부터 1979년까지 개발되었다.) MOSIX의 적당한 응용 분야는 CPU 위주의 작업으로서 실행 시간이 긴 프로세스들로 구성된 작업에 적당하다.

MOSIX의 프로세스 마이그레이션은 커널 패치가 필수적이며, ReiserFS, GFS 등과 같이 동작할 수 있다. GFS와 함께 사용할 때, MOSIX는 파일 I/O를 마이그레이션된 노드로 함께 이동시킬 수 있다.

현재 리눅스 버전에서 활발히 개발되고 있는 MOSIX는 커널 2.2.19에 대해 안정적인 버전이 있으며, 커널 2.4.3에 대해서 개발 버전이 나와 있는 상태이다.

1) MOSIX의 설치

MOSIX를 설치하기 위해서는 패키지를 받아서 풀고, README 파일에 따라서 설치하면 된다. 매뉴얼 파일은 manuals.tar, 사용자 프로그램은 user.tar 파일에 들어 있다.

MOSIX의 클러스터 설정은 모든 노드가 동일하다. 수동으로 클러스터의 각 노드에 모두 설치할 수도 있고, 한 노드에 설치한 다음 클러스터의 모든 노드를 똑같이 복사해 주는 프로그램들을 사용할 수도 있다. 2.4.3 커널을 위한 개발 버전을 설치하는 경우, 먼저 일반 배포판을 설치하고, 2.4.3 커널의 소스 코드를 풀어서 여기에 MOSIX 패치를 적용한다. (배포판에 들어있는 소스 코드는 자체적인 패치를 너무 많이 포함하고 있기 때문에 MOSIX 패치가 잘 적용되기 힘들다) 패치를 적용한 다음에 빌드하는데, 레드햇 7.0의 경우는 들어있는 gcc 2.96을 사용하지 말고 kgcc를 사용해서 빌드하도록 한다.

커널을 빌드해서 설치하여 MOSIX 커널이 실행되도록 하고, user.tar의 사용자 프로그램을 설치하고 나면, mosix.init을 /etc/rc.d/init.d에 복사하고, 실행 레벨에 따라서 mosix.init을 실행하도록 다음과 같이 링크를 만들어 준다.

MOSIX의 시작을 위한 링크 :

ln -s /etc/rc.d/init.d/mosix /etc/rc.d/rc3.d/S95mosix

ln -s /etc/rc.d/init.d/mosix /etc/rc.d/rc5.d/S95mosix

MOSIX의 종료를 위한 링크 :

ln -s /etc/rc.d/init.d/mosix /etc/rc.d/rc0.d/K05mosix

ln -s /etc/rc.d/init.d/mosix /etc/rc.d/rc1.d/K05mosix

ln -s /etc/rc.d/init.d/mosix /etc/rc.d/rc6.d/K05mosix

이와 같이 MOSIX를 설치하고 나면 클러스터는 부하가 많이 걸린 노드에 대해서 프로세스를 다른 노드로 마이그레이션 한다.

이 때 중요한 시스템 데몬에 대해서는 프로세스 마이그레이션을 막아 주어야 한다. 이를 위해 /etc/inittab에서 데몬을 실행하는 경우에 "/bin/mosrun -h"를 앞에 붙여 준다. 예를 들어 "/etc/rc.d/rc 3"를 "/bin/mosrun -h /etc/rc.d/rc 3"으로 바꿔준다. rc.sysinit, update, shutdown 등에 대해서도 마찬가지이다.

 

(3) Scyld

scyld는 Beowulf 클러스터를 처음 만들어낸 Donald Becker (수많은 리눅스용 이더넷 드라이버의 개발자이기도 하다)가 Beowulf의 뒤를 이어 새로 내어 놓은 클러스터이다. (Scyld사에는 최근에 레드햇의 Robert Young이 경영진에 참여했다.) 홈페이지는 http://www.scyld.com이다. Scyld의 저작권은 GPL로 명시되어 있다. scyld에서도 MOSIX와 마찬가지로 프로세스 마이그레이션이 중요한 역할을 담당한다.

Scyld Beowulf 클러스터는 실제 작업을 처리하는 서버 노드들과, 이들을 관리하는 마스터 노드로 구성되어 있으며, 패키지의 핵심은 BProc(Beowulf Distributed Process Space)이다. 작업 프로세스는 실제 서버 노드에서 실행되면서도, 마스터 노드에서 프로세스 정보를 관리할 수 있도록 한다. 또한 다른 노드로 마이그레이션이 가능하다. 이를 처리하기 위해 마스터 노드에서 bpmaster 데몬이 동작하며, 실제 서버 노드에서 bpslave 데몬이 동작한다.

 

1) Scyld의 설치

Scyld는 CD의 형태로 판매된다. http://www.linuxcentral.com에서 주문할 수 있다. ftp를 통해서 받을 수도 있는데, http://www.scyld.com/page/products/beowulf/download.html에서 RPM과 SRPM 패키지들에 대한 링크를 찾을 수 있다.

README 파일을 보면 Scyld에 들어있는 패키지들 중에서 어떤 패키지들에 대해 수정이 이루어졌으며, 어떤 패키지들이 추가되었는지를 볼 수 있다.

추가된 패키지들은 bproc, beoboot, beompi, beosetup, beostatus, beowulf-doc, perf, netdiag, mpi-mandel, mpprun, tachyon, libbeostat, npr 등이다. 그리고 고성능 계산을 위한 패키지로서 scalapack, parpack, mpiblacs, atlas, hpl, octave, NAMD 등의 패키지를 포함하고 있다.

Scyld의 설치를 위해서는 CD 형태의 패키지를 구입하여 시스템에 처음부터 설치하거나, 레드햇 6.2 호환의 리눅스 운영체제를 설치한 다음, RPM 파일들을 다운로드하여 설치하면 된다.

 

 

5. 맺음말

로드밸런싱은 높은 가격대 성능비를 얻기 위한 다양한 클러스터 시스템 설정에서 실제로 높은 성능을 얻기 위해 매우 중요한 부분이다. 행렬의 분할에 의한 계산과 같은 정형화된 문제에 대해서는 굳이 로드밸런싱을 고려하지 않고도 문제를 해결할 수 있지만, 수많은 사용자에게 웹 서비스나 메일 서비스를 제공하기 위한 대규모 서버의 경우에는 2장에서 설명한 로드밸런싱 기법을 사용하면 여러 서버에 부하를 분배시켜서 높은 성능을 얻을 수 있다. 이와 같은 클러스터 설정에서 서버의 수가 늘어남에 따라서 일부 서버에서 에러가 발생할 확률이 증가하는데, 일부 서버의 에러에도 불구하고 전체적인 시스템의 서비스를 계속 제공하기 위해서 3장에서는 고가용성 설정에 대해 설명하였다. 그리고 4장에서는 2장과 같이 각 프로세스가 짧은 시간동안 실행되는 것이 아니라 상당히 긴 시간 동안 실행되는 경우, 특정 노드에 프로세스가 몰려서 성능을 향상시키지 못하는 것을 방지하기 위한 프로세스 마이그레이션 기법에 대해 설명하였다.

클러스터라는 말은 여러가지 시스템 구성에 대해 사용되고 있는데, 이 글에서 다룬 내용은 그 중에서, 성능(웹서버) 클러스터, HA 클러스터, 마이그레이션 클러스터 등이다.계산용 클러스터와, 스토리지 클러스터에 대해서는 이 글에서 자세히 다루지 않았다.

여기서 설명한 내용 외에도, 실제 서버가 수십 대 이상일 때, 데이터베이스 서버가 한 대로 충분하지 않은 경우에 데이터베이스 서버를 여러 대 설치하고 그 중의 한 서버에 대해서만 업데이트를 처리하고, 나머지 서버들은 이 서버로부터 데이터베이스를 주기적으로 복사해서 사용하는 등의 설정 등 높은 성능을 얻기 위한 여러가지 기법을 활용할 수 있다.

리눅스원(주)에서는 이 글에서 언급된 로드밸런싱 솔루션, 고가용성 솔루션, 오라클의 OPS 등을 비롯한 많은 솔루션들을 실제 고객 사이트에서 구축하고 있으며, 이 글에서 언급하지 않은 계산용 클러스터, 저장장치 클러스터 등에 대해서도 연구, 개발, 판매하고 있다. 이들 솔루션에 대한 기술 지원에 대해서는 회사로 연락해 주시길 부탁드린다. (연락처: 02) 3488-9800)

 

필자:

심마로

연락처 : maro@linuxone.co.kr

리눅스원(주) 연구원, 서울대학교 컴퓨터공학부 박사과정.

관심 분야 : 데이타베이스, 병렬처리, 운영체제, 컴퓨터 구조 등.

현재 생물정보공학(bioinformatics)을 위한 클러스터 기술 연구 개발 중.

2006/09/08 14:10 2006/09/08 14:10
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > Human Packet
원본 http://blog.naver.com/jabusunin/20012727557
많은 개발자들은 자신들이 개발하는 프로그램 소스의 버전을 유지하기 위해, 원소스 외에 패치파일을 준비한다. 일반적으로 패치파일은 diff를 사용해서 작성하고, 해당 패치파일을 적용할 때는 patch 명령어를 사용해 패치적용을 완료한다.
필자는 처음에 커널 공부를 할 때, 패치파일 사용으로 어려움을 겪은적이 있다. 실제 버전업된 커널 소스 파일 전체를 받는게 나은지, 아님, 하나의 커널 소스 파일을 받고, 패치 파일만 받는게 낳은지 잠시나마 고민했던 적도 있다.
따라서, diff 와 patch 파일은 커널에만 관련있는 내용은 아니나, 커널 패치와 유용히 사용될 수 있는 명령어이므로, 아래에서 살펴보고자 합니다.
기본 개념 및 사용법은 아래의 설명을 따라하기 식으로 해보면, 이해할 수 있을겁니다.

  • Diff 사용법

    1. 두개의 빈 파일을 생성합니다.
    [css@css ~]$ touch aaa bbb
    [css@css ~]$ ls
    aaa bbb


    2. aaa에 아래의 라인을 추가합니다. (vi 사용법은 애플리케이션 소개란을 참고하세요. ^^)

    [css@css ~]$ vi aaa

    This is first line // 라인을 추가합니다.



    3. aaa 를 bbb로 복사하고, 새로운 라인을 추가합니다.
    [css@css ~]$ cp aaa bbb
    [css@css ~]$ vi bbb
    This is a first line
    This is a second line // 라인 추가


    4. aaa와 bbb의 변경 부분을 패치파일로 만듭니다. 그리고, 변경되는 부분이 패치파일에 어떻게 저장되나 확인합니다.
    [css@css ~]$ diff -urN aaa bbb > mydiff.patch
    [css@css ~]# cat mydiff.patch
    --- aaa 2005-03-07 20:23:22.566188880 +0900
    +++ bbb 2005-03-07 20:23:32.986604736 +0900
    @@ -1 +1,2 @@
    this is a first line
    +this is a second line


    5. bbb를 지우고, 패치파일의 내용을 aaa에 적용시킵니다.
    [css@css ~]$ rm -f bbb
    [css@css ~]$ patch -p 0 < mydiff.patch
    patching file aaa


    6. aaa에 패치파일의 내용이 적용되었나 확인합니다.
    [css@css ~]$ cat aaa
    this is a first line
    this is a second line // 라인이 추가되었음


    위의 예제에서는 diff와 patch 명령어의 사용과 개념을 이해하기 위해 간략히 설명했지만,
    실제 소스의 크기가 상당한 경우, 원소스(aaa)를 가지고, 패치파일만 가지고 작업합니다.

    그럼, diff와 patch의 기본 개념 및 사용법을 이해했으니, 커널과 관련되어 알아보도록 하지요..


  • 커널 패치파일 만들기
    일반적으로 커널에 자신만의 변경 내용을 담고자 하고, 그 패치를 제공하고자 하면, 아래의 방법 대로 하시면 됩니다.

    1. 바닐라 커널 소스를 준비한다. (kernel.org 에서 다운로드

    2. 커널 소스의 복사본을 준비하고, 해당 소스에 변경을 가한다.
    [root@css kernels]# cp -a linux-2.6.9 linux-2.6.9-my
    Linux-2.6.9-1 디렉토리내 원하는 부분 소스 수정


    3. 소스 수정이 끝나면, 패치파일을 작성한다.
    [root@css kernels]# diff -urN linux-2.6.9 linux-2.6.9-my > mykernel.patch
    [root@css kernels]# gzip -9 mykernel.patch(보통 커널의 경우, 패치파일도 사이즈가 크므로, 압축을 합니다.)
    [root@css kernels]# ls
    linux-2.6.9 linux-2.6.9-my mykernel.patch

    gzip으로 압축하면, mykernel.patch는 mykernel.patch.gz으로 파일명이 변경됩니다.

    4. 원소스에 패치 적용을 한다.

    [root@css kernels]# pwd
    /usr/src/
    [root@css kernels]# ls
    linux-2.6.9 linux-2.6.9-my mykernel.patch
    [root@css kernels]# patch ?p 0 < mykernel.patch (패치 파일이 압축되지 않은 경우)
    [root@css kernels]# gzip ?cd mykernel.patch.gz| patch ?p0 (패치 파일이 압축된 경우. 압축을 풀고 패치 적용)


    커널과 관련해, diff/patch 명령어를 알아보았습니다. 위의 명령어 설명은 기본적인 내용만 다루었습니다.

    실제 리눅스에서 자주 언급되는 커널이 어떠한 것이 있는지, 자세한 명령어 활용은 어떻게 되는지는 다음에 다시 글을 올리겠습니다.

  • 2006/09/08 14:10 2006/09/08 14:10
    이 글에는 트랙백을 보낼 수 없습니다
    Linux  2006/09/08 14:09
    출처 카페 > DBexpert(Unix와D.. / tingsnut
    원본 http://cafe.naver.com/dbexpert/37
    리눅스를 사용하면서 내가 깜박 깜박 잊어버리는 자잘한 팁을 모았음. 검색이 어려우면 키워드로 검색할 것.


    내용


    GUI
    DESKTOP X Window선택
    X Window에서 해상도 조절
    X window 해상도를 설정하려면
    ami실행 후 메뉴가 깨져 있을 때
    ami실행 후 한영키를 사용하고 싶은 경우
    휠마우스에서 휠이 작동을 안할 때
    원격에서 리모트서버의 X application실행시
    폰트서버 설정
    KDE 3.x 버전에서 윈도우용 트루타입 폰트를 못 찾는 경우
    한텀(hanterm) 타이틀바에 디렉토리 경로 보이게 하기
    Pacakge 관리
    RPM 관련 커맨드
    rpm package설치시 상호의존성이 얽혀있을 땐 한 command로 설치
    필요없는 rpm지우기
    레드헷 8.0에서 up2date 사용하기
    Network
    Network 설정 파일들
    급하게 Network설정을 해야할 경우
    하나의 랜카드에 여러개의 ip추가하기
    열린 포트를 사용하는 프로세서를 확인하려면
    ping 무시하기
    TCP/IP속도 증가시키기
    VI
    vi 에디터 내에서 ^M을 입력하려면
    vi 에데터 내에서 ^M을 없애려면
    vi에서 라인끝 빈칸 지우기
    vi에서 벨소리 제거
    vi에디터에서 삭제/복사 간편하게
    vi에디터에서 어떤 문자열을 찾고자 할 때 대소문자 안가리게 하려면
    vi에디터에서 '숫자'만큼의 컬럼으로 이동
    vi에서 화면 나누기
    파일 네비게이션
    vi내에서 파일 네비게이션 바 만들기
    여러개의 파일 편집하기
    vi로 파일비교
    잠시 쉘로 나가기
    vi에서 자동들여쓰기를 안하려면
    vim 의 syntax 기능에서 underline 없애기
    윈도우에서 작성한 한글이 페도라2(Fedora Core2) 에서 깨져보일 때
    즐겨쓰는 option들
    more로 파일보다가 vi로 넘어가기
    vi를 hex editor로
    System 관리
    Swap공간을 알려주는 명령어 (process check)
    현재 디렉토리가 차지하는 용량 보기
    run-level을 변경하려면
    CPU정보를 알고 싶다면
    MEM정보
    특정 데몬이 띄워져 있는지 확인하려면
    현재 구동중인 데몬을 트리형식으로 보려면
    시스템 부하상태 보기
    shell을 vi 스타일로
    최신 커널버전 알기
    prompt에 full path 표시를 하고싶다면
    log파일에서 내용만 지우기
    현재 연결되어 있는 TCP port보기
    LILO에서 싱글부팅
    grub에서 싱글부팅
    하위 디렉토리까지 문자열 검색하려면
    world writable file 찾기
    ext2에서 ext3로 업그레이드 하기
    logon기록을 보려면
    remote환경에 있는 윈도우 폴더 마운트하기
    터미널에서 디렉토리, 파일 색상 변경
    서브 디렉토리까지 한번에 생성
    alias 적용안하기
    이동한 바로 직전의 디렉토리로
    일정기간 동안 접근하지 않는 파일 삭제하기
    setuid가 설정된 루트쉘 검색
    MySQL Connection Failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111) 에러가 나는 경우
    특정 유저만 su 허락하기
    작업중 로그인 막기
    크기가 가장 큰 파일, 디렉토리 찾기
    현재 디렉토리의 크기만을 파악할때
    시스템 정보 감추기
    메모리를 가장 많이 잡아먹는 프로세스 알아내기
    FTP로 들어온 사용자 확인하기
    원하지 않는 사용자 죽이기
    몇일 이상된 파일만 mv또는 cp
    터미널에서 백스페이스를 누르면 ^H 와 같은 이상한 문자가 출력되는 현상
    텔넷이나 ftp 외부 사용시 root로 접속 가능하게 하는 방법
    여러 파일 안에 있는 내용중 특정단어를 바꾸고 싶을 때
    윈도우 디렉토리 마운트후 한글 디렉토리가 깨져보일 때
    tail 명령어 활용
    shell prompt 변경하기
    kernel 파라미터 조정하기
    사용자별 du -h 값 보기
    하룻동안 만들어진 파일 검색하기
    apache 설정 파일 문법 오류 검색
    레드햇 패키지 버전을 알고 싶을 때
    새로운 배포본 설치를 위한 Multi LILO
    Rebooting 키 제한을 위한 설정
    하드디스크 I/O 튜닝
    Core 파일 디버깅
    CPU부하와 메모리 사용 정보
    Fedora Core2에서 한글 인코딩 바꾸기
    Fedora2에서 한글man page 깨지는 현상에 대한 해결책



    1 GUI1.1 DESKTOP X Window선택  #vi /etc/sysconfig/desktop
       
        DESKTOP = "GNOME" or "KDE"

    1.2 X Window에서 해상도 조절CTRL + ALT + "+"(Num Lock key)
    CTRL + ALT + "-"




    1.3 X window 해상도를 설정하려면  /etc/X11/XF86Config-4  (symbolic link되어 있음)
     Screen section의 MODE
      "800*600" "1024*768" "1152*864"


    1.4 ami실행 후 메뉴가 깨져 있을 때#export 해서 LANG 와 XMODIFIERS 변수를 확인하라.


    1.5 ami실행 후 한영키를 사용하고 싶은 경우xev를 실행해서 한영키의 키코드를 알아낸다. 예를 들어 한영키가 122, 한자키가 121이면 /etc/X11/Xmodmap 파일에 다음을 추가시킨다.

    ! i386 and alpha  
    keycode 22 = BackSpace  
    keycode 107 = Delete  
    keycode 121 = Hangul_Hanja  
    keycode 122 = Hangul  

    X를 재실행하거나 재실행시키고 싶지 않다면
    #xmodmap /etc/X11/Xmodmap 을 실행


    1.6 휠마우스에서 휠이 작동을 안할 때휠기능을 작동시키려면  /etc/X11/XF86Config-4  를 수정한다.

    Section "InputDevice"
           Identifier  "Mouse0"
           Driver      "mouse"
           Option      "Protocol" "PS/2"
           Option      "Device" "/dev/psaux"
           Option      "ZAxisMapping" "4 5"
           Option      "Emulate3Buttons" "yes"
    EndSection  

    바로 이 부분
    Option   "Protocol" "PS/2"  을
    Option   "Protocol" "IMPS/2"  로 고치면 휠을 사용할 수 있다. 만약 다음 부분
    Option      "ZAxisMapping" "4 5"  이 없다면 추가시킨다.
    그리고 X window를 재시작하는 것을 잊지 않도록 한다.


    1.7 원격에서 리모트서버의 X application실행시서버측: xhost +클라이언트ip (xhost + 는 모든 주소에 대해 원격접속 허용)
    클라이언트측: export DISPLAY=서버ip:0.0


    1.8 폰트서버 설정클라이언트측에서 Xmanager를 이용해 리눅스 서버에 접근하려면 서버에 폰트서버가 실행되고 있어야 한다. 폰트서버는 xfs데몬을 말하는 것으로 그냥 띄우면 되고 단지 /etc/X11/XF86Config에서

    FontPath "/usr/X11R6/lib/X11/fonts/TrueType"
    # FontPath "unix/:-1"

    FontPath "unix/:7100" 로 주석부분을 고쳐주면 된다. 그럼 7100포트가 열린다. 그리고 그서버와 포트를 지정하면 폰트서버가 타 x서버에서 사용가능하다.


    1.9 KDE 3.x 버전에서 윈도우용 트루타입 폰트를 못 찾는 경우from KLTP
    최근에 나온 레드햇8을 쓰고 있는데요 윈도우용 폰트를 가져다 쓰고 있습니다. 그런데 KDE에서 새로 추가한 윈도우용 트루타입폰트를 찾지 못하는 문제가 있더군요. xfontsel에서도 인식하고 셋팅역시 제대로 되어서 GTK나 Motif로 만들어진 다른 어플리케이션에서는 모두 인식하나 KDE에서는 백묵 글꼴만 나오고 윈도 폰트는 아예글꼴 리스트에 나오지도 않더군요. 해결책이 딴데 있더군요.

    KDE가 QT 라이브러리로 만들어진 것이라 "혹시 QT셋팅에 문제가 있는것은 아닐까" 라는 생각을 하고 Qt config를 살펴봤습니다. QT Config에 Anti aliase font지원을 꺼 봤더니 제대로 동작하더군요. 아마도 QT내지는 XFS 자체의 버그인 것 같습니다. 간단히 말씀드리자면 qtconfig3를 실행시켜 Font탭에서 Enable Anti-Aliased Font Support를 꺼 주시고 X를 재시작 하시면 윈도우용 굴림 폰트를 KDE에서 이용하실 수 있습니다. --Kid A



    1.10 한텀(hanterm) 타이틀바에 디렉토리 경로 보이게 하기자신의 .bash_profile에 다음을 추가하면 한텀의 타이틀바에 <사용자ID>@<호스트명>:<디렉토리명>의 형식으로 나타나게 된다.

    function proml
    {
      case $TERM in
        xterm*)
        local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
                 ;;
                 *)
                 local TITLEBAR=''
                 ;;
        esac
        PS1="${TITLEBAR}\n] \u@\h ]"
    }
    proml


    2 Pacakge 관리2.1 RPM 관련 커맨드#rpm -qa : 현재 설치된 package출력
    #rpm -qil mtools | less : mtools에 관한 package정보
    #rpm -qif /etc/bashrc : /etc/bashrc파일이 속한 package




    2.2 rpm package설치시 상호의존성이 얽혀있을 땐 한 command로 설치  #rpm -Uvh [package1] [package2] [packag3] .......

    의존성을 무시하고자 할 땐 --nodeps option사용




    2.3 필요없는 rpm지우기만약 MySQL을 설치 하였다고 하자.


    MySQL-3.23.33-1.i386.rpm* MySQL-devel-3.23.33-1.i386.rpm*
    MySQL-client-3.23.33-1.i386.rpm* MySQL-shared-3.23.33-1.i386.rpm*


    그리고 이것을 지우려면 ?


    rpm -e `rpm -qa | grep MySQL`  

    또한 대소문자를 구분하지 못한다면?


    rpm -e `rpm -qa | grep -i mysql`  

    이라고 써도 된다.

    이때 ` 기호는 숫자 1번 왼쪽에 있는 백쿼터이다.


    패키지명과 버젼이 동일한 패키지가 여러개 존재할때 삭제하는 방법


    rpm -e 패키지명 --allmatches

    2.4 레드헷 8.0에서 up2date 사용하기from KLTP
    레드헷 8.0 설치하고 up2date을 사용하려 하니 황당한 에러가 나와서 해결하고 나서 올립니다.
    레드헷 8.0 에서는 설치후에 [일반관리자용] setup 에서 서비스 보시면, rhnsd 가 있는데 이거 활성화 시켜 주시고요..(그냥 참조용임) 바로 up2date --register 하시면 접속해서 등록해서 바로 사용할 수 있습니다.

    /etc/rc.d/init.d/rhnsd restart 하시면 됩니다.


    이후 up2date * 하시면 됩니다. 그런데, 이런 에러가 나오시는분....


    There was an SSL error: [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]  

    이게 SSL 에러냐.. 절대 아닙니당.. 저도 처음에 그런줄알고 패키지 문제 인줄 알고 의존성 찾아보고, 삽질했습니당.결국에 알아낸것은 시간이 일치 하지 않는 다는 결론을... 이건 구글에서 검색했는데, 누군가 시간차를 적어 놓았더군요... 혹시 해서...

    rdate -s time.kriss.re.kr  

    해서 다시, up2date --register 해보니... 헐 아주 잘 되네염... --박성훈


    time.kriss.re.kr은 사용하지 마세요. 제가 예전에 서버들 간의 시간동기화를 하기위해서 time.kriss.re.kr 사용했다가 아주 크게 쓴맛을 보았습니다. 표준연의 타임서버가 갑자기 죽고나서 정확한 시간으로 셋팅되는 것이 아니고 OS상에서 존재하는 가장 처음의 시간, 기억은 1960년대의 시간으로 셋팅 되는 바람에 중요한 데이터들간의 시간동기화에 문제가 생겨서 데이터를 몽땅 버린 적이 있습니다. 제가 추천하는 time 서버는 ntp를 사용하는 것입니다. time.datum.com, kr.public.ntp.get-time.net unix 계열의 OS에서는 ntp 관련 S/W를 설치하시면 됩니다. 그러면 이만... --익명



    이번에 레드헷 9.0을 설치하고 업데이트 하려고 하니 위으 에러메세지가 나오더군요! 그래서 시간을 동기화 했는데도 마찬가지 입니다. 그래서 레드헷 사이트에 가니 관련 RPM패키지를 받아 재설치 하라고 하네요 레드헷 사이트에 가서 새로운 up2date 관련 RPM을 받아 새로 설치 하시기 바랍니다. --호종기




    3 Network3.1 Network 설정 파일들  /etc/hosts                                : localhost 및 server name
     /etc/resolv.conf                          : name server
     /etc/sysconfig/network                    : HOSTNAME
     /etc/sysconfig/network-scripts/ifcfg-eth0 : IP, Netmask, Gateway등등

    설정이 끝났다면
    #/etc/rc.d/init.d/network restart  또는
    #service network retart  3.2 급하게 Network설정을 해야할 경우#ifconfig eth0 <ip_addr> netmask <netmask> up
    #route add default gw <gw>
    #cat > /etc/resolv.conf
    nameserver <DNS_addr>
    CTRL-D

    #ping dongwoo.org


    3.3 하나의 랜카드에 여러개의 ip추가하기from KLTP
    ◎아이피추가는
    1) ifconfig eth0:0 아이피 netmask 아이피 broadcast 아이피 up
    2) cd /etc/sysconfig/network-scripts
    3) /etc/sysconfig/network-scripts/에 있는 ifcfg-eth0을 복사, 파일명을 ifcfg-eth0:0
    4) vi로 열어 Device=eth0:0, ipaddr=원하는 아이피 주소
    5) ./ifup eth0:0
    6) /etc/rc.d/init.d/network restart

    계속 추가시에는 eth0:1, eth0:2....등등으로 한다. 재부팅해보고 ifconfig를 해봐서 추가되었는지 확인한다.


    ◎아이피 삭제는
    1) ifconfig eth0:0 아이피 netmask 아이피 broadcast 아이피 down
    2) cd /etc/sysconfig/network-scripts
    3) rm ifcfg-eth0:0
    4) /etc/rc.d/init.d/network restart


    재부팅해보고 ifconfig해봐서 삭제되었는지 확인한다. 참고로 레드햇 8.0에서 셋팅함



    3.4 열린 포트를 사용하는 프로세서를 확인하려면if #3306 port is opened

     #fuser -n tcp 3306    -> show PID
     #ps -ef | grep [PID]

    3.5 ping 무시하기echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all


    3.6 TCP/IP속도 증가시키기TCP/IP의 속도를 실제로 증가 시키는 것은 아니구요. 디폴트 값을 낮게 해서, 좀 더 많은 연결이 동시에 제어될 수 있도록 하는 방법이랍니다. 리눅스 박스가 연결을 닫는데 드는 시간을 줄여주고, 불안정한 열결을 끊기전에 시간을 줄여 줍니다. 또한 필요없는 IP 확장을 꺼 놓음으로서 체감 속도를 훨씬 빠르게 해 줄 것입니다.

    echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout  
    echo 1800 >/proc/sys/net/ipv4/tcp_keepalive_time  
    echo 0 > tcp_window_scaling  
    echo 0 > tcp_sack  
    echo 0 > tcp_timestamps  


    4 VI4.1 vi 에디터 내에서 ^M을 입력하려면  CTRL + V --> CTRL + M
                  ^T ^] 은 각각 CTRL + T  CTRL + ]

    4.2 vi 에데터 내에서 ^M을 없애려면   :0,%s/^M//g  (^M : CTRL-v, CTRL-m)

    4.3 vi에서 라인끝 빈칸 지우기   :g/^$/d

    4.4 vi에서 벨소리 제거:set vb


    4.5 vi에디터에서 삭제/복사 간편하게  :10, 20d
      10번째줄에 가서 ma 누르고 20번째줄에 가서 d'a (삭제)  y'a (복사)  

     :'a,.co.
       'a부터 .까지 .밑에 copy

    4.6 vi에디터에서 어떤 문자열을 찾고자 할 때 대소문자 안가리게 하려면:set ic


    4.7 vi에디터에서 '숫자'만큼의 컬럼으로 이동숫자|


    4.8 vi에서 화면 나누기   :split [file]  <-- 수평
      :vs [file]     <-- 수직
     
     화면간 이동을 하려면 CTRL + w , ijkl


    4.9 파일 네비게이션#vi ./ <--- 현재 디렉토리 내용을 네비게이션


    4.10 vi내에서 파일 네비게이션 바 만들기:20vs ./
    열기를 원하는 파일에 가서 shitf + o



    4.11 여러개의 파일 편집하기   #vi file1 file2 file3 .....

     :n      <---- 뒤의 파일 편집으로
     :e#     <---- 앞의 파일 편집으로


    4.12 vi로 파일비교 #vi -d file1 file2  

    4.13 잠시 쉘로 나가기CTRL + z

    다시 vi로
    #fg



    4.14 vi에서 자동들여쓰기를 안하려면:se(t) nocindent
    :se(t) nosmartindent (nosi)
    "se(t) noautoindent (noai)


    4.15 vim 의 syntax 기능에서 underline 없애기리눅스에서 터미널을 열어서 vi 작업을 한다면 syntax 기능을 사용하는데 별다른 어려움이 없을것이다. 하지만 telnet 으로 접속해서 사용하는 경우에 color 를 표시할 수가 없는 경우엔 해당 syntax 가 보통 underline 으로 표시된다. 그런데 이 underline 때문에 소스코드를 보기가 힘들경우가 있다.

    이 글에서 다룰 내용은 다음과 같다. highlight 기능 과 colorscheme 사용.


    vi 를 연 상태에서


    :sy[tax] on  

    을 켠다. 여기서 [] 안의 내용은 옵션이다. 안써도 된다. 그리고 다음과 같이 하면 현재 사용하는 highlight 목록을 살펴 볼수 있다.

    :hi[ghlight]  

    이 색깔에 대한 정의는 다음에 정의 되어 있다.

    :!echo $VIMRUNTIME/colors  

    위 디렉토리 아래에 가보면 morning.vim, evening.vim 등의 파일들이 보이는데 각각 color scheme 를 정의해 놓은 파일들이다. 다른 color scheme 로 바꾸고 싶다면 다음과 같이 한다.

    :colorscheme evening  

    여기서 evening 는 scheme 이름이다.
    그럼 이제 underline 을 없애도록 하겠다. 현재 telnet 접속하여 vim 을 사용하고 있다는 가정하에 하는 것이다. 콘솔에서 사용하는 사람은 대개 underline 이 나오지 않을것이다.

    :hi  

    위와 같이 하면 다음과 같이 출력이 된다.

    Type term=underline ctermfg=2  
    Constant term=underline ctermfg=4 guifg=Magenta  

    여기서 Type 이라고 쓰여진 첫 필드는 group-name 이다. 만약 당신이 C 코드를 열고 있다면 Type 은 말그대로 char, int, float... 등과 같은 Type 이다. term 은 color 를 표시할 수 없는 터미널이다. term 에선 underline 으로 표시하겠다는 뜻이다. ctermfg 는 color terminal 이다. fg 는 foreground 이다. 번호는 색깔을 나타낸다. 즉, color 를 표시할 수 있는 터미널에선 2번 컬러로 Type 을 표시한다. 색깔은 숫자가 아니라 직접 명시를 할 수도 있다. ctermfg=blue 이런식이다. 그럼 상수를 표시할때 term 에선 bold 로 표시하도록 해보자.

    :hi Constant term=bold ctermfg=4  

    아무런 설정도 하고 싶지 않다면 bold 대신에 NONE 라고 사용하면 된다.

    위와 같은 설정들은 ~/.vimrc 에 저장하여 사용할 수도 있다.


    shell> cat -n ~/.vimrc  

    1 set ic  
    2 set nu  
    3 set softtabstop=4  
    4 set shiftwidth=4  
    5 set formatoptions=croql  
    6 set ruler  
    7 set showmode  
    8 set smartindent  
    9 syntax on  
    10 filetype indent on  
    11 map <F2> :w<cr>:!gcc -Wall % -o %< && ./%<<cr>  
    12 map <F3> :<CR>:!./%<<CR>  
    13 map <F4> :so $VIMRUNTIME/syntax/2html.vim<CR>  
    14  
    15 colorscheme pablo  
    16 hi Type term=NONE ctermfg=2  
    17 hi PreProc term=NONE ctermfg=10  
    18 hi LineNr term=NONE ctermfg=6  
    19 hi Constant term=NONE ctermfg=14  

    15번째 라인부터가 highlight 설정이다. 1번째 라인부터 10번째 라인은 기본적인 설정들에 대한 내용이다. 11번째에서 13번째 라인은 mapping 기능으로 <F2> 를 누르면 C 코드를 컴파일 한후 실행하고 <F3> 를 누르면 컴파일된 바이너리를 실행만 한다. <F4> 를 누르면 현재 파일을 HTML 파일로 변환하여 준다. --linox


    4.16 윈도우에서 작성한 한글이 페도라2(Fedora Core2) 에서 깨져보일 때윈도우에서 작성한 문서를 페도라2에서 열어보면 한글이 다 깨져보이는 수가 있다. 이는 encoding 차이때문인데 윈도우에서 저장한 파일은 기본적으로 euckr로 인코딩된다. Fedora Core2는 utf-8방식을 사용하기 때문에 파일을 컨버전해야 한다. 방법은 2가지다

    1. 파일을 utf-8로 인코딩함


    $iconv -f euckr -t utf-8 a.euckr.txt > a.utf-8.txt

    2. 에디터 프로그램의 보기에서 encoding을 euckr로 바꿔준다. (vi는 지원함)



    4.17 즐겨쓰는 option들set fileencodings=euc-kr
    set encoding=cp949
    set nowrap
    set listchars=extends:>,precedes:<
    set shiftwidth=4
    set tabstop=4
    set visualbell t_vb=
    set autoindent
    set tag=$HOME/tags,$HOME/server/tags
    set fdm=marker
    set vb

    그외 팁으로, dos에서는 줄바뀜이 \r\n
    unix에서는 \n
    mac에서는 \r
    그런데 vi에서 텍스트 파일을 유닉스 스타일로 변환해서 저장할 수 있다.


    :set ff=unix  
    :w  

    해주면 dos형태의 파일을 unix로 변환된다. unix, dos, mac을 넣을 수가 있다. vim만의 기능이며 nvi, vi는 안된다.


    4.18 more로 파일보다가 vi로 넘어가기보통 more로 파일을 보는경우가 많다. 그런데 수정을 하려고 하면 more를 종료하고나서 다시 vi로 들어 그러나 more로 파일을 보다가 키보드에서 v를 입력하면 바로 vi로 전환된다. 다시 빠저나오면 다시 more로 전환된다.


    4.19 vi를 hex editor로vi는 텍스트 편집기뿐 아니라 hex editor의 기능도 가지고 있다.
    다음과 같은 커맨드로 hex editor로 변경할 수 있다.

    :%!xxd

    다시 원래 텍스트 편집 기능으로 돌아가려면,

    :%!xxd -r  


    5 System 관리5.1 Swap공간을 알려주는 명령어 (process check)#top




    5.2 현재 디렉토리가 차지하는 용량 보기# du -s -h



    5.3 run-level을 변경하려면#telinit 5



    5.4 CPU정보를 알고 싶다면#arch



    5.5 MEM정보#free



    5.6 특정 데몬이 띄워져 있는지 확인하려면#ps aux | grep httpd



    5.7 현재 구동중인 데몬을 트리형식으로 보려면#pstree



    5.8 시스템 부하상태 보기#uptime



    5.9 shell을 vi 스타일로#set -o vi



    5.10 최신 커널버전 알기#finger @finger.kernel.org
    #finger @kernel.org




    5.11 prompt에 full path 표시를 하고싶다면  #vi /etc/bashrc

     PS1 = [ ..... ]
     \U  : User
     \h  : Host
     \W  : 사용자가 위치하는 경로의 최 하위디렉토리
    여기서 \W -> \w

    5.12 log파일에서 내용만 지우기#>log_file




    5.13 현재 연결되어 있는 TCP port보기#netstat -t (-nlt : 열려있는 포트확인)




    5.14 LILO에서 싱글부팅#vmlinuz root=/dev/hda9 single : /dev/hda9에 리눅스로 single booting




    5.15 grub에서 싱글부팅- grub메뉴에서 e를 누릅니다. (edit)
    - edit 화면에서 화살표키로 "kernel /boot/vmlinuz-xxxx" 로 옴깁니다.
    - 다시 e키를 누르면 명령어 줄이 나옵니다. 끝에 한칸띄우고 single이라 고 적고
    enter를 누릅니다.
    kernel /boot/vmlinuz-2.2.17-5mz /dev/hdax single [enter]
    - 하시고, b를 눌러서 booting을 합니다.

    5.16 하위 디렉토리까지 문자열 검색하려면  grep -rl [문자열] *

    r 옵션이 없다면



     find . * -exec grep -n [문자열] {}\; -print

    더 짧고도 효과적인 방법


    grep "string"'find . -type '

    그런데 이는 조건에 맞는 파일의 개수가 많아지면 쉘의 명령행 버퍼의 범위를 벗어나므로 문제가될 소지가 있다. 명령행 버퍼의 오버플로우를 방지하기 위해선 다음과 같이 하면 된다.

    find . -type f | xargs grep "string"

    그런데 이 방법은 파일 이름에 공백이 들어갈 경우 문제가 생길 수 있다. 그럼 다음과 같이 해보자.

    find . -type f -print0 | xargs -0 grep "string"

    find는 심볼릭 링크된 디렉토리에 대해서는 기본적으로 검색을 실시하지 않으니 -follow옵션을 사용해야할 경우도 있다는 것을 알아둔다.


    명령행 버퍼오버플로우를 방지하는 방법은 다음과 같은 방법도 있다.


     find . -type f -exec grep -l"string" {}\;
     
    grep에서 '-l'옵션은 string을 포함하는 파일명을 나타내준다. 이런 검색을 특정 파일들에 대해서 행하기 위해서는 -type와 -name옵션을 쓸 수 있다.

     find . \(-type f -name "*\.html"\) -exec grep -l "string" {}\;
     
    이것은 html의 확장자를 가지는 모든 파일에 대해서 "string"을 포함하는지 알아보고 포함하고 있는 파일명을 출력해준다.


    위의 방법들은 "어떻게 서브디렉토리에 있는 파일들에 대해서 grep을 실행해줄 수 있는가?"하는 문제에 관한 여러 가지 방법들은 매우 유용하긴 하지만 검색을 실시하는 디렉토리에 바이너리 파일이 있을 경우에는 터미널을 제어하지 못하는 문제가 생길 수 있다. 왜냐하면 바이너리 파일의 몇몇 제어 문자들(Control Characters)이 터미널을 그래픽 모드로 바꿔놓을 수 있기 때문이다. 물론 이렇게 되었을 경우 터미널을 다시 바로잡는 방법이 있긴 하지만 아무래도 가장 좋은 방법은 그러한 일이 없도록 처음부터 방지하는 것이 가장 좋을 것이다.
    이제 화면에 찍혀나올 수 없는 문자들을 모두 없애보자. 어쨌든 읽을 수는 없지만 다음과 같은 명령을 내려보라.


    sed -e 's/[^-~][^-~]*//g'

    이 명령은 화면에 출력될 수 없는 (제어) 문자들을 그냥 스페이스들로 바꿔 버린다. 이 명령은 파이프를 이용하여 쉽게 다른 명령어들과 결합해서 사용할 수 있다. 여기 간단한 쉘 스크립트가 있다. 이것을 grepfind라고 이름붙여서 사용할 수 있다.

    #!/bin/sh
    #save this in a file called grepfind and do a "chmod 755 grepfind"
    #
    if test $@ = 0 -o "$1" = "-h" -o "$1" = "-help" ; then
    echo 'grepfind  ─ recursively descends directories and egrep all files '
    echo  
    echo 'Usage: grepfind [-help][-h](start_directory] egrep_search_pattern'
    echo
    echo 'The surrent directory is used as start_directory if parameter'
    echo 'start_directory is omitted. The search is case insensitive.'
    echo 'Multiple occurrences of control characters are replaced by a single'
    echo 'space. This makes it possible to grep around in files that contain'
    echo 'binary data and strings without setting the terminal accidently'
    echo 'to graphics mode.'
    echo
    echo 'Example : grepfind/home "hello world"
    else
    if ["$2" = "" ];then
    find . -type f -exec egrep -i "$1" /dev/null {} \;|sed -e 's/[^-~][^-~]*//g'
    else
    if [-d "$1" ] ;then
     find $1 -type f -exec egrep -i "$2" /dev/null {} \;|sed -e 's/[^-~][^-~]*//g'
    else
     echo "ERROR: $1 is not a directory"
    fi
    fi
    fi
    #_END_OF_grepfind


    5.17 world writable file 찾기  #find / -type f -perm -2 -exec ls -lg {} \;

    world writable directory 찾기



     #find / -type d -perm -2 -exec ls -ldg {} \;

    5.18 ext2에서 ext3로 업그레이드 하기  #mke2fs   -j /dev/hda[X] (X: disk number)
     #tune2fs     "
     
     ext3에서 ext2로 다운그레이드 하기
     #debugfs
     #open -f -w /dev/hda[X]
      features
      features -has_journal -needs_recovery
      quit


    5.19 logon기록을 보려면#last




    5.20 remote환경에 있는 윈도우 폴더 마운트하기/etc/fstab 에 물론 마운트 정보 입력



     //win_pc/win_folder /linux/mount/point smbfs user,noauto,username=Winuser_name 0 0

    5.21 터미널에서 디렉토리, 파일 색상 변경/etc/DIR_COLORS

    if you use xterm,
    /etc/DIR_COLORS.xterm



    5.22 서브 디렉토리까지 한번에 생성mkdir -p sub/sub1/sub2/ ....




    5.23 alias 적용안하기  #\rm file1
     쉘을 빠져나가기까지 alias를 적용 안하려면
     #unalias rm

    5.24 이동한 바로 직전의 디렉토리로#cd -




    5.25 일정기간 동안 접근하지 않는 파일 삭제하기$find /var/spool/mail -atime +5 -exec rm {} \;  
          <--- /var/spool/mail 아래 있는 디렉토리에서 5일동안 접근하지 않는 파일(-atime +5)은  
               삭제하라는 명령어

    혹은 3일 이전의 파일을 지우고자 한다면

    $find /tmp/log/ -mtime +7 -exec rm -rf {} \;  


    5.26 setuid가 설정된 루트쉘 검색  #find . -user root -perm 4755 -print  
       그렇게 되면 4755 퍼미션이 아니면 문제가 생길 것이다. 이런 경우에는 다음과 같이 명령을 내린다.  

     #ls -alR / |grep rws  
     #ls -alR / | grep r-s  
     #ls -alR / |grep -- --s  
       이렇게 하면 루트 쉘을 찾아낼 수 있다.  

    5.27 MySQL Connection Failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111) 에러가 나는 경우MySQL 데몬 프로세스가 돌아가지 않는 것이며 최신 버전은 ./safe_mysqld -u & 해서 실행해야한다.

    그럼에도 불구하고 sql 데몬이 실행이 안되고 /var/log/mysql.log에 다음과 같은 메시지가 표출될 경우가 있다.


    040720 15:57:28  /usr/libexec/mysqld: Table 'mysql.host' doesn't exist
    040720 15:57:28  mysqld ended

    이것은 DB를 설치하고 data base를 생성하지 않았기 때문이다. 다음의 커맨드로 DB를 생성시키도록 한다.

     $mysql_install_db

    mysql이라는 DB를 생성하고 그 안에 user와 host 정보를 가지게 된다. 그럼에도 에러가 나타난다면 퍼미션 문제일 가능성이 크다. /var/lib/mysql안의 내용을 mysql 소유자로 권한을 변경시켜서 데몬을 구동시켜 본다.

    $chown -R mysql.mysql /var/lib/mysql



    5.28 특정 유저만 su 허락하기. 휠 그룹에 등록

    vi /etc/group ------------   wheel:x:10:root,wantedid  

    2. su 권한 제한


    chgrp wheel /bin/su
    chmoe 4770 /bin/su


    5.29 작업중 로그인 막기시스템을 공사중일 때, root 이외의 다른 사용자를 로그인 못하게 해야 할 때가 있죠?
    그럴 때는, /etc/nologin 이라는 파일을 만들어,
    공사중 또는 Under Construction이라는 공지를 넣으면 됩니다.


    5.30 크기가 가장 큰 파일, 디렉토리 찾기가장 큰 디렉토리를 찾으려면,

    du -S | sort -n

    가장 큰 파일을 찾으려면,


    ls -lR | sort +4n


    5.31 현재 디렉토리의 크기만을 파악할때[root@dev2 local]# du -c -h --max-depth=0 *
    6.4M apache
    35M bin
    43M dns
    1.7M doc
    42k etc
    1.0k games
    42k geektalkd
    1.1M gnuws
    1.1M include
    41k info
    19M jakarta-tomcat-3.2.3
    0 jre
    15M jre118_v3
    25M lib
    62k libexec
    1011k man
    1.3M mm.mysql.jdbc-1.2c
    937k sbin
    3.8M share
    1.8M shoutcast-1-8-3-linux-glibc6
    5.2M ssl
    159M total


    5.32 시스템 정보 감추기/etc/inetd.conf 파일을 열어서,

    telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h


    5.33 메모리를 가장 많이 잡아먹는 프로세스 알아내기ps -aux | sort +4n

    또는

    ps -aux | sort +5n


    5.34 FTP로 들어온 사용자 확인하기ftpwho
    ftpcount


    5.35 원하지 않는 사용자 죽이기[root@dream /root]# skill -KILL sunny

    위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다.
    그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠?
    그럴때는

    [root@dream /root]# skill -KILL -v pts/14

    이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.


    5.36 몇일 이상된 파일만 mv또는 cp#find ./ -mtime +10 | awk ' { print "mv "$1" ./babo" } ' | sh

    find의 -mtime +10은 수정된지 10일 이상인 것만 찾는다. 이것을 이용해 나온 파일들을 ./babo 디렉토리 아래로 move


    5.37 터미널에서 백스페이스를 누르면 ^H 와 같은 이상한 문자가 출력되는 현상이 문제는 터미널에서 백스페이스를 어떠한 방식으로 인식하느냐의 문제에서 발생한다. 일반적으로 백스페이스는 ^?와 ^H로 나타내어지는데 터미널에서 ^H만을 백스페이스로 간주한다면, 이와 같은 문제가 발생하게 됩니다. 보통 그 자리에서 CTRL + h를 백스페이스 대용으로 써도 되고 export TERM="vt100" 로 터미널을 설정해도 되고 stty erase ^H 로 키보드 입력값을 조정해도 된다.


    5.38 텔넷이나 ftp 외부 사용시 root로 접속 가능하게 하는 방법레드헷계열은 공통이다.

    telnet
    /etc/securetty
    이파일은 root가 로그인가능한 터미널(tty)장치들을 나열해 둔 것이다.
    tty1
    tty2
    tty3
    tty4
    tty5
    tty6
    tty7
    tty8


    이 장치명은 가상터미널을 의미하는 것으로 root로 이런 가상터미널을 통한 접속이 허용된다는 것을뜻한다. 그리고
    ttyp0
    ttyp1
    ttyp2
    ttyp3


    등은 pseudo 터미널을 통해서 root의 접속이 가능함을 뜻하므로 원격지에서 root로 접속을 막으려면 다음설정과 같이 이 pseudo터미널을 모두 주석처리하면 된다. 그리고, 이 /etc/securetty파일에 다음과 같은 것을 볼 수도 있을 것입니다.
    ttyS0
    ttyS1
    ttyS2
    ttyS3


    등은 시리얼라인 또는 모뎀을 통한 root의 접속을 허용한다는 것을 뜻한다.


    FTP
    나의 경우 ProFtp 를 사용하고 있는데 proftp 의 경우 루트접속을 가능케 하려면 /etc/proftpd/ftpusers 파일을 여어서 root 를 주석처리해주면 된다.


    SSH
    나는 텔넷은 사용하지 않고 ssh 을 열어두고있다. 텔넷보다는 보안상 좀더 안정적이라고할수있겠다. ssh 의 경우 7.1 버전까지는 기본적으로 root 접속이 가능하다. 하지만 7.3버전에서는 접속이 안되니 ssh 에서 루트 접속이 가능하게하려면 ssh 설정파일인 /etc/ssh/sshd_config 파일을 열어서 PermitRootLogin 부분을 yes 로 해주시면 된다.


    PermitRootLogin yes


    5.39 여러 파일 안에 있는 내용중 특정단어를 바꾸고 싶을 때1. $ sed -e 's/aaaa/bbbb/g' < a.php > b.php
    하면 b.php 로 바뀐 파일이 나온다네요

    2. find 와 perl 의 조합으로 가능합니다.
    find / -name 'aaa.php' -type f -exec perl -pi -e 's/aaa/bbb/g' {} \;

    3. 하위 디렉토리까지 찾아서 파일 내의 특정한 내용을 바꾸는 명령입니다.
    find . -name *.html | awk '{ print "cat "$1" | sed \"s/바꾸고싶은말/바뀔말/g\" >"$1 }' | sh

    저는 이런식으로 하고 있습니다..
    find . -name *.html -exec perl -pi -e 's/바뀌고/바뀔/g' {}\;  위에서 찾을때 '*.html' 식으로 해야할 수도 있다.



    5.40 윈도우 디렉토리 마운트후 한글 디렉토리가 깨져보일 때윈도우 디렉토리를 그냥 마운트하면 한글로 된 파일이나 디렉토리가 ??로 나타나게 된다. 이때 다음과 같이 마운트를 하면 한글 디렉토리가 제대로 보인다.

    #mount -t vfat -o iocharset=cp949 /dev/hd* /mnt/win


    Feodra Core2 이상에서는 한글 인코딩 방식이 UTF8 방식을 쓰므로 iochoarset=utf8 이라고 해줘야 한글 폴더가 제대로 보인다.




    5.41 tail 명령어 활용# tail

    man tail 로 자세한 사용법을 알 수 있다. 가장 많이 사용하는 옵션으로는 -f 가 있는데 기본적으로 끝에서 10 줄까지를 보여준다. tail 은 계속 크기가 변하는 파일을 모니터링 할때 유용한 명령어인데 보안적으로나 기타 여러가지에 있어서 아주 유용한 명령어이다. 실제 본인이 보안 프로젝트를 하면서 tail 은 상당히 강조를 했다.

    tail -f /var/log/messages

    messages 파일은 누가 뭐라고 해도 가장 중요한 log 파일이다. 실제 항상 실행시켜놓고 있는 명령어이다. 또한 몇몇 중요한 log 파일들이 있는데 secure, xferlog 등등이 있는데 /etc/syslog.conf 파일에서 모든 log 를 한 파일로 남기게 해서 하나의 파일만 모니터링을 하고 있으면 좋을 것이다.
    일단 sendmail 이 시작되지 않을 경우를 예를 들어 보자. 창을 두개을 열고 하나의 창에서 tail -f /var/log/maillog를 실행한다. 그리고 다른 창에서 sendmail 을 재시작 시켜보자. 그러면 tail -f 를 실행한 곳에서 maillog 에 기록되는 상황이 계속 출력이 될것이다. 이것을 이용하면 에러 대처에 많은 도움이 될수 있을 것이다.

    tail 명령어에서 두번째로 많이 쓰는 옵션은 -n 일 것이다.
    -n 옵션은 원하는 수 라인 만큼 값을 출력하는 것이다. -c 는 bytes 만큼.

    tail 의 반대 명령어는 head 이다. head 명령어는 앞에서 부터 보여주는 명령어이다.



    5.42 shell prompt 변경하기일단 prompt 는 PS1 이라는 환경 변수를 이용한다. 즉 root 권한이 있다면 /etc/bashrc나 /etc/profile 에서 PS1 변수가 지정이 되어 있는것을 수정하여 전체 유저의 prompt 를 수정할수 있다. 만약 개인 유저가 prompt 를 수정하고 싶다면 계정 홈의 .bashrc 의 제일 마지막 라인에 PS1="" 을 설정해 주면 된다. PS1 에 사용되는 예약어에 대해서는 아래를 참고 하도록 하면 된다.

     \t     현재 시간을 HH:MM:SS 형식으로 표시
     \d     날자를 "요일 월 일" 형식으로 표시 (예,  "Tue May 26")
     \n     개행문자
     \s     쉘의  이름, $0 의 베이스 이름 (마지막 슬래쉬 뒷 부분)
     \w     현재 작업 디렉토리
     \W     현재 작업 디렉토리의 베이스 이름
     \u     현재 사용자의 사용자명
     \h     호스트 이름
     \#     이 명령의 명령 번호
     \!     이 명령의 히스토리 번호
     \$     유효 UID가 0 이면 if the effective UID is 0, a #, 그렇지 않으면 $
     \nnn   팔진수 nnn에 해당하는 문자
     \\     백슬래쉬
     \[     비출력  문자의 시퀀스를 시작한다. 프롬프트에 터미널 제어 시퀀스를 넣을 때 사용한다.
     \]     비출력 문자의 시퀀스를 마친다.


    5.43 kernel 파라미터 조정하기보통 커널의 파라미터를 조정할때 proc 에서 echo 를 이용하여 redirect로 직접 쓰는 경우가 많았다. 이렇게 조정을 할 경우에는 또 rc.local 같은 파일에 따로 기입을 해 줘야 하는 불편함이 있었다. RedHat 6.2 이후 배포판에는 sysctl 이라는 package가 추가되어 이것들을 관리를 할수 있게 되었다. 일단 조정할수 있는 모든 parameter 들은

    $ sysctl -a

    명령으로 확인을 할수가 있다. 그리고 특정값을 수정하기 위해서는 /etc/sysctl.conf 에 해당 키(이건 sysctl -a 명령에서 리스트를 확인할수 있다)와 키값을 지정한 다음

    $ sysctl -p

    명령으로 바로 적용을 시킬수 있다. 물론 sysctl.conf 에 기입이 되면 부팅시 마다 자동으로 적용이 된다.
    만약 잠시만 바꾸어 보고 싶다면

    $ sysctl -w net.ipv4.icmp_echo_ignore_all=0

    과 같이 직접 값을 넣어 줄수도 있다. 이럴 경우에는 부팅이 되어 있는 순간만 적용이 된다. -p 옵션은 sysctl.conf 가 아닌 다른 파일을 설정 파일로 지정을 할수 있게 한다. 옵션값이 없으면 default 로 /etc/sysctl.conf 를 읽어 들이며 따로 path 를 지정하면 해당 path 에있는 파일을 읽어 들인다.


    5.44 사용자별 du -h 값 보기du 4.0p 이상

    du -h --max-depth=1 /home/ | less  


    5.45 하룻동안 만들어진 파일 검색하기find / -ctime -1  


    5.46 apache 설정 파일 문법 오류 검색httpd.conf를 설정한 후에 쉘에서

    bash# httpd -t

    명령을 실행해 보도록 한다. 그러면 apache가 자체적으로 httpd.conf에서 에러가 있는지 없는지를 살펴 보게 된다.


    5.47 레드햇 패키지 버전을 알고 싶을 때#cat /etc/redhat-release


    5.48 새로운 배포본 설치를 위한 Multi LILO리눅스를 오래 사용하다 보면 나름대로 입맛에 맞게 튜닝이 되어 있을 것이다. 이때 새로운 배포본이나 호기심을 자극하는 작업때문에 리눅스를 새로이 설치할 경우가 많다. 이럴 경우 중요 세팅 파일이나 작업 데이타 파일등을 백업을 해놓고 새롭게 리눅스를 설치할 텐데 간혹 다시 이전 상태로 복귀해야할 상황에 부딪히곤 한다. 이때 원래 이전 셋팅으로 되돌리기 위해선 상당히 번거로운 작업을 해야하는데 이때 Multi LILO를 이용하면 편리하다.

    먼저 최초 리눅스 설치시 하드디스크가 하나라면 5GB 정도 나누어 비워 둔다. 혹은 여분의 하드 디스크가 있으면 더 좋다.
    이후 최신 배포본이나 호기심을 자극하는 새로운 배포본이 나왔을 경우 설치를 한다. 물론 비워둔 5GB나 여분의 하드디스크에 설치를 하는데 이때 중요한 것은 LILO를 설치할 때 해당 파티션의 부트섹터에 설치를 해야한다는 것이다.
    예를 들어 하드 디스크가 하나일 경우 다음과 같이 파티션 테이블이 구성되어 있다고 하자.


    /dev/hda
    /dev/hda1 : MS 시스템
    /dev/hda2 : Linux 시스템
    /dev/hda2 : /home ...
    /dev/hda3 : 확장 파티션
    /dev/hda4 : 비워둔 5GB 영역
    /dev/hda5 : swap 파티션
    /dev/hda6 : MS 영역

    이중 /dev/hda4에 새 배포본을 설치하며 LILO 또한 /dev/hda4에 설치를 한다. 그리고 설치하는 새 배포본의 swap 영역을 기존이 리눅스에서 사용하는 영역인 /dev/hda5를 사용하면 된다. 만약 여분의 하드디시크인 /dev/hdb에 설치를 한다면, LILO 또한 /dev/hdb에 설치하면 된다 . 이때도 swap영역을 /dev/hda5 로 사용해도 된다.
    설치가 끝나면, 현재 쓰고 있는 기존의 리눅스에서 LILO에 다음과 같은 항목을 추가한다.

    other=/dev/hda4                # or other=/dev/hdb1
           label=newLinux         # <Ctrl + D>를 눌러 종료

    그리고 /sbin/lilo 명령으로 반영시키도록 한다.
    부팅을 하면 새로운 이미지(메뉴)가 생기는 것을 볼 수 있다.
    부가적으로 LILO상에서 이전 LILO로 전환하고 싶으면 새로 설치한 배포본으로 로긴한 후 다음과 같이 재갱신 후 다시 재부팅하여 새롭게 설치한 LILO로 와서 native 이미지를 지정하면 다시 원래의 LILO로 로딩할 수 있다.

    other=/dev/hda
           label=native        # <Ctrl + D>를 눌러 종료


    5.49 Rebooting 키 제한을 위한 설정리눅스에서는 일반 유저 권한일지라도 콘솔에서 <Ctrl + Alt + Del> (이하 CAD)를 누르면 재부팅이 가능하다. 이를 무시하게 하려면 /etc/inittab을 다음과 같이 열어서,

    [root@choco root]#vi +/CTRL-ALT_DELETE /etc/inittab

    # Trap CTRL-ALT-DELETE
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    여기서 두 번째 열을 주석 처리한다.

    #ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    이렇게 하면 어떤 유저도 CAD를 사용할 수 없게 된다.
    그러나 이렇게 하면 root도 CAD를 사용할 수 없기 때문에 선택적으로 CAD를 허용하게 하면 좋을 것이다.
    만약 root와 choco에게만 CAD를 사용할 수 있게 하려면 /etc/inittab의 CTRL-ALT-DELETE 항목을 다음과 같이 수정한다.

    ca::ctrlaltdel:/sbin/shutdown -a -t3 -r now

    그리고 CAD 신호 입력시 권한 비교 데이타 파일을 생성한다.

    [root@choco root]#cat > /etc/shutdown.allow
    root
    choco         # ctrl + D를 눌러 중료

    그리고 수퍼프로세스에게 /etc/inittab을 갱신시킨다.

    [root@choco root]#init q

    이후부터는 CAD 신호가 들어오면 init에 의해 shutdown은 실행되고 -a 옵션에 의해 먼저 /etc/shutdown.allow 파일이 있는지 확인을 하고 그 파일안에 있는 유저와 /var/run/utmp 파일을 바탕으로 가상 콘솔에 로그인한 유저를 비교한다. 그래서 일치하면 셧다운이 일어나고 그렇지 않으면 권한없음 메시지를 출력하게 된다.


    5.50 하드디스크 I/O 튜닝DMA 기능을 셋팅하는 것으로 하드 디스크의 액세스 속도를 확연하게 올릴 수 있다.
    먼저 메인보드의 칩셋이나 방식에 따라 커널 컴파일에 옵션을 추가해야 I/O 속도개선을 위해 커널 수준의 지원을 받을 수 있다.
    ATA/IDE/MFMRLL support -> IDE, ATA and ATAPI Block Devices 항목에서 다음의 네 옵션을 체크한다.

    [*] Generic PCI IDE Chipset supoort
    [*] Generic PCI bus-master DMA support
    [*] Use PCI DMA by default when available
    /* 이하 각자의 메인보드 칩셋에 맞게 설정 */
    [*] VIA82CXXX chipset support

    그리고 하드디스크의 정보출력/셋팅/성능측정등의 작업을 위한 유틸리티인 hdparm을 이용해서 I/O 셋팅을 한다. 플래그 옵션은 -c를 이용해서 I/O를 32비트로, -d 옵션을 써서 dma 기능을 활성화 시킨다.


    [root@choco root]#hdparm --help
    -c * get/set IDE 32-bit IO setting
    -d * get/set using_dma flag
        ....
    [root@choco root]#hdparm -c 1 /dev/hda
    [root@choco root]#hdparm -d 1 /dev/hda

    간혹 특정 스펙의 하드디스크가 DMA 기능을 제대로 지원하지 못할 경우 시스템이 잦은 크래쉬가 발생할 수 있다. 이렇게 불안한 증상을 보일 때는 다음과 같이 비활성화 시킨다.

    [root@choco root]#hdparm -c 0 /dev/hda
    [root@choco root]#hdparm -d 0 /dev/hda

    hdparm에서는 -t 옵션이 일반적인 하드디스크의 상태를 나타낸다. 이것보다 좀더 세부적인 벤치마킹을 가능케 하는 유틸이 liobento이다.

    [root@choco root]#liobento -d /dev/hda

    부팅시 자동으로 I/O 32비트, on_dma가 활성화시키려면 다음과 같이 한다.


    [root@choco root]#echo "hdparm -c 1 -d 1 1> /dev/null 2>&1" >> /etc/rc.d/rc.local

    최근에 출시되는 배포본에서는 기본적으로 DMA모드를 활성화시키지만 개인이 커널을 새롭게 업그레이드하거나 하드디스크의 성능을 제어하려면 알고 있어야 한다.



    5.51 Core 파일 디버깅Core파일은 어떤 프로그램이 갑자기 dump core로 종료될 때 만들어진다. Core는 하드디스크에 씌워진 메모리내의 프로그램 정보를 담고 있어 왜 프로그램이 죽었는지 조사할 수 있다.
    다음과 같이 -core 옵션으로 core가 발생한 프로르램의 path와 이유를 알 수 있다.

    $gdb -core core

    그리고 core를 야기시킨 함수를 조사하려면 다음과 같이 커맨드를 친다.

    $gdb path/to/program -core core


    5.52 CPU부하와 메모리 사용 정보일반적으로 프로세스와 시스템에 관한 수많은 정보들은 /proc 디렉토리에서 찾을 수 있다. top을 통해 볼 수 있는 평균부하량(load average)를 얻으려면 다음을 보며 된다.

    cat /proc/loadavg

    특정 프로세스에 의한 메모리 사용 정보는 /proc/stat에서 찾을 수 있다. 더 자세한 정보는 proc 메뉴얼을 확인하라

    man 5 proc


    5.53 Fedora Core2에서 한글 인코딩 바꾸기Feodra2를 깔고나면 기본적으로 인코딩이 utf-8로 설정되어 있다. 이 설정대로 쓰게되면 pstree나 ntsysv같은 쉘 기반의 화면들이 마구 깨져나온다. 한글 인코딩을 euck로 바꿔줘야 한다.
    # vi ~/.bashrc 에서 다음을 입력한다.

    export LC_ALL=ko_KR.eucKR  
    export LANG=ko_KR.eucKR  

    x윈도우의 터미널을 쓴다면 그놈터미널에서 euc_kr 로 설정하면 된다.


    5.54 Fedora2에서 한글man page 깨지는 현상에 대한 해결책#export LANG=ko_KR.eucKR              (i18n~~~ 파일에서 바꿔놓으면 더 좋다.)

    /etc/man.config에서

    : PAGER /usr/bin/less -is



    : PAGER /usr/bin/less -isr

    로 고친다.


    /etc/man.config 에서


    KNROFF LANG=ko_KR.eucKR /usr/bin/nroff -Tkorean -mandoc

    식으로 LANG 값을 앞에 넣어주면 깨지던 문제가 제대로 잘 나온다고 한다. man-1.5m2 에서는 위와같이 할 경우, 한글로 나오긴 하지만, man.config의 일부 내용이 출력되는 현상이 있다고..

    2006/09/08 14:09 2006/09/08 14:09
    이 글에는 트랙백을 보낼 수 없습니다
    Linux  2006/09/08 14:08
    출처 블로그 > nowdob님의 블로그
    원본 http://blog.naver.com/nowdob/80011052465

    Kernel Compile

    make menuconfig

    make dep clean bzImage modules modules_install

    How to set the $PATH variable in Redhat 9.0

    http://www.mediacollege.com/linux/red-hat/path-variable.html


    RPM

    [강제설치]

    rpm -Uvh --nodeps --force *rpm

    [삭제]

    rpm -e 지우고자하는 rpm파일명

    언어 설정 바꾸기 (Redhat 9.0)

    /etc/sysconfig/i18n파일 내용 변경

    [예제] // LANG 항목만 변경하면 됨

    -- 영어

       LANG="en_US.UTF-8"

       #SYSFONT="latarcyrheb-sun16"

       #SYSFONTACM="utf8"

    -- 한국어

       LANG="ko_KR.eucKR"

       #SYSFONT="lat0-sun16"

       #SYSFONTACM="8859-15"

    ip주소 추가하기 (Redhat 9.0)

    #ifconfig eth1 inet6 add 3ffe:ffff:0:f101::1/64    //원하는 IPv6 주소 설정

    vga=792 option사용하기 위한 커널 옵션 설정(2.4.26) - 나름대로 정리 확인 필요

    [Block devices]

      Loopback device support 체크

      RAM disk support 체크

    [Console drivers]

      VGA text console 체크

      Video mode selection supprot 체크

      [Frame-buffer support --->]

       Support for frame buffer devices 체크

       VESA VGA graphics console 체크

    Ethernet  설정

    #vi /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0

    BOOTPROTO=none

    ONBOOT=yes

    IPADDR=203.253.3.71

    NETMASK=255.255.255.0

    USERCTL=no

    PEERDNS=no

    GATEWAY=203.253.3.254

    TYPE=Ethernet

    NETWORK=203.253.3.0

    BROADCAST=203.253.3.255

    VI - TAB키 간격 설정

    [명령어 모드]

       :se ts=4

    [실행될 때마다 적용]

    사용자 홈디렉토리에 .exrc 파일 생성

    다음 내용 추가

    se ts=4

    vi 주석색깔 바꾸기

    사용자 홈디렉토리에 .exrc 파일 생성

    다음 내용 추가

    highlight Comment term=bold cterm=bold ctermfg=4

    [참고 - ctermfg]:

    1:주황? 2: 초록 3: 노랑 4: 연한 파랑 5: 보라 6: cyan  7: 하얀ㅣ

    vi 폴더색깔 바꾸기

    /etc/DIR_COLORS에서 DIR 01;34의 값을 변경

    /etc/DIR_COLORS.xterm은 Terminal에 적용되는 것으로 판단되었음

    모듈올리기 (ex. ftp)

    #chkconfig --list                          // 현재 설정 상태 확인

    #chkconfig --level 2345 vsftpd on    // 2,3,4,5로 부팅시에 자동으로 시작

    #/etc/rc.d/init.d/vsftpd restart       // 직접 데몬 지정해서 실행할 수도 있음

    [참고]

    #vi vsftpd                                   // 스크립트 파일을 살펴보면 환경설정파일 정보

                                                   // 등을 알수 있음

    #setup                                       // 부팅시에 올릴 데몬 설정

    grep 명령어 사용

    #grep -rn "bind error" *.c *.h          // 특정 구문 검색시 유용

    사용자 계정 추가 & 삭제

    #adduser 계정이름        // 추가

    #passwd 계정이름        // 비밀번호 변경

    #userdel 계정이름           // 삭제

    iptables (특정 mac address로부터 수신한 패킷 DROP)

    #iptables -A INPUT -m mac --mac-source [MAC Address] -j DROP    

    간단한 Router 설정법

    In Router

    #vi /proc/sys/net/ipv4/ip_forward

    //해당파일 내용 1 로 변경

    //route add 명령어로 라우터에 붙어있는 각각의 인터페이스에 대한 설정

    In Hosts

    //route add default gw 명령으로 각각의 호스트의 디폴트 게이트웨이 설정

    2006/09/08 14:08 2006/09/08 14:08
    이 글에는 트랙백을 보낼 수 없습니다
    웅쓰:웅자의 상상플러스
    웅자의 상상플러스
    전체 (379)
    게임 (5)
    영화 (2)
    기타 (23)
    맛집 (5)
    영어 (2)
    대수학 (3)
    형태소 (5)
    Hacking (9)
    Linux (112)
    HTML (48)
    Application_developing (48)
    Web_developing (102)
    Window (11)
    «   2006/09   »
              1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    1. 2016/01 (1)
    2. 2015/12 (3)
    3. 2015/10 (3)
    4. 2015/03 (2)
    5. 2015/01 (4)