본문 바로가기
my_lesson/_Linux

Linux - Ubuntu GNU GRUB 부팅순서 설정

by boolean 2016. 4. 26.
728x90
/boot/grub/grub.cfg
읽기전용 파일로 설정정보를 포함하고 있음

/etc/default/grub
기본적인 설정을 할수 있으며 해당파일을 편집하고 명령을 실행해 /boot/grub/grub.cfg 파일에 반영한다.
# grub2-mkconfig -o /boot/grub2/grub.cfg
update-grub

/etc/grub.d/*****
 세부적인 설정이 포함되어있으며 아래와 같은 파일포함
  00_header 
  05_debian_theme
  10_linux
  20_memtest86+
  30_os-prober
  40_custom


현재 부팅 1순위 확인
# grub2-editenv list
saved_entry=Fedora (3.14.9-200.fc20.x86_64) 20 (Heisenbug)

시스템내 부팅커널 확인
# grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2
Fedora, with Linux 3.14.9-200.fc20.x86_64
Fedora, with Linux 3.11.10-301.fc20.x86_64
Fedora, with Linux 0-rescue-40089f9575bf4e12b7d6a674365956b9

부팅커널 변경
# grub2-set-default "Fedora, with Linux 3.11.10-301.fc20.x86_64"

# grub2-editenv list
saved_entry=Fedora, with Linux 3.11.10-301.fc20.x86_64

# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.14.9-200.fc20.x86_64
Found initrd image: /boot/initramfs-3.14.9-200.fc20.x86_64.img
Found linux image: /boot/vmlinuz-3.11.10-301.fc20.x86_64
Found initrd image: /boot/initramfs-3.11.10-301.fc20.x86_64.img
Warning: Please don't use old title `Fedora, with Linux 3.11.10-301.fc20.x86_64' for GRUB_DEFAULT, use `Advanced options for Fedora>Fedora, with Linux 3.11.10-301.fc20.x86_64' (for versions before 2.00) or `gnulinux-advanced-616b48a0-f80e-45fb-ae44-7988278c7df2>gnulinux-3.11.10-301.fc20.x86_64-advanced-616b48a0-f80e-45fb-ae44-7988278c7df2' (for 2.00 or later)
Found linux image: /boot/vmlinuz-0-rescue-40089f9575bf4e12b7d6a674365956b9
Found initrd image: /boot/initramfs-0-rescue-40089f9575bf4e12b7d6a674365956b9.img
done

# reboot

커널변경 내역 확인
# grub2-editenv list
saved_entry=Fedora, with Linux 3.11.10-301.fc20.x86_64

# uname -a
Linux localhost.localdomain 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux




Grub2 추가 보충설명

※ 출처 http://wiki.gentoo.org/wiki/GRUB2_Migration/ko


이 안내서의 목표는 기존 GRUB에서 GRUB2로 유연하게 옮겨가는 방안을 알려드리는 것입니다.

배경

GRUB 이란 무엇일까요?

GRUB은 비 임베디드 리눅스 장치에서 대부분 존재하는 부트로더중 하나입니다. GRUB의 역할은 디스크에서 메모리로 리눅스 커널을 불러오도록 갖추고 리눅스 커널을 실행하는 것입니다.

왜 옮겨야 하나요?

먼저, 이전 GRUB은 더이상 업데이트를 받지 않으므로 관리하지 않습니다. 이전 GRUB은 개발자들이 오늘날 더이상 제대로 된 상태로 유지할 수 없다는 다양한 고려 사항이 발생함에도 불구, 안전하다는 느낌에 빠질 때마다 계속 만들었습니다. 예를 들어 이전 GRUB은 2TB 이상의 디스크로는 부팅할 수 없으며 새 파일 시스템으로는 /boot를 대체할 수 없다고 간주합니다.

GRUB2는 좀 더 견고하고, 가벼우며, 강력함을 목표로 하였으며, 더욱 깔끔한 코드를 기반으로 유지 관리합니다. GRUB2는 이전 버전과는 달리 더 많은 하드웨어 설정, 파일 시스템, 드라이브 배치를 지원합니다.

GRUB2로 옮겨가기

GRUB2로 옮겨가는 것은 굉장히 간단합니다. 꾸러미 관리자가 보통 업그레이드 과정을 처리하는걸로 같이 끝냅니다. 자동으로 끌어오지 않았다면 sys-boot/grub:2를 언제든 설치할 수 있습니다.

부트 드라이브

첫번째 중요한 부분은 부팅 가능한 드라이브가 무엇인지 이해하는 것입니다. 대부분의 사람들에게는 /dev/sda일 것입니다. 이걸 가장 쉽게 찾는 방법은 /boot/grub/grub.conf를 보고 예전 GRUB을 어떻게 설정했는지 보는 것입니다. 그 예제 하나를 아래에 보여드리도록 하겠습니다.

참고
이 파일을 보려면 /boot에 마운트 해야 합니다. /boot에 마운트 하는 방법은 mount /boot와 같이 단순합니다.
 [Collapse
File/boot/grub/grub.conf

default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  
title Gentoo Linux 3.2.12
root (hd0,0)
kernel /boot/kernel-3.2.12-gentoo root=/dev/sda3 quiet dolvm
initrd /boot/initramfs-genkernel-x86_64-3.2.12-gentoo

위 파일 내용을 근거로 (hd0)가 부트 드라이브임을 알아냈지만 이걸 실제 장치로 대응해야 합니다. 이를 알려면 /boot/grub/device.map을 봐야 합니다. 이에 대한 예제가 아래에 있습니다.

 [Collapse
File/boot/grub/device.map

(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
참고
/boot/grub/device.map이 정확하지 않은것 같으면, grub-install --recheck /dev/sda 명령을 실행하여 파일을 다시 만들 수 있습니다.

위 파일을 기반으로 /dev/sda가 부팅 드라이브임을 알고 있습니다.

GRUB2 설치 및 설정

다음 단계는 예전의 GRUB을 MBR에서 제거하지 않고 /boot 파티션에 GRUB2를 설치하고 설정하는 것입니다. 아래 예제는 /dev/sda를 사용하지만 여러분의 드라이브 경로로 (올바르게) 바꿔야 합니다. 첫번째 단계에서는 /boot/grub로 필요한 GRUB2 파일을 설치하는 것입니다. 그리고 두번째 단계에서는 존재하는 커널을 검색하고 /boot/grub/grub.cfg로 적당한 설정 파일을 만드는 것입니다. 직접 설정 방식대로 진행한다면 두번째 단계는 건너뛰십시오.

경고
예전 GRUB은 /boot/grub/grub.conf를 사용하는데 반해 GRUB2는 /boot/grub/grub.cfg를 사용하므로 예전 파일을 사용하는 우를 범하지 마십시오. 예를 들자면 탭 완성 기능을 활용하여 예전 파일이 아직 있는지 확인할 수 있습니다.
root # grub2-install --grub-setup=/bin/true /dev/sda
Installation finished. No error reported.
root # grub2-mkconfig -o /boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/kernel-3.2.12-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.2.12-gentoo
done
참고
grub2-mkconfig는 커널과 initramfs 이미지에 대한 엄격한 작명 요구사항이 있습니다. 커널은 반드시 kernel-${version}또는 vmlinuz-${version}이어야 하고 initramfs는 initramfs-${version}.imginitramfs-genkernel-${version}initramfs-genkernel-${arch}-${version}initrd-${version}.imginitrd.img-${version}initrd-${version}.gzinitrd-${version}중 하나가 되어야 합니다. /boot에 있는 ${version}이 붙은 파일 이름은 커널에 해당하는 이름으로 반드시 일치해야 합니다.

설정을 시험하기 위해 이전 GRUB에서 GRUB2 이어서 불러오기

깨진 GRUB 설정은 시스템 부팅을 불가능하게 한다는 의미를 지닐 수 있으므로, GRUB2 설정을 완전히 두기 전에 시험하려 합니다. 이를 위해 예전 GRUB에서 GRUB2로 그대로 이어서 불러오도록 하겠습니다. /boot/grub/grub.conf에 새 섹현을 추가하면 됩니다. 예제는 다음과 같습니다.

참고
예제에서 사용한 바와 같이 (hd0,0)과 실제 루트가 다룰 수 있음을 알아두시고, /boot/grub/grub.conf에서 같은 루트 값을 다시 사용하는지 확인하십시오.
 [Collapse
File/boot/grub/grub.conf

default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  
title GRUB2 Chainload
root (hd0,0)
kernel /boot/grub/i386-pc/core.img
boot
  
title Gentoo Linux 3.2.12
root (hd0,0)
kernel /boot/kernel-3.2.12-gentoo root=/dev/sda3 quiet dolvm
initrd /boot/initramfs-genkernel-x86_64-3.2.12-gentoo

여기서 머신을 재부팅하고 머신이 부팅할때 GRUB 메뉴에서 GRUB2 Chainload를 선택해야 합니다. GRUB 2.0.0 이상과 같이 자체적으로 알려주는 다른 GRUB 메뉴가 상단에 함께 나타나고, 시스템에 있는 부팅 커널을 보여줍니다. 이게 동작하지 않으며 그냥 시스템을 껐다 켜고, GRUB2 Chainload 대신 일반 부트 옵션을 고르십시오.

이전 GRUB 대체하고 제거

여기서 모든 동작이 성공적으로 끝났다면, 예전 GRUB을 바꾸고 시스템에서 제거할 수 있습니다.

참고
시스템을 재부팅 했으므로, /boot를 다시 마운트 해야 합니다. /dev/sda 대신 부트 드라이브 경로를 제대로 사용하는지 확인하십시오.
root # grub2-install /dev/sda
Installation finished. No error reported.

여기서 sys-boot/grub:0을 제거하기 위해 꾸러미 관리자를 사용할 수 있습니다.

root # emerge -avC "=sys-boot/grub-0.97*"

이제 옮겨가기가 끝났습니다.

GRUB2 유지 관리

새 커널을 설치하는 언제든지, 다음 단계를 진행하여 GRUB2 설정이 (수동 설정 방식을 활용하지 않는다면)새 커널을 인식하도록 해야 합니다.

참고
이 단계를 위해 마운트한 /boot 파티션을 반드시 보유해야 합니다.
root # grub2-mkconfig -o /boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/kernel-3.3.8-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.3.8-gentoo
Found linux image: /boot/kernel-3.2.12-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.2.12-gentoo
done


PC에 멀티부팅을 위해서 윈도우와 우분투를 같이 설치하면, GRUB 부트 로더가 운영체제 선택을 할 수 있는 메뉴를 보여준다. 그런데 기본적으로는 맨 위의 첫번째 항목에 Ubuntu 운영체제가 있고, 그 항목이 선택되어 있다. 만약 제한시간(기본적으로 10초) 내에 키보드로 선택을 바꾸지 않으면 기본 선택된 운영체제로 자동으로 부팅을 진행한다. 그러나 평소에 윈도우를 더 많이 쓰는 경우에는 부팅할 때마다 매번 키보드로 선택을 바꿔 줘야 해서 불편한 경우도 있다.


이를 해결하기 위한 설정 변경 옵션을 GRUB에서 제공하고 있다. 이 글에서는 기본 부팅되는 운영체제 선택을 변경하는 2가지 방법을 설명한다. 첫번째는 설정파일 편집과 콘솔 명령을 이용하는 방법이고, 두번째는 Ubuntu가 GUI (Graphic User Interface) 환경일 경우 grub-customizer 프로그램을 통해서 마우스 클릭 몇번으로 설정할 수 있는 쉬운 방법이다.



(1) 설정 파일 수정 및 콘솔 명령을 통한 방법

우선 GRUB 메뉴상에서 윈도우가 몇번째 항목인지 알고 있어야 한다. 부팅할 때 GRUB 화면을 보고 몇번째인지 기억해 둔다. 필자의 경우 6번째 항목이 윈도우7이었다.


만약 재부팅해서 확인하기 귀찮다면, /boot/grub/grub.cfg 파일에서 몇번째에 있는지 확인할 수 있다.

vi든 gedit든 아무 텍스트 편집기를 써서 /boot/grub/grub.cfg 를 연다.

그리고 "menuentry"로 검색해 보면 운영체제 이름과 함께 여러 개가 검색될 것이다. 

여기서 윈도우 운영체제 이름이 적힌 menuentry가 몇번째인지 확인하면 된다. 


주의할 점은, 중간에 submenu "Previous Linux versions" { 로 시작해서 menuentry가 몇개 나오고 그 다음에 다시 중괄호( } )가 닫히는데, 이 부분은 하나로 계산해야 한다. 즉, submenu 안에 있는 운영체제 개수는 여러개가 있어도 1개로 간주해야 한다. 

일반적으로 아래와 같은 구조로 되어 있다.

menuentry 'Ubuntu, ......' {

    각종 옵션들

}

menuentry 'Ubuntu, ...... (recovery mode)' {

    각종 옵션들

submenu "Previous Linux versions" {

menuentry 'Ubuntu, ......' {

    각종 옵션들

}

menuentry 'Ubuntu, ......' {

    각종 옵션들

} 

}

menuentry "Memory test (memtest86+)" {

    각종 옵션들

menuentry "Memory test (memtest86+, serial console 115200)" {

    각종 옵션들

menuentry "Windows 7 (loader) (on /dev/sda1)" {

    각종 옵션들

}


위와 같은 경우, 윈도우는 6번째 항목이다.


이제 설정 파일에서 기본 선택 위치를 바꿔 보자. 루트 권한을 가지고 /etc/default/grub 파일을 연다.

vi 를 쓰는 경우:

$ sudo vi /etc/default/grub

gedit 를 쓰는 경우:

$ sudo gedit /etc/default/grub


GRUB_DEFAULT="0" 이라고 적힌 줄이 있을 것이다. 이 부분을 메뉴상에서 윈도우가 있는 메뉴 숫자로 바꿔 주어야 한다. 앞의 확인 과정에서 윈도우가 6번째라면, 변경된 값은 5가 된다. 왜냐하면 첫번째 항목이 0부터 시작하기 때문이다.

GRUB_DEFAULT="5"   #윈도우가 메뉴상에서 6번째 항목일 경우


만약 GRUB가 자동 부팅까지 기다리는 시간을 조정하고 싶다면 GRUB_TIMEOUT="10" 에서 따옴표 안의 숫자를 원하는 숫자(초 단위)로 바꾸면 된다.


설정 파일을 고쳤다면 아래 명령을 통해서 설정을 변경한다.

$ sudo update-grub



(2) grub-customizer 프로그램을 이용한 방법


이 방법은 우분투가 GUI 환경을 지원한다는 가정 하에 이용 가능하다.

아래와 같이 콘솔에 명령어를 입력하여 grub-customizer를 설치한다.

$ sudo add-apt-repository ppa:danielrichter2007/grub-customizer

$ sudo apt-get update

$ sudo apt-get install grub-customizer


간중간 계속 진행할 것인지 물어볼 것이다. 모두 yes로 선택(y 입력후 엔터 또는 그냥 엔터)한다.

콘솔에서 아래 명령을 통해서 grub-customizer를 실행한다.

$ gksu grub-customizer



error: no video mode activated

Commenting out GRUB_HIDDEN_TIMEOUT and GRUB_HIDDEN_TIMEOUT_QUIET in /etc/default/grub works for me.

HIDDEN 부분을 주석처리한다.


GRUB_DEFAULT=GRUB_SAVED_DEFAULT

#GRUB_HIDDEN_TIMEOUT=10 

#GRUB_HIDDEN_TIMEOUT_QUIET= 

GRUB_TIMEOUT=10

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

GRUB_CMDLINE_LINUX=""


Note: Please remember to run 'sudo update-grub' after above changes to /etc/default/grub.

sudo update-grub를 하여 변경된 /etc/default/grub를 적용시킨다.

댓글