1. runlevel

일단 runlevel 이야기부터 하자면, 우분투는 레드햇 계열과 달리 기본 runlevel이 2이며, 각 level의 의미는 아래와 같다. 즉 0, 1, 2, 6만 의미가 있고 3, 4, 5는 2와 같으며 사용하지 않기 때문에 별 의미가 없다.

0 : System halt.
1 : Single-User mode.
2 : Graphical multi-user plus networking (DEFAULT)
3 : Same as "2", but not used.
4 : Same as "2", but not used.
5 : Same as "2", but not used.
6 : System reboot.

2. 서비스 구동/정지

우분투 Upstart 스크립트는 /etc/init 이하에 서비스명.conf 파일로 존재한다. 기본적으로 구동, 정지는 아래와 같이 하면 된다.

[start|stop|restart|reload|status] 서비스명

또는

initctl [start|stop|restart|reload|status] 서비스명

어차피 위 사용법 두가지는 모두 동일한 initctl의 것이다. 왜냐하면... 아래처럼 심볼릭 링크가 걸려 있기 때문이다.

root@ubuntu:~# ls -l /sbin | grep initctl
-rwxr-xr-x 1 root root   155512 Jan 19  2013 initctl
lrwxrwxrwx 1 root root        7 Jan 19  2013 reload -> initctl
lrwxrwxrwx 1 root root        7 Jan 19  2013 restart -> initctl
lrwxrwxrwx 1 root root        7 Jan 19  2013 start -> initctl
lrwxrwxrwx 1 root root        7 Jan 19  2013 status -> initctl
lrwxrwxrwx 1 root root        7 Jan 19  2013 stop -> initctl

따라서 더 간편한 첫번째 사용법에 익숙해 지면 되겠다.

그런데 우분투에 Upstart만 존재하는 것은 아니다. 기존 System V init script도 공존한다. 따라서 그로 인해 혼란스러운 부분이 일부 존재한다. 예를 들어 똑같이 apt-get으로 패키지를 설치하더라도 mysql-server는 Upstart 스크립트가 생성되지만 apache2는 Upstart 스크립트가 생성되지 않고 SysVinit 스크립트가 생성된다.

자세한 이야기는 아래쪽에서 하도록 하고

아무튼 기존 System V init script 방식도 공존하기 때문에 /etc/init.d 아래에 스크립트가 존재하는 경우 아래와 같은 방법으로 사용할 수 있다.

service 서비스명 [start|stop|restart|reload|status]

또는

/etc/init.d/서비스명 [start|stop|restart|reload|status]

그런데 /etc/init 아래 Upstart 스크립트가 존재하는 서비스들은 /etc/init.d 에 가짜 심볼릭 링크가 존재한다. 따라서 이러한 서비스들은 "service 서비스명" 또는 "/etc/init.d/서비스명" 방식으로도 역시 호출할 수 있다. 다만 /lib/init/upstart-job 파일에 대한 심볼릭 링크이기 때문에, 결국에는 Upstart 스크립트가 동작하게 되어 있다.

root@ubuntu:~# ls -l /etc/init.d | grep upstart
lrwxrwxrwx 1 root root   21 Dec  9  2011 acpid -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Jun 28  2013 apport -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Oct 25  2011 atd -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Apr 20  2012 console-setup -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Jun 20  2012 cron -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Jun 13  2013 dbus -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Jun  6  2013 dmesg -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Mar 14  2012 friendly-recovery -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 May 27  2011 hostname -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Mar 30  2012 hwclock -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Mar 30  2012 hwclock-save -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Feb  4  2012 irqbalance -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Nov 21  2011 module-init-tools -> /lib/init/upstart-job
lrwxrwxrwx 1 root root   21 Oct 23 03:25 mysql -> /lib/init/upstart-job

... 이하 생략 ...

/lib/init/upstart-job 파일을 열어보면 결국 "start 서비스명" 방식으로 initctl Upstart 스크립트가 호출됨을 확인할 수 있다.

따라서 이러한 서비스들은 "service 서비스명 start" 방식과 "start 서비스명" 방식을 모두 사용할 수 있다. 하지만 엄밀히 따지자면 "start 서비스명" 방식을 사용하는 것이 옳다고 할 수 있겠다.

아무튼 우분투에는 Upstart와 SysVinit 스크립트가 공존하니 상황에 맞게 잘 사용하도록 하자.

3. 부팅시 자동 Start

Upstart 스크립트 하나를 예제로 열어보자. mysql-server를 설치한 후 /etc/init/mysql.conf 파일을 열어보면

# MySQL Service

description     "MySQL Server"
author          "Mario Limonciello <superm1@ubuntu.com>"

start on runlevel [2345]
stop on starting rc RUNLEVEL=[016]

respawn
respawn limit 2 5

env HOME=/etc/mysql
umask 007

... 이하 생략 ...

start on runlevel [2345]
=> runlevel 2, 3, 4, 5에서 시작하라는 의미이다. 즉 싱글유저 모드를 제외하고는 자동 시작하겠다는 의미이다.

만약 MySQL 서비스가 자동으로 올라오지 않도록 설정하려면 어떻게 해야 할까?

chkconfig mysql off 같은 명령어가 있다면 좋겠지만, 일단은 없다. 물론 설치하면 된다. 관련 패키지가 chkconfig, sysv-rc-conf, rcconf 등으로 몇가지 존재한다. 하지만 Upstart 스크립트를 사용하는 서비스의 경우 chkconfig 계열의 패키지는 아무런 의미가 없다. /etc/init.d 밑에 정상적인 SysVinit 스크립트가 존재하는 경우에만 chkconfig 계열이 의미가 있다. 즉 apache2 같은 패키지에서만 의미가 있다.

Upstart 스크립트를 사용하는 mysql의 경우  아래와 같은 방법으로 부팅시 자동으로 올라오지 않도록 설정할 수 있다.

echo "manual" > /etc/init/mysql.override

위 방법은 서비스명.override 라는 파일을 생성해서 manual 이라는 키워드를 추가하는 것이다. 물론 아래와 같이 기존 conf 파일 끝에 manual을 추가해도 효과는 동일하다.(start on 아래쪽에만 추가하면 된다)

echo "manual" >> /etc/init/mysql.conf

다만 원본 conf 파일을 수정한다는 점에서 좋은 방법이 아니므로 .override 파일 생성 방법을 활용하는 편이 좋겠다. 만약 다시 해당 서비스를 자동으로 올라오게 하고 싶다면 .override 파일만 삭제하면 되니까 말이다.

위 방법은 FM 방법이고, 추천하지 않지만 꼼수 방법으로는 "start on 라인을 주석 처리" 하는 방법도 있겠다.

apache2와 같이 기존 SysVinit 스크립트가 존재하고 Upstart 스크립트는 없는 경우는 어떻게 처리할까? 물론 수동으로 /etc/rc2.d 아래로 가서 S로 시작하는 S91apache2 파일을 K로 변경해도 되겠지만, sysv-rc-conf 패키지를 설치하면 기존 chkconfig처럼 간편히 관리가 가능하다.(사용해보니 chkconfig 보다 sysv-rc-conf 패키지가 더 나은 듯)


아무튼 우분투는 Upstart와 SysVinit이 공존하기 때문에 혼란스런 부분이 일부 있다. /etc/init 아래에 .conf 파일이 존재하는지, /etc/init.d 아래에 존재하는 파일이 /lib/init/upstart-job 파일에 대한 심볼릭 링크는 아닌지, /etc/rc2.d 아래에 심볼릭 링크가 존재하는지 잘 살펴보고 서비스 컨트롤 방법을 적용하도록 하자.