안녕하세요
뚱보 프로그래머 입니다
오늘은 리눅스 부팅 순서에 대해서 알아봅니다.
BOOT PROCESS
1. 부팅 순서
1) 전원 ON
2) ROM BIOS 작동
CMOS의 정보를 구동하여 시스템을 초기화하고, memory, hard disk, CPU check 등의 작업을 통해 시스템 이상 여부를 test한다.
3) Booting할 Drive 선택
booting device의 첫번째 실린더, 첫번째 섹터(HDD, Floppy, CDROM 등)를 읽는다.
일반적으로 partition 정보가 있는 partition table은 hard disk의 첫번째 섹터에 기록되어 있다.
전원이 들어왔을 때 partition을 선택해서 운영체제를 메모리로 올리기 위한 boot loader program이
여기에 존재한다.
4) 선택된 드라이브의 Master Boot Sector를 읽는다.
여기에 존재하는 Master Boot Record는 부팅 관련 lilo 또는 다른 운영체제의 부트로더를 탑재하고 있으며 크기는 512 bytes이고 0번 섹터에 있다.
MBR은 partition table을 읽어 Booting할 파티션을 알아낸다. Booting partition의 Boot Sector에 가지고 있는 작은 프로그램이 해당 운영 체제를 읽어들이면서 부팅이 이어진다.
5) Kernel 압축해제
MBR의 lilo는 커널을 실행하고 커널 실행시 옵션이나 이미지를 지정한다.
즉, 해당 커널 이미지를 로딩하고 실행하는데 이때 일반적으로 /vmlinuz or /boot/vmlinuz image인 커널 압축 이미지를 실행한다. 그리고 디스크 공간을 줄이고 빠른 속도를 위해 압축 이미지를 메모리에서 압축을 푼다. 또한 lilo에 의해서 "수동"으로 swapper라 불리는 id 0인 프로세스가 실행된다.
참조 : swapper process
id가 0번이며 운영체제 그 자체라 할 수 있는 프로세스이다.
주로 메모리 관리, 디스크 관리, 프로세스 관리를 수행하며 id 1번인 init process를 실행시키고 본연의 기능인 swapper로서의 기능을 수행한다.
참조 : swapper의 역할
"잠들어" 있는 프로세스를 메모리에서 내려서 디스크 공간에 잠시 "스왑"시켰다가 그 프로세스가 깨어나야 할 시간이 오면, 디스크의 프로세스를 다시 메모리로 적재해 주는 일을 한다.
6) 장착된 Hardware 검사 및 장치 드라이버 설정
하드웨어 드라이버를 검사하고 해당 장치의 드라이버를 설정한다..
7) Kernel이 root(/) filesystem을 read-only 모드로 mount한다.
8) File System 검사
9) root filesystem을 read-write 모드로 다시 mount한다.
10) 커널이 PID 1번인 /sbin/init 프로세스를 실행하고 제어권을 init으로 넘긴다.
참조 : init process의 역할
사용자들을 위해서 시스템을 설정한다.
파일 시스템 구조 검사, 파일 시스템 마운트, 서버 데몬 실행, 사용자 로그인 대기, 로그인 시 쉘 부여 등의 역할을 한다.
11) /etc/inittab 파일 참조
init 프로세스가 처음 실행시 수행해야 할 작업이 설정된 파일이며 설정된 순서대로 작업을 진행한다.
run level을 결정하고 시스템의 초기화를 담당하는 /etc/rc.sysinit를 실행하며 로그인 프롬프트나 디스플레이 메니져를 실행하고 로그인 대기 화면을 출력한다.
12) /etc/rc.d/rc.sysinit 실행
가장 먼저 init process가 실행하는 startup 스크립트이다.
run level에 관계없이 제일 먼저 실행되고 그 후 run level에 따른 명령어 실행을 실행한다.
시스템 초기화시 한번만 실행되는 스크립트 파일이며 일반적으로 Hostname 초기화, Swapping, 시스템 점검, 커널 모듈 로딩 등의 작업을 한다.
13) /etc/rc.d/rc 실행
이 스크립트 파일은 /etc/inittab 파일에 정의된 default runlevel을 참조하여 심볼릭 링크된 타겟 runlevel 디렉토리를 참조한다.
이 파일의 역할은 먼저 실행될 runlevel의 디렉토리 존재 여부를 확인하고 실행시킬 프로세스 중 이미 실행중인 것을 종료시키고 /etc/rc.d/rc[0-6].d에 따른 스크립트를 수행하는데, 이때 ‘S#’로 시작하는 스크립트는 start 인자로서 실행하고 ‘K#’는 stop 인자로서 중지시킨다.
14) /etc/rc.d/rc.local 스크립트 실행
Booting 과정중 로그인 바로 이전에 시스템이 실행하는 스크립트 파일로서 일반적으로 이 파일은 login시에 시스템의 정보를 출력한다.
사용자 정의에 의해 매번 실행할 내용을 이 파일에 넣어두면 시스템이 실행한다.
15) /etc/inittab 파일 참조
getty류의 프로세스를 실행하는데, 시스템에 따라서는 mingetty, getty 등의 프로세스가 있다.
pid 0번 프로세스에 의해 실행된 init가 fork() system call을 한번 수행하고, 그에 의해 생성된 자식 init가 exec() system call을 이용해서 mingetty 등의 프로세스를 수행한다.
16) getty 프로세스는 login 프로세스 실행
사용자의 userid와 passwd를 입력 받아 사용자를 인증한다. mingetty 프로세스는 다시 exec()를 호출하여 login 프로세스를 실행한다.
17) 만약 승인된 사용자라면, /etc/passwd 파일에 명시된 사용자에 해당하는 shell을 exec() 시스템 호출을 이용하여 실행한다. 사용자는 자신의 shell(bash)로 작업을 하고, shell에서 입력하는 명령어들은 먼저 shell이 fork()를 한 후 shell의 자식 프로세스가 exec()를 호출하여 실행되고 종료하는 것이다.
참조 : fork() system call
새로운 프로세스를 위한 메모리를 할당한다.
fork() 시스템 호출의 결과는 프로세스가 하나 더 생기는 것이며 프로세스 id인 pid도 완전히 다른 또 하나의 프로세스가 생긴다.
참조 : exec() system call
새로운 프로세스를 위한 메모리를 할당하지 않는다.
exec()를 호출한 프로세스의 메모리에 새로운 프로세스의 코드를 덮어씌워서 exec()에 의해 호출된 프로세스만 남게 된다. exec()를 호출한 프로세스의 pid가 그대로 새로운 프로세스에 적용이 된다.
2. Booting시 파일 인식 순서
1) Booting ---------------------- /etc/lilo.conf
2) /sbin/init --------------------- /etc/rc.d
/etc/inittab
3) /sbin/mingetty ----------------- /etc/gettydefs (/etc/login.defs)
/etc/issue
4) /bin/login -------------------- /etc/passwd
/etc/group
/etc/securetty
/etc/motd
/etc/termcap
5) /bin/bash
6) logout
3. Boot loader
1] LILO
1) lilo의 기능
lilo는 linux loader의 줄임말로 linux를 로딩하는 역할을 담당하는 boot loader program이다. 보통 하드디스크의 MBR에서 작동하는 멀티부팅 프로그램이며 리눅스 커널을 찾아서 메모리로 로딩한다.
boot: 는 커널을 읽어 들이기 위해 사용자의 입력을 기다리는 표시이다.
사용자가 커널 이미지와 옵션을 주면 해당 커널 이미지를 실행한다.
참조 : MBR
Master Boot Record
일반적으로 하드디스크의 첫번째 트랙, 첫번째 섹터를 의미한다.
파티션 테이블이 존재한다.
파티션 테이블은 파티션의 시작과 끝을 나타내는 주소(파티션의 크기와 위치 확인)와 부팅 가능한 파티션을 나타내는 flag, 그리고 파티션 타입(2자리의 ID로 표현되며 파티션이 어떤 용도로 사용될 것인지를 나타내며 파일 시스템마다 값이 다를 수 있다.)에 대한 정보를 간직하고 있다.
2) lilo의 설치
ftp.ezlink.com에서 최신의 lilo를 구할 수 있으며 압축 소스파일을 받아와서 Makefile로 정의되어지는 RAWRITE_TABLE로 컴파일하고 인스톨한 다음 /etc/lilo.conf 파일을 편집하고 마지막으로 /sbin/lilo를 프롬프트에서 실행을 해서 lilo의 설정을 적용시킨다.
3) lilo의 설정파일
1> : OS가 한가지만 설치되어 있는 경우
#vi /etc/lilo.conf
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
lba32
default=linux
image=/boot/vmlinuz-2.4.2-2wl
label=linux
read-only
root=/dev/hda5
2>: Linux와 Window를 같이 사용하는 경우
#vi /etc/lilo.conf
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
lba32
default=linux
restricted
password=;inuxone
image=/boot/vmlinuz-2.4.2-2wl
label=linux
root=/dev/hda6
other=/dev/hda1
label=dos
boot=/dev/hda lilo가 설치되는 위치(hda, sda), 첫번째 부팅 단계
map=/boot/map 멀티부팅을 위한 각 Operating System들의 부트섹터위치, 커널 이미지 정보(binary 파일), 커널 블록 위치
install=/boot/boot.b MBR관련 정보와 device check 프로그램(binary 파일), 설치할 부트 이미지 위치, 두번째 부팅 단계. 이 파일로부터 lilo 부트레코드를 MBR에 복사한다. L I L O - error시 체크
prompt lilo 실행 시 boot: 프롬프트 표시
timeout=50 초기 대기 시간 10=1초. 지정된 시간동안 키보드. 입력이 없을 경우 자동으로 default로 지정한 항목으로 부팅이 진행된다.
message=/boot/message lilo 메시지 위치 지정
lba32 1024 실린더 제한에 의해 8GB이상에서의 설치를 위해 설정한다.
default=linux 사용자 선택이 없을 때 기본 부팅 항목
restricted lilo boot 프롬프트에서 부팅할 OS의 label 외의 인자가 있을 경우에만 password 인증, restricted 키워드를 사용하지 않으면 인자가 없어도 passworrd 인증을 거친다.
password=linuxone
vga=791 1024 x 786 depth=24 bpp mode로 부팅(framebuffer 사용)
image=/boot/vmlinuz-2.4.2 리눅스 커널 이미지 위치
label=linux 부팅시 구별하는 인식명
read-only 기본적으로 부팅시 read-only 모드로 인식해서 마운트. 나중에 파일 시스템 검사 후 다시 read-write 모드로 마운트
root=/dev/hda6 리눅스의 root(/) 파일 시스템
other=/dev/hda1 멀티 부팅 가능한 다른 운영체제를 지정한다.
label=dos
시스템 부팅이 가능한 항목은 image와 other 2부분이며 image는 커널 이미지 및 파일을 지정하고 other는 다른 운영체제로 부팅시 사용된다.
image로 지정된 경우는 이미지 파일이 있는 위치를 lilo가 찾아서 로딩을 하고 other는 지정된 파티션의 첫번째 섹터로 부팅의 제어권을 넘기는 것이다.
설정을 적용하기 위해 시스템의 lilo를 다시 실행한다.
[root @edu00 linux]#/sbin/lilo
4) lilo 복구
CD-ROM으로 부팅 후 초기 인스톨 화면을 이용한다.
LILO boot: linux root=/dev/hda5 ro
root 파일 시스템의 위치를 정확하게 설정해야 한다.
부팅 후 /sbin/lilo를 실행해서 설정을 적용해야 한다.
5) 부팅 디스켓 만들기
부팅에 필요한 커널 이미지만 저장한다. 하드디스크에 정상적으로 리눅스는 설치되어 있어야 한다.
디스켓에 badsector가 없어야 하고, 중요 파일은 백업해야 한다.
[root @edu00 linux]#mkbootdisk --device /dev/fd0 <커널버젼>
: <커널버젼>은 /lib/modules 하위에 나타나는 디렉토리명과 똑같아야 한다.
디스켓으로 부팅하면 linux:라는 프롬프트가 나타나고 enter키를 누르면 리눅스가 실행된다. 이때 다른 리눅스 시스템에서는 부팅이 안될 수가 있는데 이유는 root 파일 시스템의 위치가 다를 수 있기 때문이다.
1> 루트 파일 시스템의 위치가 다를 경우
부팅시 root 파일 시스템의 위치를 명시하여 부팅한다.
linux: root=/dev/hda5
: 루트파일시스템을 지정해야 한다.
2> 플로피 디스크에 커널 이미지를 복사하는 경우
[root @edu00 linux]#cd /boot
[root @edu00 /boot]#cat vmlinuz > /dev/fd0
실제 vmlinuz-커널 버젼명으로 링크된다. 커널 이미지가 디스켓으로 이동한다.
[root @edu00 linux]#rdev /dev/fd0 /dev/hda5
root filesystem의 위치가 hda5라는 것을 플로피 디스크에 인식시킨다.
3> 파일 복사 및 포맷 명령어를 이용
[root @edu00 linux]#dd if=vmlinuz of=/dev/fd0
6) lilo 삭제
DOS : fdisk /mbr
Linux : #/sbin/lilo -U or /sbin/lilo -u /dev/hda(MBR 위치 파티션)
7) 부팅 순서 바꿀 때
일시적으로 다음 부팅할 때만 변경하고자 할 경우
[root @edu00 linux]#lilo -D <label명>
<label명>은 /etc/lilo.conf 파일에 설정된 label명과 일치해야 한다.
일시적이 아닐 경우 /etc/lilo.conf 파일의 default 부분의 label명을 변경
8) lilo 백업
lilo가 부트섹터에 설치될 때 백업이 /boot/boot.xxyy로 만들어진다. xxyy에서 xx는 디바이스의 major 번호, yy는 minor 번호를 나타내는 숫자이다.
복원 : #dd if=/boot/boot.0300 of=/dev/hda
dd 명령은 if(input file)에 지정된 파일을 of(output file)에 지정된 파일로 포맷을 바꾸어 복사하는
명령어이다.
9) root user의 비밀 번호를 잊어 버렸을 때
boot: linux single or linux -s or linux 1
참조 : single user mode의 의미와 실행 이유
대부분의 네트워크 데몬이 중지되고 네트워크 로그인이 허용되지 않는 모드이다. 일반적으로 파일 시스템 체크, 오류 수정. 백업 및 복구 등의 작업을 할 경우 사용하는 레벨이다.
10) LILO error messages
1> 아무것도 나타나지 않는 경우 (nothing)
LILO는 전혀 로드되지 않은 것
LILO가 아예 설치되지 않았거나 부트섹터가 위치하는 파티션이 active하지 않기 때문
-> fdisk(linux용)에서 active 설정
2> L
부트로더의 첫 단계는 로드되어 시작되었지만 부트로더의 두번째 단계가 로드되지 못한 것이다. 두자리 수의 에러코드들은 어떤 타입의 문제가 발생했는지를 표시한다.
매체에 이상이 있거나 geometry의 불일치인 경우. 예를 들면 디스크 parameter를 잘못 준 경우에 발생한다.
3> LI
부트로더의 첫 단계가 부트로더의 두번째 단계를 로드하기는 했는데 그것을 실행시키데 실패한 것이다.
geometry의 불일치(geometry mismatch)이거나 map installer를 실행시키지 않은 채 /boot/boot.b를 옮긴 데서 기인한다.
4> LIL
부트로더의 두번째 단계가 시작되었지만 이것이 map file에서 discriptor table을 로드하지 못한 것이다. 매체의 이상이거나 geometry가 일치하지 않았기 때문이다.
5> LIL?
부트로더의 두번째 단계가 잘못된 address로 로드된 것이다. 사소한 geometry 불일치이거나 map installer를 구동하지 않은 채로 /boot/boot.b를 이동시켰을 때의 전형적인 현상이다.
6> LIL-
discriptor table이 잘못된 경우이다. geometry 불일치이거나 map installer를 구동시키지 않은 채로 /boot/boot.b를 이동시켰기 때문이다.
7> LILO
정상적으로 lilo의 로딩이 성공되었음을 나타낸다.
11) 부팅 시 010101..문제
lilo의 1024 버그때문에 lilo가 mbr에 제대로 설치가 되지 않을 경우 나타나는 현상이다. 즉, lilo가 mbr에 정확하게 설치되지 않아서 하드디스크의 실린더 정보를 정확하게 읽어오지 못하기 때문에 일어난다.
구버젼 리눅스 : 최신 리눅스로 재설치
신버젼 리눅스 : cd로 부팅 후 lilo 실행
12) 부팅시 네트워크 스크립트 실행 도중 시스템이 멈출 경우
rc.local 파일에서 설정이 잘못되어 있을 경우 부트 프롬프트에서 Banner에서 지원하는 interactive 모드인 “I”를 눌러 한 단계씩 확인하며 스크립트를 실행한다. 마지막 rc.local 파일은 그냥 pass한다.
다시 rc.local 파일을 불러와 수정, 네트워크 설정이 제대로 되었는지 확인한다.
13) 부팅시 init argument
커널은 boot시에 일반적으로 init 프로그램으로 시작한다. 컴퓨터를 설정하는 getty같은 프로그램을 실행시키거나 rc 스크립트나 그와 비슷한 것들을 실행함으로써 가능하다. 일반적으로 커널은 처음에 /sbin/init를 찾는다. 그 다음엔 /etc/init를 찾는다. 그리고 마지막으로 /bin/sh를 사용하려 할 것이다. (/etc/rc도 가능)
예를 들면 init 프로그램이 중지되고 boot할 수 없다면 boot시에 직접 shell을 가동시키기 위하여 간단히 init=/bin/sh 인자만을 사용하면 된다. 그리고 잘못되었던 프로그램을 제대로 되돌리면 된다.
2] grub
1) 개요
grub은 grand unified bootloader의 약자로 GNU에서 개발하고 있는 부트로더이다. 원래 hurd(GNU에서 개발하고 있는 커널)용이었지만 다른 GNU유틸리티와 마찬가지로 다른 OS에서도 사용할수 있다.
lilo가 bios의 정보를 완전히 무시하는 것에 비해 grub은 bios 정보를 그대로 인식하여 사용한다.
2) grub 형식
먼저 grub은 하드디스크를 다음과 같이 인식한다.
hd0(0,1,2,3,...) -> hda(1,2,3,4,...)
hd1(0,1,2,3,...) -> hdb(1,2,3,4,...)
주의 할것은 hd0은 무조건 hda가 아니라 시스템이 인식하는 첫번째 하드디스크이다. sda가 hd0이 될수도 있다. 그리고 파티션 번호는 1번부터 시작하는것이 아니라 0번부터 시작한다.
3) 소스 얻기
grub를 얻을수 있는곳은 ftp://alpha.gnu.org/gnu/grub이다.
4) 설치
먼저 파일의 압축을 풀고 컴파일 설정을 한다음 컴파일을 한다.
[root @edu00 /root]#tar xvzf grub-0.5.95.tar.gz
[root @edu00 /root]#cd grub-0.5.95
[root @edu00 /root]#./configure --prefix=/usr
; 나머지 설정 (설정을 보고 싶으면 ./configure --help)
[root @edu00 /root]#make all install
[root @edu00 /root]#mkdir -p /boot/grub
[root @edu00 /root]#cp -r /usr/share/grub/i386-pc/* /boot/grub/
다음엔 grub를 심는다.
먼저 grub를 실행하면 grub쉘로 들어가게 된다.
GRUB version 0.5.95 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub>
hda5 파티션이 루트 파티션이라면 grub를 설치한다.
grub> install (hd0,4)/boot/grub/stage1 (hd0) (hd0,4)/boot/grub/stage2 0x8000 p
* (hd0,4)는 hda5를 가르키고, /boot/grub/stage[12]는 grub이미지를, (hd0)은 grub가 설치될 파티션을 가리킨다.
* tab키를 누르면 bash의 명령어 완성기능처럼 목록들을 보여줍니다.
grub> install (hd0,
Possible partitions are:
Partition num: 0, Filesystem type is fat, partition type 0xb
Partition num: 4, Filesystem type is reiserfs, partition type 0x83
Partition num: 5, Filesystem type is reiserfs, partition type 0x83
Partition num: 6, Filesystem type is reiserfs, partition type 0x83
Partition num: 7, Filesystem type is fat, partition type 0xb
Partition num: 8, Filesystem type unknown, partition type 0x83
설치가 끝나면 메뉴 파일을 편집한다.
[root @edu00 /root]#vi /boot/grub/menu.lst
/usr/share/grub/i386-pc/에 복사한 menu.lst라는 파일이며 현재는 /boot/grub디렉토리에 있다.
이것은 예제 파일이므로 사용자가 적당히 고쳐야 한다.
편집할 것은 파티션 문제 정도 밖에 되지 않기 때문에 앞에 설명한대로만 고쳐주면 작동한다.
제대로 설정하고 나서 다시 grub 쉘로 들어간 다음 메뉴파일을 로딩하여 본다.
$grub
GRUB version 0.5.95 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub> configfile=(hd0,4)/boot/grub/menu.lst
GRUB version 0.5.95 (640K lower / 3072K upper memory)
ejjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjd
q GNU/Linux q
q GNU/Linux Safe-mode q
q GNU/Linux old q
q Windows 98 boot menu q
q Install GRUB into the hard disk q
q Change the colors q
q q
q q
q q
q q
fjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjc
Use the up and down arrows to select which entry is highlighted.
Press enter to boot the selected OS, 'e' to edit the commands before booting, or 'c' for a command-line.
The highlighted entry will be booted automatically in 30 seconds.
다음과 같은 메시지가 실제 부팅될 때 출력된다.
그리고 e 키를 사용할수 있으며 만약 설정이 잘못되어 있더라도 즉석에서 바꿀수도 있다. (e키 사용)
하지만 저장은 되지 않는다. 그리고 c키를 이용하여서 grub쉘로도 들어갈수 있다.
부가적인 기능으로는 diskless부트, 네트웍 부트 기능도 갖추고 있다.
lilo와는 달리 bios의 정보에 의존하므로 1024실린더 제한같은 것은 원천적으로 없으며 메뉴및 커맨드라인 인터페이스를 가지고 있으므로 사용자에 맞게 설정할수 있다.
* reiserfs에서 심벌릭 링크파일은 인식하지 않는다.
보통 커널 이미지가 /boot/vmlinuz-커널 버젼으로 되어 있고 이것이 /boot/vmlinuz로 링크되어 있을 것이다. ext2에서는 상관이 없는데 reiserfs에서는 제대로 인식이 안된다. reiserfs를 사용할 때는 버젼 이름까지 다 적어줄 필요가 있다.
* grub는 lilo와 다르게 커널이 바뀔때마다 심어줄 필요는 없다.
grub이 파일시스템을 직접 억세스해서 커널이미지를 읽기 때문이다.
* 참고사이트: http://people.sarang.net/linux/grub.php3
4. 쉘로 본 부팅과정 :inittab file의 이해
1) init process 정의 및 기능
커널에 의해 구동된 init 프로세스는 설정 파일인 /etc/inittab 파일을 읽어 들여 초기화 작업을 진행시킨다. init 프로세스는 커널이 부팅시 처음 실행하는 process이고 PID 1번이다. init process는 file system 구조 검사, file system mount, server daemon 실행, 사용자 login 대기, login시 shell 부여 등의 역할을 한다.
2) 설정 적용
[root @edu00 linux]#init q
3) inittab file의 위치, 기능
init process가 처음 읽어 들이는 파일이 /etc/inittab 파일이며 이 파일은 일종의 순서도와 비슷한 파일로서 init 프로세스의 작업 순서를 나열하게 된다. 시스템의 상태에 따른 runlevel에서 init process가 실행해야 할 일들을 순서대로 기술한 파일이다.
4) inittab file의 전체적 구조
#은 주석문
id:runlevel:action:process의 구조를 가짐
id : 각 항목간 구별을 위해 사용되는 label field. 이름
runlevel : 어떤 실행레벨에서 실행될지를 결정한다. 0에서 6까지 있다.
action : initdefault, respawn, wait, once, boot, bootwait, off 등 init의 수행 방식이다.
process : process 실행 file의 경로와 넘겨줄 인수 등 정의. shell에서 실행시키는 명령어, 즉 해당 entry를 실행할 때 process 부분에 나오는 명령어로 실행.
5) inittab file 분석
id:5:initdefault:
실행 레벨
0 : 종료
1 : single user, linux single, linux -s, linux 1. root로 default login.
2 : NFS를 지원하지 않는 다중 사용자 모드
3 : 네트워킹을 지원하는 다중 사용자 모드 (리눅스 default runlevel)
4 : 임의로 정의가 가능한 runlevel. 필요시 실행을 원하는 daemon을 등록하여 사용. /etc/rc.d/rc4.d에 설정
5 : X지원 runlevel
6 : 재부팅
커널은 우선 처음 부팅시의 runlevel값을 얻기 위해 action field가 initdefault인 것의 runlevel값을 취한다. 즉, id:5:initdefault:에 의해 runlevel 값 5를 취하고 initdefault로 지정되어 있기 때문에 맨 뒤의 process 필드가 비어있다. 이는 부트 process가 종료된 후 진입할 runlevel을 가리키기 때문이다.
si::sysinit:/etc/rc.d/rc.sysinit
부팅 과정 중 실행되며 sysinit으로 정의되어 있어 다른 action field보다 먼저 실행된다. 그래서 init이 제일 먼저 실행하는 script 파일이고 실행레벨이 비어 있기 때문에 runlevel을 무시하고 실행된다.
일반적으로 시스템의 전원을 올리면 /etc/rc.d/rc.sysinit 스크립트가 실행된다고 생각하면 된다.
/etc/rc.d/rc.sysinit 파일의 역할
기본적인 path를 설정하고 /etc/sysconfig/network 파일을 참고하여 네트워크를 설정한다. 이 파일이 없으면 네트워크를 활성화시키지 않고 호스트명을 localhost로 설정한다. 키맵과 시스템 폰트를 로딩하고 스왑 영역을 활성화한다. fsck를 사용하여 파일 시스템을 점검한다. 그리고 /(root) 파일 시스템과 로컬 파일 시스템을 마운트하고 /proc 파일 시스템을 마운트한다. 또한 /etc/modules.conf 파일을 읽어서 커널 모듈을 로드한다. 그리고 초기화 관련 결과를 /var/log/dmesg 파일로 작성한다.
참고 : rc.sysinit 파일의 설정 순서
1. swap on
2. e2fsck로 root filesystem check
3. ISA Plug and Plug 장치 설정
4. remount root filesystem in read-write mode
5. quota(user and group) 활성화
6. 커널 모듈 로드
7. /etc/raidtab의 소프트웨어 레이드 check and on
8. 남은 파일시스템 체크와 마운트
9. quota on
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
13:3:wait:/etc/rc.d/rc 3
14:4:wait:/etc/rc.d/rc 4
15:5:wait:/etc/rc.d/rc 5
16:6:wait:/etc/rc.d/rc 6
각 runlevel로 지정된 시작 script파일의 위치를 지정하고 있다. /etc/rc.d/rc라는 script는 각 runlevel 숫자를 인자로 받고 먼저 실행 level에 대해 하위 디렉토리를 검색한 후 check를 한다. 그리고 action field가 wait이기 때문에 해당 script가 끝날 때까지 init process는 기다리게 된다. 즉, runlevel 인자가 3일 경우 /etc/rc.d/rc3.d가 있는지를 check하고 해당 디렉토리의 모든 S로 시작하는 script를 start인자로 실행시킨다.
ud::once:/sbin/update
각 run level별로 한 번씩만 실행하며 update라는 명령어는 bdfulsh라는 커널 데몬을 실행한다. 버퍼를 갱신하는 역할을 하는데 이 과정에서 update 명령을 실행하여 아직 디스크에 쓰여지지 않고 메모리상에 버퍼링되어 있는 내용을 디스크에 쓰도록 한다.
#man update로 확인
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
사용자가 Ctrl+Alt+Del key를 누를 때의 실행 명령어를 설정하고 있으며 지금부터 3초간의 delay를 준 후(-t3) 시스템 재부팅(-r)을 하라는 명령이다.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
정전이나 불안정한 전압 등의 이유로 서버는 UPS라는 장치를 사용한다.
UPS 전력이 거의 소진되었을 경우(UPS 프로그램이나 전원관리 daemon이 check) 안전하게 시스템을 다운시키는 설정이다..
전원이 다시 들어올 수 있기 때문에 -c 옵션으로 shutdown 명령어를 취소할 수 있다.
shutdown 관련 명령어 정리
옵션
-r : rebooting
-h : halt
now : 지금 실행
+5 : 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
부팅 후에 login prompt가 떨어지는 부분으로 가상 콘솔이 띄워진다. 가상 콘솔은 다중 터미널 세션을 제공하여 각각의 콘솔에 서로 다른 사용자로 로그인할 수 있으며 총 6개의 가상 콘솔(alt+1∼6)이 제공된다. action field에서 respawn으로 지정해 놓아 해당 process(login: 프롬프트를 보여주는 mingetty)가 종료되면 복제하여 계속 실행된다. login 상태에서 logout해도 다시 login prompt가 뜨는 것은 이것 때문이다. /sbin/mingetty는 terminal mode를 세팅하는 프로그램이다.
x:5:respawn:/etc/X11/prefdm -nodaemon
X에서 사용되는 인증 화면을 띄우는 프로그램이다.
runlevel 5번에서만 가능하며 /etc/X11/prefdm 파일을 읽어 들여 설정한다.
주로 x display manager를 실행하고 login을 기다리는 x window상에서 돌아가는 program.을 설정한다.
x display manager는 xdm, gdm, kdm 등이 있으며 사용자의 선택에 따라서 x 기반의 로그인 프롬프트가 실행된다.
6) runlevel의 개념
런 레벨은 선택된 그룹의 프로세스만 시스템에서 실행되도록 허락하기 위해 만든 소프트웨어 설정이다.
7) action 필드의 의미
wait : 프로세스가 실행되면 init은 프로세스가 종료될 때까지 기다린 후 다음줄의 entry로 넘어간다.
respawn : 프로세스가 종료될 때마다 재실행된다. getty 등의 프로세스
initdefault: default run level을 지정하는데, 시스템의 부트 프로세스가 종료된 후 진입할 런 레벨을 가리키는 entry이다. 프로세스 필드는 무시된다.
off : 아무런 동작도 하지 않는다. 설정 라인을 지우지 않고도 그 내용이 실행되지 않도록 할 때 사용된다. #을 라인 앞에 붙여서 주석으로 만들어도 그 라인이 실행되지 않는다.
once : 이미 실행되고 있는 프로세스라면 실행하지 말고, 실행되고 있지 않으면 단지 한번만 실행시키라는 의미이며 단 wait처럼 기다리거나 하지는 않도록 지정된다.
boot : 시스템이 부팅되는 동안 프로세스가 실행된다. init은 runlevel 필드를 무시한다.
bootwait : 시스템이 부팅되는 동안 프로세스가 실행된다. init은 bootwait 프로세스가 종료되기를 기다린다. /etc/rc 스크립트 파일이 해당된다.
sysinit : 시스템이 부팅되는 동안 한번만 프로세스가 실행된다. boot나 bootwait가 실행되기 전에 실행되며 런 레벨은 무시된다. start-up 스크립트를 의미한다.
powerwait : init process가 SIGPWR 시그널을 받으면 실행되는 프로세스이며 init프로세스는 해당 프로세스가 종료할 때까지 대기한다. SIGPWR 시그널은 전원과 관련된 문제를 가리키는 시그널이다.
powerfail : powerwait과 마찬가지지만, 프로세스가 종료할 때까지 기다리지 않는다.
powerokwait : init가 SIGPWR 시그널을 받으면 실행될 프로세스를 지정한다. /etc/powerstatus 파일에 OK라는 단어가 있을 때만 실행되며 보통 전원이 다시 들어왔을 때만 실행된다.
ctrlaltdel : init가 SIGINT 시그널을 받게 되면 실행할 프로세스를 지정한다.
kbrequest : init가 키보드 핸들러로부터 콘솔에서 특수키 조합이 눌러졌다는 시그널을 받으면
실행되는 프로세스이며 키맵 파일과 함께 쓰인다.
5. /etc/rc.d/rc
/etc/inittab 파일에서 주어진 runlevel에 따라 해당 서비스들을 실행하는 스크립트 파일이다.
우선 해당 런레벨에 해당하는 디렉토리로 이동하여 존재하는 링크 파일들을 실행시킨다.
runlevel 변화시마다 해당 runlevel에서 필요치 않은 서비스를 중지시키고 필요한 비스를 구동시키는 역할을 한다.
해당 파일은 /etc/rc.d/rc이며 런레벨 변경 요청이 있는 경우 init은 /etc/inittab 파일에 명시된 다음 라인들 중의 하나의 라인을 이용하여 변경하고자 하는 런레벨을 인자로 하여 /etc/rc.d/rc 파일을 실행한다.
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
13:3:wait:/etc/rc.d/rc 3
14:4:wait:/etc/rc.d/rc 4
15:5:wait:/etc/rc.d/rc 5
16:6:wait:/etc/rc.d/rc 6
1] 해당 runlevel에 대한 디렉토리가 있는지 조사한다. (예 runlevel 3->/etc/rc.d/rc3.d)
2] 해당 디렉토리로 이동하여 존재하는 링크 파일들 중에 'K'로 시작하는 서비스들 중 현재 실행 중인 서비스들을 중지시킨다.
3] 링크 파일들 중에 'S'로 시작하는 서비스들을 가동시킨다.
6. /etc/rc.d/rc.sysinit
시스템 초기화 스크립트로 런레벨에 상관없이 가장 먼저 init process가 실행하는 startup 스크립트이며 시스템 부팅시에 한번만 실행되며 부팅시의 시스템 초기화를 담당한다.
기능
1) 기본 path 설정.
2) /etc/sysconfig/network 스크립트 파일의 존재 유무를 체크하여 존재하는 경우 설정된 환경변수를 이용하여 네트워크를 설정하고, 존재하지 않는 경우 네트워크를 활성화시키지 않고 호스트명을 localhost로 설정한다.
3) Banner와 상호 작용하는 start-up 프롬프트를 낸다. 부팅시에 Interactive mode로 전환해서 순차적으로 사용자가 설정하면서 부팅과정을 설정할 수 있다.
4) logging level을 설정한다.
5) /proc 파일시스템을 마운트하고, sysctl을 이용하여 kernel parameter들을 설정하고, 시스템 시간을 설정한다.
6) /etc/sysconfig/console/default.kmap 파일이 존재하는 경우, 해당 파일을 이용하여 기본 keymap을 로딩하고, 없으면 /etc/sysconfig/keyboard 파일에 기술된 내용을 토대로 keymap을 로딩한다.
7) /sbin/setsysfont 스크립트를 가동시켜서 시스템 font를 설정한다.
8) /etc/fstab에 기술된 스왑파티션들을 활성화시킨다.
9) 호스트명과 NIS domain name을 활성화시킨다.
10) "/" 파일시스템을 read-only 모드로 다시 마운트하고 문제가 있는 경우 상태를 체크한다. 심각한 문제가 발견되면 손상된 파일시스템을 복구할 수 있도록 shell을 가동시킨다.
11) ISA PNP 장치를 설정한다.
12) "/" 파일시스템을 read-write 모드로 다시 마운트하고 disk quota를 체크한다
13) 마운트된 파일시스템을 리스트하는 /etc/mtab 파일과 호스트를 구별하는 /etc/HOSTNAME 파일을 설정한다.
14) loadable kernel module들을 설정하고, /etc/conf.modules에 기술된 사운드 카드 모듈을 로딩한다.
15) /etc/raidtab 파일에 기술된 RAID 장치를 로딩한다.
16) "/" 이외의 파일시스템들을 체크한다. 심각한 에러가 발견되면 손상된 파일시스템을 복구하기 위해 shell을 구동한다. 그렇지 않다면 "/"이외의 파일시스템 중에 /etc/fstab에 자동 마운트로 기술되어 있는 파일시스템들에 대해 disk quota 설정을 체크하고 마운트한다.
17) 불필요한 임시 파일들을 삭제한다.
18) SCSI tape 드라이브가 있다면, SCSI tape module을 로딩한다.
19) 특정 상황에서는 /boot/kernel.h라는 헤더파일을 생성한다.
20) /boot/System.map-버전 파일의 symbolic link를 생성한다.
21) boot message를 /var/log/dmesg라는 파일로 복사한다. 이 메시지는 dmesg라는 명령으로 다시 볼 수 있다.
7. /etc/rc.d/rc.local
/etc/rc.d/rc 스크립트 파일이 시스템 부팅 과정 중에 실행하는 파일이며 시스템 초기화 중 제일 마지막에 실행된다. 시스템 관리자가 부팅할 때마다 실행되어야 할 작업이 있으면 이 파일의 마지막 부분에 추가를 하면 된다. 여기에서 실행되는 내용은 모든 사용자에게 적용이 되므로 각각의 사용자에 맞는 환경을 정의하고자 하는 경우는 이 파일에 기록하지 말고 사용자의 홈 디렉토리에 있는 $HOME/.bash_profile 파일에 기록해야 한다.
역할
/etc/rc.d/rc.local 스크립트는 runlevel 2, 3, 5에서 /etc/rc.d/rc 스크립트에 의해서 마지막에 한 번 실행된다. 부팅시 마다 한 번 수행되어야 하는 새로운 작업이 있다면 이 파일의 마지막에 추가 한다. 로그인시 시스템의 정보를 출력해주는 /etc/issue 파일과 /etc/issue.net 파일을 설정하고 키보드 속도 등을 설정하는 내용도 포함되어 있다.
8. 서비스 스크립트
1) 서비스 스크립트 생성 요령
1] /etc/rc.d/init.d 디렉토리에 서비스 구동을 제어하는 스크립트를 작성한다.
2] /etc/rc.d/rc?.d 디렉토리에 위의 스크립트를 가리키는 링크파일을 생성한다.
해당 runlevel에서 서비스를 구동하려면 'S'로 시작하는 스크립트를 생성한다.
해당 runlevel에서 서비스를 중지하려면 'K'로 시작하는 스크립트를 생성한다.
2) 스크립트 작성
[root @edu00 linux]#cd /etc/rc.d/init.d
[root @edu00 init.d]#rm -f httpd
[root @edu00 init.d]#cp named httpd
[root @edu00 init.d]#vi httpd
--------------------------------------------------------
#!/bin/bash
##
# httpd This shell script takes care of starting and stopping httpd
(Apache Web Servers)
# chkconfig: [실행할 Runlevel들] [Start 순위] [Kill 순위]
# chkconfig: 35 85 15
# 설명 : 35 -- S 링크를 만들 runlevel
# 85 -- S로 시작하는 웹 서비스는 85로 시작
# 15 -- K로 시작하는 웹 서비스는 15이다.(100-85)
# description: httpd is a Apache Web Server
# probe: true
#
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/sbin/httpd ] || exit 0
[ -f /etc/httpd/conf/httpd.conf ] || exit 0
RETVAL=0
start() {
#start daemons.
echo -n "Starting httpd: "
daemon httpd
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/httpd
echo
return $RETVAL
}
stop() {
#stop daemons.
echo -n "Shutting down httpd: "
killproc httpd
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/httpd
echo
return $RETVAL
}
restart() {
stop
start
}
# see how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: httpd {start|stop|restart}"
exit 1
esac
exit $?
:wq
[root @edu00 linux]#./httpd restart
3) /etc/rc.d/rc?.d 디렉토리에 link file 생성
각각의 /etc/rc.d/rc?.d 디렉토리에 링크 파일을 생성하는 방법은 단순하게 'ln -s ...'를 이용할 수 있지만 여기서는 chkconfig라는 tool을 사용하도록 한다.
chkconfig라는 tool은 서비스구동제어 스크립트에서 다음 라인을 참조하게 된다.
[root @edu00 init.d]#vi httpd
---------------------------------------------
# chkconfig : [ 실행할 런레벨] [ Start 순위] [ Kill 순위]
# chkconfig : 35 85 15
# 35 : S 링크를 만들 런레벨
# 85 : S 링크의 85번째 순위
# 15 : K 링크의 15번째 순위
----------------------------------------------
[root @edu00 init.d]#chkconfig
[root @edu00 init.d]#rm -f /etc/rc.d/rc?.d/*httpd
[root @edu00 init.d]#ls -l /etc/rc.d/rc?.d*httpd
[root @edu00 init.d]#chkconfig --add httpd
[root @edu00 init.d]#ls -l /etc/rc.d/rc?.d/*httpd
[root @edu00 init.d #chkconfig --list httpd
[root @edu00 init.d]#chkconfig --level 5 httpd off
[root @edu00 init.d]#chkconfig --list httpd
[root @edu00 init.d]#chkconfig --del httpd
[root @edu00 init.d]#ls -l /etc/rc.d/rc?.d/*httpd (x)
[root @edu00 init.d]#chkconfig --add httpd
[root @edu00 init.d]#chkconfig --list httpd
9. Run level 관리
1) runlevel 관련 서비스 관리
1] ntsysv
일단 등록된 서비스의 경우에 사용할 수 있으며 시스템 부팅시 자동으로 실행 중지시킬 서비스를 설정할 수 있다.
[root @edu00 init.d]#ntsysv
[root @edu00 init.d]#ntsysv -–level 5
2] chkconfig
각각의 해당 런레벨에 link 파일을 생성하여 해당 런레벨의 서비스를 관리한다.
[root @edu00 /root]#chkconfig
chkconfig 명령의 사용법을 나열한다.
Usage : chkconfig [--level <levels>] <name> <on|off|reset>
[root @edu00 /root[#chkconfig –list
현재 런레벨에서 실행되고 있는 모든 서비스들을 보여준다.
[root @edu00 /root]#chkconfig –-level 345 named off
[root @edu00 /root]]#chkconfig –list named
2) 런레벨 변경
1] init이나 telinit
[root @edu00 /root]#whereis telinit
[root @edu00 /root]#ls -l /sbin/init
[root @edu00 /root]#telinit -t 60 2
[root @edu00 /root]#init 1
2] 파일을 편집
[root @edu00 linux]#grep initdefault /etc/inittab
[root @edu00 linux]#vi /etc/inittab
----------------------
id:3:initdefault:
----------------------
[root @edu00 linux]#init q
설정 변경을 적용시킨다.
10. shutdown
프로세스들이 안전하게 종료될 수 있도록 종료신호를 전달해주는 명령어이다.
1) 옵션
-a /etc/shutdown.allow를 사용한다.
-k 실제로 shutdown은 실행하지 않고 사용자들에게 경고 메세지를 보낸다.
-r shutdown 후 시스템을 재부팅(rebooting)한다.
-h shutdown 후 시스템을 정지(halt)한다.
-f 재부팅할 때 fsck를 수행하지 않는다.
-F 재부팅할 때 fsck를 수행한다.
-c 이미 실행되고 있는 shutdown 과정을 취소한다.
-t secs shutdown 전 프로세스들이 하던 작업을 마치도록 secs초간의 delay를 준다.
time shutdown할 시간(now 사용가능), 24시를 기준으로 설정한다.
+m m분 후에 shutdown
-n do not go through "init" but go down real fast
2) 사용 예
[root @edu00 linux]#shutdown -h now
[root @edu00 linux]#shutdown -r 13:00
: 오후 1시에 시스템 재부팅
[root @edu00 linux]#shutdown -h +5
: 5분후에 시스템 종료
[root @edu00 linux]#shutdown -h 12:00 "시스템을 종료합니다."
[root @edu00 linux]#shutdown -h +5 -t300 "시스템을 종료합니다."
: 300초간 메시지 보내기
[root @edu00 linux]#shutdown -r +2 "........Sorry, It's a TESTing !!..."
[root @edu00 linux]#shutdown -c
3) 일반 사용자의 shutdown
[root @edu00 linux] #vi /etc/shutdown.allow
shutdown을 실행할 사용자 목록을 파일에 등록한다.
리눅스 공부도 좋지만 서로 공유하고 배워나가는것 또한 중요한것 같습니다.
모르시는건 댓글다셔서 문의주시고 빠진내용이 있다면공유하면 더 좋을꺼 같습니다.
홧팅!!