1. chmod
파일 또는 디렉토리의 접근 권한을 변경하는 명령이다.

1.1 chmod의 기본적인 사용법
chmod [-옵션] [모드] [파일명]

[옵션]
chmod 명령에는 몇가지 옵션이 존재하지만 -R 옵션 외에는 사용할 일이 없기 때문에 -R 옵션만 설명을 하겠다.
-R : 퍼미션 변경 대상이 디렉토리일 경우 그 하위 경로에 있는 모든 파일과 디렉토리의 퍼미션을 변경한다.

[모드(심볼릭)]
심볼릭 모드와 8진수 모드를 사용할 수 있는데 대부분의 사용자들은 심볼릭 모드 보다 8진수 모드를 선호한다. 그럼 심볼릭
모드부터 공부해 보도록 하자.
심볼릭 모드에서 "u = 소유자, g = 소유 그룹, o = other, a = all, r = 읽기, w = 쓰기, x = 실행"을 의미한다.
심볼릭 모드에서는 권한 추가에 대해서 '+' 를 사용하고 권한 박탈에 대해서는 '-' 를 사용한다. '=' 를 사용하면 현재 설정
된 권한은 제거되고 오직 '='로 설정한 권한만 부여한다.

▶ file1에 대해 소유 그룹에게 쓰기 권한을 추가할 때
[root@rootman root]# chmod g+w file1

▶ 소유자에게 file1에 대해 쓰기 권한을 주고 소유 그룹에게는 쓰기 권한을 박탈할 할 때
[root@rootman root]# chmod u+w,g-w file1
--> 위와 같이 동시에 여러 대상에 대해 설정할 때는 각 대상을 콤마(,)로 구분하면 된다. 절대 공백이 들어가서는 안된다.

[모드(8진수)]
8진수 모드에서 4 = 읽기, 2 = 쓰기, 1 = 실행을 의미한다. 8진수 모드는 소유자와 소유그룹, other에 대해서 8진수 3자리로
표현하는데 첫째 자리수가 소유자를 의미하고 둘째 자릿수가 소유 그룹, 셋째 자릿수가 other을 의미한다.
예를 들어 751 라는 퍼미션은 소유자에게 7, 소유 그룹에게 5, other에게 1 에 해당하는 퍼미션을 설정한 것이다.
퍼미션의 계산은 주어진 권한에 해당하는 8진수 값을 모두 더해서(+) 설정된다.

▶ 소유자에게 읽기, 쓰기, 실행 권한을 소유 그룹에게는 읽기, 실행 권한을 other에게는 실행 권한만을 설정한 8진수 모드
소유자 = 4(읽기) + 2(쓰기) + 1(실행) = 7
소유그룹 = 4(읽기) + 1(실행) = 5
other = 1(실행) = 1
--> 이걸 정리하면 751 이라는 8진수 모드로 표현할 수 있다. 물론 초보자를 위한 설명이니까 덧셈까지 하면서 설명을 했지만 몇번 사용하다 보면 금방 익힐 수 있을 것이다.

▶ file1에 대해 소유자에게 읽기, 쓰기 권한을 소유 그룹과 other에게는 읽기 권한을 갖도록 설정할 때
[root@rootman root]# chmod 644 file1

1.2 특별한 퍼미션 setuid, setgid, sticky bit
setuid, setgid
실행 퍼미션에는 setuid와 setgid라는 특별한 퍼미션이 있다. setuid는 심볼릭 모드로 's'로 표현되고 8진수 모드로는 4000
으로 표현된다. setuid 퍼미션이 설정되어 있는 실행 파일은 실행되는 동안에는 그 파일의 소유자 권한을 가지게 된다.
이러한 이유때문에 root 소유의 setuid 퍼미션이 포함되어 있는 파일은 아주 신중히 관리를 해야 된다. 저는 사용 안하는
setuid 실행 파일은 setuid 퍼미션을 제거해서 따로 보관하고 있습니다. setgid 퍼미션이 포함되어 있는 실행 파일은 실행되는 동안은 그 파일의 소유 그룹의 권한을 가지는 것 빼고는 setuid와 같다. setgid의 8진수 모드는 2000 이다.
setuid 퍼미션을 포함하고 있는 실행 파일을 ls -al 명령으로 확인해 보면 다음과 같이 소유자 실행퍼미션에 's'라고 되어
있는 것을 확인할 수 있다.
[root@rootman root]# ls -al /bin/su
-rwsr-xr-x 1 root root 14112 1월 16 2001 /bin/su

