본문 바로가기
Programming/Linux (Ubuntu)

Linux, 리눅스 시스템 부팅과정

by ★용호★ 2014. 11. 2.

리눅스 시스템 부팅과정


  • OS 시작 시 수행되는 script : /etc/inittab

  • 부팅메세지(bootup messages) : /var/log/dmesg

    • 내용이 무척 많기 때문에 방법이 필요

      • grep으로 원하는 문자열 검색 ($ grep 단어 /var/log/dmesg)

      • vi 모드에서 원하는 부분 검색

      • dmesg 명령어 사용 (dmesg | grep 단어)

    • Tip

      • 시스템 부팅 메세지 중 하드디스크 정보만 확인하기 : dmesg | grep sda

      • SCSI 타입의 하드디스크 정보만 확인하기 : dmesg | grep SCSI

      • IDE타입의 하드디스크 정보만 확인하기 : dmesg | grep hda

      • 시스템 부팅 메시지 중 NIC 정보만 확인하기 : dmesg | grep eth

      • USB 장치에 관한 부팅메시지만 확인하기 : dmesg | grep usb

      • 시스템 부팅 메시지 중 커널 정보만 확인하기 : dmesg | grep Linux

  • 메모리에 대한 상세한 정보 : /proc/meminfo

  • 부팅과정에서 발생하는 장애는 거의 60% 이상이 커널 패닉(kernel panic)이나 부트로더 에러(GRUB Error)  중 하나이다.


부팅 1단계 : ROM-BIOS 실행


  • ROM-BIOS : 컴퓨터 메인보드에 장착된 컴퓨터 부팅 시 가장 먼저 실행되는 프로그램 (컴퓨터 하드웨어 인식과 각 장치들의 사용을 위한 인식 및 준비를 위한 가장 기초적인 프로그램)

    • ROM-BIOS 프로그램은 CMOS에 들어있다.

    • ROM-BIOS라는 단어는 ROM(Read Only Memory)이라는 하드웨어에 들어있는 BIOS(Basic Input Output System)라는 의미


  • BIOS : 컴퓨터에 전원이 들어오면 자동실행 되는 CMOS에 들어있는 프로그램 (전원이 들어오는 즉시 자동 실행)

    • 전원이 들어오는 즉시 메모리의 특정 번지로 로드되어 적재된다.

    • CPU는 전원이 들어오면 즉시 메모리의 이 특정 주소에 있는 BIOS 명령들을 실행하도록 만들어져 있다.

    • ROM-BIOS는 ROM에 저장되어 있기 때문에 시스템 전원이 꺼지더라도 지워지지 않고 남아있다.

    • ROM-BIOS 프로그램 = CMOS 프로그램


  • ROM-BIOS 역할

    • POST 기능, 하드웨어의 각 장치들 인식 및 초기화

    • 부트로더 로딩 기능


  • POST(Power On Self Test) : 자체 진단 기능

    • 전원이 들어왔을 때 메인보드의 ROM-BIOS의 BIOS 프로그램들은 시스템에 장착된 하드웨어 장치들(CPU, RAM, DISK 등)을 하나씩 인식하기 시작한다. 인식하면서 이상유무를 체크한 후에 이사잉 없다면 각 장치가 사용될 수 있도록 모든 장치의 초기화를 수행한다. 에러가 발생할 경우 비프음으로 알린다.


  • 부트로더

    • 리눅스의 부트로더 종류는 LILO와 GRUB가 있는데 요즘 거의 대부분 GRUB

    • POST 단계에서 이미 현재 운영체제가 저장되어 있는 장치 또한 인식 되어 있다.  부트로더(GRUB)를 가지고 있는 부팅매체(하드디스크, CD-ROM, USB 등)를 검사하기 시작한다. 가장 먼저 검색된 하드디스크 장치에서 부트로더를 불러들인다. (이것이 OS 설치 시 CMOS 환경에서 CD-ROM이나 USB를 부팅 순서를 먼저해서 사용하는 이유이다.), 먼저 검색된 부팅매체의 0번 섹터(MBR)에서 부트 프로그램(=부트섹터)을 읽어들여 메모리로 로드 한다. 바로 이 부트 프로그램에 부트로더인 GRUB가 들어있다.

    • ROM-BIOS에 의해 부트로더(GRUB)가 메모리로 로딩된 이후부터는 ROM-BIOS는 시스템 부팅 제어권을 GRUB에게 넘겨주고 자기 자신은 종료한다.


