본문 바로가기
리눅스(Linux)

rc.d

by sinn 2009. 8. 27.

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

커널이 메모리에 적재되고 제일 먼저 시작하는 프로세스는 바로 init이다.

이 init이 시작하면 리눅스 시스템이 가동되기 시작하는 것이며 이 init이 죽으면 그 시스템은 멈춘 것이다.
$ ps aux | less
위 명령으로 확인해보라. init의 PID는 1 번이다.

유닉스 시스템을 아는 사람은 이미 알고 있는 내용으로서 모든 프로세스는 결국 init으로부터 복제(fork)되어 생성된 것이다.

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1096 52 ? S Jul17 0:04 init [5]
root 2 0.0 0.0 0 0 ? SW Jul17 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Jul17 0:00 [kpiod]
root 4 0.0 0.0 0 0 ? SW Jul17 0:00 [kswapd]
root 5 0.0 0.0 0 0 ? SW Jul17 0:00 [mdrecoveryd]
root 105 0.0 0.0 1068 0 ? SW Jul17 0:00 [apmd]
bin 258 0.0 0.3 1096 208 ? S Jul17 0:00 portmap
root 308 0.0 0.2 1336 160 ? S Jul17 0:00 syslogd -m 0
root 319 0.0 0.0 1380 0 ? SW Jul17 0:00 [klogd]
daemon 335 0.0 0.1 1208 104 ? S Jul17 0:00 /usr/sbin/atd
root 349 0.0 0.1 1252 108 ? S Jul17 0:00 crond
root 363 0.0 0.1 1228 68 ? S Jul17 0:00 inetd
root 379 0.0 0.0 1244 44 ? S Jul17 0:00 routed -q
root 414 0.0 0.6 1904 380 ? S Jul17 0:00 sendmail: accepti
root 429 0.0 0.0 1124 56 ? S Jul17 0:00 gpm -t ps/2

init의 중요한 임무 중 하나는 시스템을 초기화시키는 것이다.

우선 init은 다음 파일을 살펴보고 자기가 어떤 일을 해야 할지 알아본다.
/etc/inittab
실행 레벨(Run Level)이라는 개념 리눅스는 실행 레벨이라는 개념을 갖는다.

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

4 번은 어디 있는가? 그것은 사용하지 않는다.

initdefault 항목에서 기본값을 정해주게 되어 있는데 절대 0 번이나 6 번으로 정하는 실수를 범하지 말라.

시스템이 부팅되자마자 리부팅되거나 중지해버릴 것이다.

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

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)와 같은 메시지가 설정되는 부분을 이해할 수 있을 것이다.

---------------------------------------------------------------------------------------------
출처 /인하대/하태균
반응형

'리눅스(Linux)' 카테고리의 다른 글

RPM 사용하기  (0) 2009.08.27
[꽁수]리눅스 설치후 초기 보안 설정  (0) 2009.08.27
tar 사용하기  (0) 2009.08.27
리눅스의 기본 편집기 바꾸기  (0) 2009.08.27
리눅스에서 하드디스크 추가하기  (0) 2009.08.27