setgid가 포함되어 있는 실행 파일을 ls -al 명령으로 확인하면 소유 그룹의 실행 퍼미션에 's'가 설정되어 있는 것을 확인
할 수 있을 것이다.
[root@rootman root]# ls -al /usr/bin/man
-rwxr-sr-x 1 root root 14112 2월 5 2001 /usr/bin/man

▶ file1 이라는 실행 파일에 setuid 퍼미션을 설정할 때
[root@rootman root]# chmod 4755 file1

▶ file1 이라는 실행 파일에 setgid 퍼미션을 설정할 때
[root@rootman root]# chmod 2755 file1

sticky bit
sticky bit도 특별한 퍼미션이다. other의 쓰기 권한에 대한 특별한 퍼미션인데 /tmp 디렉토리와 /var/tmp 디렉토리에의
퍼미션이 stickbit가 포함되어 있다. sticky bit는 8진수 모드로는 1000으로 설정되고 심볼릭 모드로는 't' 또는 'T'
로 설정된다. 이 sticky bit가 포함되어 있는 디렉토리에 other에 쓰기 권한이 있을 경우 other에 해당하는 사용자들은
디렉토리 안에 파일을 만들 수는 있어도 디렉토리 삭제는 할 수 없다.
sticky bit가 포함되어 있는 대포적인 디렉토리가 /tmp 디렉토리인데 분명히 /tmp 디렉토리의 퍼미에는 other에게 쓰기 권한이 주어져 있다. 그렇기 때문에 /tmp 디렉토리에는 누구나 디렉토리와 파일을 만들 수 있다. 하지만 other에 해당하는 사용자는 쓰기 권한이 있음에도 불고 하고 /tmp 디렉토리를 지울수 없는 것이다. 그 이유는 /tmp 디렉토리에는 sticky bit가 설정되어 있기 때문이다. 당연히 소유자는 sticky bit가 설정되어 있는 디렉토리를 삭제할 수 있다.
디렉토리가 아닌 파일에 sticky bit가 설정되어 있을 때는 other 에게 쓰기 퍼미션이 있어도 파일을 수정할 순 있지만 그 파일을 삭제할 수는 없다. sticky bit의 이런 특징을 이용하면 공개 서버에서는 여러모로 요기나게 사용할 수 있을 것이다.
sticky bit를 적용할려면 당연히 쓰기 권한도 주어야 되다.

▶ sticky bit가 포함되어 있는 디렉토리의 ls -al 결과
[root@rootman root]# ls -ald /tmp
drwxrwxrwt 14 root root 4096 Aug 30 02:05 /tmp

▶ dir1 이라는 디렉토리에 sticky bit를 설정할 때
[root@rootman root]# chmod 1707 dir1 --> 또는 chmod 1777 dir1

