본 내용은 "http://www.ibm.com/developerworks/kr/library/l-lpic1-v3-101-3/index.html" 에서 발췌한 것임을 밝힙니다.
이 기사에서는 Linux 시스템을 종료하거나 다시 부팅하고, 시스템 중단을 사용자에게 경고하고, 단일 사용자 모드 또는 약간 제한적인 실행 레벨로 전환하는 방법을 학습한다. 그 내용은 다음과 같다.
- 기본 실행 레벨 설정
- 실행 레벨 간 변경
- 단일 사용자 모드로 변경
- 명령행에서 시스템 종료 또는 다시 부팅
- 사용자에게 다른 실행 레벨로 전환 등을 포함한 주요 시스템 이벤트에 대한 경보 제공
- 올바르게 프로세스 종료
별도로 언급하지 않는 한 이 기사의 예제에서는 2.6.26 커널의 Fedora 8 시스템을 사용한다. Upstart 예제에서는 2.6.34 커널의 Fedora 13 또는 2.6.35 커널의 Ubuntu 10.10을 사용한다. 다른 시스템에 대한 결과는 다를 수 있다.
이 기사를 통해 Linux Professional Institute's Junior Level Administration(LPIC-1) 시험 기초 과정, Topic 101의 Objective 101.3을 준비할 수 있다. 이 목적의 가중치는 3이다.
이 시리즈 기사를 통해 많은 것을 배우려면 Linux에 대한 기본적인 지식이 있어야 하고 이 기사에 있는 명령을 실습할 수 있는 Linux 시스템을 다루는 데 익숙해야 한다. 때때로 같은 프로그램이라도 버전이 다르면 출력 형식이 다르므로, 실습 결과가 이 기사에서 보여주는 목록 및 그림과 항상 정확히 같지는 않을 수도 있다. 특히, 최신 upstart 시스템에서는 기존 System V init 프로세스의 사용자에게 익숙했던 많은 부분이 변경되고 있다(자세한 정보는 Init과 Upstart 비교 참조). 이 기사에서는 특별히 기존 System V init 프로세스에 중점을 두고서 upstart의 차이점을 간단히 살펴본다.
Ian과 연락하기
Ian은 가장 인기있고 많은 글을 쓰는 저자 중 한 명이다. developerWorks에 실린 Ian의 모든 기사를 살펴보자. My developerWorks에서 Ian의 프로파일을 볼 수 있으며 Ian과 다른 저자 및 그를 좋아하는 여러 독자와 연락할 수 있다.실행 레벨은 Linux 시스템의 현재 상태(또는 실행 레벨)에서 수행할 수 있는 태스크를 정의한다. 모든 Linux 시스템에서는 세 가지 기본 실행 레벨과 함께 정상적인 연산을 위한 하나 이상의 실행 레벨을 지원한다. 기본 실행 레벨은 표 1과 같다.
표 1. Linux 기본 실행 레벨
| 레벨 | 용도 |
|---|---|
| 0 | 시스템 종료(또는 정지) |
| 1 | 단일 사용자 모드, 일반적으로 s 또는 S라는 별명 사용 |
| 6 | 시스템 다시 부팅 |
기본 실행 레벨 이외의 실행 레벨 사용법은 배포판마다 다르다. 일반적인 사용법 세트는 표 2와 같다.
표 2. 기타 일반적인 Linux 실행 레벨
| 레벨 | 용도 |
|---|---|
| 2 | 네트워크 기능을 제외한 다중 사용자 모드 |
| 3 | 네트워크 기능을 포함한 다중 사용자 모드 |
| 5 | 네트워크 기능 및 X Window System을 포함한 다중 사용자 모드 |
Slackware 배포판에서는 실행 레벨 5대신 4를 X Window System을 실행하는 전체 시스템에 사용한다. Debian 계열(예: Ubuntu)에서는 다중 사용자 모드에 단일 실행 레벨을 사용하며, 일반적으로 실행 레벨 2를 사용한다. 사용하는 배포판의 설명서를 참조하기 바란다.
Linux 시스템이 시작될 때 /etc/inittab의 id: 항목에서 기본 실행 레벨이 결정된다. 리스트 1에서는 Fedora 8 또는 openSUSE 11.2와 같은 시스템의 일반적인 항목을 보여 준다. 이 두 시스템에서는 X Window System에 실행 레벨 5를 사용한다.
리스트 1. /etc/inittab의 기본 실행 레벨
[root@pinguino ~]# grep "^id:" /etc/inittab id:5:initdefault: |
시스템을 다른 실행 레벨(예: 실행 레벨 3)에서 시작하려면 이 값을 편집한다.
여러 가지 방법으로 실행 레벨을 변경할 수 있다. 영구적으로 변경하려는 경우 위에서 본 것처럼 /etc/inittab을 편집하여 기본 레벨을 변경할 수 있다.
한 번의 부팅 동안에만 다른 실행 레벨로 시스템을 실행하는 것도 가능하다. 예를 들어, 방금 전 새 커널을 설치했는데 시스템을 새 커널로 부팅한 후 X Window System을 시작하기 전에 일부 커널 모듈을 빌드해야 하는 상황을 가정해 보자. 이 작업을 수행하기 위해 시스템을 실행 레벨 3으로 실행할 수 있다. 부트 시간에 커널 행(GRUB)을 편집하거나 선택한 시스템 이름(LILO) 뒤에 매개변수를 추가하여 이를 수행할 수 있다. 한 자릿수 숫자를 사용하여 원하는 실행 레벨을 지정한다(이 경우에는 3). 여기에서는 GRUB 예제를 사용하여 이 프로세스를 설명한다. /boot/grub/menu.lst 파일에 stanza가 있다고 가정해 보자(리스트 2 참조).
리스트 2. Fedora 8을 부팅하는 일반적인 GRUB stanza
title Fedora (2.6.26.8-57.fc8)
root (hd0,5)
kernel /boot/vmlinuz-2.6.26.8-57.fc8 ro root=LABEL=FEDORA8 rhgb quiet
initrd /boot/initrd-2.6.26.8-57.fc8.img
|
이 시스템을 실행 레벨 3으로 실행하려면 부트 항목이 표시될 때까지 기다린 후 이 항목을 선택하고 'e'를 입력하여 항목을 편집한다. GRUB 옵션에 따라 키를 눌러서 부트 항목을 표시하고 'p'와 비밀번호를 입력하여 편집 잠금을 해제해야 하는 경우도 있다. Fedora 8 시스템의 GRUB 화면은 그림 1과 같다.
그림 1. GRUB에서 부트 항목 선택하기
이 예제의 경우에는 이제 root, kernel 및 initrd 행이 표시되어야 한다. 커서를 "kernel"로 시작하는 행으로 이동하고 'e'를 눌러서 행을 편집한다. 이제 Fedora 8 시스템의 GRUB 화면이 그림 2와 같이 표시된다.
그림 2. 편집할 커널 항목 선택하기
마지막으로 행 끝으로 커서를 이동하고 공백과 '3'을 추가한다. 원하는 경우 'quiet'를 제거할 수 있으며, 필요에 따라 다른 매개변수를 수정할 수도 있다. 이제 Fedora 8 시스템의 GRUB 화면이 그림 2과 같이 표시된다.
그림 3. 시작 실행 레벨을 3으로 설정하기
마지막으로 Enter를 눌러 변경사항을 저장한 다음 'b'를 입력하여 시스템을 부팅한다.
참고: LILO 또는 GRUB2를 사용하여 이 작업을 수행하는 단계는 GRUB을 사용할 때와 다르지만 커널의 시작 방법을 편집한다는 기본 원칙은 같다. 다른 시스템 또는 다른 배포판의 GRUB 화면은 이 기사에서 소개하는 화면과 많이 다를 수 있다. 일반적으로 필요한 정보를 제공하는 프롬프트가 표시된다.
실행 레벨 3에서 설정 작업을 마친 후에는 아마도 실행 레벨 5로 전환하고 싶을 것이다. 다행히도 시스템을 다시 부팅하지 않아도 된다. telinit 명령을 사용하여 다른 실행 레벨로 전환할 수 있다. runlevel 명령을 사용하여 이전 실행 레벨과 현재 실행 레벨을 표시한다. 첫 번째 출력 문자가 'N'이면 시스템이 부팅된 이후 실행 레벨이 변경되지 않았다는 의미이다. 리스트 3에서는 실행 레벨을 확인하고 변경하는 방법을 보여 준다.
리스트 3. 목록 3. 실행 레벨을 확인하고 변경하기
[root@pinguino ~]# runlevel N 3 [root@pinguino ~]# telinit 5 |
telinit 5를 입력하면 여러 메시지가 빠르게 표시된 후 구성된 그래픽 로그인 화면으로 전환된다. 터미널 창을 열고 실행 레벨이 변경되었는지 확인한다(리스트 4 참조).
리스트 4. 새 실행 레벨 확인하기
[root@pinguino ~]# runlevel 3 5 |
ls 명령을 사용하여 telinit 명령의 긴 목록을 표시해 보면 이 명령이 실제로는 init 명령의 기호 링크라는 것을 알 수 있다. 리스트 5에서 이를 보여 준다.
리스트 5. init에 대한 기호 링크인 telinit
[root@pinguino ~]# ls -l $(which telinit) lrwxrwxrwx 1 root root 4 2008-04-01 07:50 /sbin/telinit -> init |
init 실행 파일은 자신이 init으로 호출되었는지 아니면 telinit으로 호출되었는지 여부와 그에 따른 작동을 알고 있다. init은 부트 시간에 PID 1로 실행되기 때문에 나중에 telinit이 아니라 init을 사용하여 호출하는 경우도 충분히 인식할 수 있다. 이 경우 init 실행 파일은 사용자가 telinit을 호출한 것처럼 작동하기를 바란다고 가정한다. 예를 들어, telinit 5 대신 init 5를 사용하여 실행 레벨 5로 전환할 수 있다.
DOS나 Windows 같은 개인용 컴퓨터 운영 체제와는 달리 Linux는 본질적으로 다중 사용자 시스템이다. 하지만 이 특성이 문제가 되는 경우도 있다. 예를 들어, 주 파일 시스템이나 데이터베이스를 복구해야 하거나 새 하드웨어를 설치하고 테스트해야 하는 경우가 있다. 이러한 상황에 효과적으로 대처하는 방법은 실행 레벨 1 또는 단일 사용자 모드이다. 실제 구현은 배포판에 따라 달라지지만 일반적으로 최소 시스템만을 사용하는 쉘에서 시작하게 된다. 대개 네트워크 기능이 포함되지 않으며 실행 중인 디먼도 거의 없거나 아예 없다. 일부 시스템에서는 로그인을 통한 인증이 필요하지만 쉘 프롬프트에서 루트로 바로 실행되는 시스템도 있다. 단일 사용자 모드가 구원자가 될 수도 있지만 시스템을 파괴할 수도 있으므로 루트 권한으로 실행할 때는 언제나 주의를 기울여야 한다. 작업을 완료한 후에는 바로 정상 다중 사용자 모드로 다시 부팅한다.
일반 다중 사용자 실행 레벨로 전환할 때와 마찬가지로 telinit 1을 사용하여 단일 사용자 모드로 전환할 수 있다. 표 1에서 언급한 것처럼 's'와 'S'가 실행 레벨 1에 대한 별명이므로 telinit s를 대신 사용할 수도 있다.
telinit 또는 init을 사용하여 다중 사용자 활동을 중지하고 단일 사용자 모드로 전환할 수 있기는 하지만 이 경우 시스템이 갑자기 전환되기 때문에 사용자의 작업이 손실되고 프로세스가 비정상적으로 종료될 수 있다. 시스템을 종료하거나 다시 부팅할 때는 주로shutdown 명령이 사용된다. 이 명령은 먼저 로그인된 모든 사용자에게 경고 메시지를 보내고 이후 로그인을 차단한다. 그런 다음init에게 실행 레벨을 전환하도록 신호를 보낸다. 그러면 init 프로세스가 실행 중인 모든 프로세스에 SIGTERM 신호를 보내서 데이터를 저장하거나 정상적으로 종료할 수 있는 기회를 제공한다. 5초 또는 다른 지연 시간(지정된 경우)이 경과된 후 init이 SIGKILL 신호를 보내서 남아 있는 각 프로세스를 강제로 종료한다.
기본적으로 shutdown은 실행 레벨 1(단일 사용자 모드)로 전환된다. -h 옵션을 사용하여 시스템을 정지하거나 -r 옵션을 사용하여 다시 부팅할 수 있다. 사용자가 지정한 메시지와 함께 표준 메시지가 발행된다. hh:mm 형식의 절대 시간이나 n 형식의 상대 시간으로 시간을 지정할 수 있으며 여기서, n은 종료될 때까지의 분 수이다. 즉각적인 종료의 경우에는 now를 사용한다. 이는 +0에 해당한다.
지연된 종료를 실행한 후 시간이 아직 만료되지 않은 경우 명령이 포그라운드에서 실행 중이면 에는 Ctrl-c를 눌러서 종료를 취소하거나 shutdown을 -c 옵션과 함께 실행하여 보류 중인 종료를 취소할 수 있다. 리스트 6에서는 shutdown을 사용하고 종료하는 방법을 보여 주는 여러 예제를 보여 준다.
리스트 6. 종료 예제
[root@pinguino ~]# shutdown 5 File system recovery needed Broadcast message from root (pts/1) (Tue Jan 4 08:05:24 2011): File system recovery needed The system is going DOWN to maintenance mode in 5 minutes! ^C Shutdown cancelled. [root@pinguino ~]# shutdown -r 10 Reloading updated kernel& [1] 18784 [root@pinguino ~]# Broadcast message from root (pts/1) (Tue Jan 4 08:05:53 2011): Reloading updated kernel The system is going DOWN for reboot in 10 minutes! [root@pinguino ~]# fg shutdown -r 10 Reloading updated kernel ^C Shutdown cancelled. [root@pinguino ~]# shutdown -h 23:59& [1] 18788 [root@pinguino ~]# shutdown -c Shutdown cancelled. [1]+ Done shutdown -h 23:59 |
마지막 예제의 경우 경고 메시지가 전송되지 않는다. 종료될 때까지의 시간이 15분을 초과하는 경우에는 이벤트 15분 전까지 메시지가 전송되지 않는다(리스트 7 참조). 또한 리스트 7에서는 -t 옵션을 사용하여 SIGTERM 및 SIGKILL 신호 사이의 기본 지연 시간을 5초에서 60초로 늘리는 방법도 보여 준다.
리스트 7. 또 다른 종료 예제
[root@pinguino ~]# date;shutdown -t60 17 Time to do backups& Tue Jan 4 08:12:55 EST 2011 [1] 18825 [root@pinguino ~]# date Tue Jan 4 08:14:13 EST 2011 [root@pinguino ~]# Broadcast message from root (pts/1) (Tue Jan 4 08:14:55 2011): Time to do backups The system is going DOWN to maintenance mode in 15 minutes! |
종료를 취소한 경우에는 wall 명령을 사용하여 모든 사용자에게 시스템이 종료되지 않을 것이라는 사실을 알리는 경고를 전송해야 한다.
앞에서 언급한 것처럼 telinit(또는 init)을 사용하여 시스템을 종료하거나 다시 부팅할 수 있다. telinit을 사용했던 다른 경우와 마찬가지로 이번에도 사용자에게 경고가 전송되지 않는다. 그리고 이 명령은 SIGTERM 및 SIGKILL 신호 사이의 지연 시간이 여전히 남아 있더라도 즉시 적용된다. telinit, init 및 shutdown의 추가 옵션에 대한 정보는 해당 매뉴얼 페이지를 참조한다.
종료 및 다시 부팅과 관련된 몇 가지 명령을 더 알고 있어야 한다.
halt명령은 시스템을 정지시킨다.poweroff명령은halt명령에 대한 기호 링크이며, 시스템을 정지시킨 후 전원을 끄려고 시도한다.reboot명령도halt명령에 대한 기호 링크이며, 시스템을 정지시킨 후 다시 부팅한다.
시스템의 실행 레벨이 0 또는 6이 아닐 때 이러한 명령을 실행할 경우에는 해당 shutdown 명령이 대신 호출된다.
이러한 명령과 함께 사용할 수 있는 추가 옵션과 이러한 옵션의 조작에 대한 자세한 정보는 매뉴얼 페이지를 참조한다.
지금까지 일부 시스템에서 Ctrl-Alt-Delete를 누르면 다시 부팅이 되는 이유나 이 실행 레벨을 구성하는 방법이 궁금했을 것이다. /etc/inittab에 있는 id 필드가 기억나는가? /etc/inittab에는 다른 필드도 여러 개 있으며 rc1.d나 rc5.d와 같은 디렉토리에 init 스크립트 세트도 있다. 여기서, 숫자는 해당 디렉토리의 스크립트가 적용되는 실행 레벨을 식별한다. 리스트 8에서는 Fedora 8 시스템의 전체 inittab을 보여 준다.
리스트 8. Fedora 8의 전체 inittab
# # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon |
대개 # 기호로 시작하는 행은 주석이다. 다른 행에는 다음과 같은 형식의 여러 필드가 있다. id:runlevels:action:process
- id
- 최대 4개의 문자로 구성된 고유 ID이다. 기존 버전에서는 두 개의 문자로 제한되어 있었기 때문에 두 개의 문자만 사용되는 경우를 자주 볼 수 있다.
- runlevels
- 이 ID의 조치를 수행할 실행 레벨을 나열한다. 실행 레벨이 나열되지 않은 경우에는 모든 실행 레벨에서 조치를 수행한다.
- action
- 수행할 여러 가능한 조치를 설명한다.
- process
- 이 행의 조치를 수행할 때 실행해야 하는 프로세스를 지정한다(해당하는 경우).
표 3에서는 /etc/inittab에서 지정할 수 있는 몇 가지 일반적인 조치를 보여 준다. 다른 가능한 조치에 대한 정보는 inittab의 매뉴얼 페이지를 참조한다.
표 3. 몇 가지 일반적인 inittab 조치
| 조치 | 용도 |
|---|---|
| respawn | 프로세스가 종료될 때마다 프로세스를 다시 시작한다. 일반적으로 로그인을 모니터링하는 getty 프로세스에 사용된다. |
| wait | 지정된 실행 레벨이 실행될 때 프로세스를 한 번 시작한 후 프로세스가 종료될 때까지 기다렸다가 init을 진행한다. |
| once | 지정된 실행 레벨이 실행되면 프로세스를 한 번 시작한다. |
| initdefault | 시스템 부팅 후 실행할 실행 레벨을 지정한다. |
| ctrlaltdel | init이 SIGINT 신호를 받을 때 예를 들어, 어떤 사용자가 시스템 콘솔에서 CTRL-ALT-DEL을 눌렀을 때 연관된 프로세스를 실행한다. |
리스트 9에서는 리스트 8의 Ctrl-Alt-Delete에 대한 항목만 보여 준다. 이제 Ctrl-Alt-Delete를 누를 때 시스템이 다시 부팅되는 이유를 알 수 있다.
리스트 9. Ctrl-Alt-Delete 트랩핑
# Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now |
리스트 8을 보면 다음과 같은 행이 여러 개 있다.
l5:5:wait:/etc/rc.d/rc 5 |
이 예제에서는 실행 레벨 5가 시작될 때마다 init이 매개변수 5를 사용하여 /etc/rc.d/rc 스크립트(또는 명령)를 실행한다. init은 이 명령이 완료될 때까지 기다린 후 다른 작업을 수행한다.
시스템을 시작하거나, 실행 레벨을 변경하거나, 종료할 때 init에 사용되는 이러한 스크립트는 일반적으로 /etc/init.d 또는 /etc/rc.d 디렉토리에 저장된다. 각 실행 레벨 n별로 하나의 디렉토리가 있는 rcn.d 디렉토리에는 일련의 기호 링크가 있으며, 이러한 기호 링크는 스크립트가 실행 레벨을 시작할 때 실행되는지 또는 실행 레벨을 종료할 때 중지되는지 여부를 제어한다. 이러한 링크는 K 또는 S로 시작하며, 그 뒤에 두 자리 숫자와 서비스의 이름이 있다(리스트 10 참조).
리스트 10. Init 스크립트
[root@pinguino ~]# find /etc -path "*rc[0-9]*.d/???au*" /etc/rc.d/rc2.d/S27auditd /etc/rc.d/rc2.d/K72autofs /etc/rc.d/rc4.d/S27auditd /etc/rc.d/rc4.d/S28autofs /etc/rc.d/rc5.d/S27auditd /etc/rc.d/rc5.d/S28autofs /etc/rc.d/rc0.d/K72autofs /etc/rc.d/rc0.d/K73auditd /etc/rc.d/rc6.d/K72autofs /etc/rc.d/rc6.d/K73auditd /etc/rc.d/rc1.d/K72autofs /etc/rc.d/rc1.d/K73auditd /etc/rc.d/rc3.d/S27auditd /etc/rc.d/rc3.d/S28autofs [root@pinguino ~]# cd /etc/rc.d/rc5.d [root@pinguino rc5.d]# ls -l ???a* lrwxrwxrwx 1 root root 16 2008-04-07 11:29 S27auditd -> ../init.d/auditd lrwxrwxrwx 1 root root 16 2008-04-01 07:51 S28autofs -> ../init.d/autofs lrwxrwxrwx 1 root root 15 2008-04-01 14:03 S44acpid -> ../init.d/acpid lrwxrwxrwx 1 root root 13 2008-04-01 07:50 S95atd -> ../init.d/atd lrwxrwxrwx 1 root root 22 2008-04-01 07:54 S96avahi-daemon -> ../init.d/avahi-daemon lrwxrwxrwx 1 root root 17 2008-11-17 13:40 S99anacron -> ../init.d/anacron |
이 목록을 보면 audit 및 autofs 서비스의 모든 실행 레벨에 Knn 항목이 있고, 실행 레벨 3 및 5에 Snn 항목이 있다. S는 해당 실행 레벨이 실행될 때 서비스가 시작된다는 것을 나타내는 반면 K 항목은 중지되어야 한다는 것을 나타낸다. 링크 이름의 nn 부분은 서비스를 시작 또는 중지할 때 적용되는 우선순위를 나타낸다. 이 예제에서 audit은 autofs보다 먼저 시작되고 나중에 중지된다.
자세한 정보는 init 및 inittab의 매뉴얼 페이지를 참조한다.
이 기사에서 살펴본 것처럼 Linux 시스템의 기존 부팅 방법은 UNIX System V init 프로세스를 기반으로 하고 있다. 먼저 초기 RAM 디스크(initrd)를 로드한 다음 init이라는 프로그램에 제어를 전달하며, 이 프로그램은 일반적으로 sysvinit 패키지의 일부로 설치된다. 그런 다음 init 프로그램이 일련의 스크립트를 미리 정의된 순서에 따라 실행하여 시스템을 시작한다. 예상했던 자원을 사용할 수 없는 경우 일반적으로 init 프로세스는 해당 자원을 사용할 수 있을 때까지 기다린다. 시스템이 시작할 때 모든 자원이 인식 및 연결되는 시스템의 경우에는 이 작업이 정상적으로 작동하지만 시작 시에 사용 가능하지 않을 수도 있는 핫플러그 디바이스, 네트워크 파일 시스템 및 네트워크 인터페이스를 지원하는 최신 시스템의 경우에는 새로운 도전 과제가 발생한다. 장시간 혹은 비교적 긴 시간 동안이라도 사용 가능하지 않을 수도 있는 하드웨어를 기다린다는 것은 분명 원하는 바가 아니다.
이에 대한 대안으로 upstart라는 초기화 프로세스가 2006년에 Ubuntu 6.10("Edgy Eft")에서 처음 소개되었다. 이제는 이 프로세스가 Ubuntu 및 Fedora의 init을 대체했으며 무엇보다도 init의 잔재가 남아 있기는 하지만 한동안은 upstart의 진가가 충분히 실현되지 않을 것이다.
이전 시스템에 사용되는 정적인 init 스크립트 세트와는 대조적으로 upstart 시스템은 이벤트에 의해 구동된다. 이벤트는 하드웨어 변경, 태스크 시작 또는 중지, 시스템의 기타 프로세스에 의해 트리거될 수 있다. 이벤트는 통틀어서 작업이라고 불리는 태스크 또는 서비스를 트리거하는 데 사용된다. 예를 들어, USB 드라이브를 연결하면 udev 서비스에 의해 block-device-added 이벤트가 발생하면서 정의된 태스크가 실행되어 /etc/fstab을 검사하고 드라이브를 마운트한다(해당하는 경우). 또 다른 예로, Apache 웹 서버는 네트워크 및 필수 파일 시스템 자원을 모두 사용할 수 있는 경우에만 시작될 수 있다.
Upstart 초기화 프로그램은 /sbin/init을 대체한다. Upstart 작업은 /etc/init 디렉토리 및 서브디렉토리에 정의되어 있다. Upstart 시스템은 현재 /etc/inittab 및 System V init 스크립트를 처리한다. 최신 Fedora 릴리스와 같은 시스템의 경우에는 /etc/inittab에 initdefault의 ID 항목만 들어 있다. 최신 Ubuntu 시스템에는 기본적으로 /etc/inittab이 없지만 기본 실행 레벨을 지정하려는 경우 사용자가 /etc/inittab을 작성할 수 있다.
또한 upstart에는 upstart init 디먼과의 상호 작용을 지원하는 initctl 명령이 있다. 이 명령을 사용하면 작업을 시작, 중지 또는 나열하고, 작업 상태를 확인하고, 이벤트를 발생시키고, init 프로세스를 다시 시작하는 등의 작업을 수행할 수 있다. 리스트 11에서는 initctl을 사용하여 Fedora 13 시스템의 upstart 작업 목록을 가져오는 방법을 보여 준다.
리스트 11. initctl을 사용하여 upstart init 디먼과 상호 작용하기
[ian@echidna ~]$ initctl list rc stop/waiting tty (/dev/tty3) start/running, process 1486 tty (/dev/tty2) start/running, process 1484 tty (/dev/tty6) start/running, process 1492 tty (/dev/tty5) start/running, process 1490 tty (/dev/tty4) start/running, process 1488 plymouth-shutdown stop/waiting control-alt-delete stop/waiting system-setup-keyboard start/running, process 1000 readahead-collector stop/waiting vpnc-cleanup stop/waiting quit-plymouth stop/waiting rcS stop/waiting prefdm start/running, process 1479 init-system-dbus stop/waiting ck-log-system-restart stop/waiting readahead stop/waiting ck-log-system-start stop/waiting start-ttys stop/waiting readahead-disable-services stop/waiting ck-log-system-stop stop/waiting rcS-sulogin stop/waiting serial stop/waiting |
Upstart에 대한 자세한 정보는 참고자료를 참조한다.
이제 Linux 실행 레벨, 종료 및 다시 부팅에 대한 소개를 마친다.
교육
- developerWorks의 LPIC-1 로드맵을 사용하여 2009년 4월 목표를 기반으로 하는 LPIC-1 인증을 준비하는 데 도움을 줄 수 있는 developerWorks 기사를 찾을 수 있다.
- LPIC Program 사이트에서 Linux Professional Institute의 Linux 시스템 관리 인증의 세 가지 레벨에 대한 자세한 목표, 작업 목록 및 샘플 질문을 찾을 수 있다. 특히, LPI exam 101과 LPI exam 102의 2009년 4월 목표를 확인하자. 항상 LPIC Program 사이트를 참조하여 최신 목표를 확인한다.
- Linux 기초를 학습하고 2009년 4월 이전의 LPI 시험 목표를 바탕으로 한 시스템 관리자 인증 시험을 준비하려면 developerWorks에서 전체 LPI exam prep series를 검토한다.
- Linux BootPrompt-HowTo는 부트 매개변수를 이해하는 데 도움이 된다.
- Upstart overview에서 upstart에 대한 자세한 정보를 볼 수 있다.
- Linux에서는 수백 개의 기술자료 목록과 함께, Linux 개발자와 관리자를 위한 다양한 다운로드, 토론 포럼 및 다른 참고자료를 찾을 수 있다.
- developerWorks 기술 행사 및 웹 캐스트를 통해 다양한 IBM 제품 및 IT 산업 주제에 대한 최신 정보를 얻을 수 있다.
- 무료 developerWorks Live! briefing을 통해 최신 IBM 제품 및 도구에 대한 정보뿐만 아니라 IT 업계의 최신 경향까지도 빠르게 확인할 수 있다.
- developerWorks on-demand demos에서는 입문자를 위한 제품 설치 및 설정부터 숙련된 개발자를 위한 고급 기능까지 망라된 다양한 데모를 제공한다.
- Twitter의 developerWorks를 팔로우(follow)하거나 developerWorks에 대한 Linux 트윗(tweet)의 피드를 구독하자.
제품 및 기술 얻기
- 자신에게 가장한 적합한 방법으로 IBM 제품을 평가해 보자. 시험판 제품을 다운로드하거나, 온라인으로 제품을 사용해 보거나, 클라우드 환경에서 제품을 사용하거나, SOA Sandbox에서 SOA(Service Oriented Architecture)를 효과적으로 구현하는 방법을 배울 수 있다.
토론
- 포럼에 참여하기.
- developerWorks community에 참여한다. 개발자가 운영하고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.



글