service 와 chkconfig

리눅스는 서버로 많이 사용되므로 부팅시 서비스용 데몬들은 자동으로 구동되어야 관리가 편리하며 데몬 미구동으로 인한 서비스 제공 불능 상황을 방지할 수 있다. 서비스를 자동으로 구동하기 위해서는 먼저 리눅스의 부팅 과정에 대해서 알아야 하므로 간략하게 살펴 보도록 하자.

CentOS 의 부팅 절차

사용자가 CentOS 가 설치된 서버의 전원을 올리고 부팅을 하면 다음과 같은 절차를 거쳐서 부팅된다.

부팅 절차

사용자 입장에서 중요한 부분은 /sbin/init 단계부터이다. init 은 부팅시 linux kernel 이 처음 실행하는 프로세스로 이후의 모든 프로세스는 init 이 생성하게 하며 그래서 init 을 모든 프로세스들의 아버지라고도 한다.

init 프로세스가 수행 동작은 크게 BSD 계열과 SysV 계열로 나눠져 있고 이에 따라 동작 방식이 약간 다르다.

CentOS 의 init 은 SysV 계열의 init 이므로 /etc/inittab 파일을 참고하여 부팅시 실행할 run level 을 결정하게 된다. 런 레벨의 종류 및 의미는 다음과 같다.


런 레벨의미
0시스템 중단(Halt)
1텍스트 기반의 단일 사용자 모드(single user mode)
2사용되지 않음(사용자가 지정 가능)
3텍스트 기반의 다중 사용자 모드
4사용되지 않음(사용자가 지정 가능)
5 X 윈도 기반의 다중 사용자 모드(로그인도 X 윈도에서 이뤄짐)
6시스템 리부팅


우리는 X 윈도를 제외하고 설치했으므로 /etc/inittab 파일을 열어보면 다음과 같이 설정되어 있을 것이다.

id:3:initdefault:

위 설정은 init 프로세스 구동시 기본 run level을 3으로 실행하게 된다. run level 에 맞게 실행되는 프로세스의 목록은 /etc/rc.d/rcX.d 에 있으며 X 는 run level 숫자이다. 3 일 경우 /etc/rc.d/rc3.d 아래에 있는 명령어중 S* 로 시작되는 명령어를 순서대로 모두 실행하며 시스템 종료나 재부팅시는 K* 로 시작하는 명령어를 모두 실행하게 된다. 다음은 ls -l /etc/rc.d/rc3.d/S* 명령 실행의 결과이다.

런 레벨 3일때 구동 명령어


웹 서버, DBMS 서버등 어떤 프로그램은 시스템 부팅시 자동으로 같이 구동되어야 할 필요가 있다. 이런 프로그램들은 런레벨 3과 5와 같은 다중 사용자 모드로 부팅할 경우 모두 실행해야 하므로 /etc/rc.d/rc3.d 와  /etc/rc.d/rc5.d 에 모두 등록이 되어 있다. (실제로는 init.d 에 실제 구동 스크립트가 위치하여 rc3.d와 rc5.d 는 init.d 에 대한 심볼릭 링크로 처리되어 있다.)

/etc/inittab 파일을 잘못 편집하면 부팅이 안 되거나 단일 사용자 모드로 부팅될 수 있으므로 주의해야 한다.


chkconfig

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Installation_Guide/s2-boot-init-shutdown-sysv-util.html

run level 에 맞게 자동 실행할 서비스 프로그램을 직접 편집해서 설정하기는 번거롭고 실수할 여지가 많은 일이다.

chkconfig 는 간단한 유틸리티로 특정 run level 에서 실행할 프로그램을 등록/설정/변경할 수 있다. 옵션없이 실행하면 전체 등록된 서비스 프로그램의 목록 및 어떤 run level 에서 실행하는지 여부를 출력해 준다.

--list 옵션 뒤에 서비스명을 입력하면 해당 서비스의 run level 설정을 볼 수 있다.  ssh 같은 경우 중요한 서비스이므로 단일 사용자 모드외에는 모두 실행하도록 등록이 되어 있다.

# chkconfig --list sshd   sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off


chkconfig 는 on과 off 옵션을 제공하는데 해당 서비스 서버를 부팅과 동시에 구동하고 싶으면 on 옵션을, 부팅시 자동 구동되지 않게 하려면 off 옵션으로 설정할 수 있다.

다음 명령어는 netfs 서비스를 자동 시작하지 않는다.

# chkconfig --list


netfs netfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off

# chkconfig netfs off

# chkconfig --list netfs

netfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off


이제 on 옵션을 주고 실행하면 부팅시 자동으로 구동되게 설정이 변경된다.

$ chkconfig netfs on  

$ chkconfig --list netfs

netfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off

apache httpd 나 ftpd 등의 서비스 프로그램 설치시 실수로 chkconfig on 명령을 실행하지 않을 경우 부팅시 서비스가 자동으로 구동 되지 않을수 있으므로 서비스 프로그램을 설치했다면 chkconfig 명령어로 자동 실행되게 설정하자

service

service는 /etc/init.d 에 있는 Sys V init script 를 실행/중지/재실행 하는 유틸리티이다. 부팅시 실행되는 네트워크 설정이나 iptables 방화벽 설정, sshd, httpd 등의 서비스 프로그램등을 재시작 할 수 있다.

사용은 service 서비스명 옵션 형식으로 사용하면 되며 옵션은 다음과 같다.


  • --status-all
    모든 서비스의 상태를 출력한다. 이 옵션은 모든 서비스를 대상으로 하므로 서비스명을 주지 않아도 된다.
  • start 
    service httpd start 처럼 서비스명을 주고 실행해야 하며 지정된 서비스를 시작하는 명령이다. 서비스가 이미 구동되어 있으면 아무 동작도 하지 않는다. 정상 구동되지 않으면 에러 메시지가 표시되므로 로그 파일등을 확인해서 조치해야 한다.
  • stop
    service httpd stop 처럼 서비스명을 주고 실행해야 하며 지정된 서비스를 종료하는 명령이다. 서비스가 구동되지 않았는데 stop 명령을 했거나 또는 정상적으로 종료되지 않았다면 에러 메시지가 출력된다.
  • restart
    service httpd restart 처럼 서비스명을 주고 실행해야 하며 지정된 서비스를 종료후 시작하는 명령이다. stop/start 를 실행한 것과 동일하며 서비스의 설정 파일을 변경해서 반영시킬 경우 편리하게 사용할 수 있다. 


활용

service 와 chkconfig 명령어는 리눅스에서 구동되는 서비스 프로그램을 등록/삭제하고 실행/종료/상태 확인을 위해 꼭 알아야 하는 프로그램이다. 앞으로 설치하게 되는 MySQL DBMS 서버나 postfix 이메일 서버, apache httpd 웹서버등은 모두 service 명령어를 통해  관리하게 되며 서비스마다 동일한 옵션을 제공하므로 사용법을 알면 새로운 서비스가 추가되더라도 동일한 방법으로 관리할 수 있다.