[Linux] 부트 프로세스 & 부트 로더

728x90

부트 프로세스

1단계: 시스템 전원 ON

  • 모든 운영체제를 부팅하기 위한 첫 단계

2단계: BIOS 프로그램의 실행

  • POST : 부팅이 시작되면 컴퓨터는 가장 먼저 자체진단 기능을 통하여 컴퓨터 이상 유무를 검사한다.
    • 컴퓨터에 전원이 들어오면 먼저 전류는 CPU 로 흘러 들어가게 되며 CPU 는 BIOS 프로그램을 불러들이게 된다.
    • BIOS 프로그램은 CPU 를 시작으로 CMOS 를 검사하고, 메모리 테스트 후 용량을 확인한다.
    • 그래픽 카드, 키보드, 마우스 등 각종 장치의 이상 유무를 검사하여 초기화한다.

3단계: 부트매체의 검색

  • POST 과정에서 하드웨어 검사가 무사히 완료되면 검색된 부팅 매체 (HDD, ODD, USB, 네트워크 등) 중 CMOS 에 설정되어 있는 순서대로 부팅 시도한다.
  • MBR(Master Boot Record) 에 존재하는 부트로더인 GRUB 를 읽어 들이게 되며, 부트로더가 메모리에 적재되고, 시스템의 제어권은 부트로더가 갖게 된다.

4단계: 부트로더의 실행

  • 부트로더는 Kernal 을 메모리에 올려놓게 된다.(레스큐 모드로 실행할 지 일반 모드로 실행할 지 결정하는 화면)
  • 부트로더는 Kernal 이미지를 불러들이고 시스템의 제어권을 넘겨온다.

5단계: 커널 부트 이미지 적재

  • GRUB 의 부트 메뉴에서 Kernal 을 선택하게 되면, Kernal 이미지가 동작한다.
  • Kernal 이미지는 압축되어 있기 때문에 PID 0번 인 swapper 프로세스를 호출한다.
  • swapper 프로세스는 Kernal 이미지를 압축해제하고 Kernal 이 사용할 각 장치들을 (메모리, HDD, 시리얼 장치, 마우스 등 하드웨어) 초기화하고 자세한 정보를 콘솔에 출력한다.

6단계: 루트 파일시스템 마운트

  • 하드웨어의 검색 후 커널은 루트 (/) 파일 시스템을 마운트한다.
  • 마운트는 안전하게 점검될 수 있도록 읽기 전용(read-only) 로 마운트된다.(보통 읽기 전용을 사용하는 경우는 점검, 체크를 하기 위해서다)
  • 이후에 읽기/쓰기 마운트가 이루어진다.

7단계: systemd 프로세스 실행

  • 모든 프로세스의 모든 부모 역할을 하는 PID 1번인 systemd 프로세스를 실행한다.
  • systemd 프로세스는 사용자가 시스템을 실제로 사용할 수 있도록 시스템 초기화를 진행한다.
  • systemd 프로세스는 기본 시스템 초기화 스크립트인 local-fs.target 을 통해 파일 시스템을 점검한다.
  • 이후 sysinit.target 을 시작으로 필요한 스크립트를 통해서 커널 모듈의 메모리 적재, 스왑 파티션 초기화, 네트워크 초기화, 서비스 프로세스 관리, 가상 콘솔 접속 관리, 실행 레벨 관리를 실행한다.

systemd 는 default.target 을 불러서 실행시킨다.

default.target 은 graphical.target 이나 mutil-user.target 둘 중 하나로 설정된다.

각각의 타겟들은 종속성에 의해 연계되서 실행되야 한다.

local-fs.target 이 실행되야 sysinit.target 이 실행될 수 있고 sysinit.target 이 실행되어야 basic.target 이 실행될 수 있고 basic.target 이 실행되어야 mutil-user.target 이 실행될 수 있고 mutil-user.target 이 실행되어야 graphical.target 이 실행될 수 있다.

타겟의 종류로는 아래와 같다.

  • graphical.target ⇒ GUI 환경 구성
  • mutil-user.target ⇒ CLI 환경 구성, 네트워크 환경 구성, 웹 서비스 환경 구성, rsyslog 서비스 구성
  • basic.target ⇒ SELINUX(보안 서비스), microcode
  • sysinit.target ⇒ 마운트 안정화
  • local-fs.target ⇒ /etc/fsab 에 등록된 마운트 작업

추가적으로 rescue.target 과 emergency.target 이 있다.

  • rescue.target ⇒ single mode root/ 로 비밀번호가 필요하고 네트워크를 사용하지 않는다. /(sysroot)에 대해서 읽기쓰기 모드이다. /etc/fstab 에서 마운트 옵션을 제대로 적지 않으면 rescue.target 모드로 부팅이 된다.
  • emergency.target ⇒ single mode root/ 비밀번호가 필요 없고 네트워크를 사용하지 않는다. /(sysroot)에 대해서 읽기 전용 모드이다.