▶ sticky bit가 설정되어 있는 디렉토리를 other에 해당되는 사용자가 디렉토리 삭제 명령을 했을 때
[rootman@rootman /tmp]# rm -rf dir1
rm: cannot remove directory `dir1': Operation not permitted
[rootman@rootman /tmp]# ls -ald dir1
drwx---rwt 2 root root 4096 Aug 30 18:42 dir1

2. chattr, lsattr
루트도 지우지 못하는 파일을 설정할 수 있다는 말을 들어 본적이 있나요?
chattr을 이용하면 파일의 소유자라도 read-only로만 파일을 열수 있게 할수 있고 root도 chattr로 설정한 것을 해제하지
않으면 절대 chattr +i 로 설정한 파일을 지울 수 없다. 단, root만 사용 가능하다.
간혹 짖궂은 해커는 멍청한 관리자를 위해(?) 해킹한 시스템의 특정 파일에 chattr +i 를 설정해 놓고 chattr 명령을 모르는
관리자가 파일을 수정할려고 끙끙 대는 모습을 즐기기도 한다. 어떤 관리자는 시스템의 문제라고 생각하고 포멧을 하는 관리자를 본적도 있다. 저의 경우는 rootman의 텔넷 서버의 guest 계정에 chattr을 적용한 적이 있다. .bash_profile, .bashrc 같은 파일에 chattr +i 를 설정해서 default 설정을 변경하지 못하도록 하기 위해 사용했었다. 또 chattr에는 파일의 수정을 추가 모드로만 열 수 있도록 설정하는 옵션도 있다.
lsattr 이라는 명령으로 파일의 chattr 모드를 확인할 수 있다.

chattr [옵션] [+=-모드] [파일명]

모드를 추가 할때는 '+모드' , 모드를 제거할 때는 '-모드'를 사용하면 되고 '=모드'를 사용할 경우 현재의 모드는 제거되고
오직 '=모드'로 설정된 모드만 적용된다.

[옵션]
-R : 대상이 디렉토리일 경우 그 하위 경로에 있는 파일과 디렉토리까지 모드를 적용한다.
[모드]
i : 파일을 read-olny로만 열 수 있게 설정한다. 링크도 허용하지 않고 루트만이 이 모드를 제거할 수 있다.
a : 파일의 수정을 할 때 내용을 추가할 수만 있다. 단, vi편집기로는 내용을 추가 할 수 없다.

▶ file1에 i 모드를 추가할 때
[root@rootman /tmp]# chatr +i file1

▶ file2에 a 모드를 추가할 때
[root@rootman /tmp]# chattr +a file2

▶ 파일의 chattr 모드 확인
[root@rootman /tmp]# lsattr file1 file2
---i-------- file1
----a------- file2

▶ i 모드가 설정된 파일을 제거할려고 할 때 나타나는 메시지
[root@rootman /tmp]# rm -f file1
rm: cannot unlink `file1': 명령이 허용되지 않음

▶ a 모드가 설정된 file2 에 내용을 추가할 때
[root@rootman /tmp]# cat >> file2
a 모드가 설정되어 있는 파일.
내용을 추가합니다.
^D
--> a 모드가 설정된 파일은 내용 추가만 할 수 있는데 vi편집기에서는 추가되지 않았다. 위의 예제에는 >>(출력 리다이렉션)을 사용해 내용을 추가 하였다.

▶ i, 또는 a 모드가 설정된 파일에 모드를 제거할 때는 '-모드' 를 이용한다.
[root@rootman /tmp]# chattr -i file1
2005/07/01 15:02 2005/07/01 15:02
일반적으로 Linux Fail Over Cluster System 을 구축하기 위한 솔루션으로는 리눅스 라우팅 박스 아래에 서비스 서버들을 여러대 놓고, 리눅스 라우팅 박스의 Fail Over 를 구성하고, 서비스 서버들끼리 부하분산 Cluster 구성한다.
하지만, 이번 문서에서는 단지 두대의 리얼 서비스 리눅스 박스만으로 Fail Over Cluster 를 구성하기 위한 방법을 기술한다. 단 두대로 서비스 데몬까지 Fail Over Cluster 를 구성해주는 솔루션을 찾을 수 없어서 직접 작성한 스크립트를 추가하였다.

Linux Fail Over Cluster How To

1. 개요.
• 고가용성이란 하나의 노드에 문제가 생긴 경우 다른 노드에서 서비스나 기능을 대신 제공하는 것을 말한다. 공개소스로서 이러한 기능을 구현하고 있는 것이 High-Availability Linux Project 이다. Heartbeat 등의 프로그램을 이용하여, 서비스 서버에 장애가 발생하더라도 예비 서버를 이용하여 계속적인 서비스가 가능하도록 구성하는 것이다.

2. 환경
서버 2대 (Redhat Linux 9.0)
virtual ip  lvstest.com (210.xxx.xxx.225)
server 1  lvs1.lvstest.com (210.xxx.xxx.226)
server 2  lvs2.lvstest.com (210.xxx.xxx.227)

