부팅 과정과 GRUB
Linux 시스템의 전원 ON부터 로그인 프롬프트까지의 부팅 과정 완벽 분석
Linux 시스템의 전원 ON부터 로그인 프롬프트까지의 부팅 과정 완벽 분석
목표: 부팅 문제를 진단하고, 부팅 과정을 제어할 수 있는 수준
🔄 전체 부팅 흐름
[전원 ON]
│
▼
[BIOS/UEFI] ──→ POST (하드웨어 자가진단)
│ 부팅 순서 결정
▼
[Bootloader] ──→ GRUB2 (OS 선택, 커널 로드)
│
▼
[Kernel] ──→ 커널 압축 해제
│ 드라이버 초기화
│ initramfs 실행
▼
[initramfs] ──→ 루트 파일시스템 마운트 준비
│ 필수 드라이버 로드
▼
[systemd (PID 1)] ──→ 서비스 병렬 시작
│ 타겟 달성
▼
[Login Prompt] ──→ 사용자 로그인 대기
1️⃣ BIOS/UEFI 단계
BIOS (Basic Input/Output System)
특징:
- 16비트 레거시 시스템
- MBR (Master Boot Record) 사용
- 2TB 디스크 제한
- 파티션 최대 4개 (확장 파티션으로 추가)
UEFI (Unified Extensible Firmware Interface)
특징:
- 32/64비트 모던 시스템
- GPT (GUID Partition Table) 사용
- 9.4ZB 디스크 지원
- 파티션 최대 128개
- 보안 부팅 (Secure Boot)
POST (Power-On Self Test)
1. CPU 레지스터 확인
2. BIOS 코드 검증
3. 기본 하드웨어 초기화
4. RAM 검사
5. 키보드, 마우스, 저장장치 검사
6. 부팅 가능한 장치 검색
부팅 모드 확인
# UEFI인지 BIOS인지 확인
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
# EFI 파티션 확인
lsblk -f | grep -i efi
# 부팅 모드 상세 정보
dmesg | grep -i efi
2️⃣ Bootloader (GRUB2)
GRUB2 (GRand Unified Bootloader)
Linux에서 가장 널리 사용되는 부트로더
설치 위치
| 부팅 방식 | 설치 위치 | 크기 |
|---|---|---|
| BIOS/MBR | 디스크 첫 섹터 (MBR) | 446바이트 |
| BIOS/GPT | BIOS 부트 파티션 | 1MB |
| UEFI/GPT | EFI 시스템 파티션 (/boot/efi) | 100MB+ |
GRUB2 구성 파일
주요 파일 위치
/boot/
├── grub/ # BIOS GRUB 파일
│ ├── grub.cfg # 메인 설정 (직접 수정 금지!)
│ └── ...
├── grub2/ # RHEL 계열
│ └── grub.cfg
└── efi/ # UEFI GRUB 파일
└── EFI/
└── ubuntu/
└── grubx64.efi
설정 파일 (수정 가능)
| 파일 | 설명 |
|---|---|
/etc/default/grub | GRUB 기본 설정 |
/etc/grub.d/ | 설정 스크립트 디렉토리 |
/boot/grub/grub.cfg | 생성된 설정 (직접 수정 금지) |
/etc/default/grub 주요 설정
# GRUB 기본 설정 파일
sudo nano /etc/default/grub
# 기본 부팅 항목 (0 = 첫 번째)
GRUB_DEFAULT=0
# 기본 항목을 마지막으로 부팅한 항목으로
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
# 부팅 메뉴 표시 시간 (초)
GRUB_TIMEOUT=5
# 숨김 모드 (Shift 키로 표시)
GRUB_TIMEOUT_STYLE=hidden
# 커널 파라미터 (모든 항목에 적용)
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
# 해상도
GRUB_GFXMODE=1920x1080
# 배경 이미지
GRUB_BACKGROUND=/boot/grub/background.png
# 보안 (비밀번호)
GRUB_PASSWORD=grub.pbkdf2.sha512.10000...
GRUB 설정 적용
# 설정 파일 재생성 (반드시 실행!)
sudo update-grub # Debian/Ubuntu
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
# UEFI GRUB 재설치
sudo grub-install /dev/sda # BIOS
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu
GRUB 커맨드 라인
부팅 중 GRUB 편집
1. 부팅 시 Shift 또는 Esc 키로 GRUB 메뉴 진입
2. 편집할 항목 선택 후 'e' 키
3. linux 줄 편집
4. Ctrl+X 또는 F10으로 부팅
복구 모드 진입
linux 줄 끝에 추가:
- systemd.unit=rescue.target # 복구 모드
- systemd.unit=emergency.target # 긴급 모드
- init=/bin/bash # 단일 사용자 모드
- nomodeset # 그래픽 드라이버 비활성화
- single # 단일 사용자 모드 (SysV)
루트 비밀번호 재설정
# 1. GRUB 편집 모드 진입
# 2. linux 줄 끝에 'rd.break' 추가
# 3. Ctrl+X로 부팅
# 4. 루트 파일시스템 재마운트
mount -o remount,rw /sysroot
chroot /sysroot
# 5. 비밀번호 변경
passwd root
# 6. SELinux 레이블 재설정 (RHEL)
touch /.autorelabel
# 7. 재부팅
exit
exit
3️⃣ 커널 로드
커널 이미지
# 설치된 커널 목록
ls -la /boot/vmlinuz-*
# 현재 실행 중인 커널
uname -r
uname -a
# 커널 모듈
lsmod # 로드된 모듈
modprobe module_name # 모듈 로드
modprobe -r module_name # 모듈 언로드
커널 파라미터
# 현재 커널 파라미터 확인
cat /proc/cmdline
# 주요 파라미터
quiet # 부팅 메시지 최소화
splash # 부팅 화면
ro # 루트를 읽기 전용으로 마운트
root=UUID=xxx # 루트 파티션 지정
initrd # initramfs 이미지 지정
systemd.unit= # 기본 타겟 변경
nomodeset # 커널 모드 설정 비활성화
noapic # APIC 비활성화
nolapic # 로컬 APIC 비활성화
pci=realloc # PCI 리소스 재할당
4️⃣ initramfs (initrd)
개념
Initial RAM Filesystem
- 실제 루트 파일시스템 마운트 전에 사용하는 임시 루트
- 필수 드라이버 (SATA, NVMe, 파일시스템 등) 포함
- LUKS 암호화 복호화, LVM 활성화 등 수행
initramfs 이미지
# 이미지 파일
ls -la /boot/initrd.img-* # Debian/Ubuntu
ls -la /boot/initramfs-*.img # RHEL/CentOS
# 이미지 내용 확인
lsinitramfs /boot/initrd.img-$(uname -r)
# 이미지 압축 해제
mkdir /tmp/initramfs
cd /tmp/initramfs
zcat /boot/initrd.img-$(uname -r) | cpio -idmv
initramfs 재생성
# Debian/Ubuntu
sudo update-initramfs -u # 현재 커널
sudo update-initramfs -u -k all # 모든 커널
sudo update-initramfs -c -k 5.15.0 # 특정 커널
# RHEL/CentOS
sudo dracut -f # 현재 커널
sudo dracut -f --kver 5.14.0 # 특정 커널
5️⃣ systemd (PID 1)
systemd 시작 과정
1. systemd 실행 (PID 1)
2. default.target 확인 및 실행
3. 의존성 분석 및 병렬 시작
4. 서비스 활성화
5. 로그인 프롬프트 표시
타겟 (Target) 흐름
sysinit.target
│
├── basic.target
│ │
│ ├── paths.target
│ ├── slices.target
│ ├── sockets.target
│ └── sysinit.target
│
└── default.target
│
├── graphical.target (GUI)
│ ├── display-manager.service
│ └── multi-user.target
│
└── multi-user.target (CLI)
├── getty.target
├── remote-fs.target
└── network.target
부팅 시간 분석
# 전체 부팅 시간
systemd-analyze
# 서비스별 시간
systemd-analyze blame
# 중요 경로
systemd-analyze critical-chain
# SVG 생성 (시각화)
systemd-analyze plot > boot.svg
🛠️ 부팅 문제 해결
복구 모드 진입 방법
방법 1: GRUB 메뉴
1. 부팅 시 Shift 또는 Esc 키
2. Advanced options for Ubuntu 선택
3. Recovery mode 선택
방법 2: 커널 파라미터
linux 줄 끝에 추가:
- systemd.unit=rescue.target
- rd.break
- init=/bin/bash
방법 3: Live USB
# 1. Live USB로 부팅
# 2. Try Ubuntu 선택
# 3. 터미널 열기
# 4. 루트 파티션 마운트
sudo mount /dev/sda1 /mnt
# 5. 바인드 마운트
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
# 6. chroot
sudo chroot /mnt
# 7. 복구 작업 수행
# - 비밀번호 재설정
# - GRUB 재설치
# - 패키지 복구
일반적인 부팅 문제
문제 1: GRUB rescue 프롬프트
# GRUB 모듈 로드
set prefix=(hd0,1)/boot/grub
set root=(hd0,1)
insmod normal
normal
# 또는 커널 직접 로드
linux (hd0,1)/boot/vmlinuz root=/dev/sda1
initrd (hd0,1)/boot/initrd.img
boot
문제 2: 루트 파일시스템 마운트 실패
# initramfs 프롬프트에서
# 1. 파티션 확인
blkid
lsblk -f
# 2. 수동 마운트
mkdir /mnt
mount /dev/sda1 /mnt
# 3. chroot
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
# 4. fstab 수정
nano /etc/fstab
# 5. initramfs 재생성
update-initramfs -u
문제 3: 커널 패닉 (Kernel Panic)
원인:
- 손상된 커널 이미지
- 누락된 모듈
- 하드웨어 문제
해결:
1. 이전 커널로 부팅 (GRUB 고급 옵션)
2. 커널 재설치
3. 하드웨어 진단
문제 4: systemd 서비스 실패
# 복구 모드에서
systemctl list-units --failed
# 문제 서비스 마스크 (임시 비활성화)
systemctl mask problematic.service
# fstab 문제 시
mount -a # fstab 테스트
📋 부팅 최적화
부팅 시간 단축
# 1. 불필요한 서비스 비활성화
systemctl list-unit-files --state=enabled
systemctl disable unnecessary.service
# 2. 병렬 시작 최적화
systemd-analyze blame
systemd-analyze critical-chain
# 3. GRUB 타임아웃 줄이기
# /etc/default/grub
GRUB_TIMEOUT=1
# 4. initramfs 최소화
# /etc/initramfs-tools/initramfs.conf
MODULES=dep # 필요한 모듈만 포함
# 5. SSD 최적화
# noatime 마운트 옵션
안전한 커널 업데이트
# 1. 현재 커널 확인
uname -r
# 2. 새 커널 설치
sudo apt update
sudo apt install linux-image-generic
# 3. GRUB 설정 확인
sudo update-grub
# 4. 재부팅
sudo reboot
# 5. 문제 발생 시 이전 커널로 부팅
# GRUB 메뉴 → Advanced options → 이전 커널
# 6. 이전 커널 제거 (확인 후)
sudo apt autoremove
🔗 관련 노트
- 02-02-서비스-관리-systemd — systemd 상세
- 02-05-디스크-관리 — 파티션 및 파일시스템
- 02-06-LVM-구성 — 논리 볼륨 관리
- 02-04-네트워크-설정 — 네트워크 구성
- 03-00-Linux-내부동작-자가학습 — 커널 심화
마지막 업데이트: 2026-06-01