[Linux] 부트 프로세스Linux2022. 3. 4. 02:19
Table of Contents
728x90
✅ 리눅스 부팅 프로세스
전원을 켬
하드웨어를 시작함(BIOS 또는 UEFI 펌웨어에서)
부트 로더 위치 찾기 + 시작하기
부트 로더에서 운영체제 고르기
선택된 운영체제에 맞는 커널과 초기 RAM 디스크(initrd) 시작하기
초기화 프로세스(init 또는 systemd) 시작
선택된 런레벨 또는 타깃에 따라 서비스 시작
- 시스템 전원 ON & BIOS 프로그램의 실행
- POST (Power On Self Test) : 부팅이 시작되면 컴퓨터는 가장 먼저 자체 진단 기능을 통해 이상 유무를 검사
- 컴퓨터에 전원이 들어오고 전류가 CPU로 흘러가면 CPU는 BIOS 프로그램을 불러들인다.
- BIOS는 CPU를 시작으로 CMOS를 검사하고 메모리 테스트 후 용량을 확인한다.
- 그래픽 카드, 키보드, 마우스 등 각종 장치의 이상 유무를 검사하여 초기화한다.
- POST (Power On Self Test) : 부팅이 시작되면 컴퓨터는 가장 먼저 자체 진단 기능을 통해 이상 유무를 검사
- 부트 매체의 검색
- POST 과정에서 이상이 없으면 검색된 부팅 매체 (HDD, ODD, USB, 네트워크 등) 중 CMOS에 설정되어 있는 순서대로 부팅을 시도한다.
- MBR (Master Boot Record)에 존재하는 부트로더인 GRUB을 읽어 들이며 부트로더가 메모리에 적재되고 시스템의 제어권은 부트로더가 갖게 된다.
- MBR (Master Boot Record)란 ?
부팅 가능한 디스크에서 첫 번째 섹터에 위치하며, /dev/hda 혹은 /dev/sda이다.
MBR은 GRUB 부트 로더를 실행한다.
- MBR (Master Boot Record)란 ?
- 부트 로더의 실행
- 부트로더는 Kernel을 메모리에 올려놓게 된다.
- 부트로더는 Kernel 이미지를 불러들이고 시스템의 제어권을 넘겨온다.
- 커널 부트 이미지 적재
- GRUB의 부트 메뉴에서 Kernel을 선택하게되면 Kernel 이미지가 동작
- Kernel 이미지는 압축되어 있기 때문에 PID 0번인 swapper 프로세스를 호출
- swapper 프로세스는 Kernel 이미지를 압축 해제하고 Kernel이 사용할 각 장치들 (메모리, HDD, 시리얼 장치, 마우스 등 하드웨어)을 초기화하고 자세한 정보를 콘솔에 출력
- 루트 파일시스템 마운트
- 하드웨어의 검색 후 커널은 루트(/) 파일시스템을 마운트
- 마운트는 안전하게 검색될 수 있도록 읽기 전용 (read-only)으로 마운트
- 이후에 읽기/쓰기로 마운트가 이루어짐
- systemd 프로세스 실행
- 모든 프로세스의 부모 역할을 하는 PID 1번인 systemd 프로세스를 실행
- systemd 프로세스는 사용자가 시스템을 사용할 수 있도록 시스템 초기화 진행
- systemd 프로세스는 기본 시스템 초기화 스크립트인 local-fs.target을 통해 파일시스템 점검
- 이후 sysinit.target을 시작으로 필요한 스크립트를 통해 커널 모듈의 메모리 적재, 스왑 파티션 초기화, 네트워크 초기화, 서비스 프로세스 관리, 가상 콘솔 접속 관리, 실행 레벨 관리를 실행
systemd가 PID 1번으로 할당되고 default.target을 활성화하고 의존성 관계의 모든 유닛을 활성화함
default.target은 가장 먼저 실행되어 어떤 타겟 유닛으로 부팅을 진행할지 결정함
local-fs.target은 /etc/fstab에 등록된 마운트 정보로 파일시스템을 마운트함
sysinit.target은 시스템 마운트, 스왑, 커널의 추가 옵션을 실행하는 서비스를 시작함
basic.target은 firewalld, microcode, SELinux, 커널 메시지와 관련된 서비스를 시작 및 로드함
multi-user.target은 커맨드 라인을 제공하는 다중 사용자 모드임
graphical.target은 GUI를 지원하는 다중 사용자 모드임
✅ 부팅 이미지 및 의존성 확인
[root@localhost yum.repos.d]# ls /boot/
System.map-3.10.0-862.el7.x86_64 initramfs-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145.img
config-3.10.0-862.el7.x86_64 initramfs-3.10.0-862.el7.x86_64.img
efi symvers-3.10.0-862.el7.x86_64.gz
extlinux vmlinuz-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145
grub vmlinuz-3.10.0-862.el7.x86_64
grub2
# 부트 이미지들
[root@localhost yum.repos.d]# file /boot/initramfs-3.10.0-862.el7.x86_64.img
/boot/initramfs-3.10.0-862.el7.x86_64.img: gzip compressed data, from Unix, last modified: Mon Feb 21 15:02:40 2022, max compression
# file을 보면 gzip 형식이라는 것을 확인할 수 있다.
[root@localhost yum.repos.d]# find /etc/systemd/system/ -type d -name "*want*"
/etc/systemd/system/multi-user.target.wants
/etc/systemd/system/getty.target.wants
/etc/systemd/system/default.target.wants
/etc/systemd/system/system-update.target.wants
/etc/systemd/system/graphical.target.wants
/etc/systemd/system/sysinit.target.wants
/etc/systemd/system/basic.target.wants
/etc/systemd/system/local-fs.target.wants
/etc/systemd/system/timers.target.wants
/etc/systemd/system/sockets.target.wants
/etc/systemd/system/bluetooth.target.wants
/etc/systemd/system/remote-fs.target.wants
/etc/systemd/system/network-online.target.wants
/etc/systemd/system/printer.target.wants
/etc/systemd/system/dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants
[root@localhost yum.repos.d]# ls /etc/systemd/system/local-fs.target.wants/
rhel-readonly.service
[root@localhost yum.repos.d]# ls /etc/systemd/system/sysinit.target.wants/
dmraid-activation.service lvm2-lvmetad.socket lvm2-monitor.service rhel-autorelabel.service rhel-import-state.service
iscsi.service lvm2-lvmpolld.socket multipathd.service rhel-domainname.service rhel-loadmodules.service
✅ 런레벨
- 리눅스 시스템을 부팅할 때 시작하는 프로그램의 실행 순서를 정의한 것을 런레벨이라고 한다.
- 리눅스에서 런레벨은 기본적으로 7레벨로 구분되며 리눅스 종류에 따라 레벨 순서에 차이가 있다.
- 0 (정지), 1 (싱글모드), 6 (재시작)은 공통이다.
- 낮은 레벨일수록 시스템 시작시 가동되는 드라이버나 데몬 수가 적다.
- reboot 명령어를 실행하면 런레벨이 6으로 넘어가는 것을 확인할 수 있다.
런레벨 | 시스템 표기 | 설명 | 시스템 명령어 |
0 | power Off.target | 종료 모드 | init 0 |
1 | rescue.target | 시스템 복구 모드 | init 1 |
2 | mulit-user.target | 미사용 (사용자 정의 가능) | init 2 |
3 | mulit-user.target | 다중 사용자 (콘솔 로그인) | init 3 |
4 | mulit-user.target | 미사용 (사용자 정의 가능) | init 4 |
5 | graphical.target | 다중 사용자 (그래픽 모드) | init 5 |
6 | reboot.target | 재시작 모드 | init 6 |
✅ 사용자가 사용 가능한 타겟 유닛
종류 | 설명 |
emergency.target | 최소한의 환경을 제공하는 긴급 쉘 제공 시스템 부팅 중 발생한 문제에 대한 해결용도로 사용 루트 파일 시스템(/)이 읽기 전용으로 마운트 됨 파일 내용 수정할 경우는 읽기-쓰기로 다시 마운트 |
rescue.target | 단일 사용자 환경을 제공하는 복구 쉘을 제공 루트 파일 시스템(/)이 읽기-쓰기로 마운트 됨 네트워크 인터페이스 비활성화 |
multi-user.target | CLI환경 제공 모든 작업 사용 가능 |
graphical.target | GUI환경 제공 모든 작업 사용 가능 기본적으로 제공되는 타겟 유닛이 아니라 별도의 설치 필요 |
✅ 시스템에 등록된 런레벨 확인 방법
[root@localhost yum.repos.d]# cd /lib/systemd/system
[root@localhost system]# ls -al runlevel*.target
lrwxrwxrwx. 1 root root 15 2월 21 14:52 runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 2월 21 14:52 runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 2월 21 14:52 runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 2월 21 14:52 runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 2월 21 14:52 runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 2월 21 14:52 runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 2월 21 14:52 runlevel6.target -> reboot.target
systemctl get-default
# 현재 가동 중인 타겟 확인
systemctl set-default graphical.target
# 기본 타겟 변경
systemctl isolate <TARGET>
# 지금 당장 타켓을 변경하기 위해 사용
[root@localhost yum.repos.d]# ls -l /usr/lib/systemd/system/*runlevel*/
/usr/lib/systemd/system/runlevel1.target.wants/:
합계 0
lrwxrwxrwx. 1 root root 39 2월 21 14:52 systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
/usr/lib/systemd/system/runlevel2.target.wants/:
합계 0
lrwxrwxrwx. 1 root root 39 2월 21 14:52 systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
/usr/lib/systemd/system/runlevel3.target.wants/:
합계 0
lrwxrwxrwx. 1 root root 39 2월 21 14:52 systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
/usr/lib/systemd/system/runlevel4.target.wants/:
합계 0
lrwxrwxrwx. 1 root root 39 2월 21 14:52 systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
/usr/lib/systemd/system/runlevel5.target.wants/:
합계 0
lrwxrwxrwx. 1 root root 39 2월 21 14:52 systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
참고
더보기
https://haker.tistory.com/53?category=967816
728x90
'Linux' 카테고리의 다른 글
[Linux] root 비번 초기화 방법 (0) | 2022.03.04 |
---|---|
[Linux] GRUB의 이해 (0) | 2022.03.04 |
[Linux] LVM 명령어 실습 (0) | 2022.02.25 |
[Linux] LVM - Logical Volume Management (0) | 2022.02.25 |
[Linux] Swap memory (0) | 2022.02.25 |
@TTOII :: 뭉게뭉게 클라우드
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!