다음 이전 차례

1. SysV 초기화

지금부터는 레드햇 배포판에서 사용하는 SysV 초기화 스타일에 대해서 알아보도록 하겠다. 그 동안 가장 많이 사용되어 왔던 배포판은 역시 패트릭 볼커딩 씨의 슬랙웨어임이 분명하며 통계상으로 볼 때 지금 현재도 그러하다. 하지만 레드햇, 데비안 배포판의 사용자들이 많아지면서 슬랙웨어처럼 캐주얼하고 약간은 아마추어적인 배포판과는 달리 고가의 상용 유닉스 시스템에서나 볼 수 있었던 탄탄한 패키지 관리 시스템, 이로 인해 더 이상 몇 달에 한 번씩 시스템 전체를 다시 설치해야 하는 굴레에서 벗어나게 되었다는 점은 리눅스 세계의 발전이라 하지 않을 수 없다.

슬랙웨어를 쓰고 있는 사람들, 그리고 엉겁결에 슬랙웨어에서 새로운 배포판으로 주목받는 레드햇 배포판으로 옮겨온 사람들은 슬랙웨어와 비교하여 어떠한 부분이 다른 것인지 알고 싶어한다.

전체적으로 배포판 모두는 같은 리눅스이며 다른 리눅스일 수 없다는 점은 분명하다. 많은 사람들이 슬랙웨어, 레드햇, 데비안이 마치 전혀 다른 것인 것처럼 느끼는데 이 모두를 사용해본 필자로서는 결론적으로 ‘리눅스’라는 점에서 그리고 결국은 모두 관리자(즉 여러분)의 능력에 달렸다고 말하고 싶다. 이미 자신의 리눅스 시스템이 여러분의 부지런한 손길을 받아서 충분히 안정화되어 있다면, 그리고 특별한 이유가 없으면 단지 새로운 배포판이 나왔다고 하여 멀쩡하게 잘 돌아가는 시스템을 날리는 일은 없도록 해야 한다고 생각한다. 배포판 설치쯤이야 이제 남의 도움 없이도 스스로 해낼 수 있는 사람이라면 새로운 배포판을 경험해보는 재미 또한 빼놓을 수 없는 재미일지 모른다.

하지만 필자의 생각으로는 배포판 재미보다는 새로운 응용 기술과 프로그램을 익히는 것이 더 유익한 시간이 되지 않을까 한다. 또는 여가시간 동안 HOWTO 문서를 읽어보거나 한글로 번역되지 않은 문서를 번역해서 다른 한국 리눅서들을 돕는 것이 더 좋은 일이 아닐까 생각한다.

1.1 리눅스의 첫 번째 프로세스는 init

커널이 메모리에 적재되고 제일 먼저 시작하는 프로세스는 바로 init이다. 이 init이 시작하면 리눅스 시스템이 가동되기 시작하는 것이며 이 init이 죽으면 그 시스템은 멈춘 것이다.

$ ps aux | less

위 명령으로 확인해보라. init의 PID는 1 번이다. 유닉스 시스템을 아는 사람은 이미 알고 있는 내용으로서 모든 프로세스는 결국 init으로부터 복제(fork)되어 생성된 것이다.

USER PID %CPU %MEM SIZE RSS  TTY STAT  START TIME
COMMAND
bin   136 0.0 0.0  824   0 ? SW Mar 13  0:00 (portmap)
nobody 189 0.0 0.2 1104  112 ? S  Mar 13  0:00 (httpd)
nobody 190 0.0 0.2 1104  116 ? S  Mar 13  0:00 (httpd)
nobody 191 0.0 0.2 1104  104 ? S  Mar 13  0:00 (httpd)
nobody 192 0.0 0.2 1104  120 ? S  Mar 13  0:00 (httpd)
nobody 193 0.0 0.2 1104  108 ? S  Mar 13  0:00 (httpd)
root   1 0.0 0.4  812  212 ? S  Mar 13  0:04 init
root   2 0.0 0.0   0   0 ? SW Mar 13  0:00 (kflushd)
root   3 0.0 0.0   0   0 ? SW<Mar 13  0:00 (kswapd)
root   4 0.0 0.0   0   0 ? SW Mar 13  0:00 (nfsiod)
root   5 0.0 0.0   0   0 ? SW Mar 13  0:00 (nfsiod)
root   6 0.0 0.0   0   0 ? SW Mar 13  0:00 (nfsiod)
root   7 0.0 0.0   0   0 ? SW Mar 13  0:00 (nfsiod)
root   21 0.0 0.1  796   48 ? S  Mar 13  0:00 /sbin/kerneld
root  103 0.0 0.3  824  164 ? S  Mar 13  0:00 syslogd
root  114 0.0 0.2  972  112 ? S  Mar 13  0:00 klogd
root  125 0.0 0.1  820   84 ? S  Mar 13  0:00 crond
root  147 0.0 0.0  804   16 ? S  Mar 13  0:00 (inetd)
root  158 0.0 0.0  828   4 ? S  Mar 13  0:00 (lpd)
root  170 0.0 0.1  976   76 ? S  Mar 13  0:00 named
root  181 0.0 0.3 1104  160 ? S  Mar 13  0:00 httpd
root  207 0.0 0.4 1220  224 ? S  Mar 13  0:00 sendmail: accepting

