컴퓨터공부/Linux & Unix

Bash Shell 구동 과정 & 부팅순서

achivenKakao 2009. 6. 17. 08:20

1. init  : PID 1 process : /etc/inittab 

2. getty : tty : /sbin/mingetty 

3. login : /bin/login : 로그인 할때 /etc/passwd에서 ID를, /etc/shadow에서 패스워드를 참조 

4. bash : bash가 참조하는것들(실행한다고 생각하면 쉬움) : 공용 파일들

                                       /etc/profile: 환경번수, 사용자함수

                                       /etc/bashrc : 함수, alias 정보

                                       /etc/profile.d : 위의 두 파일을 참조하기 위해 필요한 파일

                                       개인 파일들(각각 개인 폴더에 산재)

                                       .bash_profile : 개인 설정파일

                                       .bashrc : alias 정보

 5. $) 사용자 프롬프트 나옴!

출처 : http://blog.naver.com/xinaburo2?Redirect=Log&logNo=68768286

+

3장. init : 그 이후

앞 절에서 설명한 바와 같이 init 프로세스가 자신에게 할당된 초기화 과정을 모두 끝마치고 나면, inittab 파일의 맨 끝부분에 명시된 것처럼 mingetty 혹은 getty 프로세스를 실행시킵니다. 실행시키는 방법은 최초에 pid 0 의 프로세스 [1] 에 의해 실행된 init 가 fork() 시스템 콜을 한번 수행하고, 그에 의해 생성된 자식 init 가 exec() 시스템 콜을 이용해서 getty 혹은 mingetty 등의 프로세스를 수행하게 됩니다.

getty 가 하는 일은 화면에

	login :
프롬프트를 띄우고서 사용자의 userid 가 입력되기를 기다리는 일입니다. 사용자가 자신의 userid 를 입력하고서 엔터키를 치게 되면, getty 는 /bin/login 을 실행시키게 됩니다.

/bin/login 프로그램은

	Password:
라는 프롬프트를 띄우고, 사용자가 password 를 입력하기를 기다립니다. 사용자가 암호를 입력하면, /etc/passwd 혹은 /etc/shadow 파일로부터 패스워드를 읽어서 암호화 한 패스워드와 일치하는지를 검사합니다. 만약 패스워드가 일치하지 않으면, login 프로그램은 에러를 내고 종료합니다. 그러면, init 프로세스는 다시 자신을 fork() 하고, /sbin/getty 프로그램을 exec() 해서 화면에 로그인 프롬프트를 출력하도록 하고 사용자의 입력을 기다리게 됩니다. 만약 패스워드가 일치하면, login 프로그램은 홈디렉토리를 바꾸는 등 여러가지 작업을 하고, 최종적으로 exec()를 하여, 로그인 쉘 [2] 을 띄우게 됩니다.

그러면, 사용자는 자신의 쉘 (주로 bash) 로 작업을 하고, 쉘에서 입력하는 명령어들은 먼저 쉘이 fork() 를 한 후 쉘의 자식프로세스가 exec() 를 하여 실행되고, 종료하는 것입니다. 이 과정을 간단하게 그림으로 그리면 다음과 같습니다.

        +-------------+
        |    init     |
        |   (pid 1)   |                                
        +------+------+
               | <-------------------------------------+
               | fork()                                | respawn
              \|/                                      |
        +------+------+                                |
        | "자식" init |                                |
        |  (pid 266)  |                                |
        +------+------+                                |
               |                                       |
               | exec()                                |
              \|/                                      |
        +------+------+                                |
        |  mingetty   |                                |
        |  (pid 266)  |                                |
        +------+------+                                |
               |                                       |
               | exec()                                |
              \|/                                      |
        +------+------+                                |
        |    login    |                                |
        |  (pid 266)  |                                |
        +------+------+                                |
               |                                       |
               | exec()                                |
              \|/                                      |
        +------+------+                                |
        |    bash     +---------------------------- 쉘 종료
        |  (pid 266)  |          로그아웃          
        +------+------+
               | 명령어 수행
               | fork()
              \|/
        +------+------+
        |    bash     |
        |  (pid5909)  |
        +------+------+
               |
               | exec()
              \|/
        +------+------+
        |다른 프로세스|
        |  (pid5909)  |
        +------+------+