부팅 2단계 : 부트로더(GRUB)의 실행과 역할


  • 부트로더의 역할

    • 리눅스 커널 로드 (부트로더에서 선택하는 항목들이 각각의 커널들이다.)

    • 스와퍼(Swapper) 프로세스 호출

  • 부트로더 화면에서 어떤 부팅 메뉴로 부팅을 할 것인가를 결정하는 것은 /boot/grub/grub.conf 파일에 정의 되어 있다.

  • GRUB을 통해 리눅스 커널을 로딩하고 커널을 선택하여 메모리에 로드 되는 순간부터 본격적인 부팅이 진행된다. 중간에 부팅을 잠시 멈추고 GRUB 명령어 모드로 진입할 수도 있다.


부팅 3단계 : 스와퍼(Swapper) 프로세스 수행


  • 스와퍼(Swapper)
    • 앞단계(리눅스커널로드까지)에서 인식했던 각 장치들의 드라이브들을 초기화

    • init 프로세스 수행

  • PID 0번인 스와퍼라는 프로세스는 각 장치의 드라이브들을 초기화하고 그 다음 PID 1번인 init 프로세스(/sbin/init)를 실행한다.  그 후 몇가지 기능을 수행하고 종료한다.


부팅 4단계 : init 프로세스의 실행


  • 리눅스에서 모든 프로세스는 그 실행과 함께 설정파일을 읽어들인다.

  • init 프로세스는 /etc/inittab 이라는 설정파일을 읽어들여 무엇을, 어떻게, 언제 실행할 것인가를 결정한다.

  • 부팅과정에서 출력되는 거의 모든 부팅메시지들은 /etc/inittab 파일의 실행 내용이다.(한 행씩 순차적으로 실행)



부팅 5단계 : 부팅레벨의 결정 단계


  • /etc/inittab 파일 내용 중 가장 먼저 실행되는 행

 id:3:initdefault:


부팅 6단계 : /etc/rc.d/rc.sysinit 스크립트 실행 (모든 부팅레벨)

  • 부팅레벨 지정 바로 다음에 나오는 행으로 인해  /etc/rc.d/rc.sysinit이라는 스크립트 파일이 실행된다.

  • 스크립트 파일은 “시스템초기화” 작업을 수행한다. 부팅 레벨이 몇번인가와는 상관없이 모든 부팅레벨에서 반드시 한번 실행되는 스크립트이다.

  • /etc/rc.d/rc.sysinit 파일이 수행하는 내용

    1. default path 설정

    2. /etc/sysconfig/network 파일의 실행

    3. 네트워크 설정 확인 및 적용

    4. swapon 명령으로 스왑작동하기

    5. 호스트이름, 도메인이름 설정하기

    6. keymap loading

    7. fsck 실행으로 /etc/fstab 파일 참조하여 파일 시스템 점검하기

    8. PNP 하드웨어 점검하기

    9. /proc 파일 시스템 mount

    10. kernel module load

    11. depmod 실행으로 모듈 의존성 설정

    12. system clock 설정

    13. system font load

    14. 파일청소 작업

    15. 시리얼포트 설정 작업

    16. /usr/sbin/netconfig 실행

    17. /usr/sbin/timeconfig 실행

    18. /usr/sbin/authconfig 실행

    19. /usr/sbin/ntsysv 실행

    20. utmp 파일의 검사 및 생성

    21. wtmp 파일의 검사 및 생성

    22. 기타 시스템 초기화에 필요한 작업들을 수행


