블로그 이미지
redkite

카테고리

분류 전체보기 (291)
00.SI프로젝트 산출물 (0)
00.센터 운영 문서 (0)
01.DBMS ============.. (0)
01.오라클 (117)
01.MS-SQL (15)
01.MySQL (30)
01.PostgreSql (0)
01.DB튜닝 (28)
====================.. (0)
02.SERVER ==========.. (0)
02.서버-공통 (11)
02.서버-Linux (58)
02.서버-Unix (12)
02.서버-Windows (2)
====================.. (0)
03.APPLICATION =====.. (11)
====================.. (0)
04.ETC =============.. (0)
04.보안 (5)
====================.. (0)
05.개인자료 (1)
06.캠핑관련 (0)
07.OA관련 (1)
Total
Today
Yesterday

달력

« » 2024.11
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

공지사항

최근에 올라온 글

쉘에서 실행한 명령을 syslog로 자동 보내기

작성일 : 2008/11/18 19:53

 

 

조회수 : 3174

 

 


제 목 : 쉘에서 실행한 명령을 syslog로 자동 보내기
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2008.9.30(화)
정리일 : 2008.10.31(금)

서버에 접속한 유저가 어떤 명령을 내렸는지 실시간으로 확인하려면 어떻게 해야할까? history file을 뒤진다? 이건 너무 불편하다. 명령이 실행될 때마다 특정이벤트를 발생해서, 별도 저장해주면 효과적일 것이다. 그 것도 syslog를 통해서 명령이 저장된다면 원격지 서버에서 특정 서버의 실행 명령을 모조리 확인해볼 수 있을 것이다.

몇줄의 쉘 function으로 syslog로 실행명령을 보내는 방법을 알아보자.

1. bash로 syslog로 메시지 보내기

function logging
{
stat="$?"
cmd=$(history|tail -1)
IP=`/usr/bin/who am i|awk -F\( '{print$2}'|awk -F\) '{print$1}'`
if [ "$cmd" != "$cmd_old" ]; then
logger -p local1.notice "[2] STAT=$stat"
logger -p local1.notice "[1] IP=$IP, PID=$$, PWD=$PWD, CMD=$cmd"
fi
cmd_old=$cmd
}
trap logging DEBUG

 

 

cmd_logging.txt


1: function logging
2: {
3: stat="$?"
4: cmd=$(history|tail -1)
5: if [ "$cmd" != "$cmd_old" ]; then
6: logger -p local1.notice "[2] STAT=$stat"
7: logger -p local1.notice "[1] PID=$$, PWD=$PWD, CMD=$cmd"
8: fi
9: cmd_old=$cmd
10: }
11: trap logging DEBUG

 



위 스크립트에서 중요한 부분은 logger와 trap이다.

1) logger는 지정한 메시지를 syslog로 보내주는 명령이다.
위에서는 local1 서비스종류(facility)과 notice 레밸로 syslog로 메시지를 보내준다.
logger의 활용에 대해서는 '여러 서버의 load를 터미널에서 실시간 모니터링' (글 좋은진호, 2008.2)
중 '2. 미리 준비되어 있어야할 사항' 부분을 살펴보기 바란다.
http://coffeenix.net/board_view.php?bd_code=1571
2) trap은 bash내부 명령으로 특정시그널이 발생할 때 지정한 명령어가 실행된다.
형식) trap "명령" 시그널
위에서는 DEBUG 형태로, 명령이 실행될 때마다 logging function을 호출한다.

1번째줄 : logging function을 정의한다.
3번째줄 : 명령의 실행 결과를 stat 변수에 저장해둔다.
4번째줄 : history중에서 맨 마지막에 실행한 명령을 뽑아 cmd 변수에 저장해둔다.
5번째줄 : 이전에 실행한 명령과 방금 실행한 명령이 다를 경우에만 syslog로 보내도록 해준다.
이전에 ls 명령을 했고, 방금 ls명령을 했다면 따로따로 로그에 남을까? 그렇다.
cmd_olg는'4 ls -la'를 저장하고 있고, cmd는'5 ls -la'를 저장하고 있다. 즉, history 번호가 함께 저장되기 때문에 다른 명령으로 판단한다.
이 if문이 없을 경우에는 아무 명령도 입력하지 않고 엔터만 쳐도 이전에 실행한 명령을 반복적으로 syslog로 보내버리므로 반드시 필요하다.
6번째줄 : 이전에 실행한 명령의 실행 결과 코드를 syslog로 보낸다.
7번째줄 : 방금 실행한 명령의 실행디렉토리, 명령을 syslog로 보낸다. PID는 bash의 PID다.

위의 스크립트를 global하게 적용하려면 /etc/profile 에 추가하거나 /etc/profile.d/cmd_logging.sh 로 저장하면 된다. 유저별로 적용하려면 $HOME/.bash_profile 또는 $HOME/.bashrc에 넣어둔다. 이제 적용됐는지 로긴해보자.

2. syslog에 남기는 로그 형태

아래의 로그를 살펴보자. 시간표시를 자세히 보면 [2]가 먼저 저장되고, [1]이 그 다음에 저장된다. [2] 는 이전에 실행한 명령의 실행 결과 코드이며, [1]은 방금 실행한 명령이다. 방금 실행한 결과 코드는 다음 명령이 실행되어야 결과로 저장이 된다.
 


Sep 30 17:11:31 cnx1 coffeenix: [2] STAT=0
Sep 30 17:11:31 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 4 ls -la
Sep 30 17:11:31 cnx1 coffeenix: [2] STAT=0
Sep 30 17:11:31 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 5 w
Sep 30 17:11:32 cnx1 coffeenix: [2] STAT=126
Sep 30 17:11:32 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 6 pwd
Sep 30 17:11:32 cnx1 coffeenix: [2] STAT=0
Sep 30 17:11:32 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 7 ls -la
Sep 30 17:11:36 cnx1 coffeenix: [2] STAT=0
Sep 30 17:11:36 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 8 vi get_stat.sh
Sep 30 17:15:24 cnx1 coffeenix: [2] STAT=0
Sep 30 17:15:24 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 9 chmod 700 get_stat.sh
Sep 30 17:15:28 cnx1 coffeenix: [2] STAT=0
Sep 30 17:15:28 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 10 ./get_stat.sh
Sep 30 17:15:35 cnx1 coffeenix: [2] STAT=0
Sep 30 17:15:35 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 11 ls
Sep 30 17:16:31 cnx1 coffeenix: [2] STAT=0
Sep 30 17:16:31 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD= 12 cd /var/log
Sep 30 17:16:32 cnx1 coffeenix: [2] STAT=0
Sep 30 17:16:32 cnx1 coffeenix: [1] PID=29168, PWD=/var/log, CMD= 13 ls

 



실행명령만 별도 로그로 저장하고 싶다면 /etc/syslog.conf 에 다음을 추가하고, syslogd 데몬을 재실행해주면 된다.

 


local1.notice /var/log/cmd.log

 



원격지로 명령을 보내려면, 마찬가지 방법으로 /etc/syslog.conf 에 다음을 추가하고, 재실행하면 된다. 물론 수신받는 원격지 syslog 서버에서는 메시지 수신을 허용해둔 상태여야 한다.

 


local1.* @192.168.123.2

 

### 적용 후 service syslog restart 를 통하여 적용


아쉬운 점은 csh은 trap이 없고, 대신할 csh 내부 명령으로 onintr 이 있으나 위의 trap과 같은 효과는 얻어내기 힘들다.

3. 참고자료

* 여러 서버의 load를 터미널에서 실시간 모니터링 (글 좋은진호, 2008.2)
http://coffeenix.net/board_view.php?bd_code=1571 (logger 명령)
* bash man 페이지

               

'02.서버-Linux' 카테고리의 다른 글

[리눅스]패스워드 만료일자 변경  (0) 2012.12.19
[리눅스]부트영역 복구하기  (0) 2012.12.19
[리눅스]USB 인식  (0) 2012.12.19
[리눅스]NCFTP로 백업하기  (0) 2012.12.19
[리눅스]Core File 설정  (0) 2012.12.19
Posted by redkite
, |

[리눅스]USB 인식

02.서버-Linux / 2012. 12. 19. 13:41

리눅스에서 USB 마운트 시키는 방법~

 

일단 외워두어야겠군...

1. 첫 번째 방법
# insmod ide-scsi 명령을 수행한 후 mnt 디렉토리 내에 usb-drive 폴더를 만들고, USB가 연결 되어 있는 상태에서 # mount -t vfat /dev/sda1 /mnt/usb-drive 명령을 실행합니다.
차후에는 # mount -t vfat /dev/sda1 /mnt/usb-drive 명령만 실행하면 됩니다.

2. 두 번째 방법
부팅시에 자동으로 USB 메모리를 마운트 하기위해/mnt/usb 라는 폴더를 생성하고,/etc/fstab에 다음과 같이 넣습니다.
/dev/sda1 /mnt/usb auto noauto,iocharset=cp949,user 0 0

USB 메모리를 꼽을때 자동으로 인식시키도록 하기 위해/etc/hotplug/usb/usb-storage 파일을 만들고 다음을 입력하고 # chmod 755 usb-storage 명령을 실행합니다.
--------------------------------------------------------------------
#!/bin/sh
#
# /etc/fstab 설정에 따라 /mnt/usb에 마운트
mount /mnt/usb
--------------------------------------------------------------------
USB 메모리 저장장치를 다시 마운트 하기 위해서는 mnt 디렉토리 내에서 # mount /dev/sda1 명령을 수행하고, 언마운트하기 위해서# umount /dev/sda1 명령을 수행해야 하며, 수정된 내용을 저장하기 위해서는 반듯이 언마운트 시켜야 합니다.

[mntent]: warning: no final newline at the end of /etc/fstab 라는 에러메시지가 나올때는 fstab 문서의 제일 하단줄에 엔터라인(공백)을 추가해 주어야 합니다.

출처 : http://joodo79.hihome.com/tutorial/linux/hancom-3.1/hancom-linux.htm

Posted by redkite
, |

0050. [리눅스] NCFTP 로 백업하기

# vi /root/backup.sh

#!/bin/bash

#### 공통설정
export Today="`date '+%y-%m-%d'`"
backup_dir="/home/file/backup"
backup_day="1" # 보관일(1일)

#### 디비설정
DB_user="root";
DB_pass="비밀번호";


#### 원격설정
FTP_addr="접속아이피";
FTP_user="아이디";
FTP_pass="비밀번호";


########### 오래된 백업데이터 삭제
dirlists=`/bin/ls -t $backup_dir 2>/dev/null`
i=1
for dir in $dirlists ; do
if [ "$i" -ge $backup_day ] ; then
/bin/rm -rf "$backup_dir/$dir"
fi
i=$(($i+1))
done

####### 새로운 디렉토리 생성
if [ ! -d "${backup_dir}/${Today}" ]
then
/bin/mkdir -p ${backup_dir}/$Today
/bin/mkdir -p ${backup_dir}/$Today/homedir
/bin/mkdir -p ${backup_dir}/$Today/databass
/bin/mkdir -p ${backup_dir}/$Today/system
fi

####### databass를 사용자별로 백업을 한다.
for database in `mysqlshow -u ${DB_user} -p${DB_pass} | awk -F" " '{ print $2 }' | grep -v "^$" |grep -v "Databases"` ; do
mysqldump -u ${DB_user} -p${DB_pass} "${database}" ${table} > ${backup_dir}/${Today}/databass/${database}.sql
done

####### 시스템 디렉토리를 백업한다
tar cvfpz ${backup_dir}/$Today/system/usr.local.tar.gz /usr/local
tar cvfpz ${backup_dir}/$Today/system/etc.tar.gz /etc
tar cvfpz ${backup_dir}/$Today/system/var.named.tar.gz /var/named

####### home 디렉토리에 사용자별로 백업을 한다.
dirlists=`/bin/ls -t /home 2>/dev/null`
for dir in $dirlists ; do
tar cvfpz ${backup_dir}/$Today/homedir/$dir.tar.gz /home/$dir
done

####### 링크를 만들어 준다.
rm -rf ${backup_dir}/today
ln -s ${backup_dir}/$Today /${backup_dir}/today

####### 원격 데이타백업을 시작한다.
ncftp -u${FTP_user} -p${FTP_pass} ${FTP_addr} << ./backup
put -R ${backup_dir}/$Today
bye

[출처] 마케팅코드 ::잘팔리는 홈페이지의 비밀:: - http://www.marketingcode.co.kr/hots/community/bbs/board.php?bo_table=share91&wr_id=2888

Posted by redkite
, |

0049. [리눅스] CoreFile 설정

ulimit 설정 변경

Posted by redkite
, |

0048. [리눅스] SSH Key 생성 후 패스워드 없이 로그인

PuTTY와 TuTTY 모두 OpenSSH 서버로부터 만들어진 인증키를 이용하여 로그인할 수 있습니다. 또한 개인 키를 암호없이 만들면 암호 입력없이 로그인할 수 있습니다.

우선 텔넷으로 서버에 접속합니다. 인증키에 대한 암호를 입력해야 함으로, 당연히 ssh 를 이용한 텔넷을 이용하는 것이 안전하겠지요. ssh-keygen을 이용하여 ssh 인증키를 생성합니다.


인증키를 담는 파일 생성 위치와 파일 이름을 묻게 되는데, 기본 값을 사용하기 위해 엔터키를 누릅니다.


다음은 인증키를 보호하기 위한 암호를 입력할 차례입니다. 여기서 입력하는 암호는 인증키를 위한 암호이지 텔넷에 접속할 때 사용하는 암호가 아닙니다. 아래 글에서 PuttyGen을 사용하여 개인키를 만들 때 이해가 되실 것입니다.


암호 입력이 옳바른지 다시 한번 암호를 입력합니다.


아래와 같이 fingerprint까지 출력되었다면 정상 적으로 인증키가 만들어진 것입니다.


생성된 인증키 파일은 .ssh에 있습니다. .ssh로 이동합니다.


파일이 정상적으로 생성이 되었지요.


id_rsa는 개인키이고 서버에 접속하는 클라이언트쪽에서 필요한 파일입니다. id_rsa.pub는 공개키로 서버가 가지고 있어야 하는데, 파일 이름을 반드시 authorized_keys 로 변경해 주어야합니다.


텔넷이나 VNC나 SSH를 이용하여 프로그램이 (1) 서버에 접속하게 되면 (2) 프로그램은 개인키를 서버에 제시하게되고, (3) 서버는 .ssh 에 있는 authorized_keys 파일 값을 비교 확인하여 로그인을 허가하게 됩니다.

서버에서 할 일은 모두 끝났습니다. 이제 이 서버에 접속하려는 클라이언트쪽에서 해야할 일입니다.

생성된 개인키, id_rsa를 ftp나 기타 방법으로 컴퓨터에 복사합니다. 이제 이 개인키를 가지고 PuTTY 나 TuTTY에서 로그인할 때 사용하는 인증키를 만들겠습니다.

PuTTY 홈페이지다운로드 페이지에서 PuTTYgen을 내려받습니다. 설치파일이 아니므로 바로 실행하시면 됩니다.

[Load]
버튼을 클릭합니다. 그리고 서버로부터 복사한 id_rsa 파일을 선택합니다.



그러면 암호를 물어 오는데, 인증키를 생성했을 때 사용한 암호를 입력합니다.


키를 이상없이 읽어 들였다면 아래와 같이 설명 글이 출력됩니다.



이제 텔넷 접속에 사용할 암호를 공백으로 수정해 줍니다. 개인키만 확인하면 로그인이 되도록 수정한다는 말씀이 되겠습니다.


화살표가 가르키는 암호를 모두 삭제합니다. 그리고 Save private key를 이용하여 적당한 곳에 개인키를 저장합니다.



이제 PuTTY나 TuTTY를 실행합니다. 이전 서버 접속에 대한 정보를 Load 합니다.



[Connection/Data]로 이동해서 로그인 ID를 입력합니다.



이제 [Connection/SSH/Auth]로 이동한 후 PuTTYgen에서 저장한 개인크를 선택하여 줍니다.



다음 사용을 위해 이 정보를 저장합니다.


이제 [Open]버튼으로 텔넷을 접속하여 보십시오. 이전과는 달리 암호 확인 없이 로그인이되지요.


PuTTYgen에서 만들어진 개인키는 매우 조심해야 합니다. 암호 확인 없이 텔넷에 접속할 수 있기 때문에 잘못 관리하셨다가는 큰 낭패를 보실 수 있습니다.

'02.서버-Linux' 카테고리의 다른 글

[리눅스]NCFTP로 백업하기  (0) 2012.12.19
[리눅스]Core File 설정  (0) 2012.12.19
[리눅스]FTP 디렉토리 내용이 안보일 경우  (0) 2012.12.19
[리눅스]JAVA Path / FTP Port 변경  (0) 2012.12.19
[리눅스]APM 설치  (0) 2012.12.19
Posted by redkite
, |

0047. [리눅스] FTP 디렉토리 내용이 안보일 경우

FTP 226 Transfer done (but failed to open directory). 오류해결방법 & SELINUX 관련 설정(FTP관련)

개발노트/Linux

출처 : http://develop.sunshiny.co.kr/archive/20090101

Fedora Core9에 vsftp를 설치하여 사용하다 보면 외부에서 FTP 접속할 경우

아래 표와 같이 디렉토리 목록만 나오고 파일목록이 안나오는 경우가 있다.

230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).

이럴 경우 "root" 권한으로

SELinux 정책을 일시적으로 끄고 싶을때 (재부팅하면 SELinux의 정책은 원래대로 돌아온다.)

# setenforce 0

다시 켜고 싶을땐

# setenforce 1

영구적으로 SELinux정책을 끄고 싶을때는 아래와 같이 해주면 된다.(이것도 역시 root 권한으로...)

#vi /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

위와 같이 "SELINUX="의 값을 "enforcing"에서 "disabled"로 수정 후 저장하면 재부팅 후에도... 쭈욱~

출처 : http://mrtroll.tistory.com/entry/%ED%8E%98%EB%8F%84%EB%9D%BC%EC%BD%94%EC%96%B4%EC%97%90%EC%84%9C-SELINUX-%EA%B4%80%EB%A0%A8-%EC%84%A4%EC%A0%95FTP%EA%B4%80%EB%A0%A8

페도라코어에서 SELINUX 관련 설정(FTP관련)

*** SELINUX
# setsebool -P ftp_home_dir 1
페도라 코어 4 까실때 SELinux 로 설정했다면 디폴트로 사용자의 home 디렉토리에 쓰기를 막아놓는다.
SELinux 설정에서 FTP 부분을 변경하자.
# service vsftpd restart
home 디렉토리의 읽고쓰기를 1(True)로 변경하시고 vsftpd 를 재시작.

# setsebool -P ftpd_disable_trans 1
FTP 에 관하여 SELinux 정책을 아예 적용하지 않는 옵션을 설정

- 근데 왜 내꺼에선 setsebool -P ftp_home_dir 1 명령어 입력후 먹통일까... -ㅅ-

Posted by redkite
, |

VSFTP 포트 변경

#--- inetd 모드가 아닌 독립 모드로 vsftp 실행
listen=YES
#--- FTP를 위한 Listen Port를 지정 한다.
listen_port=50021

#--- 데이터 전송을 위해서 Active Mode를 사용도록 설정 한다.
#--- Active Mode에서 FTP 데이터 전송을 위한 디폴트 포트는 20 port 이다.
port_enable=YES
#--- 데이터 전송을 위해서 Passive Mode를 사용하지 못하도록 한다.
pasv_enable=NO

#--- 20번 포트의 데이터전송 연결을 허용 한다.
connect_from_port_20=YES
#--- Active Mode에서 사용할 FTP-Data 포트를 강제로 50020 port로 변경 한다.
ftp_data_port=50020

JAVA PATH 우선순위 변경

현재 선택[+]을 유지하시려면 엔터키를 누르십시오. 그렇지 않으면, 선택 번호를 입력해 주십시오:
[root@KJB-117-WEB ~]# update-alternatives --install "/usr/bin/java" "java" "/usr/local/jdk1.6.0_04/bin/java" 1
[root@KJB-117-WEB ~]# update-alternatives --config java

Posted by redkite
, |

[리눅스]APM 설치

02.서버-Linux / 2012. 12. 19. 13:37

0044. [리눅스] APM 설치

mysql 5.5 설치

0. 기본 패키지 설치(YUM이용)
yum -y install zlib curl
yum -y install gcc g++ cpp gcc-c++
yum -y install compat-gcc-32-g77 flex
yum -y install openssl openssl-devel
yum -y install libtermcap-devel ncurses-devel libc-client-devel bzip2-devel
yum -y install bison
yum -y install freetype freetyle-devel

1. Cmake설치
http://www.cmake.org에서 다운로드
w.get http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz

압축을 풀고 해당 디렉토리 안에서 bootscript 실행
tar zxvf cmake-2.8.4.tar.gz
cd cmake-2.8.4
./bootscript
(만약 패키지가 없다는 에러가 나오면, 해당 패키지 설치)
gmake all ; gmake install

gmake와 make는 거의 같은 거라고 합니다.. make all ; make install 하셔도 될것 같습니다.
저는 그낭 gmake all ; gmake install을 했습니다.

2. mysql 패키지 삭제
yum -y remove mysql*

3. mysql 다운로드 & 설치준비
mysql.com에서 mysql community server 다운로드
Generic Linux (Architecture Independent), Compressed TAR Archive) 로 다운로드

한국 미러는 경희대학교지만, 경희대학교 서버는 상당히 느립니다..
일본의 Internet Initiative Japan Inc., JAPAN에서 받겠습니다.
w.get http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.9.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
(resolv하는데 시간이 조금 걸리수도 있지만, 다운로드는 상당히 빠릅니다.)

mysql용 계정을 만들어 줍니다.
useradd -M -s /sbin/false mysql

이제 gmake로 설치준비(?)를 합니다. gmake의 옵션은 다른 사이트를 참고했습니다.
해당 사이트는 http://blog.lovecoco.net/128 입니다.

cd mysql-5.5.9

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DMYSQL_DATADIR=/usr/local/mysql/data -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1

DCMAKE_INSTALL_PREFIX는 기본 설치 디렉토리(저는 그냥 참고사이트와 같은곳에 설치했습니다.)
DDEFAULT_CHARSET은 기본언어셋
DWITH_EXTRA_CHARSETS=all은 추가할 언어셋
DMYSQL_DATADIR은 데이터 디렉토리를 나타낸다고 합니다.
자세한것은 다음 사이트를 참고하세요
http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html#cmake-general-options

cmake가 끝났으면 make all ; make install을 시행합니다.
이 부분에서 조금 오래 걸릴수도 있고, warning이 뜰수도 있지만, 자기 혼자 열심히 진행되므로 그냥 냅둡시다.

make install까지 끝났으면, 정상적으로 설치가 되었는지 확인해야 합니다.

ls -al /usr/local/mysql/ 을 입력했을때 다음과 같이 나와야 합니다.
(날짜는 상관하지 마세요. vmware로 스냅샷을 찍어서 갈아 엎으면서 하느라 시간이 엉망입니다.)
==================================================================
-rw-r--r-- 1 root root 17987 1월 20 07:37 COPYING
-rw-r--r-- 1 root root 7390 1월 20 07:37 INSTALL-BINARY
-rw-r--r-- 1 root root 113534 1월 20 07:37 README
drwxr-xr-x 2 root root 4096 2월 27 07:09 bin
drwxr-xr-x 4 root root 4096 2월 27 07:08 data
drwxr-xr-x 2 root root 4096 2월 27 07:08 docs
drwxr-xr-x 3 root root 4096 2월 27 07:08 include
drwxr-xr-x 3 root root 4096 2월 27 07:08 lib
drwxr-xr-x 4 root root 4096 2월 27 07:09 man
drwxr-xr-x 10 root root 4096 2월 27 07:09 mysql-test
drwxr-xr-x 2 root root 4096 2월 27 07:09 scripts
drwxr-xr-x 27 root root 4096 2월 27 07:09 share
drwxr-xr-x 4 root root 4096 2월 27 07:09 sql-bench
drwxr-xr-x 2 root root 4096 2월 27 07:09 support-files
==================================================================

설정파일을 복사해야 합니다.
설정파일은 설치디렉토리/support-filess/에 존재합니다.
my-huge.cnf : 메모리가 1~2G일때
my-large.cnf : 메모리가 512M일때
my-medium.cnf : 메모리리 64~256M일때
my-small.cnf : 메모리가 64M이하일때

저는 my-large.cnf를 이용하겠습니다.
cd /usr/local/mysql
cp support-files/my-large.cnf /etc/my.cnf

그리고 기본 db를 설정해 줍니다.
기본 db설정또한 설치디렉토리/script/mysql_install_db 파일을 이용해서 할 수 있습니다.

cd /usr/local/mysql/script
./mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

이렇게 ./script 디렉토리 안에서 실행을 하면 다음과 같은 에러가 납니다.

FATAL ERROR: Could not find ./bin/my_print_defaults

mysql_install_db 파일을 mysql이 설치된 디렉토리로 복사해서 재실행 하면 됩니다.

cp /usr/local/mysql/script/mysql_install_db /usr/local/mysql/
cd /usr/local/mysql
./mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

마지막 부분에 다음과 같은 안내문이 나오면 성공한 것입니다.
==========================
You can test the MySQL daemon with mysql-test-run.pl
cd ./mysql-test ; perl mysql-test-run.pl

Please report any problems with the ./bin/mysqlbug script!
==========================

이후, mysql이 설치된 디렉토리의 권한을 다시 설정해 줘야 합니다.
cd /usr/local/mysql
chown -R root .
chown -R mysql data
chgrp -R mysql .

환경설정변수를 수정하여 PATH에 mysql을 등록합니다.
vi ~/.bash_profile

PATH부분에 다음과 같이 추가합니다.

수정전 : PATH=$PATH:$HOME/bin
수정후 : PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

수정후에 저장하고 종료합니다.

자동실행을 설정합니다.
mysql의 실행 스크립트 파일을 /etc/init.d/에 복사하고 chkconfig명령어를 이용해서 추가해 줍니다.
mysql 5.5.9의 경우, mysql.server파일은 support-files/에 있습니다.
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld

확인은 다음과 같이 합니다.
[root@home]
[/usr/local/mysql] #chkconfig --list | grep mysqld
mysqld 0:해제 1:해제 2:활성 3:활성 4:활성 5:활성 6:해제

위와 같이 나오면 설정이 완료된 것입니다.

그리고나서 변경된 환경변수를 적용합니다.
source ~/.bash_profile

외부에서 접근이 가능하도록 서비스 포트를 오픈합니다.
포트는 tcp 3306포트입니다.

/etc/sysconfig/iptables 파일에 다음을 추가해 줍니다.
주의할점은 대소문자를 구분하므로, 절대로 전부 소문자로 쓰면 안됩니다!
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

추가가 되었다면 iptables를 재시작 합니다.

service iptables restart

restart시 에러가 나면, 오타가 없는지 확인해 보세요.


mysql을 구동합니다.
/etc/init.d/mysqld start

만약 다음과 같이 에러가 나면서 구동에 실패하면 /usr/local/mysql/data/home.test.err 파일을 삭제합니다.
============================
Starting MySQL.The server quit without updating PID file (/usr/local/mysql/data/home.test.pid). [실패]
============================

rm -rf /usr/local/mysql/data/home.test.err

그래도 안된다면 /usr/local/mysql/에서 다음과 같이 입력해 주세요
chown -R root .
chown -R mysql data
chgrp -R mysql .
rm -rf data/home.test.err

그리고나서 다시 시작하면 잘 됩니다!


root암호 등록 & 테스트를 합니다.
mysqladmin -u root password [암호] 와 같은 형식으로 합니다.
저는 암호를 123으로 해보겠습니다.

mysqladmin -u root password 123

혹은 mysql로 암호없이 접근하셔서 다음과 같이 입력하세요

grant all privileges on *.* to 'root'@'localhost' identified by '암호';

만약에 제가 한다면 다음과 같이 입력하게 될 것입니다.
grant all privileges on *.* to 'root'@'localhost' identified by '123';


이후에 mysql로 접근하면 에러가 나오면서 접속이 안되야 합니다.
그런데 그냥 접속되는 경우가 생기는데요..
다음과 같이 합니다.

mysql -u root -p
위에서 설정한 암호를 입력합니다.
그리고나서 다음을 입력합니다.

mysql> FLUSH PRIVILEGES;
Query OK가 뜨면 quit로 mysql 접속종료 후 다시 재접속 해 봅니다.

mysql 명령 하나로만 접속하면 Access denied가 뜹니다.
[root@home]
[/] #mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

mysql -u root -p 를 입력한 다음, 암호를 쳐서 접속해 봅니다.
그러면 잘 될겁니다.

접속이 잘 된다면 mysql 설치는 끝났습니다.





아파치 설치

참고사이트 : http://blog.lovecoco.net/116?category=21

1. 소스 다운로드, 기존 패키지 삭제

http://www.apache.org에서 소스를다운로드 합니다.
daum.net 미러는 속도가 느리더군요.ㅠㅠ
저는 tt.co.kr에서 받았습니다.
w.get http://apache.tt.co.kr//httpd/httpd-2.2.17.tar.gz

우어.. 전송속도가 9.97M/s네요..
===================================
[root@home]
[/tmp/apm_set] #w.get http://apache.tt.co.kr//httpd/httpd-2.2.17.tar.gz
--2011-02-27 07:57:59-- http://apache.tt.co.kr//httpd/httpd-2.2.17.tar.gz
Resolving apache.tt.co.kr... 121.125.79.185
Connecting to apache.tt.co.kr|121.125.79.185|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6597991 (6.3M) [application/x-gzip]
Saving to: `httpd-2.2.17.tar.gz'

100%[======================================>] 6,597,991 9.97M/s in 0.6s

2011-02-27 07:58:00 (9.97 MB/s) - `httpd-2.2.17.tar.gz' saved [6597991/6597991]
===================================

그리고 기존에 설치된 패키지를 삭제해 줍니다.
yum -y remove httpd*


2. 설치

apache소스파일의 압출을 풀어줍니다.

tar zxvf httpd-2.2.17.tar.gz

cd httpd-2.2.17

그리고 설치준비를 합니다.
책에서는 ssl 옵션이 없었는데, 참고사이트에서는 ssl추가 옵션이 있습니다.
설치사이트를 따르겠습니다.

./configure --prefix=/usr/local/apache --enable-mods-shared=most --enable-modules=so --with-mpm=worker --enable-rewrite --enable-ssl --with-ssl

만약 에러가 난다면, 해당 패키지를 설치해 주세요.

이후 make all ; maks install을 해줍니다.

제대로 설치가 되었다면 실행스크립트를 복사합니다.

cp /usr/local/apache/bin/apachectl /etc/init.d/httpd

자동실행에 등록합니다. chkconfig를 사용하기 위해서 실행스크립트를 조금 수정해 줍니다.
수정해 주지 않으면 [httpd 서비스는 chkconfig를 지원하지 않습니다.]와 같은 안내문을 뱉어내며
chkconfig에 등록되지 않습니다.

/etc/init.d/httpd 에 다음 내용을 그대로 추가해 줍니다.
파일 가장 아래쪽에 추가해 주는것이 나중에 수정하기도 편할것이라 생각됩니다.
주석은 풀지 않아도 됩니다. 주석 그대로 입력하세요.

==============
#chkconfig: 2345 90 90
#description: init file for Apache server deamon
#processname: /usr/local/apache/bin /apachectl
#config: /usr/local/apache/conf/httpd.conf
#pidfile: /usr/local/alache/logs/httpd.pid
==============

입력후 저장종료 한 다음 chkconfig에 추가하면 추가가 됩니다.

chkconfig --add httpd

정상등록이 되었는지 확인합니다. 다음과 같이 나오면 성공입니다.
==============
[root@home]
[/] #chkconfig --list | grep httpd
httpd 0:해제 1:해제 2:활성 3:활성 4:활성 5:활성 6:해제
==============

3. 기본설정
기본설정파일은 /usr/local/apache/conf/httpd.conf 입니다.
해당 파일을 수정해야 합니다. 원본을 백업해 두도록 합시다.

cp /usr/local/apache/conf/httpd.conf /usr/local/apache/conf/httpd.conf.backup

httpd.conf파일을 수정합니다.
102~103번 줄에 <IfModule !mpm_netware_module> <IfModule !mpm_winnt_module>
이 있습니다. 그 사이에 다음과 같이 추가해 주세요

<IfModule !mpm_netware_module>
User nobody
Group nobody
<IfModule !mpm_winnt_module>

그리고 145번째 줄정도에 #ServerName www.example.com:80 가 있습니다.
주석을 해제하고 서버 주소나 도메인을 넣어주면 해당 주소나 도메인으로 접속할 수 있습니다.
이 항목을 설정하지 않으면 127.0.0.1로만 접속이 가능합니다.
저는 vmware의 nat에서 지정해준 주소인 192.168.17.130을 입력했습니다.

146 ServerName 192.168.17.130

저장후 종료하고나서 apache를 실행시켜 봅니다.

/etc/init.d/httpd start

주의할점은, 실행되었는데도 아무런 메세지를 내보내지 않습니다.
ps -e | grep httpd 로 httpd 데몬을 찾아보면, 5개정도가 떠 있습니다.
============
[root@home]
[/] #ps -e | grep httpd
2427 ? 00:00:00 httpd
2523 ? 00:00:00 httpd
2524 ? 00:00:00 httpd
2526 ? 00:00:00 httpd
2528 ? 00:00:00 httpd
============

이후, iptables에 tcp 80번 포트를 개방해 줍니다.(파일위치 /etc/sysconfig/iptables)

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

저장종료후 iptables를 다시 시작해 줍니다.
service iptables restart

에러가 뜨지 않고 OK가 뜬다면 성공입니다!

해당 주소로 웹접속을 해보면, It works!라는 페이지가 뜹니다.
그러면 성공입니다!




php설치

참고사이트 : http://blog.lovecoco.net/117?category=21

1. php소스 다운로드
w.get http://kr.php.net/get/php-5.3.5.tar.bz2/from/kr2.php.net/mirror

압축을 풀어줍니다.
tar jxvf php-5.3.5.tar.bz2


2. 설치

php는 수많은 옵션을 같이 설치해야 합니다.
책에서 나오는 옵션이나 참고사이트나 거의 비슷할거라 생각됩니다.
apache와 mysql에 대한것만 짚고 넘어가겠습니다.

--prefix : php가 설치될 디렉토리 입니다.
--with-apx2 : 아파치의 apxs를 이용해 아파치에 모듈을 적재하는 것입니다.
apx의 경로는 apache설치디렉토리/bin/apxs 입니다.
--with-mysql : mysql과 연동하는 것입니다. mysql이 설치된 디렉토리를 적어줘야 합니다.
--with-apache-install : apache가 설치된 디렉토리를 적어줘야 합니다.
--with-config-file-path : 설정파일이 위치할 곳을 적어줍니다. 그냥 /etc 로 해주는것이 정신건강에 좋을것 같습니다.

저는 참고사이트의 내용으로 하겠습니다.
책에 있는것도 추가할 모듈은 거의 비슷할 것이고, 모듈은 따로 설정할수도 있으니 지금은 참고사이트대로 가겠습니다.
다음과 같이 입력합니다. 복사해서 붙여넣으세요.(make test를 하실분들은 --enable-safe-mode를 삭제하세요!)

cd php-5.3.5
./configure --prefix=/usr/local/php --with-exec-dir=/usr/bin --with-apxs2=/usr/local/apache/bin/apxs --with-apache-install=/usr/local/apache --with-mysql=/usr/local/mysql --with-config-file-path=/etc --disable-debug --enable-safe-mode --enable-track-vars --enable-sockets --with-png-dir=/usr/lib --with-freetype-dir=/usr/include/freetype2 --with-mod_charset --with-charset=euc_kr --with-xml --with-language=korean --enable-mailparse --enable-calender --enable-sysvsem=yes --enable-sysvshm=yes --enable-ftp --enable-magic-quotes --enable-gd-native-ttf --enable-versioning --enable-url-includes --enable-trans-id --enable-inline-optimization --with-iconv --enable-mbstring --enable-mbregex --with-gd --with-ttf --with-gettext --enable-sigchild --enable-module=so --enable-versioning --enable-url-includes --enable-trans-id --enable-inline-optimization --enable-bcmath --with-jpeg --with-png --with-zlib

=========safe_mode 비활성 모드도 아래 적어드리겠습니다. 참고사이트에 오타가 있어서, 참고사이트의 safe_mode 제외옵션을 그대로 복사해 넣으면 ./configure에 실패합니다.
./configure --prefix=/usr/local/php --with-exec-dir=/usr/bin --with-apxs2=/usr/local/apache/bin/apxs --with-apache-install=/usr/local/apache --with-mysql=/usr/local/mysql --with-config-file-path=/etc --disable-debug --enable-track-vars --enable-sockets --with-png-dir=/usr/lib --with-freetype-dir=/usr/include/freetype2 --with-mod_charset --with-charset=euc_kr --with-xml --with-language=korean --enable-mailparse --enable-calender --enable-sysvsem=yes --enable-sysvshm=yes --enable-ftp --enable-magic-quotes --enable-gd-native-ttf --enable-versioning --enable-url-includes --enable-trans-id --enable-inline-optimization --with-iconv --enable-mbstring --enable-mbregex --with-gd --with-ttf --with-gettext --enable-sigchild --enable-module=so --enable-versioning --enable-url-includes --enable-trans-id --enable-inline-optimization --enable-bcmath --with-jpeg --with-png --with-zlib
=================

그리고
중간에 에러가 나면 해당 패키지를 재설치 해 줍니다.
그냥 쿨하게 해주면 되잖아요..

저는 configure: error: xml2-config not found. Please check your libxml2 installation. 라는 에러가 떳습니다.
libxml2를 설치해줍시다.

yum -y install libxml2 libxml2-devel

또다시 에러가 떳습니다. configure: error: libpng.(a|so) not found.
libpng를 설치해 줍시다.

yum -y install libpng libpng-devel

또 에러가 떳습니다. configure: error: freetype.h not found.
freetype 설치해 주면 되죠..:D

yum -y install freetype freetype-devel


에러가 없이 끝났다면 make all을 합니다.
상당히 오래걸립니다..

make test도 해봅니다.. 위에서 safe_mode를 활성화 했다면 에러납니다!
+-----------------------------------------------------------+
| ! WARNING ! |
| You are running the test-suite with "safe_mode" ENABLED ! |
| |
| Chances are high that no test will work at all, |
| depending on how you configured "safe_mode" ! |
+-----------------------------------------------------------+

저는 safe_mode 비활성모드로 다시./configure + make all을 했으므로, 테스트 한번 해 보겠습니다.
참고로, make를 다시 하실경우, make clean을 반드시 해주고 다시 make all 을 하세요!

