25
Ubuntu Booting Sequence 박진호 2012. 7. 28

박진호 - 우분투 부팅 과정에 대한 이야기 (2012Y07M28D)

Embed Size (px)

Citation preview

Ubuntu Booting Sequence

박진호2012. 7. 28

Booting의 어원

● 영어의 장화(Boot)에서 어원을 찾을 수 있다.

● 밖으로 나가려면 먼저 장화를 신어야 한다는 뜻

● 컴퓨터를 처음 동작 시킬 때 수행되는 일련의 과정을 일컬음

전원 인가● 컴퓨터의 전원스위치 ON 으로 올립니다.- 시스템에 전원 공급

- 메인보드의 ROM-BIOS에 있는 BIOS프로그램 실행.

● BIOS프로그램은 전원공급과 함께 메모리의 특정번지에 자동 로딩

● CPU는 전원공급과 함께 특정번지의 BIOS 프로그램을 실행

BIOS 실행● 컴퓨터자체 진단

- CPU, MEMORY, 그래픽 카드, USB 등 각종 장치들의 이상 유무 검사

– 각종 장치들의 초기화 수행

● 부팅 매체 검색과 부트로더 실행

- 진단과정 완료후, 부팅매체 ( 하드디스크, CD-ROM, USB, 이더넷)에서 부트로더 ( GRUB, LILO)를 로딩

MBR( Master Boot Record)

● 부팅 매체의 0번 섹터를 지칭● 리눅스 설치시 Grub 설정에서 MBR에 자신을 위한 로더를 기록 하여 부트로더가 실행 되게 함

메모리에 부트로더 로딩● MBR( Master Boot Record)에서 부트로더를 읽어 메모리로 적재

● 부트로더로 제어권을 넘김● 부트로더 ( GRUB ) 실행

– /etc/grub.d

부트로더 ( GRUB ) 실행● GRUB 실행 시

/boot/grub/grub.conf 설정 파일을 읽고, 어떤 부팅메뉴(커널)로 부팅을 할 것인가를 결정

● GRUB은 커널(kernel)이미지를 로딩

● 시스템 제어권을 커널에 넘김

Kernel의 로딩 과정

● 압축 된 커널의 압축을 해제

● 해제된 커널로 점프

● 기본 하드웨어 설정 및 환경 설정

● 인터럽트 및 메모리 스케줄러 등등 실행

● 파일 시스템 마운트

● 최초의 사용자 공간 프로그램 시작(init)

● 만약 init을 찾지 못하면 부팅 시 패닉 발생

Kernel 에서 init 호출 과정● init/main.c 파일

– asmlinkage void __init start_kernel(void)

– static noinline void __init_refok rest_init(void)

– static int __init kernel_init(void * unused)

– static noinline int init_post(void)

{

...(중간생략)...

run_init_process("/sbin/init");

run_init_process("/etc/init");

run_init_process("/bin/init");

run_init_process("/bin/sh");

panic("No init found. Try passing init= option to kernel. "

"See Linux Documentation/init.txt for guidance.");

}

System-V init ( old )

● 이후의 과정들은 모두 init프로세스의 실행내용들임.

● /etc/inittab파일의 실행내용

– 로그인 프롬프트가 나오기 까지의 실행 내용

System-V init ( old )● /etc/inittab파일의 내용 ( Debian )

id:2:initdefault:si::sysinit:/etc/init.d/rcSl0:0:wait:/etc/init.d/rc 0l1:1:wait:/etc/init.d/rc 1l2:2:wait:/etc/init.d/rc 2l3:3:wait:/etc/init.d/rc 3l4:4:wait:/etc/init.d/rc 4l5:5:wait:/etc/init.d/rc 5l6:6:wait:/etc/init.d/rc 6ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r nowpf::powerfail:/etc/init.d/powerfail startpn::powerfailnow:/etc/init.d/powerfail now pr:12345:powerokwait:/etc/init.d/powerfail stop1:2345:respawn:/sbin/getty 38400tty12:23:respawn:/sbin/getty 38400 tty23:23:respawn:/sbin/getty 38400 tty34:23:respawn:/sbin/getty 38400 tty45:23:respawn:/sbin/getty 38400 tty56:23:respawn:/sbin/getty 38400 tty6

