[해결] 듀얼부팅중 비스타로 부팅이 안됩니다

저번주 금요일이던가… 우분투를 업데이트했습니다. 다음서버가 자꾸 에러가 나서 메인서버로 바꾸고 진행했습니다. 문제는 재부팅후 일어났습니다. 윈도우 비스타로만 부팅이 됩니다. (저는 비스타와 우분투를 사용하고 있습니다.) 메인보드에서 지원해주는 키로 확인해봤더니 Windows Boot Manager와 하드디스크만 있습니다. 원래는 ubuntu도 있었는데 없어졌습니다. 업데이트후 뜻밖의 낭패입니다.

그래서 라이브 USB로 부팅해서 boot-repair를 실행시켜 grub을 복구했습니다. 그리고 재부팅… 그런데 이번에는 우분투로만 부팅이 됩니다.

저는 UEFI환경입니다. 하드디스크도 GPT방식입니다. MBR환경에서는 멀티부팅을 하면 원래 grub에서 윈도우로 부팅을 지원해주었습니다. UEFI로 바꾸면서, grub을 통하지 못하고 메인보드에서 지원해주는 부팅 디바이스 선택을 통해 듀얼부팅해왔습니다. 처음에는 듀얼부팅이 grub에서 가능해진 줄 알고 좋아했습니다. 그런데 비스타는 전혀 부팅되지 않습니다. 참고로 저의 시스템은 ThinkPad Edge E125 3035-RZ4입니다.

비스타 USB로 부팅해서 점검해보니 부팅은 이상없다고 합니다. 아래는 그 내용입니다.

=======================================================
세션정보
시스템 디스크 = \Device\Harddisk0
AutoChk 실행 = 0
근본 원인 수 = 1

수행된 디스크:
이름: 부팅 관리자 진단
결과: 완료되었습니다. 오류코드 = 0x0
소요시간 = 0밀리초

발견된 근본 원인:
부팅상태에서는 OS가 부팅되었다고 나타납니다.

아래는 grub에서 비스타를 선택하면 뜨는 에러 메세지입니다.

========================================================
Windows Boot Manager

Status: 0x000000f
Info: An unexpected error has occurred.

ENTER=Continue              ESC=Exit
========================================================

Enter든 ESC든 결과는 grub화면으로 나옵니다. 즉 우분투로 부팅합니다. 우분투로 부팅해서 디스크를 봐도 윈도우부분을 날라가지 않았습니다. 왜 부팅이 안되는 것일까요? 참고로 아래의 화면은 저의 grub에서 보여주는 메뉴입니다. 

========================================================
Ubuntu, with Linux 3.5.0-45-generic
Ubuntu, with Linux 3.5.0-45-generic (recovery mode)
Previous Linux versions
Windows UEFI bkbootmgfw.efi
========================================================

bkbootmgfw.efi를 처음 봤습니다. 그래서 어디에 있는지 찾아봤습니다. /boot/efi/EFI/Microsoft/boot/ 있습니다. 전 여기다 bootx64.efi랑 bootmgr도 넣고, grub.cfg를 편집해서 bkbootmgfw.efi를 bootx64.efi로 바꿔보기도 했습니다만 비스타로는 부팅되지 않습니다. 고수분들, 어떻게 해야 하나요? 정 안되면 우분투만 재설치하면 될 것 같습니다. 그러나 우분투도 이것저것 사용환경에 맞추려면 시간이 좀 듭니다. 어떻게 우분투를 재설치하지 않고 비스타부팅을 해결할 수 있는 방법은 없을까요?

[quote:j2vw14i7]그리고 설치후에 윈도로 부팅하면 윈도가 자신외 uefi의 다른 정보를 지울 경우 bcdedit를 통해서 grub을 호출하게 하면 됩니다.
관리자 모드로 들어가서 c:> bcdedit /set {bootmgr} path \EFI\ubuntu\shimx64.efi 하면 끝이죠.[/quote:j2vw14i7]