$ ls /etc/systemd/system/타겟명.target.wants/ 로 직접 타겟을 구성하고 있는 서비스들을 확인할 수 있다.

옛날에는 Run level 을 사용했으나 7버전으로 넘어오면서 타겟을 사용하게 됐다.

아래처럼 run level 을 확인할 수 있다.

default target 확인

현재 어떤 타겟이 디폴트 타겟인지 확인할 수 있다.

$ systemctl get-default

default target 설정

$ systemctl set-default multi-user.target 또는 graphical.target

타겟 전환

멀티 유저 타겟에서 그래피컬 타겟으로 전환하거나 그 반대로 전환하고 싶을 때는 systemctl isolate 명령어를 사용하여 타겟을 전환할 수 있다.

타겟 전환은 graphical.target 실행하고 나서 전환할 수 있다. 만약 multi-user.target 일 경우 graphical.target 으로 타겟 전환할 수 없다. 왜냐하면 타겟 전환은 타겟을 실행시키고 전환하는 것이 아닌 실행 중인 타겟으로 전환하기 때문이다.

 

$ systemctl isolate multi-user.target 또는 graphical.target

root 비번 변경

  1. 커널선택 화면에서 아무키 눌러서 카운트 다운을 해제한다. 원하는 커널에서 'e'눌러서 GRUB 진입

  1. linux16 라인 끝에 rd.break 입력ctrl+x 를 눌러서 emergency 모드로 실행한다. 아까 봤던 emergency.target 으로 읽기 전용 모드이다.

  1. mount -o rw,remount /sysroot ⇒ /sysroot 를 읽고 쓰기 모드로 재마운트 한다.

mount 명령어를 입력해서 /sysroot 의 모드를 맨 마지막 줄에서 확인할 수 있다.

현재 sysroot 가 읽기 전용이다.

맨 마지막 줄에 /dev/sda2 on /sysroot type xfs (ro, ...) ro 즉, Read only 모드인 것을 알 수 있다.

mount -o rw,remount /sysroot 명령어를 입력해서 rw 로 모드를 변경했다.

맨 마지막 줄에 /dev/sda2 on /sysroot type xfs (rw, ...) rw 즉, Read write 모드인 것을 알 수 있다.

  1. chroot /sysroot

  1. passwd 명령어를 실행해서 root 비밀번호를 변경한다.

한글 세팅이 되어 있어서 문자가 깨져서 나왔다. 영어로 언어가 설정돼 있으면 깨지지 않고 제대로 나올 것이다.

  1. touch /.autorelabel/sysroot 에 생긴 변화를 메모리 초기화 전에 본 시스템에 인식시키기 위한 증거 파일이다. 이 파일을 만들지 않을 경우 운좋으면 비밀번호가 안바뀌는 것이고 운 나쁘면 부팅이 아예 되질 않는다... 꼭 만들어줘야 한다.

  1. ctrl+d 를 두번 눌러주면 재부팅이 된다.

그러면 아무나 루트 비밀번호를 변경할 수 있다고 생각할 수 있는데 초기 상태이기 때문에 가능한 것이다.

부트로더 ID 및 PW 설정을 할 경우 일반 사용자들이 루트 비밀번호를 변경할 수 없게 할 수 있다.

부트로더

  • 운영 체제의 부팅 이전에 먼저 실행되는 프로그램으로 커널이 올바르게 부팅되기 위해 필요한 모든 관련 작업을 마무리하고 최종적으로 운영 체제를 부팅 시키기 위한 목적을 가지고 있다.

GRUB

  • 파일 시스템과 커널 실행 포맷을 인식하여 하드디스크 상에서의 커널의 물리적인 위치를 기록하지 않고도 커널의 파일명과 커널이 위치하고 있는 파티의 위치만을 알고 있으면 시스템 부팅이 가능하다.
  • $ cat /boot/grub2/grub.cfg
  • $ cat /etc/default/grub
  • $ grub2-editenv list ⇒ 현재 사용하는 커널 확인

부트로더 커널 이미지 카운트 다운 시간 설정

$ vi /etc/default/grub

GRUB_TIMEOUT=5 => 5를 다른 숫자로 :wq

부트로더 ID 및 PW 설정

$ vi /etc/grub.d/00_header

G를 눌러 제일 마지막 부분으로 이동

o를 눌러 편집모드로 들어가서 해당 부분 작성

# cat << EOF
# set superusers='ID명'
# password ID명 PW
# EOF

# 이런식으로 작성하면 된다.
cat << EOF
set superusers="grubuser"
password grubuser 1234
EOF

설정내용 부트로더 인식

$ grub2-mkconfig -o /boot/grub2/grub.cfg

$ reboot

실습

# default-target 확인

$ systemctl get-default

# default-target 변경

$ systemctl set-default multi-user.target

$ systemctl set-default graphical.target

# target 전환

$ systemctl isolate multi-user.target 또는 graphical.target
728x90