make test가 끝나면 다음과 같이 뜹니다.
====================================
You may have found a problem in PHP.
We would like to send this report automatically to the
PHP QA team, to give us a better understanding of how
the test cases are doing. If you don't want to send it
immediately, you can choose "s" to save the report to
a file that you can send us later.
Do you want to send this report now? [Yns]: n
====================================


이후, 설정파일을 복사해 줍니다. PHP는 샘플파일을 제공하는데, 이것을 그냥 사용해도 됩니다.
해당 파일은 소스압축을 푼 디렉토리에(설치 디렉토리가 아닙니다.. 소스 압출을 푼 디렉토리입니다.)
php.ini-developement 입니다.

저는 압축을 /tmp/apm_set/에 풀었고, ./configure시 --with-config-file-path=/etc 으로 옵션을 지정하였으므로
다음과 같이 복사했습니다.

[root@home]
[/tmp/apm_set/php-5.3.5] #cp /tmp/apm_set/php-5.3.5/php.ini-development /etc/php.ini



이젠 아파치와의 연동을 위해 httpd.conf를 수정해야합니다.
httpd.conf 원본 파일을 백업해 놓는것을 추천합니다.

httpd.conf파일을 vi 에디터로 열어 다음을 수정합니다.

우선, 약 100번째줄에 다음이 있음을 확인합니다. 없으면 php재설치를 해야 합니다.

LoadModule php5_module modules/libphp5.so


약 215번째 줄 <IfModule dir_module>에서 다음과 같이 index.htm과 index.php를 추가합니다.

<IfModule dir_module>
DirectoryIndex index.html index.htm index.php
</IfModule>


그리고 약 335번째 줄 <IfModule mime_module> 안에 다음을 추가해 줍니다.
이미 AddType가 두어개 있을테니, 그 아래에 추가해 줍니다.

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

저장종료후 httpd를 재시작 합니다.

/ets/init.d/httpd restart

다음과 같은 오류가 나오면 SELinux가 켜져 있기 때문에 오류가 발생하는 것입니다.
===========================
httpd: Syntax error on line 101 of /usr/local/apache/conf/httpd.conf: Cannot loa d /usr/local/apache/modules/libphp5.so into server: /usr/local/apache/modules/li bphp5.so: cannot restore segment prot after reloc: Permission denied
===========================
SELinux를 비활성해줘야 하는데, SELinux를 비활성하면 iptables파일이 초기화 됩니다.
iptables파일을 백업한 다음, 다시 복사해 넣으면 됩니다.

cp /etc/sysconfig/iptables /etc/sysconfig/iptables.backup

그리고 setup를 입력해서, 방화벽설정 -> SELinux 비활성화 에 체크해 줍니다.
이후 iptables를 확인해보면 초기화 되어 있을 것입니다.
백업해 놓은 iptables.backup파일을 iptables파일에 덮어 써 줍니다.

cp /etc/sysconfig/iptables.backup /etc/sysconfig/iptables

그러면 iptables 파일이 정상적으로 복구됩니다.
iptables를 재시작 해 주고 httpd를 다시 재시작 합니다.

service iptables restart

/etc/init.d/httpd restart


3. 설치확인
apache의 index파일 저장페이지에 test.php파일을 만들어 봅니다.
저는 /usr/local/server/apache/htdocs/가 index.html파일이 저장되는 곳이므로 다음과 같이 파일을 만들었습니다.

vi /usr/local/apache/htdocs/test.php

그리고 다음 함수를 넣어줬습니다.
<?php phpinfo(); ?>

저장 종료후, 인터넷 창에서 서버주소/test.php를 하면 자신이 설치한 php버전이 나오는 페이지가 뜹니다.
그 페이지가 뜨면 설치가 끝입니다

Posted by redkite
, |

0043. [리눅스] 커널 튜닝 관련 내용

다음은 모 웹사이트의 성능개선을 위한 커널 튜닝 사례입니다. 심심한 분들 한번 연구
를 해 보세요.(실은 나도 잘 모름) 저는 그냥 자료만 옮겨왔을 뿐입니다.

참고자료
http://www.apache.org/docs/misc/perf-tuning.html
web performance tunning - 오렐리

그렇지만 명심할 점이 있습니다. 웹사이트의 성능 개선을 위해서는 커널에서만 손대주
는 것이 아니라OS, 네트웍, 프로그래밍 등 다양한 조건을 같이 고려해야 한다는 것입
니다. 또한 하드웨어 성능을 고려하지 않은채 무작정 바꾸면문제가 생긴다는 것입니다.
또한 일반적으로 정적인 html서비스는 문제가 안되지만 성능의 병목지점이 생기는 곳
은 네트웍이아니라면 cgi일 경우가 많습니다. 아파치에 들어있는 ab, 유닉스의 time,
ping, netstat 등 다양한 명령어들을 이용해서 항상시스템의 상태를 모니터링해 보고
속도를 재어 보아야 합니다.
또한 아무리 튜닝을 잘해도 웹페이지에 이미지를 엄청나게넣어둔다면 헛일하는것이지
요. 저도 잘 모르면서 어설크게 오라클 튜닝을 한다고 했더니 cpu 4개, 메모리 2G인
시스템에서 오히려 일반PC보다 오라클이 더 느려지더 군요. 잘 모르는 경우에는 기본
값을 사용하는 것이 더 나을때도 있지요. 아래 예에서 keepalive옵션은 대형 사이트
같은 경우에 는 off로 해 놓는 것이 더 나은 경우도 많이 있습니다.
빨리 처리하고 연결을 빨리빨리 끊어주는 것이아무일도 하지 않은채 그냥 프로세스를
띄워놓고 놀리는 것보다는 낫지요.

문태준(taejun at
tunelinux.pe.kr http://tunelinux.pe.kr)


ㅇ 아파치 웹 서버 튜닝

아파치 웹 서버의 튜닝은 간략하게 두 부분으로 나눌 수 있다. 첫 번째는 소스코드에
하드코딩 되어 있는 제한 값을 조정하는 것이고, 두 번째는 환경설정 파일의 각 제한
값들을 수정하는 것이다.

1) 소스레벨
httpd.h 파일에 리눅스의 경우 HARD_SERVER_LIMIT 값이 256으로 기본 설정되어 있으며
, 이 값은 서버가 수용할 수 있는 최대 접 속을 의미한다.
이 값을 1280으로 설정한다.

2) 환경설정 파일
가. KeepAliveTimeout
클라이언트가 서버로 접속을 했을 경우 하나의 웹 서버 프로세스가 해당 웹 페이지의
여러 개체들의 전송을 새로운 프로세스를생성하지 않고 지속적으로 접속을 유지하며
담당하며, 이 클라이언트의 요청에 대한 타임아웃에 대한값이다. 기본 15초에서 30
초로 증가.

나. MaxKeepAliveRequests

웹 서버 프로세스가 지속적으로 접속을 유지하면서 처리할 수 있는 요청 개수이다.
100으로 설정되어 있으며, 10000으로 증가.

다. StartServer, Min/MaxSpareServer

기본 설정은 5, 5, 10정도이며, 웹 서버가 Standalone 방식일 경우 새로운 접속 요청
을 받으면기존의 Spare Child Process를 포크하여 새로운 Child Process를 만들어내므
로 기본적으로 Spare Process가 많을수록 폭주에 빨리 대처할 수 있다.

StartServer 2
0, MinSpareServer 20, MaxSpareServer 40으로 증가.

라. MaxRequestsPerChild

웹 서버 프로세스가 일정 횟수의 클라이언트 요청을 처리하고 종료되는 수치이며,
1000으로 증가.

마. MaxClients

동시에 실행될 수 있는 최대 프로세스 수를 제한하는 것이며, 기본 256으로 설정되어
있다. 이를512까지 증가.

바. 로그파일 생성


이용자가 접속할 때마다 기록되는 access_log 파일의 경우 한번 접속당 약 85바이트가증가
하며, 접속량이 많을 경우 이 파일의 크기는 실제로 엄청나다.
이럴 경우 접속때마다 로그파일을 액세스하는데 상당한 시간과 부하가걸리므로 로그
파일을 일정시간 마다 초기화하여 항상 경량화 시켜 줄 필요가 있다. 아파치에서 제공
하는 rotatelog를 이용.


ㅇ커널 소프트 레벨 튜닝

커널이 제공하는 파라메터값을 /proc 파일 시스템을 이용해서 부팅이 완료된 시점후에
변경한다. 여기서는 주로 파일시스템과 네트웍 자원에 관련된 내용에 대해서 튜닝한
다.

1) 파일 시스템 관련
- 리눅스 커널이 할당할 수 있는 파일 개수의 최대값 : 4096 -> 32768
- 리눅스 커널이 할당할 수 있는 inode 개수의 최대값 : 16384 -> 65536
- root 사용자에 대해 할당할 수 있는 파일 개수의 최대값 : 1024 -> 32768
- 하나의 프로세스가 오픈할 수 있는 파일의 개수 : 256 -> 512

2) 네트웍 자원 관련
- TCP 가 Keep Alive 메시지를 보내는 시간 간격 : 7200 -> 1200
- 소켓이 항상 CLOSE되기 전에 마지막 FIN 을 기다리는 시간 : 180 -> 30
- 하나의 TCP 접속 요청에 대해 응답을 재전송하는 횟수 : 7 -> 2

이렇게 설정되는 값들은 시스템이 부팅되면서 스크립트를 통해 설정되어야 되기 때문에
/etc/rc.d/rc.local 파일의 마지막 부분
에 정의된다.

ㅇ 커널 하드 레벨 튜닝

커널 소스를 직접 수정하여 제한값을 조정한다. 이를 위해서는 커널 컴파일이 필수적이며,
조심스런
접근이 필요하다.

- 파일 오픈 개수
- 처리할 수 있는 프로세스 개수




**참고


1. 아파치 웹 서버 튜닝
- apache/src/include/httpd.h:
HARD_SERVER_LIMIT 256 -> 1280
- apache/conf/httpd.conf:
MaxKeepAliveRequests 100 -> 10000
KeepAliveTimeout 15 -> 30
MinSpareServers 5 -> 20
MaxSpareServers 10 -> 40
StartServers 5 -> 20
MaxClients 256 -> 1024

2. 커널 소프트 레벨 튜닝
- ulimit -n 32768
- /proc/sys/fs/file-max: 4096 -> 32768
- /proc/sys/fs/inode-max: 16384 -> 65536
- /proc/sys/net/ipv4/tcp_keepalive_time: 7200 -> 1200
- /proc/sys/net/ipv4/tcp_fin_timeout: 180 -> 30
- /proc/sys/net/ipv4/tcp_sack: 1 -> 0
- /proc/sys/net/ipv4/tcp_timestamps: 1 -> 0
- /proc/sys/net/ipv4/tcp_syncookies: 0 -> 1
- /proc/sys/net/ipv4/tcp_retries1: 7 -> 2
- /proc/sys/net/ipv4/tcp_max_syn_backlog: 128 -> 8192
- /proc/sys/net/ipv4/tcp_window_scaling: 1-> 0

'02.서버-Linux' 카테고리의 다른 글

[리눅스]JAVA Path / FTP Port 변경  (0) 2012.12.19
[리눅스]APM 설치  (0) 2012.12.19
[리눅스]오픈 파일 개수 수정  (0) 2012.12.19
[리눅스]커널 파라메터  (0) 2012.12.19
[리눅스]아파치 사설 인증서 설치  (0) 2012.12.19
Posted by redkite
, |

0042. [리눅스] 오픈파일 갯수 지정

특정 프로그램을 구동 시킬려고 했더니 Too many open files라는 에러가 나오면서 구동이 되지 않았다.


ulimt -a로 확인 해보니 open files수가 1024로 되어 있는 것을 확인 할 수 있었다.


ulimt -n을 이용하여 open files 수를 4096으로 올려주니 정상적으로 프로그램이 구동이 되었다.

문제는 그 다음부터 나왔다. ulimit -n으로 변경 된 open files 수는 재부팅을 하거나 새로 로그인을 하게 되면 open files수가 1024로 되돌아 와 구동중인 데몬이 죽는 경우가 발생했다.


이것은 /etc/security/limits.conf라는 파일을 수정하여 해결 하였다.


위와 같이 수정을 하니 재부팅을 하거나 로그인을 새로 해도 open files 수는 4096이 되었다.

다른 자료들을 찾아보니 /etc/security/limits.conf 수정하는 방법은 다음과 같았다.
1. 특정 계정 Open files 수 변경 시(test 계정만 4096으로 변경 시)
test soft nofile 4096
test hard nofile 4096
2. 내것의 경우는 soft만 4096으로 변경해 주었는데 다른 OS의 경우 아래와 같이 권장 하는 경우
가 많았다.
* soft nofile 4096
* hard nofile 4096

그런데 /etc/security/limts.conf 수정은 성공적이었는데, 여기서 또 다른 문제가 나를 골치 아프게 했다. 다른 계정으로 로그인 한 후 root로 스위치 유저를 하면 문제가 없었는데 root로 바로 로그인을 하게 되면 open files수는 그대로 1024였던 것이다.

이유를 확인해 보니 limits.conf라는 파일은 PAM 모듈을 참조하는 것만 반영이 된다는 것을 확인 할 수 있었다.


/etc/pam.d 모듈을 vi로 열어 확인하니 su는 PAM 모듈을 사용하는 것을 확인 할 수 있었다. 이래서 스위치 유저 이후에는 정상적으로 반영이 되었던 거 같다.


결국 해결은 /root/.bash_profile(내경우 디폴트 프로파일로 bash를 사용)에 위와 같이 한 줄을 넣어 문제를 해결했다. 이렇게 하니 root 계정으로 로그인을 해도 open files 수는 4096으로 반영이 되었다.

'02.서버-Linux' 카테고리의 다른 글

[리눅스]APM 설치  (0) 2012.12.19
[리눅스]커널 튜닝 관련 내용  (0) 2012.12.19
[리눅스]커널 파라메터  (0) 2012.12.19
[리눅스]아파치 사설 인증서 설치  (0) 2012.12.19
[리눅스]아파치 번역  (0) 2012.12.19
Posted by redkite
, |

0041. [리눅스] 커널파라메터

## 산업은행 아파치 설정

MaxClients 8192

Timeout 150

KeepAlive On

MaxKeepAliveRequests 0

KeepAliveTimeout 3

## openfile 개수

open files 65535

## 산업은행 OS 커널 튜닝 설정

네트웍 보안을 위한 sysctl.conf 설정

# icmp redirects를 보내지 않는다.
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# proxy arp를 설정하지 않는다.
net.ipv4.conf.eth0.proxy_arp=0
net.ipv4.conf.lo.proxy_arp=0
net.ipv4.conf.default.proxy_arp=0
net.ipv4.conf.all.proxy_arp=0

# 게이트웨이로부터의 redirect를 허용하지 않음으로써 스푸핑을 막기 위해 설정한다.
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0

# 스푸핑을 막기 위해 source route 패킷을 허용하지 않는다.
# 소스 라우팅을 허용할 경우 악의적인 공격자가 IP 소스 라우팅을 사용해서 목적지의
# 경로를 지정할 수도 있고, 원래 위치로 돌아오는 경로도 지정할 수 있다. 이러한 소스 라우팅이
# 가능한 것을 이용해 공격자가 마치 신뢰받는 호스트나 클라이언트인 것처럼 위장할 수 있는 것이다.
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0

# Broadcast로부터 오는 핑을 차단함(Smurt 공격을 차단함).
net.ipv4.icmp_echo_ignore_broadcasts=1

# IP 나 TCP 헤더가 깨진 bad icmp packet을 무시한다.
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 자신의 네트워크가 스푸핑된 공격지의 소스로 쓰이는 것을 차단한다.
# 모든 인터페이스에서 들어오는 패킷에 대해 reply를 하여 들어오는 인터페이스로 나가지 못하는 패킷을 거부한다.
net.ipv4.conf.eth0.rp_filter=2
net.ipv4.conf.lo.rp_filter=2
net.ipv4.conf.default.rp_filter=2
net.ipv4.conf.all.rp_filter=2

# bootp 패킷을 허용하지 않는다.
net.ipv4.conf.eth0.bootp_relay=0
net.ipv4.conf.lo.bootp_relay=0
net.ipv4.conf.default.bootp_relay=0
net.ipv4.conf.all.bootp_relay=0

# 스푸핑된 패킷이나 소스라우팅, Redirect 패킷에 대해 로그파일에 정보를 남긴다.
net.ipv4.conf.eth0.log_martians=1
net.ipv4.conf.lo.log_martians=1
net.ipv4.conf.default.log_martians=1
net.ipv4.conf.all.log_martians=1

# 1/100초에 받아들이는 igmp "memberships"의 수
net.ipv4.igmp_max_memberships=1

# 매우 복잡한 사이트에서는 이 값을 늘리는 것도 가능하지만 64로 두는 것이 적당하며
# 더 늘렸을 경우에는 큰 문제가 발생할 수도 있다.
net.ipv4.ip_default_ttl=64

# 게이트웨이 서버가 아닌 이상 패킷을 포워딩 할 필요는 없다.
net.ipv4.ip_forward=0

# fragmented packet이 메모리에 존재하는 시간을 15초로 설정한다.
net.ipv4.ipfrag_time=15

# SYN_Flooding 공격에 대한 대비로 백로그큐(Backlog Queue)가 가득차면 다른 접속 요구를 받아들이지 못한다.
net.ipv4.tcp_max_syn_backlog = 1024

# TCP 연결에서 Three-way Handshake가 성공적으로 이루어지지 않으면 더 이상 소스 경로를 거슬러 올라가지 않도록한다.
# 따라서 적절한 연결 요청에 대해서만 연결을 맺는다.
# syncookies가 작동할 때 SYN Flooding 공격이 있으면 messages 파일에 아래와 같은 내용이 출력된다.
# possible SYN flooding on port 80. Sending cookies.
net.ipv4.tcp_syncookies = 1

# 일정한 시간과 IP별로 보내고 받는 SYN 재시도 횟수를 3회로 제한한다.
# 이 옵션은 스푸핑된(위조된) 주소로 오는 SYN 연결의 양을 줄여준다.
# 기본 값은 5(180 초에 대응)이며 255를 넘지 않아야 한다.
net.ipv4.tcp_syn_retries = 3

# passive TCP 접속시도가 재접속을 하기 위한 SYNACKs의 값을 정한다. 255 보다 높
# 게 지정할 수 없다. 기본값은 5이며, 180초에 대응이 된다.
net.ipv4.tcp_synack_retries = 3

# 무언가 문제가 있을 때 연결을 위해 재시도 할 횟수, 최소 값과 기본 값은 3이다.
net.ipv4.tcp_retries1=3

# TCP 연결을 끊기 전에 재시도할 횟수.
net.ipv4.tcp_retries2=7

# 연결을 종료시 소요되는 시간을 줄여준다(기본 설정값: 60).
net.ipv4.tcp_fin_timeout=20

# 동시에 유지 가능한 timewait 소켓의 수이다.
# 만약 지정된 숫자를 초과하였을 경우에는 timewait 소켓이 없어지며 경고 메시지가 출력된다.
# 이 제한은 단순한 DoS 공격을 차단하기 위해 존재하는데, 임의로 이 값을 줄여서는 안되며
# 메모리가 충분하다면 적절하게 늘려주는 것이 좋은데, 64M 마다 180000으로 설정하면 된다.
# 따라서 256M일 경우에는 256/4=4 4*180000=720000
# 64M -> 180000
# 128M -> 360000
# 256M -> 720000
# 512M -> 1440000
# 1G -> 2880000
# 2G -> 5760000
# 4G -> 11520000
# 8G -> 23040000
#net.ipv4.tcp_max_tw_buckets = 23040000
# 연결이 끊어졌다고 판단할 때까지, 얼마나 keepalive probe 를 보낼지 결정. 기본값 9회
# 간단한 DoS 공격을 막아준다.
net.ipv4.tcp_keepalive_probes=2

# keepalive 가 활성되 되어 있을 경우, 얼마나 자주 TCP 가 keepalive 메세지를 보
# 내게 할 것인지를 설정.
net.ipv4.tcp_keepalive_time=30

# keepalive_probes 를 보낼 간격을 정함. probe 를 보낸 후, probes * intvl 의 시
# 간이 지나도록 응답이 없으면 연결이 해제된 것으로 간주하게 됨. 기본 값의 사용
# 시 11분 15초 동안 재시도를 하고 연결을 취소함. 값은 초단위
net.ipv4.tcp_keepalive_intvl = 10

# 서버 쪽에서 닫은 TCP 연결을 끊기 전에 확인하는 횟수를 정한다. 기본 값은 7 로
# RTO 50 초에서 16 분 사이에 해당한다. 웹 서버가 운영 중 이라면 이 값을 줄여서
# 소켓 등이 귀한 리소스를 소비하지 않도록 할 수도 있다.
net.ipv4.tcp_orphan_retries = 2

# SYN 패킷을 전송한 후에 로스가 발생을 하여 ACK 를 일부 받지 못했을 경우, 선택
# 적으로 (selected) 받지못한 ACK 만 받도록 요청하는 것을 허락한다. 로스가 많은
# 네트워크에서는 상당히 중요한 역할을 한다.
net.ipv4.tcp_sack = 1


<< 리눅스 5.5. 설정 >> ## 광주은행 테스트 적용
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1

# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536

# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

# icmp redirects를 보내지 않는다.
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# proxy arp를 설정하지 않는다.
net.ipv4.conf.eth0.proxy_arp=0
net.ipv4.conf.lo.proxy_arp=0
net.ipv4.conf.default.proxy_arp=0
net.ipv4.conf.all.proxy_arp=0

# 게이트웨이로부터의 redirect를 허용하지 않음으로써 스푸핑을 막기 위해 설정한다.
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0

# 스푸핑을 막기 위해 source route 패킷을 허용하지 않는다.
# 소스 라우팅을 허용할 경우 악의적인 공격자가 IP 소스 라우팅을 사용해서 목적지의
# 경로를 지정할 수도 있고, 원래 위치로 돌아오는 경로도 지정할 수 있다. 이러한 소스 라우팅이
# 가능한 것을 이용해 공격자가 마치 신뢰받는 호스트나 클라이언트인 것처럼 위장할 수 있는 것이다.
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0

# Broadcast로부터 오는 핑을 차단함(Smurt 공격을 차단함).
net.ipv4.icmp_echo_ignore_broadcasts=1

# IP 나 TCP 헤더가 깨진 bad icmp packet을 무시한다.
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 자신의 네트워크가 스푸핑된 공격지의 소스로 쓰이는 것을 차단한다.
# 모든 인터페이스에서 들어오는 패킷에 대해 reply를 하여 들어오는 인터페이스로 나가지 못하는 패킷을 거부한다.
net.ipv4.conf.eth0.rp_filter=2
net.ipv4.conf.lo.rp_filter=2
net.ipv4.conf.default.rp_filter=2
net.ipv4.conf.all.rp_filter=2

# bootp 패킷을 허용하지 않는다.
net.ipv4.conf.eth0.bootp_relay=0
net.ipv4.conf.lo.bootp_relay=0
net.ipv4.conf.default.bootp_relay=0
net.ipv4.conf.all.bootp_relay=0

# 스푸핑된 패킷이나 소스라우팅, Redirect 패킷에 대해 로그파일에 정보를 남긴다.
net.ipv4.conf.eth0.log_martians=1
net.ipv4.conf.lo.log_martians=1
net.ipv4.conf.default.log_martians=1
net.ipv4.conf.all.log_martians=1

# 1/100초에 받아들이는 igmp "memberships"의 수
net.ipv4.igmp_max_memberships=1

# 매우 복잡한 사이트에서는 이 값을 늘리는 것도 가능하지만 64로 두는 것이 적당하며
# 더 늘렸을 경우에는 큰 문제가 발생할 수도 있다.
net.ipv4.ip_default_ttl=64

# 게이트웨이 서버가 아닌 이상 패킷을 포워딩 할 필요는 없다.
net.ipv4.ip_forward=0

# fragmented packet이 메모리에 존재하는 시간을 15초로 설정한다.
net.ipv4.ipfrag_time=15

# SYN_Flooding 공격에 대한 대비로 백로그큐(Backlog Queue)가 가득차면 다른 접속 요구를 받아들이지 못한다.
net.ipv4.tcp_max_syn_backlog = 1024

# TCP 연결에서 Three-way Handshake가 성공적으로 이루어지지 않으면 더 이상 소스 경로를 거슬러 올라가지 않도록한다.
# 따라서 적절한 연결 요청에 대해서만 연결을 맺는다.
# syncookies가 작동할 때 SYN Flooding 공격이 있으면 messages 파일에 아래와 같은 내용이 출력된다.
# possible SYN flooding on port 80. Sending cookies.
net.ipv4.tcp_syncookies = 1

# 일정한 시간과 IP별로 보내고 받는 SYN 재시도 횟수를 3회로 제한한다.
# 이 옵션은 스푸핑된(위조된) 주소로 오는 SYN 연결의 양을 줄여준다.
# 기본 값은 5(180 초에 대응)이며 255를 넘지 않아야 한다.
net.ipv4.tcp_syn_retries = 3

# passive TCP 접속시도가 재접속을 하기 위한 SYNACKs의 값을 정한다. 255 보다 높
# 게 지정할 수 없다. 기본값은 5이며, 180초에 대응이 된다.
net.ipv4.tcp_synack_retries = 3

# 무언가 문제가 있을 때 연결을 위해 재시도 할 횟수, 최소 값과 기본 값은 3이다.
net.ipv4.tcp_retries1=3

# TCP 연결을 끊기 전에 재시도할 횟수.
net.ipv4.tcp_retries2=7

# 연결을 종료시 소요되는 시간을 줄여준다(기본 설정값: 60).
net.ipv4.tcp_fin_timeout=20

# 동시에 유지 가능한 timewait 소켓의 수이다.
# 만약 지정된 숫자를 초과하였을 경우에는 timewait 소켓이 없어지며 경고 메시지가 출력된다.
# 이 제한은 단순한 DoS 공격을 차단하기 위해 존재하는데, 임의로 이 값을 줄여서는 안되며
net.ipv4.tcp_max_tw_buckets = 23040000

# 연결이 끊어졌다고 판단할 때까지, 얼마나 keepalive probe 를 보낼지 결정. 기본값 9회
# 간단한 DoS 공격을 막아준다.
net.ipv4.tcp_keepalive_probes=2

# keepalive 가 활성되 되어 있을 경우, 얼마나 자주 TCP 가 keepalive 메세지를 보
# 내게 할 것인지를 설정.
net.ipv4.tcp_keepalive_time=30

# keepalive_probes 를 보낼 간격을 정함. probe 를 보낸 후, probes * intvl 의 시
# 간이 지나도록 응답이 없으면 연결이 해제된 것으로 간주하게 됨. 기본 값의 사용
# 시 11분 15초 동안 재시도를 하고 연결을 취소함. 값은 초단위
net.ipv4.tcp_keepalive_intvl = 10

# 서버 쪽에서 닫은 TCP 연결을 끊기 전에 확인하는 횟수를 정한다. 기본 값은 7 로
# RTO 50 초에서 16 분 사이에 해당한다. 웹 서버가 운영 중 이라면 이 값을 줄여서
# 소켓 등이 귀한 리소스를 소비하지 않도록 할 수도 있다.
net.ipv4.tcp_orphan_retries = 2

# SYN 패킷을 전송한 후에 로스가 발생을 하여 ACK 를 일부 받지 못했을 경우, 선택
# 적으로 (selected) 받지못한 ACK 만 받도록 요청하는 것을 허락한다. 로스가 많은
# 네트워크에서는 상당히 중요한 역할을 한다.
net.ipv4.tcp_sack = 1

Linux TCP Tuning

There are a lot of differences between Linux version 2.4 and 2.6, so first we'll cover the tuning issues that are the same in both 2.4 and 2.6. To change TCP settings in, you add the entries below to the file /etc/sysctl.conf, and then run "sysctl -p".

Like all operating systems, the default maximum Linux TCP buffer sizes are way too small. I suggest changing them to the following settings:

# increase TCP max buffer size setable using setsockopt() net.core.rmem_max = 33554432 net.core.wmem_max = 33554432 # increase Linux autotuning TCP buffer limits # min, default, and max number of bytes to use # set max to at least 4MB for 1G, and 32M for 10G net.ipv4.tcp_rmem = 4096 87380 33554432 net.ipv4.tcp_wmem = 4096 65536 33554432

You should also verify that the following are all set to the default value of 1

sysctl net.ipv4.tcp_window_scaling sysctl net.ipv4.tcp_timestamps sysctl net.ipv4.tcp_sack

Note: you should leave tcp_mem alone. The defaults are fine.

You can achieve increases in bandwidth of up to 10x by doing this on some long, fast paths. This is only a good idea for Gigabit Ethernet connected hosts, and may have other side effects such as uneven sharing between multiple streams.

Also, I've been told that for some network paths, using the Linux 'tc' (traffic control) system to pace traffic out of the host can help improve total throughput.

Linux 2.6

Starting in Linux 2.6.7 (and back-ported to 2.4.27), linux includes alternative congestion control algorithms beside the traditional 'reno' algorithm. These are designed to recover quickly from packet loss on high-speed WANs.

Linux 2.6 also includes and both send and receiver-side automatic buffer tuning (up to the maximum sizes specified above). There is also a setting to fix the ssthresh caching weirdness described below.

There are a couple additional sysctl settings for 2.6:

# don't cache ssthresh from previous connection net.ipv4.tcp_no_metrics_save = 1 # recommended to increase this for 10G NICS net.core.netdev_max_backlog = 30000

Starting with version 2.6.13, Linux supports pluggable congestion control algorithms . The congestion control algorithm used is set using the sysctl variable net.ipv4.tcp_congestion_control, which is set to bic/cubic or reno by default, depending on which version of the 2.6 kernel you are using.

To get a list of congestion control algorithms that are available in your kernel, run:

sysctl net.ipv4.tcp_available_congestion_control

The choice of congestion control options is selected when you build the kernel. The following are some of the options are available in the 2.6.23 kernel:

  • reno: Traditional TCP used by almost all other OSes. (default)
  • cubic: CUBIC-TCP (NOTE: There is a cubic bug in the Linux 2.6.18 kernel used by Redhat Enterprise Linux 5.3 and Scientific Linux 5.3. Use 2.6.18.2 or higher!)
  • bic: BIC-TCP
  • htcp: Hamilton TCP
  • vegas: TCP Vegas
  • westwood: optimized for lossy networks

If cubic and/or htcp are not listed when you do 'sysctl net.ipv4.tcp_available_congestion_control', try the following, as most distributions include them as loadable kernel modules:

/sbin/modprobe tcp_htcp /sbin/modprobe tcp_cubic

For long fast paths, we highly recommend using cubic or htcp. Cubic is the default for a number of Linux distributions, but if is not the default on your system, you can do the following:

sysctl -w net.ipv4.tcp_congestion_control=cubic

On systems supporting RPMS, You can also try using the ktune RPM, which sets many of these as well.

More information on each of these algorithms and some results can be found here .

More information on tuning parameters and defaults for Linux 2.6 are available in the file ip-sysctl.txt, which is part of the 2.6 source distribution.

Warning on Large MTUs: If you have configured your Linux host to use 9K MTUs, but the connection is using 1500 byte packets, then you actually need 9/1.5 = 6 times more buffer space in order to fill the pipe. In fact some device drivers only allocate memory in power of two sizes, so you may even need 16/1.5 = 11 times more buffer space!

And finally a warning for both 2.4 and 2.6: for very large BDP paths where the TCP window is > 20 MB, you are likely to hit the Linux SACK implementation problem. If Linux has too many packets in flight when it gets a SACK event, it takes too long to located the SACKed packet, and you get a TCP timeout and CWND goes back to 1 packet. Restricting the TCP buffer size to about 12 MB seems to avoid this problem, but clearly limits your total throughput. Another solution is to disable SACK.

Linux 2.4

Starting with Linux 2.4, Linux implemented a sender-side autotuning mechanism, so that setting the optimal buffer size on the sender is not needed. This assumes you have set large buffers on the receive side, as the sending buffer will not grow beyond the size of the receive buffer.

However, Linux 2.4 has some other strange behavior that one needs to be aware of. For example: The value for ssthresh for a given path is cached in the routing table. This means that if a connection has has a retransmission and reduces its window, then all connections to that host for the next 10 minutes will use a reduced window size, and not even try to increase its window. The only way to disable this behavior is to do the following before all new connections (you must be root):

sysctl -w net.ipv4.route.flush=1

Another thing you can to help increase TCP throughput in 2.4 with 1000BT NICs is to increase the size of the interface queue. To do this, do the following:

ifconfig eth0 txqueuelen 1000

More information on various tuning parameters for Linux 2.4 are available in the Ipsysctl tutorial .

[출처] SYSTEM Engineer 깽애니네 (리눅스, 윈도우, 보안, DDOS, 네트워크, 프로그래밍) - http://www.chonnom.com/bbs/board.php?bo_table=B19&wr_id=116

Posted by redkite
, |

0040. [리눅스] 아파치 사설 인증서 설치

apache 2.x에 사설 ssl 인증서 설치하기

아파치와 mod_ssl에 연동하는 부분에 대해서는 따로 설명하지 않겠습니다.

개인키 생성
openssl genrsa -des3 -out server.key 1024

csr 키 생성
openssl req -new -key server.key -out server.csr

개인키에서 패스워드 삭제하기
openssl rsa -in server.key -out server.key.insecure
mv server.key server.key.secure
mv server.key.insecure server.key

CA 인증서 생성

openssl x509 -req -days 1280 -in server.csr -signkey server.key -out server.crt

apache 2.x 설정

Include conf/extra/httpd-ssl.conf 주석 해제

httpd-ssl.conf 설정

<VirtualHost 192.168.100.1>

# General setup for the virtual host
DocumentRoot "/www/test"
ServerName www.test.com
ServerAdmin sysadmin@test.com
ErrorLog "/logs/test.com-error_log"
TransferLog "/logs/test.com-access_log"

# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on

SSLCertificateFile "/usr/local/apache2/conf/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"


마지막으로 아파치를 재구동 해줍니다.
/usr/local/apache2/bin/apachectl restart

https://도메인 접속

'02.서버-Linux' 카테고리의 다른 글

[리눅스]오픈 파일 개수 수정  (0) 2012.12.19
[리눅스]커널 파라메터  (0) 2012.12.19
[리눅스]아파치 번역  (0) 2012.12.19
[리눅스]하드디스크 점검  (0) 2012.12.19
[리눅스]Core 분석  (0) 2012.12.19
Posted by redkite
, |

0039. [리눅스] 아파치 번역

$1. httpd.conf파일 설정

1) 위치

