### GRUB 에 관하여

[시작하며]

LILO 라는 부트로더를 많이 들어 봤을 겁니다. 이 리로를 대신해서
요즘은 GRUB 을 대부분 사용합니다. 우리말로 "그럽" 이라고 읽습니다.
부트로더란 말그대로 운영체제를 시작시키기 위해서 하드디스크 같은
저장장치의 특수한 위치에서 특수한 기능을 하는 작은 프로그램입니다.
보통 컴퓨터를 쓰기 위해서 전원을 넣으면 하드웨어를 체크하는 CMOS BIOS 단계를
지난후, 첫번째 인식하는 디스크(하드디스크 혹은 시디 혹은 디스켓 등등)의
MBR 이라는 곳에서 부트로더를 찾습니다.

이때 부트로더 자체는 운영체제의 영향을 받지 않습니다. 다만 앞으로
컴퓨터를 장악할 운영체제가 위치하는 파티션 정보와 커널 정보의 위치만
지정해서 유도해 줄 뿐입이다. MS 운영체제에 있는 부트로더로 다른 파티션의
리눅스, BSD 등을 부팅하게 할 수 있고 리눅스 GRUB 으로도 윈도우가 부팅되게
할 수가 있습니다.



[GRUB 의 특징 및 설정]

한소프트리눅스2005 에서 사용하는 부트로더는 GRUB 0.95 입니다.

[root@server-full ~]# rpm -qi grub
Name : grub Relocations: (not relocatable)
Version : 0.95 Vendor: (none)
Release : 4 Build Date: 2004년 11월 02일 (화) 오전 07시 47분 30초
Install Date: 2004년 12월 10일 (금) 오후 01시 55분 44초 Build Host: -f
Group : System Environment/Base Source RPM: grub-0.95-4.src.rpm
Size : 989780 License: GPL
Signature : (none)
URL : http://www.gnu.org/software/grub/
Summary : GRUB - the Grand Unified Boot Loader.
Description :
GRUB (Grand Unified Boot Loader) is an experimental boot loader
capable of booting into most free operating systems - Linux, FreeBSD,
NetBSD, GNU Mach, and others as well as most commercial operating
systems.



설치된 정보는 /boot/grub 디렉토리에 있습니다. 주 설정파일은
/boot/grub/menu.lst 입니다.
예를 들면 아래와 같습니다.


default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title Haansoft Linux FULL (2.6.9-71hs)
root (hd0,0)
kernel /boot/vmlinuz-2.6.9-71hs ro root=LABEL=/
initrd /boot/initrd-2.6.9-71hs.img

title Haansoft Linux MINIMAL(2.6.9-71hs)
root (hd0,2)
kernel /boot/vmlinuz-2.6.9-71hs ro root=/dev/hda3
initrd /boot/initrd-2.6.9-71hs.img


이 설정파일을 보면 그럽은 디스크와 파티션을 인식하는 방법이 리눅스 운영체제가 사용하는
것과 틀리다는 것을 알수 있습니다.

hd0,0 혹은 hd0,2 등과 같이 사용하는 데 여기서 앞의 숫자는 디스크의 순서입니다.
IDE 타입의 하드디스크일 경우 앞숫자는

0 프라이머리의 마스터 드라이브
1 프라이머리의 슬레이브 드라이브
2 세컨더리의 마스터 드라이브
3 세컨더리의 슬레이브 드라이브

를 의미합니다.
두번째 숫자는 각 디스크의 파티션 입니다. 첫번째 파티션을 0 으로 해서 차례로
증가합니다.

hd0,0 은 /dev/hda1 과 같고 hd0,3 은 /dev/hda4 를 의미합니다.
hd1,0 은 /dev/hdb1, hd2,5 는 /dev/hdc6 을 의미합니다.

위 설정파일을 보면 저의 경우 /dev/hda1 에 한소프트리눅스2005 를 전체설치했고
/dev/hda3 에는 최소설치를 했습니다. 부팅할때 두가지 메뉴중에 선택을 할 수 있습니다.

default=0 이라는 것은 등록된 운영체제 중에서 어떤것을 디폴트로 부팅하게 하느냐를
정하는 것입니다. 처음이 0 이고 그다음이 1,2 등입니다. 위 설정파일의 경우 전체설치한
리눅스를 기본으로 부팅하게 했습니다.

timeout=10 이라는 것은 10 초동안 대기시간을 준다는 말입니다. 이 시간 동안
원하는 운영체제를 선택하지 않으면 자동으로 default= 항목에 설정된 운영체제로
이동을 합니다.

만약 윈도우와 멀티부팅을 한다면 아래와 같은 항목이 보일겁니다. 윈도우는 무조건
hd0,0 디스크를 사용할겁니다.

title Windows XP
rootnoverify (hd0,0)
makeactive
chainloader +1