만약 랜카드가 두개씩 장착되어진 시스템이라면 크로스 케이블을 이용 eht1 번
카드로 클러스터링을 구성하도록 할 수 있다. 본 문서는 랜카드가 한 개씩 일 때를
기준으로 작성되었으나, 추가적으로 ▶ Private IP 라는 표시를 하여 두번째
랜카드를 클러스터링용도로 사용하는 방법에 대해서도 함께 기술한다. 만약
랜카드가 하나씩인 시스템에 설치시에는 ▶ Private IP 표시가 된 항목은
무시하도록 한다.

▶ Private IP
Server 1  lvs1.lvstest.com (PublicIP: 210.xxx.xxx.226 / PrivateIP: 192.168.0.226)
Server 2  lvs2.lvstest.com (PublicIP: 210.xxx.xxx.227 / PrivateIP: 192.168.0.227)

3. 설치 프로그램 (lvs1, lvs2 공통)
A. 설치되어 있어야 하는 프로그램들.
autoconf, automake, libtool, glib-devel, lynx
RHN, 혹은 Red carpet 을 통하여 RPM 설치를 한다.
Apache, MySQL, PHP 를 설치한다.

B. 설치할 프로그램들.
libnet, heartbeat
libnet 은 http://www.packetfactory.net/libnet 에서 구할 수 있다. 다운 받은 후 다음의 명령으로 기본 설치한다.

# gzip –cd libnet.tar.gz | tar xvf –
# cd Libnet-latest
# ./configure
# make && make install

heartbeat 은 http://www.linux-ha.org/download/ 에서 구할 수 있다.
다음의 명령으로 기본 설치한다.

# gzip –cd heartbeat-1.0.3.tar.gz | tar xvf –
# cd heartbeat-1.0.3
# ./ConfigureMe configure
# gmake && gmake install (gmake 를 권장한다.)

4. server, heartbeat 설정.
A. Server 설정
Lvs1, lvs2 공통으로 /etc/hosts 파일을 열어 다음 라인을 추가해 준다.

# vi /etc/hosts
210.xxx.xxx.226 lvs1.lvstest.com lvs1
210.xxx.xxx.227 lvs2.lvstest.com lvs2
:wq

▶ Private IP
# vi /etc/hosts
192.168.0.226 lvs1.lvstest.com lvs1
192.168.0.227 lvs2.lvstest.com lvs2

/etc/sysconfig/network 파일을 열어 다음과 같이 개별적으로 편집한다.

Lvs1  HOSTNAME=lvs1
Lvs2  HOSTNAME=lvs2

B. Heartbeat 설정
이하는 모두 공통 설정이다.
우선 각각의 서버에 /etc/rc.d/init.d/heartbeat 이라는 스크립트가 존재하는지를 확인한다. 또한 /etc/ha.d 디렉터리가 존재하는지도 확인한다.
다음으로 각각의 서버에 3개의 환경파일을 생성 및 편집한다. 파일은 다음과 같다.
/etc/ha.d/authkeys, /etc/ha.d/ha.cf, /etc/ha.d/haresources

# vi authkeys
auth1
1 crc
:wq

# vi ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
keepalive 2  두 노드간에 얼마나 자주 heartbeat를 주고받을 것인가. 2초
deadtime 5  호스트가 죽었다고 판단하는 시간. 5초가 지나면 failover를 시작한다.
udpport 694  UDP heartbeat 패킷을 보낼 포트.
udp eth0  heartbeat를 보낼 인터페이스 (eth1 등의 추가적인 장치가 있다면 서비스에 영향을 주지 않도록 eth1 등의 디바이스를 사용한다.)
▶ Private IP
udp eth1
node lvs1
node lvs2
:wq

vi haresources
lvs1 210.xxx.xxx.225  가상 아이피를 적어준다. (두 서버 모두 동일하게 세팅한다.)
:wq

마지막으로 authkeys 파일의 퍼미션을 변경해준다.

# chmod 600 authkeys

부팅시 자동으로 실행될 수 있도록 각각의 서버에서 부트 스크립트 링크를 걸어준다.