-소스설치시:/usr/local/etc/httpd/conf/httpd.conf
-rpm설치시:/etc/httpd/conf/httpd.conf
#############################################################################
#
# 아파치 버전 1.3.12
#
# 번역 및 조언 : 이 만 용
#
# 번역 상의 오류나 더 매끄러운 번역을 위한 제안 사항은 언제나
# 환영합니다. 여러분께 감사합니다.
#
#############################################################################
#
# 베테랑 아파치 서버 관리자들에게 보내는 메시지)
# -----------------------------------------------
#
# 아파치 설정 파일은 전통적으로 httpd.conf, srm.conf, access.conf 이렇게
# 3 개로 구성되어 있다. 그러나 내부적으로는 3 개의 파일에 대한 구별을
# 하지 않고 순차적으로 읽어나갈 뿐이다.
#
# 3 개의 파일 내용은 관례적인 것일 뿐이다. 아파치 신 버전부터는 모든
# 설정 내용이 하나의 거대한 파일 httpd.conf에 들어 있고 나머지 두 파일은
# 빈 파일로 제공되고 있다.
#
# 이런 사실을 알아두기 바란다.
#
#############################################################################
#
# 팁)
#
# 1) 문제가 발생했을 때에는 httpd.conf (srm.conf, access.conf) 설정 파일의
# 문법을 제대로 지켰는지 먼저 점검하고 다른 아파치 관리자들에게 도움을
# 요청하는 것이 좋습니다.
#
# /usr/sbin/httpd 명령에 -t 옵션을 주면 문법만 점검합니다.
# 기타 다른 옵션에 대하여 알고 싶을 때에는 -h 옵션을 사용하십시오.
#
# 예1) 문제가 없는 경우
#
# # /usr/sbin/httpd -t
# Syntax OK
#
# 예2) 설정에 실수가 있는 경우
#
# #/usr/sbin/httpd -t
# Syntax error on line 91 of /etc/httpd/conf/httpd.conf:
# ServerType must be either 'inetd' or 'standalone'
#
#
# 2) IP 주소 하나에 여러 개의 이름을 부여한 가상 호스트 예제를
# 설정 파일 후반부에 수록하였습니다.
#
#############################################################################
# --
#
# 간단한 용어 정리)
#
# --
#
# Rob McCool 씨의 NCSA 서버 설정 파일에 기초한 것임.
#
# 이 파일은 아파치(Apache) 서버 주 설정 파일이다. 이 파일에 들어있는
# 설정 지시자(directive)를 통해 서버의 작동 방식을 지시한다.
# 각 지시자에 대한 자세한 정보를 원하면 http://www.apache.org/docs를
# 참고하라.
#
# 정확한 이해 없이 대충 읽어나가는 일이 없도록 하자. 여기에 적은 내용을
# 그대로 여러분의 상황에 적용시키려 하지 말라. 다음 내용은 실제 지시
# 내용을 위한 힌트라고만 생각하자. 내용에 대하여 의문이 있을 때에는
# 온라인 문서를 참조하라. 이 사실에 대하여 지금 여러분에게 충분히
# 경고해 두었음을 밝히는 바이다.
#
# 아파치 서버는 이 파일을 읽고 난 후, /home/httpd/conf/srm.conf 파일을
# 처리하고 그 다음 /home/httpd/conf/access.conf 파일을 읽는다.
# 지금 현재 이 설정 파일 안에서 ResourceConfig, AccessConfig 지시자를 사용하여
# 설정 파일 이름을 바꾸면, 변경된 이름의 설정 파일을 읽는다.
# (여기서 /home/httpd 부분은 아파치 서버의 기본 디렉토리로 대체하여
# 생각하면 된다. 예를 들어 여러분이 직접 아파치를 컴파일하여 설치하는
# 경우에는 일반적으로 /usr/local/apache 가 된다. 컴파일하여 직접 설치할
# 때에는 패키지와 충돌되지 않도록 둘 중 하나만 사용하라.)
#
# 지시자는 3 개의 기본적인 섹션으로 묶여 있다:
#
# 1. 아파치 서버 프로세스의 전반적인 작동을 제어하는 지시자
# ('global environment, 전체 환경')
#
# 2. 가상 호스트에 의해 처리되지 않는 요청을 모두 처리하는 주 서버 또는
# 기본 서버의 작동을 제어하는 지시자.
#
# 이 지시자 내용은 모든 가상 호스트의 기본값이기도 하다.
# 3. 다른 IP 주소 또는 다른 호스트 이름에 대한 요청을 처리할 가상
# 호스트 설정
#
# 설정 파일과 로그 파일 이름 : 만약 파일 이름이 "/"로 (또는 Win32 버전의
# 경우 "드라이브명:/" ) 시작하면 주어진 파일 이름 그대로를 사용한다.
# 그러나 "/" 로 시작하지 않을 때에는 ServerRoot 의 값이 그 앞에 추가된다.
# 따라서 "logs/foo.log"는 ServerRoot 값 (예를 들어 "/usr/local/apache")이
# 앞에 추가되어 서버는 최종적으로 "/usr/local/apache/logs/foo.log"를
# 사용한다.
#
#############################################################################
### 섹션 1 : 전체 환경 (Global Environment)
#
# 이 섹션에 적힌 지시자는 예를 들어 아파치 서버가 처리할 수 있는 동시
# 요청의 갯수라든지 다른 설정 파일의 이름 등 아파치 서버의 전반적인
# 작동에 영향을 미친다.
#
#
# 서버 유형(ServerType)은 inetd 또는 standalone 둘 중 하나이다.
# inetd 방식은 유닉스 플랫폼에서만 지원된다.
#
ServerType standalone
서버의 타입을 지정 stanadalone은 httpd데몬 프로세스가
사용자의 요쳥을 처리하는 것이고 inetd는 inetd 데몬 프로세스가 처리하게
하는 것 stanadalone가 더 효율적
#
# 서버 루트(ServerRoot) : 서버의 설정 파일, 에러 파일, 로그 파일이
# 기록되는 디렉토리의 최상위 경로명.
#
# 주의! 만약 서버 루트를 NFS (또는 기타 네트웍 파일 시스템) 마운트된
# 곳에 두고자 한다면 LockFile 문서를 꼭 읽어보아야 한다.
# ();
# 문서를 읽고 나면 앞으로 닥칠 지 모르는 몇 가지 문제점을 피할 수 있다.
#
# 디렉토리 경로 뒤에 슬래쉬(/) 문자를 쓰지 않는다!!!
#
ServerRoot "/usr/local/etc/httpd"
서버의 Root 디렉토리를 지정
#
# LockFile 지시자는 아파치를 USE_FCNTL_SERIALIZED_ACCEPT 또는
# USE_FLOCK_SERIALIZED_ACCEPT 옵션을 주고 컴파일한 경우, 잠금 파일을
# 경로를 지정할 때 사용한다. 이 지시자 값은 일반적으로 기본값이
# 되도록 놔둔다. 이 값을 바꾸는 경우는 로그 디렉토리가 NFS 마운트된
# 곳에 있는 경우로서 잠금 파일은 항상 네트웍 파일 시스템이 아닌
# 로컬 디스크에 저장되어야 하기 때문이다. 주 서버 프로세서의 PID 값이
# 자동으로 파일 이름 뒤에 붙는다.
#
#LockFile /usr/local/etc/httpd/logs/httpd.lock
잠금 파일의 위치를 설정
#
# PidFile: 서버가 시동될 때 자신의 프로세스 고유 번호를 기록할 파일
#
#PidFile /usr/local/etc/httpd/logs/httpd.pid
서버가 실행될때 프로세스 ID를 기록할 파일 지정
#
#ScoreBoardFile: 내부 서버 프로세스 정보를 기록하는데 사용하는 파일.
# 모든 아키텍쳐에서 꼭 필요한 것은 아니다. 하지만 필요하다고 생각하는
# 경우에는 하나의 아파치 프로그램을 두 번 이상 실행시키는 경우 값이
# 중복되지 않도록 해주는 것만 잊지 않으면 된다.
#
ScoreBoardFile /usr/local/etc/httpd/logs/httpd.scoreboard
서버에서 실행되고 있는 파일의 정보 기록
#
# 표준 설정에서 서버는 httpd.conf, src.conf, access.conf 파일을
# 차례대로 읽어나간다. 나중에 있는 2 개의 파일은 현재 아무 내용도
# 없는 빈 상태로 배포되고 있다. 왜냐하면 모든 지시자를 그냥 하나의
# 파일에 적는 것이 더욱 명료하기 때문이다. 주석으로 처리되어 있는
# 값은 기본값이다. 서버가 이 파일 내용을 무시하도록 하기 위해서는
# "/dev/null" (유닉스의 경우) 또는 "nul" (Win32) 값을 지정한다.
#
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf
두 파일을 별도로 사용하고자 한다면 주석제거,
httpd.conf로 두 파일이 통합
#
# Timeout: 받기/보내기 타임 아웃 시간
#
Timeout 300
클라이언트가 정보를 받을때 까지 소요되는 대기시간 단위(초)
네트워크가 응답이 늦을 수록 수치를 늘리는 것이 좋음
#
# KeepAlive: 지속성(persistent) 접속을 허가할 것인가 말 것인가?
# (한 번의 접속에서 여러 개의 요청을 처리할 것인가 여부)
# 허가하지 않기 위해서는 "Off"로 설정한다.
# 허가하지 않는 것과 허가하는 것과의 효율 차이는 매우 크다.
#
KeepAlive On
접속된 채로 특별한 요청이 없어도 계속 연결 유지 (Off)
#
# MaxKeepAliveRequests: 지속성 접속 기간 동안 처리할 수 있는 최대 요청 갯수
# 0 을 넣으면 무한대이다. 높은 성능을 내기 위해서 높은 값을 추천한다.
#
MaxKeepAliveRequests 100
지속적인 접속 동안에 허용할 최대 요청 횟수
on:허용 off:1회만
#
# KeepAliveTimeout: 같은 접속 상태에서 같은 클라이언트의 요청이 타임 아웃되는
# 시간 (초 단위)
#
KeepAliveTimeout 15
똑같은 클라이언트가 같은 접속 방법으로 다음 요청을 했을 때
기다리는 시간
#
# 서버 풀(Server-pool) 크기 조정. 몇 개의 프로세스가 필요한지 여러분에게
# 추측하도록 하기 보다는 현재의 부하 상태에 자동으로 적응하도록 되어 있다.
# 아파치 서버는 현재의 부하 상태와 순간적으로 급격히 상승하는 경우 값
# (예를 들어 하나의 네스케이프 브라우져에서 동시에 여러 개의 요청이
# 들어올 수 있다)을 처리할 수 있는 충분한 갯수의 서버 프로세스를 유지하려
# 노력한다.
#
# 아파치 서버는 주기적으로 몇 개의 서버가 요청 대기 상태인지 점검한다.
# 만약 MinSpareServers 보다 적다면 여유 서버 프로세스를 생성한다.
# 만약 MaxSpareServers 보다 많으면 불필요한 여유 프로세스를 제거한다.
# 이 곳에 제시된 기본값은 거의 대부분의 사이트에 적합하다.
#

MinSpareServers 16
MaxSpareServers 64
프로세스 개수 조절
MinSpareServers=<프로세스=
Listen 80
Listen 443

#
# 서버 프로세스의 최대값, 즉 동시에 접속할 수 있는 클라이언트 갯수를
# 제한하는 값이다. -- 만약 이 값에 도달한다면 클라이언트의 요청은
# 봉쇄될 것이다. 따라서 이 값이 너무 낮아서는 안된다. 이 값은
# 아파치 서버가 너무 많은 자원을 소비하여 전체 시스템을 먹통이 되도록
# 하는 것을 방지하기 위해 사용될 뿐이다.
#
MaxClients 150
클라이언트의 동시 접속수

#
# MaxRequestsPerChild: 각 자식 프로세스가 죽기 전까지 처리할 수 있는
# 요청 갯수. 한 프로세스가 너무 오랫 동안 사용되면 메모리 누출이나
# 자원 누출(아파치 때문에 또는 잘못된 라이브러리 때문에)이 발생할 수
# 있으므로 자식 프로세스는 자동으로 죽는다. 대부분의 시스템에서는
# 필요치 않으나 솔라리스에서와 같이 라이브러리에서의 자원 누출 현상을
# 막기 위해 필요하다. 제한을 두지 않으려면 0 으로 설정한다.
#
MaxRequestsPerChild 100
자식 프로세스가 죽기 전에 처리할 수 있는 요청 개수
#
# Listen: 아파치를 기본값 이외에도 특정 IP 주소 또는 포트에 연결하도록
# 해준다. 지시자도 참고하라.
#
#Listen 3000
#Listen 12.34.56.78:80
아파치 기본 설정에IP주소 또는 IP와 포트를 결합하여 사용
가상호스트 운용시
#
# BindAddress: 이 옵션을 사용하여 가상 호스트를 지원할 수 있다.
# 이 지시자를 이용하여 서버가 귀기울일 IP 주소를 지시할 수 있다.
# "*", IP 주소, 또는 완전한 인터넷 도메인 이름을 사용할 수 있다.
# , Listen 지시자도 참고하라.
#
#BindAddress *
서버가 어느IP에 귀기울여야 하는지를 나타냄 가상호스트시
*로 지정
#
# 동적 공유 객체(Dynamic Shared Object, DSO) 지원
#
# DSO 방식으로 만들어진 모듈의 기능을 사용하기 위해서는 그 기능에 관련된
# 지시자를 사용하기에 앞서 알맞게 `LoadModule' 지시자로 모듈을
# 지시해주어야 한다. DSO 작동방식에 대하여 자세히 알고 싶은 사람은
# 아파치 1.3 배포 파일의 README.DSO 를 읽어보라. 여러분이 갖고 있는
# httpd 바이너리에 내장된(정적으로 링크되어 항상 사용가능한) 모듈 목록을
# 알고 싶을 때에는 `httpd -l' 명령을 실행한다.
#
# 주의: 모듈을 적재하는 순서는 매우 중요하다. 전문가의 조언 없이
# 아무렇게나 순서를 바꾸지 말라.
#
# 예:
# LoadModule foo_module libexec/mod_foo.so
#
# 모듈 관련 문서는 HTML 형식으로 "/home/httpd/manual/mod" 에 놓아두었다.
#
# 주의: LoadModule 설정을 하나라도 바꾸었다면 LoadModule 설정 뒤에 따라
# 나오는 AddModule 설정도 똑같이 바꾸어주기 바란다.
#
#LoadModule mmap_static_module modules/mod_mmap_static.so
LoadModule env_module modules/mod_env.so
LoadModule config_log_module modules/mod_log_config.so
LoadModule agent_log_module modules/mod_log_agent.so
LoadModule referer_log_module modules/mod_log_referer.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule status_module modules/mod_status.so
LoadModule info_module modules/mod_info.so
LoadModule includes_module modules/mod_include.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule asis_module modules/mod_asis.so
LoadModule imap_module modules/mod_imap.so
LoadModule action_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule proxy_module modules/libproxy.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule access_module modules/mod_access.so
LoadModule auth_module modules/mod_auth.so
LoadModule anon_auth_module modules/mod_auth_anon.so
#LoadModule dbm_auth_module modules/mod_auth_dbm.so
LoadModule db_auth_module modules/mod_auth_db.so
LoadModule digest_module modules/mod_digest.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule example_module modules/mod_example.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
<
LoadModule ssl_module modules/libssl.so

#
# 확장 모듈
#
#LoadModule php_module modules/mod_php.so
#
# 다음 모듈은 MySQL 데이터베이스와 더불어 서버 스크립팅 언어로 인기를
# 누리고 있는 PHP3 모듈입니다.
#
# 참고 사이트 : http://www.php.net
#
# 주의 : 설정을 바꾸고 나서 한 가지 할 일이 더 있다.
#
# AddType application/x-httpd-php3 .php3
#
# 위와 같은 행을 찾아서 주석을 풀어주어야 한다.
#
LoadModule php3_module modules/libphp3.so
#
# 다음 모듈은 아파치 펄 모듈로서 CGI 스크립트로 펄을 많이 사용하는
# 사람들에게 펄 코드 실행 속도의 향상을 가져다 줍니다.
#
# 주의 : 설정을 바꾼 후 한 가지 할 일이 더 있다.
#
# ...
#
# 위와 같은 설정을 찾아서 펄 스크립트를 사용할 수 있는
# 디렉토리를 설정해주어야 한다.
#
LoadModule perl_module modules/libperl.so
#
# 모듈 실행 순서를 정확하게 하기 위해 사용 가능한 모듈(정적 또는 공유
# 모듈 포함)로부터 완전한 목록을 다시 만들어 둔 것이다.
# [LOADMODULE 섹션을 하나라도 수정했다면 이 부분도 역시 알맞게 수정하라]
#
ClearModuleList
#AddModule mod_mmap_static.c
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_log_agent.c
AddModule mod_log_referer.c
#AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
#AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_proxy.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
#AddModule mod_auth_dbm.c
AddModule mod_auth_db.c
AddModule mod_digest.c
#AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
#AddModule mod_example.c
#AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c

AddModule mod_ssl.c

# Extra Modules
#AddModule mod_php.c
AddModule mod_php3.c
AddModule mod_perl.c
#
# ExtendedStatus 지시자는 "server-status" 처리기가 호출되었을 때
# 아파치가 "매우 자세한" 상태 정보를 생성시킬 것인지
# (ExtendedStatus On) 아니면 매우 기본적인 정보만 생성시킬 것인지를
# (ExtendedStatus Off) 제어한다. 기본값은 Off 이다.
#
#ExtendedStatus On
#############################################################################
### 섹션 2: '주(Main)' 서버 설정
#
# 이 섹션에 있는 지시자는 정의에 의해 처리되지 않는
# 모든 요청에 응답할 '주' 서버가 사용할 값을 정한다.
# 이 값들은 또한 이 파일 뒷 부분에서 정의할 모든
# 컨테이너의 기본값을 제공하기도 한다.
#
# 여기 나오는 모든 지시자는 컨테이너 안에서도 사용할
# 수 있으며 그 안에서 사용되면 해당 가상 호스트에 대하여 전체
# 기본값을 무시하고 새롭게 정한 값이 채택된다.
#
#
# 만약 ServerType ('Global Environment' 섹션에서 설정)이 "inetd"인
# 경우, inetd 설정 내용을 따르기 때문에 다시 몇 가지 지시자는
# 아무런 효력을 발휘하지 않는다.
# ServerAdmin 지시자까지 그냥 건너뛴다.
#
#
# Port: 독립실행형(standalone) 서버가 요청을 기다리는 포트.
# 1023 번보다 낮은 번호의 포트에 대해서는 httpd가 처음에는
# root 권한으로 실행되어야 한다.
#
Port 80
웹서버 기본 포트 외울것!!!
#
# httpd가 다른 사용자 또는 그룹 권한으로 실행되게 하려면 우선은
# httpd가 root 사용자 권한으로 실행되고 나서 설정한 다른 사용자
# 권한으로 전환해야 한다.
#
# User/Group: httpd가 실행된 권한의 사용자/그룹의 이름(또는 #번호).
# . SCO (ODT 3)에서는 "User nouser"와 "Group nogroup"을 사용한다.
# . UPUX 에서는 nobody로 실행하는 경우 공유 메모리를 사용할 수
# 없을 것이다. 이 때는 www 등의 사용자를 만들고 그 사용자 권한으로
# 실행되도록 한다.
# 주의) 몇몇 커널들은 60000 이상의 (unsigned) 그룹 값을 설정하면
# setgid(Group), semctl(IPC_SET) 함수를 거부한다.
# 이런 시스템에서는 Group #-1을 사용하지 말라!

User nobody
Group nobody
웹서버 실행시 소유권을 갖게 되는 사용자와 그룹
#
# ServerAdmin: 서버에 문제가 발생했을 때 메일을 보낼 메일 주소.
# 이 주소는 예를 들어 에러 문서와 같이 서버가 생성하는 페이지에
# 나타날 것이다.
#
ServerAdmin root@localhost
서버 이상시 시스템 관리자에게 메일을 보낼 수 있도록
메일주소 설정
#
# ServerName은 클라이언트 프로그램에게 돌려주는 서버 이름이 다른 경우
# 호스트 이름을 설정할 수 있게 해준다. (예를 들어, 호스트의 실제 이름이
# 아닌 'www'를 사용하도록 하는데 사용할 수 있다.)
#
# 주의: 호스트 이름을 아무렇게나 만들어선 안된다. 이 이름은 여러분의
# 호스트에 주어진 타당한 DNS 이름이어야 한다. 잘 모르겠으면 네트웍
# 관리자에게 문의하라.
# 호스트가 등록된 DNS 이름을 갖고 있지 않는 경우에는 이 곳에 IP 주소를
# 적는다. 어찌 되었든 IP 주소를 사용하여(예를 들어 http://123.45.67.89/)
# 접속할 수 있다. 이런 식으로 해서 리다이렉션이 작동하도록 할 수 있다.
#
#ServerName new.host.name
#
# DocumentRoot: 제공할 문서의 상위 디렉토리.
# 기본적으로 모든 요청은 이 디렉토리로부터 처리된다. 하지만
# 심볼릭 링크나 앨리어스(alias)를 사용하여 다른 위치를 가리키도록
# 할 수 있다.
#
DocumentRoot "/usr/local/etc/httpd/htdocs"
index.html이 놓일 위치
#
# 아파치가 접근할 수 있는 각 디렉토리에 대하여 어떤 서비스와 기능을
# 허용할 것인지 거부할 것인지 여부를 설정할 수 있다.
# 디렉토리에 대한 설정 내용은 그 하부 디렉토리에도 영향을 미친다.
#
# 우선, "기본값"을 매우 제한적인 상태로 설정한다.


Options FollowSymLinks
AllowOverride None

아파치 접근 디렉토리 기본 유형
#
# 이 곳부터 허용할 특정 기능을 알맞게 설정해나간다는 사실을 주목하자.
# 여러분이 기대한 대로 작동하지 않는 것이 있다면 그 기능을 가능 상태로
# 설정해두었는지 점검하기 바란다.
#
#
# 다음 내용은 여러분이 설정한 DocumentRoot 값으로 변경해서 사용한다.
#

자신 서버의 DocumentRoot값으로 변경해서 사용
#
# 다음 값에는 "None", "All", 또는 "Indexes", "Includes",
# "FollowSymLinks", "ExecCGI", "MultiViews"의 자유로운 조합이
# 가능하다.
#
# "MultiViews" 만큼은 "Options All"을 사용한다 할 지라도 명시적으로
# 적어야만 작동한다는 사실을 알아두자.
#
Options Indexes FollowSymLinks Includes
#
# 다음은 각 디렉토리에 위치한 .htaccess 파일에서 어떤 옵션을
# 마음대로 제어할 수 있는지 결정한다.
# "All" 또는 "Options", "FileInfo", "AuthConfig", "Limit"의 자유로운
# 결합이 가능하다.
#
AllowOverride None
#
# 서버로부터 자료를 얻어갈 수 있는 위치를 제어한다.

Order allow,deny
Allow from all
먼저 허용하고 거부, 모든 호스트요청을 허용

#
# UserDir: ~user 요청을 받았을 때 사용자의 홈 디렉토리 뒤에 추가할
# 디렉토리 이름.
#
# 주의 : 레드햇 리눅스 시스템에서는 사용자가 자신의 홈 디렉토리에 public_html
# 디렉토리를 만들어도 외부에서 홈 페이지를 볼 수 없다.
# 왜냐하면 각 계정 홈 디렉토리에 대한 보안을 중요하게 생각했기 때문에
# 홈 디렉토리에 대하여 사용자 계정과 사용자 자신의 그룹 이외에는
# 아무런 접근 허가권도 갖고 있지 않기 때문이다.
#
# 개인 홈 디렉토리를 가질 사람은 chmod a+x ~ 명령을 일단 실행해주어
# (보통) nobody 권한의 아파치 프로세스가 홈 디렉토리에 접근할 수
# 있도록 허가해주어야 한다.
# 물론 public_html과 홈 페이지 파일에 대하여 모든 사용자가 최소한
# 읽기 권한은 갖도록 설정해주어야 한다.
#
UserDir public_html
계정 사용자의 홈디렉토리 ex)http://tri.co.kr/~ppp
#
# UserDir 디렉토리에 대한 접근을 제어한다. 다음은 사용자 홈 페이지에
# 대하여 읽기만 가능하도록 한 예제 설정 내용이다. 참고 자료로
# 사용하기 바란다.
#
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
# Order allow,deny
# Allow from all
#
#
# Order deny,allow
# Deny from all
#
#
#
# DirectoryIndex: 준비된 HTML 디렉토리 인덱스로 사용할 파일이나
# 파일 목록의 이름을 나열한다. 여러 개를 나열할 때는 스페이스로
# 구분한다.
#
DirectoryIndex index.php3 index.html index.shtml index.cgi
default 문서 순차적 실행
#DirectoryIndex index.html index.shtml index.cgi
#
# AccessFileName: 각 디렉토리에 대하여 접근 제어 정보 내용을
# 담고 있을 파일 이름
#
AccessFileName .htaccess
접근제어 정보 파일명 지정
#
# 다음 행은 웹 브라우져가 .htaccess 파일을 접근할 수 없도록 하는
# 설정이다. .htaccess에는 인증 정보가 들어있는 경우가 빈번하므로
# 보안 상 이유로 이 파일에 대한 접근은 불허해야 한다.
# 웹 방문객들이 이 파일을 보게 하고 싶으면 다음 행들을 주석 처리하라.
# 만약 AccessFileName 설정을 다른 파일명으로 바꾸었다면 알맞게
# .htaccess를 그 이름으로 바꾸어준다.
#
# 또한 사람들이 웹 서버 패스워드 파일을 .htpasswd라고하는 경향이
# 있기 때문에 .ht 로 시작하는 파일을 모두 보호한다.
#
# 아파치 1.3.x 버전부터 지시자에서 ~ 다음에
# 정규 표현식을 사용할 수 있다.
#

Order allow,deny
Deny from all

#
# CacheNegotiateDocs: 기본적으로 아파치는 내용에 따라 협상된 문서에
# 대해서는 "Pragma: no-cache" 내용을 전송한다. 이 행은 프록시 서버로
# 하여금 문서를 캐쉬하지 않도록 요청한다. 다음 행의 주석을 풀면
# 이 기능을 해제하고 모든 프록시가 문서들을 캐쉬할 수 있도록 한다.
#
#CacheNegotiatedDocs
#
# UseCanonicalName: (1.3 버전에 새롭게 등장) 이 설정을 켜두면,
# 아파치가 자기 참조 URL(반응이 오고 있는 서버를 다시 가리키는
# URL)을 만들 필요가 있을 때마다 "공식적인" 이름을 만들기 위해
# ServerName과 Port를 사용한다. 그렇지 않으면 아파치는 가능한 한
# 클라이언트가 제공한 호스트이름:포트 값을 사용한다.
# 이 설정은 CGI 스크립트의 SERVER_NAME, SERVER_PORT에도 영향을
# 미친다.
#
UseCanonicalName On
#
# TypesConfig 는 mime.types 파일 또는 이에 해당하는 파일을 찾을
# 위치를 결정한다.
#
TypesConfig /etc/mime.types
#
# DefaultType이란 파일 확장자와 같은 것을 통해 MIME 타입을 알 수 없는
# 문서에 대하여 사용할 기본 MIME 타입을 말한다. 여러분의 서버에 주로
# 텍스트나 HTML 문서가 많다면 "text/plain"을 쓰는 것이 좋다.
# 대부분이 실행 프로그램이나 이미지 등 바이너리인 경우에는
# 웹 브라우져가 텍스트라고 생각하여 바이너리 파일을 화면에 표시하지
# 않도록 하기 위해 "application/octet-stream"를 적는다.
#
DefaultType text/plain
#
# mod_mime_magic 모듈을 사용하면 파일의 내용을 가지고 파일의 타입에
# 힌트를 얻는다. MIMEMagicFile 지시자를 사용하여 모듈에게 힌트
# 정보가 저장되어 있는 파일을 설정한다.
# mod_mime_magic은 기본 서버의 일부가 아니다.(따라서 LoadModule
# 설정을 사용하여 모듈을 추가해야 한다.) 또는 서버를 다시 컴파일해서
# mod_mime_magic을 추가해야 한다. 그렇기 때문에 컨테이너에
# 포함되어 있는 것이다. 다음 설정은 모듈이 서버에 포함되어 있을 때에만
# MIMEMagicFile 지시자를 처리하도록 해준다.
#

MIMEMagicFile conf/magic

#
# HostNameLookups: 클라이언트의 이름 또는 IP 주소만을 기록할 지 여부.
# 예를 들어 www.apache.org (on) 또는 204.62.129.132 (off)
# 기본값이 off 인 이유는 각 클라이언트 요청이 올 때마다 최소한 1 번
# 이상의 네임 서버 요청이 발생하기 때문이다. 그러나 꼭 필요한 경우에는
# 이 기능을 켜둔다.
#
HostnameLookups Off
아파치 서버에 접속하는 클라이언트의 정보를 호스트 주소
또는 도메인으로 기록
#
# ErrorLog: 에러 기록 파일의 위치.
# 컨테이너 안에서 ErrorLog 설정을 하지 않으면
# 그 가상 호스트에 관련된 에러 메시지도 역시 이 곳에 기록된다.
# 컨테이너 안에서 에러 로그 파일을 정의하면
# 관련된 에러 메시지는 그 파일로 저장된다.
#
ErrorLog /etc/httpd/logs/error_log
에러 내용 저장
#
# LogLevel: error_log에 기록될 메시지 분량을 제어한다.
# debug, info, notice, warn, error, crit, alert, emerg 등의
# 값이 가능하다.
# alert, emerg.
#
LogLevel warn
에러의 정도 표시
#
# 다음 지시자는 CustomLog 지시자(아래 참고)에서 사용할 몇 가지
# 형식에 대한 별명을 정의한다.
#

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
별칭 정의 명령자
#
# 접근 로그 파일의 위치와 형식(공통 로그파일 형식)
# 컨테이너 안에서 접근 로그파일 설정을 하지 않으면
# 모든 기록이 이 파일에 남게 된다. 이와 반대로 각 마다
# 접근 로그파일을 정의하면 모든 처리가 바로 그 파일에 기록된다.
#
CustomLog /etc/httpd/logs/access_log common
접근 기록 정보
#
# 에이전트 로그파일과 참조자(referer) 로그파일을 갖기 위해서는
# 다음 지시 내용의 주석 처리를 해제하라.
#
# 여기서 에이전트란 여러분의 사이트에 방문하는 브라우져를 말한다.
# 에이전트 로그를 남기면 여러분의 사이트에 방문하는 브라우져의 종류에 대한
# 통계를 낼 수 있다.
#
# 참조자란 주로 배너 광고주에게 중요한 것으로서 여러분의 사이트 바로
# 직전에 방문한 사이트를 말한다.
#
#CustomLog logs/referer_log referer
#CustomLog logs/agent_log agent
#
# 하나의 로그파일에 접근, 에이전트, 참조자 정보를 다 저장하기 위해서는
# (통합 로그파일 형식) 다음 지시 내용을 사용하라.
#
# 몇 달만 운영해도 접속이 많은 사이트에서는 combined 로그 파일이 어마어마하게
# 커져서 루트 파일 시스템을 꽉 채워 버리는 일이 발생할 수 있다!
#
#CustomLog logs/access_log combined
#
# 부차적으로 서버가 생성하는 페이지(에러 문서, FTP 디렉토리 목록,
# mod_status, mod_info 출력 등, 그러나 CGI 생성 문서는 제외)에
# 서버 버전과 가상 호스트 이름을 포함하는 행을 추가하도록 한다.
# "Email"로 설정하면 ServerAdmin으로의 mailto: 링크를 포함한다.
# On | Off | EMail 중 하나로 설정한다.
#
#ServerSignature On
에러 라인 출력 Off시 관리자에게 이메일 전송
#
# Aliases: 필요한 만큼의 별칭을 만들어 사용한다.(제한 없음)
# 형식은 다음과 같다.
# Alias 가짜이름 실제이름
#
# 가짜 이름 뒤에 / 를 포함하면 아파치 서버는 URL에도 / 이 있어야
# 처리함을 잘 알아두자. 따라서 "/icons"는 별칭 처리되지 않고
# "/icons/"만 별칭 처리된다.
#
Alias /icons/ "/home/httpd/icons/"


Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all

#
# ScriptAlias: 서버 스크립트를 포함하는 디렉토리를 제어한다.
# ScriptAlias는 근본적으로 Alias와 같으나 가리키고 있는 실제 디렉토리
# 안에 들어있는 문서를 실행 프로그램으로 취급하여 실행한다.
# 맨 뒤에 붙는 "/" 에 대한 규칙은 Alias와 마찬가지이다.
#
ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"
#
# "/home/httpd/cgi-bin" 부분은 ScriptAlias로 별칭 처리된 실제 CGI
# 디렉토리로 설정해야 한다.
#


AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all

Options ExecCGI는 CGI를 허용
#
# Redirect를 사용하면 서버의 이름공간에 존재했으나 현재에는 존재하지 않는
# 문서에 대하여 클라이언트에게 통보할 수 있도록 해준다. 이렇게 함으로써
# 위치가 변한 새로운 문서를 어디에서 찾을 수 있는지 클라이언트에게
# 알려줄 수 있다.
# 형식: Redirect 예전URI 새URI
#
#
# 서버가 생성하는 디렉토리 목록의 표시 상태를 제어하는 지시자.
#
#
# FancyIndexing은 예쁜 디렉토리 목록 또는 표준적인 디렉토리 목록 여부를
# 결정한다.
#
IndexOptions FancyIndexing
#
# AddIcon으로 시작하는 지시자는 서버에게 다양한 파일, 파일명 확장자에
# 대하여 어떤 아이콘을 보여 줄 것인지 말해준다. 이 값들은
# FancyIndexing을 사용하는 경우에만 해당된다.
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
#
# DefaultIcon이란 명시적인 아이콘을 갖고 있지 않는 파일에 대한
# 기본 아이콘 파일을 설정한다.
#
DefaultIcon /icons/unknown.gif
#
# AddDescription은 서버 자동 생성 인덱스의 파일명 뒤에 간단한 설명을
# 넣을 때 사용한다. FancyIndexing을 사용할 때에만 보인다.
# 형식: AddDescription "설명" 화일명
#
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
#
# ReadmeName은 서버가 디렉토리 목록 뒤에 내용을 덧붙여 넣을 README 파일의
# 이름을 설정한다.
#
# HeaderName은 디렉토리 인덱스 앞에 내용을 덧붙일 파일명을 설정한다.
#
# 서버는 먼저 name.html을 찾고 그것이 있으면 그 내용을 포함한다.
# 만약 없다면 서버는 name.txt 파일을 찾고 평범한 텍스트 내용으로
# 추가한다.
#
ReadmeName README
HeaderName HEADER
#
# IndexIgnore는 디렉토리 인덱싱에 있어 목록에서 제외시킬 파일명을 설정한다.
# 쉘 스타일의 와일드 카드를 사용할 수 있다.
#
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
#
# AddEncoding은 특정 브라우져(모자익/X 2.1+)로 하여금 자료를 받으면서
# 정보의 압축을 풀 수 있도록 해준다. 주의: 모든 브라우져가 이 기능을
# 지원하는 것은 아니다. 이름이 유사하기는 하지만 다음부터 나오게 될
# Add로 시작하는 지시자들은 FancyIndexing과는 관련이 없다.
#
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
#
# AddLanguage는 문서의 언어를 명시한다. 내용 협상 과정을 통해 브라우져가
# 이해할 수 있는 언어의 문서를 제공하는 것이 가능하다.
# 접미어(suffix)는 언어 키워드와 꼭 같은 필요는 없다. 예를 들어
# 폴란드어(Polish)로 된 문서는 네트웍 표준 언어 코드가 pl 이지만
# 펄 스크립트와 확연히 구별하기 위해 "AddLanguage pl .po"라고 사용한다.
#
AddLanguage ko .ko
AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage da .da
AddLanguage el .el
AddLanguage it .it
지원하는 언어
#
# LanguagePriority는 내용 협상 중 동점이 발생하는 경우 언어 우선권을
# 부여한다. 언어의 우선권을 내림차순으로 나열하면 된다.
#
LanguagePriority ko en fr de
우선 지원하는 언어
#
# AddType를 사용하면 mime.types 파일 수정없이 MIME 설정을 할 수 있고
# 또는 어떤 파일들에 대하여 특정 타입으로 처리하도록 할 수 있다.
#
# 예를 들어, PHP3 모듈(아파치 배포파일에 포함되어 있지 않다)에
# 대해서는 다음과 같이 사용한다.
#
AddType application/x-httpd-php3 .php3 .html
AddType application/x-httpd-php3-source .phps
mime type을 수정하지 않고도 주어진 파일의 확장자를mime
type으로 바꿈
# PHP4 Zend 에 대한 설정
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps

#다음은 PHP/FI (PHP2)를 위한 것입니다.
#AddType application/x-httpd-php .phtml
#
# .tgz 파일에 대한 타입 설정
#
AddType application/x-tar .tgz
#
# AddHandler를 사용하면 특정 파일 확장자와 "처리기"를 연결하거나
# 특정 파일 타입에 특정 동작(action)을 연결할 수 있다.
# 서버에 내장되어 있거나 또는 Action 명령을 사용하여 추가할 수
# 있다.(아래 참고)
#
# 서버 측 포함(SSI) 또는 ScriptAlias 처리된 디렉토리 외부에
# 존재하는 CGI 스크립트를 사용하고 싶을 때는 다음 내용의
# 주석을 없앤다.
#
# CGI 스크립트를 사용하기 위해:
#
#AddHandler cgi-script .cgi
#
# 서버 처리 HTML 파일 사용하기 위해:
#
AddType text/html .shtml
AddType text/html .htm
AddHandler server-parsed .shtml
#
# 아파치의 send-asis HTTP 파일 기능을 사용하기 위해서는 다음 행의
# 주석을 없앤다.
#
#AddHandler send-as-is asis
#
# 서버 처리 이미지 맵 파일을 사용하려면...
#
AddHandler imap-file map
#
# type map을 사용하려면...
#
#AddHandler type-map var

# perl 모듈을 사용하려면 다음 세션의 주석을 풉니다.
#
#Alias /perl/ /home/httpd/perl/
#
#SetHandler perl-script
#PerlHandler Apache::Registry
#Options +ExecCGI
#
#
# Action을 사용하면 매칭되는 파일이 호출될 때마다 그 미디어 타입에 맞는
# 스크립트를 시행시킬 수 있다. 빈번하게 사용되는 CGI 파일 프로세서에
# 대하여 반복적으로 URL을 사용하지 않아도 된다.
# Format: Action media/type /cgi-script/location
# Format: Action handler-name /cgi-script/location
#
#
# MetaDir: 아파치 서버가 메타 정보 파일을 찾을 디렉토리 이름.
# 이 파일에는 문서를 보낼 때 추가하고자 하는 추가 HTTP 헤더 정보가
# 들어있다.
#
#MetaDir .web
#
# MetaSuffix: 메타 정보를 담고 있는 파일의 접미어를 설정한다.
#
#MetaSuffix .meta
#
# 사용자 정의 에러 반응 메시지 (아파치 스타일)
# 다음 3 가지 방법으로 가능하다.
#
# 1) 보통의 텍스트
#ErrorDocument 500 "The server made a boo boo.
# 주목: " 표시는 텍스트임을 알려주는 것으로서 그 자체는 출력되지 않는다.
#
ErrorDocument 500 /500.html
#
# 2) 지역적인 방향 전환
#ErrorDocument 404 /missing.html
# 지역적 URL인 /missing.html로 방향 전환하기
#ErrorDocument 404 /cgi-bin/missing_handler.pl
ErrorDocument 404 /404.html
# 주목: 스크립트나 SSI로 방향 전환시킬 수 있다.
#
# 3) 외부 방향 전환
#ErrorDocument 402 http://some.other_server.com/subscription_info.html
# 주목: 원래 요청과 관련있는 환경 변수의 상당수가 스크립트에
# 전달되지 못한다는 점을 알고 있어야 한다.
#
# 다음 지시자는 보통의 HTTP 반응 방식을 수정한다.
# 첫번째 것은 네스케이프 2.x 또는 그를 흉내내는 브라우져에 대하여
# KeepAlive 기능을 쓰지 않도록 한다. 이 브라우져들은 KeepAlive 구현에
# 문제점을 갖고 있기 때문이다.
# 두번째 것은 HTTP/1.1을 잘못 구현하였고 301 또는 302 (redirect) 응답에
# 대하여 KeepAlive를 제대로 지원하지 못하는 마이크로소프트 인터넷
# 익스플로러 4.0b2를 위한 것이다.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
#
# 다음은 기본적인 1.1 응답도 제대로 처리하지 못함으로써 HTTP/1.1 스펙을
# 위반하고 있는 브라우져에 대하여 HTTP/1.1 응답을 하지 않도록 한다.
#
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
#
# http://servername/server-status을 통해 서버 상태 보고를 허용한다.
# 여기서 ".your_domain.com" 부분을 허용할 도메인으로 바꿔 사용하라.
#
#
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# http://servername/server-info를 통하여 원격 서버 설정 보고를 허용한다.
# (mod_info.c가 적재되어 있어야 한다.)
# 여기서 ".your_domain.com" 부분을 허용할 도메인으로 바꿔 사용하라.
#
#
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# 1.1 버전 이전의 오래 된 버그를 악용하려는 사람들이 있다는 보고를 받았다.
# 이 버그는 아파치 일부분으로 제공한 CGI 스크립트와 연관있다.
# 이 부분의 주석 처리를 없애면 이 버그를 악용하는 공격이 있을 때
# phf.apache.org 상의 기록 스크립트로 방향 전환시킬 수 있다.
# 또는 support/phf_abuse_log.cgi 스크립트를 사용하여 여러분 직접 기록할
# 수도 있다.
#
#
# Deny from all
# ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
#
#
# 프록시 서버 지시자. 프록시 서버 기능을 작동시키려면 다음 행의
# 주석을 해제시켜준다.
#
#
#ProxyRequests On
#
#
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# HTTP/1.1 "Via:" 헤더를 처리할 것인지 여부를 결정한다.
# ("Full"은 서버 버전을 포함하고 "Block"은 나가는 모든 자료에서
# Via: 헤더를 제거한다.)
# Off | On | Full | Block 중 하나의 값을 지정한다.
#
#ProxyVia On
#
# 캐쉬 기능도 사용하기 위해서는 다음 행의 주석을 풀어준다:
# (CacheRoot가 없으면 캐쉬하지 않음)
#
#CacheRoot "/home/httpd/proxy"
#CacheSize 5
#CacheGcInterval 4
#CacheMaxExpire 24
#CacheLastModifiedFactor 0.1
#CacheDefaultExpire 1
#NoCache a_domain.com another_domain.edu joes.garage_sale.com

