노무현 대통령 배너


2006. 3. 28. 10:13

[본문스크랩] 다시보자 - 리눅스 부팅과정

첫번째 과정
* 컴퓨터를 켠다.
* 컴퓨터의 Rom-Bios가 구동되고 몇가지 기본적인 컴퓨터의 상태를 체크하고 시스템
실행을 위해 하드디스크의 부트 드라이버의 섹터를 읽어서 실행한다.


두번째 과정
* 대부분 부트 가능한 디스크들은 섹터0,실린더 0 영역에 다음 내용 중 한 가지를 담고 있다 => 리눅스가 깔려 있다는 가정하에!
=> 부트로더(LILO,GRUB)코드가 들어 있고 부트로더가 동작하여 원하는 데이터를 로딩(커널로딩).

세번째 과정
* 부트 로더는 커널을 찾아서 메모리에 로드한 후 실행시키는 방식으로 부트를 시작한다.
* 커널은 하드웨어 장치 초기화 , 첫번째 리눅스 프로세스의 실행 환경 구성.
* 기본적인 디바이스들과 그 내부 데이터 구조를 초기화 시킨다.

네번째 과정
* 루트 파일시스템을 ReadOnly로 마운트 한다. => ?
* 루트 파일시스템이란 단순히 "/"에 마운트 되는 파일시스템을 말한다.

커널은 어디에서 루트 파일 시스템을 찾아야 하는지를 알아야만 한다.
=> "/" ? : 리눅스 시스템의 절대 위치(기준점)를 말함...

* 만일 커널이 그 위치에서 로드 가능한 이미지를 찾지 못한다면 시스템은 멈춰버리게 된다.

다섯번째 과정
* 일반적으로 하드디스크(/dev/hda1)를 루트파일 시스템 으로 잡아서 부팅을 한다.
* 임베디드 시스템은 하드디스크가 없으므로 램을 하드 디스크 대용으로 사용하며 '램디스크'라 한다.

여섯번째 과정
* 커널에서 init을 실행하는 과정
* mount_block_root(init/do_mounts.c)
* mount_root() (init/do_mounts.c)
* prepare_namespace() (init/do_mounts.c)
* Init() (init/main.c)
* /sbin/init
=> 여섯번째 과정에서는 커널자신의 환경을 초기화
시킨후 '/sbin/init' 프로그램을 실행시킨다 라고
적어놨는데 정확한 개념은 이해가 안가요 ㅜㅜ.

일곱번째 과정
* 여섯번째 과정의 마직막인 init 프로그램을 실행하는데 init 는 /etc/inittab의 설정된 대로 수행을 한다.

* inittab 파일 내용 (어제 저녁에 깔은 한컴리눅스 3.1 pro의 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
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon
#=================================================================================

* runlevel ?
말 그대로 입니다. 레벨은 총 0 ~ 5까지 인데
runlevel 0 : 시스템을 종료할 때 사용.
runlevel 1 : 싱클 유저 모드에서 사용되는 런레벨
참고) lilo: 프롬프트에서 linux single 이라고 입력하면
런레벨 1로 리눅스가 시작함 이때 디폴트로 root로 로인인
되며, 대다수의 중요한 데몬들은 실행되지 않게 설정된다.
runlevel 2 : NFS를 지원하지 않는 다중 사용자 모드를 정의함.
runlevel 3 : 네트워킹을 지원하는 다중 사용자 모드 (일반적으로
사용되는 런레벨임!
runlevel 4 : 유저가 정의 해서 사용할수 있는 모드로 리눅스 잘아시면
나만의 리눅스를 구축해서 사용해 보셔요.. 전 잘몰라서..
runlevel 5 : X window 환경하에서 동작하도록 구성되어진 runlevel임.
runlevel 6 : 시스템 재 부팅시키도록 정의된 런레벨.

위의 런레벨에 맞추어서 커널의 필요한 프로세스만을 실행시키기위한
일종의 배치 파일임.
가령 runlevel 5을 실행시키면 X window를 실행시키기 위한 프로세스와
GUI 로그인 창.. 등을 쉘스크립트에서 실행시키게 설정 되겠지요.. ^^

* inittab 분석
참고) 기본 inittab format
id:run-levels:action:process
* id : 해당 State를 구분하기 위한 레이블.
* run-levels : 그 줄의 내용을 적용하기 위한 런레벨
만약 공난으로 비어 있으면 무조건 실행 함.
* action : 엔트리에 의해 실행되는 프로세스를 어떻게
할것인가에 대한 명령어.
* process : 프로세스의 실행파일의 경로와 프로세스에 넘겨줄 인수.

1) id:5:initdefault:
렌레벨을 지정 하는 라인으로 1)의 문에서는 런레벨 5로 설정 되어 있음.

2) si::sysinit:/etc/rc.d/rc.sysinit
이 라인에는 sysinit라는 키워드가 action 필드에 지정되어 있다.
프로세스가 시스템 부팅시에 실행되며, 런레벨란이 공난이므로 무조건 실행
되고, 다른 action 필드에 지정된 프로세스들보다 먼저 실행된다.

3) 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
각 런레벨별로 지정된 시작 스크립트들이다. /etc/rc.d/rc '스크립트번호'
에 해당 런레벨을 인수로 넘겨 준다. 각 런레벨 별로 지정된 스크립트는 그
실행이 종료도리 때까지 init프로세스가 진행하지 않고, 기다리라는 의미의
wait 키워드를 action 필드에 지정해 두었다.

4) ca::ctrlaltdel:/sbin/shutdown -t3 -r now
사용자 콘솔에서 CTRL-ALT-DEL 키의 조합을 눌려서 시스템을 셧다운 하려고 할 때
불려지는 프로세스를 정의 한다. /sbin/shutdown -t3 -r now는 3초후에 재부팅
하는 명령어 임.

5) 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-levels에 '2345'정의 되어 있는데 2,3,4,5렌레벨에서 모두 동작하고 콘솔을
열고 , 응답을 기다리는 부분임.(login:)

6) x:5:respawn:/etc/X11/prefdm -nodaemon
렌레벨 5에만 해당되는 로그온 프로세스가 명시! => 그래픽 로인인 창 실행!
혹시 영어 되시면 위의 inittab 원문의 주석만 보셔두 될것 같아요...

출처 )

KELP - Korea Embedded Linux Project

신희철님..