리눅스 GRUB 부트로더 복구하기

리눅스와 윈도우등을 함께 사용할 수 있도록 멀티부팅을 GRUB 부트로더를 중심으로 구성한 경우, 가끔 가다보면 GRUB 부트로더가 손상되는 경우가 있습니다. 예를들어, 리눅스를 먼저 설치한 뒤에 윈도우 XP와 같은 윈도를 설치한 경우가 이에 해당합니다. (이렇게 되면, 리눅스로는 부팅되지 않고 곧바로 윈도우로만 부팅되게 되지요)

이럴 경우에는 보통 grub-install 명령으로 자동적으로 복구되게 하던가, 혹은 grub 명령으로 직접 수동으로 복구를 해야 합니다.

그런데 GRUB 부트로더를 복구할때 발생하는 정말로 괴로운,
진정한 문제는 따로 있습니다.

바로 위의 명령으로 부트로더를 복구하려고 할때 아래 오류가
발생하는 경우가 있다는 점입니다.

예를들어, 리눅스를 설치한뒤 윈도XP를 설치하는 바람에
GRUB 부트로더가 망가져 버렸다고 할때에,
우분투 설치 시디나, 그 밖의 리눅스 라이브 CD로 부팅해서
터미널에 아래와 같이 입력한다고 가정해 봅시다.

sirjhswin@laptoplinux:~$ grub-install /dev/hda
(터미널에 명령어 입력)


이 경우에, 분명히 아래와 같은 오류가 뜨는 경험을
하신분들이 계실겁니다.

/dev/hda: Not found or not a block device.


저는 예전에, 분명히 grun-install 이나 grub 명령을
입력하면 부트로더가 잘 복구될거라고 생각했는데 아무리 저 명령들을
입력해도 계속해서 저 오류만 떠서 고생했던 경험이 있습니다.

분명히 존재하는, 알맞은 장치(하드)를 넣었고, grub 명령때도
올바른 값을 넣어줬는데도 저 오류는 계속해서 발생했습니다.

해외의 우분투 포럼 같은곳에도 이 문제로 고생하는 분들이
계신것을 봤는데, 이 문제가 왜 생기는지도 알 수 없는 상태였기에
해결 방법을 찾을 수 없어서 그냥 리눅스를 새로 설치했다는
이야기만을 보게 되었습니다.

그때 저는 정말 마음이 답답했습니다.
저 오류, 해결 방법이 정말 없는 것일까?
왜 명령이 적용되지 않고 저 오류가 발생되는 것일까?
분명히 존재하는데 왜 찾을 수 없다는 거지?
하는 생각이 머릿속을 떠나지 않았습니다.

그래서 계속해서 끝까지 해결 방법을 찾던 중,
결국 해결 방법을 찾아내게 되었습니다.

해결 방법은 아래와 같습니다.
혹시, 이 문제로 고생하고 계시는 분이 계시다면
한번 이 방법을 시도해 보셨으면 합니다^^....

설명은 우분투 라이브 CD를 중심으로 합니다만,
다른곳에도 거의 같게 적용됩니다.


복구 과정을 시작하시려면, 우선 라이브CD ( 여러 리눅스 배포판에서 라이브CD를 제공하고 있습니다. 여기서는 우분투 라이브CD를 기준으로 합니다. ) 를
드라이브에 넣고 컴퓨터를 리부트해 주십시오.

그리고나서 고르신 리눅스 배포판의 라이브CD로 부팅을 해주세요.

만일 여러분이 고르신 라이브CD에서 터미널이 곧바로 나타나지 않으면
하나 띄워주십시오.

우분투 라이브CD에서 터미널을 띄우시려면, 프로그램 -> 시스템 도구 -> 터미널 을 클릭해서 띄우시면 됩니다.
(영문은 Applications -> System Tools -> Terminal)


참고: 라이브CD 환경에서는, 사용자 계정이나 이 레벨에서 파일시스템 레이아웃에 변경한 사항들이 영구적이지 않을겁니다. 즉, 이 말은 실제 본 시스템에 영향을 미치지 않고서도 임시로 root 암호를 설정하거나 디렉토리를 만드는것이 가능함을 말합니다. 홈디렉토리도 램드라이브에 생성되니까, 임시 디렉토리라면 그 곳에 만드시면 됩니다. 물론, 시스템 재시작과 함께 모두 사라지게 됩니다.


자! 이제 grub-install 등의 명령을 사용해도 "Not found or not a block device." 라는 에러만 발생하고 부트로더 복구 작업을 더 이상 진행 할 수 없는 경우, 어떻게 해야 하는지 본격적으로 복구 작업을 시작해 봅시닷 ^_^!
(오류가 "not found or no block device" 인 경우도 있습니다.)


우선, root 의 권한을 얻어야할 차례입니다.
우분투하에서는, 아래 명령어를 터미널에 입력하시면 되겠지요 ^^?

sudo -i

Knoppix의 경우에는, 아래 명령으로 가능합니다. 암호를 입력하라고  뜨지도 묻지도 않을것입니다.

su -

