GRUB-HOWTO
목차
GRUB-HOWTO
그럽은 차세대 부트로더입니다. 기존의 LILO와 구동 방식이 조금 다릅니다. 설치 방법도 약간의 차이가 있습니다. 그럽의 약자는 다음과 같습니다. GRand Unified Bootloader
GRUB은 메모리에 기록되는 것이 아닌 하드 디스크의 파일을 읽어서 부팅할 수 있습니다.
GRUB 자체의 구성
GRUB은 한글로 읽었을 때 그럽이라고 읽습니다. 그럽은 만일의 상황에도 커널의 파일명 등을 알고 있다면 쉽게 부팅이 가능합니다. 최근의 배포판들은 모두 LILO와 GRUB을 선택 지원하나 GRUB이 조금 더 앞서 있습니다. 데비안 리눅스의 경우 아직 LILO가 그 우선 순위에 있지만, 새로운 설치 프로그램이 만들어지고 있어 GRUB의 부트로더 전향이 확실해지고 있지요.
GRUB은 GNU Software이므로 http://www.gnu.org/home.ko.html 에서 관련 자료를 찾아볼 수 있습니다.
GRUB의 설치는 다음과 같습니다.
레드햇
rpm -Uvh grub-x-x-x.rpm
데비안
apt-get install grub
참고로 GNU의 소프트웨어 대부분은 rpm으로 제공하지 않고 데비안으로 링크가 걸려 있습니다. rpm은 손쉽게 배포판을 제작하기 위한 하나의 패키지군입니다. 최근 rpm으로 패키징 된 GRUB은 부팅시 배경 이미지를 사용하기 위해 스플래시 이미지라는 명령을 제공하는데 이것은 극히 드문 배포판에서만 지원되며, 데비안 또한 메인테이너가 패치한 것을 제외하곤 들어 있지 않습니다.
GRUB의 하드 디스크 인식방법
그럽에선 하드디스크를 기존의 리눅스 방식과 같이 읽어들이지 않습니다. 조금 다른 방식으로 하드 디스크를 인식하게 되는데 이 방법은 하드 디스크의 논리적 구성에 따릅니다.
hd0,0
위의 내용은 다음과 같은 뜻입니다. hd는 hard disk의 약자이며 0,0의 뜻은 첫 번째 프라이머리의 첫 번째 마스터 디스크의 첫 번째 파티션을 의미합니다.
여기까지 이해했다면 다음 내용도 익숙할 것 입니다.
hd0,1
그렇습니다. 첫번째 프라이머리의 두번째 파티션을 의미합니다. 여기에서 첫 번째 숫자는 0부터 3까지 올 수 있습니다. 두번째 숫자는 파티션을 몇 개로 나누느냐에 따라서 달라집니다. 다음의 표를 봅시다.
숫자 | 뜻 |
0 | 프라이머리의 마스터 드라이브 |
1 | 프라이머리의 슬레이브 드라이브 |
2 | 세컨더리의 마스터 드라이브 |
3 | 세컨더리의 슬레이브 드라이브 |
그럽에서 하드 디스크를 지칭하는 것은 다음과 같이 합니다.
(hd0)
GRUB의 설치
그럽 패키지 설치가 다 끝났다면 아주 간단하게 그럽의 설치를 할 수 있다. 그럽은 최대한 편하게 설계하려 노력한 흔적이 보인다. 물론 그럽의 작성 언어는 C이다. 그럽은 최대한의 여유를 두어 사용자를 배려했는데 사용자는 이 부분이 싫을 수도 있겠다. 그럽의 설치는 루트의 권한으로 다음과 같이 해준다.
# grub-install /dev/hda
위의 예제에서도 특별한 경우가 없는 한 hda이고 다른 경우 hdb가 될 수도 있겠습니다. 파티션 번호를 붙이지 않는 이유는 그 하드 디스크의 MBR에 설치하기 때문입니다.
다음에는 그럽을 하드 디스크에 심어야 합니다. 다음 명령어로 그럽 셸에 들어 갑니다.
# grub
그럽 셸에 들어 가면 다음과 같은 화면이 나타납니다.
GNU GRUB version 0.94 (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>
먼저 루트 파티션을 설정 해야 합니다. 저(키노코군)의 경우, 루트 파티션을 지정하면 안 되고, 부트 파티션을 지정해야 하더군요. (왠지 모르겠지만 다들 루트라고 하니..;)
다음과 같이 설정해 줍니다. 저의 경우 hd(0,1)이 부트 파티션입니다. ( root 명령은 이후 grub이 필요한 파일을 찾을 기준점을 알려주는 것입니다. /boot 디렉토리가 있는 파티션을 지정해줍니다. )
grub> root (hd0,1) Filesystem type is ext2fs, partition type 0x83 grub>
다음에는 그럽을 심을 차례입니다. 예전에는 install (hd0,1)/grub ... 이렇게 복잡하게 했으나, 언제부터인가 setup이란 명령어로 간단하게 해결이 되더군요. 다음과 같이 심어 줍니다. (setup 명령은 root 명령으로 지정한 곳에서 grub stage 파일들을 찾아 실제로 하드에 심는 과정입니다. MBR에 grub을 설치하려면 "setup (hd0)"과 같이 해줍니다.)
grub> root (hd0,1) Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0,1) Checking if "/boot/grub/stage1" exists... no Checking if "/grub/stage1" exists... yes Checking if "/grub/stage2" exists... yes Checking if "/grub/e2fs_stage1_5" exists... yes Running "embed /grub/e2fs_stage1_5 (hd0,1)"... failed (this is not fatal) Running "embed /grub/e2fs_stage1_5 (hd0,1)"... failed (this is not fatal) Running "install /grub/stage1 (hd0,1) /grub/stage2 p /grub/menu.lst "... succeeded Done. grub>
이렇게 되면 성공입니다. 다음에는 그럽의 메뉴 파일을 만들 차례입니다.
GRUB의 메뉴 파일 만들기
GRUB root directory(설치 과정에서 root 명령으로 지정)의 grub/menu.lst가 설정 파일입니다. lilo.conf와 비슷한 개념이니 새로 간단히 만들 수도 있지만 이미 만들어진 것을 고쳐 쓸 수 있습니다.
~# cp /usr/share/doc/grub/examples/menu.lst /boot/grub ~# cat /boot/grub/menu.lst # # Sample boot menu configuration file # # Boot automatically after 30 secs. 사용자의 입력을 기다리는 시간. 이후에 default로 부팅 timeout 30 # By default, boot the first entry. 0부터 첫 번째 default 0 # Fallback to the second entry. 기본 값으로 부팅이 실패한 경우 fallback 1 # For booting GNU (also known as GNU/Hurd) GNU/Hurd로 부팅하는 예제 title GNU (also known as GNU/Hurd) # 부팅 메뉴에 나타나는 타이틀 root (hd0,0) # 부팅하는 데 필요한 파일들을 찾을 기준점, Grub의 Root kernel /boot/gnumach.gz root=device:hd0s1 # 커널과 커널 인수 지정 module /hurd/ext2fs.static --multiboot-command-line=${kernel-command-line} --host-priv-port=${host-port} --device- master-port=${device-port} --exec-server-task=${exec-task} -T typed ${root} $(task-create) $(task-resume) module /lib/ld.so.1 /hurd/exec $(exec-task=task-create) # For booting GNU/Linux # GNU/Linux로 부팅하는 예제 title GNU/Linux root (hd1,0) # 이 root는 Grub의 루트 kernel /vmlinuz root=/dev/hdb1 # 이 root는 System의 루트 #initrd /initrd.img # For booting Mach (getting kernel from floppy) title Utah Mach4 multiboot root (hd0,2) pause Insert the diskette now^G!! kernel (fd0)/boot/kernel root=hd0s3 module (fd0)/boot/bootstrap # For booting FreeBSD or GNU/KFreeBSD title FreeBSD / GNU/KFreeBSD root (hd0,2,a) kernel /boot/loader # For booting NetBSD or GNU/KNetBSD title NetBSD / GNU/KNetBSD root (hd0,2,a) kernel --type=netbsd /netbsd # For booting OpenBSD title OpenBSD root (hd0,2,a) kernel --type=netbsd /bsd # For booting OS/2 title OS/2 root (hd0,1) makeactive # chainload OS/2 bootloader from the first sector chainloader +1 # This is similar to "chainload", but loads a specific file #chainloader /boot/chain.os2 # For booting Windows NT or Windows95 title Windows NT / Windows 95 boot menu rootnoverify (hd0,0) makeactive chainloader +1 # For loading DOS if Windows NT is installed # chainload /bootsect.dos # For installing GRUB into the hard disk title Install GRUB into the hard disk root (hd0,0) setup (hd0) # Change the colors. title Change the colors color light-green/brown blink-red/blue
우선 쓰이지 않는 것들을 다 지우고 필요한 것만 남깁니다. 그리고 새로 커널을 컴파일했다면 기존의 것을 복사해서 붙인 후 커널의 이름과 필요한 것들을 변경해주고 다시 grub을 설치해줍니다.
GRUB 응급 floppy 만들기
GRUB이 LILO에 비해 탁월한 점이라면 부팅 과정을 유연하고 강력하게 조정할 수 있다는 것입니다. Grub floppy를 만들어 두면 어떤 운영체제가 깔려 있든지 prompt상에서 부트 파일을 찾아 부팅할 수 있도록 해줍니다. 운영체제마다 응급 floppy를 만들어 둘 필요도 없고, 문제를 해결한 후 재부팅할 필요도 적어집니다. floppy에 담긴 것으로 부팅을 하는 것이 아니라 하드 디스크에서 부트 파일을 찾아 그것으로 부팅할 수 있게 해 주기 때문입니다.
우선, 깨끗한 floppy를 넣고 아래와 같이 해 줍니다.
# cd /usr/lib/grub/i386-pc # dd if=stage1 of=/dev/fd0 bs=512 count=1 1+0 records in 1+0 records out # dd if=stage2 of=/dev/fd0 bs=512 seek=1 153+1 records in 153+1 records out
이제, label을 붙이고 잘 간수합니다. :-)
만일 MBR이 지워져 부트 로더가 날라간 상황이 닥쳐오면 이 플로피를 넣고 부팅합니다. /boot가 /dev/hda1, /(root)가 /dev/hda2에 있다면,
GNU GRUB version 0.94 (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> grub> root (hd0,0) grub> kernel vmlinuz root=/dev/hda2 grub> boot Uncompressing Linux...
부팅이 완료되면, Grub을 재설치해줍니다. 만일 옆에 있는 쓸모 없는 Windows 머신의 MBR이 날라갔다면 역시 이 플로피를 넣고 아래처럼 해줍니다. Windows가 첫번째 파티션을 쓰고 있다고 하면,
grub> root (hd0, 0) # 또는 grub> rootnoverify(hd0, 0) grub> makeactive grub> chainloader +1 grub> boot
GRUB-테마(Splash) 띄우기
즐거운 데비안 (漸入佳境 Debian)에서 가져옴. (추가: 한정훈)
참고 문서: http://ruslug.rutgers.edu/~mcgrof/grub-images/
-->> 처음 'splashimage hack'을 시도한 분: Paulo César Pereira de Andrade(pcpaatconectiva.com.br), Conectiva 소속.
-->> 현재 스플래시를 지원하는 데비안 배포 버전: Sid(=unstable), GRUB v0.93+cvs..
-->> 지원되지 않는 배포판에서 소스 컴파일하기:
- Historic Connectiva httppatches for GRUB (for 0.92)
- Red Hat 8.0 httppatch for GRUB
- 데비안 GRUB http소스트리
sid에서 필요한 이미지 정보:
- xpm.gz (gzip으로 압축된 XPM 이미지 파일)
- 640x480 사이즈
- indexed 14 칼라만 사용 가능 (GIMP에서 "이미지" -> "모드" -> "Indexed" -> 14color 로 입력)
일반적으로 이미지 파일을 gzip으로 압축해서 사용하는 편이지만, 굳이 압축하지 않아도 됨. (사용 이유: 파일 사이즈 줄임. 단점? gz-압축푸는 시간(?). 이미지 용량: 각자의 램용량에 의해 좌우됨. 즉, 별로 신경 안 씀)
설정: 바이오스 검사 후 그럽이 실행될 때 화면에 띄우고 싶은 이미지를 위의 정보에 맞게 편집해서 "/boot/grub" (또는 GRUB의 root 디렉토리)에 복사한다. GRUB의 메뉴 설정 파일('menu.lst')에 아래와 같은 라인을 추가한다.
추가할 부분 (예)>>> splashimage=(hd0,1)/boot/grub/suna-splash-gray.xpm.gz --> splashimage=(리눅스의 루트 파티션)/(이미지의 전체 경로 및 파일명)
위의 참고 문서를 읽어보면 알겠지만, 이 스플래시 기능은 오리지날 GRUB에 스플래시 기능을 쓸 수 있도록 패치한 버전에만 쓸 수 있다. 데비안에서는 현재 sid 배포 버전에 이 패치된 GRUB이 들어 있기 때문에 그냥 쓰면 되며, 이하의 배포 버전(stable, testing)들은 버전이 안 되면 위의 링크에서 소스를 다운로드해서 컴파일하면 될 것이다. 이 코드가 GRUB에 포함되지 않은 이유는 조만간 나올 차세대 GRUB에는 VESA 기능이 추가될 것인데, 여기서 지원하는 14컬러보다 더 많은 색을 허용하기 때문에 결국 이 패치판은 언젠간 사라질 것 이라고 한다. 그러나 데비안 시드는 그다지 걱정 안 해도 된다고 본다. 어차피 신버전의 패키지는 메인테이너들에 의해서 계속해서 업데이트될 테니까..!
평소 때 관심 있는 이성의 사진이나 연인의 사진을 적당히 편집해서 사용하면 그야말로 환상적이다. 단, 14컬러만 지원되기 때문에 사진은 김프에서 그레이 스케일로 바꾼 후 14칼라로 조정해서 쓰도록 하자. 잡티나는 컬러보다는 흑백이 더욱 돋보인다.
설정2: menu.lst 파일에 "background=DD0000f", "foreground=FFFFFF"와 같이 제한적으로나마 메뉴의 색깔을 지정해줄 수 있다.
아무것도 안 적으면 그냥 검정/흰색으로 나오며, 사진에 따라 적절한 색깔을 지정해주는 게 낫다. 색깔 코드는 이미지 프로그램을 이용해도 되며, 간단히 /usr/X11R6/lib/X11/rgb.txt 파일에서 코드를 검색한 후 약간 변경해서 사용할 수도 있다. 이 속성은 스플래시를 사용할 때 적용되며, 이전의 그냥 메뉴 기반의 "color fg/bg selected-fg/selected-bg" 옵션은 그냥 무시된다.