프로그래밍 공부
작성일
2022. 11. 11. 21:29
작성자
WDmil
728x90

리눅스 시스템의 부팅 과정

바이오스 단계

  • PC의 전원 스위치를 켜서 부팅하면 제일 먼저 바이오스(BOIS, basic input/output system) 가 동작
  • 바이오스는 PC에 장착된 기본적인 하드웨어(키보드,디스크 등)의 상태를 확인한 후 부팅 장치를 선택하여 부팅디스크의 첫 섹터에서 512 바이트를 로딩
  • 512 바이트가 마스터 부트 레코드(master boot record, MBR): 2차 부팅 프로그램(부트 로더) 의 위치에 저장

부트 로더 단계

바이오스 단계에서 MBR은 부트로더를 찾아 메모리에 로딩

부트 로더는 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공

  • 부트 로더는 리눅스 커널을 메모리에 로딩
  • 리눅스 커널은 /boot 디렉터리 아래에
    • vmlinuz-버전명 의 형태로 제공
  • 리눅스의 대표적인 부트 로더
    • GRUB 와 LILO

커널 초기화 단계

  • 커널은 가장 먼저 시스템에 연결된 메모리, 디스크, 키보드, 마우스 등 장치들을 검사
  • 장치 검사 등 기본적인 초기화 과정이 끝나면 커널은 fork를 사용하지 않고 생성되는 프로세스와 스레드 생성
  • 이 프로세스들은 메모리 관리 같은 커널의 여러가지 동작을 수행
  • 이들 프로세스는 일반적인 프로세스와 구분되도록 대괄호([])로 표시하며 주로 PID 번호가 낮게 배정된다.

init 실행 단계

  • init 실행 단계에 이르면 리눅스가 본격적으로 동작하기 시작
  • 기본적으로 메시지가 보이지 않도록 하고 대신에 부트 스플래시(boot splash)라고 하는 이미지를 출력
  • 부트 스플래시 화면이 진행 중일 때 ctrl + D 키를 누르면
  • 메시지가 출력되는 화면으로 전환

부팅 후 메시지 확인

부팅 시 출력된 메시지는 dmesg 명령이나 more /var/log/boot.log 명령으로 확인 가능.

1번 프로세스

  • 전통적으로 유닉스에서는 init 프로세스가 처음 생성된 프로세스로서 PID가 1번

로그인 프롬프트 출력

  • 마지막으로 그래픽 로그인 시스템인
  • GDM(GNOME display manager)을 동작시키고,
  • 로그인 프롬프트 출력함.(서버링)

init 프로세스

  • init 프로세스는 PID가 1번인 프로세스로 모든 프로세스의 조상 역활
  • 우분투는 자체적으로 개발한 upstart를 init대신 사용하는데, 다만 기존의 유닉스 및 리눅스 환경과의 호환을 위해 실행 파일 이름은 init를 유지
  • init의 동작 방식이 바뀜에 따라 전통적으로 init 프로세스와 관련된 설정 파일이었던 /etc/inittab 파일은 이제 우분투에서 사라졌다.

.init 프로세스와 스크립트 파일

  • 기존의 init와 새로운 upstart는 모두 프로세스를 실행하거나 종료하기 위해 스크립트 파일을 사용
  • /etc/init 디렉터리와 /etc/init.d 디렉터리에 같은 서비스에 대한 파일이 있다면 /etc/init 디렉터리의 스크립트 파일이 우선적으로 적용

upstart가 사용하는 작업 파일

upstart와 관련된 스크립트 파일은 /etc/init 디렉터리에 작업명.cinf 파일로 작성한다.

기존 init 프로세스

init 프로세스가 실행하는 스크립트 파일은 /etc/init.d 디렉터리에 위치한다.

 

upstart 스크립트를 시작하고 정지하기 (systemctl)

  • initctl [start|stop|restart|reload|status] 작업명
  • sudo [start|stop|restart|reload|status]작업명 