# ln –s /etc/rc.d/init.d/heartbeat /etc/rc.d/rc0.d/K05heartbeat
# ln –s /etc/rc.d/init.d/heartbeat /etc/rc.d/rc3.d/S99heartbeat
# ln –s /etc/rc.d/init.d/heartbeat /etc/rc.d/rc5.d/S99heartbeat
# ln –s /etc/rc.d/init.d/heartbeat /etc/rc.d/rc6.d/K05heartbeat

5. Heartbeat 설정 확인
각각의 서버에서 /etc/rc.d/init.d/heartbeat start(enter)
lvs1 에서 ifconfig 명령어로 확인해 보았을 때 eth0:0 가 생성되고 210.xxx.xxx.225 의 가상 아이피가 할당된다. (LVS1, LVS2 순서대로 실행 추천)
lvs1 의 전원을 끄거나 /etc/rc.d/rc3.d/S99heartbeat stop(enter)를 해본다. 잠시후에 lvs2 에서 ifconfig 명령어로 확인해 보았을 때 eth0:0 가 새로 생성되면서 210.xxx.xxx.225 의 가상 아이피가 할당된다.
lvs1 의 전원을 킨다. 혹은 /etc/rc.d/rc3.d/S99heartbeat start(enter)를 한다. 잠시후 lvs2 의 eth0:0 가 없어지고 lvs1 에 eth0:0 가 생성되면서 210.xxx.xxx.225 의 아이피가 할당된다.

6. 서비스 데몬 모니터링
A. 서비스 데몬 체크를 위한 시스템 설정 (LVS1 에만 해당된다)
MySQL root 패스워드를 설정한다. (혹은 데몬 체크를 위한 DB 유저 / 패스워드를 생성한다.)

# /usr/local/mysql/bin/mysql mysql
mysql> update user set password = password(‘$NEWPASSWD’) where user = ‘root’;
mysql> flush privileges;

데몬 체크 스크립트에서 확인 할 수 있도록 아파치 웹 디렉터리에 다음과 같은 파일을 생성한다.

# cd /usr/local/apache/htdocs
# vi apache_mysql_chk.html
$dbcheck=mysql_connect(“:/tmp/mysql.sock”,”root”,”$NEWPASSWD”);  MySQL 의 소켓 값(여기서는 /tmp/mysql.sock)은 netstat –an | grep LIST 하면 확인 할 수 있다. 아이디와 패스워드(여기서는 root) 위에서 설정한 아이디, 패스워드를 사용한다.
If($dbcheck) echo “GOOD”;
else echo “BAD”;
?>
:wq!

B. 서비스 데몬을 모니터링하기 위한 heartbeat 의 추가설정 및 스크립트 (LVS1 에만 해당된다)
/etc/ha.d/resource.d/daemon_chk 스크립트를 생성한다.

vi daemon_chk
#! /bin/sh
# scripted by brainjam at inet.co.kr

# 필요에 따라 SLEEP_TIME 과 LYNX_TIME_OUT 값을 변경해 줄 수 있다.

CHK_FILE=lvstest.com/apache_mysql_chk.html
SLEEP_TIME=2  서비스 데몬 체크 후 다음 체크까지의 초.
LYNX_TIME_OUT=5  서비스 데몬 체크시 응답 까지의 타임아웃 초.
ORIG_SYNTAX=” GOOD”
 터미널에서 다음 명령어를 실행해서 나오는 결과값을 입력. 앞쪽의 space 도 포함해서 입력해 준다. # lynx –dump lvstest.com/apache_mysql_chk.html 일반적으로 spacespacespaceGOOD (space 세개) 일 것 이다.

# 아래 스크립트는 변경하지 않도록 한다.

case $1 in

start)

LOOP_NUM=0
CHK_NUM=0
while [ $LOOP_NUM = 0 ]
do