이제 루트 권한을 얻었고, 부트로더 파일을 담고 있는 파티션(들)을
마운트할 차례입니다.

/sbin/ 과 /boot 디렉토리 모두 액세스가 가능해야 합니다.
만일 fstab 의 목록에 /boot 가 있을 경우,
두 개의 파티션을 마운트해야 겠지요.


일단 여러분의 작업 환경을 위한 마운트 지점을 만드셔야 합니다.
(즉, 마운트 하고 작업하기 위한 디렉토리를 하나 만들어야 합니다)

mkdir /mnt/work

혹시 부팅을 위한 /boot/ 파티션을 따로 나눠두어서,
/boot 도 마운트 하셔야 할
경우에는 아래 디렉토리도 만드셔야 합니다.
mkdir /mnt/work/boot

이제 실제로 여러분의 파일시스템 데이터를 불러둘일 차례입니다.
fstab 을 하나 하나 보시고, / 와 /boot의 정확한 위치를 확인하세요.

그런데, 혹시나 리눅스에서 장치에 접근하는 것이 익숙하지
않은분들을 위해 리눅스나 유닉스 계열에서 장치를 어떻게
구분하는지 살짝 추가 자료를 덧붙입니다:

fd0첫번째 플로피 드라이브
fd1두번째 플로피 드라이브


hda첫번째 IDE 포트 마스터에 달린 IDE 하드디스크 / CD-ROM
hdb첫번째 IDE 포트 슬레이브에 달린 IDE 하드디스크 / CD-ROM
hdc두번째 IDE 포트 마스터에 달린 IDE 하드디스크 / CD-ROM
hdd두번째 IDE 포트 슬레이브에 달린 IDE 하드디스크 / CD-ROM
hda1첫번째 IDE 하드디스크의 첫번째 파티션
hdd15네번째 IDE 하드디스크의 열다섯번째 파티션


sdaSCSI ID가 가장 낮은 (0번) SCSI 하드디스크
sdbSCSI ID가 다음 번호인 (1번) SCSI 하드디스크
sdcSCSI ID가 다음 번호인 (2번) SCSI 하드디스크
sda1첫번째 SCSI 하드디스크의 첫번째 파티션
sdd10네번째 SCSI 하드디스크의 열번째 파티션


sr0SCSI ID가 가장 낮은 SCSI CD-ROM
sr1SCSI ID가 다음 번호인 (2번) SCSI CD-ROM


ttyS0시리얼 포트 0, MS-DOS에서는 COM1
ttyS1시리얼 포트 1, MS-DOS에서는 COM2
psauxPS/2 마우스 장치
gpmdata가장 장치, GPM (마우스) 데몬에서 나온 데이터의 리피터


cdromCD-ROM 드라이브에 대한 심볼릭 링크
mouse마우스 장치 파일에 대한 심볼릭 링크
쉽게 말해서, /dev/hda3 에서는 "a"가 첫번째 하드디스크 임을 의미하고,
"3" 이 세번째 파티션임을 의미한다고 보시면 됩니다^_^.


참고: 한가지 분명히 기억하셔야 하는점은, 아래쪽의 예제에 나온 /dev/hda3 과 /dev/hda4 를 그대로 입력하시면 안된다는 점입니다. 여러분의 환경에 맞게끔 변경해서 입력하세요.

리눅스가 들어있는 메인 파티션 / 의 위치는 확인 하셨지요?
그리고, /boot 가 따로 파티션으로 나뉘어져 있는 경우에는
/boot 의 위치도 확인 하셨지요?

이제 아래의 명령을 입력해서 GRUB이 필요로 할 몇몇 정보와
파일시스템을 불러와 보도록 합시다.

mount /dev/hda4 /mnt/work
mount -o bind /dev /mnt/work/dev
mount -o bind /proc /mnt/work/proc
cp /proc/mounts /mnt/work/etc/mtab


이제, 준비는 끝났고 작업 환경으로 진입하셔야 합니다.
아래 명령을 입력하세요.

chroot /mnt/work/ /bin/bash

경고: 이 시점부터, 수정하시는 어떤 파일이라도 여러분의 하드에 설치된 리눅스에 영향을 주게 됩니다. 라이브CD의 안전함은 더 이상 적용되지 않습니다. 이제 좀 더 주의를 기울여 주세요.


GRUB 자동으로 복구하기

별도의 /boot/ 파티션이 있으시다면, 아래 명령을 터미널에 입력하세요.

sudo mount /dev/hda3 /boot/

이제부터 GRUB을 재설치하는 것은 매우 쉽습니다.
아래 명령을 딱- 하고 입력하시면 됩니다.
sudo /sbin/grub-install /dev/hda 

만일 위에서 사용한 명령이 실패하게 된다면,
GRUB을 수동으로 설정하셔야 합니다. (하지만 그렇게 어렵지는 않아요^_^)

이 명령이 성공적으로 잘 실행되었다면,
마지막 부분에 있는 "GRUB 메뉴 설정하기" 부분을 보시면 됩니다^^...

GRUB 수동으로 복구하기