System-V init ( old )

● inittab 파일은 시스템이 가동될 때 일반적인 운영 방법의 처리에 대한 것을 설명하고 있는 파일

● init 프로세스는 runlevel을 구별하여 사용

– runlevel은 시스템의 부팅과 종료에 사용

– runlevel 값은 0에서 6 까지

● inittab 파일안의 내용 형식

– id:runlevels:action:process

● ‘#’로 시작하는 문장은 주석 처리

System V ( Old )● id : 2 : initdefault

– 디폴트 runlevel 2로 설정

● si : : sysinit : /etc/init.d/rcS

– 시스템을 부팅시 init에게 /etc/init.d/rcS을 실행

– /etc/init.d/rcS 파일은 시스템 초기화 처리 스크립트

System V ( Old )

● 10 : 0 : wait : /etc/init.d/rc 0

● 11 : 1 : wait : /etc/init.d/rc 1

● 12 : 2 : wait : /etc/init.d/rc 2

● 13 : 3 : wait : /etc/init.d/rc 3

● 14 : 4 : wait : /etc/init.d/rc 4

● 15 : 5 : wait : /etc/init.d/rc 5

● 16 : 6 : wait : /etc/init.d/rc 6

System V ( Old )● rc 는 다목적 시동 스크립트

– 각 실행 레벨에 알맞은 스크립트를 실행

– action 필드는 wait● command를 실행하고, 종료할 때까지 기다림.

● 각 실행 레벨의 스크립트는 /etc/rcN.d에 위치

– 여기서 N은 시작할 실행 레벨 번호임● 실행 레벨 2라면 /etc/rc2.d의 스크립트를 사용

– 디렉토리들안의 파일은 K로 시작하는 서비스를 죽이는 스크립트이며, S로 시작하는 스크립트는 서비스를 시작할 때 사용하는 스크립트

– 디렉토리들안의 파일이름중 숫자는 서로의 실행 순서를 맞추려는 것으로 낮은 번호의 스크립트는 높은 번호의 스크립트보다 먼저 실행됨.

● 같은 서비스를 서로 다른 실행 레벨에서 시작하고 중지하기 때문에 같은 스크립트를 여러 곳에 복사하는 것보다 심볼릭 링크를 사용

System V ( Old )● ca : 12345 : ctrlaltdel : /sbin/shutdown -t1

-a -r now

– 이 항목은 콘솔에서 Ctrl-Alt-Del 을 눌렀을 때 실행

– 이 키조합을 누르면 보통 시스템은 재부팅하는 인터럽트가 발생

– 리눅스에서는 이 인터럽트를 받아 init에게 보내고 init은 ctrlaltdel의 action 필드에 있는 항목을 실행

– 여기서는 /sbin/shutdown -t1 -a -r now로 안전한 시스템 재부팅 수

System V ( Old )

● 1: 2345 : respawn : /sbin/getty 38400 tty1

● 2: 23 : respawn : /sbin/getty 38400 tty2

● 3: 23 : respawn : /sbin/getty 38400 tty3

● 4: 23 : respawn : /sbin/getty 38400 tty4

● 5: 23 : respawn : /sbin/getty 38400 tty5

● 6: 23 : respawn : /sbin/getty 38400 tty6

System V ( Old )

● 6개의 가상 콘솔을 /sbin/getty에서 실행하는 항목

– getty 프로그램은 터미널의 로그인을 받아준다.

– getty 명령은 터미널 장치를 열고 터미널 드라이버에 다양한 매개변수를 설정하고 /bin/login을 실행

– getty는 'baud rate'과 '장치'의 두 개의 인수

● getty 항목의 action 필드는 respawn

– 해당 명령이 죽으면 init이 다시 명령을 실행