start, stop, restart, reload, status 명령은 모두 initctl 명령에 대한 심벌릭 링크 이다.

upstart 스크립트 시작하고 정지하기

sudo ufw status : 작업 상태 보기

systemctl [start|stop|restart|reload|status]

init 스크립트 시작하고 정지하기

sudo service 스크립트명 [start|stop|restart|status]

/etc/init.d/스크립트명 [start|stop|restart|status]

서비스 상태 보기 : service 스크립트 status

init 프로세스와 런레벨

  • init 프로세스에서 사용하던 런레벨(Run Level)의 개념에 대한 이해 필요.
  • init는 시스템의 단계를 일곱 개로 정의하여 구분하고 각 단계에 따라 셸 스크립트를 실행 하는데, 이 단계들을 런 레벨이라고 함
  • 기존 유닉스나 페도라와 달리 우분투의 런레벨은 기본 런레벨이 2번이다
유닉스의 런레벨
런레벨 의미 관련 스크립트의 위치
0 시스템 종료 /etc/rc0.d
1,S,s 단일 사용자 모드 etc/rc1.d
2 다중 사용자 모드(NFS를 실행하지 않음) etc/rc2.d
3 다중 사용자 모드(NFS 포함) etc/rc3.d
4 사용하지 않음(예비 번호) etc/rc4.d
5 시스템 종료(페라는 GUI 모드로 부팅) etc/rc5.d
6 시스템 재시작 etc/rc6.d
우분투의 런레벨
런레벨 의미 관련 스크립트의 위치
0 시스템 종료 /etc/rc0.d
1,S,s 단일 사용자 모드 /etc/rc1.d, /etc/rcS.d
2 그래피컬 다중 사용자 모드 + 네트워킹(기본 값) /etc/rc2.d
3 런레벨 2와 동일 /etc/rc3.d
4 /etc/rc4.d
5 /etc/rc5.d
6 시스템 재시작 /etc/rc6.d

init 프로세스와 런 레벨

런레벨 3, 4, 5번이 2번과 같으므로, rc2.d 디렉터리와 rc3.d, rc4.d, rc5.d 디렉터리의 내용이 모두 같음.

런레벨 별로 실행하는 스크립트 파일은 /etc/init.d 디렉터리에 있는 파일에 대한 심벌릭 링크 이다

런레벨 변경하기

  • init는 1번 프로세스의 이름이기도 하지만 init 프로세스의 런레벨을 바꾸는 명령어로도 사용
  • init을 명령으로 실행하면 실제로는 /sbin/telinit가 실행
  • init로 런레벨을 변경하기 위해서는 바꾸려는 런레벨을 숫자로 지정한다.

기본 런레벨 지정하기

  • 우분투에서 기본 런레벨은 /etc/init/rc-sysinit.conf 파일의 DEFAULT_RUNLEVEL 변수에 지정

현재 런레벨 확인하기 : reunlevel 명령

리눅스를 종료하는 방법

  • sutdown 명령을 사용한다.
  • halt 명령을 사용한다.
  • poweroff 명령을 사용한다.
  • 런레벨을 0이나 6으로 전환한다.
  • revoot 명령을 사용한다.
  • 전원을 끈다 -> 최후의 수단

shutdown 명령 사용하기

리눅스 시스템을 가장 정상적으로 종료하는 방법

shutdown 명령으로 시스템 즉시 종료하기

-h 옵션과 함께 현재 시간으로 지정

shoutdown 한다는 메시지 보내고 종료하기

  • 시스템을 종료할 때 shutdown 명령으로 메시지를 보낼 수 있음
  • 사용자들이 메시지를 받고 정리할 시간이 필요하므로 시간을 now로 지정하면 안 되고 특정 시간을 지정
  • 예 : 2분 후에 종료한다는 메시지 발송

shutdown 명령으로 시스템 재시작하기 : -r 옵션 사용

shutdown 명령 취소하기 : -c 옵션

앞의 3분 후 재시작 명령을 취소할 경우 메시지 출력