#
# 프록시 설정 끝

#############################################################################
### 섹션 3: 가상 호스트
#
# VirtualHost: 여러분의 리눅스 박스에 여러 개의 도메인/호스트이름을
# 관리하고 싶다면 각각에 대하여 VirtualHost 컨테이너를 설정한다.
# 가상 호스트를 설정하기에 앞서 자세한 설명을
# 에 들러 읽어보기 바란다.
# 가상 호스트 설정 내용을 점검해보기 위해서는 아파치를 실행할 때
# 명령행 옵션으로 '-S'를 사용한다.
#
# 이름 기반의 가상 호스트를 사용하려면 사용할 IP 주소 (최소 1 개,
# 그리고 포트 번호)를 정의해주어야 한다.
#
# 경고 : 아파치 1.2.x 버전에서만 가상 호스트 기능을 사용해 온 관리자들은
# 아파치 1.3.x 버전에서 NameVirtualHost 지시자로 IP 주소를
# 해주어야만 가상 호스트가 제대로 동작한다는 사실을 꼭 알아야 한다!!!
# 1.2 버전을 쓰다 1.3 버전으로 와서 가상 호스트가 동작하지 않는
# 문제의 99% 는 바로 NameVirtualHost 설정에 있다.
#
#
#NameVirtualHost 12.34.56.78:80
#NameVirtualHost 12.34.56.78
#
# 가상 호스트 예제:
# 거의 모든 아파치 지시자가 VirtualHost 컨테이너에 올 수 있다.
#
#
# ServerAdmin webmaster@host.some_domain.com
# DocumentRoot /www/docs/host.some_domain.com
# ServerName host.some_domain.com
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common
#
#
#

# --------------------------------------------------------------------------
#
# 가상 호스트 예제
#
# 192.168.1.1 이라는 하나의 IP 주소에 다음 두 가지 도메인 이름이
# 등록되어 있다고 하자.
#
# a) www.foo.com
# b) www.bar.com
#
# --------------------------------------------------------------------------
# NameVirtualHost 192.168.1.1
#
# # www.foo.com 설정
#
# ServerName www.foo.com
# DocumentRoot /home/foo
# ErrorLog logs/www.foo.com-error_log
# CustomLog logs/www.foo.com-access_log common
#
#
# # www.bar.com 설정
#
# ServerName www.bar.com
# DocumentRoot /home/bar
# ErrorLog logs/www.bar.com-error_log
# CustomLog logs/www.bar.com-access_log common
#
#
#
#
# --------------------------------------------------------------------------
##
## SSL Global Context
##
## All SSL configuration in this context applies both to
## the main server and all SSL-enabled virtual hosts.
##
#
# Some MIME-types for downloading Certificates and CRLs
#

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl



# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
# The filtering dialog program (`builtin' is a internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog builtin

# Inter-Process Session Cache:
# Configure the SSL Session Cache: First either `none'
# or `dbm:/path/to/file' for the mechanism to use and
# second the expiring timeout (in seconds).
#SSLSessionCache none
#SSLSessionCache shm:/var/run/ssl_scache(512000)
SSLSessionCache dbm:/var/run/ssl_scache
SSLSessionCacheTimeout 300

# Semaphore:
# Configure the path to the mutual explusion semaphore the
# SSL engine uses internally for inter-process synchronization.
SSLMutex file:/var/run/ssl_mutex

# Pseudo Random Number Generator (PRNG):
# Configure one or more sources to seed the PRNG of the
# SSL library. The seed data should be of good random quality.
# WARNING! On some platforms /dev/random blocks if not enough entropy
# is available. This means you then cannot use the /dev/random device
# because it would lead to very long connection times (as long as
# it requires to make more entropy available). But usually those
# platforms additionally provide a /dev/urandom device which doesn't
# block. So, if available, use this one instead. Read the mod_ssl User
# Manual for more details.
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random 512
#SSLRandomSeed startup file:/dev/urandom 512
#SSLRandomSeed connect file:/dev/random 512
#SSLRandomSeed connect file:/dev/urandom 512

# Logging:
# The home of the dedicated SSL protocol logfile. Errors are
# additionally duplicated in the general error log file. Put
# this somewhere where it cannot be used for symlink attacks on
# a real server (i.e. somewhere where only root can write).
# Log levels are (ascending order: higher ones include lower ones):
# none, error, warn, info, trace, debug.
SSLLog /var/log/httpd/ssl_engine_log
SSLLogLevel info




##
## SSL Virtual Host Context
##



# General setup for the virtual host
DocumentRoot "/home/httpd/html"
ServerName localhost
ServerAdmin webmaster@localhost
ErrorLog /var/log/httpd/error_log
TransferLog /var/log/httpd/access_log

# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on

# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
#SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A test
# certificate can be generated with `make certificate' under
# built time. Keep in mind that if you've both a RSA and a DSA
# certificate you can configure both in parallel (to also allow
# the use of DSA ciphers, etc.)
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
#SSLCertificateFile /etc/httpd/conf/ssl.crt/server-dsa.crt

# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
#SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server-dsa.key

# Server Certificate Chain:
# Point SSLCertificateChainFile at a file containing the
# concatenation of PEM encoded CA certificates which form the
# certificate chain for the server certificate. Alternatively
# the referenced file can be the same as SSLCertificateFile
# when the CA certificates are directly appended to the server
# certificate for convinience.
#SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ca.crt

# Certificate Authority (CA):
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
# Note: Inside SSLCACertificatePath you need hash symlinks
# to point to the certificate files. Use the provided
# Makefile to update the hash symlinks after changes.
#SSLCACertificatePath /etc/httpd/conf/ssl.crt
#SSLCACertificateFile /etc/httpd/conf/ssl.crt/ca-bundle.crt

# Certificate Revocation Lists (CRL):
# Set the CA revocation path where to find CA CRLs for client
# authentication or alternatively one huge file containing all
# of them (file must be PEM encoded)
# Note: Inside SSLCARevocationPath you need hash symlinks
# to point to the certificate files. Use the provided
# Makefile to update the hash symlinks after changes.
#SSLCARevocationPath /etc/httpd/conf/ssl.crl
#SSLCARevocationFile /etc/httpd/conf/ssl.crl/ca-bundle.crl

# Client Authentication (Type):
# Client certificate verification type and depth. Types are
# none, optional, require and optional_no_ca. Depth is a
# number which specifies how deeply to verify the certificate
# issuer chain before deciding the certificate is not valid.
#SSLVerifyClient require
#SSLVerifyDepth 10

# Access Control:
# With SSLRequire you can do per-directory access control based
# on arbitrary complex boolean expressions containing server
# variable checks and other lookup directives. The syntax is a
# mixture between C and Perl. See the mod_ssl documentation
# for more details.
#
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)-/ \
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
#

# SSL Engine Options:
# Set various options for the SSL engine.
# o FakeBasicAuth:
# Translate the client X.509 into a Basic Authorisation. This means that
# the standard Auth/DBMAuth methods can be used for access control. The
# user name is the `one line' version of the client's X.509 certificate.
# Note that no password is obtained from the user. Every entry in the user
# file needs this password: `xxj31ZMTZzkVA'.
# o ExportCertData:
# This exports two additional environment variables: SSL_CLIENT_CERT and
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
# server (always existing) and the client (only existing when client
# authentication is used). This can be used to import the certificates
# into CGI scripts.
# o StdEnvVars:
# This exports the standard SSL/TLS related `SSL_*' environment variables.
# Per default this exportation is switched off for performance reasons,
# because the extraction step is an expensive operation and is usually
# useless for serving static content. So one usually enables the
# exportation for CGI and SSI requests only.
# o CompatEnvVars:
# This exports obsolete environment variables for backward compatibility
# to Apache-SSL 1.x, mod_ssl 2.0.x, Sioux 1.0 and Stronghold 2.x. Use this
# to provide compatibility to existing CGI scripts.
# o StrictRequire:
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even
# under a "Satisfy any" situation, i.e. when it applies access is denied
# and no other module can change it.
# o OptRenegotiate:
# This enables optimized SSL connection renegotiation handling when SSL
# directives are used in per-directory context.
#SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars +StrictRequire

SSLOptions +StdEnvVars


SSLOptions +StdEnvVars


# SSL Protocol Adjustments:
# The safe and default but still SSL/TLS standard compliant shutdown
# approach is that mod_ssl sends the close notify alert but doesn't wait for
# the close notify alert from client. When you need a different shutdown
# approach you can use one of the following variables:
# o ssl-unclean-shutdown:
# This forces an unclean shutdown when the connection is closed, i.e. no
# SSL close notify alert is send or allowed to received. This violates
# the SSL/TLS standard but is needed for some brain-dead browsers. Use
# this when you receive I/O errors because of the standard approach where
# mod_ssl sends the close notify alert.
# o ssl-accurate-shutdown:
# This forces an accurate shutdown when the connection is closed, i.e. a
# SSL close notify alert is send and mod_ssl waits for the close notify
# alert of the client. This is 100% SSL/TLS standard compliant, but in
# practice often causes hanging connections with brain-dead browsers. Use
# this only for browsers where you know that their SSL implementation
# works correctly.
# Notice: Most problems of broken clients are also related to the HTTP
# keep-alive facility, so you usually additionally want to disable
# keep-alive for those clients, too. Use variable "nokeepalive" for this.
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

# Per-Server Logging:
# The home of a custom SSL log file. Use this when you want a
# compact non-error SSL logfile on a virtual host basis.
CustomLog /var/log/httpd/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"





자 설정이 끝났으면 데몬을 재실행하자(윈도우에서 프로그램 설치 후 리부팅하는
것을 기억하는가
리눅스에서는 데몬에 관한 내용을 설정 후 데몬을 재 실행 시켜야만 한다.)
[root@rootshell /root]# /etc/rc.d/init.d/httpd stop
shutting down HTTPD [ok]
[root@rootshell /root]# /etc/rc.d/init.d/ httpd start
starting HTTPD [ok]


(참고)web server실행시 다음의 것에 주의 하라.

-기본문서index.html생성
-index.html의 상위 디렉토리에 실행퍼미션 생성(755)
-데몬 중단 실행

이것으로 httpd.conf의 설정을 마치겠다. 상당히 어려운 부분도 있었을 것이다.
그래서 신경을 써야 하는 부분에는 색깔로 글씨를 썼다. 가상 호스팅에 대한 부분은
다음에 다루겠다. 자 이제 /usr/local/etc/httpd/htdocs/index.html이라는
페이지를 뛰우고 로딩해 보자!!!

'02.서버-Linux' 카테고리의 다른 글

[리눅스]커널 파라메터  (0) 2012.12.19
[리눅스]아파치 사설 인증서 설치  (0) 2012.12.19
[리눅스]하드디스크 점검  (0) 2012.12.19
[리눅스]Core 분석  (0) 2012.12.19
[리눅스]요약 정리  (0) 2012.12.19
Posted by redkite
, |

0038. [리눅스] 하드디스크 점검

리눅스 서버를 사용하다보면 가끔 예기치 않은 상황(정전이나 전원차단)에 의해 파일시스템이 문제가 생겨 부팅이 되지 않는 경우가 발생하곤 한다.

이런 경우 몇가지 명령어만 알고 있다면 파일 시스템의 오류로 인한 서버 다운이나 서버 장애는 간단(?)하게 응급조치를 취하여 서버의 데이터를 복구할 수 있다.

리눅스는 시스템이 부팅되는 과정에서 "/etc/rc.d/rc.sysinit" 스크립트가 자동으로 실행이 되는데, 해당 스크립트를 살펴보면 파일시스템을 점검하는 명령어가 포함되어 있음을 확인할 수 있다.

리눅스에서 파일 시스템 에러가 발생하는 이유중에 하나가 배드블럭인데, 이 배드블럭을 점검하는 명령어인 "badblocks"와 함께 파일시스템을 점검하고 복구할 수 있는 "e2fsck"명령어를 익혀두도록 하자.

[/]# badblocks -v /dev/hd1 (배드 블록 점검)

[/]#
e2fsck -cv /dev/sda1 (파일 시스템 점검 및 배드블록 마킹)
....
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information

/: ***** FILE SYSTEM WAS MODIFIED *****
/: ***** REBOOT LINUX *****

336288 inodes used (7%)
489 non-contiguous inodes (0.1%)
# of inodes with ind/dind/tind blocks: 14145/72/0
1537521 blocks used (18%)
0 bad bloks
0 large files

293030 regular files
15863 directories
2522 character device files
15884 block device files
1 fifo
4451 links
8974 symbolic links (8968 fast symbolic links)
5 sockets
________
340730 files


※ e2fsck 명령어는 마운트가 해제된 상태에서 사용해야함.
마운트가 된 상태에서 실행시 파일 시스템이 손상될 수 있음. Warning!!! 메시지 출력.

점검 복구 자동 : e2fsck -p /dev/sda1
점검, 복구시 묻는 질문에 무조건 yes : e2fsck -y /dev/sda1
점검, 복구시 묻는 질문에 무조건 No : e2fsck -n /dev/sda1
버퍼 캐쉬의 내용을 디스크에 저장하기 : e2fsck -F /dev/sda1



● 파일 시스템의 슈퍼 블록을 이용한 파일시스템 복구하기

만약 e2fsck 로 파일시스템이 자동복구가 되지 않을 경우에는 슈퍼블록을 이용하여 직접 복구를 해주어야 한다. 이 방법을 이용하면 물리적으로 문제가 있는 부분 이외에는 거의 모든 데이터를 복구 할 수 있는데 리눅스의 파일시스템 구조와 슈퍼블록의 정확한 위치를 알아야 사용이 가능한 방법이다.

e2fsck의 -b 옵션을 이용한 방법이며 "-b 수퍼블록번호"를 파라미터로 주면 된다.


- 첫번째 슈퍼블록 : 1 번블록에 위치함.
- 두번째 슈퍼블록 : 1 번블록 + 8192 번블록 * 1 = 8193 번째 블록에 위치함.
- 세번째 슈퍼블록 : 1 번블록 + 8192 번블록 * 2 = 16385 번째 블록에 위치함.
- n 번째 슈퍼블록 : 1 번블록 + 8192 번블록 * n 번째 블록에 위치함.

아래는 첫번째 슈퍼블록에 오류가 생겨 일반적인 방법으로 복구가 불가능하게 되었을때, 두번째 슈퍼 블록으로 복구하는 예이다.

[/]# e2fsck -b 8193 /dev/sda1
...
/dev/sda1 is mounted.
Do you really want to continue (y/n)? yes
/boot was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
...


위의 명령어로 복구가 안되면 두번째, 세번째... 슈퍼블록을 이용하여 복구하면 된다.

세번째 수퍼블록을 이용한 복구작업 : # e2fsck -b 16385 /dev/sda1
네번째 수퍼블록을 이용한 복구작업 : # e2fsck -b 24577 /dev/sda1

참고로 mke2fs 로 파일시스템을 생성한 후에는 반드시 lost+found 라는 디렉토리가 생성이 되는데, 이 디렉토리는 파일시스템의 점검작업 결과로 연결되지 않은 파일에 대한 정보를 저장하고 있는 장소이다.

e2fsck 로도 복구되지 않은 파일들은 이 디렉토리를 보면 숫자로된 파일형태로 존재하게 되는데 이 파일들을 cat/vi/tail등으로 열어보고 해당 파일을 복구하는 경우도 있다. 물론 이 경우는 좋은 상황은 아니지만 데이터를 전부 유실하는 최악의 경우보단 나을테니...............

'02.서버-Linux' 카테고리의 다른 글

[리눅스]아파치 사설 인증서 설치  (0) 2012.12.19
[리눅스]아파치 번역  (0) 2012.12.19
[리눅스]Core 분석  (0) 2012.12.19
[리눅스]요약 정리  (0) 2012.12.19
[리눅스]본딩 작업  (0) 2012.12.19
Posted by redkite
, |

[리눅스]Core 분석

02.서버-Linux / 2012. 12. 19. 13:32

0037. [리눅스] Core 분석

gcc 등을 이용하여 컴파일 혹은 실행 도중 에러가 발생하는 경우.

(Core dump 는 소스 컴파일시에는 일어나지 않지만 실행시만 에러로 떨어짐.)

컴파일 옵션에 -g 를 넣으면 디버그 정보를 넣어서 컴파일 하여 core 파일 분석.

Segmentation fault -> 파일생성 실패. ulimit을 사용해서 풀어준다. (ulimit -c 1024)

::: Core 파일 분석을 위해 gdb를 실행한다.

~]$ ulimit -c 1024

~]$ gdb 실행파일명 core파일명

어느부분에서 에러가 났는지 확인할 수 있다.

그 외 옵션

(gdb) backtrace
#0 0x08048396 in printString (string=0x0) at main.c:14
#1 0x0804837c in main (argc=1, argv=0x0) at main.c:8

'backtrace' 명령어는 함수를 연대기순으로 나열해 준다. 맨 위에 줄이 segmentation fault
가 발생한 소스이다. 저걸 보면 main.c:8 에서 main.c:14를 호출한 것을 알 수 있다.
더 많은 정보를 얻기 위해 'frame' 명령을 사용하도록 하자. 'frame' 명령은 'backtrace'
명령 실행으로 나온 항목들에 대해 더 많은 정보를 보여준다.


(gdb) frame 0
#0 0x08048396 in printString (string=0x0) at main.c:14
14 sprintf(string, "This is a test.\n");
(gdb) frame 1
#1 0x0804837c in main (argc=1, argv=0x0) at main.c:8
8 printString(argv);

이것을 보면 이미 main.c:8 에서 argv가 0으로 값이 넘어간 것을 알 수 있다.

(gdb) bt

수행한 함수 목록 뷰(스택의 상세보기)

(gdb) [up / down] (스택의 이동 frame 번호 순)

'02.서버-Linux' 카테고리의 다른 글

[리눅스]아파치 번역  (0) 2012.12.19
[리눅스]하드디스크 점검  (0) 2012.12.19
[리눅스]요약 정리  (0) 2012.12.19
[리눅스]본딩 작업  (0) 2012.12.19
[리눅스]메일서버 장애 대처  (0) 2012.12.19
Posted by redkite
, |

0036. [리눅스] 요약정리

리눅스 요약정리 >

s

k

da;skdI. 리눅스의설치

(redhat의 한글버전을 중심으로 설명)

1

cmos의 setup에서 부팅순서 cdrom 으로 선택

2

커널 cd 삽입

3

boot : text 입력

4

install type : custom type 으로선택

5

current disk type

*하드디스크의 파티션영역

- primary 영역 (hda1 - hda4)

- extended 영역 (hda5 - hda8)

ex> 하드 2GB일 경우

- / 1GB

- swap 64MB 2개

- /usr 나머지공간

. disk druid

파티션하는 툴

. fdisk

명령어 사용하여 파티션함

formatting

6

7

lilo configuration : ok 버튼 선택

8

boot loader 설치장소지정 : /dev/hda(MBR)

9

hostname : root

10

network configuration (설치하기 전에 반드시 메모할 것)

=> ip , netmask, default gateway, primary nameserver주소

11

마우스설정 : 자동으로 인식함

12

time zone : asia/seoul OK

13

root password 지정

14

패키지그룹선택 : print supportort, x-window, gnome, mail/www, nfs,

smb, anonymous ftp, dns, network management workstation, emacs,

devilopment, kernal development, utilitys

[*]select individual packages

15

package dependency

[*] install package to satisfy dependency

16

VGA 드라이버체크

17

installation to begin !

18

모니터셋업 : custom 선택 - 15'' , 삼성svga 50-100hz 2mb

19

설치완료 후 (아참! cd 제거)

20

# 설치후 모니터 재설정 : Xconfigurator

21

rebooting cmos의 setup에서 부팅순서 hdd 으로 선택

 

II. 리눅스의디렉토리들

1

/ 최상위디렉토리

cf> /root : root의 홈디렉토리

2

/bin 기본 command 디렉토리

3

/boot 부팅과정에 필요한 파일들이 위치함

4

/etc 환경설정에 필요한 파일존재

/etc/passwd

/etc/hosts

/etc/profile

/etc/skel

사용자홈디렉토리에복사해줄파일들 존재

lilo.conf ..

5

/dev 장치파일 - 커널에있는 드라이버와 연결시키는 역할

6

/lib 부팅 or 시스템운영에 필요한 공유라이브러리와

커널모듈이 위치함

7

/mnt 장치들의 마운트 포인트 디렉토리

/mnt/cdrom : #mount /dev/cdrom /mnt/cdrom

/mnt/floppy : #mount /dev/fd0 /mnt/floppy

8

/sbin 시스템관리자가 운영에 필요한 명령어들 위치함

9

/var 시스템운영중 계속생성되거나 변경되는 파일들위치함

10

/home 사용자 홈디렉토리

root는 관리자계정이며 그 홈디렉토리는 /root 이다.

11

/usr 사용자들이 설치하는 패키지들이 설치됨

12

/proc 프로세스와 커널의 내부적인 정보를 제공하기 위한

목적으로 사용

 

III. 리눅스의 기초운영

1

부팅 : 서로다른운영체제가 있을 때 다중부팅가능 lilo 설치함

2

login 과 logout

처음 리눅스부팅시 root

프롬프트 : # 일반사용자로로그인 하면 프롬프트 : $

로그아웃 : exit or logout

3

리부팅과종료

# reboot , # shutdown -r

# halt , # shutdown -h

4

사용자계정추가와삭제

# adduser lee7640

# userdel lee7640

5

패스워드변경 # passwd lee7640

6

자신의 신상정보 : chfn

7

시스템정보알기

arch

free

whoami

df

uname

cpu정보알기

메모리용량

접속자정보

디스크사용현황

시스템정보

8

네트워크카드정보 : # /sbin/ifconfig

9

디렉토리,파일관련명령어

# ls -al

목록보기

# cp

파일복사

# cd

경로이동

# touch

파일생성

# rm

파..일삭제

cd ..

상위

# pwd

현재경로

# mv

파일이나

디렉토리 이동

cd ~

홈디렉토리로

# mkdir

디렉토리생성

# find

파일찾기

cd ./kk

하위디렉토리의kk로

# rmdir

디렉토리삭제

# ps

프로세스상태보기

cd ../bin

상위디렉토리의 bin으로

chown

chgrp

- 파일의 소유주와 그룹을 바꾼다.

- 파일의 사용자 그룹을 바꾼다.

whereis

- 명령의 실행 파일, 소스, 매뉴얼 페이지가 어디 있는지 보여준다.

사용법

whereis [ -bmsu ] [ -BMS 경로... -f ] 파일이름 ...

man

- 온라인 매뉴얼 페이지를 형식화하고 표시

cat

- concatenate files and print on the standard output

last,

lastb -

사용자들의 마지막 로그인했는 기록 목록을 보여준다.

 

IV. 파일의 내용보기 (vi 에디터)

1.

에디터 사용하기 (vi 에디터) # vi 파일명

* 입력모드 i,a,o,I,A,O

 

* 명령어모드 q!, w, x q 모드변환 : esc키

* 편집모드 /문자열 :sh , /senu , /se nonu , /라인번호

x , dd, yy, p

 

방향키 : h( ← ) j ( →) k(↑) l(↓)

  

2.

화면에 display 하기

 

#more 파일명

 

V. 파일의 권한

1.

# ls -al /etc/passwd (passwd 파일의 내용을 보면 )

 

-rw-r--r-- ~ ~ ~ ~ ~

 

- 디렉토리인가 파일인가 표시

 

rw- 소유자의 권한 (r- read , w-write, x- excute)

 

r-- 그룹의 권한

 

r-- 다른이들의 권한

2.

파일에대한 권한변경시

 

# chmod 700 passwd

 

700 이란? rwx를 2진수로 보면 111인데 그러다먼 7이죠

---일경우는 2진수로 000이니까 0 이구요...

 

VI. 리눅스의 환경설정 디렉토리이야기! (/etc)

1

passwd 파일군

- /etc/passwd : 시스템의 사용자 정의와 그 비밀번호

- /etc/shadow : 실제 암호수록

2

fstab : 부팅시 디스크 장치에 대한 마운트 정보수록

ex> # /dev/hda1 /ext2 default 1 1

3

modules.conf (=conf.modules) : 각 장치명과 모듈을 명시

4

resolv.conf : DNS 서버 주소 적어주는 클라이언트 설정파일

5

hosts : 도메인 네임처리하는 file

6

lilo.conf : 리눅스 커널을 메모리에 상주시키는 역할

멀티부팅지원

7

.bashrc : 부팅시 환경설정하는 파일

모든 계정에 효력을 발생시키는 내용수록

8

profile : 시스템 환경설정파일, 환경변수지정

9

crontab : 리눅스 시스템에서 자동 반복 수행해야

하는 작업을 예약 수행토록하는 데몬

 

VII. 리눅스의 부팅

1.

. 전원 on

부팅의

시작

. ROM BIOS 작동(에러체크,초기화)

. 하드의 primary disk의 MBR을 RAM으로 로드

-> /etc/lilo.conf 작동함 (lilo를 MBR에 설치하는 이유죠)

. 시스템제어권이 운영체제로 넘어감

. 커널부팅 - 하드웨어 드라이버 초기화

. 커널버전출력

-> cpu 속도제시, 콘솔초기화,bogoMIPS 초기화, cpu 점검,

pci bus 초기화 , tcp/ip 초기화 , 마우스와 디스크 드라이버 초기화,

파티션테이블점검, 루트파티션마운트하기

. init 프로그램시작 -> /etc/inittab 파일작동

2.

init 프로세스 하나 발생 ↓

init

프로세스로드

 

* 실행레벨

0 - 모든 프로세스종료

1 - single mode 부팅시

2 - 멀티유저지원 파일공유는 안함

3 - 일반적인 실행모드

4 - 비워둔 레벨

5 - xwindow 터미널 전용

6 - 재부팅시

3.

시스템초기화스크립트실행(/etc/rc.d/tc.sysinit)

시작

스크립트와

부팅끝

. 스왑공간초기화

. 파일시스템 점검(파일시스템구조와 무결성검사)

. 파일시스템 마운트하기

. rc.local 스크립트 실행함( 부팅시 실행하고자 하는 프로그램 설정)

. 커널모듈 로드

 

VIII. 시스템관리자의 작업

1.

부팅디스크 만들기

- 리눅스 커널 이미지를 디스켓으로 옮김

# cat /boot/vmlinus-2.2.000 > /dev/fd0

- 디스켓에 루트 파티션의 위치설정 : # rdev /dev/fd0

2.

파일 묶기, 압축, 해제 (사용p/g명 : tar , gzip)

. 파일묶기 tar

# tar -cvf test.tar *

. 파일풀기

# tar -xvf test.tar

. 파일압축(gzip)

# gzip -1 test.tar

. 압축해제

# gzip -d test.tar.gz

한번에 압축

# tar zcvf 압축될파일명 파일명

한번에 해제

# tar zxvf 파일명

3.

RPM(redhat Package Manager) 사용하여 프로그램 설치와 제거하기

. RPM 설치 : # rpm -ivh foo-1.0-1.i386.rpm

. 삭제 : # rpm -e foo

. cdrom 의 패키지 복사하여 그 패키지 설치하기

# mount /dev/cdrom /mnt/cdrom

#rpm -Uvh unarj-2.43-2.i386.rpm

4.

모듈관리하기

. 현재 사용중인 모듈출력 : # lsmod

. 새모듈올리기 : # modprobe rtl8139

5.

시스템시간맞추기

#rdate -p -s time.kriss.re.kr

(만약 /etc/rc.d/rc.local 에 rdate 넣어두면 매부팅시 맞추어짐)

6.

LAN 설정하기

-랜카드 인식시키기 (설치시)

- ip주소와 라우팅테이블설정하기

#ifconfig eth0 주소 up

#route add default gw 게이트웨이 주소 (게이트웨이설정)

- host 이름설정 : /etc/hosts

- DNS서버설정 : /etc/resolv.conf

- Xwindow에서 네트워크 제어판을 이용한 네트워크설정

netconfig 입력

 

XI. 웹서버구축(MYSQL,APACHE,PHP)

1.

필요한 프로그램 다운 받기(경로: /root/tmp/)

. mysql - http://www.mysql.com/ -> downloads

-> sourcedownload for 3.23.40

-> tarball(mysql-3.23.40.tar.gz)

. apache - http://www.apache.org/dist -> apache_1.3.19.tar.gz sourcecode

. php - http://www.php.net -> complete source code (php-4.0.6.tar.gz)

2.

하나의 프로그램을 설치하기 까지의 순서

① 압축파일풀기

# tar zxvf 압축된파일명

②컴파일전환경설정

# cd 이동디렉토리로

# ./configure ~

③ 컴파일하기

#make

#make install

④ 기타작업

데몬구동이나 DB 설치,

3.

MYSQL설치하기

① #tar zxvf mysql-3.22.32.tar.gz

② #cd mysql-3.22.32

#./configure --prefix=/usr/local/mysql \

--with-unix-socket-path=/usr/local/mysql/mysql.sock \

--with-charset=euc_kr

③ #make

# make install

④ mysql 이라는 기본 데이터베이스 설치

#/root/tmp/mysql/scripts/mysql_install_db

⑤ mysql 서버 데몬 구동

#/usr/local/mysql/bin/safe_mysqld &

 

4.

apache 와 php 설치하기 (경로 : /root/tmp/)

① 압축풀기

# tar zxvf apache_1.3.12.tar.gz

# tar zxvf php_4.0.1p12.tar.gz

② 아파치와 php config 설정

#cd apache_1.3.12

# ./configure

#cd ../php_4.0.1p12

#./configure --with-apache=/root/tmp/apache_1.3.12

--with-mysql=/usr/local/mysql

--prefix=/usr/local/php4

③ php 컴파일

# make

#make install

아파치디렉토리로가서 환경설정과 컴파일

# cd ../apache_1.3.12

# ./configure --prefix=/usr/local/apache

--activate-module=src/modules/php4/libphp4.a

# make

# make install

④ php4의 환경파일을 복사함

# cp ../php_4.0.1p12/php.ini-dist /usr/local/php4/lib

⑤ 파일수정 -> /usr/local/apache/conf/httpd.conf

삭제할부분 addtype application/x-httpd-php .php

addtype application/x-httpd-php-source .phps

삽입할부분 (html에서 php 사용하고자 할때)

addtype application/x-httpd-php .php .html

⑥ 파일수정 -> /etc/rc.d/rc.local

입력할 부분

/usr/local/apache/bin/apacheetc1 start

/usr/local/mysql/share/mysql/mysql.server start

⑦ 허가권 부여확인 /usr/local/mysql/share/mysql/mysql.server 파일

# chmod 700 /usr/local/mysql/share/mysql/mysql.server

# ls -al 확인할 것

⑧ 간단한 파일 만들어 테스트할 것

'02.서버-Linux' 카테고리의 다른 글

[리눅스]하드디스크 점검  (0) 2012.12.19
[리눅스]Core 분석  (0) 2012.12.19
[리눅스]본딩 작업  (0) 2012.12.19
[리눅스]메일서버 장애 대처  (0) 2012.12.19
[리눅스]디스크 에러 발생  (0) 2012.12.19
Posted by redkite
, |

0034. [리눅스] 본딩

리눅스 bonding 은 윈도우의 티밍, AIX의 Etherchannel 과 같습니다.

아래의 설명은 제가 직접 필드에서 해봤으며, 검증된 자료입니다.

참고로 Active - Standby 방식입니다.

그외 다른 방식을 mode 값만 바꾸어 주면 됩니다.

0. 설정 방법
root로 로그인해서 아래 내용을 그대로 실행하시면 됩니다.
"#" 라인에 있는것이 실행명령이이며
그 아래 내용대로 내용전부를 고치거나 추가 하시면 됩니다.

1. bonding Device 생성(전체 내용을 아래와 같이 수정해 주십시요 또는 없다면 아래내용을 IP등에
내용을 알맞은 내용으로 수정 후 적어주시면 됩니다.)

# vi /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
ONBOOT=yes
BOOTPROTO=none
IPADDR=x.x.x.x
NETMASK=x.x.x.x
GATEWAY=x.x.x.x
USERCTL=no

2. eth0를 bond0에 연결(전체 내용을 아래와 같이 수정해 주십시요.)
# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no

3. eth1를 bond0에 연결(전체 내용을 아래와 같이 수정해 주십시요.)
# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no

4. modprobe.conf에 bond0등록(아래 내용을 추가해 주십시요.)
# vi /etc/modprobe.conf

alias bond0 bonding
options bonding miimon=100 mode=1 primary=eth0 //현재 failover로 설정한상태(제가 테스트한결과 failover로 설정한부분에 primary를 설정하지 않으면 failback이 이루어지jjjjj지 않습니다. 참고하세요)


[기본 bonding설정 - 본딩디바이스 1개일때]

본딩 모드에 대한 부분은 맨페이지 확인하여 적용하시면 됩니다.

1. /etc/modprobe.conf 설정

alias bond0 bonding

2. /etc/sysconfig/network-scripts/ifcfg-bondX 설정 (bonding Master Device Set up)

DEVICE=bondX
IPADDR= 해당 IP
NETMASK= 해당 Netmask
GATEWAY= 해당 Gateway
ONBOOT=yes
BOOTPROTO=none
USERCTL=no


3. /etc/sysconfig/network-scripts/ifcfg-ethX 설정 (bonding Slave Device Set up)

DEVICE=ethX
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no


위와 같이 설정 후 현재 상태의 네트워크 환경 확인,

4. lsmod를 이용하여 bonding모듈설정 확인

5. /etc/init.d/network stop

6. modprobe -r bonding

7. /etc/init.d/network start

8. cat /proc/net/bonding/bondX 명령을 이용하여 현재 설정된 본딩 적용내용 확인 (설정 내용을 정확히 확인 바랍니다.)


[bonding설정 - 본딩디바이스 2개 이상일때]


1. /etc/modprobe.conf 설정

alias bond0 bonding
alias bond1 bonding
options bonding max_bonds=2

2. /etc/sysconfig/network-scritps/ifcfg-bond0

DEVICE=bond0
BOOTPROTO=none
IPADDR= 해당 IP
NETMASK= 해당 Netmask
ONBOOT=yes
TYPE=Ethernet
BONDING_OPTS="mode=1 miimon=100 use_carrier=0 primary=ethX"

3. /etc/sysconfig/network-scritps/ifcfg-bond1

DEVICE=bond1
BOOTPROTO=none
IPADDR= 해당 IP
NETMASK= 해당 Netmask
ONBOOT=yes
TYPE=Ethernet
BONDING_OPTS="mode=1 miimon=100 use_carrier=0 primary=ethX"


4. Bonding device route설정

보통 route add로 routing table를 올리게되면 부팅 후 network restart시
routing table가 지워짐니다. 이 부분을 아래와 같이 변경하여 적용 하시면
한결 편하실 것 입니다.

예>bond1에 route table추가
/etc/sysconfig/network-scripts/route-bond1
ADDRESS0=10.51.11.0
NETMASK0=255.255.255.0
GATEWAY0=192.168.153.20
ADDRESS1=192.168.200.0
NETMASK1=255.255.255.0
GATEWAY1=192.168.153.12


또는 route명령을 이용한 route설정

route add -net 172.20.160.0 gw 172.20.161.1 netmask 255.255.255.0 dev bond0
route add -net 172.20.164.0 gw 172.20.161.1 netmask 255.255.255.0 dev bond1

위와 같은 방법을 이용하여 route 설정을 합니다.

5. lsmod를 이용하여 bonding모듈설정 확인

6. /etc/init.d/network stop

7. Modprobe -r bonding

8. /etc/init.d/network start

9. cat /proc/net/bonding/bondX 명령을 이용하여 현재 설정된 본딩 적용내용 확인 (설정 내용을 정확히 확인 바랍니다.)


  1. bond0 사용(실행만 시켜주시면 됩니다.)
    # /etc/rc.d/init.d/network restart

    # /etc/rc.d/init.d/network restart

    6. ifconfig를 이용한 확인(실행만 시켜주시면 됩니다.)

    # ifconfig

###################

일반적으로 설정하는 본딩 모듈 로드는 아래의 방법을 이용한다.
# cat /etc/modprobe.conf
alias bond0 bonding
options bond0 miimon=100 mode=1

그리고 multi bonding의 경우에도 위와 동일한 방법으로 모듈을 로드할 수 있다.
# cat /etc/modprobe.conf
alias bond0 bonding
alias bond1 bonding
options bond0 miimon=100 mode=1
options bond1 miimon=100 mode=1
options bonding max_bonds=2

하지만 위의 방법을 통해서 본딩 모듈을 로드하는 경우에는 본딩의 한개의 본딩 모듈만 로드할 수 있으며 한개의 본딩 모듈은 항상 1개의 정책만을 사용하게된다.
따라서 다수의 본딩 모듈 정책을 사용할 경우 아래와 같은 방법으로 개별의 본딩 모듈을 로드해 주어야 한다.
# cat /etc/modprobe.conf
install bond0 /sbin/modprobe bonding -o bonding0 mode=balance-rr miimon=100
install bond1 /sbin/modprobe bonding -o bonding1 mode=active-backup miimon=100

각 개별에 대하여 모듈을 로드하여 bonding0과 bonding1의 서로 다른 정책을 가진 본딩 모듈을 로드하여 사용할 수 있다.
# /sbin/modprobe bond0
# /sbin/modprobe bond1

다수의 본딩 모듈을 사용하는 경우 유용하다.

위의 방법은 RHEL4 버전까지만 적용 가능하다 즉 RHEL5에서는 위의 방법이 불가능하다.
RHEL5부터는 "ifcfg-디바이스명" 파일에 아래의 파라미터로 설정하게 된다.
BONDING_OPTS="bra~~~"

또는 다른 방법으로 bonding에 대하여 /sys의 정보를 직접 수정하는 방식을 사용할 수도 있다.
아래의 방법으로 등록이 가능하다.

# cat /etc/modprobe.conf
options bonding max_bonds=2

# modprobe bonding
# echo balance-rr > /sys/class/net/bond0/bonding/mode
# echo 100 >/sys/class/net/bond0/bonding/miimon
# echo active-backup > /sys/class/net/bond1/bonding/mode
# echo 100 >/sys/class/net/bond1/bonding/miimon

위의 방법으로 본딩을 추가할 수도 있다. 별도의 "ifcfg-디바이스명"로 권리하지 않을 때 설정하는 내용으로 사용할 수 있다

'02.서버-Linux' 카테고리의 다른 글

[리눅스]Core 분석  (0) 2012.12.19
[리눅스]요약 정리  (0) 2012.12.19
[리눅스]메일서버 장애 대처  (0) 2012.12.19
[리눅스]디스크 에러 발생  (0) 2012.12.19
[리눅스]EXT3 파일시스템 최적화  (0) 2012.12.19
Posted by redkite
, |

0033. [리눅스] 메일서버 장애 대처

