= 운영체제실습 (2) = 리눅스 (Linux) 부팅과정 표월성 passwd74@cherub.sungkyul.edu http://cherub.sungkyul.edu/~web
차례 부팅과정 MBR /etc/inittab GRUB
부팅과정 1. BIOS 코드로드 ROM-BIOS 2. 부트로더 (GRUB) 로드메모리 (RAM) 부더 (G U ) (/boot/grub/grub.conf 를참조 ) 3. 부트코드로드 4. 커널이미지로드 (/boot/vmlinuz-2.6.23.1-42.fc8) / M B R 부트섹터 커널이미지 부트섹터 윈도우즈
부팅과정 Power ON ROM-BIOS OS 프로그램실행 BIOS (Basic Input/Output System) : 메모리의특정번지로자동로드되어실행됨. POST(Power On Self Test) 수행 -서버에장착된 H/W가인식됨.( 시리얼장치, 패러럴장치, PS/2 마우스장치, 사운드장치, IDE장치, 플로피드라이브, SCSI장치, 이더넷카드등.) -H/W의물리적인손상체크와초기화가병행됨.(CMOS내용검사, CPU, Memory, 그래픽카드, 키보드, 마우스, 기타각종 H/W의이상유무진단, H/W초기화수행 ) 부팅매체 (DISK, CD-ROM, Floppy 등 ) 검색 MBR(Master Boot Record) 를읽어, 부트로더 (GRUB) 를로드시킴 GRUB 실행 ( 부트로더실행 ) 부팅메뉴선택 (/boot/grub/grub.conf 파일참조 ) kernel 이미지로드 (/boot/vmlinuz-2.6.23.1-42.fc8) swapper 프로세스호출
부팅과정 swapper 프로세스 (PID=0) 커널이미지압축해제 각장치드라이브들을초기화 루트 (/) 파일시스템을 read-olny 로마운트 - /boot/grub/menu.1st (= /boot/grub/grub.conf) 에서 root= 파티션 으로설정된부분을루트파트션으로 ) 파일시스템검사 루트 (/) 파일시스템을 read-write모드로마운트 init 프로세스 (PID=1) 호출 init 프로세스 (PID=1) /etc/inittab 파일참조 /etc/rc.d/rc.sysinit 스크립트실행 해당run-level에맞는 /etc/rc.d/rc#.d/* 스크립트실행 /etc/rc.d/rc.local 파일실행 CTRL+ALT+DEL키작동설정 전원 (UPS) 관리설정 가상콘솔접속을위한프로토콜 (mingetty) 실행 실행레벨이 5일때, prefdm스크립트실행 (x윈도우로부팅 ) Login 프롬프트출력
MBR 파티션테이블 예 ) ------------------------------------------------------------ 80 01 01 00 06 7F 3F FD 3F 00 00 00 C1 40 1F 00 ------------------------------------------------------------ 1 Bootable Flag (1Byte) 부팅파티션식별정보 ( 어느파티션으로부팅할것인지를표시함 ) 0x80 : 부팅파티션 (active partition) 0x00 : 부팅에사용되지않는파티션 4개의파티션중 1개의파티션에만 0x80을사용할수있다. 2 Starting CHS Address (3 bytes) 3 Partition Type(1 byte) : 파일시스템타입을식별 (0x06 ) 4 Ending CHS Address (3 bytes) 5 Starting LBA Address (starting sector) 6 Size in Sectors ( 파티션의섹터의개수 : 4 bytes) Signature value (2bytes ( 510 ~ 511 : 1FE ~ 1FF )) : 0xAA0x55
/etc/inittab /etc/inittab init프로세스가제일먼저읽는파일 init프로세스가무엇을해야할것인가를결정.( 즉, 시스템을어떻게 setup 할지를설정 ) 리눅스사용환경초기화 파일시스템점검 서비스프로세스관리 가상콘솔관리 실행 level 관리등.
/etc/inittab
/etc/inittab (inittab 파일의형식 ) /etc/inittab 파일내의각행의형식 name : runlevel : options : process options name : 각항목에대한이름 (id, si, pr 등 ) runlevel : 어떤실행레벨에서실행할것인가를정의 options : 네번째항목의프로세스를실행할때적용되는속성 respawn : 프로세스가종료되면, 항상다시시작.(ex, login창 ) wait : 지정된프로세스가실행되면, init는해당프로세스가종료될때까지기다린후에다음작업진행 once : 해당프로세스를한번만실행되도록하는옵션 boot : 시스템이부팅되는동안해당프로세스가실행 (init는 runlevel필드를무시함 ) bootwait : 부팅되는동안해당프로세스가실행되며, init는프로세스가종료될때까지기다림 off : 아무런동작도발생하지않도록하는옵션 ( 일종의주석과같은역할 ) ondemand : 실행레벨이 1, 2, 3 인경우에만유용.( 해당 runlevel 일때만, 프로세스동작함.) initdefault : 시스템이부팅되면서어떤실행레벨로부팅할것인가를결정하게하는옵션 sysinit : 시스템이부팅되는동안한번만프로세스가실행하는옵션 (boot, bootwait보다우선권을갖는다 ) powerwait : init는 SIGPWR신호를받는경우에만프로세스가가동됨. powerfail : powerwait 와같지만, init 는프로세스가완료될때까지기다리지않는다 powerokwait : init가 SIGPWR신호를받고, /etc/powerstatus파일에 OK문자열이있을때만프로세스실행됨. ctrlaltdel : init프로세스가 SIGINT신호를받았을때, 실행되도록함. kbrequest : init프로세스가키보드관리자로부터 keyboardsignal을받았을때해당프로세스실행. process options : 실행할프로세스 ( 명령어 ) 와명령어에대한옵션
/etc/inittab (Default runlevel 설정 ) runlevel 필요에따라시스템을어떤방식으로부팅할것인가를분류해놓은것. 레벨 0 : 시스템종료 (init 0, halt, shutdown h now) 레벨 1 : 싱글모드 ( 관리모드 ), 콘솔로만접근가능, root만허용 (init 1) 레벨 2 : NFS를지원하지않는멀티유저모드 (init 2) 레벨 3 : NFS를지원하는멀티유저모드 (init 3, full multiuser mode) 레벨 4 : 현재사용하지않는부팅모드 ( 설정하여사용가능함 ) 레벨 5 : X윈도우환경으로실행된멀티유저모드 (init 5) 레벨 6 : 서버재부팅모드 (init 6, reboot, shutdown r now)
/etc/inittab (rc.sysinit 스크립트실행 ) /etc/rc.d/rc.sysinit 스크립트 시스템초기화스크립트 모든실행레벨에서시스템이부팅이되면꼭한번실행되는스크립트 default path설정 /etc/sysconfig/network파일실행 네트워크설정확인및적용 swapon명령으로스왑작동하기 호스트이름, 도메인이름설정하기 keymap loading fsck실행으로파일시스템점검하기 (/etc/fstab / 파일참조 ) PNP하드웨어점검하기 /proc 파일시스템 mount kernel module load depmod 실행으로모듈의존성설정 system clock 설정 ( 시스템시간설정 ) system font load 파일청소작업 기타시스템초기화에필요한작업들수행
/etc/inittab (rc#.d/* 스크립트실행 ) /etc/rc.d/rc#.d/* 스크립트 각실행레벨에따라실행시켜야할스크립트존재 (/etc/rc.d/init.d/* 로링크 ) K로시작 : Kill S로시작 : Start 숫자 : 실행순서결정
/etc/inittab (rc.local 파일실행 ) /etc/rc.d/rc.local 파일실행 각실행레벨에서맨마지막단계에서 1번실행되는파일 부팅할때마다자동으로실행할명령어등을설정 /etc/rc.d/rc#.d/ 스크립트파일중마지막에실행 (S99local파일)
/etc/inittab (CTRL+ALT+DEL 키설정 ) CTRL+ALT+DEL 키작동설정 매직키사용제한 -a 옵션추가 /etc/shutdown.allow 파일생성 한행에한사용자 ID 를넣어두면됨. ( 여기에기록된사용자만매직키사용가능 )
/etc/inittab ( 전원관리설정 ) 전원관리설정 pf 행 pr 행 UPS 전원이부족할경우 2 분후에자동적으로리눅스서버를 shutdown 시키는설정 UPS 전원이재충전되었을경우, pf 행에서실행예정이었던 shutdown 절차를자동취소
/etc/inittab ( 가상콘솔접속 ) 가상콘솔접속을위한프로토콜 (mingetty) 0 ~ 6까지가상터미널을가리키는것 부팅후에 6개의가상터미널이뜨고, login 을위해 mingetty 프로그램이실행됨 => login 프롬프트출력
/etc/inittab (prefdm 스크립트실행 ) prefdm 스크립트실행 실행레벨이 5 일때, prefdm 스크립트실행 (x 윈도우로부팅 )
GRUB ( 부트로더 ) 부트로더 (Bootloader) 시스템에설치되어있는운영체제로부팅될수있도록해주는프로그램 하드디스크의첫번째섹터 (512bytes) 인 MBR에위치함. GRUB (Grand Unified Bootloader) Erich Stefan Boleyn 에의해서개발된부트로더 리눅스의전통적인 bootloader 로사용되어왔던 LILO 의단점을보완 Grub 부트로더의특징 LILO에비해설정및사용이편리. 부트정보가올바르지않더라도부팅시이를바로수정하여부팅할수있다. Chain-load 를이용하여멀티부팅지원 메뉴인터페이스환경을지원하며, 대화형모드로부트정보를설정할수있다. 파일시스템과커널실행포맷을인식하여하드디스크상에서커널의물리적위치를기록하지않고서도, 커널위치와커널이미지파일명만알고있으면부팅이가능하다.
GRUB (grub.conf) /boot/grub/grub.conf g = /etc/grub.conf GRUB 환경설정파일
GRUB (grub.conf) /boot/grub/grub.conf g default 0 : 기본적으로부팅되도록할부트엔트리값 (title 옵션 ) fallback 1 : 기본부트엔트리로부팅할수없을때, 2 차적으로부팅에사용될부트엔트리 timeout 5:GRUB5 : 부트화면에서키보드입력을받기까지의대기시간 splashimage : XPM 형태의그림이미지를압축한 xpm.gz 파일을 GRUB 메뉴화면의배경이미지로사용할수있다. hiddenmenu : GRUB 부트메뉴를보여주지않고, 바로리눅스커널로부팅
GRUB (grub.conf) title 부트엔트리설명 부팅시메뉴에나타나는제목 root (HDD디바이스명, 부트파티션명 ) root : GRUB의루트디바이스를설정하는옵션 (/boot 디렉토리를포함하는파티션 ) kernel 커널이미지경로 / 커널명 root = 루트디바이스명부트파라미터 kernel 커널이미지경로및파일 ro root= 장치명부트파라미터 rhgb : Redhat Graphical Boot quiet : 커널메시지를화면상에출력되지않도록하는옵션
GRUB (grub.conf) initrd initrd 이미지경로 /initrd 명 리눅스설치시에는 initrd이미지설정이포함되어있으나, 커널컴파일후에는스카시 HDD가아닌경우에는이설정이생략되어도무방함. ( 참고 ) initrd파일 리눅스커널이모든초기화작업을마치고가장먼저마운트되는디스크이미지파일. ( 부트파티션보다도먼저마우트함 ) initrd는주로커널모듈을추가로로딩할려고할때필요합니다. 예 ) 부트파티션을마운트하는데필요한커널모듈을로딩 ( 스카시카드디바이스드라이버모듈을로딩 )
GRUB (grub.conf) rootnoverify : title Window XP rootnoverify (hd1,0) makeactive chainloader +1 root 와거의같지만, mount 를하지않는다. FAT32나 NTFS 파티션처럼인식하지못하는파티션인경우이옵션을사용하여지정 makeactive : 루트디바이스를부팅가능한파티션으로지정 (primary 파티션에만사용 ) chainloader +1 : makeactive 명령으로부팅가능하도록지정한파티션의 1 번째 sector 부터읽어들이기시작해부팅을시작하도록하는명령
GRUB GRUB 에서의디바이스명칭 일반적인 HDD명칭표시 : hda, hdb, hdc, hdd GRUB에서의 HDD명칭표시 : hd0, hd1, hd3, hd4 hd = hard disk (hd0, 0) : primary HDD 의첫번째파티션 = /dev/hda1 (hd0, 1) : primary HDD의두번째파티션 = /dev/hda2 (hd0, 2) : primary HDD의세번재파티션 = /dev/hda3 (hd1, 1) : secondary HDD 의두번째파티션 = /dev/hdb2/hdb2 (fd0) : floppy disk
Q&A Q&A