OS/Linux - Ubuntu

[Linux - 리눅스 / Ubuntu - 우분투] init프로세스와 런레벨

주누다 2015. 4. 17. 00:38
반응형

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$
===========================================================================





반응형