우분투가 부팅이 정상적이라고 가정한다면,
아래 윈8에 했던 답변 내용 그대로인데 한번 해보세요.
[color=#FF0000:j2vw14i7][b:j2vw14i7]참, 윈8을 백업해 놓아서 bcdedit 이거 복구방법은 아직 안 찾아봤네요.[/b:j2vw14i7][/color:j2vw14i7]

[code:j2vw14i7] $ sudo efibootmgr -v
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000
Boot0000* Windows Boot Manager HD(1,800,32000,e0b61773-348c-43d7-8f75-90ecabdd5b04)File(\EFI\ubuntu\shimx64.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...3................
[/code:j2vw14i7]

답변 감사합니다. 알려주신 방법으로 해봤습니다. 안됩니다. 게시판을 찾아보니 cstom.cfg가 있길래 해봤습니다.

menuentry "Windows Vista" {
insmod part_msdos
insmod ntfs
insmod ntldr
search -s -f /bootmgr
ntldr /bootmgr
}

메뉴에는 뜨는데 안됩니다. " /bootmgr "이 없다고 나옵니다.

앗, 그런가요?
음… 제 답변이 엉뚱하게 꺼꾸로 잘못 적었군요. -_-;;

원래값으로 돌리려면 이렇게 하면 되구요,
C:> bcdedit /set {bootmgr} path \EFI\Microsoft\Boot\bootmgfw.efi

비스타 부팅시디로 들어가서, 첫 화면이 나오면 shift+f10키를 눌러서 도스창을 호출합니다.
그곳에 bootrec /rebuildbcd 라고 해 보세요. 그리고 재부팅 해 보세요.

답변 감사합니다. 해봤습니다만 안됩니다. 어쩔 수 없이 일단은 그냥 사용하고, marathon infinity를 깨면 우분투를 재설치하기로 했습니다. 이번 기회로 UEFI 부팅과 리눅스 부팅을 확실히 이해하기로 다짐했습니다. 다시한번 답변 감사합니다.

UEFI mode로 부팅시에는 Firmware의 NVRAM에 등록된 boot loader 정보를 읽어 옵니다.
만약에 NVRAM에 boot loader 정보가 없다면, 기본적으로 ESP(EFI System Partition)의 EFI/Boot/bootx64.efi 파일을 기본 boot loader로 이용합니다. NVRAM에 여러개의 boot loader가 등록되어 있으면 선택 메뉴가 부팅시에 나올겁니다.

리눅스에서는 efibootmgr 명령으로 boot loader 정보를 관리할 수 있습니다.
먼저, 현재 등록된 정보를 아래와 같이 확인합니다.

sudo efibootmgr -v

아래와 같이 USB의 boot loader 정보를 생성하면 해당 USB(Super-Grub USB와 같은…)로 부팅할 수 있습니다.

sudo efibootmgr -c -d /dev/sdb -p 1 -l \EFI\usb_grub\grubx64.efi -L usb_grub

아마 boot-repair란 놈이 Vista의 boot loader 파일을 bk*-어쩌쿠로 바꿨을 겁니다.
즉, 기본 boot loader가 Vista 였는데 grub-efi(또는 shim-efi)로 대체했을 겁니다.

저도 EFI 공부한지 오래돼서 기억이 가물가물합니다. 구체적인 해결책보다는 가이드를 드리는 선에서 마무리하겠습니다.

  • 현재 Ubuntu가 정상 동작한다면 우선, VISTA boot loader 정보를 ESP(EFI/Microsoft/Boot ???)에 복원해야 합니다.

    sudo mount /dev/sda1 /mnt

  • 그 후, update-grub 만으로 문제가 해결 될 수도 있고, 아니면,
  • 위의 USB boot loader 등록하듯이 NVRAM Vista의 boot loader를 등록해 주어야 합니다.

예전에도 Grub으로 Dual booting이 안됐었다고 하니까 어쩌면 Windows가 설치된 디스크 또는 파티션을 찾지 못하고 있는 것일 수도 있겠어요.
디스크가 여러 개인 경우에는 ESP가 디스크 별로 여러 개 있을 수도 있구요.

근데, 오류 메시지가… Grub 메뉴에서 ESP의 Windows Boot Manager가 구동되고 있었네요…
Grub script가 Windows를 자동으로 찾지 못할 수도 있다는데, 이 경우가 아닐 수도 있지만,
grub.cfg를 아래와 같이 수정해서 부팅해 보시길… ntldr /bootmgr은 BIOS 방식이라서…

Windows가 /dev/sda1을 ESP로 사용하고 있다고 가정하면 아래와 같이 ESP의 UUID를 알수 있습니다.

sudo blkid /dev/sda1

/dev/sda1: LABEL="EFI" UUID="[b:3u5gw1of]1234-5678[/b:3u5gw1of]" TYPE="vfat"

위에서 얻은 UUID 값을 이용하여 grub.cfg에 추가할 menu entry를 아래와 같이 만듭니다.

[code:3u5gw1of]menuentry "Microsoft Windows 7 UEFI-GPT" {
insmod part_gpt
insmod fat
insmod search_fs_uuid
insmod chain
search --fs-uuid --set=root 1234-5678
chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
}
[/code:3u5gw1of]
편집한 내용은 아래의 파일 맨 끝에 추가하는 것이 좋습니다.

sudo vi /etc/grub.d/40_custom

그리고 나서, update-grub 실행하면 새로운 /boot/grub/grub.cfg가 만들어 집니다.

sudo update-grub

참고로, ESP의 EFI/Microsoft/Boot 폴더에서 Windows boot manager 파일은 bootmgfw.efi 입니다.
그러니까 bk-어쩌쿠를 위의 파일명으로 되돌려 놓으시기 바랍니다.

재부팅 후, Grub이 여전히 Vista로 부팅하지 못하면 디스크/파티션 문제이거나 EFI firmware 문제일 수도 있습니다.
PC 제조사에 따라서 UEFI 구현 방식이 제각각이라고 하네요.

답변 감사합니다. 일단 어제와 지금까지 비스타와 우분투를 잡으려고 노력했습니다. 결과는 둘 다 부팅가능합니다. 저는 가르쳐주신 내용에서 글자만 바꾸었습니다.

비스타 USB로 부팅해서
C:> bcdedit /set {bootmgr} path \EFI\Microsoft\Boot\bootx64.efi
x:source> bootrec /rebuildbcd

이렇게 하니 비스타는 가능하지만 우분투는 안됩니다. 다시 boot-repair는 원점… 저는 우분투를 재설치했습니다. 그런데 13.04나 13.10은 아예 부팅이 안됩니다. dvd로 구워서 해봤지만 안됩니다. 처음부터 아예 설치미디어가 없는 것처럼… 아하! 모든 시스템에서 완벽하지 않다더니… 저는 2012년 04월에 출시한 12.04버전으로 재설치했습니다. 기존에는 12.04.03이었습니다. 설치가 되었습니다. 두근두근 업데이트도 했습니다. 그리고 재부팅은… 성공했습니다. 이 글은 우분투에서 작성하고 있습니다.

PC 제조사에 따라서 UEFI 구현 방식이 제각각이라고 하네요. —> 이 사실을 오늘에서야 알았습니다. 그동안 저를 위해 답변해주신 분들 감사합니다. 결국 무슨 일이 일어날 지 모르는 것이군요. 아! 어디까지 알아야 할까요?!

일단 " # sudo blkid /dev/sda1 " 확인해봐야 겠습니다. 혹시 grub으로 부팅할 수 있을 지 모르니…

제발! 14.04는 부팅 및 설치가 잘 되길 빕니다. 다시한번 답변해주신 분들 감사합니다.

고생끝에 성공하셔서 다행입니다.

[quote:1f3sfcmo]비스타 USB로 부팅해서
C:> bcdedit /set {bootmgr} path \EFI\Microsoft\Boot\bootx64.efi
x:source> bootrec /rebuildbcd
[/quote:1f3sfcmo]
위와 같이 해서 Vista가 정상 동작했으면 bootmgfw.efi 또는 BCD 파일에 문제가 있었을 수 있습니다.
다만, 위와 같이 bootx64.efi 파일 명을 사용하는 것은 문제는 없겠지만 바람직하지는 않습니다.

참고로, ESP(EFI System Partition)의 폴더 구조는 아래와 같이 기본 boot loader를 위한 /EFI/Boot 폴더와 Vendor 들이 제공하는 boot loader 폴더로 구성됩니다. Vendor 들이 제공하는 폴더 구조는 엿장수 맘대로 해도 됩니다. ESP는 VFAT file system 이므로 폴더나 파일 명의 대소문자 구분이 없습니다.

[code:1f3sfcmo]
/EFI — Boot : bootx64.efi => 기본 boot loader
--- Microsoft/Boot : bootmgfw.efi (BCD/boot.stl) => Windows boot manager — ubuntu : shimx64.efi 또는 grubx64.efi => Ubuntu Grub boot loader
`— APPLE
[/code:1f3sfcmo]
기본 boot loader인 /EFI/Boot/bootx64.efi의 정체는 Vendor들이 제공하는 boot loader 복사본입니다.
그니까, 예를 들어, Windows 8이 기본 설치된 PC는 bootx64.efi = bootmgfw.efi, Ubuntu만 설치할 경우엔 bootx64.efi = shimx64.efi(Secure Boot) 또는 bootx64.efi = grubx64.efi 가 됩니다.

또한, Windows의 bcdedit, 리눅스의 efibootmgr, Mac OSX의 bless는 모두 EFI firmware NVRAM의 boot loader 정보를 관리하는 명령어입니다. 사용법이 다를 뿐, boot loader 정보를 생성/변경 또는 삭제하고, boot loader의 위치와 booting 순서 등을 변경할 수 있습니다.

다중 OS 설치 시에는 OS Vendor 들이 자신의 boot loader로 기본 boot loader를 덮어 버리고, 심지어 Booting 순서까지 바꿔 버리기 때문에 사용자들이 혼란을 겪을 수 밖에 없습니다.

아! 오랜만입니다.

bootmgfw.efi —> 이것으로 부팅해보려고 시도해봤습니다. 그러나 저의 시스템에서는 오로지 'bootx64.efi’만 됩니다. 그리고 마지막으로 제 시스템에서는 grub을 통한 윈도우부팅이 안됩니다. 지금까지 알아낸 방법을 전부 시도해봤지만 결과는 실패입니다. 분명히 이해한 상태에서 정확히 설정했지만 안됩니다. 하지만 이번을 통해 어느정도 부팅에 관련된 상황을 분명히 이해할 수 있었던 점에서 만족합니다. 무엇보다 윈도우와 우분투를 사용할 수 있게 되어서 다행입니다.

지금까지 답변해주신 분들 감사합니다.