init 프로세스와 런레벨
- 기존의 init 프로세스는 런레벨(Run Level) 이라는 개념을 사용
- init 은 시스템의 단계를 일곱 개로 구분하여 정의하고 각 단계에 따라 쉘 스크립트를 실행하는데,
이 단계를을 런레벨이라고 함
유닉스의 런레벨
|
런레벨 |
의미
|
관련 스크립트의 위치
|
0
|
시스템 종료
|
/etc/rc0.d
|
1, S, s
|
단일 사용자 모드
|
/etc/rc1.d
|
2
|
다중 사용자 모드(NFS를 실행하지 않음)
|
/etc/rc2.d
|
3
|
다중 사용자 모드(NFS 포함)
|
/etc/rc3.d
|
4
|
사용하지 않음(예비 번호)
|
/etc/rc4.d
|
5
|
시스템 종료(페도라는 GUI 모드로 부팅)
|
/etc/rc5.d
|
6
|
시스템 재시작
|
/etc/rc6.d
|
- 페도라와 달리 우분투에서는 이중 0, 1, 2, 6번만 사용
- 나머지(3, 4, 5)는 기본 런레벨이 2이므로 주의
우분투의 런레벨
|
런레벨 |
의미
|
관련 스크립트의 위치
|
0
|
시스템 종료
|
/etc/rc0.d
|
1, S, s
|
단일 사용자 모드
|
/etc/rc1.d
|
2
|
그래피컬 다중 사용자 모드 + 네트워킹(기본 값)
|
/etc/rc2.d
|
3
|
런레벨 2와 동일
|
/etc/rc3.d
|
4
|
/etc/rc4.d |
5
|
/etc/rc5.d
|
6
|
시스템 재시작
|
/etc/rc6.d
|
- 런레벨 3, 4, 5번이 2번과 같다는 것을 통해 'rc2.d' 디렉터리와 'rc3.d', 'rc4.d', 'rc5.d' 디렉터리의 내용이 모두 같음을 확인 =========================================================================== sjw-lenovo@sjwlenovo-Lenovo-U310:/etc$ ls rc*.d rc0.d: K10unattended-upgrades K20rsync S20sendsigs S40umountfs K20kerneloops K20speech-dispatcher S30urandom S60umountroot K20postfix README S31umountnfs.sh S90halt
rc1.d: K20kerneloops K20rsync K20speech-dispatcher S30killprocs S70pppd-dns K20postfix K20saned README S70dns-clean S90single
rc2.d: README S20rsync S70dns-clean S99ondemand S20kerneloops S20speech-dispatcher S70pppd-dns S99rc.local S20postfix S50saned S99grub-common
rc3.d: README S20rsync S70dns-clean S99ondemand S20kerneloops S20speech-dispatcher S70pppd-dns S99rc.local S20postfix S50saned S99grub-common
rc4.d: README S20rsync S70dns-clean S99ondemand S20kerneloops S20speech-dispatcher S70pppd-dns S99rc.local S20postfix S50saned S99grub-common
rc5.d: README S20rsync S70dns-clean S99ondemand S20kerneloops S20speech-dispatcher S70pppd-dns S99rc.local S20postfix S50saned S99grub-common
rc6.d: K10unattended-upgrades K20rsync S20sendsigs S40umountfs K20kerneloops K20speech-dispatcher S30urandom S60umountroot K20postfix README S31umountnfs.sh S90reboot
rcS.d: README S25brltty S37apparmor S55urandom S70x11-common sjw-lenovo@sjwlenovo-Lenovo-U310:/etc$ ===========================================================================
- 런레벨별로 실행하는 스크립트 파일은 '/etc/init.d' 디렉터리에 있는 파일에 대한 심벌릭 링크임. =========================================================================== sjw-lenovo@sjwlenovo-Lenovo-U310:/etc$ ls -l /etc/rc2.d 합계 4 -rw-r--r-- 1 root root 677 3월 14 04:49 README lrwxrwxrwx 1 root root 20 3월 25 23:58 S20kerneloops -> ../init.d/kerneloops lrwxrwxrwx 1 root root 17 3월 28 02:10 S20postfix -> ../init.d/postfix lrwxrwxrwx 1 root root 15 3월 25 23:58 S20rsync -> ../init.d/rsync lrwxrwxrwx 1 root root 27 3월 25 23:58 S20speech-dispatcher -> ../init.d/speech-dispatcher lrwxrwxrwx 1 root root 15 3월 25 23:58 S50saned -> ../init.d/saned lrwxrwxrwx 1 root root 19 3월 25 23:58 S70dns-clean -> ../init.d/dns-clean lrwxrwxrwx 1 root root 18 3월 25 23:58 S70pppd-dns -> ../init.d/pppd-dns lrwxrwxrwx 1 root root 21 3월 25 23:58 S99grub-common -> ../init.d/grub-common lrwxrwxrwx 1 root root 18 3월 25 23:58 S99ondemand -> ../init.d/ondemand lrwxrwxrwx 1 root root 18 3월 25 23:58 S99rc.local -> ../init.d/rc.local sjw-lenovo@sjwlenovo-Lenovo-U310:/etc$ ===========================================================================
|
런레벨 변경하기
|
- init은 1번 프로세스의 이름이기도 하지만,
init 프로세스의 런레벨을 바꾸는 명령으로 사용되기도 함 - init을 명령으로 실행하면 실제로는 '/sbin/telinit' 가 실행됨 - init으로 런레벨을 변경하기 위해서는 바꾸려는 럽레벨을 숫자로 지정하면 됨
user@ubuntu:~$ sudo init 1
- 단일 사용자 모드인 러벨을 1로 바꿈 - 그래픽 환경이었던 콘솔 화면이 터미널 환경으로 바뀌면서 프롬프트가 출력되는데,
현재 우분투는 init1을 실행하면 버그가 발생 - 원래 시스템에 문제가 있을 경우 시스템을 런레벨 1(런레벨 S)로 변경하여 점검해야함. - Windows 의 안전모드 같은 것으로, 다중 사용자 모드에서
시스템 관리자만 사용할 수 있는 단일 사용자 모드로 번환하는 것
|
기본 런레벨 지정하기 |
- 우분투에서 부팅할 대 동작할 기본 런레벨은 '/etc/init/rc-sysinit.conf' 파일의 DEFAULT_RUNLEVEL 변수에 지정되어 있음. =========================================================================== sjw-lenovo@sjwlenovo-Lenovo-U310:/etc$ cat /etc/init/rc-sysinit.conf # rc-sysinit - System V initialisation compatibility # # This task runs the old System V-style system initialisation scripts, # and enters the default runlevel when finished.
description "System V initialisation compatibility" author "Scott James Remnant <scott@netsplit.com>"
start on (filesystem and static-network-up) or failsafe-boot stop on runlevel
# Default runlevel, this may be overriden on the kernel command-line # or by faking an old /etc/inittab entry env DEFAULT_RUNLEVEL=2
emits runlevel
# There can be no previous runlevel here, but there might be old # information in /var/run/utmp that we pick up, and we don't want # that. # # These override that env RUNLEVEL= env PREVLEVEL=
console output env INIT_VERBOSE
task
script # Check for default runlevel in /etc/inittab if [ -r /etc/inittab ] then eval "$(sed -nre 's/^[^#][^:]*:([0-6sS]):initdefault:.*/DEFAULT_RUNLEVEL="\1";/p' /etc/inittab || true)" fi
# Check kernel command-line for typical arguments for ARG in $(cat /proc/cmdline) do case "${ARG}" in -b|emergency) # Emergency shell [ -n "${FROM_SINGLE_USER_MODE}" ] || sulogin ;; [0123456sS]) # Override runlevel DEFAULT_RUNLEVEL="${ARG}" ;; -s|single) # Single user mode [ -n "${FROM_SINGLE_USER_MODE}" ] || DEFAULT_RUNLEVEL=S ;; esac done
# Run the system initialisation scripts [ -n "${FROM_SINGLE_USER_MODE}" ] || /etc/init.d/rcS
# Switch into the default runlevel telinit "${DEFAULT_RUNLEVEL}" end script sjw-lenovo@sjwlenovo-Lenovo-U310:/etc$ ===========================================================================
- 당연하지만 기본 런레벨 0이나 런레벨을 6으로 기본 런레벨로 지정하면 안됨...
|
현재 런레벨 확인하기
|
- 현재 런레벨을 확인하려면 'runlevel' 명령을 사용 - runlevel 명령 사용시 'N 2' 라고 출력되는 것은 부팅할 때 런레벨2로 부팅했음을 뜻함. =========================================================================== sjw-lenovo@sjwlenovo-Lenovo-U310:/etc$ runlevel N 2 sjw-lenovo@sjwlenovo-Lenovo-U310:/etc$ ===========================================================================
|