인터넷이 웹중심으로 발전하면서도 의사 소통 수단이나 마케팅 수단으로 여전히 중요도가 높아지고 있는 것이 바로 메일 서비스이다. 이번 호에서는 sendmail 과 imap 을 이용한 pop3d 서비스 제공시 발생 가능한 각종 메일 서비스의 장애에 대비하여 안정적인 메일 서비스를 제공하기 위한 방안에 대해 알아보도록 한다.

오늘과내일 넷센터 홍석범(antihong@tt.co.kr)


보내고 받는 메일의 양 제한하기

지난 11월호에서도 잠깐 언급한 것처럼 시스템의 제한 설정과 서비스의 안정성은 매우 깊은 연관성을 가지고 있다. 기본적으로 대부분의 서비스는 유저가 사용 가능한 시스템의 자원 제한이 거의 설정되어 있지 않은데, 메일 서비스도 마찬가지이다.
최근에는 메일의 이용율이 높아지고, 메일의 컨텐츠도 전통적인 텍스트 방식에서 음성,이미지등 각종 동영상이 주종을 이루면서 용량도 점점 커지고 있다. 물론 그만큼 하드웨어나
메일 서버의 소프트웨어적인 성능도 향상되고 있지만 용량이 큰 메일을 주고 받는다면 당연히 시스템의 부하가 올라가기 마련이고 이로 인하여 같은 서버내 다른 서비스에까지
영향을 미치게 된다. 따라서 시스탬에서 보내는 메일 서비스(SMTP)나 받는 메일 서비스(POP3)를 제공하고 있다면 용량이 큰 파일을 주고 받는 것을 적절히 제한할 필요가 있다.

sendmail 은 로컬의 메일을 외부로 발송하는 SMTP(보내는 메일서버) 기능도 있지만 외부에서 서버내 계정으로 전송되는 메일을 받아서 서버에 저장하는 기능도 있다. 이때 기본적으로는 보내거나 받는 메일의 양에 대한 제한이 전혀 없어 10메가 이상이 넘는 큰 사이즈의 메일이 송 수신 될 경우 서버에 과부하가 걸릴 수 있으므로 아래와 같이 각각의 설정(보내는 메일과 받는 메일의 양) 을 적절히 제한하여 설정하는 것이 좋다.

>> SMTP 서버에서 보내는 양 제한하는 법.

/etc/mail/sendmail.cf (또는 /etc/sendmail.cf. 이는 sendmail 의 패키징 방법에 따라 다르다.) 파일에서 다음과 같이 MaxMessageSize 부분의 주석을 제거하고 제한하고자 하는 적절한 값을 입력한다.

# maximum message size
O MaxMessageSize=5024000

위와 같이 설정하였을 경우 현재의 서버를 보내는 메일 서버로 이용시 첨부 파일이 5M 이상 초과하거나 웹에서 /usr/sbin/sendmail 을 실행하여 외부로 메일을 발송하는 메일링 리스트등의 프로그램에서도 메일 발송시 5 메가 이상의 메일은 보낼 수 없게 된다.
5024000 은 byte 단위이며 설정 변경 후 변경된 내용을 적용하려면 killall ?HUP sendmail 로 sendmail 데몬을 Refresh 하면 된다.

>> 받는 메일 서버에서 받는 양 제한하는 법.

외부에서 서버로 들어오는 메일에 대해서 용량을 제한하고 싶다면 같은 파일(sendmail.cf) 에서 "Local and Program Mailer specification" 부분을 설정해 주면 된다.

Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10/30,
R=20/40, M=5024000, T=DNS/RFC822/X-Unix, A=procmail -Y -a $h -d $u

위와 같이 T=DNS/RFC822/X-Unix 앞부분에 M=5024000 부분을 추가해 주면 된다.
마찬가지로 5024000는 byte 단위이며 각자의 시스템 환경에 따라 원하는 용량만큼 적절히 설정해 주면 된다 역시 설정 변경 후 sendmail 을 refresh 하면 적용이 된다.
위의 경우 서버에서는 5메가 이상의 메일은 수신하지 않으며 5메가 이상의 메일을
보낸 이는

552 5.2.3 <antihong@tt.co.kr>... Message is too large; 5024000 bytes max
554 5.0.0 <antihong@tt.co.kr>... Service unavailable
와 같은 에러 메시지를 회신받게 된다.

아울러
# maximum number of recipients per SMTP envelope
O MaxRecipientsPerMessage=20

와 같은 부분이 있는데, 이 부분은 한번에 메일 발송 시 동시 발송(참조 발송)이 가능한 메일 계정의 수를 뜻하는 것으로 SMTP 서비스를 제공한다면 이 설정을 적용하는 것이 좋다. 기본적으로 이 값에도 제한이 없으므로 먼저 주석을 삭제한 후 적절한 값을 설정해 주면 한번에 동시 발송 가능한 메일의 수도 제한할 수 있다.
(위의 경우에는 한번에 참조 발송이 가능한 메일 유저를 20명으로 제한)
설정이 끝난 후에는 killall ?HUP sendmail 로 sendmail 을 재가동해주면 적용된다.



메일 용량 쿼터 설정하기

각 유저의 홈페이지 공간에 대한 쿼터 설정방법은 잘 알고 있는데, Sendmail 을 제공시 메일 용량 쿼터에 대한 설정은 잘 모르는 경우가 많이 있다. 매일 쿼터에 대한 설정은 다소 복잡하기는 하지만 설정은 가능하다. 기본적으로 각 유저의 메일은 /var/spool/mail/ 디렉토리에 자신의 계정 소유로 저장이 되게 되는데 바로 이 특성을 이용하여 쿼터 설정이을 하면 된다. 쿼터는 각 파일 시스템별로 각각 설정이 가능하므로 각 유저의 홈디렉토리외에 /var 파티션에도 추가적으로 쿼터를 설정하면 되는 것이다.
쿼터를 설정하는 방법은 일반적인 방법과 동일하다.
먼저 /etc/fstab 파일을 열어 /var 파티션이 별도로 설정되어 있다면 /var 파티션에, 별도로 없으면 / 파티션에 유저쿼터나 또는 그룹쿼터 설정을 하면 된다.

/dev/sda1 /home ext2 defaults,usrquota=/home/.quota
/dev/sda8 /var ext2 defaults,usrquota=/var/.mailquota

위에서는 /home 파티션에도 쿼터 설정을 하고 /var 파티션에도 쿼터 설정을 한 것을 볼 수 있다. 이후 touch /home/.quota 및 touch /var/.mailquota 로 사이즈가 0인 파일을 생성한 후 quotacheck ?a 를 실행하면 파일 시스템을 스캔하여 디스크 사용량을 체크하여 해당 파일에 정보를 저장한다.

edquota user 를 실행하면

/dev/sda1: blocks in use: 0, limits (soft = 99980, hard = 99980)
inodes in use: 0, limits (soft = 0, hard = 0)
/dev/sda8: blocks in use: 0, limits (soft = 29980, hard = 29980)
inodes in use: 0, limits (soft = 0, hard = 0)

위와 같이 쿼터 설정이 나오는데, 여기에서 /dev/sda1 은 /home/ 디렉토리에 대한 쿼터 설정이고, /dev/sda8 은 /var/ 디렉토리에 대한 쿼터 설정이다. 위 설정으로 각각 /home 디렉토리에는 100메가로, 메일 용량은 30메가로 총 130메가를 할당하여 쿼터를 설정한 것을 알 수 있다. 만약 별도의 /var 파티션이 없이 / 파티션만 있는 상황에서 100 메가로 쿼터 설정을 했다면 이 용량은 홈페이지의 용량과 메일 용량을 합쳐서 100메가로 적용이 되므로 주의하기 바란다.

##################### 참고. Quota 의 설정에 대해
위와 같이 edquota 사용시 관련된 라인이 아래와 같이 보이는 부분이 있다. 이 중

"blocks in use:" 는 유저가 현재 파티션에서 사용중인 총 블럭의 수를 킬로바이트로,
"inodes in use:" 는 유저가 현재 파티션에서 사용중인 총 파일의 개수를 보여준다.
이 두개의 "blocks in use:" 와 "inodes in use:" 는 시스템에 의해 자동으로 설정되고
제어되므로 이 값을 임의로 변경할 필요는 없다.
그리고 quota 설정시 soft 제한(soft = 5000)은 유저가 사용할 수 있는 최대 용량을 뜻하며 (이 예제에서는 약 5M 이다.) hard 제한(hard = 6000)은 유저가 초과할 수 없는 절대적인 디스크 사용량을 뜻한다. "hard limit" 는 "grace period" 옵션이 설정되었을 때에만 적용된다.
grace period 는 쿼터가 설정된 유저나 그룹이 soft limit 을 초과한 이후에도 사용 가능한 시간의 한계이다. 예를 들어서 여러분이 관리하는 시스템에 "해당 유저의 홈디렉토리를 50MB 로 쿼터 제한하고 초과시 7일간의 유예기간을 준다"는 정책을 세울 수도 있다. 각자 유예 기간의 설정에 대해서는 나름대로 적당하다고 생각하는 기간을 정의할 수 있다. grace period 는 edquota ?t 로 확인 및 설정할 수 있으며 아래의 경우에는 grace period 가 7일로 설정되어 있는 것을 알 수 있다.

/dev/sd1: block grace period: 7 days, file grace period: 7 days
/dev/sda8: block grace period: 7 days, file grace period: 7 days

그리고 한 유저에게 적용된 쿼터 설정을 다른 유저에게도 그대로 적용하려면 ?p 옵션을 사용하면 되는데, 아래와 같이 실행하면 edquota 프로그램은 /etc/passwd 에 정의된 유저중 UID 가 499 이후의 모든 유저에 대해 "user" 의 쿼터 설정을 그대로 복사하게 된다.

edquota -p user `awk -F: '$3 > 499 {print $1}' /etc/passwd`

####################################################################


만약 쿼터가 초과된 계정에 메일을 발송하게 되면 아래와 같은 에러 메시지가 나며 더 이상 메일을 수신하지 못하게 된다.







sendmail 이 정상적으로 작동하는지 여부를 아는 방법

sendmail 이 현재 작동중인지 확인하는 방법은 아래 두 가지 방법으로 가능하다.

(1) # ps auxw|grep sendmail 로 확인
위와 같이 확인시
root 0.0 0.0 2684 1460 S Aug24 sendmail: accepting connections on port 25

와 같이 sendmail: accepting connections on port 25 로 보이면 정상적으로 작동하는 것이다. 만약 sendmail 이 다운되어 작동하지 않을 때는 sendmail: rejecting connections 라는 메시지가 보이게 된다.

(2) sendmail 이 반응하는 25번 포트로 접속.

# telnet tt.co.kr 25
Trying 211.47.66.50...
Connected to tt.co.kr.
Escape character is '^]'.
220 www10.tt.co.kr ESMTP Today and Tomorrow (http://tt.co.kr/)

와 같이 sendmail 이 바인딩하는 25번 포트로 telnet 을 접속하면 sendmail 이 반응을 하게 되는데, 위와 같이 접속을 하여 응답이 있을 경우에는 접속을 받아들일 준비가 되어 있는 상태이며 반응하지 않을 때는
Trying tt.co.kr...
telnet: Unable to connect to remote host: Connection refused
와 같이 접근이 거부되었다는 것을 알 수 있다.


갑자기 sendmail 이 작동하지 않을 때

sendmail 이 작동하지 않는 경우는 주로 2가지이다.

첫번째는, 시스템의 부하율인 Load Average 가 높아져 sendmail 이 작동하지 않는 경우이고 두번째는 sendmail 에서 받는 메일이 저장되는 /var 파티션이 100%가 되었을 경우이다.
Sendmail 은 기본적으로 시스템의 Load Average 수치가 12를 초과하였을 경우에는 자동으로 작동하지 않게 되는데 이는 sendmail이 서비스 거부 공격등으로 시스템의 부하가 높아졌을 때 sendmail 로 인하여 시스템이 다운되는 것을 막기 위한 조처이다.
이 값을 수정하려면 sendmail.cf의
# load average at which we refuse connections
O RefuseLA=12
에서 수정한 후 killall ?HUP sendmail 로 재실행해 주면 되고, 이 값은 각각의 시스템에 따라 적절히 조정하면 된다. 만약 현 시스템의 특성상 늘 부하가 높아 로드가 자주 12를 초과한다면 이 값을 각자의 시스템 환경에 맞게 적절히 조절하여야 외부에서 오는 메일을 받을 수 있게 된다.(서버에서 25번 포트로 바인딩하고 있어야 외부에서 오는 메일을 수신할 수 있다.) 그리고 메일이 저장되는 /var/spool/mail 파티션이 가득 찼을 경우(파티션 100%) 에도 sendmail 이 작동하지 않으므로 파티션이 가득 찼을 경우에는 /var/log/ 등에서 불필요한 데이터를 삭제하여 /var/spool/mail 이 포함된 파티션이 100% 를 넘지 않도록 하여야 한다. 용량 정리를 하여 파티션이 100%가 넘지 않으면 sendmail 이 자동으로 살아나는 것을 알 수 있다.
또한 시스템의 Load Average 가 8을 넘으면 서버를 통해 메일을 발송해도 메일을 통해 바로 전송되지 않고 일단 서버의 메일 큐에 저장이 된 후에 발송이 되게 된다. 이 역시 같은 이유 때문인데 이 수치는 sendmail.cf 의

# load average at which we just queue messages
O QueueLA=8
에서 적절히 설정하면 된다.

참고로 현재 시스템의 Load Average는 w 명령어를 이용하여 확인 가능하다.
w 를 이용시 시스템의 Load Average 는 0.25, 0.40, 0.43 와 같이 보이는데 이는 각각 현재를 기준으로 지난 1분, 5분, 15분간의 평균 시스템 부하율을 나타낸다.



sendmail 애서 보내는 메일(SMTP) 기능을 차단하고자 할 때

sendmail 에서 Relay 기능을 막아 두었다 하더라도 최근 버전에는 사용자 인증(SMTP AUTH) 기능이 있어 서버에 계정이 있으면 모든 유저가 메일 서버를 이용해 SMTP 기능을 이용하여 메일을 발송할 수 있다. 이를 막으려면 최신의 8.11.4 나 8.11.5 와 같이 최신 버전으로 업그레이드 후 /etc/mail/smtpauth 파일에 보내는 메일 기능을 허용할 유저를 입력해 주면 된다. (최근에 8.11.6 이전 버전에 심각한 보안 문제가 확인되었으므로 반드시 8.11.6 버전이나 8.12 버전으로 업그레이드하여야 한다.) 파일을 생성 후 아무런 유저도 입력하지 않으면 서버에 계정이 있다 하더라도 어느 누구도 메일을 발송할 수 없게 된다. 따라서 최신의 8.11.6 버전으로 업그레이드 할 것을 권장한다. 이외 여러 변형된 방법이 존재하는데, ipchains 나 iptables 를 이용해 패킷 필터링을 하는 방법도 있다.

커널 2.2.X 일 경우
ipchains -A output -p tcp -y -d 0/0 25 -j DENY
커널 2.4.X 일 경우
iptables -A OUTPUT -p tcp --syn --dport 25 -j DROP

위와 같이 설정시 목적지(Target) 포트가 25번 포트로 향하는 초기화(SYN) 패킷만을 차단하여 메일을 발송할 수 없도록 한다. 물론 초기화(SYN) 패킷에 대해서만 필터링을 하였으므로 외부에서 오는 메일을 받는 것은 관계 없다.

바이러스 메일 필터링 방법

최근에 Sircam 이나 Nimda 등 일정 주기마다 발생하는 바이러스 메일 때문에 서버 관리자들은 마음 고생이 이만저만이 아니다. Sendmail 에서는 이러한 바이러스 메일이나 스팸메일에 대해 룰셋(ruleset)을 이용하여 차단하는 기능이 있는데, 이를 사용하는 방법에 대해 알아보도록 하자.
Sendmail 에서는 제목이나 메일러 또는 첨부파일의 화일명등 각종 메일헤더 정보를 이용하여 필터링을 할 수 있는데, 먼저 발송되는 메일 제목(subject)으로 필터링을 해 보도록 하자. 아래는 메일 제목에 ILOVEYOU 로 발송하는 멜리사 바이러스를 차단하는 룰셋을 적용해 본 예이다.

먼저 sendmail.cf 파일을 열어 제일 하단에 아래의 내용을 추가한다.

HSubject: $>Check_Subject
D{WORMmsg}Access Denied - This message may contain a virus.

SCheck_Subject
RILOVEYOU $#error $: 501 ${WORMmsg}
RRe: ILOVEYOU $#error $: 501 ${WORMmsg}
RFW: ILOVEYOU $#error $: 501 ${WORMmsg}

# 주의 : $#error 앞의 blank는 스페이스가 아니라 반드시 탭으로 띄워주어야 한다.
Sendmail.cf 의 설정 내용이 다소 어렵고 복잡하기는 한데, 위 설정의 의미를 간단히
살펴보도록 하자.

H -- 위 경우에는 헤더에서 Subject:라는 문자열을 찾아 이 헤더를 Check_Subject로 정의한다.
D -- WORMmsg 라는 매크로를 정의하여 해당 룰셋에 적용되는 제목을 확인시 발송한
유저에게 보낼 메시지를 정의한다.
S -- 헤더에서 check_subject로 정의한 부분을 룰셋으로 지정하는 부분이다.
R -- 해당 문자열이 포함된 메일을 발견시 앞에서 정의한 에러 메세지를 첨부하여
반송을 시킨다.

위와 같이 룰셋을 적용하였을 경우 "I LOVE YOU" 와 같이 공란이 있을 경우 적용되지 않으며 "ILOVEYOU from me" 와 같이 특정 단어가 추가시에도 적용되지 않으며 반드시
정확히 일치하여야 한다. 추가적으로 회신시 추가되는 Re: 와 전달(포워딩)시 추가되는 FW: 가 추가된 메일도 거부한다.

다음으로 얼마전 유행했던 Sircam 바이러스 메일을 필터링해 보도록 하자.
Sircam 바이러스의 헤더를 보면 정상적인 메일과는 달리 메일 헤더에
Content-Disposition: Multipart message 와 같은 부분이 추가되어 있으며 이 특징을 이용하여 필터링을 하면 된다.

Sendmail.cf 파일에 아래의 룰셋을 추가하면 된다.

HContent-Disposition: $>check_sircam
D{SIRCAM}"Warning: I Guess Sircam.worm Virus"
Scheck_sircam
RMultipart message $#error $: 550 ${SIRCAM}

# 주의 : $#error 앞의 blank는 스페이스가 아니라 탭으로 띄워주어야 한다.

sendmail.cf의 수정을 끝낸 후 바로 sendmail을 재 시작하지 말고
룰셋이 정상적으로 작동하고 있는지 아래와 같이 테스트를 하는 것이 좋다.

# /usr/lib/sendmail ?bt # 테스트 모드로 접속
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter
> check_sircam Multipart message # Sircam 룰셋 테스트
check_sircam input: Multipart message
check_sircam returns: $# error $: 550 553 Warning: I Guess Sircam.worm Virus
> ctrl-D # 테스트 종료

위와 같이 확인된 후 sendmail을 재시작(killall ?HUP sendmail) 하면 바로 적용된다.
아래와 같이 tail ?f /var/log/maillog 로 로그 파일을 지켜보면 아래와 같이 실제로 Sircam 바이러스가 필터링되고 있음을 확인할 수 있다.

Sep 27 15:09:51 www sendmail[21386]: f8369of21386: to=<antihong@tt.co.kr>, delay=00:00:01, pri=241584 Warning: I Guess Sircam.worm Virus.

마지막으로 최근에 가장 영향을 많이 주었던 변형된 Nimda Worm 을 필터링하는 방법에 대해 알아보자. Nimda Worm 은 정상적인 메일 메시지와 달리 헤더에
boundary="====_ABC1234567890DEF_====" 나
boundary="====_ABC123456j7890DEF_====" 라는 부분이 있는데, 이 부분으로 필터링을 할 수 있다. 즉 메일 헤더에 위와 같은 설정이 되어 있으면 Nimda Worm 으로 간주하고 필터링 하면 되는 것이다. Sircam 에서와 같은 방법으로 sendmail.cf 파일의 설정은 아래와 같다.

HContent-Type: $>check_ct

D{NIMDA}"I guess NIMDA.WORM!!!"

Scheck_ct
R$+boundary="====_ABC1234567890DEF_====" $#error $: 550 ${NIMDA}
R$+boundary="====_ABC123456j7890DEF_====" $#error $: 550 ${NIMDA}

이외 메일 필터링에 대한 더욱 구체적인 방법에 대해서는
http://certcc.or.kr/paper/tr2001/tr2001-03/email security by procmail.html 나
http://quanta.khu.ac.kr/~dacapo/sendmail/rulesets/ 를 참고하기 바란다.
그리고 이외 관련하여 바이러스를 스캔하거나 필터링 할 수 있는 몇몇 프로그램이 있는데 이에 대해서는http://www.rav.ro/ , http://www.amavis.org/ , http://www.sophos.com/ 등을 참고하기 바란다.


메일이 받아지지 않는 경우

아웃룩 익스프레스에서 "배달" 을 눌러 메일을 수신하려고 할 때 메일이 받아지지 않는 경우가 있다. 이러한 경우에는 아래와 같이 여러가지 이유가 있을 수 있으니 아래의 사항에 대해 하나씩 원인을 찾아보기 바란다.
(1) IMAP 패키지가 설치되지 않았을 경우
서버에 배달되어 있는 자신의 계정으로 온 메일을 클라이언트 PC에서 받으려면 pop3 데몬이 반응하게 된다. pop3d 는 IMAP 패키지안에 포함되어 있으므로, IMAP 패키지를 설치하여야 pop3 를 사용할 수 있다. Rpm 으로 설치했다면 rpm ?q imap 으로 현재 시스템에 imap 패키지가 설치되어 있는지 확인한다. 또는 /usr/sbin/ipop3d 파일이 있는지 확인해 본다.
(2) Inetd 에 설정되어 있지 않을 경우
pop3d 는 inetd 또는 Xinetd 에서 작동하게 된다.
/etc/inetd.conf 또는 /etc/xinetd.conf 파일을 살펴보아 ipop3 가 주석처리 되어 있거나 pop3 가 disable = yes 로 되어 있지는 않은지 확인한다.
(3) TCP Wrapper 에 설정되었는지 여부 확인
/etc./hosts.deny 에 pop3d 접근이 차단되지는 않았는지 확인한다.
(4) 계정에 Lock 이 걸리지 않았는지 확인
메일을 받는 과정에서 갑자기 회선이 끊기거나 PC가 다운되는 등 비정상적으로 종료시 서버의 pop3d 프로세스가 죽지 않고 계속 남아 있는 경우가 있다.
이러한 경우 계정에 "Lock 이 걸렸다" 라고 하며 이러한 경우에는 해당 프로세스를 찾아 kill 을 하면 된다. 만약 계정에 Lock 이 걸린 상태에서 아웃룩 익스프레스에서 메일을 수신하려고 하면 아래와 같은 에러가 나게 된다.
"메일 서버에 로그온하는 데 문제가 있습니다. 지정한 암호가 거부되었습니다.
계정: 'temazone.com', 서버: 'tt.co.kr', 프로토콜: POP3, 서버 응답:
'-ERR Can't get lock. Mailbox in use', 포트: 110, 보안(SSL): 아니오,
서버 오류: 0x800CCC90, 오류 번호: 0x800CCC92"

(5) Pop3 접속이 많은 경우
Pop3d 가 서비스되는 inetd는 기본적으로 60초동안 40회의 접속을 받아들이
도록 (즉, maximum 40회 fork되도록) 설정되어 있다. 따라서 짧은 시간에 pop3d
요구가 많을 경우에는 메일로그에 pop3/tcp server failing (looping) 라는 메시지가
나면서 pop3d 데몬 자체가 다운되어 버리므로 동시에 처리 가능한 프로세스의 한계
를 적절히 높여주어야 한다.
이를 위해서는 /etc/inetd.conf 를 열어 아래와 같이 수정하면 된다.

이전설정)
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d

변경 설정)
pop-3 stream tcp nowait.200 root /usr/sbin/tcpd ipop3d
(위의 경우 처리 가능한 프로세스를 200회로 늘려주었다.)
이후 killall -HUP inetd 를 하면 된다.

(6) 110 번 포트로 확인
아래와 같이 pop3d 포트인 110번 포트로 직접 접속하여 수작업으로 확인 가능하다.

# telnet pop3.tt.co.kr 110 # 110번으로 직접 확인
Trying 210.17.6.5...
Connected to pop3.tt.co.kr.
Escape character is '^]'.
+OK POP3 pop3.tt.co.kr v2001.76 server ready
user abc # abc 라는 계정으로 접속
+OK User name accepted, password please
pass xyz # abc 의 암호 xyz 입력
+OK Mailbox open, 10 messages
quit # 접속을 끊음.
+OK Sayonara
Connection closed by foreign host.

위의 경우는 정상적인 경우이며 에러가 있을 경우(만약 암호가 다르게 설정되었을 경우 -ERR Bad login 와 같은 메시지가 나게 된다.) 각각의 경우에 따라 에러 메시지를
각각 확인할 수 있다.

(7) mail ?v 로 확인
타 서버에서 mail ?v antihong@tt.co.kr 와 같이 메일을 발송하여 정상적으로 메일이 도착하는지를 확인해 본다. ?v 옵션을 이용하여 메일 발송시에는 메일 전송의 경로 및 메일 서버간에 주고받는 메시지를 확인할 수 있으므로 문제의 원인을 찾는데 도움이 된다.



특정한 곳으로만 메일이 돌아올 때

다른 곳은 문제가 없는데, 해외등 특정한 곳으로만 메일이 전송되지 않고 리턴되는 경우가 있다. 이러한 경우라면 자신의 메일서버가 mail-abuse.org 의 블랙 리스트에 등록되어 있지는 않은지 확인해 볼 필요가 있다. 특히 회신된 메일에 "...refused by blackhole site relays.mail-abuse.org" 와 같은 메시지가 보인다면 반드시 여부를 확인해 보아야 한다. 적지 않은 메일 서버에서는 메일 수신시 실시간으로 이 데이터를 참조하므로 mail-abuse.org 에서 스팸 메일 서버로 등록되면 이 기관에 등록된 도메인으로 메일을 보낼 때 받는 쪽에서는 스팸 메일로 간주하고 수신을 거부하게 된다. 이를 확인하는 방법은 http://mail-abuse.org/cgi-bin/nph-rss사이트에서 메일 서버의 IP 를 조회해 보면 된다. 아래는 위 사이트에서 한 IP 에 대해 조회해 본 결과 블랙 리스트에 등록되어 있는 것을 보여주고 있다. 이러한 경우라면 조회한 메일 서버의 Relay 가 허용되어 스팸 메일 서버로 사용된 적이 있거나 현재 사용되고 있다는 뜻이다. 만약 스팸메일 서버로 등록되어 있지 않다면 211.47.65.xxx is NOT currently on the RSS list 와 같이 보이게 된다.






자신의 메일 서버를 이 블랙리스트에서 제외하려면 먼저 자신의 메일서버에 Relay 가 허용되어 있는지 확인 후 메일 서버에서 Relay 를 거부 설정한 후 If you'd like 211.47.65.135 to be removed from our list, please click here. 를 따라 클릭하여 신청을 하면 된다. 이 링크를 클릭하면 신청폼이 나오는데, 이 곳에 입력하여 신청을 하면 바로 처리가 된다. Relay 거부 설정을 한 후 신청을 해야 처리가 되므로 반드시 사전에 Relay 거부 설정을 확인하기 바란다. 메일 서버의 Relay 여부를 조회하는 방법에 대해서는 본지 10월호 "철벽 보안을 위한 모니터링 올가이드" 를 참고하기 바란다.


복수 MX 설정시 주의해야 할 점

DNS 서버에서 설정하는 MX 레코드는 해당 호스트로 수신되는 편지를 다른 호스트로 라우팅 하도록 한다. 특히 웹서버와 메일 서버를 분리하고자 할 경우 사용되는데, 원격 호스트에서 아래와 같이 설정된 도메인 tt.co.kr 로 편지를 송신할 경우에 Sendmail이 어떻게 동작하는지 알아보자.


tt.co.kr. IN MX 10 mail1.tt.co.kr.
IN MX 20 mail2.tt.co.kr.
IN MX 20 mail3.tt.co.kr.

다음은 메일이 수신되는 차례를 보여준다.

(1) Preference 값이 10으로 가장 낮은 mail1 로 먼저 배달을 시도한다.
(2) 만약 mail1.tt.co.kr 이 접근이 불가능하면 mail2 혹은 mail3 으로 배달을 시도한다.
(3) (2) 에서 시도한 메일서버로도 접근이 되지 않으면 (2)에서 접근 되지 않은 호스트로
배달을 시도한다. 즉 mail2 로 전송을 시도했다면 mail3 으로 배달을 시도한다.
(4) mail2 와 mail3 서버에 접근이 불가능하다면 자체 큐잉 후, 일정 기간동안 주기적으로
1-3의 과정을 반복한다.

흔히 MX 레코드에 대해 잘못 생각하는 것 중 하나는 만약 mail1 이 다운되어 mail2 로 편지가 배달되었을 때, 편지가 mail2 의 메일 박스에 저장 된다고 생각하는 것이다. 만약 이렇게 된다면 유저 입장에서는 메일 수신시 pop3 서버를 mail1.tt.co.kr 와 mail2.tt.co.kr 과 같이 여러 개 설정해야 하는 것처럼 보인다. 그러나 일반적으로 mail2.tt.co.kr 이나 mail3.tt.co.kr 처럼 Preference 가 높은(즉 우선도가 낮은) 값을 갖는 메일 서버는 큐잉 서버로 동작하도록 설정하기 때문에, 결국 메일은 하나의 호스트(mail1)로 모이게 되는 것이다. 위와 같이 mail2와 mail3 서버가 큐잉 메일 서버로 작동하려면 mail1 와 mail2의 sendmail 이 아래와 같이 설정되어야 한다.

(1) 해당 도메인(tt.co.kr)에 대한 인증을 갖지 않아야 한다.
(즉, mail2 나 mail3 메일 서버의 sendmail.cw 또는 local-host-names 파일에 tt.co.kr 이 설정되어 있으면 안 된다.)

(2 )서버는 해당 호스트로의 메일 릴레이(Relay)를 허용하여야 한다.
(즉, /etc/mail/access 에서 아래와 같이 정의되어야 한다.)
mail1.tt.co.kr relay

인증을 갖지 않아야 한다는 것은 Sendmail의 w 클래스(sendmail.cw(local-host-names) 혹은 sendmail.cf의 Cw)에 tt.co.kr 도메인이 설정되지 않아야 하는 것을 의미하고, 메일 릴레이란 수신되는 편지의 최종 배달지가 자신이 아닐 경우, 즉 인증을 갖지 않을 경우 편지를 해당 호스트로 포워딩하는 것을 의미한다. 최근의 배포판에서는 기본적으로 sendmail이 릴레이를 거부하도록 설정되어 있으므로 메일 큐잉 서버의 경우는 해당 호스트를 목적지로 하는 메일에 대해서는 릴레이를 허용하도록 설정하여야 한다는 것을 주의하기 바란다.
mail1 의 다운으로 인해 mail2 로 전달되는 메일은 메일큐에 저장되어 있으면서, 일정 기간(Sendmail.cf에서 지정된 Timeout.queuereturn=5d 만큼)동안 주기적(Sendmail 구동시 지정된, 일반적으로 30분 -q30m)으로 mail1 로 배달이 재시도된다.


메일 서버의 버전을 숨기는 법

다른 데몬도 마찬가지이지만 메일 서버 역시 해당 포트로 원격 접속을 해 보면 메일 서버의 버전 정보등을 확인할 수 있다. 그러나 시스템 관리자 입장에서 보안상의 문제로 현재 운영중인 메일 서버의 버전등을 숨기거나 속이고 싶을 때가 있는데. 이러한 경우에는 아래의 방법을 이용하면 된다.