주석

[1]

최초의 init 는 커널의 init 쓰레드에 의해 실행됩니다.

[2]

ps 를 수행했을 때 bash 등의 앞에 '-' 기호가 붙어서 -bash 등과 같이 표시된 것이 로그인 쉘입니다. 자세한 것은 다른 문서를 찾아보세요.


출처 : http://kldp.org/KoreanDoc/html/Boot_Process-KLDP/afterinit.html

+

1. 시스템 ON - Beep음(BIOS - 기본 입출력을 관장한다)                         ※55 AA?

2. 바이오스 프로그램 실행 - 모든 Device 검사 ( 검사를 위한 내용은 CMOS에 저장되어있다.)

CMOS(반도체,롬바이오스) 를 BIOS(펌웨어) 라는 프로그램으로 관리한다.

3.CMOS 부팅매체 검색 - 사용자가 지정한 부팅매체순으로 검색

※하드디스크에 부팅정보는 0번섹터 0번트랙(512 byte 만큼)에 존재한다(부트로더 GRUB, LILO 등... 최외부트랙)

<-- 이곳을(Mster Boot Record) MBR 이라고 한다.

그리고 512byte 마지막에 55 AA 부트로더 시그너쳐가 입력되어있다. 55 AA 로 부팅매체인지 아닌지를 확인한다.

4. 부트로더 실행 - 부트로더설정파일은 /boot/grub/grub.conf에 있다.

5. 커널부트 이미지 메모리에 적재 /boot/~/vmlinuz 파일이 부트순서를 담고있다.

6. PID 0번 (SWAPPER) 실행 - 커널 부트이미지 압축을 해제해주는 역할. 압축을 풀어서 나온 정보를 모니터에 뿌려준다.

7. / 디렉토리를 mount -

※마운트정보는 /etc/fstab 에 저장되어있다. 부팅할때 마운트도 /etc/fstab 의 정보를 참조한다.

8. init process 실행(PID 1번) - 모든 프로세스를 실행해준다. 프로세스 설정파일은 /etc/inittab 에 설정되어있다.

 

 

 

 

GRUB 설정파일

default = 0 - 부트이미지가 여러개일 경우 기본적으로 사용할 이미지 설정

timeout = 5 - 부팅 이미지 결정 대기 시간

splashimage = (hd0,0)<-부트트랙 0번섹터0번트랙 /grub/splash.xpm.gz  -  부트로더 배경 이미지.

hiddenmenu - timeout 전에 누르면 해당 내용을 설정할수 있게된다.

 

kernel /image ro root=LABEL=/ rhgb quiet vga = 791 <--vga 부분은해상도와 비트의 조합값

1024 * 768 8bit = 0x305=773

1024 * 768 16bit = 0x317=791

1024 * 768 32bit = 0x318=792

800 * 600 8bit = 0x303=771

800 * 600 16bit = 0x314=788

800 * 600 32bit = 0x315=789

 

/etc/inittab

run level 0 - halt

run level 1 - single user mode 복구 모드다. 서비스제공시 사용하지 않음

run level 2 - multi user mode NFS 서비스 없이 로컬에게만 서비스 제공

run level 3 - full multi user mode 일반적은 리눅스 모드 text모드

run level 4 - unused 정해지지 않았음

run level 5 - x window mode full multi user mode 의 GUI

run level 6 - reboot

 

System initialization

/etc/rc.d/rc 0 런레벨 설정파일들

 

run gettys in standard runlevels

1:2345:respawn:/sbin/mingetty tty1  터미널 1번은  2,3,4,5 런레벨을 호환 가능하다 설정파일은 /sbin/mingetty

.. 이하생략~

 

/etc/inittab -> /sbin/mingetty -> /bin/login (/etc/passwd /etc/shadow 인증) 로그인에 성공하면 bash 쉘을 뛰우는데

그전에 /etc/profile, bashrc, profile.d 에서 전체 설정을 적용하고

.bash_profile

.bashrc

에서 개인설정을 적용하여 쉘을 받는다.

 

 

호스트네임 별칭바꾸기는

 

/etc/sysconfig/network

 

getty protocol