shutdown 메시지만 보내기 : -k 옵션

Write [user] message -> CTRL + C

런레벨 변경하기

런레벨을 0으로 바꾸면 시스템이 종료

재시작 하려면 런레벨을 6으로 변경

기타 시스템 종료 명령

  • 시스템을 종료하거나 재시작을 위해 사용할 수 있는 명령 : halt, pweroff, reboot
  • halt 와 poweroff는 reboot명령의 심벌릭 링크
  • halt, reboot, pweroff 명령은 /var/log/wtmp 파일에 시스템 종료 기록을 남기고 시스템을 종료하거나 재시작
  • 사용할 수 있는 옵션
    • -w : 실질적으로 재시작하거나 종료하지는 않지만 wtmp 파일에 기록을 남긴다
    • -f : 강제로 명령을 실행하며 shoutdown을 호출하지 않는다
    • -p : 시스템 전원을 끈다.

데몬 프로세스

데몬(daemon)

  • 리눅스의 백그라운드에서 동작하면서 특정한 서비스를 제공하는 프로세스
  • 리눅스 시스템에서 동작하는 각종 서비스를 제공하는 프로세스들이 바로 데몬

데몬의 동작 방식

  • 독자형(standalone)
    • 시스템의 백그라운드에서 서비스별로 항상 동작
    • 자주 호출되는 데몬이 아니라면 시스템의 자원을 낭비할 우려
  • 수퍼 데몬에 의한 동작 방식
    • 평소에는 수퍼 데몬만 동작하다가 서비스 요청이 오면 수퍼 데몬이 해당 데몬을 동작시킴
    • 독자형보다는 서비스에 응답하는 데 시간이 약간 더 걸릴 수 있지만 자원을 효율적으로 사용한다는 장점이 있다.

수퍼 데몬

  • 유닉스에서 수퍼 데몬의 이름은 inetd
  • 페도라에서는 보안 기능이 포함된 xinetd를 사용

데몬의 조상 : init과 커널 스레드 데몬

init 데몬 (systemd)

  • 대부분의 프로세스의 조상 프로세스 이다.
  • pstree 명령으로 확인

커널 스레드 데몬

  • 커널의 일부분을 프로세스처럼 관리하는 데몬
  • ps 명령으로 확인했을 때 대괄호([ ])로 둘러싸여 있는 프로세스들
  • 예전에는 대부분 k로 시작했으나 요즘은 이를 반드시 준수하지 않음
  • 커널 데몬은 대부분 입출력이나 메모리 관리, 디스크 동기화 등을 수행하며 대체로 PID가 낮은 번호로 할당
  • 커널 데몬을 동작시키는 조상 데몬은 커널 스레드 데몬(kthreadd): PID 2번

주요 데몬

GRUB의 개요

  • GRand Unified Bootloader 의 약자로, 리눅스의 전통적인 부트 로더인 LILO의 단점을 보완하여 GNU 프로젝트의 일환으로 개발
  • GRUB는 LILO에 비해 다음과 같은 장점을 가지고 있음
    • LILO는 리눅스에만 사용이 가능하지만 GRUB는 윈도에서도 사용할 수 있다.
    • LILO에 비해 설정과 사용이 편리하다.
    • 부팅 시에 명령을 사용하여 수정이 가능하다.
    • 멀티 부팅 기능을 지원한다.
  • GRUB의 가장 최신 버전은 GRUB2로 우분투에서 기본 부트 로더로 사용중이다.

GRUB2 관련 디렉터리와 파일

/boot/grub2/brub.cfg 파일: 기존의 menu.lst 파일을 대체하는 기본 설정 파일

/etc/grub.d 디렉터리 : GRUB 스크립트를 가지고 있으며 GRUB의 명령이 실행될 때 순서대로 읽혀 grub,cfg 파일이 생성

/etc/default/grub 파일 : GRUB 메뉴 설정 내용이 저장됨.

 

728x90