이 과정을 시행하시기 전에, GRUB이 파티션을 어떻게 구분하는지
아셔야 합니다.

GRUB 명령에서는, 해당 장치의 위치를 숫자로 표현합니다.
그리고 그 숫자는, 0부터 시작합니다.

예를 들어서, /dev/hda1 은 GRUB에서는 "hd0,0" 으로 표현 됩니다.
이와 유사하게, /dev/hdb3 은 "hd1,2"로 표현 할 수 있습니다.

참고: 두번째 줄의 "root" 명령이 포함된 줄은, (만일 있다면) /boot/ 파티션의 위치를 적어주셔야 합니다. /boot/가 따로 파티션으로 나뉘어져 있지 않다면,
리눅스가 있는 / 파티션의 위치를 적으시면 됩니다.

sudo /sbin/grub
grub> root (hd0,2)
grub> setup (hd0)
grub> quit



GRUB 메뉴 설정하기

참고: 이 단계는 단순히 MBR(=마스터 부트 레코드)만을 복구하실 생각이라면 진행하실 필요가 없습니다. 윈도우를 설치하는 것은  GRUB 부트로더의 부팅메뉴 정보를 담고 있는  menu.lst 의 내용을 변경하지는 않기 때문에, 문제가 생기기 바로 전에 리눅스로 부팅이 잘 되었다면 이 단계를 시행하지 않고 컴퓨터를 리부트 하시면 됩니다^^.


우선 부팅 메뉴를 손보시려면, 가장 선호하시는 에디터(vi, emacs, nano등..)로, GRUB 메뉴 파일인 /boot/grub/menu.lst 를 열어 주십시오.

아래 예처럼 말이지요 ^_^...

sudo nano /boot/grub/menu.lst

참고: 앞서 말씀드렸듯이, menu.lst 파일은 GRUB이 어디에 있는 운영체제를 어떻게 불러와야 하는지와, 시작시에 띄워볼 수 있는 메뉴등의 모양과 형태는 어떠해야 하는지에 관한 정보를 담고 있습니다. 이 포스팅에서는 운영체제가 부팅되도록 하는데에만 촛점을 두려고 합니다. 부트로더를 어떻게 예쁘게 보이도록 꾸미는지에 관해서는 설명하지 않습니다. 나중에 기회가 되면 거기에 대해서 다루어 볼께요.


필요없는 코멘트를 날린 menu.lst 의 예제는 아래와 같습니다.
위의 예에서 사용한 /dev/hda3 와 /dev/hda4 에 기반해서 작성되었고,
Windows는 /dev/hda1 에 있다고 가정하고 있습니다.


timeout 5 #운영체제로 부팅하기 전에, GRUB이 기다려야 할 
#대기 시간을 여기서 설정합니다.

default 0 #시간이 다되면, 기본적으로 부팅될 메뉴를
#여기서 지정해 줍니다.

fallback 1 #첫번째 방법의 부팅이 실패한 경우,
#그 다음으로 부팅될 항목을 정해 줍니다.


title Ubuntu, 2.6.10 #32-bit 우분투 진입용 메뉴항목
#이 항목이 (혹은 이와 유사한것) 이 여러분의
#설정 파일에 있어야 합니다.
root (hd0,2)
initrd /initrd.img-2.6.10-5-386
kernel /vmlinuz-2.6.10-5-386 root=/dev/hda4

title Ubuntu, 2.6.10 #또 다른 32-bit 우분투
#이것은 따로 /boot/ 파티션을 가지고 있지 않은 경우에
#어떻게 메뉴를 구성해야 하는지를 나타낸 예입니다.
#첫번째 메뉴 항목에 대한 대안의 예로서 놓은 것이기에,
#실제 환경에서는 둘을 같이 사용하시면 안됩니다.
root (hd0,2)
initrd /boot/initrd.img-2.6.10-5-386
kernel /boot/vmlinuz-2.6.10-5-386

title Microsoft Windows XP Home #윈도우용
root (hd0,0)
makeactive # 해당 파티션을 활성으로 변경
chainloader +1 # 체인로더를 써서 로드

네, 이제 모든 과정이 완료되었네요.
파일을 저장하고 닫은다음, 리부트 해서 각각의 항목으로 부팅해 보세요^_^.

혹시, 윈도로 부팅하려고 선택했는데 부팅이 잘 되지 않으면
root(hd0,0) 를 rootnoverify(hd0,0) 으로 변경해 보세요.

rootnoverify 는 root와 유사하지만 파티션을 마운트하려고 하지 않기 때문에
디스크의 GRUB이 읽을 수 있는 영역밖에 운영체제가 있을 경우
매우 유용합니다.

Sirjhswin

최종 수정일:
서지스윈

서지스윈

IT와 기술을 이해하고, 유용한 소프트웨어를 발견하도록 돕고 싶습니다. 윈도우(Windows), 맥(macOS), 리눅스(Linux), 스마트폰 앱, 웹 서비스, 기획 시리즈물까지. 더 많은 것을 발견하고, 더 많은 것을 해보세요.