부팅 7단계 : /etc/rc.d/rcN.d/ 디렉토리의 스크립트 실행(부팅레벨에 따른 실행)



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


  • 앞 단계에서 정해진 부팅 레벨에 대항하는 디렉토리 내의 스크립트가 순차적으로 수행된다.

    • ex) 3번 부팅 레벨 : /etc/rc.d/rc3.d 디렉토리의 스크립트가 수행된다.

  • 이 디렉토리 내에 존재하는 파일들은 모두 링크파일들이다. (대부분이 /etc/rc.d/init.d)

  • /etc/rc.d/rcN.d 디렉토리의 특징

    • 이 디렉토리의 파일들은 각각의 부팅레벨에 따라 시스템 부팅 시에 자동실행 될 서비스(데몬)들에 대한 설정이다.

    • 이 디렉토리에 존재하는 모든 파일들은 /etc/rc.d/init.d/ 디렉토리에 있는 파일을 원본으로 하는 링크 파일들이다.

    • K로 시작하는 파일 : 해당 부팅레벨로 부팅 시에 자동시작 되지 않는 서비스들

    • S로 시작하는 파일 : 해당 부팅레벨로 부팅 시에 자동 시작되는 서비스들

    • K 또는 S 다음의 숫자들은 실행될 순서를 의미

    • 예외적으로 S99local은 /etc/rc.d/rc.local 파일을 원본으로 하는 링크 파일로서 2,3,4,5번 부팅레벨에서만 실행되도록 되어 있다.(맨 마지막 단계에 반드시 한번 수행)

    • 예외적으로 S99single은 1번 부팅레벨에서만, S01reboot은 6번 부팅 레벨에서만 실행된다.

  • /etc/rc.d/rc.local 파일은 각 사용자들이 부팅시에 자동으로 실행하고자 하는 프로그램들을 설정하거나 스크립트를 설정해두는 파일이다.


부팅 8단계 : 시스템 매직키 설정을 한다.


 ca::ctrlaltdel:/sbin/shutdown -t3 -r now


  • CTRL + ALT + DEL 키에 대한 수행 내용을 설정한 것이다.

  • Tip

    • /sbin/shutdown -t3 -r now 명령에서 -a 옵션을 추가해 주면 /etc/shutdown.allow 파일이 존재하고 사용자가 추가되어 있을 경우(한 행에 사용자 한명씩 입력) 해당 사용자만 수행 하도록 설정할 수 있다.


부팅 9 단계 : 시스템 전원 공급 설정을 한다.

  • UPS 전원이 부족 할 경우와 재충전 되었을 경우에 실행되는 명령을 지정할 수 있다.



부팅 10 단계 : 가상터미널 실행과 로그인창 실행

  • 2,3,4,5번 부팅 레벨로 부팅 시에 로그인창을 실행해주는 6개의 가상콘솔 실행 설정

  • /etc/inittab 파일로 인해 콘솔 로그인 화면을 실행하는 /sbin/mingetty 명령을 실행하게 된다.


부팅 11 단계 : X 윈도우 실행


 x:5:respawn:/etc/X11/prefdm -nodaemon


  • 부팅레벨이 5번일 경우일 때만 GUI 사용자환경을 제공하기 위해서 X윈도우를 실행하게 된다.

  • 거의 대부분의 리눅스 배포판에서는 GNOME 데스크톱을 기본적인 X 윈도우로 사용하고 있다.

  • 위의 설정 처럼 /etc/X11/prefdm 명령이 실행되는데 prefdm이 X 윈도우를 실행 시켜주는 스크립트 파일이다.







※ 참고 : 리눅스 서버관리 실무 바이블 3.0

댓글