[시스템] 리눅스의 부팅에서 종료(shutdown)까지

멀티부팅으로 구성되어 있는 컴퓨터 ( 일반적으로 윈도우와 리눅스 )가 전

원을 ON 시킴부터 리눅스의 login 메세지가 나올 때 까지 많은 일들이 컴

퓨터에서 일어난다. 윈도우의 경우에는 그 과정을 사용자가 알아 낼 방법

이 없지만 리눅스의 경우는 오픈소스라는 강점으로 사용자가 그 전과정을

모두 인지하여( 물론 몇몇 과정을 이해하기 위해서는 어느정도의 고급 지

식을 요구하긴 하지만 ) 시스템을 운영하는데 많은 도움을 받을 수 있다.

부팅과정의 이해는 리눅스 시스템을 이해하는데 기초적이고도 광범위한 지

식을 제공한다. 좀 늦은 감이 있지만 부팅과정에 대해 지금까지 공부해온

것을 여기 정리하였다. 몇몇 부분은 아직 이해의 수준을 넘어서는 부분이

있어서 자세한 설명을 못 하였다.

PC 전원 ON

PC의 전원이 들어오면 우선 ROM (Read Only Memory)에 들어가 있는 BIOS

(Basic Input Output System)가 작동하여 그래픽카드, 메모리, CPU, 하드

디스크 드라이브, 플로피 디스크 드라이브 등을 테스트 한다. 예전의 경우

에 보면 이 과정에서 화면상에 이유없이 컴퓨터가 다운되거나 하는 경우

가 있는데 많은 경우에 플로피 디스크 드라이브나 하드 디스크 드라이브와

의 통신과정에서 각 장치의 에러로 다운되는 경우가 많다.

어쨌거나 모든 설정을 다 테스트 한 후에 BIOS는 부팅디스크 (혹은 하드디

스크)의 선두 (실린더 0, 섹타1)부터 MBR(Master Boor Record)를 읽는다.

∴참고로 MBR 에 대한 reset 은 윈도우 상에서는 fdisk/mbr 명령을 사용하

여 실시할 수 없다. 윈도우와 리눅스를 멀티부팅으로 설치한 후 혹시라도

차후에 리눅스를 제거 하였는데 계속 lilo 메세지가 뜰 경우 이 명령으로

완전히 제거할 수 있다.

lilo 를 읽음

통상 리눅스의 lilo(Linux Loader)는 MBR에 설치되어 제일 처음 실행된

다.

lilo 의 설정은 : /etc/lilo.conf

boot=/dev/hda

map=/boot/map

install=/boot/boot.b

prompt

timeout=50

default=linux

image=/boot/vmlinuz-2.2.12-20kr

label=linux

initrd=/boot/initrd-2.2.12-20kr.img

read-only

root=/dev/hda1

위의 내용은 리눅스만 설치되어 있는 system의 lilo.conf 의 내용이다. 멀

티부팅의 경우는 윈도우의 부팅부분이 추가가 된다.

통상 lilo는 운영체제의 선택과 모드이 선택, ethernet의 설정등을 같이

행할 수 있으나 일반적으로는 두 개 이상의 OS로 멀티부팅을 설정할 경우

선택적으로 부팅가능하고 linux system 복구나 root 파티션의 파일시스템

을 체크할 경우 linux s, linux 1, linux single 등의 옵션을 사용하여

single user mode 로 부팅할 수도 있다.

Kernel의 실행

lilo에서 linux를 선택하여 부팅을 하면 압축된 커널 이미지 (위의 lilo

의 image 부분, /boot/vmlinuz-2.2.12-20kr)가 메모리로 로드되어 자기전

개 된다.

1에서 3까지의 과정을 도식화 하면

BIOS가 MBR을 읽음

MBR가 부트파티션의 부트블록을 읽어낸다.

부트록을 읽는다.

커널 이미지를 읽어낸다.

시스템파라미터를 취득하여, 커널을 초기화한다.

압축 이미지를 전개한다.

커널의 main.c 함수를 실행하기 전에 커널은 프로텍트 모드로의 전이, CPU

의 레지스터의 설정등 c 프로그램을 실행할 수 있는 환경을 정비한다.

main.c 의 실행

operating system의 가장 기본적인 초기화의 실시과정이다. 메모리의 초기

화 (메모리 상한선의 취득), 페이지테이블의 초기화, 하드웨어 인터럽트

체크 ( 이더넷조사, 키보드, 마우스연결 체크등)후 프로그램 모듈을 로드

한다. main.c의 내용은 /usr/src/linux-2.2.12/init/main.c 에서 살펴볼

수 있다.

main.c 로 제어가 옮겨진 후의 실행 메시지를 보려면

#dmesg > boot.message 등의 명령으로 부트메시지를 화일로 보내어 편집기

등으로 열어서 보면 된다.

main.c 의 제어는 dmesg에서 보면 리눅스 기동시 최초의 프로세서인 init

의 실행전까지 이다.

init process의 기동