init의 중요한 임무 중 하나는 시스템을 초기화시키는 것이다. 우선 init은 다음 파일을 살펴보고 자기가 어떤 일을 해야 할지 알아본다.

/etc/inittab

실행 레벨(Run Level)이라는 개념

리눅스는 실행 레벨이라는 개념을 갖는다. 레드햇 시스템에서 시스템 정지를 의미하는 0 번, 루트만이 로그인할 수 있고 시스템의 문제를 고치게 되는 싱글 유저 모드 1 번, NFS 서비스를 제공하지 않는 다중 사용자 모드 2 번, 그리고 기본값으로 모든 사용자들이 로그인할 수 있고 시스템의 모든 기능이 다 발휘되는 3 번, 초기화하자마자 로그인 화면이 X 윈도 로그인 화면으로 뜨는 5 번, 그리고 마지막으로 리부팅 모드인 6 번이 있다. 4 번은 어디 있는가? 그것은 사용하지 않는다.

initdefault 항목에서 기본값을 정해주게 되어 있는데 절대 0 번이나 6 번으로 정하는 실수를 범하지 말라. 시스템이 부팅되자마자 리부팅되거나 중지해버릴 것이다.

이렇게 실행 레벨이라는 개념을 가지므로 시스템은 여러 가지 상황에 대하여 좀더 유연하게 대처할 수 있고 더욱 논리적인 시스템이 된다.

1.2 /etc/rc.d 디렉터리 탐험

이 디렉터리의 구조가 슬랙웨어와는 전혀 달라 많은 사람들이 어리둥절해 하곤한다.

rc.sysinit

시스템 초기화시 맨 먼저 딱 한 번 실행되는 초기화 스크립트이다. /etc/sysconfig/network 내용을 불러들인 다음, hostname 명령으로 호스트 이름을 설정한다. 많은 사람들이 레드햇의 제어판(control-panel)에서 네트워크 설정을 하면 어디에 저장되는지 알고자 하는데 바로 기본값이 /etc/sysconfig 밑에 저장되어 있다는 것을 알아두기 바란다.

스왑을 활성화시키고 /etc/fstab 정보에 의거하여 파일 시스템에 이상이 있는지 일단 점검한다. 마운트한다. 만약 심각한 문제가 발생하는 경우에는 (Repair filesystem) # 라는 프롬프트를 내놓고 수동으로 e2fsck를 돌려서 파일 시스템을 점검하도록 요청한다. 레드햇 시스템에서는 파일 시스템을 점검한 후에는 리부팅하도록 되어 있다. 셸 스크립트를 이해하는 사람들은 곰곰히 읽어보기 바란다. 여러분이 다른 용도로 셸 스크립트를 짜는데 많은 도움이 될 것이라 믿는다.

rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

레드햇 리눅스의 /etc/rc.d 디렉터리의 특징은 바로 여기에 있다. 각 실행 레벨 마다 별도의 디렉터리를 마련해두고 있다. 자, 기본 실행 레벨 3 번에 관계되는 rc3.d 디렉터리에 들어가보라. 그리고 ls -l 해보자.

S10network    ->   ../init.d/network
S30syslog     ->   ../init.d/syslog
S40cron       ->   ../init.d/cron.init
S40portmap    ->   ../init.d/portmap.init
S50inet       ->   ../init.d/inet
S50lpd.init   ->   ../init.d/lpd.init
S55named.init ->   ../init.d/named.init
S65httpd      ->   /etc/rc.d/init.d/httpd.init
S75keytable   ->   ../init.d/keytable
S80sendmail   ->   ../init.d/sendmail.init
S85gpm        ->   ../init.d/gpm
S99local      ->   ../rc.local

오로지 링크만 존재한다. 그리고 그 링크는 모두 /etc/init.d 디렉터리의 스크립 트들을 가리키고 있다. 다른 디렉터리들에 들어가도 마찬가지이다.

실제 스크립트는 모두 /etc/rc.d/init.d 에 있다.

링크된 이름을 잘 살펴보면 S## 이름의 형식을 띄고 있다는 것을 알 수 있다(여기서 ##는 숫자). rc6.d에 가보면 대부분이 K## 이름의 형식을 가지고 있다는 것도 알 수 있다. 이에 대한 설명은 잠깐 미루기로 하자. 일단 모든 스크립트가 들어있는 /etc/rc.d/init.d 디렉터리로 가본다.

