GRUB은 Linux 사용자라면 반드시 한 번은 마주치게 되는 부트로더다. 평소에는 존재감이 없지만, 부팅에 문제가 생기면 가장 먼저 우리를 맞이하는 녀석이기도 하다. 이 글에서는 GRUB이 무엇인지, 언제 GRUB 모드에 진입하게 되는지, 그리고 실전에서 어떻게 대응하는지를 정리한다.


GRUB이란?

GRUB(GRand Unified Bootloader)은 컴퓨터 전원을 켰을 때 운영체제를 메모리에 로드하는 역할을 하는 부트로더다. Ubuntu를 포함한 대부분의 Linux 배포판에서 기본 부트로더로 사용되며, 현재는 GRUB2가 표준이다.

핵심 역할은 단순하다.

  • BIOS/UEFI → GRUB → 커널 로드 → OS 부팅
  • 멀티 부팅 환경에서 OS 선택 메뉴 제공
  • 커널 파라미터 수정을 통한 부팅 옵션 제어

평소에는 자동으로 기본 OS를 부팅하기 때문에 GRUB 메뉴를 볼 일이 거의 없다. 문제는 정상 부팅에 실패했을 때 발생한다.

GRUB 모드에 진입하게 되는 상황

GRUB 모드(GRUB 쉘)에 빠지는 대표적인 원인은 다음과 같다.

1) 부트 파티션 손상 또는 변경 디스크 파티션을 변경하거나, Windows 업데이트 후 MBR/EFI가 덮어씌워지면 GRUB이 커널을 찾지 못한다.

2) grub.cfg 설정 파일 손상 /boot/grub/grub.cfg 파일이 잘못 수정되거나 삭제된 경우.

3) 디스크 추가/제거 하드디스크나 SSD를 추가·제거하면 디바이스 순서가 변경되어 GRUB이 기존 경로를 찾지 못한다.

4) 커널 업데이트 실패 커널 업데이트 도중 전원이 꺼지거나 패키지 충돌이 발생한 경우.

GRUB 모드의 두 가지 유형

GRUB 모드에 진입하면 화면에 표시되는 프롬프트가 다르다. 이 차이를 아는 것이 대응의 첫걸음이다.

grub> — 일반 GRUB 쉘

GRUB 코어는 정상 로드되었지만, grub.cfg를 찾지 못한 상태다. 대부분의 GRUB 명령어를 사용할 수 있으므로 수동 부팅이 가능하다.

grub rescue> — 레스큐 모드

GRUB 코어 모듈 일부만 로드된 심각한 상태다. 사용할 수 있는 명령어가 극히 제한적이며, 먼저 모듈을 수동으로 로드해야 한다.

실전 대응: grub> 쉘에서 수동 부팅하기

grub> 프롬프트가 뜨면 아래 순서를 따른다.

Step 1 — 파티션 확인

 
 
grub> ls

연결된 디스크와 파티션 목록이 출력된다. (hd0,gpt2), (hd0,msdos1) 같은 형태다.

Step 2 — Linux 파티션 찾기

각 파티션을 탐색해서 /boot 디렉토리가 있는 파티션을 찾는다.

 
 
grub> ls (hd0,gpt2)/boot

커널 이미지(vmlinuz-*)와 initrd 파일(initrd.img-*)이 보이면 해당 파티션이 맞다.

Step 3 — root 설정 및 커널 로드

 
 
grub> set root=(hd0,gpt2)
grub> linux /boot/vmlinuz-5.15.0-xx-generic root=/dev/sda2
grub> initrd /boot/initrd.img-5.15.0-xx-generic
grub> boot

root=/dev/sdXN 부분은 실제 루트 파티션 디바이스 경로로 바꿔야 한다. 커널 버전도 ls로 확인한 실제 파일명을 사용한다.

실전 대응: grub rescue> 에서 복구하기

레스큐 모드는 한 단계 더 거쳐야 한다.

Step 1 — 파티션 확인 (동일)

 
 
grub rescue> ls
grub rescue> ls (hd0,gpt2)/boot/grub

grub 디렉토리가 있는 파티션을 찾는다.

Step 2 — 모듈 로드

 
 
grub rescue> set prefix=(hd0,gpt2)/boot/grub
grub rescue> insmod normal
grub rescue> normal

normal 모듈이 로드되면 일반 grub> 쉘 또는 GRUB 메뉴로 전환된다. 이후는 위의 수동 부팅 절차를 따르면 된다.

부팅 성공 후: GRUB 영구 복구

수동 부팅에 성공했다면, OS에 진입한 뒤 GRUB을 재설치하여 같은 문제가 반복되지 않도록 한다.

 
 
bash
# GRUB 재설치 (BIOS/MBR 방식)
sudo grub-install /dev/sda

# GRUB 재설치 (UEFI 방식)
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi

# grub.cfg 재생성
sudo update-grub

update-grub은 /boot 아래의 커널을 자동으로 탐지하여 grub.cfg를 새로 만들어 준다.

유용한 GRUB 설정 팁

부팅 시 GRUB 메뉴 항상 표시하기

/etc/default/grub 파일을 수정한다.

 
 
bash
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5

수정 후 반드시 sudo update-grub을 실행한다.

기본 부팅 OS 변경하기

 
 
bash
# 현재 메뉴 엔트리 확인
grep -E "menuentry|submenu" /boot/grub/grub.cfg | head -20

# 기본 엔트리 번호 설정 (0부터 시작)
sudo vim /etc/default/grub
# GRUB_DEFAULT=0 → 원하는 번호로 변경

sudo update-grub

커널 파라미터 추가

특정 하드웨어 이슈 해결을 위해 커널 파라미터를 추가해야 할 때가 있다.

 
 
bash
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"

nomodeset은 그래픽 드라이버 문제로 부팅이 안 될 때 자주 사용하는 옵션이다.

최후의 수단: Live USB로 GRUB 복구

수동 부팅도 불가능한 경우, Ubuntu Live USB로 부팅한 뒤 chroot 환경에서 GRUB을 복구한다.

 
 
bash
# Live USB로 부팅 후
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot/efi    # UEFI인 경우
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys

sudo chroot /mnt

# chroot 내부에서
grub-install /dev/sda                  # 또는 UEFI 방식
update-grub
exit

sudo umount -R /mnt
sudo reboot

정리

상황                                             프롬프트                                  핵심 대응
설정 파일만 유실 grub> set root → linux → initrd → boot
코어 모듈 유실 grub rescue> set prefix → insmod normal → normal
수동 부팅 불가 Live USB chroot → grub-install + update-grub

GRUB 모드는 처음 보면 당황스럽지만, 결국 "파티션 찾기 → 커널 지정 → 부팅"이라는 하나의 흐름이다. 이 흐름만 기억하면 대부분의 부팅 문제에서 빠져나올 수 있다.


DevOps를 지향하는 개발자라면 서버 부팅 장애는 언젠가 반드시 마주치는 상황이다. GRUB 복구를 한 번이라도 직접 해 본 경험이 있다면, 그때의 침착함이 실전에서 큰 차이를 만든다.

LIST

+ Recent posts