이전 lilo 의 경우 설정파일을 수정하면 lilo 명령어를 실행해서 수정된 내용이
부트영역에 갱신되도록 해야만 했지만 grub 의 경우 그럴 필요가 없습니다.
/boot/grub/menu.lst 파일만 수정하면 부팅시 자동으로 인식이 됩니다.

그리고 만약 grub 을 다시 설치하거나 다른 위치에 설치를 해야할경우네는
grub-install 이라는 명령어로 아래와 같이 사용합니다.

# grub-install /dev/hda



[GRUB 을 이용한 응급 부팅디스켓 만들기]

여기서 말하는 부팅디스켓은 엄밀히 말하면 디스켓으로 시스템을 부팅하는
다른 부팅디스켓과 좀 틀립니다. 이전과 달리 요즘의 리눅스는 커널이 너무커서
디스켓으로 부팅하는 응급복구 기능을 구현하기가 번거롭습니다.
지금 만들려고 하는 부팅디스켓은 디스켓 부트영역에 GRUB 만을 설치하여서
부팅시 하드디스크에 설치된 운영체제로 유도를 해주는 역할만을 하게 됩니다.
윈도우 등의 운영체제와 멀티부팅을 하게 하거나 기타 파티션 관련 민감한 작업을 하다가
MBR 영역을 건드려서, 시스템 영역 자체는 멀쩡히 살아있는데 그 시스템으로
부팅하게 하는 방법이 없어 막막한 경우 등에 사용될 수 있습니다.

먼저 /boot/grub/menu.lst 파일의 정보를 백업해 둡니다. 메모지에 써두든지
아니면 프린트를 해 둡니다. 그리고 신선한 디스켓을 준비해서 플로피 드라이브에
집어넣습니다. mount 하시면 안됩니다.


[root@myselect ~ ]# cd /boot/grub

[root@myselect grub]# dd if=stage1 of=/dev/fd0 bs=512 count=1
1+0개의 레코드를 입력하였습니다
1+0개의 레코드를 출력하였습니다

[root@myselect grub]# dd if=stage2 of=/dev/fd0 bs=512 seek=1
202+1개의 레코드를 입력하였습니다
202+1개의 레코드를 출력하였습니다
[root@myselect grub]# sync


위와 같이 /boot/grub 디렉토리에 있는 stage1 과 stage2 를 dd 명령어로
디스켓에 입력합니다. 이때 count=1 와 seek=1 을 잘 구분해야 합니다.
그런후 이제 재부팅을 해 봅니다.
CMOS 에서 플로피드라이브를 읽다가

GNU GRUB version 0.95 (640K lower / 3072K upper memory)

[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]

grub>

이와 같은 썰렁한 프롬프트가 뜰겁니다. 여기서 수작업으로 설치된 운영체제의
정보를 입력해 줍니다. 커널 이름 등을 외우지 못한다면 위에 적어둔 menu.lst 를
보고 입력합니다.
예를 들면 위의 제 설정중에서 최소모드로 설치한 리눅스로 부팅을 하려면

grub> root (hd0,2)
Filesystem type is ext2fs, partition type 0x83

grub> kernel /boot/vmlinuz-2.6.9-71hs ro root=/dev/hda3
[Linux-bzImage, setup=0x1400, size=0x1867c6]

grub> initrd /boot/initrd-2.6.9-71hs.img
[Linux-initrd @ 0x3c7000, 0x2817c bytes]

grub> boot


위와 같은 과정을 거친후 마지막에 boot 명령을 치면 /dev/hda3 에 설치된
리눅스로 부팅이 됩니다. 만약 윈도우로 부팅을 하려면 역시 자신의
/boot/grub/menu.lst 의 아래와 같은 윈도우 정보를 그대로 한줄씩 쳐주면 될겁니다.
(실제 해보지는 않아서 …-_-;;)

rootnoverify (hd0,0)
makeactive
chainloader +1


이때 한가지 주의할 점은

root (hd0,2)
kernel /boot/vmlinuz-2.6.9-71hs ro root=/dev/hda3

와 같은 grub 설정에서 root(hd0,2) 라는 부분은 /boot 디렉토리가 포함된
곳을 의미합니다. 그리고 그 다음줄 끝부분의 root=/dev/hda3 은 루트파티션(/)을 의미합니다.
보통 설치시 /boot 와 / 루트 를 나누지 않고 같이 설치한 경우에는 동일하지만
/boot 를 /dev/hda3 으로하고 / 를 /dev/hda7 등으로 다르게 했을 경우

root (hd0,2)
kernel /boot/vmlinuz-2.6.9-71hs ro root=/dev/hda7

과 같이 되어야 합니다. 즉 root (hd0,2) 는 커널 이미지(vmlinuz-2.6.9-71hs)가 위치한
곳을 말합니다.

grub에 관하여

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다