init process는 리눅스 기동시 실행되는 최초의 프로세스이다. 프로그램

의 위치는 디스트리뷰션에 따라 다를수 있으나 알짜 리눅스의 경우 /sbin

디렉토리에 위치한다. 또한 init는 /etc/initab 의 설정사항에 따라 리눅

스체제를 구축한다.

∴참고 : 리눅스의 모든 프로세스는 최초의 프로세스인 init 의 자기복제

의 과정을 통해 생성된다. 즉 init 프로세스로 부터 fork(복제)와 exec(실

행) 의 2개의 system call을 사용하여 새로운 프로세스를 창조한다. 이러

한 내용은 pstree 명령으로 확인할 수 있다.

/etc/inittab 의 내용 #

# inittab This file describes how the INIT process should set up

# the system in a certain run-level.

#

# Author: Miquel van Smoorenburg, <miquels at

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:3: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

# Things to run in every runlevel.

ud::once:/sbin/update

# 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”

#if UPS batteries are getting low, do an immediate shutdown.

pn::powerfailnow:/sbin/halt -p

# 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

# xdm is now a separate service

x:5:respawn:/etc/X11/prefdm -nodaemon

sysinit 의 기동

init 가 기동되면 우선 최초로 싱글유저 모드에서 sysinit 액션의 프로세

스가 실행된다.(/etc/rc.d/rc.sysinit)

위 inittab 의 # System initialization.부분.

si::sysinit:/etc/rc.d/rc.sysinit

편집기로 /etc/rc.d/rc.sysinit 를 살펴보면 bash 로 작성된 셀 스크립트

이다. sysinit 는 fsck에 의해 디스크정합성 check가 이루어지고 필요한

커널모듈이 로드된다. 또한 swap을 개시하고 fstab 에 의해 디스크등의 외

부 장치가 mount 된다.

∴참고 : root 파티션에 대한 fsck의 실행은 싱글유저 모드에서 실행되어

야 한다. 이러한 이유로 인해서 리눅스 모드가 3인 멀티유저 모드로 선택

되어 있어도 우선 싱글유저 모드에서 root 파티션에 대한 정합성 check

를 하게 된다.

/etc/fstab 의 내용 /dev/hda1 / ext2 defaults 1 1

/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0

/dev/cdrom1 /mnt/cdrom1 iso9660 noauto,owner,ro 0 0

/dev/hda5 swap swap defaults 0 0

/dev/fd0 /mnt/floppy ext2 noauto,owner 0 0

none /proc proc defaults 0 0

none /dev/pts devpts gid=5,mode=620 0 0

rc 파일의 실행

디폴트 런레벨 (/etc/inittab 의 initdefault 부분) 에 따라서 각 rc의 실

행이 이루어 진다. 예를 들어 멀티유저 모드를 디폴트로 구성했다

면 /etc/rc.d/rc 3 가 기동된다. 이 디렉토리 안에는 각종 deamon 이나 멀

티유저 모드에서 필요한 스크립트 들어있다.

getty의 기동

모뎀이 접속된 회선이나 콘솔을 감시해서 액세스 해온 디바이스에 로그인

prompt를 보내고, 보내온 유저 이름을 로그인 prompt를 기동해서 getty 프

로그램으로 보낸다. login 프로그램은 password prompt 를 표시하여, 패스

워드가 건네지면 /etc/passwd 파일의 내용과 대조하여 잘못이 있으면 다

시 login prompt 를 표시하고 인정되면 그 유저의 로그인 쉘을 실행한다.

각 계정의 실행은 계정이 생성될때 동시에 생성되는 숨겨진 파일

인 .bashrc, bash_profile 등의 스크립트를 참조하여 login 된다.

∴참고 : 리눅스 파일 시스템에서 파일의 이름앞에 .이 붙은면 숨김 속성

을 갖는다. 이런 모든 파일을 보기위해서는 ls -a 옵션을 사용해야 한다.

또한 파일의 속성을 알아보려면 file [파일이름] 을 사용하면 알 수 있

다.

getty는 system에 따라 mgetty, agetty, mingetty 로 나타나는데, agetty

나 mgetty는 serial 회선을 감시하고 mingetty는 가상 콘솔로서의 구성을

감시한다. 위의 /etc/inittab 의 run getty 부분을 보면 여섯개의

mingetty가 실행됨으로써 리눅스에서 여섯개의 가상콘솔을 운영할 수 있

게 된다.

이상에서 리눅스의 부팅과정을 간단히 살펴보았는데 실제로 많은 부분이

생략되어 있다. 리눅스에서는 모든 소스코드가 첨부되어 있기 때문에

init 등의 프로그램 소스를 찾아보면 보통 c언어로 작성되어 있음을 알

수 있다. 가능하면 소스코드까지 분석을 해보고 싶지만 아직은 C언어에 대

한 지식이 부족하여서 보기가 어려웠고 차후에 기회가 닿는다면 리눅스커

널 분석에 도전하고 싶은 생각이 있다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.