Boot Procedure(부팅진행과정)
페이지 정보
작성자 admin 작성일15-12-23 15:19 조회164회 댓글0건관련링크
본문
리눅스 부팅과정을 크게 나눠보면
1. 전원 ON.
2. ROM BIOS promgram이 POST 진행
3. 부트로더 실행
4. 커널이미지 메모리 적재
5. init 프로세스 실행
6. login
1번과 2번은 하드웨어에 관련된 부분
리눅스와 직접 관련된 3 ~ 6 부분
컴퓨터 전원을 켜면 롬에 저장되어 있는 프로그램에 의해 POST(Power On Self Test) 를 진행한다.
cpu,디스크,주변장치,메모리등 기본적인 하드웨어 진단을 한다. 이 과정에서 특별한 문제가 없다면
하드디스크 또는 다른 부팅매체의 0번 섹터(MBR(Master Boot Record)라고 한다)의 부트프로그램을 읽는다.
설치된 OS에 따라 여기에는 lilo 또는 grub 아니면 다른 OS의 부트로더가 들어 있을 수 있다.
과거의 부트로더 화면은 텍스트 모드였으나 요즘은 대개 그래픽 화면이다.
redhat linux 인 경우 그래픽 화면의 부트로더에서 텍스트 화면을 선택할 수 도 있는데 부팅시 어떤 문제가 있는
경우 장애 해결을 위해서 일반적으로 사용된다.
하드웨어 진단이 완료된 후 부트로더가 실행되면 MBR 영역에 설치된 부트로더 화면이 뜬다.
*. 부트로더가 lilo 인경우
부트로더 그래픽 화면인데 그림 왼쪽하단의 설명처럼 ctrl+x 를 누르면 과거의 리눅스처럼 텍스트 부트로더 화면으로
들어가게 된다. 리눅스와 다른 OS 가 같이 설치된 경우라면 다른 OS를 선택해서 부팅할 수도 있다.
아무런 키 입력이 없으면 5초후 자동으로 부팅을 시작한다. 부트로더 화면에서 멈추게 하려면 방향키를 한번 입력하면
부팅과정으로 넘어가지 않는다. 그 상태에서 그냥 부팅하려면 엔터키를 입력
* 부트로더가 grub 인 경우
[root@linux ~]# cat /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0 => 첫번째 title 에 있는 이미지로 부팅
timeout=5 => 부팅시 5초간 아무런 키 입력이 없으면 디폴트 OS 로 부팅 시작.
splashimage=(hd0,0)/boot/grub/splash.xpm.gz => grub 부트로더 메뉴 이미지를 보이게 하는 설정
splasy.xpm.gz 는 압축된 그림파일
hiddenmenu => 부팅시 grub 부트로더 메뉴를 숨긴다.
title Fedora Core (2.6.11-1.1369_FC4) => 부팅 이미지 레이블명
root (hd0,0) => 부트 파티션 hd0,0 은 첫번째 디스크의 첫번째 파티션.
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet => 커널이미지 파일,
rhgb는 redhat graphic boot loader를 의미.
initrd /boot/initrd-2.6.11-1.1369_FC4.img => initrd의 이미지 명
[root@linux ~]#
*. grub boot loader 에 암호걸기
- single user mode 로 누구나 시스템에 root 권한으로 접근하는 것을 막으려면 boot loader 에
암호를 걸어두면 된다.
grub 실행후
grub>md5crypt
password : ********** 패스워드 입력
Encrypted : $a$bPD$ao323$... <= 이 암호를 복사해서 붙여 넣기 하면 된다.
출력된 값을복사해서 grub.conf 파일 맨 아래에 password --md5 $a$bPD$ao323$... 추가한다음 리부팅하면 부팅시 암호를 요구한다.
password --md5 $a$bPD$ao323$...를 splashimage=(hd0,0)/boot/grub/splash.xpm.gz 바로 아래줄에 쓰게되면
부팅시 grub 메뉴에서 'e'를 눌러 수정할 때만 암호를 요구한다.
다음 단계는 압축된 커널이미지 메모리 적재 단계이다.
*. 부트로더가 lilo 인경우.
부트로더가 하나의 커널이미지를 상징하는 레이블명을 선택하면 부트로더는 자신의 설정파일에서 레이블명에
해당하는 커널이미지를 지정된 디렉토리에서 찾아서 메모리로 올린다. l
ilo 가 참조하는 설정파일은 lilo.conf 이다.
커널이미지는 디스크에 압축된 하나의 이미지로 존재하는데 redhat linux 인 경우 보통 /boot 디렉토리에 위치한다.
커널 이름은 어떤 이름이라도 상관없다. 파일명과 경로가 lilo.conf에 정확히 지정되어 있으면 된다.
그러나 커널이름은 보통 리눅스 개발자 이름을 따서 vmlinuz 라는 이름을 많이 사용한다.
redhat 리눅스는 커널 설정파일은 따로 존재하지 않는다.
(커널소스코드 컴파일시 어떠한 필요한 기능이나 디바이스를 지원하기 위한 설정은 있다.)
커널이 메모리에 올라가면 리눅스를 사용하기 위한 여러가지 하드웨어를 체크하고 각종 프로토콜을 올린다.
하드웨어 체크는 bios 단계에서 실행된 POST 와는 다른 것이다. 디스크 검사를 예를 들면 bios 단계에서
물리적인 디스크 연결 상태를 체크한다면 이 단계에서는 파티션 설정 등을 체크한다.
그리고 swapper라고도 불리는 pid 0번이 프로세스가 실행되는데 이 프로세스는 메모리관리,
프로세스관리 등을 수행한다.
그리고 init 프로세스를 생성한다.
init 프로세스는 pid 가 1번이다. 리눅스의 모든 프로세스는 부모 프로세스를 갖는데 init 프로세스의
부모 프로세스가 pid 0번인 swapper 이다. swapper 는 프로세스 리스트에서도 볼 수 없으며 부모 프로세스도 없다.
swapper는 fork() 로 만들어지는 프로세스가 아니다. 커널 자체라고 생각하면 된다.
init 프로세스는 실행 후 login 이 뜨기까지 자신의 설정파일에 따라 runlevel을 결정하고 그에 따른 여러 가지
스크립트를 실행한다. 우리가 실행한 적이 없는데도 메모리에 올라와 있는 여러 가지 데몬들도 init 프로세스에
의해 실행된 것이다.
부팅과정중 init 프로세스의 역할은 /etc/inittab file을 따른다.
아래는 /etc/inittab file을 캡쳐한 것이다.
1 #
2 # inittab This file describes how the INIT process should set up
3 # the system in a certain run-level.
4 #
5 # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
6 # Modified for RHS Linux by Marc Ewing and Donnie Barnes
7 #
8
9 # Default runlevel. The runlevels used by RHS are:
10 # 0 - halt (Do NOT set initdefault to this)
11 # 1 - Single user mode
12 # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
13 # 3 - Full multiuser mode
14 # 4 - unused => 이 런레벨은 사용되지 않는 것이다.
15 # 5 - X11 => X11 은 Xserver 버전을 나타내는 것으로 Xwindow 환경의 unlevel을 뜻한다.
16 # 6 - reboot (Do NOT set initdefault to this)
17 #
18 id:3:initdefault: => 여기에 숫자가 5가 적혀 있다면 부팅시 바로 Xwindow 환경으로 들어가게 된다.
19
20 # System initialization.
21 si::sysinit:/etc/rc.d/rc.sysinit
22
23 l0:0:wait:/etc/rc.d/rc 0
24 l1:1:wait:/etc/rc.d/rc 1
25 l2:2:wait:/etc/rc.d/rc 2
26 l3:3:wait:/etc/rc.d/rc 3
27 l4:4:wait:/etc/rc.d/rc 4
28 l5:5:wait:/etc/rc.d/rc 5
29 l6:6:wait:/etc/rc.d/rc 6
30
31 # Trap CTRL-ALT-DELETE
32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now
33
34 # When our UPS tells us power has failed, assume we have a few minutes
35 # of power left. Schedule a shutdown for 2 minutes from now.
36 # This does, of course, assume you have powerd installed and your
37 # UPS connected and working correctly.
38 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
39
40 # If power was restored before the shutdown kicked in, cancel it.
41 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
42
43
44 # Run gettys in standard runlevels
45 1:2345:respawn:/sbin/mingetty tty1
46 2:2345:respawn:/sbin/mingetty tty2
47 3:2345:respawn:/sbin/mingetty tty3
48 4:2345:respawn:/sbin/mingetty tty4
49 5:2345:respawn:/sbin/mingetty tty5
50 6:2345:respawn:/sbin/mingetty tty6
51
52 # Run xdm in runlevel 5
53 x:5:respawn:/etc/X11/prefdm -nodaemon
*. 편의상 라인번호를 붙여서 출력하였다.
설정파일 자체는 복잡하지 않은데 이 설정파일에 의해 실행되는 스크립트를 이해하는것은 다소 어렵다.
inittab 설정파일 역시 도움말이 준비되어 있다.
INITTAB(5) Linux System Administrator's Manual INITTAB(5)
NAME inittab - format of the inittab file used by the sysv-compatible
init processDESCRIPTION The inittab file describes which processes are started at bootup and
during normal operation (e.g. /etc/init.d/boot, /etc/init.d/rc, get- tys...).
Init(8) distinguishes multiple runlevels, each of which can have its own set of processes that are started.
Valid runlevels are 0-6 plus A, B, and C for ondemand entries. An entry in the inittab
file has the following format:
id:runlevels:action:process
Lines beginning with `#' are ignored.
id is a unique sequence of 1-4 characters which identifies an entry
in inittab (for versions of sysvinit compiled with libraries < 5.2.18 or a.out libraries the limit is
2 characters).
Note: For gettys or other login processes, the id field should be the tty suffix of the
corresponding tty,
e.g. 1 for tty1. Otherwise, the login accounting might not work correctly.
......
manual page 안에 상세히 설명되어 있으니 manual page 를 보는 것만으로도 설정파일을 이해하는데 많은
도움이 될 것이다 설정파일이 대게 그렇듯이 여기서도 "#" 은 주석이다.
각 라인은 위에 manual page 에 나와있듯이 id:runlevels:action:process <= 이런 형태이다.
여기서 id 필드는 특별한 의미가 없으며 각 라인을 구분하기 위한 용도라고 생각하면 된다.
여기에 올수 있는 문자수는 최대 4글자(도움말 참조)
runlevel :이 부분은 중요하다.
여기에 오는 숫자에 따라 실행되는 스크립트 및 프로세스가 다를 수 있다.
위에 주석에도 설명이 나와 있듯이 runlevel의 종류는 여섯 가지이다.
그러나 4번은 사용되지 않는다. 그래서 실제로는 5가지로 보면 된다.
우리가 시스템을 끄는것도 결국 runlevel 전환이며 rebooting 도 마찬가지이다.
action : 각 라인을 수행하는 방법. 여기에는 sysinit,wait,nowait,respawn 등이 올 수 있다.
process : 실행할 스크립트 및 프로세스이다.
id:5:initdefault: 디 폴트 런레벨을 결정하는 부분이다. 숫자 5는 부팅 시 runlevel을 5로 하겠다는 것이며
이는 Xwindows 를 기본 환경으로 사용하겠다는 것이다. 여기에 오는 숫자는 5나 3이 적당할 것이다.
5와 3이 모든 서비스를 사용할 수 있는 완전한 기능이다. 만약 이 부분의 숫자를 0 이나 6을 적게 되면 시스템이
부팅되자마자 꺼지거나 리부팅 될 것이다.
si::sysinit:/etc/rc.d/rc.sysinit => 시스템 초기화 스크립트를 실행하는 부분이다.
기본적인 환경변수를 결정하고 하드디스크 검사등을 수행하는 단계이다.
23 라인 ~ 29 라인중 디폴트 runlevel이 3인 경우에는 실행되는 부분은 26라인이다.
다른 행은 실행되지 않는다. runlevel 필드와 현재 runlevel 이 일치하는 행만 실행된다.
26 라인 l3:3:wait:/etc/rc.d/rc 3 : rc 스크립트에 현재 런레벨과 같은 번호인 3을 인수로 전달하여 실행한다는
것이다. 런레벨 0에서 6까지 실행되는 스크립트는 rc 로 다 똑같다.
단지 인수만 다르다는 것을 알 수 있다. action 필드의 wait 는 이 스크립트를 다 수행할 때까지는 다음 행을
실행하지 말고 기다리라는 의미이다.
rc 스크립트 file을 열 줄만 출력해 보자.
[root@server root]# cat -n /etc/rc.d/rc | head -10
1 #! /bin/bash
2 #
3 # rc This file is responsible for starting/stopping
4 # services when the runlevel changes.
5 #
6 # Original Author:
7 # Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
8 #
9
10 # check a file to be a correct runlevel script[root@server root]#
스크립트를 이해하기 위해 굳이 하나하나 분석하지 않아도 된다. 주석이 잘 붙어있기 때문이다. 주석을 참조하라.
rc 스크립트가 실행하는 내용이 주석으로 설명이 잘 붙어있다.
소스 중간에 보면 ...
53 # First, run the KILL scripts.
54 for i in /etc/rc$runlevel.d/K* ; do
55 check_runlevel "$i" || continue
56
57 # Check if the subsystem is already up.
58 subsys=${i#/etc/rc$runlevel.d/K??}
59 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
60 || continue
61
62 # Bring the subsystem down.
63 if egrep -q "(killproc |action )" $i ; then
64 $i stop
65 else
66 action $"Stopping $subsys: " $i stop
67 fi
68 done
69
70 # Now run the START scripts.
71 for i in /etc/rc$runlevel.d/S* ; do
72 check_runlevel "$i" || continue
73
74 # Check if the subsystem is already up.
75 subsys=${i#/etc/rc$runlevel.d/S??}
76 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
77 && continue
78
79 # If we're in confirmation mode, get user confirmation
80 if [ -n "$CONFIRM" ]; then
81 confirm $subsys
82 case $? in
83 0) :;;
84 2) CONFIRM=;;
85 *) continue;;
86 esac
87 fi
88
89 # Bring the subsystem up.
90 if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
91 export LC_ALL=C
92 exec $i start
93 fi
94 if egrep -q "(daemon |action |success |failure )" $i 2>/dev/null \
95 || [ "$subsys" = "single" -o "$subsys" = "local" ]; then
96 $i start
97 else
98 action $"Starting $subsys: " $i start
99 fi
100 done
출력된 스크립트 부분은 /etc/rc$runlevel.d/K* 파일은 stop 인수를 넘겨주고 실행하라는 것이며
/etc/rc$runlevle.d/S* 파일은 start 인수를 넘겨주고 실행하라는 것이다.
$runlevel은 현재의 runlevel 숫자가 저장되는 변수이다. runlevel 3일 때는 아래에 있는 파일들이
다 실행된다는 의미이다.
[root@server root]# cd /etc/rc3.d
[root@server rc3.d]# ls
K05saslauthd K34yppasswdd K45named K54pxe K95firstboot S10network S17keytable S26apmd
S56xinetd S90cups S97rhnsdK15httpd K35smb K50snmpd K74ntpd S05kudzu S12syslog
S20random S28autofs S80sendmail S90xfs S99localK20nfs K35winbind K50snmptrapd K74ypserv
S08iptables S13portmap S24pcmcia S55sshd S85gpm S95anacronK24irda K36lisa K50vsftpd
K74ypxfrd S09isdn S14nfslock S25netfs S56rawdevices S90crond S95atd
[root@server rc3.d]#
여기에 있는 각 스크립트는 모두 비슷하게 프로그래밍 되어 있으며 아래와 같은 소스를 거의 다 포함하고 있다.
아래 소스는 K45named 파일의 일부이다.
# See how we were called.
case "$1" in
start)
start => start 함수 호출 (데몬 죽이는 함수) ;;
stop)
stop => stop 함수 호출(데몬 올리는 함수) ;;
status)
rhstatus ;;
restart)
restart ;;
condrestart)
[ -e /var/lock/subsys/named ] && restart ;;
reload)
reload ;;
probe)
probe ;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|probe}"
exit 1
esac
exit $?
이 소스코드를 실행할 때 start 인수 및 stop 인수가 전달되면 어떻게 되는지 알 수 있다.
즉 K 문자로 시작되는 위의 파일명과 관련된 데몬은 부팅 시 자동 실행되지 않으면 S 문자로 시작되는 파일명과
관련 있는 데몬은 설정에 아무런 문제가 없다면 메모리에 올라갈 것이고 그렇지 않은 경우에는 실행되지 않도록
프로그램이 되어있다.
[root@server rc3.d]# who -r
run-level 3 Apr 26 20:44 : 현재 runlevel이 3이다.
[root@server rc3.d]# pgrep -fl sendmail
1689 sendmail1698 sendmail
[root@server rc3.d]# pgrep -fl vsftpd
[root@server rc3.d]#
메모리에 sendmail은 올라와 있고 ftp서버는 없다. 왜 그런지는 /etc/rc3.d/* 파일을 보면 알 수 있을것이다.
그러면 메일서버가 필요 없다고 가정하여 부팅시 sendmail 데몬이 자동 실행되지 않도록 하려면 ?
/etc/rc3.d/S*sendmail 파일을 첫 글자가 대문자 S가 아닌 K나 다른 문자로 바꾸면 된다.
또는 그렇게 하는 것이 번거롭거나 어렵다면 setup 명령어로 쉽게 할 수도 있다. 결과는 같다.
setup tool 을 실행하면 몇 개의 메뉴가 보이는데 거기에서 system service 항목을 선택하면
부팅시 자동으로 올라오는 서비스의 목록이 보인다.
체크표시가 되어 있는 것이 부팅시 자동으로 올라오는 서비스들이다.
부팅시 특정 데몬을 구동하거나 반대로 구동하지 않으려면 체크표시를 하거나 체크표시를 없애면 된다.
선택은 스페이스 바로 한다. 예를 들어서 crond 에 체크를 없애면 현재 runlevel 이 만약 3이라고 가정한다면 /etc/rc3.d/S**crond 파일명이 /etc/rc3.d/K**crond 파일명으로 자동 변경될 것이며 이렇게 되면
runlevel 3으로 부팅시 cron demon 이 메모리에 자동으로 올라오지 않게 된다.
runlevel 0 즉 시스템을 끌때의 과정은 /etc/rc0.d/ 디렉토리의 파일과 관련있다.
[root@server rc3.d]# ls /etc/rc0.d
K03rhnsd K05saslauthd K15httpd K30sendmail K36lisa K50snmptrapd
60crond K74ypserv K86nfslock K91isdn K96pcmciaK05anacron K10cups
K20nfs K34yppasswdd K44rawdevices K50vsftpd K72autofs K74ypxfrd K87portmap
.... 이하생략
당연히 끄는 경우에는 데몬을 메모리에 올릴 필요 없으며 오히려 다 내려야 한다.
파일명을 보면 알겠지만 그렇게 되어있다. 끌 때 필요한 halt 와 프로세스를 모두 죽일 때 사용하는
killall 을 제외하고 다 첫문자가 K 이다.
32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now
이 부분은 ctrl+alt+del 키에 대한 내용이다. ctrl+alt+del 키를 누르면 오른쪽 끝의 shutdown 명령이 실행되면서
rebooting 된다. ctrl+alt+del로 리부팅하는것도 안전한 종료방법이라는것을 알 수 있다.
MSwindos 환경의 가상머신에서는 안될 수 있다. (ctrl+alt+del 키가 mswindows 에서도 사용하는 키이기 때문)
44 # Run gettys in standard runlevels
45 1:2345:respawn:/sbin/mingetty tty1
46 2:2345:respawn:/sbin/mingetty tty2
47 3:2345:respawn:/sbin/mingetty tty3
48 4:2345:respawn:/sbin/mingetty tty4
49 5:2345:respawn:/sbin/mingetty tty5
50 6:2345:respawn:/sbin/mingetty tty6
가상 콘솔에 관련된 부분이다. 가상콘솔을 (tty1 ~ tty6까지)6개까지 사용할 수 있도록 되어 있다.
mingetty 프로세스가 가상콘솔을 관리하는 역할을 하며 login 프로세스를 감시한다.
사용자가 특정 가상콘솔로 login 하면 mingetty 프로세스가 하나 죽는다. 그리고 그 사용자가 logout 하면
다시 mingetty 프로세스가 메모리에 올라간다. 액션부분의 respawn 이 바로 그것을 의미한다.
root 패스워드를 분실한 경우 싱글유저 모드로 들어가면 로그인 절차 없이 바로 로그인 되는데 그 이유가
mingetty 프로세스는 싱글유저모드(런레벨1)에서는 실행되지 않기 때문이다.
52 # Run xdm in runlevel 5
53 x:5:respawn:/etc/X11/prefdm -nodaemon : runlevel 5에서만 실행되는 부분이다.
부팅 장애시 복구방법
장애 복구
xwindows 설정이 잘못되어 화면출력이 되지 않거나 root 사용자가 패스워드를 분신하였거나 또는 파일시스템이
문제가 있는 등 정상적으로 부팅이 안 될 경우에는 싱글유저 모드로 부팅하여 복구할 수 있는데 싱글유저 모드는
mswindows의 안전모드와 유사하다고 생각하면 된다.
싱글유저 모드로 부팅하면 가상콘솔을 지원하지 않으면 단 하나의 콘솔만사용할 수 있으며
네트워크 서비스 되지 않는다. 인터페이스도 불편해진다.
1.root 패스워드를 잊어버린 경우
부트로더가 lilo 인경우
부트로더 화면에서 ctrl+x 를 입력하면 텍스트화면으로 바뀌게 되면 화면상단에 boot: 표시가 보인다.
여기서 tab 키를 입력하면
boot:redhat (레이블명)
이렇게 label 명이 보인다. 그 레이블명을 사용해서 부팅하면 된다.
boot: redhat single => single user mode 를 선택하면 login 절차 생략이다.
그러므로 패스워드 없이 바로 root login 이 가능하다. 그렇게 부팅하더라도 물론 패스워드는
아래처럼 암호화되어 있으므로 알지 못한다. 패스워드를 다른 것으로 변경하고 나오면 된다.
sh-2.05b# head -1 /etc/shadow
root:$1$0lvCjXwW$JwSLfSuCJGtHebt.0BJGr/:13587:0:99999:7:::sh-2.05b#
패스워드 변경후 reboot 하면 된다.
부트로더가 grub 인 경우
부트로더 화면에서 레이블 명 선택후 'e' 입력후 편집상태에서 single 또는 숫자 1을 맨 뒤에 입력한다.
그 다음 'b' 명령으로 부팅하면 single user 모드로 login 된다. 그 다음과정은 lilo와 같다.
2. Xwindows 설정 문제로 화면이 보이지 않는경우
화면이 보이지 않으면 당연히 명령어를 제대로 입력할 수도 없다.이럴 경우에는 텍스트 모드로 변경 후
Xwindows 설정을 다시 해야 한다.
역시 single user 모드로 부팅 후
sh-2.05b# grep initdefault /etc/inittab
# 0 - halt (Do NOT set initdefault to this)
# 6 - reboot (Do NOT set initdefault to this)
id:5:initdefault: <= 5 라는 숫자를 3으로 바꿔주면 된다.
sh-2.05b#
3. file system 장애
file system에 문제가 있는 경우 부팅하면 아래와 같은 메세지가 보이게 된다.
*** An error occurred during the file system
check.*** Dropping you to a shell; the system will reboot
*** when you leave the shell.
Give root password for maintenance(or type Control-D to continue) :
여기서 root 패스워드를 입력하든지 ctl+d 를 입력하든지 둘 중 하나를 선택해야 한다.
그러나 ctrl+d 를 입력하면 rebooting 이 되겠지만 또 다시 저 메세지가 보이고 멈추게 될 것이다.
file system 에 문제가 있다면 고치기전에는 리부팅해도 마찬가지인 것이다.
그러므로 복구하기위해서는 여기에서 root 패스워드를 입력하고 login후 file system 에러를 고쳐야 한다.
login 후 화면에는(Repair filesystem) 1 # <= 이렇게 출력된다. 파일시스템 복구모드로 진입한 것이다.
파일시스템 에러가 발생하는 많은 경우는 fstab 파일에 대한 정보가 잘 못된 경우이다.
예를 들면 포맷이 되어 있지 않은 파티션을 마운트 하도록 설정이 되었거나 또는 존재하지 않는 장치를
마운트 하려고 하는 경우 등.
이런 경우에는 파티션 정보를 확인하고 fstab 파일도 적절히 수정한 후 리부팅하면 된다.
4. 부트로더가 잘 못 설치되거나 삭제 된 경우
- 부트로더 설정을 확인해보고 잘못된 부분이 있다면 수정한 후 새로 설치해야 한다.
* 부트로더가 제대로 동작할 수 없으면 커널을 메모리에 적재하지 못하므로 당연히 부팅할 수 없다.
이런 경우에는 부트로더 대신 사용자가 시디롬을 이용하여 커널을 직접 메모리에 올려주는 방법이 있다.
설치시디중 1번 시디에 리눅스 커널이 포함되어 있다. 1번 시디로 부팅후
boot: 화면이 보이면 엔터키를 치지 말고(엔터키를 치면 리눅스 설치모드가 된다.)
boot: vmlinuz root=/dev/sda <= vmlinuz 는 시디에 있는 커널이다.
뒤에 인수는 init 프로세스를 생성하기 위함이다. linux 의 root 파티션을 적으면 된다.
커널만으로는 부팅이 안 되며 부팅 마지막 단계에는 init 프로세스가 동작해야 한다.
init 프로세스 생성은 디스크를 통해서 한다 .
위와 같은 명령어로 안 되면 또 다른 방법이 있다.설치시디중 1번 시디 넣고 부팅한 다음
boot: linux rescue 를 입력하면 login 할 수 있을 것.
linux rescue 를 입력하고 기다리면 설치화면과 유사한 몇 가지 내용이 나온다.
거기에서 적절히 답한다. 그리고 network 설정에 대해서도 물어보는데 network 설정은 그냥 skip 한다.
부팅이 다 되면 chroot /mnt/sysimage 후 lilo 명령만 한번 실행해주면 끝.
chroot 는 change root directory 라는 의미이다. / 파티션이 / 가 아닌 /mnt/sysimage 디렉토리에 마운트 된다면
기존의 설정파일 경로가 /mnt/sysimage 이하의 경로로 다 바뀌므로 chroot 명령으로 /mnt/sysimage를 / 파티션으로
사용하겠다는 의미이다.
* boot 로더가 grub 인 경우
linux rescue 모드로 부팅 후
grub-install /dev/hda <= 부트로더가 재설치됨.
rescue 모드로 부팅하면 / 파티션이 /mnt/sysimage 디렉토리에 마운트 되므로 그 상태에서 lilo 명령을
실행하면 당연히 되지 않는다. 왜냐하면 /etc/lilo.conf 가 /mnt/sysimage/etc/lilo.conf 로 경로가 변경되었기
때문이다.
그래서 chroot /mnt/sysimage 라는 명령을 입력한다.
이 명령은 change root 디렉토리라는 의미로 chroot 뒤의 경로에 해당하는 인수를 “/” 로 변경하겠다는 것이다.
그러면 / 파티션이 / 디렉토리에 마운트 된 것과 마찬가지가 되므로 lilo 명령을 실행하는데 아무런 문제가 없다.
만약 lilo 실행할 때 에러가 난다면 lilo 설정파일인 /etc/lilo.conf 파일을 확인한 후 문제가 있다면 수정 후 다시
lilo 명령을 아무런 옵션 없이 입력한다. lilo 명령은 부트로더를 설치하는 명령어이다
====================================================== 예제.
#!/bin/bash
case "$1" in
start)
echo "testsvr started [ok]" > /tmp/start.txt
;;
stop)
echo "testsvr stopped [ok]" > /tmp/stop.txt
;;
*)
echo "Usage:$0 {start|stop}"
;;
esac
1. 전원 ON.
2. ROM BIOS promgram이 POST 진행
3. 부트로더 실행
4. 커널이미지 메모리 적재
5. init 프로세스 실행
6. login
1번과 2번은 하드웨어에 관련된 부분
리눅스와 직접 관련된 3 ~ 6 부분
컴퓨터 전원을 켜면 롬에 저장되어 있는 프로그램에 의해 POST(Power On Self Test) 를 진행한다.
cpu,디스크,주변장치,메모리등 기본적인 하드웨어 진단을 한다. 이 과정에서 특별한 문제가 없다면
하드디스크 또는 다른 부팅매체의 0번 섹터(MBR(Master Boot Record)라고 한다)의 부트프로그램을 읽는다.
설치된 OS에 따라 여기에는 lilo 또는 grub 아니면 다른 OS의 부트로더가 들어 있을 수 있다.
과거의 부트로더 화면은 텍스트 모드였으나 요즘은 대개 그래픽 화면이다.
redhat linux 인 경우 그래픽 화면의 부트로더에서 텍스트 화면을 선택할 수 도 있는데 부팅시 어떤 문제가 있는
경우 장애 해결을 위해서 일반적으로 사용된다.
하드웨어 진단이 완료된 후 부트로더가 실행되면 MBR 영역에 설치된 부트로더 화면이 뜬다.
*. 부트로더가 lilo 인경우
부트로더 그래픽 화면인데 그림 왼쪽하단의 설명처럼 ctrl+x 를 누르면 과거의 리눅스처럼 텍스트 부트로더 화면으로
들어가게 된다. 리눅스와 다른 OS 가 같이 설치된 경우라면 다른 OS를 선택해서 부팅할 수도 있다.
아무런 키 입력이 없으면 5초후 자동으로 부팅을 시작한다. 부트로더 화면에서 멈추게 하려면 방향키를 한번 입력하면
부팅과정으로 넘어가지 않는다. 그 상태에서 그냥 부팅하려면 엔터키를 입력
* 부트로더가 grub 인 경우
[root@linux ~]# cat /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0 => 첫번째 title 에 있는 이미지로 부팅
timeout=5 => 부팅시 5초간 아무런 키 입력이 없으면 디폴트 OS 로 부팅 시작.
splashimage=(hd0,0)/boot/grub/splash.xpm.gz => grub 부트로더 메뉴 이미지를 보이게 하는 설정
splasy.xpm.gz 는 압축된 그림파일
hiddenmenu => 부팅시 grub 부트로더 메뉴를 숨긴다.
title Fedora Core (2.6.11-1.1369_FC4) => 부팅 이미지 레이블명
root (hd0,0) => 부트 파티션 hd0,0 은 첫번째 디스크의 첫번째 파티션.
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet => 커널이미지 파일,
rhgb는 redhat graphic boot loader를 의미.
initrd /boot/initrd-2.6.11-1.1369_FC4.img => initrd의 이미지 명
[root@linux ~]#
*. grub boot loader 에 암호걸기
- single user mode 로 누구나 시스템에 root 권한으로 접근하는 것을 막으려면 boot loader 에
암호를 걸어두면 된다.
grub 실행후
grub>md5crypt
password : ********** 패스워드 입력
Encrypted : $a$bPD$ao323$... <= 이 암호를 복사해서 붙여 넣기 하면 된다.
출력된 값을복사해서 grub.conf 파일 맨 아래에 password --md5 $a$bPD$ao323$... 추가한다음 리부팅하면 부팅시 암호를 요구한다.
password --md5 $a$bPD$ao323$...를 splashimage=(hd0,0)/boot/grub/splash.xpm.gz 바로 아래줄에 쓰게되면
부팅시 grub 메뉴에서 'e'를 눌러 수정할 때만 암호를 요구한다.
다음 단계는 압축된 커널이미지 메모리 적재 단계이다.
*. 부트로더가 lilo 인경우.
부트로더가 하나의 커널이미지를 상징하는 레이블명을 선택하면 부트로더는 자신의 설정파일에서 레이블명에
해당하는 커널이미지를 지정된 디렉토리에서 찾아서 메모리로 올린다. l
ilo 가 참조하는 설정파일은 lilo.conf 이다.
커널이미지는 디스크에 압축된 하나의 이미지로 존재하는데 redhat linux 인 경우 보통 /boot 디렉토리에 위치한다.
커널 이름은 어떤 이름이라도 상관없다. 파일명과 경로가 lilo.conf에 정확히 지정되어 있으면 된다.
그러나 커널이름은 보통 리눅스 개발자 이름을 따서 vmlinuz 라는 이름을 많이 사용한다.
redhat 리눅스는 커널 설정파일은 따로 존재하지 않는다.
(커널소스코드 컴파일시 어떠한 필요한 기능이나 디바이스를 지원하기 위한 설정은 있다.)
커널이 메모리에 올라가면 리눅스를 사용하기 위한 여러가지 하드웨어를 체크하고 각종 프로토콜을 올린다.
하드웨어 체크는 bios 단계에서 실행된 POST 와는 다른 것이다. 디스크 검사를 예를 들면 bios 단계에서
물리적인 디스크 연결 상태를 체크한다면 이 단계에서는 파티션 설정 등을 체크한다.
그리고 swapper라고도 불리는 pid 0번이 프로세스가 실행되는데 이 프로세스는 메모리관리,
프로세스관리 등을 수행한다.
그리고 init 프로세스를 생성한다.
init 프로세스는 pid 가 1번이다. 리눅스의 모든 프로세스는 부모 프로세스를 갖는데 init 프로세스의
부모 프로세스가 pid 0번인 swapper 이다. swapper 는 프로세스 리스트에서도 볼 수 없으며 부모 프로세스도 없다.
swapper는 fork() 로 만들어지는 프로세스가 아니다. 커널 자체라고 생각하면 된다.
init 프로세스는 실행 후 login 이 뜨기까지 자신의 설정파일에 따라 runlevel을 결정하고 그에 따른 여러 가지
스크립트를 실행한다. 우리가 실행한 적이 없는데도 메모리에 올라와 있는 여러 가지 데몬들도 init 프로세스에
의해 실행된 것이다.
부팅과정중 init 프로세스의 역할은 /etc/inittab file을 따른다.
아래는 /etc/inittab file을 캡쳐한 것이다.
1 #
2 # inittab This file describes how the INIT process should set up
3 # the system in a certain run-level.
4 #
5 # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
6 # Modified for RHS Linux by Marc Ewing and Donnie Barnes
7 #
8
9 # Default runlevel. The runlevels used by RHS are:
10 # 0 - halt (Do NOT set initdefault to this)
11 # 1 - Single user mode
12 # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
13 # 3 - Full multiuser mode
14 # 4 - unused => 이 런레벨은 사용되지 않는 것이다.
15 # 5 - X11 => X11 은 Xserver 버전을 나타내는 것으로 Xwindow 환경의 unlevel을 뜻한다.
16 # 6 - reboot (Do NOT set initdefault to this)
17 #
18 id:3:initdefault: => 여기에 숫자가 5가 적혀 있다면 부팅시 바로 Xwindow 환경으로 들어가게 된다.
19
20 # System initialization.
21 si::sysinit:/etc/rc.d/rc.sysinit
22
23 l0:0:wait:/etc/rc.d/rc 0
24 l1:1:wait:/etc/rc.d/rc 1
25 l2:2:wait:/etc/rc.d/rc 2
26 l3:3:wait:/etc/rc.d/rc 3
27 l4:4:wait:/etc/rc.d/rc 4
28 l5:5:wait:/etc/rc.d/rc 5
29 l6:6:wait:/etc/rc.d/rc 6
30
31 # Trap CTRL-ALT-DELETE
32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now
33
34 # When our UPS tells us power has failed, assume we have a few minutes
35 # of power left. Schedule a shutdown for 2 minutes from now.
36 # This does, of course, assume you have powerd installed and your
37 # UPS connected and working correctly.
38 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
39
40 # If power was restored before the shutdown kicked in, cancel it.
41 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
42
43
44 # Run gettys in standard runlevels
45 1:2345:respawn:/sbin/mingetty tty1
46 2:2345:respawn:/sbin/mingetty tty2
47 3:2345:respawn:/sbin/mingetty tty3
48 4:2345:respawn:/sbin/mingetty tty4
49 5:2345:respawn:/sbin/mingetty tty5
50 6:2345:respawn:/sbin/mingetty tty6
51
52 # Run xdm in runlevel 5
53 x:5:respawn:/etc/X11/prefdm -nodaemon
*. 편의상 라인번호를 붙여서 출력하였다.
설정파일 자체는 복잡하지 않은데 이 설정파일에 의해 실행되는 스크립트를 이해하는것은 다소 어렵다.
inittab 설정파일 역시 도움말이 준비되어 있다.
INITTAB(5) Linux System Administrator's Manual INITTAB(5)
NAME inittab - format of the inittab file used by the sysv-compatible
init processDESCRIPTION The inittab file describes which processes are started at bootup and
during normal operation (e.g. /etc/init.d/boot, /etc/init.d/rc, get- tys...).
Init(8) distinguishes multiple runlevels, each of which can have its own set of processes that are started.
Valid runlevels are 0-6 plus A, B, and C for ondemand entries. An entry in the inittab
file has the following format:
id:runlevels:action:process
Lines beginning with `#' are ignored.
id is a unique sequence of 1-4 characters which identifies an entry
in inittab (for versions of sysvinit compiled with libraries < 5.2.18 or a.out libraries the limit is
2 characters).
Note: For gettys or other login processes, the id field should be the tty suffix of the
corresponding tty,
e.g. 1 for tty1. Otherwise, the login accounting might not work correctly.
......
manual page 안에 상세히 설명되어 있으니 manual page 를 보는 것만으로도 설정파일을 이해하는데 많은
도움이 될 것이다 설정파일이 대게 그렇듯이 여기서도 "#" 은 주석이다.
각 라인은 위에 manual page 에 나와있듯이 id:runlevels:action:process <= 이런 형태이다.
여기서 id 필드는 특별한 의미가 없으며 각 라인을 구분하기 위한 용도라고 생각하면 된다.
여기에 올수 있는 문자수는 최대 4글자(도움말 참조)
runlevel :이 부분은 중요하다.
여기에 오는 숫자에 따라 실행되는 스크립트 및 프로세스가 다를 수 있다.
위에 주석에도 설명이 나와 있듯이 runlevel의 종류는 여섯 가지이다.
그러나 4번은 사용되지 않는다. 그래서 실제로는 5가지로 보면 된다.
우리가 시스템을 끄는것도 결국 runlevel 전환이며 rebooting 도 마찬가지이다.
action : 각 라인을 수행하는 방법. 여기에는 sysinit,wait,nowait,respawn 등이 올 수 있다.
process : 실행할 스크립트 및 프로세스이다.
id:5:initdefault: 디 폴트 런레벨을 결정하는 부분이다. 숫자 5는 부팅 시 runlevel을 5로 하겠다는 것이며
이는 Xwindows 를 기본 환경으로 사용하겠다는 것이다. 여기에 오는 숫자는 5나 3이 적당할 것이다.
5와 3이 모든 서비스를 사용할 수 있는 완전한 기능이다. 만약 이 부분의 숫자를 0 이나 6을 적게 되면 시스템이
부팅되자마자 꺼지거나 리부팅 될 것이다.
si::sysinit:/etc/rc.d/rc.sysinit => 시스템 초기화 스크립트를 실행하는 부분이다.
기본적인 환경변수를 결정하고 하드디스크 검사등을 수행하는 단계이다.
23 라인 ~ 29 라인중 디폴트 runlevel이 3인 경우에는 실행되는 부분은 26라인이다.
다른 행은 실행되지 않는다. runlevel 필드와 현재 runlevel 이 일치하는 행만 실행된다.
26 라인 l3:3:wait:/etc/rc.d/rc 3 : rc 스크립트에 현재 런레벨과 같은 번호인 3을 인수로 전달하여 실행한다는
것이다. 런레벨 0에서 6까지 실행되는 스크립트는 rc 로 다 똑같다.
단지 인수만 다르다는 것을 알 수 있다. action 필드의 wait 는 이 스크립트를 다 수행할 때까지는 다음 행을
실행하지 말고 기다리라는 의미이다.
rc 스크립트 file을 열 줄만 출력해 보자.
[root@server root]# cat -n /etc/rc.d/rc | head -10
1 #! /bin/bash
2 #
3 # rc This file is responsible for starting/stopping
4 # services when the runlevel changes.
5 #
6 # Original Author:
7 # Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
8 #
9
10 # check a file to be a correct runlevel script[root@server root]#
스크립트를 이해하기 위해 굳이 하나하나 분석하지 않아도 된다. 주석이 잘 붙어있기 때문이다. 주석을 참조하라.
rc 스크립트가 실행하는 내용이 주석으로 설명이 잘 붙어있다.
소스 중간에 보면 ...
53 # First, run the KILL scripts.
54 for i in /etc/rc$runlevel.d/K* ; do
55 check_runlevel "$i" || continue
56
57 # Check if the subsystem is already up.
58 subsys=${i#/etc/rc$runlevel.d/K??}
59 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
60 || continue
61
62 # Bring the subsystem down.
63 if egrep -q "(killproc |action )" $i ; then
64 $i stop
65 else
66 action $"Stopping $subsys: " $i stop
67 fi
68 done
69
70 # Now run the START scripts.
71 for i in /etc/rc$runlevel.d/S* ; do
72 check_runlevel "$i" || continue
73
74 # Check if the subsystem is already up.
75 subsys=${i#/etc/rc$runlevel.d/S??}
76 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
77 && continue
78
79 # If we're in confirmation mode, get user confirmation
80 if [ -n "$CONFIRM" ]; then
81 confirm $subsys
82 case $? in
83 0) :;;
84 2) CONFIRM=;;
85 *) continue;;
86 esac
87 fi
88
89 # Bring the subsystem up.
90 if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
91 export LC_ALL=C
92 exec $i start
93 fi
94 if egrep -q "(daemon |action |success |failure )" $i 2>/dev/null \
95 || [ "$subsys" = "single" -o "$subsys" = "local" ]; then
96 $i start
97 else
98 action $"Starting $subsys: " $i start
99 fi
100 done
출력된 스크립트 부분은 /etc/rc$runlevel.d/K* 파일은 stop 인수를 넘겨주고 실행하라는 것이며
/etc/rc$runlevle.d/S* 파일은 start 인수를 넘겨주고 실행하라는 것이다.
$runlevel은 현재의 runlevel 숫자가 저장되는 변수이다. runlevel 3일 때는 아래에 있는 파일들이
다 실행된다는 의미이다.
[root@server root]# cd /etc/rc3.d
[root@server rc3.d]# ls
K05saslauthd K34yppasswdd K45named K54pxe K95firstboot S10network S17keytable S26apmd
S56xinetd S90cups S97rhnsdK15httpd K35smb K50snmpd K74ntpd S05kudzu S12syslog
S20random S28autofs S80sendmail S90xfs S99localK20nfs K35winbind K50snmptrapd K74ypserv
S08iptables S13portmap S24pcmcia S55sshd S85gpm S95anacronK24irda K36lisa K50vsftpd
K74ypxfrd S09isdn S14nfslock S25netfs S56rawdevices S90crond S95atd
[root@server rc3.d]#
여기에 있는 각 스크립트는 모두 비슷하게 프로그래밍 되어 있으며 아래와 같은 소스를 거의 다 포함하고 있다.
아래 소스는 K45named 파일의 일부이다.
# See how we were called.
case "$1" in
start)
start => start 함수 호출 (데몬 죽이는 함수) ;;
stop)
stop => stop 함수 호출(데몬 올리는 함수) ;;
status)
rhstatus ;;
restart)
restart ;;
condrestart)
[ -e /var/lock/subsys/named ] && restart ;;
reload)
reload ;;
probe)
probe ;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|probe}"
exit 1
esac
exit $?
이 소스코드를 실행할 때 start 인수 및 stop 인수가 전달되면 어떻게 되는지 알 수 있다.
즉 K 문자로 시작되는 위의 파일명과 관련된 데몬은 부팅 시 자동 실행되지 않으면 S 문자로 시작되는 파일명과
관련 있는 데몬은 설정에 아무런 문제가 없다면 메모리에 올라갈 것이고 그렇지 않은 경우에는 실행되지 않도록
프로그램이 되어있다.
[root@server rc3.d]# who -r
run-level 3 Apr 26 20:44 : 현재 runlevel이 3이다.
[root@server rc3.d]# pgrep -fl sendmail
1689 sendmail1698 sendmail
[root@server rc3.d]# pgrep -fl vsftpd
[root@server rc3.d]#
메모리에 sendmail은 올라와 있고 ftp서버는 없다. 왜 그런지는 /etc/rc3.d/* 파일을 보면 알 수 있을것이다.
그러면 메일서버가 필요 없다고 가정하여 부팅시 sendmail 데몬이 자동 실행되지 않도록 하려면 ?
/etc/rc3.d/S*sendmail 파일을 첫 글자가 대문자 S가 아닌 K나 다른 문자로 바꾸면 된다.
또는 그렇게 하는 것이 번거롭거나 어렵다면 setup 명령어로 쉽게 할 수도 있다. 결과는 같다.
setup tool 을 실행하면 몇 개의 메뉴가 보이는데 거기에서 system service 항목을 선택하면
부팅시 자동으로 올라오는 서비스의 목록이 보인다.
체크표시가 되어 있는 것이 부팅시 자동으로 올라오는 서비스들이다.
부팅시 특정 데몬을 구동하거나 반대로 구동하지 않으려면 체크표시를 하거나 체크표시를 없애면 된다.
선택은 스페이스 바로 한다. 예를 들어서 crond 에 체크를 없애면 현재 runlevel 이 만약 3이라고 가정한다면 /etc/rc3.d/S**crond 파일명이 /etc/rc3.d/K**crond 파일명으로 자동 변경될 것이며 이렇게 되면
runlevel 3으로 부팅시 cron demon 이 메모리에 자동으로 올라오지 않게 된다.
runlevel 0 즉 시스템을 끌때의 과정은 /etc/rc0.d/ 디렉토리의 파일과 관련있다.
[root@server rc3.d]# ls /etc/rc0.d
K03rhnsd K05saslauthd K15httpd K30sendmail K36lisa K50snmptrapd
60crond K74ypserv K86nfslock K91isdn K96pcmciaK05anacron K10cups
K20nfs K34yppasswdd K44rawdevices K50vsftpd K72autofs K74ypxfrd K87portmap
.... 이하생략
당연히 끄는 경우에는 데몬을 메모리에 올릴 필요 없으며 오히려 다 내려야 한다.
파일명을 보면 알겠지만 그렇게 되어있다. 끌 때 필요한 halt 와 프로세스를 모두 죽일 때 사용하는
killall 을 제외하고 다 첫문자가 K 이다.
32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now
이 부분은 ctrl+alt+del 키에 대한 내용이다. ctrl+alt+del 키를 누르면 오른쪽 끝의 shutdown 명령이 실행되면서
rebooting 된다. ctrl+alt+del로 리부팅하는것도 안전한 종료방법이라는것을 알 수 있다.
MSwindos 환경의 가상머신에서는 안될 수 있다. (ctrl+alt+del 키가 mswindows 에서도 사용하는 키이기 때문)
44 # Run gettys in standard runlevels
45 1:2345:respawn:/sbin/mingetty tty1
46 2:2345:respawn:/sbin/mingetty tty2
47 3:2345:respawn:/sbin/mingetty tty3
48 4:2345:respawn:/sbin/mingetty tty4
49 5:2345:respawn:/sbin/mingetty tty5
50 6:2345:respawn:/sbin/mingetty tty6
가상 콘솔에 관련된 부분이다. 가상콘솔을 (tty1 ~ tty6까지)6개까지 사용할 수 있도록 되어 있다.
mingetty 프로세스가 가상콘솔을 관리하는 역할을 하며 login 프로세스를 감시한다.
사용자가 특정 가상콘솔로 login 하면 mingetty 프로세스가 하나 죽는다. 그리고 그 사용자가 logout 하면
다시 mingetty 프로세스가 메모리에 올라간다. 액션부분의 respawn 이 바로 그것을 의미한다.
root 패스워드를 분실한 경우 싱글유저 모드로 들어가면 로그인 절차 없이 바로 로그인 되는데 그 이유가
mingetty 프로세스는 싱글유저모드(런레벨1)에서는 실행되지 않기 때문이다.
52 # Run xdm in runlevel 5
53 x:5:respawn:/etc/X11/prefdm -nodaemon : runlevel 5에서만 실행되는 부분이다.
부팅 장애시 복구방법
장애 복구
xwindows 설정이 잘못되어 화면출력이 되지 않거나 root 사용자가 패스워드를 분신하였거나 또는 파일시스템이
문제가 있는 등 정상적으로 부팅이 안 될 경우에는 싱글유저 모드로 부팅하여 복구할 수 있는데 싱글유저 모드는
mswindows의 안전모드와 유사하다고 생각하면 된다.
싱글유저 모드로 부팅하면 가상콘솔을 지원하지 않으면 단 하나의 콘솔만사용할 수 있으며
네트워크 서비스 되지 않는다. 인터페이스도 불편해진다.
1.root 패스워드를 잊어버린 경우
부트로더가 lilo 인경우
부트로더 화면에서 ctrl+x 를 입력하면 텍스트화면으로 바뀌게 되면 화면상단에 boot: 표시가 보인다.
여기서 tab 키를 입력하면
boot:redhat (레이블명)
이렇게 label 명이 보인다. 그 레이블명을 사용해서 부팅하면 된다.
boot: redhat single => single user mode 를 선택하면 login 절차 생략이다.
그러므로 패스워드 없이 바로 root login 이 가능하다. 그렇게 부팅하더라도 물론 패스워드는
아래처럼 암호화되어 있으므로 알지 못한다. 패스워드를 다른 것으로 변경하고 나오면 된다.
sh-2.05b# head -1 /etc/shadow
root:$1$0lvCjXwW$JwSLfSuCJGtHebt.0BJGr/:13587:0:99999:7:::sh-2.05b#
패스워드 변경후 reboot 하면 된다.
부트로더가 grub 인 경우
부트로더 화면에서 레이블 명 선택후 'e' 입력후 편집상태에서 single 또는 숫자 1을 맨 뒤에 입력한다.
그 다음 'b' 명령으로 부팅하면 single user 모드로 login 된다. 그 다음과정은 lilo와 같다.
2. Xwindows 설정 문제로 화면이 보이지 않는경우
화면이 보이지 않으면 당연히 명령어를 제대로 입력할 수도 없다.이럴 경우에는 텍스트 모드로 변경 후
Xwindows 설정을 다시 해야 한다.
역시 single user 모드로 부팅 후
sh-2.05b# grep initdefault /etc/inittab
# 0 - halt (Do NOT set initdefault to this)
# 6 - reboot (Do NOT set initdefault to this)
id:5:initdefault: <= 5 라는 숫자를 3으로 바꿔주면 된다.
sh-2.05b#
3. file system 장애
file system에 문제가 있는 경우 부팅하면 아래와 같은 메세지가 보이게 된다.
*** An error occurred during the file system
check.*** Dropping you to a shell; the system will reboot
*** when you leave the shell.
Give root password for maintenance(or type Control-D to continue) :
여기서 root 패스워드를 입력하든지 ctl+d 를 입력하든지 둘 중 하나를 선택해야 한다.
그러나 ctrl+d 를 입력하면 rebooting 이 되겠지만 또 다시 저 메세지가 보이고 멈추게 될 것이다.
file system 에 문제가 있다면 고치기전에는 리부팅해도 마찬가지인 것이다.
그러므로 복구하기위해서는 여기에서 root 패스워드를 입력하고 login후 file system 에러를 고쳐야 한다.
login 후 화면에는(Repair filesystem) 1 # <= 이렇게 출력된다. 파일시스템 복구모드로 진입한 것이다.
파일시스템 에러가 발생하는 많은 경우는 fstab 파일에 대한 정보가 잘 못된 경우이다.
예를 들면 포맷이 되어 있지 않은 파티션을 마운트 하도록 설정이 되었거나 또는 존재하지 않는 장치를
마운트 하려고 하는 경우 등.
이런 경우에는 파티션 정보를 확인하고 fstab 파일도 적절히 수정한 후 리부팅하면 된다.
4. 부트로더가 잘 못 설치되거나 삭제 된 경우
- 부트로더 설정을 확인해보고 잘못된 부분이 있다면 수정한 후 새로 설치해야 한다.
* 부트로더가 제대로 동작할 수 없으면 커널을 메모리에 적재하지 못하므로 당연히 부팅할 수 없다.
이런 경우에는 부트로더 대신 사용자가 시디롬을 이용하여 커널을 직접 메모리에 올려주는 방법이 있다.
설치시디중 1번 시디에 리눅스 커널이 포함되어 있다. 1번 시디로 부팅후
boot: 화면이 보이면 엔터키를 치지 말고(엔터키를 치면 리눅스 설치모드가 된다.)
boot: vmlinuz root=/dev/sda <= vmlinuz 는 시디에 있는 커널이다.
뒤에 인수는 init 프로세스를 생성하기 위함이다. linux 의 root 파티션을 적으면 된다.
커널만으로는 부팅이 안 되며 부팅 마지막 단계에는 init 프로세스가 동작해야 한다.
init 프로세스 생성은 디스크를 통해서 한다 .
위와 같은 명령어로 안 되면 또 다른 방법이 있다.설치시디중 1번 시디 넣고 부팅한 다음
boot: linux rescue 를 입력하면 login 할 수 있을 것.
linux rescue 를 입력하고 기다리면 설치화면과 유사한 몇 가지 내용이 나온다.
거기에서 적절히 답한다. 그리고 network 설정에 대해서도 물어보는데 network 설정은 그냥 skip 한다.
부팅이 다 되면 chroot /mnt/sysimage 후 lilo 명령만 한번 실행해주면 끝.
chroot 는 change root directory 라는 의미이다. / 파티션이 / 가 아닌 /mnt/sysimage 디렉토리에 마운트 된다면
기존의 설정파일 경로가 /mnt/sysimage 이하의 경로로 다 바뀌므로 chroot 명령으로 /mnt/sysimage를 / 파티션으로
사용하겠다는 의미이다.
* boot 로더가 grub 인 경우
linux rescue 모드로 부팅 후
grub-install /dev/hda <= 부트로더가 재설치됨.
rescue 모드로 부팅하면 / 파티션이 /mnt/sysimage 디렉토리에 마운트 되므로 그 상태에서 lilo 명령을
실행하면 당연히 되지 않는다. 왜냐하면 /etc/lilo.conf 가 /mnt/sysimage/etc/lilo.conf 로 경로가 변경되었기
때문이다.
그래서 chroot /mnt/sysimage 라는 명령을 입력한다.
이 명령은 change root 디렉토리라는 의미로 chroot 뒤의 경로에 해당하는 인수를 “/” 로 변경하겠다는 것이다.
그러면 / 파티션이 / 디렉토리에 마운트 된 것과 마찬가지가 되므로 lilo 명령을 실행하는데 아무런 문제가 없다.
만약 lilo 실행할 때 에러가 난다면 lilo 설정파일인 /etc/lilo.conf 파일을 확인한 후 문제가 있다면 수정 후 다시
lilo 명령을 아무런 옵션 없이 입력한다. lilo 명령은 부트로더를 설치하는 명령어이다
====================================================== 예제.
#!/bin/bash
case "$1" in
start)
echo "testsvr started [ok]" > /tmp/start.txt
;;
stop)
echo "testsvr stopped [ok]" > /tmp/stop.txt
;;
*)
echo "Usage:$0 {start|stop}"
;;
esac
댓글목록
등록된 댓글이 없습니다.