(1) sendmail 의 경우
sendmail.cf 파일을 보면 아래와 같은 설정이 있다.
# SMTP initial login message (old $e macro)
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
이 부분을 적절히 삭제하거나 다른 정보로 입력후 sendmail 을 재가동하면 된다.
필자가 운영하는 메일서버의 경우
O SmtpGreetingMessage=$j Today and Tomorrow(http://tt.co.kr/) 와 같이 설정하였고 이때 25번 포트로 접속시 보이는 정보는 아래와 같다.

# telnet tt.co.kr 25
Trying 211.47.66.50...
Connected to tt.co.kr.
Escape character is '^]'.
220 www10.tt.co.kr ESMTP Today and Tomorrow(http://tt.co.kr/)

(2) pop3d 의 경우
pop3d 의 경우 소스에서 직접 수정하여야 하는데, 압축 해제한 디렉토리의 /src/ipopd 에 보면 ipop3d.c 파일이 있다. 이 파일을 살펴보면

char *version = "2001.75"; /* server version */
라는 부분이 있는데, 필자가 운영하는 pop3d 의 경우 소스에서
char *version = "xxxxxxxxxx"; /* server version */
와 같이 수정 후 컴파일 하였고 이때 110번 포트로 원격 접속시 보이는 정보는 아래와 같다.

# telnet tt.co.kr 110
Trying 211.47.66.50...
Connected to tt.co.kr.
Escape character is '^]'.
+OK POP3 www10.tt.co.kr vxxxxxxxxxx server ready

버전외 다른 각종 정보도 수정할 수 있으니 각자 상황에 맞게 적절히 설정하기 바란다.


sendmail 과 관련된 몇 가지 명령어

>> mail1q
mailq 프로그램의 목적은 큐잉된(/var/spool/mqueue 에 저장된) mail 메시지의 요약된 정보를 보여준다. 네트워크 다운등 어떤 특정한 이유로 바로 발송되지 못한 메일은 일차적으로 /var/spool/mqueue 에 큐잉된 상태로 저장된 후 일정 시간마다 발송을 위해 재시도가 되는데, 현재 큐잉된 메일 메시지의 요약 정보를 보려면 아래와 같이 확인할 수 있다.

# mailq

/var/spool/mqueue/q1 (2 requests)
----Q-ID---- --Size-- -----Q-Time----- ------------Sender/Recipient------------
f7A84oV15068 1446 Fri Aug 10 17:04 nobody
(Deferred: Connection timed out with kebi.net.)
darling@kebi.net
f775ieF24893 521898 Tue Aug 7 14:44 <shlee@tt.co.kr>
(Deferred: Connection timed out with mail.unitel.net.)
<cf1318@unitel.net>
/var/spool/mqueue/q2 is empty
/var/spool/mqueue/q3 (1 request)
----Q-ID---- --Size-- -----Q-Time----- ------------Sender/Recipient------------
f775nJF25249 230815 Tue Aug 7 14:49 <shlee@tt.co.kr>
(Deferred: Connection timed out with hanmail.com)
cuwww23@hanmail.com

위 메시지를 보면 어떠한 이유로 메일이 발송되지 못하고 있는지를 추측할 수 있다.
3 메시지 모두 수신자의 e-mail 주소를 잘못 기입했기 때문인데, 각각 kebi.com 인데, kebi.net 으로 unitel.co.kr 인데, unitel.net 으로 , hanmail.net 인데, hanmail.com 으로 도메인 주소를 잘못 기입하여 메일을 발송하여 서버에서 메일을 발송하지 못하고 큐에 저장되어 있는 것을 확인할 수 있다.
여기에서 주의할 점은 mailq 명령어는 일반 유저로 실행하여 확인이 가능하므로 퍼미션을 700 등으로 조절하여 일반 유저들은 실행할 수 없도록 하는 것이 좋다.

>> mailstats
mailstats 프로그램은 현재의 메일 송수신과 관련하여 통계를 보여준다.

* 현재의 메일 통게를 보려면 아래와 같이 확인할 수 있다.

# mailstats
Statistics from Sat Aug 11 04:02:02 2001
M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis Mailer
1 0 0K 3 317K 0 0 *file*
4 690 596691K 824 137070K 68426 0 esmtp
9 63 12212K 0 0K 27 0 local
=============================================================
T 753 608903K 827 137387K 68453 0
C 753 827 68453

이를 적절히 이용하면 mrtg 를 이용해 일정 시간마다 발송되고 수신되는 메일의 개수를 통계로 내어 그래프로 볼 수 있다.(본지 10월호, 철벽보안을 위한 모니터링 올가이드 참조)

최근 sendmail 관련 버그에 대해

한동안 문제가 없었던 sendmail 에 최근 들어 몇 가지 보안 문제가 발견되었다.
이 버그는 매우 치명적인 문제인데, 아직 이를 모르고 그대로 사용중인 유저들이 많은 것 같다. 각자의 메일 서버에는 해당사항이 없는지 꼭 확인해 보기 바란다.

첫번째로, 8월말에 발표된 버그는 현재 대부분의 메일 서버 프로그램으로 사용중인 sendmail 8.11.6 이전 버전에 해당하는 보안버그로서 일반유저가 Local 에서 root 권한을 얻을 수 있는 매우 치명적인 버그인데, 이미 공격 소스가 여러 사이트에 공개되어 있다.
참고로 이 버그는 8.11.0부터 8.11.5 버전까지만 해당하므로 8.10.x 나 8.9.x 는 해당되지 않는다. 따라서 아래의 사이트를 참고로 sendmail 을 8.11.6 이나 8.12등 최신버전으로 업그레이드하기 바란다.

8.11.0부터 8.11.5 의 경우 8.11.6 으로 업그레이드하면 되고 8.12.0.Beta 의 경우 8.12.0.Beta19 이상으로 업그레이드하면 된다. 이에 대해서는
http://www.securityfocus.com/bid/3163http://www.sendmail.org/8.11.html
를 참고하기 바란다.

두번째는, 10월초에 발견된 버그로서 모든 버전에 해당하는 문제인데, 이전에도 자주 나왔던 문제이다. 바로 shell 접근이 가능한 일반유저가 sendmail 에 -q 옵션을 사용하여 큐에 있는 메시지를 드롭할 수 있는 문제이다. 아래의 설명을 보기 바란다.

[user@net user]$ id
uid=778(user) gid=778(user)
[user@net user]$ mailq
Mail Queue (1 request)
--Q-ID-- --Size-- -----Q-Time----- ------------Sender/Recipient------------
NAA05248 11 Tue Oct 2 13:03 user1
(Deferred: Connection refused by tt.co.kr.)
test@tt.co.kr

[system@net system]$ /usr/sbin/sendmail -q -h10000
Too many hops 10000 (25 max): from system via localhost, to test@tt.co.kr
Too many hops 10000 (25 max): from MAILER-DAEMON via localhost, to
postmaster
Too many hops 10000 (25 max): from MAILER-DAEMON via localhost, to
postmaster
MAILER-DAEMON... Saved message in /usr/tmp/dead.letter
[user@net user]$ mailq
Mail queue is empty

위와 같이 hop count 를 크게 설정함으로써 일반 유저가 현재 큐의 내용을 강제적으로 drop 시킬 수 있다.

세번째는 역시 모든 버전에 해당하는 문제로 일반 유저가 sendmail -q -d0-xxxx.xxx 와 같이 사용시 (xxx는 디버깅 레벨이다.) 일반 유저가 메일서버의 각종 설정 뿐만 아니라 큐에 저장되어 있는 내용, 메시지 경로나 제목, 메일 소프트웨어등의 정보를 볼 수 있는 문제이다.
두번째,세번째 문제는 sendmail.cf 에서

O PrivacyOptions=authwarnings,novrfy,noexpn,restrictqrun
와 같이 restrictqrun 를 추가함으로써 해결 가능하다.


기타 메일과 관련된 장애가 확인 시

지난달 아파치 웹서버의 장애에 대해 이야기하면서 문제나 장애가 발생시에는 웹서버의 error_log 메시지를 살펴보도록 이야기 했었다. 메일서버도 마찬가지이다. 메일서버 장애시는 문제의 원인을 찾기 위해 로그 파일을 살펴보는 습관을 들이는 것이 좋다.
메일 관련 로그는 /var/log/messages 나 /var/log/maillog 파일을 살펴보면 되며 로그파일을 보면 여기에서 언급하지 않은 문제가 발생했다 하더리도 어렵지 않게 원인을 찾을 수 있을 것이다. 다시 한번 강조하지만 모든 문제의 원인과 해결책은 로그에 있다는 것을 명심하기 바란다

출처(ref.) : 리눅스 - 메일서버의 장애와 대처 방법 - http://lamia.kr/lamiastory/?mid=linuxs&page=7&document_srl=6426
by 라미아

'02.서버-Linux' 카테고리의 다른 글

[리눅스]요약 정리  (0) 2012.12.19
[리눅스]본딩 작업  (0) 2012.12.19
[리눅스]디스크 에러 발생  (0) 2012.12.19
[리눅스]EXT3 파일시스템 최적화  (0) 2012.12.19
[리눅스]시스템 정보 확인  (0) 2012.12.19
Posted by redkite
, |

0032. [리눅스] 디스크 에러 발생

리눅스서버 장애처리와 삭제파일 복구


- 다운된 리눅스서버 응급복구

* 복구보다는 백업을 우선하라.

* 파일시스템이 깨졌을 때 부팅안되는 상황 조치
# fdisk -l -> 깨진 파일시스템 확인
# e2fsck -j ext3 /dev/sda3 -> 파일시스템 점검

* 리눅스CD linux rescue 모드로 보구하기
파일시스템이 깨졌을 때 : e2fsck로 파일시스템 복구
비밀번호 및 로그인장애 : /etc/passwd 파일 점검
grub정보로 부팅장애 : /boot/grub/grub.conf 파일 점검
부팅시 마운트정보 장애 : /etc/fstab 점검

* 리눅스CD linux rescue nomount 로 복구하기
현재 상태에서는 장치파일명이 생성되어있지 않으며 마운트도 되어있지 않기 때문에 현재 시스템의 어떠한 수정작업도 할

수 없는 상황이다.

먼저 필요할 것 같은 장치명들을 임의대로 생성한다.
# mknod /dev/sda -> /dev/sda 장치명 생성
# mknod /dev/sda1 -> /dev/sda1 장치명 생성
# mknod /dev/sda2 -> /dev/sda2 장치명 생성

생성한 장치와 마운트할 마운트포인트(디렉토리)를 생성한다.
# mkdir /temp
# mkdir /temp1
# mkdir /temp2

위에서 생성한 각 장치명과 각 디렉토리들을 마운트한다.
# mount /dev/sda1 /temp1
# mount /dev/sda2 /temp2

* 리눅스 시스템업그레이드 방법으로 복구하기

* 시스템 서버 다운시 매직키를 이용한 응급조치
- ALT + SysRq + S : Alt키와 SysRq키와 S키를 동시에 누른다. sync 작업
- ALT + SysRq + E : Alt키와 SysRq키와 E키를 동시에 누른다. tem SIG 작업
- ALT + SysRq + U : Alt키와 SysRq키와 U키를 동시에 누른다. umount 작업
- ALT + SysRq + B : Alt키와 SysRq키와 B키를 동시에 누른다. reboot 작업

- 삭제된 파일 복구하기

* 리눅스 휴지통(safedelete)을 이용한 삭제파일 복구하기
safedelete라는 명령어는 파일을 삭제하는 명령어이다.
단 rm과는 달리 safedelete라는 명령어로 파일을 삭제하면 특정한 디렉토리에 삭제된 파일을 보관하게 된다.
그리고 삭제된 사용자의 홈디렉토리에 삭제 파일리스트를 저장하고 있는 로그파일에 그 파일정보들을 보관한다.
그리고 safedelete명령어로 삭제된 파일은 undelete라는 명령어로 복구가 가능하다.
따라서, 이 툴로서 삭제된 파일을 복구하려면 파일삭제시에 사용하는 명령어를 rm 대신에 safedelete 명령어를 사용해야한다.
이 툴의 이름은 safedelete이며 삭제와 복구시에 사용되는 명령어는 다음과 같다.

safedelete : rm 대신에 사용하게 될 파일보구가 가능한 삭제명령어
undelete : safedelete로 삭제한 파일을 복구하는 명령어
safecnvt : safedelete 로그파일(.safedelete.log)을 컨버전하는 명령어
safedelchk : 지정한 일자 이후의 safedelete로 삭제한 파일을 완전 삭제함

- safedelete 설치
# wget ftp://ftp.nuri.net/pub/RedHat/redhat/redhat-7.1-en/powertools/i386/RedHat/RPMS/saedelete-1.3-0.i386.rpm
# rpm -Uvh saedelete-1.3-0.i386.rpm

- rm 명령어를 safedelete로 대체하기
# grep safedelete ~/.bashrc
alias rm='safedelete'

* tct의 unrm으로 삭제파일 복구하기
- 설치
http://www.fish.com/tct 에서 다운로드한다.
# tar xvfpz tct-.09.tar.gz
# cd tct-1.09
# make
# cd bin
# cp rnrm /usr/local/bin
# cp lazarus /usr/local/bin

- 삭제파일 복구
# /usr/local/bin/unrm /dev/sda1 > /tmp_dir/dump_temp
# /usr/local/bin/lazarus -h /tmp_dir/dump_temp

* e2fsck 파일시스템 점검복구유틸리티

- e2fsck 종료코드
0 - 에러없이 정상적인 종료를 의미함
1 - 파일시스템을 복구하였음을 의미함
2 - 파일시스템이 복구되어 시스템이 재부팅되어야함을 의미함.
4 - 작업대상 파일시스템에 문제가 있으나 복구하지 않고 그대로 두었음을 의미함.
8 - 실행에러를 의미함
16 - 사용법 또는 문법에러를 의미함
32 - e2fsck작업이 사용자에 의해서 취소되었음을 의미함.
128 - 공유 라이브러리에러를 의미함

- e2fsck작업에서 기본적으로 점검하는 항목
inode 점검
blocks 점검
sizes 점검
디렉토리구조 점검
디렉토리 연결성점검
파일링크 정보
전체파일갯수 점검
전체블록수중 사용중인 블록 정검

- 사용형식
e2fsck [-pacnyrdfvtFV] [-b 수퍼블록] [-B 블록크기] [-l|-L 배드블록목록화일] 장치명
마운트되어 있는 상태에서 e2fsck실행을 자제한다.

- e2fsck 명령어로 특정 파일시스템의 점검 및 복구하기
# e2fsck /dev/hda1

- e2fsck로 특정 파일시스템 강제 점검 및 복구하기
# e2fsck -f /dev/hda1

- ext3(저널링)파일시스템 점검 및 복구하기
# e2fsck -j ext3 /dev/hda1

- e2fsck로 특정 파일시스템 강제 점검 및 상세 작업내역보기
# e2fsck -fv /dev/hda1

- 파일시스템의 수퍼블록을 이용한 파일시스템 복구

-b superblock
Instead of using the normal superblock, use an alternative
superblock specified by superblock. This option is normally
used when the primary superblock has been corrupted. The loca-
tion of the backup superblock is dependent on the filesystem's
blocksize. For filesystems with 1k blocksizes, a backup
superblock can be found at block 8193; for filesystems with 2k
blocksizes, at block 16384; and for 4k blocksizes, at block
32768.

Additional backup superblocks can be determined by using the
mke2fs program using the -n option to print out where the
superblocks were created. The -b option to mke2fs, which spec-
ifies blocksize of the filesystem must be specified in order for
the superblock locations that are printed out to be accurate.

If an alternative superblock is specified and the filesystem is
not opened read-only, e2fsck will make sure that the primary
superblock is updated appropriately upon completion of the
filesystem check.

# e2fsck -b 8193 /dev/hda1
# e2fsck -b 16385 /dev/sda1

- e2fsck로 파일시스템 점검시 버퍼캐쉬의 내용을 디스크에 저장하기

-F옵션을 사용하면 e2fsck를 수행하기 이전에 sync작업을 수행한다.
# e2fsck -F /dev/sda1

- e2fsck로 특정 파일시스템 점검시 오류 자동수정하기
# e2fsck -p /dev/sda1

- e2fsck로 파일시스템 점검시 모든 질문항목에 yes라고 자동입력하기
# e2fsck -y /dev/sda1

- e2fsck로 파일시스템 점검시 모든 질문항목에 no라고 자동입력하기
# e2fsck -n /dev/sda1

Posted by redkite
, |

ext2 파일시스템보다 ext3이 대부분의 경우 빠른 속도를 보인다.
ext3 파일시스템을 마운트할때 파일 데이터에 대한 3가지 저널링 모드중 하나를 선택할 수 있다.(data=journal/ordered/writeback)
1. journal - 메일 파일 시스템에 데이터를 기록하기전에 모든 데이터는 저널에 넘겨진다.

2. ordered - default. 메타데이터가 저널에 넘겨지기 전에 모든 데이터를 강제적으로 먼저 주 파일 시스템에 기록한다.

3. writeback - 메타데이터를 우선적으로 저널에 넘긴 후 모든 데이터를 메인파일시스템에 기록한다. 성능 향상이 된다고 알려져 있는 모드인데 크래쉬 될 경우 이전 데이터가 복구가 안될 수 있다.

Posted by redkite
, |

리눅스 시스템에서 제공하는 간단한 파일 몇개만 보아도
시스템에 대한 정보를 대략 파악할수 있다.

#cat /proc/cpuinfo //cpu 정보

#cat /proc/pci //pci 정보

#cat /proc/interrupts //사용중인 irq 정보

#cat /proc/dma //사용중인 dma 채널

#cat /proc/ioports //사용중인 i/o 포트 정보

#cat /proc/filesystems //현재 사용가능한 화일 시스템

#cat /proc/meminfo //현재 사용중인 메모리

#cat /proc/partitions //현재 사용중인 파티션

#cat /proc/swaps //현재 사용중인 스왑파티션 정보

#cat /proc/version //현재 사용중인 커널 버전

#cat /proc/devices //현재 사용중인 드라이버

#cat /proc/cmdline //현재 사용중인 부트 이미지

Posted by redkite
, |

0029. [리눅스] 랜카드 속도와 전송모드 변경

1. mii-tool 를 이용

Ethernet Card Interface 를 조정하는 역할을 담당한다.
이 때 주의할 사항은 잘못된 설정을 하였을 경우, 랜카드가 연결이 끊긴 것으로 표시될 수 있다는 점이다.
즉, 네트워크로 작업을 할경우 잘못하다가는 서버에 접속이 안되는 경우가 발생할 수 있다는 말이다.

사용법

- 이더넷 설정확인: mii-tool -v eth0
- 이더넷 설정변경: mii-tool -F 100baseTx-FD eth0




2. modprobe 를 이용

리눅스 커널의 모듈을 관리하는 역할을 담당한다.

사용법

- 이더넷 설정변경: modprobe eth0 speed_dumplex=4


speed_dumplex=0 : auto detection
speed_dumplex=1 : 10M half duplex
speed_dumplex=2 : 10M full duplex
speed_dumplex=3 : 100M half duplex
speed_dumplex=4 : 100M full duplex


3. ethtool 이용

일반적으로 스위치나 서버의 NIC에서 속도설정은 대부분 auto모드로 설정되어 있다
따라서 별도의 설정작업을 하지 않아도 대부분 속도는 맞게 설정되어 있다.
하지만 가끔 제 속도가 나오지 않은 경우 ethtool을 이용함으로 해결할 수 있다.

ethtool은 현 서버에 설정되어 있는 Ethernet card의 속도 설정 문제와 전송모드(full, halt)를 설정하거나 확인할 수 있는 툴이다.

사용법

- 이더넷 설정확인 : ethtool eth0
- 이더넷 설정변경 : ethtool -s eth0 [speed 10|100|1000] [duplex half|full] [autoneg on|off]

ethtool로 eth0장치 정보출력

 

Supported Link Modes : 지원가능한링크모드.

Supports auto-negotiation : 자동협상인식기능의지원여부.
Autonego = 속도등의 자동인식 여부.

'02.서버-Linux' 카테고리의 다른 글

[리눅스]EXT3 파일시스템 최적화  (0) 2012.12.19
[리눅스]시스템 정보 확인  (0) 2012.12.19
[리눅스]파티션 설계  (0) 2012.12.19
[리눅스]패키지 업데이트  (0) 2012.12.19
[리눅스]고급 커맨드 2  (0) 2012.12.19
Posted by redkite
, |

0025. [리눅스] 파티션 설계

Linux 학습, 기초 과정: 하드 디스크 레이아웃

하드 디스크 파티션 계획

Linux&(R) 시스템 상의 디스크에 대한 파티션 레이아웃 디자인 방법을 학습합니다. 본 기사의 자료를 활용하여 Linux 시스템 관리자 인증을 위한 LPI 기초 과정 시험에 대비한 공부를 하거나, 단순히 흥미로 배울 수도 있습니다.

개요

이 기사에서는 Linux 시스템을 위한 디스크 파티셔닝 레이아웃을 디자인하는 방법을 학습한다. 구체적인 내용은 다음과 같다.

- 파일 시스템을 할당하고 공간을 스왑하여 파티션이나 디스크 분리
- 시스템의 사용 목적에 따른 맞춤형 디자인
- 시스템을 부팅할 수 있는지 확인

이 기사는 Linux Professional Institute의 Junior Level Administration(LPIC-1) 시험 기초 과정의 Topic 102에서 Objective 102.1에 대비하는 데 도움이 된다. 이 목적의 가중치는 2이다.

주: 이 기사에서는 주로 레이아웃 계획에 대해 다룬다. 구현 절차는 Topic 104를 다룬 기사들을 참조한다(series roadmap에 설명되어 있음).

전제 조건

본 시리즈에 수록된 기사를 최대한 활용하려면 Linux에 대한 기본적인 지식과 이 기사에서 다루는 명령을 실습할 수 있는 Linux 시스템이 있어야 한다. 때때로 같은 프로그램이라도 버전이 다르면 출력 형식이 다르므로, 실습 결과가 이 기사에서 보여주는 Listing 및 그림과 항상 정확히 같지는 않을 수도 있다.

파일 시스템 개요

Linux 파일 시스템에는 디스크나 디렉토리에 있는 다른 블록 스토리지 장치에 배열된 파일이 들어 있다. 다른 많은 시스템과 마찬가지로, Linux 시스템 상의 디렉토리에는 서브디렉토리라는 다른 디렉토리가 포함될 수 있다. 다른 드라이브 문자(A:, C: 등)에 별개의 파일 시스템이 있는 개념으로 구성되는 Microsoft&(R) Windows&(R) 같은 시스템과는 달리, Linux 파일 시스템은 / 디렉토리를 루트 디렉토리로 가진 단일 트리이다.

파일 시스템이 단지 하나의 큰 트리라면 디스크 레이아웃이 뭐가 그리 중요한지 의아할 것이다. 실제로는 하드 드라이브 파티션, CD-ROM 또는 플로피 디스크와 같은 각각의 블록 장치에 파일 시스템이 있다. 마운트 지점이라는 트리 내의 한 지점에 있는 다른 장치들에 파일 시스템을 마운트하여 파일 시스템에 대한 단일 트리 뷰를 만든다.

일반적으로, 커널은 어떤 하드 드라이브 파티션에 파일 시스템을 /로 마운트함으로써 이 마운트 프로세스를 시작한다. 다른 하드 드라이브 파티션을 /boot, /tmp 또는 /home으로 마운트할 수도 있다. 예를 들어, 파일 시스템을 플로피 드라이브에는 /mnt/floppy로, CD-ROM에는 /media/cdrom1로 마운트할 수 있다. NFS와 같은 네트워크 파일 시스템을 사용하여 다른 시스템에서 파일을 마운트할 수도 있다. 다른 유형의 파일 마운트도 있지만, 이 유형으로 프로세스에 대한 개념은 파악할 수 있다. 마운트 프로세스에서는 실제로 어떤 장치에 파일 시스템을 마운트하지만 간단히 "장치를 마운트한다"고 말하는 것이 일반적이며, 이 말은 곧 "장치에 파일 시스템을 마운트한다"는 의미로 통한다.

이제, 방금 루트 파일 시스템(/)을 마운트했는데 마운트 지점 /media/cdrom에 CD-ROM인 /dev/sr0을 마운트하려는 경우를 생각해보자. 마운트 지점에 CD-ROM을 마운트하기에 앞서 우선 해당 마운트 지점이 존재해야 한다. CD-ROM을 마운트하면 CD-ROM 상의 파일과 서브디렉토리가 /media/cdrom과 그 이하의 경로에 있는 파일과 서브디렉토리가 된다. 이미 /media/cdrom에 있었던 모든 파일이나 서브디렉토리는 여전히 마운트 지점 /media/cdrom에 포함된 블록 장치에 있지만 더 이상 볼 수 없다. CD-ROM이 마운트 해제되면 원본 파일과 서브디렉토리를 다시 볼 수 있게 된다. 따라서 마운트 지점으로 사용할 목적으로 만든 디렉토리에 다른 파일을 넣지 않도록 주의하여 이런 문제가 생기지 않게 해야 한다.

표 1은 FHS(Filesystem Hierarchy Standard)에서 필수적인 디렉토리를 나타낸 것이다(FHS에 대한 자세한 내용은 참고자료 참조).

디렉토리

설명

bin

필수 명령 2진 파일

boot

부트 로더의 정적 파일

dev

장치 파일

etc

특정 호스트에 적합한 시스템 구성

lib

필수 공유 라이브러리 및 커널 모듈

media

이동식 매체용 마운트 지점

mnt

파일 시스템을 임시로 마운트하기 위한 마운트 지점

opt

추가 기능 애플리케이션 소프트웨어 패키지

sbin

필수 시스템 2진 파일

srv

이 시스템에서 제공하는 서비스를 위한 데이터

tmp

임시 파일

usr

보조 계층 구조

var

변수 데이터

 

파티션

첫 번째 SCSI 드라이브는 보통 /dev/sda이다. 이전의 Linux 시스템에서 첫 번째 IDE 하드 드라이브는 /dev/hda이다. 직렬 연결된 (SATA) IDE 드라이브의 등장과 함께, PATA/SATA 혼합 시스템에서는 때때로 첫 번째 PATA 드라이브에 대해서는 /dev/hda, 첫 번째 SATA 드라이브에 대해서는 /devsda를 사용한다. 그 이후에 나온 신형 시스템에서는 모든 IDE 드라이브의 이름이 /dev/sda, /dev/sdb 등으로 지정되었다. IDE 드라이브의 이름 변경은 최초로 USB 드라이브를 지원한 핫플러그 시스템의 결과다. 핫플러그 덕분에 새 장치를 플러그인하는 즉시 사용할 수 있으며, 현재 핫플러그는 장치가 시스템에 내장되어 있든 USB 또는 Firewire(IEEE 1394)를 사용하여 작동 중인 시스템에 나중에 플러그인하든 다른 유형의 연결을 하든 상관없이 모든 장치에 사용된다.

일반적으로, 하드 드라이브는 512바이트 섹터로 포맷된다. 헤드를 움직이지 않고 읽을 수 있는 디스크 플래터 상의 모든 섹터가 트랙을 구성한다. 디스크에는 보통 둘 이상의 플래터가 있다. 헤드를 움직이지 않고 읽을 수 있는 다양한 플래터 상의 트랙 콜렉션을 실린더라고 한다. 하드 드라이브의 구조는 실린더 수, 실린더당 트랙(또는 헤드) 수, 트랙당 섹터 수로 표현된다. 이 기사를 쓰는 현재, 드라이브 제조업체들은 4K 섹터를 가진 디스크를 출시하기 시작하고 있다. 파일 시스템에서 여전히 512바이트 섹터로 받아들이는 경우, 파티션이 4K 경계에 있는 섹터에서 시작하지 않으면 성능이 저하될 수 있다.

PC 시스템에 있는 DOS 운영 체제에서 사용되는 실린더, 헤드 및 섹터에 대해 가능한 크기에 대한 제한으로 BIOS 변환 구조 값이 생겼고, 이로 인해 더 큰 하드 드라이브가 지원될 수 있다. 결국, 이런 방법들도 충분치 못했다. 보다 최근에 이루어진 디스크 드라이브 기술의 발전으로 논리적 블록 주소 지정(LBA)으로 이어졌고, 이에 따라 CHS 구조 측정의 중요성이 떨어지고 현대적 디스크의 구조는 실제의 물리적 섹터 레이아웃과 거의 또는 아무런 관계가 없을 수도 있다. 오늘날 사용 중인 대용량 디스크들은 섹터 번호를 위해 최대 48비트까지 예약해서 LBA48이라고 알려진 LBA로까지 확장되었다.

하드 드라이브 상의 공간은 파티션으로 분리된다(파티션된다). 파티션은 겹칠 수 없다. 파티션에 할당되지 않는 공간을 여유 공간이라고 한다. 파티션에는 /dev/hda1, /dev/hda2, /dev/hda3, /dev/sda1 등의 이름이 있다. IDE 드라이브는 IDE 드라이브를 위한 핫플러그 지원을 이용하지 않는 시스템에서는 파티션 수가 63개로 제한된다. 핫플러그가 지원되는 SCSI 드라이브, USB 드라이브 및 IDE 드라이브는 파티션 수가 15개로 제한된다. 파티션은 종종 실린더의 총 개수로 할당된다(실린더에 대한 부정확한 개념을 바탕으로 함).

서로 다른 두 파티셔닝 프로그램에서 명목 디스크 구조를 다르게 이해하는 경우, 한 파티셔닝 프로그램이 다른 파티셔닝 프로그램에서 만든 파티션에 오류가 있거나 문제 발생 가능성이 있는 것으로 보고할 수 있다. 특히 BIOS 기능이 서로 다른 두 시스템 간에 디스크를 이동하는 경우에도 이런 종류의 문제가 발생할 수 있다.

parted 또는 fdisk 도구를 사용하면 Linux 시스템에서 명목 구조를 볼 수 있다. 이전 버전의 Linux 시스템에서는 /proc 파일 시스템, /proc/ide/hda/geometry와 같은 파일, 최신 버전의 시스템에는 없을 수도 있는 파일에서 구조를 보고하기도 했다. Listing 1은 fdisk 명령을 사용하여 SATA가 연결된 IDE 하드 드라이브의 파티션과 구조를 표시하는 방법을 나타낸 것이다. fdisk의 -v 매개변수로 버전을 확인할 수 있다. 파티션 테이블을 표시하거나 조작하려면 여기에 나타낸 것처럼 루트 사용자이거나 sudo를 통해 루트 권한을 가지고 있어야 한다.

Listing 1. 하드 디스크 구조

 

 

ian@attic4:~$ fdisk -v

fdisk (util-linux-ng 2.16)

ian@attic4:~$ sudo fdisk /dev/sdb

[sudo] password for ian:

 

The number of cylinders for this disk is set to 30401.

There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:

1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs

(e.g., DOS FDISK, OS/2 FDISK)

 

Command (m for help): p

 

Disk /dev/sdb: 250.1 GB, 250059350016 bytes

255 heads, 63 sectors/track, 30401 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Disk identifier: 0x000404d6

 

Device Boot Start End Blocks Id System

/dev/sdb1 1 25 200781 83 Linux

/dev/sdb2 26 12965 103940550 83 Linux

/dev/sdb3 12966 30401 140054670 83 Linux

 

Command (m for help):

 

Listing 1에서 fdisk를 통해 실린더 1024의 끝을 나타내는 명목 위치에 대한 경고가 인쇄된다는 점을 유심히 살펴보자. 실린더 1024는 BIOS가 디스크의 첫 1024개의 실린더 내에 완전히 자리를 잡고 있는 파티션만 부팅할 수 있는 일부 이전 시스템에서 중요하다. LBA 지원 기능이 없는 BIOS나 일부 이전 부팅 매니저에서 이런 경고가 인쇄된다. 한계가 존재할 수 있다는 점은 인식해야겠지만, 이는 보통 현대식 시스템에서 나타나는 문제는 아니다.

fdisk와 -u 옵션을 사용하여 섹터 내 유닛을 표시하거나 대화식 모드에서 u 하위 명령을 사용하여 섹터와 실린더 간에 전환할 수 있다. parted 명령에서는 여러 가지 다른 유닛을 지원한다. Listing 2는 Listing 1에서 사용한 것과 같은 디스크에 대해 parted에서 다른 유닛을 사용하는 것을 나타낸 것이다.

Listing 2. parted에서 다른 유닛 사용

 

 

ian@attic4:~$ sudo parted /dev/sdb

[sudo] password for ian:

GNU Parted 1.8.8.1.159-1e0e

Using /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) help u

unit UNIT set the default unit to UNIT

 

UNIT is one of: s, B, kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB,

GiB, TiB

(parted) p

Model: ATA HDT722525DLA380 (scsi)

Disk /dev/sdb: 250GB

Sector size (logical/physical): 512B/512B

Partition Table: msdos

 

Number Start End Size Type File system Flags

1 32.3kB 206MB 206MB primary ext3

2 206MB 107GB 106GB primary ext4

3 107GB 250GB 143GB primary ext3

 

(parted) u s

(parted) p

Model: ATA HDT722525DLA380 (scsi)

Disk /dev/sdb: 488397168s

Sector size (logical/physical): 512B/512B

Partition Table: msdos

 

Number Start End Size Type File system Flags

1 63s 401624s 401562s primary ext3

2 401625s 208282724s 207881100s primary ext4

3 208282725s 488392064s 280109340s primary ext3

 

(parted) u chs

(parted) p

Model: ATA HDT722525DLA380 (scsi)

Disk /dev/sdb: 30401,80,62

Sector size (logical/physical): 512B/512B

BIOS cylinder,head,sector geometry: 30401,255,63. Each cylinder is 8225kB.

Partition Table: msdos

 

Number Start End Type File system Flags

1 0,1,0 24,254,62 primary ext3

2 25,0,0 12964,254,62 primary ext4

3 12965,0,0 30400,254,62 primary ext3

 

(parted)

 

parted 및 fdisk 출력으로 표시되는 시작 실린더와 종료 실린더 사이의 명백한 차이점은 parted는 실린더 계수를 0부터 시작하지만 fdisk는 1부터 계수하기 시작한다는 사실로 인한 것이다. Listing 3은 fdisk의 시작 및 종료 섹터가 parted와 같음을 나타낸 것이다.

Listing 3. 시작 및 종료 섹터 번호 확인

 

 

ian@attic4:~$ sudo fdisk -ul /dev/sdb

 

Disk /dev/sdb: 250.1 GB, 250059350016 bytes

255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors

Units = sectors of 1 * 512 = 512 bytes

Disk identifier: 0x000404d6

 

Device Boot Start End Blocks Id System

/dev/sdb1 63 401624 200781 83 Linux

/dev/sdb2 401625 208282724 103940550 83 Linux

/dev/sdb3 208282725 488392064 140054670 83 Linux

ian@attic4:~$ echo $(( 208282725 / 255 / 63 ))

12965

 

파티션 유형

IDE 드라이브에는 기본, 논리 및 확장 파티션이라는 세 가지 유형의 파티션이 있다. 파티션 테이블은 디스크의 MBR(Master Boot Record)에 있다. MBR은 디스크 상의 첫 번째 섹터이므로, 파티션 테이블이 디스크의 매우 큰 부분을 차지하지는 않는다. 따라서 디스크에 있는 기본 파티션의 수는 4개로 제한된다. 그런 일이 자주 있겠지만, 5개 이상의 파티션이 필요할 때는 기본 파티션 중 하나가 대신 확장 파티션이 되어야 한다.

확장 파티션은 단순히 하나 또는 대개의 경우 그 이상의 논리 파티션을 위한 컨테이너일 뿐이다. 이런 파티셔닝 스킴은 원래는 MS DOS와 PC DOS에서 사용되었는데, 이를 통해 DOS, Windows 또는 Linux 시스템에서 PC 디스크를 사용할 수 있다. 한 디스크에는 확장 파티션이 하나만 포함될 수 있다. 데이터는 확장 파티션 내부의 논리 파티션에 저장된다. 우선 확장 파티션 내에 논리 파티션부터 만들어야 확장 파티션에 데이터를 저장할 수 있다.

Linux에서는 기본 또는 확장 파티션을 1에서 4까지 번호를 지정하므로, dev/sda에는 4개의 기본 파티션, 즉 /dev/sda1, /dev/sda2, /dev/sda3 및 /dev/sda4가 있을 수 있다. 또는 기본 파티션 /dev/sda1 하나와 확장 파티션 /dev/sda2가 있을 수도 있다. 논리 파티션이 정의되어 있는 경우 이 파티션은 5부터 시작해서 번호가 지정되므로, 디스크에 기본 파티션이 없고 확장 파티션(/dev/sda1)만 하나 있더라도 /dev/sda에서 첫 번째 논리 파티션은 /dev/sda5가 된다. 따라서 IDE 드라이브에 5개 이상의 파티션을 원하는 경우 파티션 번호 하나는 확장 파티션에 내주게 될 것이다. IDE 드라이브에서 이론적인 최대 파티션 수는 이제 핫플러그를 포함한 커널에 대해 15개로 제한되지만, 마지막 몇 개를 만들거나 만들지 못할 수 있다. 한 드라이브에서 12개를 넘는 파티션을 사용할 계획이라면 모든 것이 올바로 작동할 수 있는지 조심스럽게 확인한다.

앞서 제시한 예제들에 사용되는 디스크에는 3개의 기본 파티션이 있으며, 이들은 전부 Linux용으로 포맷되어 있다. 두 기본 파티션에서 ext3 파일 시스템을 사용하고, 나머지 한 기본 파티션에서는 ext4를 사용한다. Listing 4는 Ubuntu 9.10 시스템에 기본, 확장 및 논리 파티션이 있는 내부 드라이브와 Fedora 12 시스템에 연결된 USB 드라이브에 대해 parted 명령 p를 사용하여 얻은 출력 결과를 나타낸 것이다. 다른 파일 시스템 유형에 유의한다. 또한, 명령행에서 하나 이상의 parted 명령을 지정하면 대화식 모드를 피할 수 있다.

Listing 4. parted로 파티션 테이블 표시

 

 

ian@attic4:~$ sudo parted /dev/sda u s p

[sudo] password for ian:

Model: ATA WDC WD6401AALS-0 (scsi)

Disk /dev/sda: 1250263728s

Sector size (logical/physical): 512B/512B

Partition Table: msdos

 

Number Start End Size Type File system Flags

1 63s 2040254s 2040192s primary ext3

2 2040255s 22523129s 20482875s primary linux-swap(v1)

4 22523130s 1250258624s 1227735495s extended boot

5 22523193s 167397299s 144874107s logical ext3

6 167397363s 310761359s 143363997s logical ext3

7 310761423s 455442749s 144681327s logical ext3

8 455442813s 600092009s 144649197s logical ext3

[root@echidna ~]# parted /dev/sdc p

Model: WD My Book (scsi)

Disk /dev/sdc: 750GB

Sector size (logical/physical): 512B/512B

Partition Table: msdos

 

Number Start End Size Type File system Flags

1 32.3kB 135GB 135GB primary fat32 lba

2 135GB 750GB 616GB extended

5 135GB 292GB 157GB logical ext3

6 292GB 479GB 187GB logical ext3

7 479GB 555GB 76.5GB logical ext3

8 555GB 750GB 195GB logical ext3

 

디스크 공간 할당

앞서 언급했듯이, Linux 파일 시스템은 /에 루트가 있는 단일 대형 트리이다. 플로피 디스크나 CD-ROM 상의 데이터를 마운트해야 하는 이유는 아주 명백하지만, 하드 드라이브에 저장된 데이터의 분리를 고려해야 하는 이유는 아마 덜 분명할 것이다. 파일 시스템을 분리해야 하는 몇 가지 합당한 이유는 다음과 같다.

&- 부트 파일. 부팅 시 BIOS 또는 부트 로더에서 일부 파일에 액세스할 수 있어야 한다.
&- 다중 하드 드라이브. 일반적으로 각각의 하드 드라이브는 하나 이상의 파티션으로 나뉘며, 각 파티션에는 파일 시스템 트리의 어느 지점에서는 마운트해야 하는 파일 시스템이 있다.
&- 공유 가능한 파일. 여러 시스템 이미지가 실행 가능 프로그램 파일과 같은 정적 파일을 공유할 수 있다. 사용자 홈 디렉토리나 메일 스풀 파일 같은 동적 파일도 공유될 수 있으므로, 사용자는 네트워크 상의 여러 시스템 중 어느 하나에 로그인하고 계속 같은 홈 디렉토리와 메일 시스템을 사용할 수 있다.
&- 오버플로우 가능성. 파일 시스템이 용량의 100%까지 가득 찰 수 있는 경우, 일반적으로 시스템을 실행하는 데 필요한 파일에서 이것을 분리하는 것이 좋은 방법이다.
&- 할당량. 할당량에 따라 사용자나 그룹이 파일 시스템에서 차지할 수 있는 공간의 양이 제한된다.
&- 읽기 전용 마운트. 저널링 파일 시스템이 등장하기 전에는 시스템 충돌 후 파일 시스템 복구에 오랜 시간이 걸렸었다. 따라서 (실행 가능 프로그램의 디렉토리와 같이) 거의 변경되지 않은 파일 시스템은 시스템 충돌 후 이를 확인하느라 시간을 낭비하지 않도록 읽기 전용으로 마운트할 수 있었다.

지금까지 다룬 파일 시스템의 용도 외에, 디스크 상의 할당 스왑 공간도 고려할 필요가 있다. Linux 시스템의 경우, 이 공간은 보통 하나의 전용 파티션이거나 여러 개의 전용 파티션일 수도 있다.

선택

최소한 하나 이상의 하드 드라이브가 있는 시스템을 설정하여 하드 드라이브에서 부팅하려는 경우를 생각해보자. (이 기사에서 LAN을 통해 부팅되는 디스크 없는 워크스테이션에 대한 설정이나 라이브 CD 또는 DVD Linux 시스템을 사용하기 위한 고려사항을 다루지는 않는다.) 이후에 파티션 크기를 변경하는 것도 가능하겠지만, 이를 위해서는 보통 약간의 작업이 필요하므로 미리 올바로 선택하는 것이 중요하다. 이제 시작해 보자.

첫 번째 고려사항은 시스템을 부팅할 수 있을 것인지 확인하는 것이다. 일부 이전 시스템의 경우, BIOS가 디스크의 첫 1024개의 실린더 내에 온전히 있는 파티션에서만 부팅할 수 있는 제한이 있다. 그런 시스템을 가지고 있다면 시스템 부팅에 필요한 키 파일을 보유하고 있을 /boot로 결국 마운트될 파티션을 반드시 만들어야 한다. 이들 파일이 로드된 후, Linux 시스템은 디스크의 작업을 인계받고 1024 실린더 한계가 시스템의 추가 작업에는 영향을 주지 않게 된다. /boot용 파티션을 만들어야 하는 경우에는 보통 약 100MB로 충분하다.

다음으로는 필요한 스왑 공간의 양을 고려해야 할 것이다. 현재의 메모리 가격을 고려할 때, 스왑 공간은 매우 느린 보조 메모리라 할 수 있다. 한 가지 일반적인 경험칙은 실제 RAM과 같은 용량의 스왑 공간을 만드는 것이었다. 지금은 워크스테이션에 알맞게 실제 RAM의 1배 또는 2배로 구성하기를 원할 수 있으므로, RAM 용량이 고갈되지 않고 여러 개의 큰 프로그램을 사용할 수 있다. 이들 프로그램 간의 전환 속도가 느리더라도, 아마 주어진 시간에 한두 개의 프로그램에서만 작업할 것이다.

또한, 메모리가 매우 작은 시스템에는 큰 스왑 공간을 사용하는 것이 좋다. 서버의 경우 다른 값을 권장하는 애플리케이션을 실행하는 것이 아니라면 RAM의 절반 정도에 해당하는 스왑 공간을 사용하면 된다. 어떤 경우든, 필요할 때 실제 RAM을 추가하거나 다른 서버에 워크로드를 분배할 수 있도록 서버 메모리 사용량을 모니터해야 한다. 지나치게 많은 스와핑이 서버에서 좋은 경우는 거의 없다. 스왑 파일을 사용할 수 있지만, 전용 파티션의 성능이 더 낫다.

이제 확산 지점에 이르렀다. 개인용 워크스테이션 사용이 서버 사용보다 예측 가능성이 훨씬 떨어지는 경향이 있다. 필자의 환경 설정, 특히 새 사용자에 대한 환경 설정은 대부분의 표준 디렉토리(/usr, /opt, /var 등)를 단일 대용량 파티션에 할당하는 것이다. 이것은 특히 무엇이 설치될 것인지 완전히 알지 못할 수도 있는 새 사용자에게 유용하다. 그래픽 데스크탑과 적당한 수의 개발 도구를 실행 중인 워크스테이션에는 5GB 이상의 디스크 공간과 사용자 요구에 맞는 공간이 필요할 것이다. 더 큰 몇몇 개발 도구에는 각각 수 기가바이트가 필요할 수 있다. 필자는 보통 운영 체제당 40GB-60GB 정도를 할당하고 디스크의 나머지 공간은 다른 애플리케이션을 로드할 수 있도록 남겨둔다.

서버 워크로드가 더 안정적일 것이며, 특정 파일 시스템의 공간이 부족해지면 더욱 치명적인 결과가 발생할 것이다. 따라서 이런 워크로드를 위해, 일반적으로 아마 하드웨어 또는 소프트웨어 RAID 또는 논리 볼륨 그룹을 사용하여 파티션을 여러 개 만들고 여러 디스크에 이들 파티션을 분산할 것이다.

특정 파일 시스템 상의 워크로드와 해당 파일 시스템을 여러 시스템 간에 공유할지, 아니면 한 시스템에서만 사용할지 여부도 고려하고 싶을 것이다. 경험, 용량 계획 도구 및 예상 성장률을 종합적으로 이용해 자신의 시스템에 최상의 할당량을 결정할 수 있다.

워크스테이션이나 서버의 구성 여부에 상관없이, 로컬 드라이브에 있는 각 시스템에 대해 고유한 파일을 가지고 있을 것이다. 일반적으로, 시스템 매개변수에 대한 /etc, 부팅 중 필요한 파일에 대한 /boot, 부팅 또는 시스템 복구에 필요한 파일에 대한 /sbin, 루트 사용자의 홈 디렉토리에 대한 /root, 잠금 파일에 대한 /var/lock, 실행 중인 시스템 정보에 대한 /var/run, 이 시스템의 로그 파일에 대한 /var/log가 포함된다. 사용자 홈 디렉토리에 대한 /home, /usr, /opt, /var/mail 또는 /var/spool/news 같은 다른 파일 시스템은 설치 요구와 환경 설정에 따라 별개의 파티션에 있거나 네트워크 마운트될 수 있다

Posted by redkite
, |
  1. Name 서버 등록

vi /etc/resolve.conf 파일을 연다.

nameserver 168.126.63.1

  1. nslookup 으로 dns 정상 확인

nslookup www.naver.com (IP 확인)

  1. RHN 등록 사이트에 서버 삭제(라이센스 문제로 서버가 5대 이상 등록되어 있을 경우 등록된 서버를 삭제 한다)

https://rhn.redhat.com/rhn/systems/Registered.do?filter_string=&lower=1&submitted=true&threshold=sixmonths

  1. 서버를 rhn 사이트에 등록

rhn_register 실행(이후 next.......)

  1. 버전 별 업데이트 방법

5.x버젼

yum update -y

4.x버젼

vi /etc/sysconfig/rhn/up2date 수정

pkgSkipList=kernel*; ==> pkgSkipList=; 으로 수정(kernel 의존성검사 Skip 제거)

up2date -p ## 패키지 업데이트 목록 확인

up2date -u ## 패티지 업데이트

'02.서버-Linux' 카테고리의 다른 글

[리눅스]랜카드 속도와 전송모드 변경  (0) 2012.12.19
[리눅스]파티션 설계  (0) 2012.12.19
[리눅스]고급 커맨드 2  (0) 2012.12.19
[리눅스]고급 커맨드 1  (0) 2012.12.19
[리눅스]불필요 서비스 제거  (0) 2012.12.19
Posted by redkite
, |

0015. [리눅스] 고급 커맨드 2

고급 Linux 커맨드 마스터 가이드, 제 2 부


저자 - Arup Nanda

게시일: 2007년 2월

이번 시리즈의제 1 부에서는 잘 알려지지 않은 커맨드, 또는 매개변수의 몇 가지 유용한 활용 방법에 대해 소개하였습니다. 이번에는 좀 더 고급 레벨의 커맨드 중에서 오라클 개발자, DBA 들에게 유용한 명령들을 설명하고자 합니다.

 

alias와 unalias

 

쉘에서 설정된 ORACLE_SID 환경 변수를 점검해야 하는 경우를 생각해 봅시다. 이때 사용되는 명령이 아래와 같습니다.

echo $ORACLE_HOME

DBA 또는 개발자들은 이 명령을 매우 자주 사용합니다. 하지만 16 자나 되는 커맨드를 매번 입력하는 것이 귀찮은 경우가 많습니다. 좀 더 간단한 방법은 없을까요?

이런 경우에 유용한 것이 alias 커맨드입니다. 예를 들어, 위와 같은 상황에서는 "os"와 같은 짧은 앨리어스를 생성하여 전체 커맨드를 축약할 수 있습니다.

alias os='echo $ORACLE_HOME'

이제 ORACLE_SID를 확인할 때 "os"만 입력하면 Linux가 앨리어스 처리된 커맨드를 실행합니다.

하지만 사용자가 시스템에서 로그아웃 했다가 다시 로그인하면, 앨리어스 설정은 사라지고 다시 alias 명령을 실행해야 합니다. 이 작업을 반복하지 않으려면 쉘의 프로파일 파일에 커맨드를 저장해 두면 됩니다. bash 쉘의 프로파일 파일은 홈 디렉토리에 위치한 .bash_profile입니다(파일 앞에 "." 기호가 있음에 주의하십시오). bourne, korn 쉘의 경우에는 .profile, 그리고 c 쉘의 경우에는 .chsrc입니다.

앨리어스는 어떤 이름으로든 설정할 수 있습니다. 예를 들어 rm이라는 앨리어스에 rm -i 커맨드를 설정하면 rm 커맨드는 항상 인터액티브 방식으로 실행됩니다.

alias rm='rm -i'

따라서 사용자가 rm 커맨드를 입력할 때마다 Linux는 확인을 요구하며, 사용자가 "y"를 입력하지 않으면 파일을 삭제하지 않기 때문에 실수로 중요한 파일을 삭제하는 경우를 예방할 수 있습니다. 필자는 (새로운 이름으로 파일을 이동하는 명령인) mv 커맨드와 (파일 복제를 위한) cp 커맨드에도 같은 방법을 사용하고 있습니다.

필자가 자주 이용하는 몇 가지 유용한 앨리어스의 목록이 아래와 같습니다:

alias bdump='cd $ORACLE_BASE/admin/$ORACLE_SID/bdump'

alias l='ls -d .* --color=tty'

alias ll='ls -l --color=tty'

alias mv='mv -i'

alias oh='cd $ORACLE_HOME'

alias os='echo $ORACLE_SID'

alias rm='rm -i'

alias tns='cd $ORACLE_HOME/network/admin'

쉘에 어떤 앨리어스가 정의되어 있는지 확인하려면 매개변수 없이 alias를 입력합니다.

하지만 여기 작은 문제가 있습니다. 앞에서 rm 앨리어스에 rm -i 커맨드를 적용하였습니다. 이 커맨드는 사용자가 파일을 삭제하려 할 때마다 확인 프롬프트를 띄울 것입니다. 그렇다면 확인 과정을 거치지 않고 많은 수의 파일을 삭제하려 한다면 어떻게 해야 할까요?

방법은 간단합니다. 앨리어스를 비활성화하고 커맨드가 직접 실행되도록 하기 위해서는 아래와 같이 커맨드에 작은 따옴표 두 개를 넣어주면 됩니다.

$ ''rm *

앞의 기호가 큰 따옴표(")가 아닌 두 개의 작은 따옴표('')임에 주의하시기 바랍니다. 이와 같은 방법으로 rm 앨리어스를 비활성화할 수 있습니다. 또 다른 방법으로 백슬래쉬를 이용할 수 있습니다.

$ \rm *

앞에서 정의한 앨리어스를 제거하려면 unalias 커맨드를 사용합니다.

$ unalias rm

ls

ls 커맨드는 가장 자주 사용되는 명령의 하나이지만, 그 잠재력이 충분히 활용되는 경우는 드뭅니다. 매개변수를 사용하지 않은 경우, ls 커맨드는 테이블 포맷으로 모든 파일과 디렉토리를 표시합니다.

$ ls

admin has mesg precomp

apex hs mgw racg

assistants install network rdbms

... 뒷부분 생략 ...

리스트 포맷으로 결과를 확인하려면 -1(문자 "l"이 아닌 숫자 1임에 주의합니다) 옵션을 사용합니다.

$ ls -1

admin

apex

assistants

... 뒷부분 생략 ...

이 옵션은 커맨드 실행 결과로부터 값을 추출하여 처리 작업을 수행하는 쉘 스크립트 환경에서 유용하게 활용됩니다.

파일, 디렉토리의 모든 속성을 표시하는 -l (숫자 "1"이 아닌 문자"l") 옵션은 자주 사용해 보셨을 것입니다. 이 옵션에 대해 좀 더 알아 봅시다.

$ ls -l

total 272

drwxr-xr-x 3 oracle oinstall 4096 Sep 3 03:27 admin

drwxr-x--- 7 oracle oinstall 4096 Sep 3 02:32 apex

drwxr-x--- 7 oracle oinstall 4096 Sep 3 02:29 assistants

첫 번째 컬럼은 파일의 타입과 권한 설정을 표시하고 있습니다. 여기서 "d"는 디렉토리, "-"는 일반 파일, "c"는 캐릭터 디바이스, "b"는 블록 디바이스, "p"는 파이프, "l"(대문자 I가 아닌 소문자 l)은 심볼릭 링크를 의미합니다.

여기서 매우 유용한 옵션의 하나로 --color가 있습니다. 이 옵션은 파일의 유형을 기준으로 색상을 다르게 표시합니다. 스크린샷의 예가 아래와 같습니다:

-->

file1과 file2는 일반 파일입니다. link1은 심볼릭 링크이며 붉은색으로 표시되어 있습니다. dir1은 디렉토리로 노란색으로 표시됩니다. pipe1은 네임드 파이프로 역시 구분이 쉽도록 다른 색으로 표현되고 있습니다.

I일부 Linux 배포판의 경우 ls 커맨드에 ls --color;와 같은 앨리어스가 기본적으로 적용되어 있기도 합니다. 이러한 접근법은 그리 바람직하지 않습니다. 결과가 위와 같이 표시되는 경우는 더욱 그러합니다. 위 결과의 색상을 변경할 수는 있지만 앨리어스를 비활성화하는 것이 더 빠른 방법일 것입니다.

$ alias ls="''ls"

또 다른 유용한 옵션으로 -F가 있습니다. 이 매개변수는 각 파일의 타입별로 심볼을 덧붙입니다. 디렉토리에는 "/"가, 심볼릭 링크에는 "@"이, 네임드 파이프에는 "l"이 붙습니다.

$ ls -F

dir1/ file1 file2 link1@ pipe1|

디렉토리 내에 서브디렉토리가 존재하고 이 디렉토리의 구조만을 확인하고자 하는 경우를 생각해 봅시다. ls -l을 사용하면 서브디렉토리의 컨텐트도 함께 표시됩니다. 아래와 같은 디렉토리 구조를 가정해 봅시다.

/dir1

+-->/subdir1

+--> subfile1

+--> subfile2

디렉토리 dir1은 서브디렉토리 subdir1과 두 개의 파일, subfile1과 subfile2를 가집니다. 디렉토리의 속성만을 확인하고자 하는 경우 아래와 같이 실행합니다.

$ ls -l dir1

total 4

drwxr-xr-x 2 oracle oinstall 4096 Oct 14 16:52 subdir1

-rw-r--r-- 1 oracle oinstall 0 Oct 14 16:48 subfile1

-rw-r--r-- 1 oracle oinstall 0 Oct 14 16:48 subfile2

여기에서는 디렉토리 dir1이 표시되지 않고 있습니다. 그 대신 디렉토리의 컨텐트가 표시됩니다. 이러한 결과는 일반적으로 우리가 기대하는 것과는 다릅니다. 디렉토리 dir1만을 조회하고자 할 때에는 -d 커맨드를 사용해야 합니다.

$ ls -dl dir1

drwxr-xr-x 3 oracle oinstall 4096 Oct 14 16:52 dir1

If you notice the output of the following ls -l output:

-rwxr-x--x 1 oracle oinstall 10457761 Apr 6 2006 rmanO

-rwxr-x--x 1 oracle oinstall 10457761 Sep 23 23:48 rman

-rwsr-s--x 1 oracle oinstall 93300507 Apr 6 2006 oracleO

-rwx------ 1 oracle oinstall 93300507 Sep 23 23:49 oracle

파일의 사이즈는 바이트 단위로 표시되고 있습니다. 파일의 크기가 작을 때에는 문제가 없지만 파일 용량이 큰 경우에는 길게 나열된 숫자를 읽기가 어려울 수 있습니다. 이 경우 "-h" 옵션을 사용하면 보다 읽기 쉬운 포맷으로 파일 사이즈가 표시됩니다.

$ ls -lh

 

-rwxr-x--x 1 oracle oinstall 10M Apr 6 2006 rmanO

-rwxr-x--x 1 oracle oinstall 10M Sep 23 23:48 rman

-rwsr-s--x 1 oracle oinstall 89M Apr 6 2006 oracleO

-rwx------ 1 oracle oinstall 89M Sep 23 23:49 oracle

위에서 파일 사이즈가 M(메가바이트) 또는 K(킬로바이트)로 표시됨을 확인할 수 있습니다.

$ ls -lr

매개변수 -r은 역순으로 결과를 표시합니다. 아래 커맨드를 실행하면 결과가 알파벳 역순으로 표시됩니다.

$ ls -lR

-R 옵션을 사용하면 ls 커맨드가 재귀적으로 실행되며, 따라서 서브디렉토리와 서브디렉토리의 컨텐트가 함께 표시됩니다.

파일 크기의 순서대로 표시하고 싶다면 어떻게 해야 할까요? 이를 위해 -S 매개변수가 지원되고 있습니다.

$ ls -lS

 

total 308

-rw-r----- 1 oracle oinstall 52903 Oct 11 18:31 sqlnet.log

-rwxr-xr-x 1 oracle oinstall 9530 Apr 6 2006 root.sh

drwxr-xr-x 2 oracle oinstall 8192 Oct 11 18:14 bin

drwxr-x--- 3 oracle oinstall 8192 Sep 23 23:49 lib

xargs

대부분의 Linux 커맨드는 파일 목록, 문자열 등의 결과를 출력하는 것을 목적으로 실행됩니다. 하지만 앞에서 실행된 결과의 일부를 다른 커맨드의 매개변수로 활용해야 하는 경우가 있습니다. 예를 들어 파일의 유형(실행 파일, ASCII 텍스트 등)을 확인하기 위한 file 커맨드에서 파일네임만을 출력하도록 한 뒤, 이 결과를 ls -l 커맨드에 매개변수로 전달하여 타임스탬프를 확인하고자 하는 상황을 생각해 볼 수 있습니다. xargs 커맨드가 바로 이러한 목적으로 사용됩니다. 이 커맨드를 실행하면 다른 커맨드의 결과를 매개변수로 활용할 수 있습니다. 아래와 같은 명령을 가정해 봅시다.

file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr

위 커맨드의 문자열을 자세히 분석해 보겠습니다. 먼저, file -Lz *는 파일이 심볼릭 링크인지 또는 압축 파일인지를 확인합니다. 그리고 결과는 다음 커맨드인 grep ASCII 전달됩니다. 여기서 "ASCII" 문자열이 검색되어 아래와 같은 형태의 출력이 생성됩니다.

alert_DBA102.log: ASCII English text

alert_DBA102.log.Z: ASCII text (compress'd data 16 bits)

dba102_asmb_12307.trc.Z: ASCII English text (compress'd data 16 bits)

dba102_asmb_20653.trc.Z: ASCII English text (compress'd data 16 bits)

여기에서는 파일네임만이 관심 사항이기 때문에 다음 커맨드 cut -d":" -f1을 실행하여 첫 번째 필드만 표시되도록 합니다.

alert_DBA102.log

alert_DBA102.log.Z

dba102_asmb_12307.trc.Z

dba102_asmb_20653.trc.Z

이제 ls -l 커맨드에 한 번에 하나씩 위의 목록을 매개변수로 전달합니다. xargs 커맨드가 바로 이러한 목적으로 사용됩니다. 마지막에서 xargs ls -ltr 명령은 전달된 결과에 대해 ls -ltr을 실행합니다. 결과적으로 아래와 같은 명령이 순차적으로 실행됩니다.

ls -ltr alert_DBA102.log

ls -ltr alert_DBA102.log.Z

ls -ltr dba102_asmb_12307.trc.Z

ls -ltr dba102_asmb_20653.trc.Z

xargs은 독자적으로 사용되는 명령은 아니지만, 다른 커맨드와 조합되었을 때 매우 강력한 기능을 발휘합니다.

또 다른 예로 파일의 라인 수를 카운트하는 경우를 생각해 볼 수 있습니다.

$ file * | grep ASCII | cut -d":" -f1 | xargs wc -l

47853 alert_DBA102.log

19 dba102_cjq0_14493.trc

29053 dba102_mmnl_14497.trc

154 dba102_reco_14491.trc

43 dba102_rvwr_14518.trc

77122 total

(참고: 위와 동일한 작업을 아래 명령을 통해 실행할 수도 있습니다.)

$ wc -l 'file * | grep ASCII | cut -d":" -f1 | grep ASCII | cut -d":" -f1'

Linux는 여러 가지 방법으로 동일한 작업을 실행할 수 있도록 지원하고 있습니다. 사용자는 상황에 따라 가장 적절한 방법을 사용하면 됩니다.

같은 방법을 사용하여 디렉토리 내의 여러 파일의 이름을 한꺼번에 변경할 수 있습니다.

$ ls | xargs -t -i mv {} {}.bak

"-i" 옵션은 xargs 커맨드가 "{}" 부분을 각 아이템의 이름으로 대치하도록 지시하고 있습니다. 또 "-t" 옵션은 xargs가 실행 이전에 커맨드를 출력하도록 합니다.

vi를 이용하여 편집할 파일을 여는 과정에서도 활용이 가능합니다.

$ file * | grep ASCII | cut -d":" -f1 | xargs vi

이 커맨드는 vi를 사용하여 파일을 한 번에 하나씩 열도록 지시하고 있습니다. 이 방법은 여러 개의 파일을 검색한 후 편집을 위해 여는 경우 유용합니다.

xargs 커맨드는 다양한 옵션을 지원합니다. 가장 유용한 옵션으로 "-p"를 들 수 있을 것입니다. "-p"는 인터액티브 작업을 위해 사용됩니다.

$ file * | grep ASCII | cut -d":" -f1 | xargs -p vi

vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc

dba102_reco_14491.trc dba102_rvwr_14518.trc ?...

위에서 xarg는 각 커맨드가 실행하기 전에 확인 프롬프트를 띄우고 있습니다. 사용자가 "y"를 누르면 커맨드가 실행됩니다. 파일의 이동, 덮어쓰기 등 잠재적인 위험성을 갖는 작업을 사용하는 경우 이 방법이 매우 유용하게 활용될 수 있을 것입니다.

"t" 옵션은 "verbose" 모드입니다. 실행될 커맨드가 무엇인지 표시하므로 디버깅 과정에서 유용합니다.

xargs 커맨드의 매개변수로 아무런 출력도 입력되지 않는 경우에는 어떻게 될까요? 다음과 같은 경우를 생각해 봅시다.

$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t wc -l

wc -l

0

$

"SSSSSS" 문자열의 검색 결과 매치가 반환되지 않았습니다. 따라서 xargs에는 아무런 입력도 전달되지 않습니다(-t 옵션을 이용해서 이를 확인할 수 있습니다). 경우에 따라서는 처리할 대상이 존재하지 않는 경우 xargs의 실행을 중단해야 할 수도 있습니다. 이를 위해 사용되는 것이 -r 옵션입니다.

$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t -r wc -l

$

이 커맨드는 실행할 대상이 존재하지 않는 경우 종료 처리합니다.

rm 커맨드와 xargs 커맨드를 함께 사용해서 여러 파일을 한꺼번에 삭제하는 경우를 생각해 봅시다. rm이 받아들일 수 있는 매개변수의 수에는 한계가 있습니다. 입력되는 매개변수의 수가 이를 초과하는 경우에는 어떻게 해야 할까요? -n 옵션을 사용하면 xargs에서 사용하는 매개변수의 수를 제한할 수 있습니다.

커맨드 라인 별로 매개변수의 수를 2 개로 제한하는 방법이 아래와 같습니다. 5 개의 파일이 xargs ls -ltr로 전달되었더라도, 2 개의 파일만이 한 번에 ls -ltr로 전달됩니다.

$ file * | grep ASCII | cut -d":" -f1 | xargs -t -n2 ls -ltr

ls -ltr alert_DBA102.log dba102_cjq0_14493.trc

-rw-r----- 1 oracle dba 738 Aug 10 19:18 dba102_cjq0_14493.trc

-rw-r--r-- 1 oracle dba 2410225 Aug 13 05:31 alert_DBA102.log

ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc

-rw-r----- 1 oracle dba 5386163 Aug 10 17:55 dba102_mmnl_14497.trc

-rw-r----- 1 oracle dba 6808 Aug 13 05:21 dba102_reco_14491.trc

ls -ltr dba102_rvwr_14518.trc

-rw-r----- 1 oracle dba 2087 Aug 10 04:30 dba102_rvwr_14518.trc

같은 방법을 사용하여 디렉토리 내의 여러 파일의 이름을 한꺼번에 변경할 수 있습니다.

$ ls | xargs -t -i mv {} {}.bak

"-i" 옵션은 xargs 커맨드가 "{}" 부분을 각 아이템의 이름으로 대치하도록 지시하고 있습니다.

rename

잘 아시는 것처럼 mv 커맨드는 파일의 이름을 변경하는 용도로 사용됩니다. 예를 들어,

$ mv oldname newname

위 명령은 파일네임을 oldname에서 newname으로 변경합니다. 하지만 파일네임을 미리 알고 있지 못한 경우에는 어떻게 해야 할까요? 이 경우 rename 커맨드가 매우 유용하게 활용됩니다.

rename .log .log.'date +%F-%H:%M:%S' *

위 명령은 .log 확장자를 갖는 모든 파일을 .log. 확장자로 변경하도록 지시하고 있습니다. 따라서 sqlnet.log 파일은 sqlnet.log.2006-09-12-23:26:28과 같은 이름으로 변경됩니다.

find

오라클 사용자들이 가장 자주 사용하는 커맨드 중 하나가 find입니다. 이미 여러분들도 find를 이용하여 디렉토리 내의 파일을 검색하는 방법에 대해 알고 있을 것입니다. 현재 디렉토리에서 "file"이라는 문자열로 시작되는 파일을 검색하는 예가 아래와 같습니다.

$ find . -name "file*"

./file2

./file1

./file3

./file4

만일 FILE1, FILE2와 같은 이름을 검색하려면 어떻게 해야 할까요? 이 경우 -name "file*" 옵션으로는 매치가 불가능합니다. 검색 과정에서 대소문자 구분을 하지 않으려면 -iname 옵션을 사용해야 합니다.

$ find . -iname "file*"

./file2

./file1

./file3

./file4

./FILE1

./FILE2

검색 결과를 특정 유형의 파일로만 제한할 수도 있습니다. 예를 들어, 위 커맨드는 일반 파일, 디렉토리, 심볼릭 링크 등의 모든 파일 유형을 표시합니다. 일반 파일로만 검색을 한정하려는 경우에는 -type f 매개변수를 사용할 수 있습니다.

$ find . -name "orapw*" -type f

./orapw+ASM

./orapwDBA102

./orapwRMANTEST

./orapwRMANDUP

./orapwTESTAUX

-type에는 f(일반 파일), l(심볼릭 링크), d(디렉토리), b(블록 디바이스), p(네임드 파이프), c(캐릭터 디바이스), s(소켓) 등의 옵션이 지원됩니다.

위 커맨드를 약간 수정해서 제 1 부에서 설명한 file 커맨드와 조합해 보겠습니다. file 커맨드를 사용하면 파일의 유형을 확인할 수 있습니다. 이 명령을 이용하여 find 커맨드의 출력을 후처리해 봅시다. -exec 매개변수는 매개변수 뒤에 위치한 커맨드를 실행합니다. 위의 경우 find를 실행한 후 file를 실행해야 합니다.

$ find . -name "*oraenv*" -type f -exec file {} \;

./coraenv: Bourne shell script text executable

./oraenv: Bourne shell script text executable

위 명령은 ASCII 텍스트 파일이 쉘 스크립트인지의 여부를 확인하려는 경우 유용합니다.

-exec을 -ok로 대체하는 경우에는 커맨드가 실행되기 전에 확인 프롬프트가 표시됩니다. 그 예가 아래와 같습니다.

$ find . -name "sqlplus*" -ok {} \;

< {} ... ./sqlplus > ? y

 

SQL*Plus: Release 9.2.0.5.0 - Production on Sun Aug 6 11:28:15 2006

 

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

 

Enter user-name: / as sysdba

 

Connected to:

Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP and Oracle Data Mining options

JServer Release 9.2.0.5.0 - Production

 

SQL> exit

Disconnected from Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP and Oracle Data Mining options

JServer Release 9.2.0.5.0 - Production

< È* ... ./sqlplusO > ? n

$

위에서는 쉘에서 "sqlplus"로 시작하는 모든 프로그램을 검색한 후, 검색된 프로그램을 실행하도록 명령하고 있습니다. -ok와 {} 사이에 아무 것도 없기 때문에, 커맨드는 검색된 파일을 그저 실행하기만 합니다. 결과로 두 개의 파일(sqlplus와 sqlplusO)가 검색되었으며, 각 커맨드에 대해 실행 여부를 묻는 프롬프트가 뜹니다. 사용자는 "sqlplus"에 대한 프롬프트에서 "y"를 입력하여 커맨드를 실행하였습니다. 커맨드 실행이 완료되면 두 번째 파일(sqlplusO)의 실행 여부를 묻는 프롬프트가 뜹니다. 여기에서는 "n"을 입력하였으므로 실행되지 않았습니다.

오라클 사용자를 위한 팁

오라클은 트레이스 파일, 로그 파일, 덤프 파일 등의 다양한 파일을 생성, 관리합니다. 이 파일을 정기적으로 삭제하지 않는 경우 파일 시스템의 용량 부족으로 데이터베이스 실행이 중단될 수도 있습니다.

이런 문제를 예방하기 위해, "trc" 확장자를 갖는 파일을 검색한 후 3 일 이상 경과한 파일을 삭제하도록 명령할 수 있습니다. 이를 위한 명령이 아래와 같습니다.

find . -name "*.trc" -ctime +3 -exec rm {} \;

3일 이상 경과한 파일을 강제로 삭제하려면 -f 옵션을 사용합니다.

find . -name "*.trc" -ctime +3 -exec rm -f {} \;

아래 명령은 파일의 목록만을 표시합니다.

find . -name "*.trc" -ctime +3 -exec ls -l {} \;

m4

이 커맨드는 입력 파일을 받아들인 뒤 파일 내의 문자열을 매개변수 값으로 대체합니다. 입력 파일의 예가 아래와 같습니다.

$ cat temp

The COLOR fox jumped over the TYPE fence.

여기서 "COLOR"를 "brown"으로, "TYPE"을 "broken"으로 대체해 봅시다.

$ m4 -DCOLOR=brown -DTYPE=broken temp

The brown fox jumped over the broken fence.

또 같은 방법으로 "white", "high" 문자열로 대체해 보겠습니다.

 

$ m4 -DCOLOR=white -DTYPE=high temp

The white fox jumped over the high fence.

whence와 which

이 두 가지 커맨드는 실행파일이 사용자의 PATH 환경 변수에 저장되어 있는지 확인하기 위해 사용됩니다. 실행 파일이 경로 상에 존재하는 경우, 두 명령은 유사한 결과를 표시합니다.

$ which sqlplus

/u02/app/oracle/products/10.2.0.1/db1/bin/sqlplus

$ whence sqlplus

/u02/app/oracle/products/10.2.0.1/db1/bin/sqlplus

위의 결과는 동일합니다. 하지만 실행 파일이 경로 상에 존재하지 않는 경우에는 출력 결과가 달라집니다. which 커맨드는 메시지를 명시적으로 표시합니다.

$ which sqlplus1

/usr/bin/which: no sqlplus1 in (/u02/app/oracle/products/10.2.0.1/db1/bin:/usr

/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin)

이에 반해 whence 커맨드는 아무런 메시지도 표시하지 않으며,

$ whence sqlplus1]

바로 쉘 프롬프트를 반환합니다. 이 명령은 실행 파일이 경로 상에 존재하지 않는 경우 (메시지를 확인하지 않고) 실행을 바로 취소하고자 하는 경우 유용합니다.

$ whence invalid_command

$ which invalid_command

which: no invalid_command in (/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:

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

/usr/bin/X11:/usr/X11R6/bin:/root/bin)

whence 명령은 경로 상에 실행 파일이 검색되지 않은 경우 메시지를 반환하지 않으며, 대신 0이 아닌 리턴 코드를 반환합니다. 쉘 스크립트에서 반환된 리턴 코드를 이용할 수도 있습니다.

RC='whence myexec'

If [ $RC -ne "0" ]; then

echo "myexec is not in the $PATH"

fi

유용한 옵션으로 -i 옵션이 있습니다. 이 옵션은 실행파일과 앨리어스를 함께 표시해 줍니다. 앞에서 rm 커맨드를 앨리어스로 설정한 바 있습니다. 따라서 rm은 커맨드로도, 앨리어스로도 존재합니다.

$ which ls

/bin/ls

 

$ which -i ls

alias ls='ls --color=tty'

/bin/ls

which 커맨드는 기본적으로 경로 상에서 검색된 첫 번째 실행파일만을 표시합니다. 따라서 경로 상의 다른 디렉토리에 위치한 실행파일은 무시됩니다. -a 옵션을 사용하면 모든 실행파일의 목록을 확인할 수 있습니다.

$ which java

/usr/bin/java

 

$ which -a java

/usr/bin/java

/home/oracle/oracle/product/11.1/db_1/jdk/jre/bin/java

top

Linux 데이터베이스를 관리하는 오라클 DBA에게 가장 유용한 커맨드로 top을 꼽을 수 있을 것입니다. 시스템의 성능이 저하되어 어떤 프로세스가 CPU와 메모리를 잡아먹고 있는지 확인해야 하는 경우를 예로 들어 봅시다. 이때 Top 프로세스 리스트를 반환하기 위해 사용되는 명령이 바로 top입니다.

다른 커맨드들과 달리 top은 결과 출력 후에도 실행을 종료하지 않으며, 스크린 상에 계속적으로 새로운 정보를 뿌립니다. 그러므로 top을 실행한 후 스크린을 그대로 내버려 두면 최신의 정보를 계속 확인할 수 있습니다. 커맨드를 종료하고 쉘로 빠져나가려면 Control-C를 눌러야 합니다.

$ top

 

18:46:13 up 11 days, 21:50, 5 users, load average: 0.11, 0.19, 0.18

151 processes: 147 sleeping, 4 running, 0 zombie, 0 stopped

CPU states: cpu user nice system irq softirq iowait idle

total 12.5% 0.0% 6.7% 0.0% 0.0% 5.3% 75.2%

Mem: 1026912k av, 999548k used, 27364k free, 0k shrd, 116104k buff

758312k actv, 145904k in_d, 16192k in_c

Swap: 2041192k av, 122224k used, 1918968k free 590140k cached

 

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

451 oracle 15 0 6044 4928 4216 S 0.1 0.4 0:20 0 tnslsnr

8991 oracle 15 0 1248 1248 896 R 0.1 0.1 0:00 0 top

1 root 19 0 440 400 372 S 0.0 0.0 0:04 0 init

2 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 keventd

3 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kapmd

4 root 34 19 0 0 0 SWN 0.0 0.0 0:00 0 ksoftirqd/0

7 root 15 0 0 0 0 SW 0.0 0.0 0:01 0 bdflush

5 root 15 0 0 0 0 SW 0.0 0.0 0:33 0 kswapd

6 root 15 0 0 0 0 SW 0.0 0.0 0:14 0 kscand

8 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kupdated

9 root 25 0 0 0 0 SW 0.0 0.0 0:00 0 mdrecoveryd

... 뒷부분 생략 ...

위의 실행 결과를 자세히 살펴 봅시다. 첫 번째 라인이 아래와 같습니다.

18:46:13 up 11 days, 21:50, 5 users, load average: 0.11, 0.19, 0.18

여기에서는 현재 시간(18:46:13)과 함께 시스템이 11일간 실행되었으며 21시간 50초에 걸쳐 시스템이 작업을 실행했음을 표시하고 있습니다. 시스템의 부하는 최근 1분, 5분, 15분의 평균(0.11, 0.19, 0.18)으로 표시됩니다. (위의 정보는 uptime 커맨드에서도 확인할 수 있습니다.)

평균 부하 정보가 필요하지 않은 경우라면 "l"을 입력하여 출력을 비활성화할 수 있습니다. 다시 l을 누르면 정보가 표시됩니다. 두 번째 라인은 아래와 같습니다.

151 processes: 147 sleeping, 4 running, 0 zombie, 0 stopped

위에서는 프로세스의 수, 실행 중인 프로세스, 슬립 상태의 프로세스 수가 표시됩니다. 다음은 3 번째, 4 번째 라인입니다.

CPU states: cpu user nice system irq softirq iowait idle

total 12.5% 0.0% 6.7% 0.0% 0.0% 5.3% 75.2%

여기서는 CPU 사용률 정보가 표시되고 있습니다. 위에서는 사용자 프로세스가 12.5%를, 시스템이 6.7%를 사용하고 있음을 확인할 수 있습니다. 오라클 프로세스는 사용자 프로세스에 포함됩니다. "t"를 누르면 위의 라인을 활성화/비활성화할 수 있습니다. CPU가 두 개 이상 존재하는 경우에는, 각 CPU별로 하나의 라인이 표시됩니다.

그 다음 2 개의 라인을 봅시다.

Mem: 1026912k av, 1000688k used, 26224k free, 0k shrd, 113624k buff

758668k actv, 146872k in_d, 14460k in_c

Swap: 2041192k av, 122476k used, 1918716k free 591776k cached

사용 가능한 메모리와 사용 중인 메모리 용량이 표시되고 있습니다. 전체 메모리는 "1026912k av", 약 1GB이며 이중 26224k(26MB)가 여유 상태입니다. 스왑 공간은 2GB이지만 거의 사용되지 않고 있습니다. 이 부분을 비활성화/활성화하려면 "m"을 누릅니다.

출력의 나머지 부분은 프로세스를 테이블 형태로 표시하고 있습니다. 각 컬럼에 대한 설명이 아래와 같습니다.

컬럼

설명

PID

프로세스의 프로세스 ID

USER

프로세스를 실행 중인 사용자

PRI

프로세스의 우선순위

NI

nice 값: 값이 높을 수록 태스크의 우선순위가 낮음을 의미

SIZE

프로세스가 사용하는 메모리 (코드+데이터+스택)

RSS

프로세스가 사용하는 물리적 메모리

SHARE

프로세스가 사용하는 공유 메모리

STAT

프로세스의 상태 정보로 다음과 같은 코드로 표시됨:
R – Running
S –Sleeping
Z – Zombie
T – Stopped

또는 다음과 같은 문자가 함께 표시될 수도 있음:
W – Swapped out process
N – positive nice value

%CPU

프로세스의 CPU 사용률

%MEM

프로세스의 메모리 사용률

TIME

프로세스가 사용하는 전체 CPU 타임

CPU

멀티-프로세서 시스템의 경우 이 컬럼은 프로세스가 실행 중인 CPU의 ID를 의미함

COMMAND

프로세스가 실행한 커맨드

top 명령이 실행되는 동안 키를 눌러 디스플레이 포맷을 변경할 수도 있습니다. 대문자 M 키를 누르면 출력이 메모리 사용률 순서로 정렬됩니다. (소문자 m을 누르면 메모리 사용량 요약 라인이 비활성화됨을 참고하시기 바랍니다.) 이 명령은 어떤 프로세스가 메모리를 가장 많이 사용하고 있는지 확인할 때 유용합니다. 출력 예가 아래와 같습니다:

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

31903 oracle 15 0 75760 72M 72508 S 0.0 7.2 0:01 0 ora_smon_PRODB2

31909 oracle 15 0 68944 66M 64572 S 0.0 6.6 0:03 0 ora_mmon_PRODB2

31897 oracle 15 0 53788 49M 48652 S 0.0 4.9 0:00 0 ora_dbw0_PRODB2

지금까지 출력 결과를 분석해 보았습니다. 이제 커맨드 라인 매개변수를 이용하는 방법을 알아 봅시다.

가장 유용한 매개변수인 -d는 스크린 리프레시 간격을 조정합니다. 1 초 단위로 화면을 갱신하려면 top -d 1을 입력합니다.

그 밖에 유용한 옵션으로 -p가 있습니다. 이 옵션은 몇 가지 프로세스에 대해서만 모니터링을 수행하고자 하는 경우 사용합니다. 13609, 13608, 13554 프로세스를 모니터링하는 방법이 다음과 같습니다.

top -p 13609 -p 13608 -p 13554

이 명령은 지정된 프로세스에 대해서만 top 커맨드를 실행합니다.

오라클 사용자를 위한 팁

top 유틸리티가 데이터베이스 서버의 성능 분석을 위해 매우 유용하게 활용된다는 사실은 굳이 강조할 필요도 없을 것입니다. top 커맨드 실행 결과의 일부가 아래와 같습니다.

20:51:14 up 11 days, 23:55, 4 users, load average: 0.88, 0.39, 0.27

113 processes: 110 sleeping, 2 running, 1 zombie, 0 stopped

CPU states: cpu user nice system irq softirq iowait idle

total 1.0% 0.0% 5.6% 2.2% 0.0% 91.2% 0.0%

Mem: 1026912k av, 1008832k used, 18080k free, 0k shrd, 30064k buff

771512k actv, 141348k in_d, 13308k in_c

Swap: 2041192k av, 66776k used, 1974416k free 812652k cached

 

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

16143 oracle 15 0 39280 32M 26608 D 4.0 3.2 0:02 0 oraclePRODB2...

5 root 15 0 0 0 0 SW 1.6 0.0 0:33 0 kswapd

... 뒷부분 생략 ...

위 결과를 자세히 분석해 봅시다. 먼저 CPU states 항목의 "idle" 컬럼을 주목하십시오. 0.0%로 표시되고 있습니다. 이는 CPU가 100% 사용 중임을 의미합니다. 그렇다면 어떤 작업에 CPU가 사용되고 있는지 궁금해 하는 것이 당연합니다. 왼쪽의 "system" 컬럼을 보면 5.6%로 표시되고 있습니다. 따라서 시스템 자체적으로는 많은 작업을 실행하고 있지 않습니다. 좀 더 왼쪽의 "user" 컬럼은 1.0%로 표시되고 있습니다. 여기서 사용자 프로세스에는 오라클이 포함됩니다. 따라서 오라클이 CPU 사이클을 많이 소모하지 않고 있음을 알 수 있습니다. 그렇다면 CPU 사용의 주범은 무엇일까요?

그 해답을 같은 라인에서 확인할 수 있습니다. "iowait" 컬럼 하단의 오른쪽을 보면 91.2%가 표시되고 있습니다. 이제 답이 나왔습니다. CPU는 전체 시간 중 91.2%를 IO를 대기하는데 소비하고 있는 것입니다.

그렇다면 IO wait가 이처럼 높은 이유는 무엇일까요? 그 해답도 확인할 수 있습니다. 바로 가장 많은 CPU를 사용하는 프로세스의 PID입니다: 16143. 아래 쿼리를 실행하여 프로세스가 어떤 작업을 실행 중인지 확인할 수 있습니다.

select s.sid, s.username, s.program

from v$session s, v$process p

where spid = 16143

and p.addr = s.paddr

/

 

SID USERNAME PROGRAM

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

159 SYS rman@prolin2 (TNS V1-V3)

바로 rman 프로세스가 많은 IO wait를 발생시키고 있습니다. 이 분석 결과를 바탕으로 후속 조치를 취할 수 있을 것입니다.

skill과 snice

앞에서 CPU를 가장 많이 사용하는 리소스를 확인하는 방법에 대해 배워 보았습니다. 프로세스가 많은 CPU와 메모리를 사용하고 있지만 이 프로세스를 kill하기를 원치 않는 경우에는 어떻게 해야 할까요? 아래와 같은 top 출력 결과를 생각해 봅시다.

$ top -c -p 16514

 

23:00:44 up 12 days, 2:04, 4 users, load average: 0.47, 0.35, 0.31

1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped

CPU states: cpu user nice system irq softirq iowait idle

total 0.0% 0.6% 8.7% 2.2% 0.0% 88.3% 0.0%

Mem: 1026912k av, 1010476k used, 16436k free, 0k shrd, 52128k buff

766724k actv, 143128k in_d, 14264k in_c

Swap: 2041192k av, 83160k used, 1958032k free 799432k cached

 

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

16514 oracle 19 4 28796 26M 20252 D N 7.0 2.5 0:03 0 oraclePRODB2...

프로세스 16514가 가장 많은 메모리를 사용하고 있음을 확인했다면 skill 커맨드를 사용해서 이 프로세스를 죽이는(kill) 대신 얼려버릴(freeze) 수 있습니다.

$ skill -STOP 1

그런 다음 top을 다시 실행해 봅시다.

23:01:11 up 12 days, 2:05, 4 users, load average: 1.20, 0.54, 0.38

1 processes: 0 sleeping, 0 running, 0 zombie, 1 stopped

CPU states: cpu user nice system irq softirq iowait idle

total 2.3% 0.0% 0.3% 0.0% 0.0% 2.3% 94.8%

Mem: 1026912k av, 1008756k used, 18156k free, 0k shrd, 3976k buff

770024k actv, 143496k in_d, 12876k in_c

Swap: 2041192k av, 83152k used, 1958040k free 851200k cached

 

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

16514 oracle 19 4 28796 26M 20252 T N 0.0 2.5 0:04 0 oraclePRODB2...

CPU는 94%에서 0%로 떨어졌습니다. 프로세스의 실행이 실질적으로 동결된 것입니다. 사용자는 나중에 원하는 시점에 이 프로세스를 다시 깨울 수 있습니다.

$ skill -CONT 16514

이 방법은 다른 중요한 프로세스의 실행을 위해 프로세스를 임시로 중단하려는 경우 매우 유용합니다.

커맨드의 활용 방법은 매우 다양합니다. "oracle" 사용자의 모든 프로세스를 중단하는 방법이 아래와 같습니다.

$ skill -STOP oracle

사용자 이외에도 커맨드, 터미널 ID 등의 정보를 매개변수로 사용할 수 있습니다. 아래 명령은 모든 rman 커맨드의 실행을 중단합니다.

$ skill -STOP rman

skill은 입력된 매개변수가 프로세스 ID인지, 사용자 아이디인지, 커맨드인지를 자체적으로 파악한 후 그에 따라 행동을 취합니다. 이러한 동작 방식이 때로는 문제가 될 수도 있습니다. 예를 들어 사용자와 커맨드가 동일한 이름을 갖는 경우를 생각해 볼 수 있습니다. 그 대표적인 예가 "oracle" 사용자에 의해 실행되는 "oracle" 프로세스입니다. 따라서 "oracle"이라는 이름의 프로세스 실행을 중단하기 위해 아래와 같이 입력한 경우,

$ skill -STOP oracle

"oracle" 사용자의 모든 프로세스와 세션도 함께 중단됩니다. 이러한 불확실성을 해소하려면 매개변수의 유형을 별도로 지정해 주어야 합니다. 예를 들어 "oracle"이라는 이름의 커맨드 실행을 중단하기 위한 명령이 아래와 같습니다.

$ skill -STOP -c oracle

snice 커맨드의 실행 방법도 위와 유사합니다. 이 커맨드는 프로세스를 중단하는 대신 프로세스의 우선순위를 낮춥니다. 먼저, top 실행 결과를 점검해 봅시다.

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

3 root 15 0 0 0 0 RW 0.0 0.0 0:00 0 kapmd

13680 oracle 15 0 11336 10M 8820 T 0.0 1.0 0:00 0 oracle

13683 oracle 15 0 9972 9608 7788 T 0.0 0.9 0:00 0 oracle

13686 oracle 15 0 9860 9496 7676 T 0.0 0.9 0:00 0 oracle

13689 oracle 15 0 10004 9640 7820 T 0.0 0.9 0:00 0 oracle

13695 oracle 15 0 9984 9620 7800 T 0.0 0.9 0:00 0 oracle

13698 oracle 15 0 10064 9700 7884 T 0.0 0.9 0:00 0 oracle

13701 oracle 15 0 22204 21M 16940 T 0.0 2.1 0:00 0 oracle

이제 "oracle" 프로세스의 우선순위를 4 단계 낮춥니다. 여기서는 숫자가 높을 수록 우선순위가 낮음을 의미합니다.

$ snice +4 -u oracle

 

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

16894 oracle 20 4 38904 32M 26248 D N 5.5 3.2 0:01 0 oracle

NI 컬럼(nice 값)이 4, priority가 15에서 4로 변경되었음을 확인할 수 있습니다.

'02.서버-Linux' 카테고리의 다른 글

[리눅스]파티션 설계  (0) 2012.12.19
[리눅스]패키지 업데이트  (0) 2012.12.19
[리눅스]고급 커맨드 1  (0) 2012.12.19
[리눅스]불필요 서비스 제거  (0) 2012.12.19
[리눅스]한글이 깨질 경우  (0) 2012.12.19
Posted by redkite
, |

0014. [리눅스] 고급 커맨드 1

고급 Linux 커맨드 마스터 가이드


저자 – Arup Nanda

게시일: 2006년 8월

쉐릴 칼리시가 Linux 입문자들을 위해 기고한 "Linux 파일 커맨드 마스터 가이드(한글)"를 통해 일반적으로 자주 사용되는 Linux 커맨드에 대해 설명 드린 바 있습니다. 이제 기본을 마스터하였다면, 다음 단계로 넘어가 좀 더 복잡하지만 활용도가 높은 커맨드들에 배워 볼 차례입니다.

4 부에 걸쳐 연재되는 이번 시리즈에서는, 여러분이 알고 있는 커맨드들의 잘 알려지지 않은 사용법에 대해 소개하고 커맨드의 활용도를 높이기 위한 여러 가지 변칙적인 용례들을 설명합니다. 또 연재가 진행되면서 좀 더 난이도가 높은 커맨드들에 대해 배우실 수 있을 것입니다.

여기에서 소개되는 커맨드들이 Linux 버전 또는 커널 버전에 따라 차이가 있을 수 있음을 참고하시기 바랍니다(하지만 그 차이는 미미한 수준입니다).

오너, 그룹, 권한의 변경

쉐릴의 아티클에서 chown, chgrp 커맨드를 이용하여 파일의 오너십과 그룹을 변경하는 방법을 이미 설명하였습니다. 아래와 같은 파일이 있다고 가정해 봅시다.

# ls -l

total 8

-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1

-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file2

-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file3

-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file4

-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file5

-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file6

이제 모든 파일의 권한을 첫 번째 파일과 동일하게 변경해야 합니다. 물론 "chmod 644 *"를 실행하면 간단하게 해결이 가능합니다. 하지만 스크립트를 작성하면서 첫 번째 파일의 권한을 모르고 있는 경우라면 어떻게 해야 할까요? 또 여러 번의 권한 변경 작업을 반복적으로 수행해야 하는 상황에서, 각각의 파일 권한을 일일이 확인하기 어려운 경우에는 어떻게 할 수 있을까요?

이런 경우 파일의 권한을 다른 파일과 동일하게 설정하는 명령을 활용할 수 있습니다. 아래 커맨드는 파일2의 권한을 파일 1과 동일하게 설정합니다.

chmod --reference file1 file2

이제 설정된 권한을 확인해 보면 아래와 같이 나타납니다.

# ls -l file[12]

total 8

-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1

-rw-r--r-- 1 oracle dba 132 Aug 4 04:02 file2

파일 2의 권한이 파일 1와 같게 변경되었습니다. 파일 1의 권한을 먼저 확인할 필요는 없었습니다.

같은 방법을 파일의 그룹 멤버십 설정에 이용할 수도 있습니다. 파일 2의 그룹을 파일 1과 동일하게 설정하기 위한 명령이 아래와 같습니다:

# chgrp --reference file1 file2

# ls -l file[12]

-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1

-rw-r--r-- 1 oracle users 132 Aug 4 04:02 file2

물론 오너십의 설정에도 같은 방법을 적용할 수 있습니다. 오너십을 변경하는 방법이 아래와 같습니다. 권한이 아래와 같이 설정되어 있는 경우,

# ls -l file[12]

-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1

-rw-r--r-- 1 oracle dba 132 Aug 4 04:02 file2

오너십을 아래와 같은 방법으로 변경할 수 있습니다.

# chown --reference file1 file2

# ls -l file[12]

-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1

-rw-r--r-- 1 ananda users 132 Aug 4 04:02 file2

위의 경우 그룹과 오너가 함께 변경되었습니다.

오라클 사용자를 위한 팁

이 방법을 사용하여 특정 실행 파일을 기준으로 디렉토리 내의 전체 오라클 실행 파일에 설정된 오너십과 권한을 일괄 변경하는 것이 가능합니다. 이 방법은 다른 사용자 계정으로 마이그레이션하거나 기존에 설치된 환경을 다른 오라클 소프트웨어 소유자에게 할당할 때 유용하게 활용됩니다.

기타 파일 관련 커맨드

ls 명령과 매개변수를 이용하여 파일에 관련한 매우 유용한 정보들을 확인할 수 있습니다. stat 커맨드는 ls보다 덜 알려지긴 했지만, 더욱 유용한 정보들을 제공합니다.

stat 커맨드를 이용해서 $ORACLE_HOME/bin 디렉토리에 위치한 "oracle" 실행 파일의 정보를 확인하는 방법이 아래와 같습니다.

# cd $ORACLE_HOME/bin

# stat oracle

File: `oracle'

Size: 93300148 Blocks: 182424 IO Block: 4096 Regular File

Device: 343h/835d Inode: 12009652 Links: 1

Access: (6751/-rwsr-s--x) Uid: ( 500/ oracle) Gid: ( 500/ dba)

Access: 2006-08-04 04:30:52.000000000 -0400

Modify: 2005-11-02 11:49:47.000000000 -0500

Change: 2005-11-02 11:55:24.000000000 -0500

위 커맨드를 통해 출력된 정보를 눈 여겨 보시기 바랍니다. (ls -l을 통해서도 얻을 수 있는) 파일 사이즈 정보와 별도로, 파일이 점유하고 있는 블록의 수가 표시되고 있습니다. 일반적으로 Linux의 블록 사이즈는 512 바이트입니다. 따라서 93,300,148 바이트는 (93300148/512=) 182226.85 개의 블록을 점유합니다. 블록은 한꺼번에 채워지므로, 이 파일은 이렇게 계산한 결과와 근사한 수의 블록을 사용하고 있을 가능성이 높습니다. 하지만 이렇게 추측을 하는 대신, stat 커맨드를 이용해서 정확한 블록 수를 산정할 수 있습니다.

또 위의 실행 결과에서 파일 오너십의 GID, UID와 권한의 8진법 표현(6751)을 확인할 수 있습니다. 나중에 파일의 권한을 현재의 상태로 되돌리고 싶으면, 명시적으로 권한을 표시하는 대신 "chmod 6751 oracle "과 같이 명령을 실행할 수 있습니다.

위의 출력 결과에서 가장 유용한 부분이 바로 파일 액세스 타임스탬프 정보입니다. 위에서는 파일이 2006-08-04 04:30:52("Access"의 오른쪽 부분), 즉 2006년 8월 4일 오전 4:30:52에 마지막으로 액세스되었음을 알 수 있습니다. 이 값은 사용자가 데이터베이스에 최초 접근한 시점을 의미합니다. 파일은 2005-11-02 11:49:47(Modify의 오른쪽)에 수정되었습니다. 마지막으로 "Change" 옆의 타임스탬프는 파일의 상태가 변경된 시점을 의미합니다.

stat 커맨드의 –f 옵션은 파일이 아닌 파일 시스템의 정보를 표시하라는 의미를 갖습니다:

# stat -f oracle

File: "oracle"

ID: 0 Namelen: 255 Type: ext2/ext3

Blocks: Total: 24033242 Free: 15419301 Available: 14198462 Size: 4096

Inodes: Total: 12222464 Free: 12093976

또 –t는 동일한 정보를 하나의 라인으로 표시하는 옵션입니다.

# stat -t oracle

oracle 93300148 182424 8de9 500 500 343 12009652 1 0 0 1154682061

1130950187 1130950524 4096

이 옵션은 커맨드 실행 결과로부터 값을 추출하여 처리 작업을 수행하는 쉘 스크립트 환경에서 유용하게 활용됩니다.

오라클 사용자를 위한 팁

오라클을 "relink"하는 경우 (이 작업은 패치 설치 과정에서 자주 발생합니다), 오라클은 새로운 실행 파일을 생성하기 전에 기존의 실행 파일을 다른 이름으로 저장합니다. 예를 들어 아래 명령을 이용하여 전체 유틸리티를 relink 할 수 있습니다.

relink utilities

위 명령을 수행하면 sqlplus 실행 파일이 다른 유틸리티와 함께 재컴파일 됩니다. 기존의 sqlplus 실행 파일은 sqlplusO라는 이름으로 저장됩니다. 재컴파일 작업이 실패하는 경우, relink 프로세스는 sqlplusO의 파일 이름을 다시 sqlplus로 변경함으로써 기존 상태를 복구합니다. 또 패치 적용 후 문제가 발견된 경우, 직접 기존 파일의 이름을 다시 변경하는 방법으로 상태를 원상 복귀시킬 수 있습니다.

이 파일에 stat 명령을 실행한 결과입니다:

# stat sqlplus*

File: 'sqlplus'

Size: 9865 Blocks: 26 IO Block: 4096 Regular File

Device: 343h/835d Inode: 9126079 Links: 1

Access: (0751/-rwxr-x--x) Uid: ( 500/ oracle) Gid: ( 500/ dba)

Access: 2006-08-04 05:15:18.000000000 -0400

Modify: 2006-08-04 05:15:18.000000000 -0400

Change: 2006-08-04 05:15:18.000000000 -0400

 

File: 'sqlplusO'

Size: 8851 Blocks: 24 IO Block: 4096 Regular File

Device: 343h/835d Inode: 9125991 Links: 1

Access: (0751/-rwxr-x--x) Uid: ( 500/ oracle) Gid: ( 500/ dba)

Access: 2006-08-04 05:13:57.000000000 -0400

Modify: 2005-11-02 11:50:46.000000000 -0500

Change: 2005-11-02 11:55:24.000000000 -0500

sqlplusO가 2005년 11월 11일에 수정된 반면 sqlplus는 2006년 8월 4일에 수정되었음을 확인할 수 있습니다. 이 결과는 sqlplusO의 상태가 마지막으로 변경된 시점과도 일치합니다. 따라서 sqlplus의 기존 버전이 2005년 11월 11일에서 2006년 8월 4일까지 사용되었음을 알 수 있습니다. 기능적인 문제의 원인을 해명하고자 한다면, 이 데이터가 좋은 참고가 될 수 있습니다. 또 파일 변경 시점과 권한 변경 시점을 함께 연계하여 문제 해결 작업에서 참고할 수 있습니다.

위 실행 결과에서 또 한 가지 중요한 점은 두 파일의 사이즈가 다르다는 사실입니다(sqlplus는 9865 바이트인 반면 sqlplusO는 8851 바이트입니다). 그러므로 파일이 단순히 재컴파일된 것이 아니며 새로운 라이브러리가 추가되었을 가능성이 높다고 추측할 수 있습니다. 또는 현재 겪고 있는 문제의 원인이 여기에 숨어 있을 수도 있습니다.

파일 타입

파일이 어떤 타입인지 확인하려면 어떻게 해야 할까요? 이를 위해 사용되는 명령이 바로 file 커맨드입니다. 실행 예가 아래와 같습니다:

# file alert_DBA102.log

alert_DBA102.log: ASCII text

alert_DBA102.log는 ASCII 텍스트 파일임을 알 수 있습니다. 다른 예를 살펴 봅시다:

# file initTESTAUX.ora.Z

initTESTAUX.ora.Z: compress'd data 16 bits

파일이 압축된 파일임을 알 수 있습니다. 하지만 압축된 파일 안에 어떤 타입의 파일이 포함되어 있는지 어떻게 알 수 있을까요? 물론 파일의 압축을 풀고 다시 file 커맨드를 실행하면 되겠지만, 이는 결코 효율적인 방법이 아닙니다. 훨씬 간단한 방법으로 –z 옵션을 사용할 수 있습니다.

# file -z initTESTAUX.ora.Z

initTESTAUX.ora.Z: ASCII text (compress'd data 16 bits)

또 문제가 될 수 있는 예로 심볼릭 링크(symbolic link)를 들 수 있습니다:

# file spfile+ASM.ora.ORIGINAL

spfile+ASM.ora.ORIGINAL: symbolic link to

/u02/app/oracle/admin/DBA102/pfile/spfile+ASM.ora.ORIGINAL

물론 위 출력만으로도 유용한 정보입니다. 하지만 링크가 가리키는 파일의 유형은 어떻게 확인할까요? file 명령을 반복해서 수행하는 대신, -l 옵션을 사용하면 됩니다.

# file -L spfile+ASM.ora.ORIGINAL

spfile+ASM.ora.ORIGINAL: data

파일이 데이터 파일임을 쉽게 확인할 수 있습니다. init.ora와 달리 spfile은 바이너리 파일이며 따라서 데이터 파일로 표시됨을 참고하시기 바랍니다.

오라클 사용자를 위한 팁

사용자 덤프 디렉토리에 위치한 트레이스 파일을 찾고 있지만, 파일이 실제로는 다른 디렉토리에 위치하고 있고 이 디렉토리에는 심볼릭 링크만이 존재할 수 있습니다. 또는다른 사용자가 파일을 압축하거나 이름을 변경했을 수도 있습니다. 우리가 분명하게 아는 사실은 단 한 가지뿐, 즉 이 파일이 아스키 파일이라는 사실입니다. 이런 경우라면 아래와 같은 명령을 활용할 수 있습니다.

file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr

이 커맨드는 디렉토리에 있는 ASCII 파일을 점검하고, 파일이 압축된 경우에도 시간 순서대로 정렬하여 표시합니다.

파일의 비교

서로 다른 두 개의 파일이 동일한 내용임을 어떻게 확인할 수 있을까요? 여러 가지 방법이 가능하며, 각각 나름의 장단점이 있습니다.

diff. 가장 간단한 커맨드인 diff는 두 파일 간의 차이를 비교하여 보여 줍니다. 두 파일의 내용이 아래와 같습니다:

# cat file1

In file1 only

In file1 and file2

# cat file2

In file1 and file2

In file2 only

diff 커맨드를 사용하면 아래와 같이 두 파일의 차이를 확인할 수 있습니다

# diff file1 file2

1d0

< In file1 only

2a2

> In file2 only

#

첫 번째 라인의 "<" 기호는 해당 라인이 첫 번째 파일, 즉 file1에만 존재함을 의미합니다. 마찬가지로 ">" 기호는 해당 라인이 두 번째 파일(file2)에만 존재함을 의미합니다. 출력 결과의 첫 번째 라인에서 문자 1d0은 file1을 file2와 동일하게 만들기 위해 sed 유틸리티에서 사용하는 옵션을 의미합니다.

-y 옵션을 사용하면 결과를 나란히 비교할 수 있습니다:

# diff -y file1 file2 -W 120

In file1 only <

In file1 and file2 In file1 and file2

> In file2 only

-W 옵션은 출력 결과의 길이를 지정합니다. 위에서는 120 문자 길이의 화면을 사용하도록 지정하고 있습니다.

파일이 같은지 다른지의 여부만을 확인하고 싶다면 –q 옵션을 사용합니다.

# diff -q file3 file4

# diff -q file3 file2

Files file3 and file2 differ

file3과 file4의 내용은 동일하므로 아무 결과도 출력되지 않습니다. –q 옵션은 파일의 내용이 서로 다른 경우에만 결과를 보고합니다.

쉘 스크립트를 작성하는 경우에는, 파싱이 가능한 형태로 결과를 출력하는 것이 유용할 수 있습니다. 이런 경우라면 -u 옵션이 유용하게 활용됩니다:

# diff -u file1 file2

--- file1 2006-08-04 08:29:37.000000000 -0400

+++ file2 2006-08-04 08:29:42.000000000 -0400

@@ -1,2 +1,2 @@

-In file1 only

In file1 and file2

+In file2 only

위의 결과는 두 가지 파일의 컨텐트를 비교하면서 중복되지 않은 컬럼에 대해서만 +, - 기호를 사용하여 비교하고 있습니다. 앞 컬럼에 아무 기호도 표시되지 않은 라인은 해당 컨텐트가 두 파일에 모두 존재함을 의미합니다.

이 커맨드는 공백 기호도 함께 비교합니다. 공백 기호를 무시하고 싶다면 –b 옵션을 사용합니다. 빈 라인을 무시하려면 –B 옵션을 사용합니다. 마지막으로 대소문자 구분을 무시하려면 –i 옵션을 사용합니다.

diff 커맨드를 디렉토리 비교를 위해 사용할 수도 있습니다. 아래 명령을 실행하면,

diff dir1 dir2

양쪽 디렉토리 모두, 또는 한 쪽 디렉토리에만 포함된 파일이 구분되어 표시됩니다. 동일한 이름의 서브디렉토리가 발견되는 경우, 서브디렉토리에 포함된 파일은 비교하지 않습니다. 실행 예가 아래와 같습니다:

# diff DBA102 PROPRD

Common subdirectories: DBA102/adump and PROPRD/adump

Only in DBA102: afiedt.buf

Only in PROPRD: archive

Only in PROPRD: BACKUP

Only in PROPRD: BACKUP1

Only in PROPRD: BACKUP2

Only in PROPRD: BACKUP3

Only in PROPRD: BACKUP4

Only in PROPRD: BACKUP5

Only in PROPRD: BACKUP6

Only in PROPRD: BACKUP7

Only in PROPRD: BACKUP8

Only in PROPRD: BACKUP9

Common subdirectories: DBA102/bdump and PROPRD/bdump

Common subdirectories: DBA102/cdump and PROPRD/cdump

Only in PROPRD: CreateDBCatalog.log

Only in PROPRD: CreateDBCatalog.sql

Only in PROPRD: CreateDBFiles.log

Only in PROPRD: CreateDBFiles.sql

Only in PROPRD: CreateDB.log

Only in PROPRD: CreateDB.sql

Only in DBA102: dpdump

Only in PROPRD: emRepository.sql

Only in PROPRD: init.ora

Only in PROPRD: JServer.sql

Only in PROPRD: log

Only in DBA102: oradata

Only in DBA102: pfile

Only in PROPRD: postDBCreation.sql

Only in PROPRD: RMANTEST.sh

Only in PROPRD: RMANTEST.sql

Common subdirectories: DBA102/scripts and PROPRD/scripts

Only in PROPRD: sqlPlusHelp.log

Common subdirectories: DBA102/udump and PROPRD/udump

위 결과에서 공통되는 서브디렉토리를 보고하고 있지만, 서브디렉토리의 비교는 수행되지 않고 있음을 참고하십시오. 서브디렉토리 레벨까지 파일을 비교하려면 아래와 같이 커맨드를 실행합니다:

diff -r dir1 dir2

이 커맨드는 재귀적인 방법을 각각의 서브디렉토리를 비교하고, 동일한 이름을 갖는 파일들의 차이를 보고합니다.

오라클 사용자를 위한 팁

오라클 환경에서 diff 커맨드를 활용하는 대표적인 예로 서로 다른 init.ora 파일 간의 차이를 비교하는 경우를 들 수 있습니다. 필자는 안전을 보장 위해 init.ora 파일을 변경하지 전에 항상 파일을 다른 이름으로 복사해 둡니다. (예: initDBA102.ora를 initDBA102.080306.ora로 변경하여 2006년 8월 3일 변경한 내용임을 명시해 둡니다.) 이렇게 저장된 여러 버전의 파일에 대해 diff 커맨드를 실행하여 어떤 내용이 언제 변경되었는지 확인할 수 있습니다.

diff는 오라클 Home 관리를 위한 매우 유용한 커맨드로 활용됩니다. 필자는 패치를 적용할 때 Oracle Home을 업데이트하지 않는 원칙을 세우고 있습니다. 예를 들어, 현재 오라클 버전이 10.2.0.1이라 가정해 보겠습니다. ORACLE_HOME은 /u01/app/oracle/product/10.2/db1으로 설정되어 있습니다. 여기에 10.2.0.2 버전의 패치를 적용할 때, 필자는 Oracle Home에 패치를 적용하지 않습니다. 그 대신 /u01/app/oracle/product/10.2/db2 디렉토리를 새로 구성하고 이 디렉토리에 패치를 적용합니다. 그런 다음, 아래와 같이 실행합니다:

# sqlplus / as sysdba

SQL> shutdown immediate

SQL> exit

# export ORACLE_HOME=/u01/app/oracle/product/10.2/db2

# export PATH=$ORACLE_HOME/bin:$PATH

# sqlplus / as sysdba

SQL> @$ORACLE_HOME/rdbms/admin/catalog

...

and so on.

이 방법은 기존의 Oracle Home을 건드리지 않고, 나중에 문제가 생기더라도 쉽게 환경을 복구할 수 있다는 장점이 있습니다. 또 데이터베이스의 셧다운, 재시작 과정이 매우 신속하게 진행된다는 부가적 이점이 있습니다. Oracle Home에 패치를 직접 적용하는 경우라면, 패치 애플리케이션이 실행되는 동안 데이터베이스를 내내 셧다운 상태로 유지해야 할 것입니다. 또 패치 애플리케이션이 어떤 이유로든 정상적으로 동작하지 않는다면, 온전한 Oracle Home을 다시 구성하기 어려울 것입니다.

이렇게 해서 여러 개의 Oracle Home이 만들어졌다고 가정해 봅시다. 변경된 내용을 어떻게 확인할 수 있을까요? 그 방법은 아주 간단합니다:

diff -r /u01/app/oracle/product/10.2/db1 /u01/app/oracle/product/10.2/db2 |

grep -v Common

위 명령은 두 Oracle Home 간의 차이를 비교하고, 동일한 이름을 갖는 파일 간의 차이를 비교합니다. tnsnames.ora, listener.ora, sqlnet.ora와 같은 중요한 파일에 변경된 사항이 많다면, 그 이유가 무엇인지 확인해 보아야 합니다.

cmp. cmp 커맨드는 diff와 유사합니다.

# cmp file1 file2

file1 file2 differ: byte 10, line 1

diff 커맨드는 두 파일에서 차이가 발생하는 첫 번째 위치를 반환합니다. 이 커맨드를 이용하여 파일의 내용이 다른 위치를 분석할 수 있습니다. cmp 와 마찬가지로 diff에도 다양한 옵션이 제공됩니다. 그 중 가장 중요한 옵션인 -s는 아래와 같은 코드를 반환합니다:

  • 0 – 두 파일이 동일한 경우
  • 1 – 두 파이에 차이가 존재하는 경우
  • 다른 숫자 – 비교 작업이 수행될 수 없는 경우

실행 예가 아래와 같습니다:

# cmp -s file3 file4

# echo $?

0

특수 변수 $?는 마지막으로 실행된 커맨드에서 반환된 코드를 의미합니다. 위의 경우 0이 반환되었으며, 결국 file1과 file2가 동일함을 알 수 있습니다.

# cmp -s file1 file2

# echo $?

1

위 결과는 file1과 file2가 서로 다름을 의미합니다.

cmp 커맨드의 -s 옵션은 두 파일에 차이가 있는지의 여부만을 검사하는 스크립트에서 매우 유용합니다. 또 cmp 커맨드는 바이너리 파일을 비교하는 경우에도 사용됩니다. diff는 바이너리 파일에 대해 안정적으로 동작하지 않습니다.

오라클 사용자를 위한 팁

앞에서 설명한, 오라클 실행 파일의 relink 작업 과정에서 이전 버전의 파일을 별도 저장하는 방법에 대한 팁을 상기하시기 바랍니다. relink를 수행하는 과정에서, sqlplus 실행 파일의 이름은 "sqlplusO"로 변경되고 새로 컴파일된 sqlplus가 $ORACLE_HOME/bi에 저장됩니다. 그렇다면 새로 생성된 sqlplus가 이전 버전과 어떤 차이를 갖는지 어떻게 비교할 수 있을까요? 아래와 같이 실행하면 됩니다:

# cmp sqlplus sqlplusO

sqlplus sqlplusO differ: byte 657, line 7

이번에는 파일의 크기를 비교해 봅시다.

# ls -l sqlplus*

-rwxr-x--x 1 oracle dba 8851 Aug 4 05:15 sqlplus

-rwxr-x--x 1 oracle dba 8851 Nov 2 2005 sqlplusO

파일의 크기가 같음에도 불구하고 두 프로그램의 내용이 다르다는 사실을 cmp 커맨드로 확인할 수 있었습니다.

comm.comm 커맨드는 앞의 두 가지와 유사하지만, 결과가 탭으로 구분된 3 개의 컬럼으로 표시된다는 차이를 갖습니다. 실행 예가 아래와 같습니다:

# comm file1 file2

In file1 and file2

In file1 only

In file1 and file2

In file2 only

설명된 커맨드의 요약

 

커맨드

사용법

chmod

파일의 권한을 변경 (- -참조 매개변수 사용)

chown

파일의 소유자를 변경 (- -참조 매개변수 사용)

chgrp

파일의 그룹을 변경 (- -참조 매개변수 사용)

stat

파일의 세부적인 속성 확인 (예: 마지막 접근한 날짜)

file

파일의 타입 확인 (ASCII, 데이터 등)

diff

두 파일 간의 차이 확인

cmp

두 파일의 비교

comm

두 파일의 차이를 비교하고 그 결과를 3 개의 컬럼에 표시

md5sum

파일의 MD5 체크섬을 계산하고, 파일이 변경되었는지의 여부를 확인

이 커맨드는 다른 파일에 존재하지 않고 특정 파일에만 존재하는 컨텐트를 직접 확인하고자 하는 경우에 유용합니다(이런 점에서 SQL 언어의 MINUS 유틸리티와 유사합니다). -1옵션을 사용하면 첫 번째 파일에서만 확인되는 컨텐트가 표시되지 않게끔 할 수 있습니다:

# comm -1 file1 file2

In file1 and file2

In file2 only

md5sum. 이 커맨드는 파일의 32비트 MD5 해쉬 값을 생성합니다:

# md5sum file1

ef929460b3731851259137194fe5ac47 file1

동일한 체크섬(checksum)을 갖는 파일은 동일하다고 인정됩니다. 이 커맨드는 파일 간의 비교만을 위해 사용되는 것이 아닙니다. md5sum 커맨드는 파일의 무결성을 보장하기 위한 메커니즘을 제공하기도 합니다.

보호 대상에 포함되는 두 개의 중요한 파일(file1과 file2)이 있다고 가정해 봅시다. --check 옵션을 사용하면 파일이 변경되지 않았음을 확인할 수 있습니다. 먼저 두 파일의 체크섬을 생성하여 안전한 장소에 보관합니다:

# md5sum file1 file2 > f1f2

나중에 파일이 변경되지 않았음을 확인하려면 아래와 같이 실행합니다:

# md5sum --check f1f2

file1: OK

file2: OK

파일이 변경되지 않았음을 분명히 확인할 수 있습니다. 이제 파일 하나를 변경한 뒤 다시 MD5 해쉬 값을 비교해 봅시다:

# cp file2 file1

# md5sum --check f1f2

file1: FAILED

file2: OK

md5sum: WARNING: 1 of 2 computed checksums did NOT match

file1이 변경되었음을 분명히 확인할 수 있습니다..

오라클 사용자를 위한 팁

md5sum는 보안 구현 과정에서 매우 유용하게 활용됩니다. listener.ora, tnsnames.ora, init.ora와 같은 설정 파일은 오라클 인프라스트럭처에서 매우 중요하며, 잘못 변경된 경우 다운타임을 초래할 수 있습니다. 따라서 변경 관리 프로세스에 이 파일들을 포함시키는 것이 일반적인 관행입니다. 다른 사용자의 말만 믿고 이 파일이 변경되지 않은 것으로 간주하는 대신, MD5 체크섬을 사용하여 변경 여부를 검증할 수 있습니다. 변경 작업을 수행하거나 파일을 재생성해야 하는 경우, 항상 사전에 체크섬을 생성해 둡니다. 그리고 md5sum 커맨드를 이용하여 파일을 정기적으로 점검합니다. 다른 사용자가 실수로 이 파일들을 변경한 경우에도, 변경 내역을 즉각적으로 감지할 수 있습니다.

또 $ORACLE_HOME/bin 디렉토리에 존재하는 모든 실행 파일에 대해 MD5 체크섬을 생성하고 정기적으로 비교하여 불법적인 변경 작업이 발생하지 않았는지 확인할 수 있습니다.

'02.서버-Linux' 카테고리의 다른 글

[리눅스]파티션 설계  (0) 2012.12.19
[리눅스]패키지 업데이트  (0) 2012.12.19
[리눅스]고급 커맨드 2  (0) 2012.12.19
[리눅스]불필요 서비스 제거  (0) 2012.12.19
[리눅스]한글이 깨질 경우  (0) 2012.12.19
Posted by redkite
, |

부팅시 불필요한 서비스가 많다.
하지만 우리는 이런것에 별로 관심을 가지지 않는다..
보안레벨에서 이런것들이 중요하게 대두된다.
일단 부팅시 수행되는 서비스 목록들을 살펴보자
명령어는 다음과 같다

[root@yunisj /root]# chkconfig --list| sort

명령어를 입력하면 아래와 같이 나올것이다
======================================================
anacron 0:off 1:off 2:off 3:off 4:off 5:off 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
............
생략.............

여기서 약간의 설명을 부치면 다음과 같다
chkconfig
명령어는 /sbin 위치하며, 칼럼마다 잇는 숫자는 런레벨의 표시이다
따라서 crond 런레벨 2,3,4,5에서 수행된다는것을 알수있다.
물론 서비스는 /etc/rc.d/init.d/ 위치한 파일들이다.
각각의 서비스에 대한 해설을 바로 위에 있는 "/etc/rc.d/init.d/ 있는 것들"이란 곳에서 설명한다.
일단 해당 서비스를 죽엿다,살렸다 하는법을 알아보자
chkconfig --add service_name <--
서비스 작동
chkconfig --del service_name <--
서비스 중지
chkconfig --list | grep ":on" <--
현재 작동중인 서비스목록만 보기
일반적으로 특별한 이유가없는한 수행하지 말아야 목록들은 다음과 같다

chkconfig --del anacron
chkconfig --del apmd
chkconfig --del arpwatch
chkconfig --del atd
chkconfig --del gpm
chkconfig --del netfs
chkconfig --del nfs
chkconfig --del nfslock
chkconfig --del portmap
chkconfig --del rstatd
chkconfig --del rusersd
chkconfig --del rwhod
chkconfig --del sendmail
chkconfig --del snmpd
chkconfig --del xfs
chkconfig --del ypbind
chkconfig --del yppasswdd
chkconfig --del ypserv

그리고 나서 시스템을 재부팅한다.
그리고 나서
chkconfig --list | grep ":on"
명령어로 서비스를 확인한다.

 

 

chkconfig --level 0123456 arptables_jf off

chkconfig --level 0123456 sendmail off

chkconfig --level 0123456 lm_sensors off

chkconfig --level 0123456 cups-config-daemon off

chkconfig --level 0123456 nfslock off

chkconfig --level 0123456 gpm off

chkconfig --level 0123456 mdmonitor off

chkconfig --level 0123456 rpcgssd off

chkconfig --level 0123456 kudzu off

chkconfig --level 0123456 autofs off

chkconfig --level 0123456 isdn off

chkconfig --level 0123456 smartd off

chkconfig --level 0123456 rawdevices off

chkconfig --level 0123456 microcode_ctl off

chkconfig --level 0123456 apmd off

chkconfig --level 0123456 haldaemon off

chkconfig --level 0123456 atd off

chkconfig --level 0123456 irqbalance off

chkconfig --level 0123456 rpcidmapd off

chkconfig --level 0123456 cups off

chkconfig --level 0123456 anacron off

chkconfig --level 0123456 netfs off

chkconfig --level 0123456 messagebus off

chkconfig --level 0123456 acpid off

chkconfig --level 0123456 cpuspeed off

chkconfig --level 0123456 portmap off

chkconfig --level 0123456 rhnsd off

 

chkconfig --level 0123456 xfs off

'02.서버-Linux' 카테고리의 다른 글

[리눅스]파티션 설계  (0) 2012.12.19
[리눅스]패키지 업데이트  (0) 2012.12.19
[리눅스]고급 커맨드 2  (0) 2012.12.19
[리눅스]고급 커맨드 1  (0) 2012.12.19
[리눅스]한글이 깨질 경우  (0) 2012.12.19
Posted by redkite
, |

한글이 깨지는 현상이 있을 경우 /etc/sysconfig/i18n 의 설정은 아래와 같았음

LANG="ko_KR.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"
SYSFONT="latarcyrheb-sun16"

이부분을 아래와 같이 수정~~~

# 한글 설정
/etc/sysconfig/i18n

LANG="ko_KR.eucKR"
SUPPORTED="en_US.iso885915:en_US:en:ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="iso15"


# 매뉴얼 설정 수정
vi /etc/man.config

수정
PAGER /usr/bin/less -isr ( --> 이부분은 안해도 한글설정됨!! )

수정후 바로적용하고 싶다면 "source /etc/sysconfig/i18n " 하면된다.

'02.서버-Linux' 카테고리의 다른 글

[리눅스]파티션 설계  (0) 2012.12.19
[리눅스]패키지 업데이트  (0) 2012.12.19
[리눅스]고급 커맨드 2  (0) 2012.12.19
[리눅스]고급 커맨드 1  (0) 2012.12.19
[리눅스]불필요 서비스 제거  (0) 2012.12.19
Posted by redkite
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함