20091215 :: Grub2로 업그레이드 하기

사실 이런 내용은 본 블로그의 분점(중 하나)인 ‘숩의 문제해결 레시피’에 올려야 마땅하겠지만, 문제 해결을 못하고 OS를 재설치한 관계로 -_-;; 그냥 본점에 올리게 되었습니다. 본 포스트의 주요 내용은 우분투 위키의 내용을 참고했습니다. (원문 : http://wiki.ubuntu.com/Grub2)

GRUB 란?

리눅스를 한 번도 설치해 본 경험이 없는 사람이라면 들어본 적이 없는 프로그램입니다. grub는 GRand Unified Bootloader의 줄인말로,  초기 부팅 시에 운영체제 (혹은 운영 체제의 커널)을 선택하여 부팅하게 도와주는 멀티 부트 로더입니다. 현재 grub2는 우분투 9.10 버전을 새로 설치하면 기본으로 설치됩니다. 엄밀히는 아직 2가 아니라 1.97 베타4 정도가 됩니다. (2009년 12월 현재)

Grub2 설치하기 (업그레이드)

윈도우가 설치된 머신에서 우분투를 설치하면 grub는 자동으로 설치됩니다. 제 경우에는 우분투 9.04 버전에서 9.10으로 업그레이드를 했는데, 왠지 이 경우에는 grub2로의 업그레이드는 포함이 되지 않았습니다. grub2로의 업그레이드를 위해서는 아래의 과정을 거쳐야 합니다. 초보자에게는 두렵기 그지 없는 존재인 ‘터미널’을 사용합니다. 터미널을 열고 다음의 명령을 실행합니다.

sudo apt-get install grub2

sudo를 통해 시스템의 깊은 곳(?!)을 건드리는 명령을 수행하면, ‘당신이 진짜 su가 맞냐’며 비밀 번호를 물어봅니다. 비밀 번호를 입력해 주시면 되겠습니다.그럼 뭔가 몇 가지 파일을 내려 받고 설치하게 됩니다. 설치 과정에서 몇 가지를 물어보게 됩니다.

  • grub-pc 설정과 관련하여 텍스트 기반으로 보여지는 대화상자가 보입니다. OK를 선택해주면 됩니다.
  • 체인로드가 어쩌구하는 부분을 물어봅니다. ‘Chainload from menu.lst’ –> ‘YES’
  • 다음은 커맨드 라인에서 무슨 명령어를 입력해 보라고 합니다. 그냥 엔터를 누릅니다.

이렇게 해서 설치과정이 끝난 것처럼 보입니다. 하지만 다가 아닙니다. 다시 아래 명령을 바로 입력해 줍니다.

sudo upgrade-from-grub-legacy

여기서 중요한 것이 있습니다. 설치된 하드 디스크를 보여주면서 어디에 grub를 설치할 것인지 물어봅니다. 보통은 (hd,0) /dev/sda가 부팅되는 파티션입니다. 제 경우에는 boot 플래그가 있는 하드 디스크 파티션이 이것 뿐이라 그런지 하나 밖에 표시가 안되더군요. 스페이스바를 눌러서 선택을 하고 엔터를 입력하여 계속 진행합니다. 만약, 마냥 설레기만 해서 그냥 엔터를 눌렀다면 나중에 다시 좀 귀찮게 손을 봐야 합니다.

sudo grub-install

를 입력해서 grub 설치를 완전히 완료합니다. 이제 기존의 설정 파일이나 그런 것들은 전혀 쓸모가 없으니 지워도 상관 없습니다… 라고하지만 혹시 모르니 기존 설정 파일은 잘 보관해 둡니다.

sudo mv /boot/grub/menu.lst /boot/grub/menu.lst.backup

Grub2의 설정들

grub 이전 버전과 달리 grub2는 (이제 익숙해지려고하니)  menu.lst 파일을 더 이상 사용하지 않습니다. 하지만 다른 파일들을 여전히 동일한 폴더에 보관하고 이를 사용합니다. 대표적인 파일은 /boot/grub/ 디렉터리에 있는 grub.cfg 파일입니다. 중요한 것은 이 파일은 결코 수동으로 편집해서는 안된다고 합니다. “update-grub” 명령을 통해서 변경 내용을 적용해야 하며, 이 파일은 다른 grub 설정 파일들을 변경/생성하는 근간이 된다고 하네요.

설정을 변경하기 위해서는 이제, 다른 파일을 편집해야 합니다. 이 파일은 다른 곳에 있는데, /etc/default/grub 라는 파일입니다.

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"

재밌는 것은 디폴트 엔트리 값을 숫자가 아닌 엔트리 이름으로 지정할 수 있다는 것입니다. 커널을 업데이트 받거나해서 메뉴의 개수가 바뀌면 번호값이 따라 바뀌지 못해서 그 때마다 menu.lst 파일을 수정해야 했던 (혹은 몰라서 그랬을 수도 있음, 충분히.) 경험은 더 이상 없을 듯 하네요.

라이브 시디에서 Grub2 복구하기

참고로 저는 설치가 완료되기 전에 귀신에 홀린 듯이 menu.lst 파일을 삭제한 관계로 아예 부팅이 되지 못했습니다. 아래 내용을 좀 미리 알게되었더라면 그러지 않아도 됐을텐데요 엉엉. 아무튼 여기서는 /etc/default/grub 파일의 설정을 어떻게 해야하는지 안다는 전제하에 설명을 해 두었네요. 당연히 파일을 날려 먹었다는 답이 없다는 이야깁니다. 평소에 백업을 잘 해두거나  /home 디렉터리를 다른 안전한 파티션에 두고서 아예 새로 설치하는게 가장 맘편하고 깔끔할 수 있겠다는 생각이 듭니다. 저처럼 대책없이 백업도 안하고 슥슥 잘도 파일들을 지우는 습성은 안 가지시는게 좋아요 ㅠㅠ

우선 grub 복구를 위해서는 라이브 시디가 필요합니다. 미리 하나 구워두는 건 정말 중요한 듯 하네요. 라이브 시디로 부팅한 후 터미널을 엽니다.

sudo fdisk -l

위와 같이 입력하면 어떤 디스크 장치들이 있는지 파티션 목록을 뽑아줍니다. 이 때 리눅스가 설치된 파티션이 나옵니다. 잘 눈여겨봐 둡니다. 제 경우에는 /dev/sda5네요

sudo mount /dev/sda5 /mnt

혹, /boot 디렉터리를 다른 파티션에 만들어 두고 사용중이시라면 이것도 마운트해 줍니다. 이 때에는 윗 부분과 바뀌면 큰일 난다고 합니다. fdisk -l 의 결과를 확인하고 확인하고 또 확인해야 합니다.

sudo mount /dev/sda7 /mnt/boot

이제 남은 장치들을 마저 마운트합니다.

sudo mount –bind /dev /mnt/dev

이제 루트 디렉터리를 변경합니다.

sudo chroot /mnt

이제 기존 리눅스가 설치된 파티션이 루트로 마운트 되었으니, 그냥 설정을 수정한다 생각하고 작업합니다. vi 나 nano를 통해  /etc/default/grub 파일을 편집합니다.

vi /etc/default/grub 혹은 nano /etc/default/grub

설정을 복구하였으면, 이제 변경된 설정이 적용되도록 합니다. 위에서 봤던 명령으로요.

update-grub

이제 MBR에 grub를 재설치합니다.

grub-install /dev/sda

만약 에러가 난다면 굴하지 않고, –recheck 옵션을 써서 다시 시도합니다.

grub-install –recheck /dev/sda (위에서 오류가 난 경우에만)

다 되었습니다. ctrl+D를 눌러 chroot 상태를 빠져나옵니다. 이제 마운트한 장치들을 마운트 해제하고 시스템을 다시 시작합니다.

sudo umount /mnt/dev && sudo umount /mnt

오늘의 교훈 –  vi 를 쓰면 정신 건강에 정말 안 좋은지 요즘 많은 영문 매뉴얼은 nano를 공식 추천한다.

  • kid

    저는 왜 계속.. 1.98로 부팅이 되는 걸까요? 흐읅..

    • 그게 GRUB2 맞습니다 ^^