– 사용자가 로그아웃 할 때마다 getty 프로세스가 종료됨

– 이에 따라 getty 프로세스를 다시 실행시켜 로그인을 준비

Upstart init ( current )● Upstart init은 부팅하는 동안의 작업 및 서비스를

시작하고, 셧다운 하는 동안 작업 및 서비스를 멈출수 있으며, 또한 시스템이 운영되고 있는 동안에 작업 및 서비스를 감독 가능

● 이것은 원래 우분투 배포판을 위하여 개발 하였지만, 오래된 System-V 및 모든 리눅스 배포판의 init을 대체 하여 적용하기에 적합함

● Upstart init은 이벤트 기반 으로 동작 되며, 서비스의 시작과 중지는 이벤트들의 통신에 기반

Upstart init ( current )● Upstart init

– 우분투에서 개발한 System-V init을 대체하는 init daemon 프로그램

– 우분투 6.10부터 도입됨.

– 12.04 버전은 기본으로 Upstart init을 사용

– System-V 와의 호환성을 위하여 /etc/init.d 디렉토리가 존재● /etc/init/rc.conf 파일에서 System-V의 rc 명령을 이용하여 스크립

트들을 실행 시키도록 되어 있음.

– /etc/init 디렉토리에 실행 할 서비스를 텍스트 파일 만듬● 파일명은 서비스명.conf 형식이며, 이 파일에 실행 권한을 줄 필요가 없다.

Upstart ( Current )

● /etc/init.d

– 전통적인 System V 버전의 init 과 호환 하는 스크립트 위치

● # service cups stop

cups stop/waiting

# service cups start

cups start/running, process 10750

# service cups restart

cups stop/waiting

cups start/running, process 10776

Upstart ( Current )

● DESCRIPTION

– Upstart init(8) 데몬은 /etc/init/ 디렉토리에 있는 파일로 부터 작업 구성을 읽고, inotify(7)을 사용하여 이러한 파일에 대한 향후 변화를 감시.

– D-버스는 권한이 없는 사용자가 Upstart D-버스의 메소드의 호출을 허가 하도록 설정되어 있으며, Upstat는 사용자의 작업을 관리할 수 있습니다.

Upstart ( Current )

● DESCRIPTION

– Upstart는 환경 파일이 위치한 디렉토리에 있는 파일은 두가지 형태의 .conf 혹은 .override 의 접미사로 되어 있어야 인식 할 수 있습니다.

● .conf ( 접미사 )– 작업을 위해 호출되는 중요한 설정 파일

● .override ( 접미사 )– .conf 파일과 같은 이름이며 접미사만 다른 설정 파일로서, 기존 작업을 대

치하여 수정된 작업을 수행 할 수 있도록 하기 위한 파일

– 로딩은 두가지 형태로 로딩● 하나의 설정 파일 ( .conf )

● 하나의 설정 파일 ( .conf ) 과 하나의 재정의된 (.override) 파일

– 설정 파일은 일반 텍스트 파일 이며, 실행 파일은 아님

Upstart ( Current )

● rc-sysinit 작업을 위한 "start on" 조건

– start on filesystem and net-device-up IFACE=lo

– 위의 조건이 만족 하면, Upstart는 rc-sysinit 작업 시작

– rc-sysinit 작업은 런레벨 이동 작업을 위해서 다음과 같은 telinit 명령어를 호출

– telinit 2

● telinit 명령은 다음과 같은 runlevel 이벤트 발생

– runlevel RUNLEVEL=2 PREVLEVEL=N

● runlevel 이벤트는 많은 다른 Upstart 작업의 시작을 발생

– 기존의 SystemV INIT 시스템의 /etc/init/rc.conf를 포함하여 시작

– /etc/init/rc 2 에 의하여 /etc/rc2.d 디렉토리에 링크된 시작 스크립트들을 실행

● 최종적으로 /etc/init/tty1.conf 에 의하여 /sbin/getty를 실행

감사 합니다.