cron.init      크론 시작/종료 스크립트
functions      다른 스크립트에 사용되는 유틸리티 함수
gpm            텍스트 모드 마우스 시작/종료 스크립트
halt           halt 또는 reboot 스크립트
httpd.init     웹 서버 시작/종료 스크립트
inet           inet 수퍼 서버 시작/종료 스크립트
keytable       키보드 테이블 지정 시작/종료 스크립트
killall        죽지 않는 프로세스 강제 종료 스크립트
lpd.init       BSD 프린팅 데몬 시작/종료 스크립트
named.init     로컬 네임서버 데몬 시작/종료 스크립트
network        네트워크 업/다운 스크립트
news           뉴스서버 업/다운 스크립트
nfs            NFS 서비스 시작/종료 스크립트
nfsfs          NFS 마운트 스크립트
pcmcia         PCMCIA 시작/종료 스크립트
portmap.init   포트맵 데몬 시작/종료 스크립트
random         난수 발생 스크립트
sendmail.init  메일 서버 시작/종료 스크립트
single         싱글 모드 진입 스크립트
skeleton       레드햇 init 스크립트 뼈대
syslog         syslog 시작/종료 스크립트

만약 웹 서버를 멈추게 하고자 한다면 다음과 같이 한다.

# ./httpd.init stop

다시 시작하려면 다음과 같이 입력한다.

# ./httpd.init start

상당히 이성적이지 않은가? 시작하려면 start를, 멈추려면 stop을 셸 스크립트의 전달 인수로 준다. 만약 여러분이 어떤 서비스에 대한 초기화 스크립트를 만들려고 한다면 다음의 skeleton 스크립트를 기본 뼈대로 하고 나머지 스크립트를 참고하여 start에 대해서는 서비스 시작 명령을, 그리고 stop에 대해서는 서비스 종료에 관계된 명령을 적어주도록 한다.

# 스크립트에 사용되는 함수 라이브러리 루틴을 소스(source)한다
. /etc/rc.d/init.d/functions

# 이 부분을 유심히 살펴보기 바란다.
case "$1" in
 start)
    touch /var/lock/subsys/skeleton
    ;;
 stop)
    rm -f /var/lock/subsys/skeleton
    ;;
 *)
    echo "Usage: skeleton {start|stop}"
    exit 1
esac

exit 0

그럼 rc?.d 디렉터리의 각 심볼릭 링크 파일의 이름은 어떤 의미를 갖는가? S로 시작하는 심볼릭 링크 파일은 가리키는 스크립트에 start가 붙어서 실행된다. 즉 시작 스크립트이다. K로 시작하는 심볼릭 링크는 가리키는 스크립트에 stop이 붙어서 실행된다. 즉 종료 스크립트이며 Kill을 의미한다. 실제로 어떻게 호출되고 있는지를 알아보기 위해서는 /etc/rc.d/rc 스크립트를 읽어보면 된다.

여러분이 원하는 단 한 번의 실행 명령은 rc.local에!

시스템 초기화할 때 딱 한 번 실행되길 원하는 명령은 아무 곳에나 두지 말고 rc.local 파일 뒷부분에 추가한다. 필자는 다음을 추가하였다.

modprobe slhc 
modprobe ppp            PPP 기능 로딩
modprobe bsd_comp
modprobe ppp_deflate
modprobe ip_masq_ftp    FTP 매스커레이딩 기능 로딩
modprobe aic7xxx        아답텍 SCSI 컨트롤러 인식
modprobe sbpcd          AT버스 사블2배속 인식

rc.local 스크립트를 잘 보면 여러분이 로그인할 때 볼 수 있는 Red Hat Linux release 4.1 (Vanderbilt)와 같은 메시지가 설정되는 부분을 이해할 수 있을 것이다.

1.3 제어판의 실행레벨 편집기 사용하기

그림 1:제어판
---------------------------------------------------------------
File                                                      Help
---------------------------------------------------------------
init.d     0 번    1 번    2 번    3 번    4 번    5 번    6 번
           시작    시작    시작    시작    시작    시작    시작
---------------------------------------------------------------
Add
Remove     0 번    1 번    2 번    3 번    4 번    5 번    6 번
Edit       종료    종료    종료    종료    종료    종료    종료
Execute
---------------------------------------------------------------

제어판의 화면 구성은 위와 같다. 맨 왼쪽 상단 창에는 /etc/rc.d/init.d 디렉터리에 있는 모든 스크립트가 나타나 있다. 그 스크립트를 몇 번 레벨의 시작 또는 종료에 넣을 것인지 결정하면 된다. 하나를 선택하고 추가(Add) 버튼을 누르면 어느 실행 레벨에 추가할 것인지 물어온다. 그리고 시작 스크립트인지 아니면 종료 스크립트인지 물어오게 될 것이다. 그리고 나서는 두 자리 숫자를 적어주게 되는데 그 숫자가 낮을 수록 우선적으로 실행된다. 제거(Remove) 버튼은 각 실행 레벨에서 선택한 후 선택한다. 물어보지 않고 지우므로 주의하기 바란다.

편집(Edit) 버튼은 각 스크립트의 우선 순위 번호를 편집하는 것이다. 실행 버튼 (Execute)은 일단 init.d 창에서 원하는 스크립트를 선택한 후 start/stop을 선택한다.

소형 시스템에서는 그렇게 매력적으로 보이지 않을지 모르나 대형 서버에서는 관리자로 하여금 체계적인 시스템 관리를 하게 해줄 수 있는 훌륭한 GUI 도구라고 본다. 지금까지 독특한 레드햇 SysV 초기화 시스템을 알아보았다.


다음 이전 차례