이 기사를 통해 Linux 시스템용 부트 매니저를 선택, 설치 및 구성하는 방법을 배울 수 있으며, 내용은 다음과 같다.
- 다중 부팅 위치 및 백업 부팅 옵션 구성
- GRUB 또는 LILO과 같은 부트 로더 설치 및 구성
- 부팅 매개변수 추가 또는 부팅 시간에 부트 로더 명령 실행
- 공통 부팅 문제 해결
- GRUB Legacy를 사용하여 GRUB 2 시스템 부팅
이 기사에서는 PC 부팅 프로세스와 Linux에서 사용되는 두 가지 주 부트 로더—LILO 및 GRUB—에 대해 논하고 Linux Professional Institute의 Junior Level Administration(LPIC-1) 시험 기초 과정에서 Topic 102의 Objective 102.2에 대비하는 데 도움이 되는 정보를 제공한다. 현재 시험 목적에 필수 항목은 아니지만, GRUB 2도 소개한다. 이 목적의 가중치는 2이다.
본 시리즈에 수록된 기사를 최대한 활용하려면 Linux에 대한 기본적인 지식과 이 기사에서 다루는 명령을 실습할 수 있는 Linux 시스템이 있어야 한다. 또한, "Learn Linux 101: Hard disk layout" 기사에서 설명하는 하드 드라이브 레이아웃도 익히 알고 있어야 한다. 때때로 같은 프로그램이라도 버전이 다르면 출력 형식이 다르므로, 실습 결과가 이 기사에서 보여주는 Listing 및 그림과 항상 정확히 같지는 않을 수도 있다.
주: 이 기사에 삽입된 이미지는 부팅 프로세스 초기에 캡처한 화면 이미지다. 화면 판독기를 사용하여 이 기사를 읽을 경우, 해당 구성 파일을 참조용으로 제공하여 본 기사 후반부의 다운로드 섹션에서 이들 구성 파일을 다운로드할 수 있게 하는 것이 유리하다는 점을 깨달을 수도 있다.
LILO 및 GRUB에 대해 논하기 전에, PC가 시작 또는 부팅되는 방법을 살펴보자. BIOS(Basic Input Output Service)라고 하는 코드는 ROM, EEPROM 또는 플래시 메모리와 같은 비휘발성 메모리에 저장된다. 이 코드는 PC를 켜거나 다시 부팅할 때 실행된다. 이 코드는 보통 POST(전원 공급 자체 테스트)를 수행하여 시스템을 검사한다. 마지막으로, BIOS는 부팅 드라이브의 MBR(마스터 부트 레코드)에서 첫 번째 섹터를 로드한다.
"Learn Linux 101: Hard disk layout" 기사에서 설명한 바와 같이, MBR에는 파티션 테이블도 포함되므로, MBR에서 실행 가능한 코드의 양은 512바이트 미만으로 그다지 많지는 않다. 플로피까지 포함한 모든 디스크에는 MBR에 실행 가능한 코드가 들어 있는데, 이는 코드가 "Non-bootable disk in drive A:"와 같은 메시지를 출력하는 수준에 불과한 경우에도 마찬가지다. 이 첫 섹터에서 BIOS에 의해 로드되는 이 코드를 1단계 부트 로더 또는 단계 1 부트 로더라고 한다.
MS DOS, PC DOS 및 Windows® 운영 체제에서 사용하는 표준 하드 드라이브 MBR은 파티션 테이블을 검사하여 활성으로 표시되는 부팅 드라이브 상의 1차 파티션을 찾고, 그 파티션에서 첫 번째 섹터를 로드하고, 로드된 코드의 시작 부분으로 제어 권한을 전달한다. 이 새로운 코드는 파티션 부트 레코드로 알려져 있기도 하다. 파티션 부트 레코드는 실제로는 또 하나의 1단계 부트 로더지만, 파티션에서 블록 세트를 로드하기에 꼭 알맞은 인텔리전스만 가지고 있다. 이 새로운 블록 세트에 있는 코드를 2단계 부트 로더라고 한다. MS-DOS와 PC-DOS에서 사용되는 것처럼, 2단계 로더에서는 운영 체제의 나머지 부분을 로드하는 단계로 바로 진행한다. 이것이 바로 운영 체제가 실행될 때까지는 운영 체제에서 부트스트랩으로 스스로 중지하고 있는 방법이다.
이것은 단일 운영 체제가 있는 시스템에서 정상 작동한다. 여러 운영 체제(예: OS/2, Windows XP 및 세 가지 다른 버전의 Linux)를 원하는 경우 어떤 일이 일어날까? DOS FDISK 프로그램과 같은 프로그램을 사용하여 활성 파티션을 변경하고 다시 부팅하는 것이 가능하다. 하지만, 귀찮은 방법이다. 더욱이, 한 디스크에는 기본 파티션이 네 개만 있을 수 있고 표준 MBR에는 활성 기본 파티션이 하나만 있을 수 있으므로, 논리 파티션에서 부팅할 수 없다. 그러나 우리가 가정한 예제에서는 다섯 개의 운영 체제를 열거했고, 각 운영 체제마다 파티션이 필요하다. 이런!
하지만, 걱정할 건 없다. 사용자가 어떤 운영 체제를 부팅할지 선택할 수 있는 특수 코드를 사용하는 데 해결의 실마리가 있기 때문이다. 예제는 다음과 같다.
- Loadlin
- Linux 파티션을 부팅하기 위해 실행 중인 DOS 시스템에서 호출되는 DOS 실행 프로그램이다. 이 프로그램은 다중 부팅 시스템 설정이 복잡하고 위험한 프로세스였던 시절에 많이 쓰였다.
- OS/2 부트 매니저
- 작은 전용 파티션에 설치되는 프로그램이다. 파티션은 활성으로 표시되고 표준 MBR 부팅 프로세스에서 OS/2 부트 매니저를 시작하면서 사용자가 어떤 운영 체제를 부팅할지 선택할 수 있는 메뉴가 표시된다.
- 스마트 부트 로더
- 운영 체제 파티션에 상주할 수 있고 활성 파티션의 파티션 부트 레코드나 마스터 부트 레코드에 의해 호출되는 프로그램이다. 예제는 다음과 같다.
- BootMagic(Norton PartitionMagic의 일부)
- LILO(LInux LOader)
- GRUB(GRand Unified Boot loader, 지금은 GRUB Legacy로 지칭함)
- GRUB 2(일반적인 배포 버전에서 이제 막 새로 등장하기 시작한 부트 로더)
분명한 점은, 작업 완수를 위해 512바이트를 초과하는 코드를 가진 프로그램으로 시스템 제어권을 넘길 수 있는 경우에는 논리 파티션에서 부팅하거나 부팅 드라이브에는 없는 파티션에서 부팅하도록 허용하는 것이 그리 어렵지는 않다는 사실이다. 사용자가 임의의 파티션에서 부트 레코드를 로드할 수 있거나 부팅 프로세스를 시작하려면 어떤 파일을 로드할지 사용자가 알고 있기 때문에, 이 모든 해결책에서는 이런 가능성이 있는 것이다.
부트 매니저가 제어 권한을 가질 때 다른 부트 매니저를 로드할 가능성이 있다. 이것을 체인 로딩이라 하는데, MBR(마스터 부트 레코드)에 위치한 부트 매니저가 파티션 부트 레코드에 있는 부트 로더를 로드할 때 이런 일이 가장 자주 발생한다. Linux 부트 로더에 Windows 또는 DOS 파티션을 부팅하라는 요구가 있을 때 거의 항상 다른 부트 매니저를 로드하지만, 한 시스템의 Linux 부트 로더에 다른 시스템의 부트 로더를 로드하라는 요구가 있을 때도 이런 일이 발생할 수 있다. 예를 들어, 한 파티션에서 Linux 시스템을 시작하기 위해 그 파티션의 LILO를 사용하여 다른 파티션의 부트 레코드에 있는 LILO를 시작할 수 있다.
LILO 및 GRUB가 대부분의 Linux 배포 버전에 포함되어 있는 부트 로더이므로, 지금부터는 이 두 부트 로더에 초점을 맞춰 설명하겠다. LILO가 소개된 지는 꽤 되었지만, GRUB는 근래에 등장했다. 애초의 GRUB가 지금은 GRUB Legacy가 되었고, Free Software Foundation의 후원을 받아 GRUB 2가 개발되고 있는 중이다(자세한 내용은 참고자료 참조). GRUB 2에 대해 간략하게 설명할 것이므로, GRUB와 GRUB 2의 주요 차이점과 이 둘이 어떻게 공존할 수 있는지 알 수 있을 것이다. 본 기사의 나머지 부분에서는 문맥상 구체적으로 GRUB 2를 나타내지 않는 한, GRUB는 GRUB Legacy를 의미하는 것으로 가정한다. (BIOS가 아니라 Intel의 EFI(Extensible Firmware Interface)를 사용하는 부팅 시스템용으로 디자인된) ELILO라는 LILO의 새 버전도 사용할 수 있다. GRUB 2와 ELILO에 대한 추가 정보는 참고자료를 참조한다.
사용자가 보유한 배포 버전에 적합한 설치 프로세스에서는 어떤 부트 로더를 설치할 것인지 사용자가 선택하도록 되어 있을 것이다. 일부 배포 버전(특히, Fedora)에는 더 이상 LILO가 포함되지 않지만, GRUB 또는 LILO는 대부분의 현대식 디스크에서 작동한다. 디스크 기술은 급격한 발전을 거듭해왔으므로, 자신이 선택한 Linux 배포 버전(또는 다른 운영 체제)과 시스템 BIOS뿐 아니라 선택한 부트 로더가 새 디스크에서 작동할 것인지 항상 확인해야 한다. 그렇게 하지 않으면 데이터가 손실될 수 있다. 마찬가지로, 기존 시스템에 새 배포 버전을 추가하는 경우 최신 LILO 또는 GRUB가 MBR에 있는지 확인해야 한다. LVM 또는 RAID 디스크에서 부팅할 계획이라면 GRUB 또는 LILO의 최신 버전도 필요할 것이다.
LILO와 GRUB에서 사용되는 2단계 로더를 통해 여러 운영 체제나 버전 중에서 어떤 것을 로드할지 선택할 수 있다. 하지만, 시스템을 변경하려는 경우 커널을 업그레이드하거나 시스템에 다른 변경 작업을 할 때마다 LILO 부팅 설정을 다시 하기 위한 명령을 사용해야 하지만, GRUB는 편집할 수 있는 구성 텍스트 파일을 통해 이 작업을 수행할 수 있다는 점에서 LILO와 GRUB는 상당한 차이가 있다. GRUB 2에서도 보통 /etc에 저장되어 있는 구성 파일에서 다시 빌드해야 한다.
LILO(LInux LOader)는 가장 많이 사용되는 두 Linux 부트 로더 중 하나다. 부트 가능 하드 드라이브의 MBR이나 파티션의 파티션 부트 레코드에 LILO를 설치할 수 있다. 플로피 디스크, CD 또는 USB 키와 같은 이동식 장치에도 LILO를 설치할 수 있다. 이 기사의 예제와 같이, LILO를 익히 알고 있지 않다면 플로피 디스크나 USB 키에서 실습하는 것이 좋은 생각이다.
Linux 설치 중에는 보통 LILO 또는 GRUB를 부트 매니저로 지정한다. GRUB를 선택했다면 LILO를 설치하지 않은 것일 수 있다. 이미 LILO를 설치한 것이 아니라면, LILO 패키지를 설치해야 한다. 또한, 추가 문서와 예제를 위해 lilo-doc 패키지를 설치할 수도 있다. 지금부터는 LILO 패키지가 이미 설치되어 있는 것으로 가정하고 설명한다. 도움말이 필요한 경우에는 패키지 관리에 관한 기사가 수록된 series roadmap을 참조한다.
보통 /etc/lilo.conf에 있는 구성 파일을 사용하여 LILO를 구성한다. (보통 /usr/sbin에 있는) liloconfig 명령을 사용하여
시작 구성 파일을 생성한 다음 필요에 따라 편집할 수 있다. Listing 1의 구성 파일이 이런 방법으로 생성된 것이다. 이 파일은 적당히 주석으로 처리되고,
lilo와 lilo.conf에 대한 매뉴얼 페이지에 더 자세한 도움말이 제공된다. 이것은 Windows와 하나 이상의 Linux 시스템을 포함한 이중 부팅 시스템에서 사용되는
전형적인 LILO 구성 파일이다.
Listing 1. /etc/lilo.conf 예제
# Originally generated by liloconfig - modified by Ian Shields
# This allows booting from any partition on disks with more than 1024
# cylinders.
lba32
# Specifies the boot device (floppy)
boot=/dev/fd0
# Specifies the device that should be mounted as root.
# If the special name CURRENT is used, the root device is set to the
# device on which the root file system is currently mounted. If the root
# has been changed with -r , the respective device is used. If the
# variable ROOT is omitted, the root device setting contained in the
# kernel image is used. It can be changed with the rdev program.
root=/dev/sda7
# Bitmap configuration for /boot/coffee.bmp
bitmap=/boot/coffee.bmp
bmp-colors=12,,11,15,,8
bmp-table=385p,100p,1,10
bmp-timer=38,2,13,1
# Enables map compaction:
# Tries to merge read requests for adjacent sectors into a single
# read request. This drastically reduces load time and keeps the map
# smaller. Using COMPACT is especially recommended when booting from a
# floppy disk.
compact
# Install the specified file as the new boot sector.
# LILO supports built in boot sectors, you only need
# to specify the type, choose one from 'text', 'menu' or 'bitmap'.
# new: install=bmp old: install=/boot/boot-bmp.b
# new: install=text old: install=/boot/boot-text.b
# new: install=menu old: install=/boot/boot-menu.b or boot.b
# default: 'menu' is default, unless you have a bitmap= line
# Note: install=bmp must be used to see the bitmap menu.
# install=menu
install=bmp
# Specifies the number of _tenths_ of a second LILO should
# wait before booting the first image. LILO
# doesn't wait if DELAY is omitted or if DELAY is set to zero.
# delay=20
# Prompt to use certain image. If prompt is specified without timeout,
# boot will not take place unless you hit RETURN. Timeout is in tenths of
# a second.
prompt
timeout=200
# Enable large memory mode.
large-memory
# Specifies the location of the map file. If MAP is
# omitted, a file /boot/map is used.
map=/boot/map
# Specifies the VGA text mode that should be selected when
# booting. The following values are recognized (case is ignored):
# NORMAL select normal 80x25 text mode.
# EXTENDED select 80x50 text mode. The word EXTENDED can be
# abbreviated to EXT.
# ASK stop and ask for user input (at boot time).
# <number> use the corresponding text mode. A list of available modes
# can be obtained by booting with vga=ask and pressing [Enter].
vga=normal
# Defines non-standard parameters for the specified disk.
#disk=/dev/sda
# bios=0x80
# If you are using removable USB drivers (with mass-storage)
# you will need to tell LILO to not use these devices even
# if defined in /etc/fstab and referenced in /proc/partitions.
# Adjust these lines to your devices:
#
# disk=/dev/sda inaccessible
# disk=/dev/sdb inaccessible
# These images were automagically added. You may need to edit something.
image=/boot/vmlinuz-2.6.31-14-generic
label="Lin 2.6.31-14"
initrd=/boot/initrd.img-2.6.31-14-generic
read-only
image=/boot/vmlinuz-2.6.31-20-generic
label="Lin 2.6.31-20"
initrd=/boot/initrd.img-2.6.31-20-generic
read-only
image=/boot/memtest86+.bin
label="Memory Test+"
read-only
# If you have another OS on this machine (say DOS),
# you can boot if by uncommenting the following lines
# (Of course, change /dev/sda1 to wherever your DOS partition is.)
other=/dev/sda6
label="Fedora 8"
other=/dev/sda1
label="Windows XP"
|
부트 플로피를 만들어 구성을 테스트할 것이므로, 파일 맨 위쪽 근처에 boot=/dev/fd0을 지정했다. 또한, 프롬프트
제한시간을 20초(1/10초 단위로 200개의 증분)로 늘리고 Fedora 8 파티션(/dev/sda6)에서 체인 로드에 대한 두 번째 "다른" 항목을 부트 로더에 추가했다. LILO의 경우
한 구성 파일에 하나의 root 명령만 허용되므로, 루트 파티션에서 여러 이미지를 부팅할 수 있지만, 또 하나의 부트 로더에 로드를
연결하여 이 예에서의 Fedora 8(/dev/sda6) 또는 Windows XP(/dev/sda1)와 같은 다른 설치 환경에서 이미지를 부팅해야 한다.
/sbin/lilo에 위치한 lilo 명령을 사용하여 1단계 부트 레코드를 쓰고 위 예제와 같이 보통 /etc/lilo.conf에 위치한
구성 정보를 사용하여 맵 파일(/boot/map)을 작성한다. 이후에 언급할 몇 가지 보조적인 사용법이 있다.
이제는 ext2와 같은 Linux 파일 시스템에서 플로피 디스크를 포맷하는 경우 lilo 명령(/sbin/lilo)을 실행하여 부트 가능
플로피 디스크를 만들 수 있다. 출력 결과는 Listing 2에 표시되어 있다. lilo 명령의 자세한 표시 레벨에는 5가지가 있다.
각각의 레벨에 대해 -v를 추가로 지정하면 된다. 이 예제는 lilo -v -v를 사용하여 작성했다.
Listing 2. lilo로 부트 가능 플로피 디스크 만들기
LILO version 22.8, Copyright (C) 1992-1998 Werner Almesberger
Development beyond version 21 Copyright (C) 1999-2006 John Coffman
Released 19-Feb-2007, and compiled at 10:52:38 on Aug 25 2009
Running Linux kernel 2.6.31-14-generic on i686
Ubuntu
raid_setup returns offset = 00000000 ndisk = 0
BIOS VolumeID Device
Reading boot sector from /dev/fd0
pf_hard_disk_scan: ndevs=1
0800 54085408 /dev/sda
device codes (user assigned pf) = 0
device codes (user assigned) = 0
device codes (BIOS assigned) = 1
device codes (canonical) = 1
mode = 0x03, columns = 80, rows = 25, page = 0
Using BITMAP secondary loader
Calling map_insert_data
Secondary loader: 19 sectors (0x3800 dataend).
Warning: The boot sector and map file are on different disks.
bios_boot = 0x00 bios_map = 0x80 map==boot = 0 map S/N: 54085408
Mapping bitmap file /boot/coffee.bmp
Calling map_insert_file
Compaction removed 592 BIOS calls.
Bitmap: 603 sectors.
BIOS data check was okay on the last boot
Boot image: /boot/vmlinuz-2.6.31-14-generic
Setup length is 26 sectors.
Compaction removed 7452 BIOS calls.
Mapped 7601 sectors.
Mapping RAM disk /boot/initrd.img-2.6.31-14-generic
Compaction removed 14696 BIOS calls.
RAM disk: 14930 sectors.
Added Lin_2.6.31-14 *
Boot image: /boot/vmlinuz-2.6.31-20-generic
Setup length is 26 sectors.
Compaction removed 7468 BIOS calls.
Mapped 7617 sectors.
Mapping RAM disk /boot/initrd.img-2.6.31-20-generic
Compaction removed 14704 BIOS calls.
RAM disk: 14938 sectors.
Added Lin_2.6.31-20
Boot image: /boot/memtest86+.bin
Setup length is 4 sectors.
Compaction removed 243 BIOS calls.
Mapped 254 sectors.
Added Memory_Test+
Boot other: /dev/sda6, loader CHAIN
Pseudo partition start: 43198848
Compaction removed 0 BIOS calls.
Mapped 6 (4+1+1) sectors.
Added Fedora_8
Boot other: /dev/sda1, on /dev/sda, loader CHAIN
Compaction removed 0 BIOS calls.
Mapped 6 (4+1+1) sectors.
Added Windows_XP
BIOS VolumeID Device
80 54085408 0800
Writing boot sector.
/boot/boot.0200 exists - no boot sector backup copy made.
Map file size: 336896 bytes.
RAID device mask 0x0000
One warning was issued.
|
이제 부트 가능한 LILO 디스켓이 생겼다. LILO에서 오류가 발생하면 오류 메시지가 표시될 수 있으며 부트 섹터에 데이터가 기록되지는 않는다. 메시지를 보면 무엇을 수정해야 할 것인지 파악할 수 있다.
방금 만든 디스켓을 사용하여 시스템을 다시 부팅하면 그림 1에 표시된 것과 유사한 프롬프트가 나타난다. 화면 맨 위에서 20초(0.1초 단위)부터 카운트다운하는 카운트다운 타이머에 주목한다. 20초 내에 아무런 선택도 하지 않으면 강조 표시된 선택 항목(첫 번째 항목, 이 경우에는 Lin_2.6.31-14)이 자동으로 부팅된다.
그림 1. LILO 부팅 화면
화살표 키를 사용하여 선택 목록을 위아래로 움직일 수 있다. 그림 2는 두 번째 항목으로 더 새로운 Lin_2.6.31-20 커널의 선택 방법을 나타낸 것이다. 타이머 값이 더 이상 표시되지 않는다. Enter를 눌러 이 커널을 부팅한다.
그림 2. LILO를 이용해 다른 부트 대상 선택
부트 디스켓을 테스트한 경우 MBR 또는 파티션 부트 레코드에 LILO를 설치하려면 lilo.conf 파일의 boot=/dev/fd0 항목을 변경한다. 예를 들어, boot=/dev/sda를 통해 첫 번째 하드 드라이브의 마스터 부트 레코드에 LILO를 설치한다.
이제 LILO 및 LILO의 구성 파일에 대한 개론을 학습했다. lilo 명령행에서 일부 구성 옵션을 대체할 수 있다. man lilo
또는 man lilo.conf 명령을 사용하여 lilo 매뉴얼 페이지에서 더 많은 정보를 찾을 수 있다. lilo 또는 lilo-doc 패키지와 함께
설치되는 포스트스크립트 사용자 안내서에서 훨씬 광범위한 정보를 찾을 수 있다. 이 안내서는 문서 디렉토리에 설치되어야 하지만, 정확한 위치는 시스템마다
다를 수 있다.
파일을 찾는 한 가지 방법은 grep을 통해 패키지 목록을 필터링하는 것이다.
Listing 3은 이 예제에서 사용한 Debian 기반 Ubuntu 9.10 시스템에 대해 이 방법을 나타낸 것이다.
Listing 3. dpkg로 LILO 사용자 안내서 찾기
ian@pinguino:~$ dpkg -L lilo-doc | grep "ps"
/usr/share/doc/lilo-doc/user.ps.gz
/usr/share/doc/lilo-doc/tech.ps.gz |
Fedora와 같은 RPM 기반 시스템에서 이에 해당하는 명령은 rpm -ql lilo-doc | grep "ps"이다.
LILO에는 다음과 같은 여러 가지 보조 명령이 있다.
- lilo -q
- 맵 파일에서 정보를 표시한다.
- lilo -R
- 다음에 다시 부팅할 때만 지정된 시스템을 자동으로 부팅하도록 lilo를 설정한다. 이것은 원격 시스템을 자동으로 다시 부팅하기에 매우 편리하다.
- lilo -I
- 커널 경로에 관한 정보를 표시한다.
- lilo -u
- lilo를 제거하고 이전 부트 레코드를 복원한다.
LILO가 Linux 시스템으로 부팅될 때 부팅 시간에 매개변수를 추가로 제공하고 싶을 수 있다. 예를 들어, 그래픽 시작 기능이 작동하지 않은 경우 모드 3이나 단일 사용자 모드로 부팅하여 복구하고 싶을 수 있다. 항목을 선택하고 TAB 키를 누르면 그림 3에 표시된 것처럼 사용자가 선택한 레이블 이름으로 미리 채워진 터미널 창이 표시되어야 한다. 레이블 이름 뒤에 입력하는 모든 텍스트는 커널로 전달된다. 예를 들어, 이 예제에서는 간단히 행을 아래로 이동한 다음 TAB 키를 눌러 최신 Ubuntu 시스템을 선택한다. 이름을 먼저 선택하지 않으면, 레이블에서 지정한 전체 이름을 입력해야 할 수도 있다. 여기서 다루는 예제보다 간결한 레이블을 사용하는 것이 좋은 이유를 알 수 있다. Lin_2.6.31.20을 정확하고 빠르게 입력하기란 쉬운 일이 아니다.
그림 3. LILO에서 커널 매개변수 추가
그림 3에서는 일종의 시스템 복구 작업을 수행하기 위해 단일 사용자 모드에서 부팅하겠다는 뜻을 알리기 위해 부트 매개변수에 "single"을 추가했다. 부트 매개변수 사용에 관한 자세한 내용은 복구 섹션을 참조한다.
또한, LILO에서는 구성 파일(/etc/lilo.conf)을 업데이트할 때마다 반드시 lilo 명령을
실행해야 한다. 파티션을 추가, 이동 또는 제거하거나 생성된 부트 로더를 무효화할 수 있는 다른 변경 작업을 하는 경우에도 lilo 명령을
실행해야 한다.
GRUB(GRand Unified Boot loader)는 LILO와 더불어 가장 많이 사용되는 Linux 부트 로더이다. LILO와 마찬가지로, 부트 가능 하드 드라이브의 MBR이나 파티션의 파티션 부트 레코드에 GRUB를 설치할 수 있다. 플로피 디스크, CD 또는 USB 키와 같은 이동식 장치에도 GRUB를 설치할 수 있다. 이 기사의 예제와 같이, GRUB를 익히 알고 있지 않다면 플로피 디스크나 USB 키에서 실습하는 것이 좋은 생각이다.
GRUB 또는 GNU GRUB는 현재 Free Software Foundation의 후원하에 개발된다. 새 버전인 GRUB 2가 개발 중이며 Linux 배포 버전에 탑재되기 시작하고 있으므로, 최초의 GRUB 0.9x 버전은 현재 Grub Legacy로 알려져 있다.
Linux 설치 중에는 보통 LILO 또는 GRUB를 부트 매니저로 지정한다. LILO를 선택했다면 GRUB를 설치하지 않은 것일 수 있다. GRUB를 설치하지 않은 경우 GRUB 패키지를 설치해야 한다. 지금부터는 GRUB 패키지가 이미 설치되어 있는 것으로 가정하고 설명한다. 도움말이 필요한 경우에는 패키지 관리에 관한 기사가 수록된 series roadmap을 참조한다.
GRUB(Legacy)에는 보통 /boot/grub/grub.conf에 저장되는 구성 파일이 있다. 대부분의 Linux 파일 시스템이 그러하듯, 사용 중인 파일 시스템에서 기호 링크를 지원하는 경우 /boot/grub/menu.lst가 /boot/grub/grub.conf에 대한 기호 링크가 될 것이다.
grub 명령(/sbin/grub 또는 일부 시스템에서는 /usr/sbin/grub)은 GRUB 설치, 시스템 부팅, 구성 파일 찾기 및 표시,
기타 이와 유사한 작업을 수행하기 위한 여러 가지 명령을 지원하는 작지만 적당한 성능을 갖춘 쉘이다. 이 쉘의 코드는 2단계 GRUB 부트 로더와 많은 부분이
같으므로, 2단계 GRUB 환경으로 부팅할 필요 없이 GRUB에 대한 학습을 하기에 유용하다. 2단계 GRUB는 메뉴에서 운영 체제를 선택할 수 있도록 메뉴 모드에서
실행되거나, 개별 명령을 지정하여 시스템을 로드하는 명령 모드에서 실행된다. grub-install과 같이 GRUB 쉘을 사용하고
GRUB 설치 등의 작업을 자동화하는 데 도움이 되는 다른 명령도 여러 가지가 있다.
Listing 4는 GRUB 구성 파일 중 일부를 나타낸 것이다. 이 내용을 보면서 한 가지 기억해야 할 중요한 점이 있다. GRUB(최소한 GRUB Legacy)에서는 드라이브 수, 파티션 수 및 계수의 필요성이 있는 항목을 셀 때 1이 아니라 0부터 시작해서 계수한다는 사실이다. 첫 번째 커널 행이 매우 길다는 점에도 유의한다. 게시를 위해 커널 행을 구분하는 지점은 백슬래시(\)로 표시한다.
Listing 4. /boot/grub/menu.lst GRUB 구성 예제
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,5)
# kernel /boot/vmlinuz-version ro root=/dev/sda6
# initrd /boot/initrd-version.img
#boot=/dev/sda6
default=1
timeout=10
splashimage=(hd0,5)/boot/grub/splash.xpm.gz
#hiddenmenu
password --md5 $1$RW1VW/$4XGAklxB7/GJk0uO47Srx1
title Upgrade to Fedora 11 (Leonidas)
kernel /boot/upgrade/vmlinuz preupgrade \
repo=hd::/var/cache/yum/preupgrade stage2=\
hd:UUID=8b4c62e7-2022-4288-8995-5eda92cd149b:/boot/upgrade/install.img \
ks=hd:UUID=8b4c62e7-2022-4288-8995-5eda92cd149b:/boot/upgrade/ks.cfg
initrd /boot/upgrade/initrd.img
title Fedora (2.6.26.8-57.fc8)
root (hd0,5)
kernel /boot/vmlinuz-2.6.26.8-57.fc8 ro root=LABEL=FEDORA8 rhgb quiet
initrd /boot/initrd-2.6.26.8-57.fc8.img
title Fedora (2.6.26.6-49.fc8)
root (hd0,5)
kernel /boot/vmlinuz-2.6.26.6-49.fc8 ro root=LABEL=FEDORA8 rhgb quiet
initrd /boot/initrd-2.6.26.6-49.fc8.img
title GRUB Menu
rootnoverify (hd0,1)
chainloader +1
title Windows
rootnoverify (hd0,0)
chainloader +1
|
LILO 구성 파일과 마찬가지로, 위의 첫 번째 옵션 세트에 따라 GRUB의 작동 방식이 제어된다. GRUB에서는 이를 메뉴 명령이라 부르고, 이런 메뉴 명령은 다른 명령 앞에 나타나야 한다. 나머지 섹션에서는 GRUB에서 부팅할 수 있게 할 운영 체제에 대한 이미지별 옵션을 설명한다. "제목"이 메뉴 명령으로 간주된다. 각각의 제목 인스턴스 뒤에는 하나 이상의 일반 또는 메뉴 항목 명령이 나온다. 이 글에서 제시한 LILO 예제는 Windows와 두 개의 Linux 시스템을 포함한 이중 부트 시스템의 전형적인 기본 예제였다. 이 예제는 우리가 전에 사용한 것과 같은 시스템에서 얻은 출력 결과를 바탕으로 한 것이다. 사실, LILO 메뉴의 "Fedora 8" 항목에서 체인 로드되는 것이 바로 부팅 메뉴이다. LILO 및 GRUB 구성 파일에서 모두 발생하는 동일한 종류의 요소를 다수 볼 수 있을 것이다. 여기서 추가 운영 체제를 앞서 소개한 LILO 예제에 추가한 경우 무엇을 변경해야 할지에 대해 생각해보고 싶을 수 있다.
예제의 다른 모든 섹션에 적용되는 메뉴 명령은 다음과 같다.
- #
- #으로 시작하는 행은 전부 명령이고 GRUB에서는 이를 무시한다. 이 특수한 구성 파일은 원래는 Red Hat 설치 프로그램인 anaconda에 의해 생성되었다. Linux를 설치할 때 GRUB를 설치하면 GRUB 구성 파일에 추가된 명령을 찾을 수 있을 것이다. 업그레이드된 커널로 GRUB 구성을 최신 상태로 유지할 수 있도록, 설명은 시스템 업그레이드 프로그램에 대한 보조 도구의 역할을 종종 하게 될 것이다. 스스로 구성을 편집하는 경우 이런 목적으로 남겨지는 모든 마커에 주의한다.
- default
- 사용자가 제한시간 내에 선택하지 않는 경우 로드할 시스템을 지정한다. 예제에서 default=2는 세 번째 항목을 로드하는 것을 뜻한다. GRUB에서는 1부터가 아니라 0부터 계수한다는 점을 기억하자. 항목을 지정하지 않은 경우에는 첫 번째 항목인 항목 번호 0을 부팅하는 것이 기본 설정이다.
- timeout
- 기본 항목을 부팅하기까지의 제한시간(초)을 지정한다. LILO에서는 0.1초 단위로 제한시간을 표시하지만, GRUB에서는 1초 단위로 표시한다.
- splashimage
- 부트 메뉴와 함께 표시할 배경 또는 시작 화면 이미지를 지정한다. GRUB Legacy에서는 첫 번째 하드 드라이브를 (hd0)으로, 그 드라이브에 있는 첫 번째 파티션을 (hd0,0)으로 지칭하므로, splashimage=(hd0,6)/boot/grub/splash.xpm.gz로 지정하는 경우 이는 첫 번째 하드 드라이브의 파티션 7에 있는 /boot/grub/splash.xpm.gz 파일을 사용한다는 뜻이다. 0부터 계수가 시작된다는 점을 잘 기억하자. 이미지는 gzip으로 압축된 XPM 파일이라는 점에도 유의한다. 시작 화면 이미지는 패치로 지원되며, 사용 중인 배포 버전에 따라 패치가 포함될 수도 있고 포함되지 않을 수도 있다.
- password
- 사용자가 메뉴의 잠금을 해제하고 구성 행을 편집하거나 GRUB 명령을 입력하기 전에 먼저 입력해야 하는 비밀번호를 지정한다. LILO와 마찬가지로, 비밀번호는 일반 텍스트로 지정할 수 있다. GRUB에서는 예제에서 보듯이 비밀번호를 MD5 다이제스트로 저장할 수도 있다. 이렇게 하는 것이 더 안전하므로, 대부분의 관리자들은 비밀번호를 설정한다. 비밀번호가 없는 사용자도 GRUB 명령행에 대해 완전한 액세스 권한을 가진다.
이 기사에서 소개하는 예제는 Fedora 8 커널 두 개와 Fedora 11 옵션에 대한 업그레이드 하나에다가, Windows XP 및 체인 로드된 "GRUB Menu" 옵션을 나타낸 것이다. 이들 섹션에서 사용되는 명령은 다음과 같다.
- title
- 설명이 포함된 제목으로, GRUB가 부팅될 때 메뉴 항목으로 표시된다. 화살표 키를 사용하여 제목 목록을 위아래로 이동한 다음, Enter 키를 눌러 특정 항목을 선택한다.
- root
- 부팅할 파티션을 지정한다. 시작 화면 이미지와 마찬가지로 0부터 계수가 시작되므로, 루트로 지정되는 첫 번째 Red Hat 시스템(hd0,6)은 실제로 첫 번째 하드 드라이브(이 경우에는 /dev/hda7)의 파티션 7에 있는 반면, 루트로 지정되는 첫 번째 Ubuntu 시스템(hd1,10)은 두 번째 하드 드라이브(/dev/hdb11) 상에 있다. GRUB에서는 이 파티션을 마운트하여 파티션을 검사하고 어떤 경우에는 부팅된 운영 체제에 값을 제공한다.
- kernel
- 로드할 커널 이미지와 필수적인 커널 매개변수를 전부 지정한다. 이 명령은 LILO 이미지와 append 명령을 조합한 것과 유사하다. 이 예제에서는 두 가지 다른 Fedora 8 커널과 업그레이드 커널이 있다.
- initrd
- 파일 시스템이 마운트되기 전에 커널에서 필요한 모듈이 들어 있는 최초 RAM 디스크의 이름이다.
- savedefault
- 이 예제에서는 사용되지 않는다.
default=saved메뉴 명령이 지정되고 어떤 운영 체제에 대해savedefault명령이 지정되는 경우에는 그 운영 체제를 부팅하면savedefault가 지정된 다른 운영 체제가 부팅될 때까지 그 운영 체제가 기본 운영 체제가 된다. 이 예제에서는 default=2를 지정하면 저장된 기본값이 전부 대체된다. - boot
- 선택한 운영 체제를 부팅하라고 GRUB에 지시하는 선택적 매개변수이다. 한 선택 항목에 대해 모든 명령이 처리되었을 때는 이것이 기본값이다.
- lock
- 이 예제에서는 사용되지 않는다. 이 명령을 사용하면 비밀번호를 입력할 때까지는 지정된 항목이 부팅되지 않는다. 이 명령을 사용하는 경우 최초 옵션에서 비밀번호도 지정해야 한다. 그렇지 않으면, 사용자가 잠금 옵션을 편집하고 시스템을 부팅하거나 다른 항목 중 하나에 "single"을 추가할 수 있다. 원한다면, 각 항목마다 개별적으로 다른 비밀번호를 지정할 수 있다.
- rootnoverify
- GRUB에서 파일 시스템을 마운트하거나 그 매개변수를 확인하려 하지 않는다는 점을 제외하면, root와 유사하다. 이 명령은 보통 GRUB에서 지원되지 않는 NTFS와 같은 파일 시스템에 사용된다. 예를 들어, 다른 구성 파일에 액세스하거나 이전 부트 로더를 다시 로드하기 위해 GRUB가 하드 드라이브에 마스터 부트 레코드를 로드하도록 하려는 경우에도 이 명령을 사용할 수 있다.
- chainloader
- 다른 파일이 1단계 파일로 로드될 것이라고 지정한다. "+1" 값은 0+1과 같은데, 이는 섹터 0에서 시작하여 하나의 섹터를 로드한다는 의미다. 즉, root 또는 rootnoverify에서 지정된 장치에서 첫 번째 섹터를 로드한다.
이제는 일반적인 /boot/grub/grub.conf(또는 /boot/grub/menu.lst) 파일에 어떤 내용이 있는지 어느 정도 감이 잡힐 것이다. 부팅 프로세스에 대한
광범위한 제어 기능뿐 아니라, GRUB를 설치하고 다른 작업을 수행하는 데 필요한 도움말을 제공하는 다른 GRUB 명령도 많이 있다. info grub
명령을 통해 시스템에서 볼 수 있는 GRUB 매뉴얼에서 이런 내용을 더 자세히 학습할 수 있다.
이제 GRUB 구성 파일이 있으므로, 이를 테스트하기 위한 부팅 플로피를 만들어야 한다. 가장 간단하게 만드는 방법은 Listing 5에 나타낸 것처럼
grub-install 명령을 사용하는 것이다. GRUB를 플로피나 파티션에 설치할 경우에는 우선 장치를 마운트 해제해야 한다. 전체 하드
드라이브(/dev/sda)가 아니라 파티션(/dev/sda1, /dev/sda2 등)만 마운트하기만 하므로, 하드 드라이브의 MBR에 GRUB를 설치할 경우에는 해당되지 않는다.
Listing 5. 플로피 디스크에 GRUB 설치
[root@pinguino ~]# grub-install /dev/fd0
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda |
주: /dev/fd0 대신 GRUB 장치 이름(fd0)을 사용할 수도 있지만, 그렇게 하는 경우 GRUB 장치 이름을 따옴표로 묶어 소괄호를
쉘로 해석하는 문제를 방지해야 한다. grub-install '(fd0)'을 예로 들 수 있다.
장치 맵을 보면 GRUB가 디스크(fd0, hd0, hd1)의 내부 뷰를 Linux 뷰(/dev/fd0, /dev/sda, /dev/sdb)와 일치시키는 방법을 알 수 있다. 한 개 또는
두 개의 IDE 하드 드라이브가 있고 플로피 드라이브도 있을 수 있는 시스템에서는 이 말이 아마 정확할 것이다. 장치 맵이 이미 존재하는 경우에는 GRUB에서 검색
과정 없이 그 장치 맵을 재사용할 것이다. 방금 새 드라이브를 추가하여 새 장치 맵을 생성하도록 강제 실행하려면 grub-install 명령에
--recheck 옵션을 추가한다. 때때로 Listing 6에 표시된 것과 같은 메시지를 볼 수 있다. 이 경우에도 grub
명령에 --recheck 옵션을 추가하여 GRUB가 사용 가능한 장치를 검색하고 장치 맵을 다시 빌드하도록 강제 실행해야 한다.
Listing 6. 플로피 디스크에 GRUB 설치
[root@pinguino ~]# grub-install /dev/fd0
/dev/fd0 does not have any corresponding BIOS drive. |
빈 플로피로 작업을 시작하여 현재 플로피를 마운트한 경우, 플로피가 여전히 비어 있는 것으로 나타나는 것을 볼 수 있을 것이다. GRUB가 디스크의 첫 번째 섹터에 사용자 정의 1단계 로더를 썼기 때문에 그런 것이다. 이 정보가 파일 시스템에는 나타나지 않는다. 이 1단계 로더는 하드 드라이브에서 2단계 및 구성 파일을 로드한다. 디스켓을 부팅할 때 메뉴가 표시되기 전에 이루어지는 IO 활동은 거의 보기 어려울 정도로 빠르게 실행된다. LILO와 마찬가지로, 위로 및 아래로 화살표를 사용하여 부팅 대상을 선택한다.
그림 4. GRUB를 이용한 부팅
부트 플로피 테스트가 끝났으면 하드 드라이브의 MBR에 GRUB를 설치할 준비가 완료된 것이다. 첫 번째 IDE 하드 드라이브에는 다음 명령을
사용한다.
grub-install /dev/sda
또는
grub-install '(hd0)'
파티션 11용 파티션 부트 레코드에 GRUB를 설치하려면 다음 명령을 사용한다.
grub-install /dev/sda11
또는
grub-install '(hd0,10)'
GRUB 번호는 0부터 시작된다는 점을 기억하자.
LILO와 마찬가지로, 부트 매개변수를 추가할 수 있다. 사실, GRUB 구성에서 어떤 명령이든 편집할 수 있고, 심지어 부팅 시간에 다른 구성 파일을
로드할 수도 있다. 비밀번호를 사용한 경우 p 명령을 입력한 후 비밀번호를 입력해야 한다. 그 후, 항목을 선택하고 e
명령을 입력하여 선택한 항목을 편집한다. 편집할 행을 선택하고 e를 다시 입력한다. 새 문자를 입력하거나 기존 문자를 지워 행을
편집한 다음, Enter를 눌러 메뉴로 돌아간다. b 명령을 입력하여 수정된 값으로 시스템을 부팅한다. 그림 5는
단일 사용자 모드로 부팅하기 위해 커널 명령문에 'single' 매개변수를 추가하는 프로세스의 명령 편집 단계를 나타낸 것이다.
그림 5. GRUB를 이용해 단일 사용자 모드로 부팅
대부분의 배포 버전에서는 시스템 업데이트를 위한 도구를 제공한다. 이런 도구들은 대개 사용 중인 부트 로더를 인식하며 구성 파일을 종종 자동으로 업데이트한다. 사용자 정의 커널을 스스로 빌드하거나 비표준 이름 또는 위치를 가진 구성 파일을 사용하는 쪽을 선호한다면, 구성 파일을 스스로 업데이트할 필요가 있다.
- LILO를 사용하는 경우에는 구성 파일을 업데이트하거나 하드 드라이브 추가 또는 파티션 삭제와 같은 변경 작업을 수행할 때마다
항상
lilo명령을 실행해야 한다. - GRUB를 사용하는 경우 /boot/grub/grub.conf 파일을 편집하여 변경하면, 다시 부팅할 때 GRUB 2단계 로더가 이 파일을 읽게 된다. 단지 새 커널을 추가하는 것이기 때문에 일반적으로 GRUB를 다시 설치할 필요는 없다. 하지만, 파티션을 이동하거나 드라이브를 추가하는 경우 GRUB를 다시 설치해야 할 수도 있다. 1단계 로더는 매우 작으므로, 이 로더에는 2단계 로더의 블록 주소 목록만 있다는 점을 기억하자. 1단계에서 2단계를 더 이상을 찾을 수 없도록 파티션과 처리된 변경 사항을 이동한다. 몇 가지 복구 전략을 다루고 GRUB의 1.5단계 로더에 관해서도 설명하겠다.
- 다른 파티션에서 둘 이상의 Linux 시스템을 실행하는 경우 아래의 설명과 같이 부트 파티션 사용을 고려한다.
이제는 신중하게 준비한 부팅 설정이 잘못될 수 있는 사항을 살펴보자. 특히, 여러 운영 체제를 설치하고 부팅할 때 이런 문제가 발생할 수 있다. 첫 번째로 기억해야 할 점은 처음부터 괜히 겁먹고 당황하지 말고 침착하게 대응하라는 것이다. 보통 몇 단계만 거치면 복구할 수 있다. 여기서 설명하는 전략이 다양한 유형의 위기 상황을 헤쳐나가는 데 도움이 될 것이다.
어떤 시스템에 실제로 접근할 수 있는 사람에게는 많은 권한이 주어진다. 마찬가지로, GRUB 명령행에 액세스할 수 있는 사람은 어떤 소유권이나 작동 중인 시스템에서 제공하는 다른 보안 권한 없이도 시스템 상의 파일에 액세스할 수 있다. 부트 로더를 선택할 때도 이런 점을 염두에 둔다. LILO와 GRUB 중에서 무엇을 선택할 것인지는 주로 개인적 선호도의 문제다. 자신의 구체적인 요구 사항과 작업 스타일에 적합한 로더를 선택하면 된다.
때때로 다른 운영 체제를 부주의하게 설치하다가 MBR을 덮어쓰는 경우가 있다. DOS 및 Windows와 같은 일부 시스템에는 항상 자체적인 MBR이
설치된다. 대체로 이런 상황에서 복구하는 것은 매우 쉬운 일이다. lilo를 실행하거나 GRUB를 다시 설치할 때마다 부트 플로피를
만드는 습관이 들었다면 위험에 처할 일이 없다.
플로피에서 Linux 시스템으로 부팅한 후 lilo 또는 grub-install을 다시 실행하기만
하면 된다.
공교롭게도 부트 플로피를 가지고 있지는 않지만 거의 모든 Linux 배포 버전을 사용할 수 있다면, 대개의 경우 복구 모드에서 Linux 설치 매체를
부팅할 수 있다. 그렇게 하면 하드 드라이브 상의 루트 파일 시스템이 좀 이상한 복구 지점에 마운트되거나 전혀 마운트되지 않는다. chroot
명령을 사용하면 이 이상한 마운트 지점이 루트(/) 디렉토리가 되도록 할 수 있다. 그런 다음 lilo 또는 grub-install을
실행하여 새 부트 플로피를 만들거나 MBR을 다시 설치한다. 필자는 플로피를 만들어 이를 통해 부팅함으로써 모든 것이 정상적인지 확인한 후 작업을 시작하고
MBR을 다시 작성하는 방법을 선호하지만, 이보다 더 과감한 방법을 택할 수도 있을 것이다. 복구 모드에서 CD나 DVD를 부팅하면 선택 메뉴가 나타나거나 루트 권한을
가진 단일 사용자 모드로 단순히 전환할 수도 있다. LILO 예제에서 사용했던 Ubuntu 9.10 시스템을 단일 사용자 모드로 부팅하면 그림 6과 같은 메뉴가 나타난다.
강조 표시된 옵션을 선택하면 네트워킹을 이용해 루트 쉘로 이동한다.
그림 6. Ubuntu 9.10 복구 메뉴
이와 같은 메뉴는 복구 모드에서 공통 선택 사항이다. 여기서 든 복구 예제에서는 CD를 사용하지 않지만, 위의 LILO 섹션에서 설명한 것처럼 Ubuntu 9.19 시스템을 단일 사용자 모드로 부팅한다. 그런 후 다른 시스템(이 경우에는 /dev/sda6의 Fedora 8 시스템)의 부팅 디스켓을 만드는 데 필요한 일반적인 절차를 수행한다. 복구 CD에서 부팅하거나 같은 시스템에 있는 다른 OS에서 부팅하거나 상관없이, 복구할 이미지의 마운팅과 같은 몇 가지 과정이 이미 자동으로 수행되었지만 절차가 유사하다.
마침내 루트 프롬프트가 나타나면 Listing 7에 표시된 것 중 일부 또는 전부 실습해볼 수 있다. 이 예에서는 마운트 지점(/mnt/sysimage)을 만들고,
/dev/sda6을 마운트하고, 몇몇 특수한 파일 시스템을 새 루트에 마운트한 다음, 마운트된 시스템으로 chroot한다. cat /etc/issue 명령을
실행하면 최소한 Ctrl-D 또는 exit로 chroot된 환경에서 벗어날 때까지 대상 디렉토리를 파일 시스템의 새 루트로 만드는
chroot 명령의 결과를 확인할 수 있다.
Listing 7은 우리가 앞의 구성 예제에 사용한 것과 같은 환경에서 실습할 수 있는 예제를 나타낸 것이다. 이것은 루트 권한으로 로그인한 터미널 창이라 생각하면 된다. 즉, 하드 드라이브에 쓰는 데이터의 내용에 각별히 주의해야 한다.
Listing 7. 복구 시스템 및 chroot 사용
root@pinguino:~# mkdir /mnt/sysimage
root@pinguino:~# mount /dev/sda6 /mnt/sysimage
root@pinguino:~# cd /mnt/sysimage
root@pinguino:~# mount -t proc none proc/
root@pinguino:~# mount -t sysfs none sys/
root@pinguino:~# mount -o bind /dev dev/
root@pinguino:~# cat /etc/issue
Ubuntu 9.10 \n \l
root@pinguino:~# chroot /mnt/sysimage
root@pinguino:~#
sh-3.00# chroot /mnt/sysimage
[root@oinguine /]# cat /etc/issue
Fedora release 8 (Werewolf)
Kernel \r on an \m
[root@oinguine /]# grub-install /dev/fd0
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
[root@oinguine /]# |
부트 가능 플로피가 있으면 Ctrl-D를 눌러 chroot 환경을 종료한 다음 시스템을 다시 부팅한다. 이때 설치 CD나 복구 매체를 사용했다면 이를 전부 제거한 후 다시 부팅해야 한다는 사실을 잊지 않도록 한다. 설치 CD나 DVD를 보유하고 있지 않아 바로 사용할 수 없는 경우, 온라인으로 다양한 복구 및 라이브 LINUX CD를 구할 수 있고 디스켓 또는 USB 메모리 키도 구할 수 있다. 자세한 내용은 참고자료를 참조한다.
본 기사의 범위를 벗어나는 주제이지만, MBR을 통해 Windows 2000 또는 Windows XP 시스템을 부팅하고 파티션 부트 레코드에 LILO 또는 GRUB를
설치할 수 있는지 알고 싶을 것이다. 설정이 약간 까다로울 수 있지만, ntldr 부트 프로그램 역시 다른 부트 섹터를 체인 로드할 수 있다. 부트 섹터를 Windows
파티션으로 복사하고(일반적으로 dd 명령 사용) 숨겨진 boot.ini 파일을 수정하여 이 작업을 수행해야 한다.
파티션을 이동한 후 부트 설정을 잊어버린 경우 일시적인 문제가 있다. 일반적으로, LILO 또는 GRUB에서는 로드를 거부한다. LILO에서는 아마
1단계가 로드된 후 중지했음을 나타내는 'L'을 인쇄할 것이다.
GRUB에서는 오류 메시지가 표시된다. 2단계 로더에 이르기 위해 로드할 섹터 목록을 가진 1단계 로더가 보유한 주소에서 섹터를 로드할 수 있지만,
해당 섹터에 더 이상 2단계 서명이 없기 때문이다. 앞서 설명한 방법으로 부트 디스켓을 만든 경우, 디스켓에 로드된 lilo 또는
grub-install이 모두 단일 부트 섹터였으므로 사용자의 부트 디스켓이 도움이 되지는 않을 것이라는 점에 주의한다. 이전 예제에서처럼,
어떤 종류의 복구 환경을 부팅하고 LILO 또는 GRUB로 부트 플로피를 다시 만들어야 할 것이다. 그런 다음, 시스템을 검사하고 MBR에 부트 로더를 다시 설치한다.
본 기사의 구성 예제에서는 파티션에 대한 몇 가지 레이블과 UUID(Universally Unique ID)를 사용했다는 사실을 알아차렸을 것이다. 예를 들면, 다음과 같다.
kernel /boot/vmlinuz-2.6.26.8-57.fc8 ro root=LABEL=FEDORA8 rhgb
quiet
또는
kernel /boot/upgrade/vmlinuz
preupgrade repo=hd::/var/cache/yum/preupgrade stage2=\
hd:UUID=8b4c62e7-2022-4288-8995-5eda92cd149b:/boot/upgrade/install.img
\
ks=hd:UUID=8b4c62e7-2022-4288-8995-5eda92cd149b:/boot/upgrade/ks.cfg
필자는 자주 이와 같은 레이블 UUID를 사용하여 파티션 이동 시의 문제를 방지한다. 그래도 GRUB 또는 LILO 구성 파일을 업데이트하고
lilo를 다시 실행해야 하지만, /etc/fstab도 업데이트할 필요는 없다. 이 방법은 한 시스템에서 파티션 이미지를 작성하고 다른
시스템의 다른 위치에서 이미지를 복원하는 경우 특히 편리하다. 같은 위치에 항상 연결되어 있지 않을 수도 있는 USB 드라이브와 같은 드라이브에서 부팅하는 경우에도
편리하다.
문제가 발생했을 때 복구를 하거나, 아예 이런 문제를 피할 수 있는 다른 접근 방법은 별개의 파티션을 사용하여 부팅하는 것이다. 이 방법은 자주 다시 빌드하는 테스트 시스템에 여러 배포 버전이 있는 경우에 특히 유용하다. 부트 파티션은 100MB 정도의 크기로 그리 클 필요가 없다. 이 파티션을 이동할 가능성이 없고 다른 파티션을 추가하거나 제거함으로써 파티션 번호가 바뀔 가능성이 없는 곳에 이 파티션을 둔다. Windows와 Linux가 혼합된 환경에서는 /dev/sda2(또는 디스크의 레이블 지정 방식에 따라서는 /dev/hda2)를 부트 파티션용으로 선택하면 좋을 때가 많다. Listing 8은 실제로는 우리가 예로 든 시스템의 마스터 부트 레코드에서 로드하는 작은 부트 파티션(/dev/sda2)의 항목들을 나타낸 것이다.
Listing 8. GRUB와 함께 작은 부트 파티션 사용
# menu.lst - See: grub(8), info grub, update-grub(8)
# grub-install(8), grub-floppy(8),
# grub-md5-crypt, /usr/share/doc/grub
# and /usr/share/doc/grub-doc/.
## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
default 0
## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout 10
## password ['--md5'] passwd
# If used in the first section of a menu file, disable all interactive editing
# control (menu entry editor and command-line) and entries protected by the
# command 'lock'
# e.g. password topsecret
# password --md5 $1$gLhU0/$aW78kHK1QfV3P2b2znUoe/
# password topsecret
title Fedora 8 (sda6) Grub menu
root (hd0,5)
chainloader +1
boot
# Ubuntu 9.10 uses GRUB 2, so use kernel to drive GRUB 2 menu.
title Ubuntu 9.10 (sda7)
root (hd0,6)
kernel /boot/grub/core.img
# This is a divider, added to separate the menu items below from the Debian
# ones.
title Other operating systems:
root
# Windows XP
title Windows NT/XP
root (hd0,0)
savedefault
chainloader +1
|
사용자의 부트 파티션에서 해당 부트 로더가 지원하지 않는 파일 시스템을 사용할 때 부트 파티션을 가지고 있어야 할 다른 이유가 생긴다. 예를 들어, 루트 파티션(/)에서 GRUB Legacy에서는 지원하지 않는 LVM을 사용할 때 /boot 파티션의 형식을 ext2 또는 ext3으로 하는 것은 매우 흔한 일이다.
시스템에 여러 배포 버전이 있는 경우에는 이들 버전 사이에 /boot 파티션을 공유하면 안 된다. LILO 또는 GRUB가 나중에 /boot로 마운트될 파티션에서 부팅하도록 설정해야 한다. 또한, 어떤 배포 버전의 업데이트 프로그램은 보통 그 시스템에 대한 GRUB 또는 LILO 구성을 업데이트한다는 점에도 유의한다. 여러 가지 시스템이 있는 환경에서는 각 시스템마다 자체적인 /boot 파티션을 주 파티션으로 유지하고, 시스템 중 하나를 업데이트할 때 필요할 때마다 그 구성 파일을 수동으로 업데이트하고 싶을 수도 있다. 다른 접근 방법은 각 시스템에서 자체적인 파티션 부트 레코드에 부트 로더를 설치하도록 하고 주 시스템에서는 개별 시스템용 파티션 부트 레코드를 단순히 체인 로드하도록 하는 2단계 메뉴 프로세스를 활용하는 방법이다.
마지막으로, 하드 드라이브에 어떤 일이 일어났든 상관없이 GRUB 설치와 GRUB 프롬프트로 연결해줄 독립형 플로피 또는 CD를 만드는 방법을 좀 더 자세히 살펴보자.
"Learn Linux 101: Hard disk layout" 기사에서 설명한 것처럼 하드 드라이브 레이아웃에 익숙하다면, 하드 드라이브의 실린더에 대한 자세한 내용도 기억하고 있을 것이다. 실린더를 현대식 드라이브와는 상충하는 요소라고 생각할 수도 있겠지만, 파일 시스템의 많은 부분에서 실린더 개념이 적용된다. 특히, 파티션에서 실린더 경계에 맞춰 정렬된 실린더의 내부 번호를 사용한다는 사실을 알게 될 것이다. 파티션 내부에서는, 많은 파일 시스템이 실린더 단위의 공간을 관리하기도 한다. 다양한 UNIX® 및 Linux 시스템에서, 파일 시스템의 레이아웃은 파일 시스템의 첫 번째 할당 단위인 superblock에 저장된다. ext2 또는 ext3 파일 시스템과 같은 시스템과 적당히 큰 하드 드라이브의 경우, 공간은 여러 섹션으로 구분되고 각 섹션의 시작 부분에는 superblock의 사본이 있다. 이는 실수로 fdisk 같은 프로그램으로 파티션 경계를 혼란스럽게 만든 경우 복구하는 데 도움이 될 것이다.
실린더 방식의 한 가지 다른 이점은 MBR 바로 뒤의 디스크 시작 부분에 약간의 공간이 있다는 점이다. GRUB는 이 공간 또는 이 용도가 아니면 사용하지 않는 파티션 상의 유사한 공간(가능한 경우)에 1.5단계 부트 로더를 임베드하여 이런 공간을 이용한다. 1.5단계 로더는 2단계가 포함된 파티션의 파일 시스템을 이해하므로, 이동되는 파일과 관련된 문제로부터 더 강력하게 보호된다.
이 모든 게 다 좋지만, 이것이 부트 가능 플로피와는 어떤 관계가 있을까? 플로피는 공간이 많지 않거나 실린더 개념이 그다지 많이 적용되지 않으므로, 플로피에서 GRUB의 1단계와 2단계를 모두 부팅하려면 1단계를 설치한 다음 부트 섹터 바로 뒤에 있는 섹터로 2단계를 복사해야 한다. Listing 9는 이 작업의 수행 방법을 예로 들어 설명한 것이다. 이 프로세스를 실행하면 데이터가 삭제되므로 빈 디스켓을 사용한다. /boot/grub/stage2는 하드 드라이브 파티션에서 작동하도록 수정되었기 때문에, /boot/grub 디렉토리의 파일이 아니라 배포된 GRUB에 포함된 파일을 복사해야 한다. /usr/share/grub의 서브디렉토리에서 원본 stage1 및 stage2 파일을 찾아야 한다. 예제에서 이 파일들은 /usr/share/grub/i386-redhat에 있다.
Listing 9. GRUB 부트 플로피 만들기
[root@pinguino ~]# ls /usr/share/grub/
i386-redhat
[root@pinguino ~]# cd /usr/share/grub/i386-redhat/
[root@pinguino i386-redhat]# ls -l st*
-rw-r--r-- 1 root root 512 2008-05-28 12:05 stage1
-rw-r--r-- 1 root root 109212 2008-05-28 12:05 stage2
-rw-r--r-- 1 root root 109212 2008-05-28 12:05 stage2_eltorito
[root@pinguino i386-redhat]# dd if=stage1 of=/dev/fd0 bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.29007 s, 1.8 kB/s
[root@pinguino i386-redhat]# dd if=stage2 of=/dev/fd0 bs=512 seek=1
213+1 records in
213+1 records out
109212 bytes (109 kB) copied, 7.4094 s, 14.7 kB/s
[root@lyrebird root]# ls /usr/share/grub
i386-redhat
[root@lyrebird root]# cd /usr/share/grub/i386-redhat
[root@lyrebird i386-redhat]# ls -l st*
-rw-r--r-- 1 root root 512 Aug 3 2004 stage1
-rw-r--r-- 1 root root 104092 Aug 3 2004 stage2
[root@lyrebird i386-redhat]# dd if=stage1 of=/dev/fd0 bs=512 count=1
1+0 records in
1+0 records out
[root@lyrebird i386-redhat]# dd if=stage2 of=/dev/fd0 bs=512 seek=1
203+1 records in
203+1 records out
|
GRUB 부트 플로피를 만들기 전에 MS-DOS 형식의 플로피로 시작했고 지금은 플로피를 마운트하려는 경우, mound 명령을 실행하면 오류가 발생한다. 디스켓의 부트 섹터(seek=1) 바로 뒤의 stage2를 복사하는 바람에 디스켓의 파일 시스템이 삭제되었다.
하드 드라이브에서 CD 이미지를 준비하지만, 부트 가능 GRUB CD를 만드는 것은 다소 유사하다. 서브디렉토리 부팅 및 boot/grub와 함께, 예컨대
grubcd 같은 임시 디렉토리가 필요하다. 이번에는 GRUB 배포 파일에서 방금 만든 grub 서브디렉토리로 stage2_eltorito 파일을 복사해야 한다. 그런 다음,
genisoimage를 사용하여 선호하는 버너 도구를 통해 CD로 구울 수 있는 부트 가능 .iso 이미지 파일을 작성한다. Listing 10은
CD 이미지를 grubcd.iso로 작성하는 방법을 나타낸 것이다.
Listing 10. GRUB 부트 가능 CD 이미지 작성
[ian@pinguino ~]$ mkdir -p grubcd/boot/grub [ian@pinguino ~]$ cp /usr/share/grub/i386-redhat/stage2_eltorito grubcd/boot/grub [ian@pinguino ~]$ genisoimage -R -b boot/grub/stage2_eltorito -no-emul-boot \ > -boot-load-size 4 -boot-info-table -o grubcd.iso grubcd I: -input-charset not specified, using utf-8 (detected in locale settings) Size of boot image is 4 sectors -> No emulation Total translation table size: 2048 Total rockridge attributes bytes: 760 Total directory bytes: 4576 Path table size(bytes): 34 Max brk space used 0 233 extents written (0 MB) |
임의의 PC에서 CD 또는 디스켓을 부팅할 수 있지만, Linux 시스템을 포함한 것일 필요는 없다. 이제 디스켓을 부팅하면 디스켓에서 2단계를 로드하는
동안 지연이 발생하는 것을 확인할 수 있다. 이와 유사하게, CD를 부팅하면 CD에서 GRUB 쉘을 로드한다. 어느 것을 부팅하든, GRUB 부트 프롬프트가 나타난다. Tab
키를 눌러 사용 가능한 명령 목록을 본다. help commandname을 사용하면 commandname이라는 명령에 대한 도움말을
볼 수 있다. Listing 11은 GRUB 명령행을 나타낸 것이다.
Listing 11. GRUB 명령행
GNU GRUB version 0.97 (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>
Possible commands are: blocklist boot cat chainloader clear cmp color configfile
debug device displayapm displaymem dump embed find fstest geometry halt help
hide impsprobe initrd install ioprobe kernel lock makeactive map md5crypt
module modulenounzip pager partnew parttype password pause quit read reboot
root rootnoverify savedefault serial setkey setup terminal terminfo testload testvbe
unhide uppermem vbeprobe
grub> help rootnoverify
rootnoverify: rootnoverify [DEVICE [HDBIAS]]
Similar to `root', but don't attempt to mount the partition. This
is useful for when an OS is outside of the area of the disk that
GRUB can read, but setting the correct root device is still
desired. Note that the items mentioned in `root' which derived
from attempting the mount will NOT work correctly.
grub> find /boot/grub/grub.conf
(hd0,1)
(hd0,5)
grub>
|
이 예제에서는 첫 번째 하드 드라이브의 다른 두 파티션에 GRUB 구성 파일이 있다는 사실을 알게 되었다. configfile
명령을 사용하여 다음 중 하나에서 GRUB 메뉴를 로드할 수 있었다. 예: configfile (hd0,1)/boot/grub/grub.conf
이렇게 하면 그 구성 파일에 대한 메뉴가 로드되고 이 지점에서 시스템을 부팅할 수 있다. GRUB 매뉴얼에서 이런 grub 명령을 탐색할 수 있다. Linux
터미널 창에서 info grub를 입력하여 매뉴얼을 연다.
GRUB에 대한 설명을 끝내기 전에 마지막으로 설명한 점이 하나 있다. 2단계 GRUB 파일로 인해 디스켓의 파일 시스템이 삭제되었다고 설명했다. 디스켓의 구성 파일을 포함한 GRUB 파일을 로드하는 부트 가능 GRUB 복구 디스켓을 원한다면 다음 절차에 따르면 된다.
mkdosfs명령을 사용하여 디스켓에서 DOS FAT 파일 시스템을 만들고-R옵션을 사용하여 2단계 파일에 충분한 섹터를 예약한다.- 디스켓을 마운트한다.
- 디.스켓에 /boot/grub 디렉토리를 만든다.
- GRUB stage1, stage2 및 grub.conf 파일을 디스켓의 boot/grub 디렉토리로 복사한다. 시작 화면 이미지를 원한다면 시작 화면 이미지 파일도 복사한다.
- 디스켓의 grub.conf 파일이 시작 화면 파일을 가리키므로 이 파일을 편집한다.
- 디스켓을 마운트 해제한다.
grub명령 쉘을 통해 GRUB 루트 및 설치 명령을 사용하여 디스켓에 GRUB를 설치한다.
Listing 12에서 이 내용을 보여준다.
Listing 12. 파일 시스템이 있는 디스켓에 GRUB 설치
[root@pinguino ~]# mkdosfs -R 220 /dev/fd0
mkdosfs 2.11 (12 Mar 2005)
[root@pinguino ~]# mkdir /mnt/floppy
[root@pinguino ~]# mount /dev/fd0 /mnt/floppy
[root@pinguino ~]# mkdir -p /mnt/floppy/boot/grub
[root@pinguino ~]# cp /boot/grub/stage1 /mnt/floppy/boot/grub
[root@pinguino ~]# cp /boot/grub/stage2 /mnt/floppy/boot/grub
[root@pinguino ~]# cp /boot/grub/splash* /mnt/floppy/boot/grub
[root@pinguino ~]# cp /boot/grub/grub.conf /mnt/floppy/boot/grub
[root@pinguino ~]# umount /dev/fd0
[root@pinguino ~]# grub
Probing devices to guess BIOS drives. This may take a long time.
GNU GRUB version 0.97 (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> root (fd0)
Filesystem type is fat, using whole disk
grub> setup (fd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/fat_stage1_5" exists... no
Running "install /boot/grub/stage1 (fd0) /boot/grub/stage2 p /boot/grub/grub.c
onf "... succeeded
Done. |
이 마지막 예제에서도 Linux 쉘에서 grub 명령을 실행할 수 있다는 사실을 보여준다. 이것은 매번 시스템을
다시 부팅할 필요 없이 GRUB에 대해 학습할 수 있는 좋은 방법이다. grub를 실행하려면 루트 권한이 필요하고, 실제로 시스템을
다시 부팅하는 점을 제외하면 GRUB가 할 수 있는 대부분의 일을 할 수 있을 것이다.
GRUB 2는 모듈화 및 휴대 능력을 크게 개선하기 위해 처음부터 다시 작성되었다. GRUB 2는 다른 아키텍처와 부팅 방법을 목표로 하며 새로운 기능이 많이 있다. 자세한 정보를 확인할 수 있는 링크는 참고자료를 참조한다. GRUB에 익숙한 상태에서 GRUB 2를 사용하기 시작한 경우, GRUB 2가 GRUB와는 완전히 다른 것이라는 사실을 깨닫고 무척 놀랄 것이다.
GRUB 2를 접했을 때 가장 먼저 발견하게 되는 사실은 GRUB 2가 파티션 부트 로더로 설치되지 않는다는 점이다. 앞서 필자가 Ubuntu 설치 프로그램은 Ubuntu 9.10을 설치한 파티션(/dev/sda7)에 GRUB를 설치한다고 말했지만, 그 파티션을 체인 로드로 부팅할 수는 없다. 이 섹션의 나머지 부분에서는 GRUB 2만 사용하거나 GRUB 2를 GRUB Legacy와 함께 사용하여 부트 매니저 관련 작업을 시작하는 데 도움이 될 충분한 정보와 함께 GRUB 2에 대해 간략히 소개한다.
grub-pc 패키지에서는 PC용 GRUB 2 버전이 배포된다. Listing 13에서 보듯이, 보통 .usr/bin 또는 /usr/sbin에 있고 grub-pc 패키지에 포함된
여러 가지 프로그램을 찾을 수 있다. 본 기사를 쓰는 현재, 이런 프로그램에 대한 매뉴얼 페이지는 극소수에 불과하다. 자세한 정보를 얻거나 인터넷에서
도움말을 추가로 검색하려면 --help 옵션과 함께 프로그램을 실행해본다.
Listing 13. /usr/bin and /usr/sbin의 GRUB 2 실행 파일
ian@pinguino:~$ dpkg -L grub-pc|grep "bin/" /usr/bin/grub-mkimage /usr/bin/grub-mkrescue /usr/sbin/grub-setup /usr/sbin/update-grub2 /usr/sbin/update-grub /usr/sbin/grub-install /usr/sbin/upgrade-from-grub-legacy /usr/sbin/grub-set-default /usr/sbin/grub-reboot |
구성 파일(/boot/grub/grub.cfg) 외에도 GRUB 2의 핵심은 다중 부트 커널(/boot/grub/core.img)이다. 이들은 grub-install을
실행하고 대상을 MBR(예: grub-install /dev/sda)로 설정하는 경우 자동으로 생성된다. Listing 14에 나타낸 것처럼
grub-install --help를 실행하면 모든 작업을 수행하도록 호출되는 프로그램에 대한 아이디어를 얻을 수 있다. 어떤 것들은
Grub Legacy와 비슷하지만, --modules, --grub-setup, --grub-mkimage 등과 같은
새로운 항목이 많이 있다.
Listing 14. grub-install에 대한 GRUB 2 도움말
ian@pinguino:~$ grub-install --help
Usage: grub-install [OPTION] install_device
Install GRUB on your drive.
-h, --help print this message and exit
-v, --version print the version information and exit
--modules=MODULES pre-load specified modules MODULES
--root-directory=DIR install GRUB images under the directory DIR
instead of the root directory
--grub-setup=FILE use FILE as grub-setup
--grub-mkimage=FILE use FILE as grub-mkimage
--grub-mkdevicemap=FILE use FILE as grub-mkdevicemap
--grub-probe=FILE use FILE as grub-probe
--no-floppy do not probe any floppy drive
--recheck probe a device map even if it already exists
--force install even if problems are detected
--disk-module=MODULE disk module to use
INSTALL_DEVICE can be a GRUB device name or a system device filename.
grub-install copies GRUB images into the DIR/boot directory specified by
--root-directory, and uses grub-setup to install grub into the boot
sector.
Report bugs to <bug-grub@gnu.org>.
|
grub-install /dev/sda를 실행하면 프로세스에서 주요 이미지 파일이 자동으로 빌드되고 구성 파일이 빌드되며
MBR에 GRUB 2가 설치된다. 전체 설치를 위해 GRUB2를 커미트할 준비가 되지 않은 경우 이런 부분들을 스스로 빌드한 다음 GRUB Legacy 또는 LILO에서 GRUB 2 주요
이미지를 부팅할 수 있다.
새 주요 이미지 파일을 가장 쉽게 빌드하는 방법은 --grub-setup=/bin/true 옵션으로 grub-install을 실행하는 것으로,
이렇게 하면 Listing 15에 표시된 것처럼 실제 GRUB 2 설치 프로그램 대신 /bin/true가 실행된다. 우선, 기존의 core.img를 제거하여 해당 파일이 사실은 생성된다는
점을 보여준다.
Listing 15. grub-install에 대한 GRUB 2 도움말
ian@pinguino:~$ sudo rm /boot/grub/core.img ian@pinguino:~$ sudo grub-install --grub-setup=/bin/true /dev/sda Installation finished. No error reported. This is the contents of the device map /boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (hd0) /dev/sda ian@pinguino:~$ ls -l /boot/grub/core.img -rw-r--r-- 1 root root 25105 2010-04-08 12:10 /boot/grub/core.img |
GRUB 2 구성 파일은 보통 /boot/grub/grub.cfg이다. GRUB Legacy와는 달리, 보통 이 파일을 스스로 편집하면 안 된다. grub-mkconfig에
대한 프런트 엔드인 grub-mkconfig 또는 update-grub 명령을 사용하여 구성 파일을 빌드해야 한다. 이들
명령은 /etc/default/grub에서 배경, 제한시간 등의 일반 설정을 찾은 다음, /etc/grub.d/에서 실행 파일을 실행하여 헤더, 현재 Linux 배포에 대한 섹션, 다른 운영
체제에 대한 섹션 및 자체적인 사용자 정의 추가 기능과 같은 구성 파일의 다양한 파트를 빌드한다. GRUB 2 메뉴를 사용자 정의해야 하는 경우, 40_custom과 같이
/etc/grub.d/에 있는 파일에 변경 내용을 추가하거나 사용자의 파일을 추가해야 한다.
파일은 실행 파일이어야 한다. 그 다음, Listing 16에 나타낸 것처럼 update-grub를 실행하여 새 /boot/grub/grub.cfg
파일을 생성한다.
Listing 16. update-grub로 GRUB 2 구성 파일 빌드
ian@pinguino:~$ sudo update-grub Generating grub.cfg ... Found linux image: /boot/vmlinuz-2.6.31-20-generic Found initrd image: /boot/initrd.img-2.6.31-20-generic Found linux image: /boot/vmlinuz-2.6.31-14-generic Found initrd image: /boot/initrd.img-2.6.31-14-generic Found memtest86+ image: /boot/memtest86+.bin Found GRUB boot loader on /dev/sda1 Found Fedora release 8 (Werewolf) on /dev/sda6 done |
Listing 17은 결과 구성 파일의 몇몇 항목을 나타낸 것이다. 후행 백슬래시(\)를 사용하여 게시를 위해 구분한 긴 행들을 나타내었다. 메뉴 항목 스탠자는 GRUB Legacy의 논리가 없는 일반 명령보다는 쉘 스크립트와 더 닮은 모습이다. GRUB Legacy에서 변경된 다른 중요한 사항은 디스크 번호는 그대로 0부터 시작하지만, 파티션 번호는 1부터 시작한다는 점이다. 따라서 /dev/sda7이 GRUB Legacy에서는 (hd0,6)이지만, GRUB 2에서는 (hd0,7)이다.
Listing 17. GRUB 2 구성 파일의 일부
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/white
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
menuentry "Ubuntu, Linux 2.6.31-20-generic" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,7)
search --no-floppy --fs-uuid --set 8954fa66-e11f-42dc-91f0-b4aa480fa103
linux /boot/vmlinuz-2.6.31-20-generic \
root=UUID=8954fa66-e11f-42dc-91f0-b4aa480fa103 ro quiet splash
initrd /boot/initrd.img-2.6.31-20-generic
}
menuentry "Ubuntu, Linux 2.6.31-20-generic (recovery mode)" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
insmod ext2
set root=(hd0,7)
search --no-floppy --fs-uuid --set 8954fa66-e11f-42dc-91f0-b4aa480fa103
linux /boot/vmlinuz-2.6.31-20-generic
root=UUID=8954fa66-e11f-42dc-91f0-b4aa480fa103 ro single
initrd /boot/initrd.img-2.6.31-20-generic
}
|
파티션 부트 레코드에서 GRUB 2를 체인 로드할 수 없다고 설명했었다. 하지만, 주요 이미지 및 구성 파일을 빌드한 후에는 GRUB Legacy grub.conf 또는 menu.lst 파일에 항목을 추가하여 GRUB 2 주요 이미지를 부팅할 수 있고, 그러면 이 이미지에서 빌드한 GRUB 2 메뉴가 표시된다. Listing 18에는 Listing 8에서 이미 사용한 항목이 표시되어 있다. 이 구성 파일은 GRUB Legacy용이므로, 루트 항목은 /dev/sda7에 대해 (hd0,6)을 지정한다.
Listing 18. GRUB 2 주요 이미지 부팅을 위한 GRUB Legacy 구성 항목
# Ubuntu 9.10 uses GRUB 2, so use kernel to drive GRUB 2 menu. title Ubuntu 9.10 (sda7) root (hd0,6) kernel /boot/grub/core.img |
GRUB Legacy 메뉴에서 이 항목을 선택하면 그림 7에 표시된 것과 비슷한 메뉴가 나타나고, 여기서는 첫 번째 항목이 강조 표시되어 있고 이 항목과 다음 항목이 Listing 17에서 표현한 두 항목이다.
그림 7. GRUB 2 메뉴의 예
파티션 부트 레코드에 GRUB 2를 설치해보고 싶을 수 있다. 설치해보면 아마 Listing 19의 출력과 유사한 출력이 나타날 것이다.
Listing 19. 파티션 부트 레코드에 GRUB 2 설치 시도
ian@pinguino:~$ sudo grub-install /dev/sda7 grub-setup: warn: Attempting to install GRUB to a partition instead of the MBR. This is a BAD idea. grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and its use is discouraged. Installation finished. No error reported. This is the contents of the device map /boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (hd0) /dev/sda |
이 예제는 필자가 Ubuntu 9.10 설치에 실패했지만 /dev/sda7 파티션에 GRUB 2를 설치하려고 시도한 이유를 설명해준다. 이 Ubuntu 릴리스에서는 새로운 설치를 위해 GRUB 2를 설치하지만, 기존의 Ubuntu 설치를 업그레이드하는 경우 기존의 부트 매니저를 유지한다는 점은 주목할 가치가 있다.
GRUB 2에서는 복구용 플로피 또는 CD 이미지를 작성하는 데 도움이 되는 grub-mkrescue 명령이 제공된다. 자세한 내용은
도움말이나 매뉴얼 페이지를 참조한다.
실수를 하거나 부팅 문제가 발생했을 때 복구하는 방법을 포함하여, 전통적인 Linux 시스템의 두 가지 주 부트 로더에 대해 배워보았다. 현재 LPI 시험 목적에는 포함되지 않지만 주요 Linux 배포 버전에서 등장하기 시작하고 있는 GRUB 2에 대한 개론도 살펴보았다.
| 설명 | 이름 | 크기 | 다운로드 방식 |
|---|---|---|---|
| Configuration files used in this article | l-lpic1-v3-102-2-samples.zip | 8KB | HTTP |
교육
- developerWorks
roadmap for LPIC-1을 통해 2009년 4월의 시험 목적을 바탕으로 LPIC-1 인증 시험 공부에 도움이 되는 developerWorks 기사를 찾을 수 있다.
- LPIC Program 사이트에서는
Linux Professional Institute에서 실시하는 세 가지 레벨의 Linux 시스템 관리 인증 시험에 대비한 자세한 시험 목적, 작업 목록 및 샘플 문제를 찾을 수 있다. 특히,
LPI exam 101 및
LPI exam 102에 대한 2009년 4월 시험 목적을
확인한다. 항상 LPIC Program 사이트를 참조하여 최신 목적을 확인한다.
- Linux 기초를 학습하고 2009년 4월 이전의 LPI 시험 목적을 바탕으로 한 시스템 관리자 인증 시험을 준비하려면
developerWorks에서 전체 LPI exam prep series를
검토한다.
- GNU GRUB 홈 페이지에서 GRUB Legacy와 GRUB 2에 대해 학습할 수 있다.
GNU GRUB는 GRUB(GRand Unified Bootloader)에서 파생된 다중 부팅 부트 로더이다.
- 인터페이스에 대한 다중 부트 스펙을
통해 규격에 맞는 부트 로더가 역시 규격에 맞는 운영 체제를 로드할 수 있다.
- "Basic tasks for
new Linux developers"(developerWorks, 2005년 3월)에서 터미널 창이나 쉘 프롬프트를 여는 방법 등을 학습할 수 있다.
- Linux Documentation Project에는 다양한 종류의 유용한 문서, 특히 HOWTO
문서가 있다.
- developerWorks
Linux 영역에서 Linux 개발자 및 관리자를 위한 수백 편의 사용법
기사 및 튜토리얼과 더불어 다운로드, 토론 포럼 및 다양한 자원을 볼 수 있다.
- developerWorks
기술 행사 및 웹 캐스트를 통해 다양한 IBM 제품 및 IT 산업 주제에 대한 최신 정보를 얻을 수 있다.
- 무료 developerWorks Live!
briefing을 통해 최신 IBM 제품 및 도구에 대한 정보뿐만 아니라 IT 업계의 최신 경향까지도 빠르게 확인할 수 있다.
- developerWorks
on-demand demos에서는 입문자를 위한 제품 설치 및 설정부터 숙련된 개발자를 위한 고급 기능까지 망라된 다양한 데모를 제공한다.
- Twitter의 developerWorks를 팔로우(follow)하거나
developerWorks에 대한 Linux 트윗(tweet)의 피드를 구독하자.
제품 및 기술 얻기
- 크래시 발생 후의 시스템 복구에 도움을 주기 위해 온라인으로 제공되는 수많은 도구 중
하나인 시스템 복구 CD-ROM을 다운로드한다.
-
자신에게 가장한 적합한 방법으로 IBM
제품을 평가해 보자. 시험판 제품을 다운로드하거나, 온라인으로 제품을 사용해 보거나, 클라우드 환경에서 제품을 사용하거나,
SOA Sandbox에서
SOA(Service Oriented Architecture)를 효과적으로 구현하는 방법을 배울 수 있다.
토론
- 포럼에 참여하기.
- My developerWorks 커뮤니티에 참여하자.
개발자가 이끌고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

Ian Shields는 developerWorks 리눅스 영역을 위한 리눅스 프로젝트 다수를 수행하고 있다. Shields는 노스 캐롤라이나 주 소재 IBM 리서치 트라이앵글 파크에서 선임 프로그래머로 일한다. Shields는 1973년 시스템 엔지니어로 오스트레일리아, 캔베라에 있는 IBM 사무실에 들어갔으며 캐나다 몬트리얼과 노스 캐롤라이나 주 RTP에서 통신 시스템과 배포 컴퓨팅 부문에서 일해왔다. Shields는 특허 여러 건을 획득했으며, 논문 여러 건을 발표했다. Shields는 순수 수학과 철학 학사 학위를 오스트레일리안 국립 대학에서 받았다. 노스 캐롤라이나 주립 대학에서 컴퓨터 과학 분야를 대상으로 석사와 박사 학위를 받았다. 전자편지 주소는 ishields@us.ibm.com이다.