CHK_NUM=$CHK_NUM
if [ $CHK_NUM = 5 ]
then
/etc/rc.d/init.d/heartbeat stop
exit 0
else
GET_SYNTAX=`lynx –dump –connect_timeout=$LYNX_TIME_OUT –nolog $CHK_FILE | grep GOOD 2>/dev/null`
if [ “$ORIG_SYNTAX” = “$GET_SYNTAX” ]
then
CHK_NUM=0
sleep $SLEEP_TIME
else
CHK_NUM=`expr $CHK_NUM + 1`
sleep $SLEEP_TIME
fi
fi

done
;;

stop)
DAEMON_CHK_PID=`ps aux | awk ‘/daemon_chk/ && !/awk/ {print $2}’ | head -1`
kill -9 $DAEMON_CHK_PID
;;

*)
echo “daemon_chk start or stop”
;;

esac
:wq!

# chmod +x daemon_chk  실행 퍼미션을 적용한다.

서비스에 필요한 스크립트를 /etc/ha.d/resource.d 에 소프트 링크를 건다.

# cd /etc/ha.d/resource.d
# ln –s /usr/local/apache/bin/apachectl ./apache
# ln –s /usr/local/mysql/share/mysql/mysql.server ./mysql

만약 /etc/rc.d 아래에 S99apache, S99mysql 등의 스크립트가 설정되어 있다면 모두 삭제한다. Fail Over 를 위해서 apache, mysql 등의 시작 종료를 heartbeat 가 관장하게 된다.

/etc/ha.d/haresources 를 수정한다.

LVS1 의 haresources 파일
# vi haresources
lvs1 IPaddr::210.xxx.xxx.225 apache mysql daemon_chk

LVS2 의 haresources 파일
# vi haresources
lvs1 IPaddr::210.xxx.xxx.225 apache mysql

7. High Availability Fail Over Clustering 설정 확인
각각의 서버에서 /etc/rc.d/init.d/heartbeat start(enter) 를 실행한다. (LVS1, LVS2 순서대로 실행 추천) LVS1 에 apache 와 mysql 이 실행되었는지 확인한다. (heartbeat 이 올라간 후 실행되기 때문에 5초 정도의 딜레이가 있을 수 있다.) LVS2 에서는 heartbeat 가 실행되더라도 apache 와 mysql 이 실행되지 않는다. 이는 추후에 LVS1 이 서비스 불능시 LVS2 가 Virtual IP (여기서는 210.xxx.xxx.225)를 가져오면서 자동 실행된다.
테스트를 위해서 apache 혹은 mysql 데몬을 종료시킨다. 위의 설정대로 하였다면 10초 뒤 LVS1 의 heartbeat 이 종료되면서 LVS2 가 Virtual IP 를 가져간다. 동시에 LVS2 에서 apache 와 mysql 이 서비스 됨을 확인 할 수 있을 것이다. (LVS1 은 자동으로 apache 와 mysql 데몬을 종료되었을 것이다.)
다시 LVS1 에서 heartbeat 를 실행시키면 다시 Virtual IP 를 LVS1 으로 가져오면서 LVS1 에서 서비스 되는 것을 확인 할 수 있다.
2005/07/01 15:01 2005/07/01 15:01
운용중인 리눅스시스템의 커널버전을 확인하고자 한다면 다음의 두가지 방법이 있습니다.



첫 번째는 uname이라는 명령어를 이용하는 방법으로 다음과 같이 확인합니다.

[root@hlxsvr /proc]# uname -a

Linux hlxsvr.2000.co.kr 2.2.14 #1 SMP 월 3월 6 11:13:37 KST 2000 i686 unknown

[root@hlxsvr /proc]#



둘째로는 /proc 디렉토리에서 version이라는 파일의 내용을 cat이란 명령으로 확인해 보는 것입니다.

[root@hlxsvr /]cd /proc

[root@hlxsvr /proc]# cat version

Linux version 2.2.14 (root@superuser.co.kr) (gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)) #1 SMP 월 3월 6 11:13:37 KST 2000

/proc이란 디렉토리는 실제로 존재하는 디렉토리가 아니라 가상의 디렉토리로서 현재 메모리에 올라와 있는 실행중인 모든 프로세스들의 정보를 보관하고 있는 디렉토리입니다.
2005/07/01 15:01 2005/07/01 15:01