2014/08/31

Ubuntu BIOS 및 UEFI Grub 복구


(2015/11/21 최종 수정)

최근에 OS X El Capitan이나 Windows 10 (Build 10586.11)으로 Upgrade를 해 보니 OS 별로 Upgrade 할 때마다 자체 복구 파티션을 OS 파티션 끝에 추가하면서 파티션 수가 자동으로 늘어나는 일이 자주 생긴다. 이러면 우분투 파티션 번호가 밀려 버려서 Grub으로 부팅이 안되고 grub rescue> 모드로 진입해 버린다. 물론, 복구 파티션이 추가되는 경우는 OS 파티션을 매우 넉넉하게 잡았을 경우에만 발생하므로 모든 사용자가 경험하게 되는 일은 아니다.

아무튼 grub rescue> 모드로 진입시에 Grub을 복구하는 방법을 추가한다. 우분투 설치 USB를 사용할 필요가 없으니 아래의 방법들을 사용하기 전에 먼저 사용해 볼만한 방법이다.

Grub rescue> 모드를 이용한 Grub 복구 방법

아래와 같이 grub rescue 모드에서 우분투의 boot 파티션을 알아 낼 수 있다.

grub rescue> ls
(hd0) (hd1) (hd1,gpt1) (hd1,gpt2) ......

grub rescue> ls (hd1,gpt10)/
/boot ......

위와 같이 /boot 폴더가 보이는 파티션이 리눅스 boot 파티션이다. 이제 아래와 같이 하면 Grub으로 부팅할 수 있다.

grub rescue> set prefix=(hd1,gpt10)/boot/grub
grub rescue> insmod normal
grub rescue> normal

이제 우분투 Grub으로 정상 부팅하게 된다. 우분투로 부팅 후, 첫번째 하드디스크에 우분투가 설치되어 있다는 가정하에 아래 두개의 명령으로 Grub이 복구된다.

$ sudo grub-install /dev/sda
$ sudo update-grub

위의 첫번째 명령은 UEFI 방식이든 BIOS 방식이든 Grub이 사용자들에게 일관된 명령을 사용하도록 유도하려는 목적인 듯하다. 실제로는 UEFI와 BIOS 모드의 grub은 서로 다른 패키지이고, 세부 명령 파라메터도 아래의 UEFI 모드에서의 grub-install 명령이 매우 복잡한 것에서 알 수 있듯이 명령 자체가 다르게 수행된다.

grub rescue> 모드로 진입하든 못하든, 일반적으로 우분투 Grub을 복구하는 방법은 여전히 아래의 글을 참고하면 된다.


(2015/8/1 수정)

우분투에서 Grub2 복구 방법에 대한 글들은 많지만 최근의 UEFI 환경을 반영하지 못해 사용자 들이 혼란을 겪는 경우가 많다. 우분투에서는 booting 문제에 대한 모든 것을 boot-repair로 해결하도록 유도하는 듯 하나 이것이 만병통치약은 아니다. boot-repair의 작업 내용은 다소 불투명하고 사용자가 옵션을 어떻게 주느냐에 따라서도 결과가 달라지기 때문이다.

이 글에서는 BIOS 모드와 UEFI 모드로 우분투가 설치된 경우에 대해 OS가 어떤 방식으로 설치됐는지 확인하고 각각의 경우 Grub을 어떻게 복구하는지 알아 본다. 기본적으로, 우분투로 부팅할 수 있어야 하므로 Ubuntu UEFI 모드 설치 USB 만들기 방법으로 만든 USB를 사용한다. 이 USB는 UEFI와 BIOS 방식으로 부팅해서 우분투 live 기능을 사용할 수 있기 때문이다.

참고로, 최근의 Windows 8+이 설치된 PC 들은 UEFI 모드로 OS가 설치됐을 가능성이 높고, 그 전의 PC들은 BIOS 모드로 OS가 설치됐을 가능성이 높다. Multi-OS 환경에서는 두 가지 방식을 혼용해서 사용하기가 어렵다. 즉, Windows가 UEFI 모드로 설치됐으면 우분투도 UEFI 모드로 설치된 것이라고 봐도 좋다. 하지만, 사용자 PC 설정에 따라서 Windows 8+도 BIOS 모드로 설치될 수 있다는 점을 간과해선 안된다.

Ubuntu에서 UEFI vs. BIOS 모드 확인 방법

사용자가 확실히 우분투를 어떤 방식으로 설치했는지 알고 있다면 이 과정은 건너 뛰어도 된다.

우분투 설치 USB로 부팅해서 우분투가 설치된 /boot 파티션을 아래와 같이 마운트 한다. 우분투 설치시 /boot 파티션을 따로 지정하지 않으면 우분투가 설치된 파티션(= root partition)에 /boot 폴더가 있다. 우분투가 설치된 파티션을 잘 모르면 아래의 명령으로 확인할 수 있다.

$ sudo parted /dev/sda print

여기서는 3번 파티션, 즉, /dev/sda3에 우분투가 설치됐다고 가정한다.

$ sudo mkdir /mnt
$ sudo mount /dev/sda3 /mnt

이제 우분투에 설치된 Grub이 BIOS Grub(grub-pc 패키지)인지 EFI Grub(grub-efi 패키지)인지 확인한다.

$ ls -CF /mnt/boot/grub

만약, 실행 결과 i386-pc/ 폴더가 보이면 BIOS 모드로 우분투가 설치된 것이고, x86_64-efi/ 폴더가 보이면 UEFI 모드로 설치된 것이다. 두 가지가 모두 있다면 문제가 있는 것인데 그럴 가능성은 거의 없다. 단, 위의 USB에는 두 폴더가 다 있다.

그런데, 여기서 현재 USB로 부팅한 방식이 UEFI인지 BIOS 방식인지도 점검해볼 필요가 있다. 즉, Double Check 하자는 것이다.

$ ls -CF /sys/firmware

만약, 위의 실행 결과 efi/ 폴더가 없으면 USB는 BIOS 모드로 부팅한 것이고 efi/ 폴더가 보이면 UEFI 모드로 부팅한 것이다.

UEFI PC인 경우 두 가지 점검 결과가 동일해야 한다. Apple Mac PC의 경우에는 반드시 일치하지 않을 수도 있으나 부팅을 어떤 방식으로 했는지 부팅 시에 알 수 있어서 큰 문제가 없다.

아무튼, 현재 점검하고자 하는 것은 디스크에 설치된 우분투가 어떤 방식으로 설치됐는가 하는 것이므로 이를 바탕으로 Grub 복구 방식이 달라짐에 유의해야 한다.

BIOS 모드로 설치된 Ubuntu Grub 복구 방법

USB가 BIOS 모드로 부팅됐음을 확인하고, /dev/sda3에 우분투가 설치됐다고 가정하여,

$ sudo umount /mnt
$ sudo mount /dev/sda3 /mnt

$ for i in /sys /proc /run /dev; do sudo mount --bind "$i" "/mnt$i"; done
$ sudo chroot /mnt
$ sudo grub-install /dev/sda
$ sudo update-grub

UEFI 모드로 설치된 Ubuntu Grub 복구 방법

아래 두가지 방법 중 하나를 선택하면 된다.

1. Windows로 부팅 후 복구 방법

Windows 설치 후 Grub 메뉴로 진입할 수 없다면 Windows로 재부팅한 후, 관리자 권한으로 아래의 명령을 실행해야 한다.

bcdedit /set {bootmgr} path \EFI\ubuntu\shimx64.efi

재부팅 후 Grub에서 우분투로 부팅하여 아래의 명령만으로 EFI Grub이 복구될 수 있다.

$ sudo update-grub

2. Ubuntu 설치 USB로 복구 방법

우분투 설치 iso 이미지로 USB를 만들어 UEFI 모드로 부팅하면 최근의 15.04 버전까지도 grub-efi 패키지가 메모리의 우분투(USB로 부팅하면 RAM에 설치된 우분투가 기동됨)에 설치되지 않는다. grub-pc 패키지만 설치된다. 다만, grub-efi 패키지는 탑재되어 있어서 하드디스크에 우분투를 설치하면 grub-efi 패키지도 설치된다.

따라서, UEFI 모드로 USB로 부팅하고 나서 grub-efi 패키지를 메모리에 설치해야 한다. 아래와 같이하면 혹시 grub-efi 패키지가 설치되어 있더라도 패키지를 재설치해 주니까 안전하게 설치할 수 있다. 또한, 메모리에만 설치하는 것이므로 USB로 새로 부팅후 grub을 복구할 때마다 매번 설치해야 한다. 네트워크이 연결되어 있다고 가정하여,

$ sudo apt-get install --reinstall grub-efi

UEFI 모드 USB로 부팅됐음을 확인하고, UEFI 모드에서는 /dev/sda1이 ESP 파티션이며, /dev/sda3에 우분투가 설치됐다고 가정하여,

$ sudo umount /mnt
$ sudo mount /dev/sda3 /mnt
$ sudo mount -t vfat /dev/sda1 /mnt/boot/efi

$ sudo modprobe dm-mod
$ sudo grub-install --target=x86_64-efi --efi-directory=/mnt/boot/efi --bootloader-id=ubuntu --boot-directory=/mnt/boot --recheck --debug

재부팅 후 Grub 메뉴에 Windows가 보이지 않는다면 우분투로 재 부팅후,

$ sudo update-grub

참고 사항

현재 기동된 우분투에 grub-efi 패키지가 설치되어 있는지는 아래와 같이 확인할 수 있다.

$ ls -CF /usr/lib/grub

실행 결과 x86_64-efi/ 폴더가 보이면 grub-efi 패키지가 설치되어 있는 것이다. 이는 우분투 설치 iso이미지로 만든 USB로 UEFI 모드로 부팅 후 메모리의 우분투에 grub-efi 패키지가 설치되어 있는지 확인하기 위해서 필요하다. 또한, grub-install 명령이 제대로 동작하기 위해서 반드시 필요하다.

댓글 10개:

  1. 죄송한데 도움이 필요해서요 ㅠㅠ

    사용하는 laptop은 acer es1-111m입니다. 아래의 펌글과 같은 증상으로 보시면 되구요... eMMC HDD를 사용하고 있습니다.

    다른 곳에는 우분투(15.04)가 잘 설치되는데 유독 이 장치에만 설치가 안됩니다.

    1. 기본적으로 UFEI 방식으로 부팅디스크 만들어서 부팅 후 설치는 잘 되는데...

    시스템 재부팅 이후 우분투로 부팅이 되지 않습니다.

    2. 우분투만을 클리어 설치해도 우분투가 부팅이 되지 않습니다.

    도저히 해결방법을 몰라 해답을 찾아보려고 해도 위의 질문의 답변처럼 일반적인 사항만 찾을 수 있습니다.

    3. 그런데 파티션을 나누다보니 다른 설치와 다른 파티션이 있습니다.

    USB로 부팅해서 gparted를 돌려보니 빨간색 느낌표에 (microsoft reserved partition) 이라고 잡혀있고 16MiB // flags --> msftres 라고 적혀있습니다.

    혹시 이 부분이 문제인건지 잘 모르겠네요...

    4. 이렇게 질문을 드린 이유는 다른 분들은 거의 대부분 부트 리페어만을 이야기 하시는데 그와 다른 접근방식도 알고 계시는 것 같아서 혹시 저와 같은 증상의 해결책이 무엇인지 여쭤보고자 질문을 드립니다.

    번거롭게 해서 죄송하지만 혹시 도움이 될만한 사항이 있으시면 답변 부탁드립니다.

    감사합니다.

    답글삭제


  2. 6

    down vote

    favorite





    I just bought the 11,6 inches Acer Aspire ES1-111M-C56A (Intel Celeron N2840, 2,1GHz, 2GB RAM, 32GB eMMC, Intel HD Graphics, Win 8.1 with Bing) and I'm facing different problems when trying to install Ubuntu. The Laptop comes with Windows 8.1 and I want to remove it completely.

    I disabled the secure boot and changed the boot mode from UEFI to Legacy. If I boot with the UEFI boot mode I go directly to the Windows login page.

    The Laptop has a 32GB harddisk and aprox. 14 or 16GB is used by the windows system. The partitions are:
    •100MB (EFI),
    •19GB NTFS (for the user)
    •10GB (recovery?)

    If I boot with a Debian LiveUSB (gnome and xfce) or netinst (text mode) the installer recognizes no hard disks (except the USB device I'm already using). If I boot with Xubuntu, the pointer keeps loading infinitely after I choose the language (i.e the first installation window).

    With the standard Ubuntu I get the following message right after choosing "Try Ubuntu" from the text mode menu screen:
    Kernel Panic - not syncing: VFS: unable to mount root fs on unknown-block (2,0)


    ...followed by other messages like:
    Call Trace:
    [ < fffffff...


    (If they are relevant, I will write them completely.)

    Both architectures (of all the mentioned distros) were tested: 32 und 64 bits. The laptop has no CD drive, the WiFi wont work out of the box (it's the Broadcom BCM43142) and at the moment I can't setup an Ethernet connection.

    I appreciate any comments/suggestions.

    답글삭제
  3. To run a command as administrator (user "root"), use "sudo ".
    See "man sudo_root" for details.

    ubuntu@ubuntu:~$ sudo grub-install --reinstall grub-efi
    grub-install: unrecognized option '--reinstall'
    Try 'grub-install --help' or 'grub-install --usage' for more information.
    ubuntu@ubuntu:~$ sudo grub-instll grub-efi
    sudo: grub-instll: command not found
    ubuntu@ubuntu:~$ sudo update-grub
    /usr/sbin/grub-probe: error: failed to get canonical path of `/cow'.
    ubuntu@ubuntu:~$ sudo parted /dev/mmcblk0p5 print
    Model: Unknown (unknown)
    Disk /dev/mmcblk0p5: 8746MB
    Sector size (logical/physical): 512B/512B
    Partition Table: loop
    Disk Flags:

    Number Start End Size File system Flags
    1 0.00B 8746MB 8746MB ext4

    ubuntu@ubuntu:~$ sudo dev/mmcblk0p2 print
    sudo: dev/mmcblk0p2: command not found
    ubuntu@ubuntu:~$ sudo parted /dev/mmcblk02 print
    Error: Could not stat device /dev/mmcblk02 - No such file or directory.
    Retry/Cancel? c
    ubuntu@ubuntu:~$ sudo parted /dev/mmcblk01 print
    Error: Could not stat device /dev/mmcblk01 - No such file or directory.
    Retry/Cancel? c
    ubuntu@ubuntu:~$ sudo parted /dev/mmcblk03 print
    Error: Could not stat device /dev/mmcblk03 - No such file or directory.
    Retry/Cancel? c
    ubuntu@ubuntu:~$ sudo mkdir/mnt
    sudo: mkdir/mnt: command not found
    ubuntu@ubuntu:~$ sudo mkdir /mnt
    mkdir: cannot create directory ‘/mnt’: File exists
    ubuntu@ubuntu:~$ sudo mount /dev/mmcblk0p5 /mnt
    ubuntu@ubuntu:~$ ls-CF /mnt/boot/grub
    ls-CF: command not found
    ubuntu@ubuntu:~$ ls -CF /mnt/boot/grub
    fonts/ grub.cfg grubenv locale/ unicode.pf2 x86_64-efi/
    ubuntu@ubuntu:~$ ls -CF /sys/firmware
    acpi/ efi/ memmap/
    ubuntu@ubuntu:~$ sudo updte-grub
    sudo: updte-grub: command not found
    ubuntu@ubuntu:~$ sudo update-grub2
    /usr/sbin/grub-probe: error: failed to get canonical path of `/cow'.
    ubuntu@ubuntu:~$ sudo unmount /mnt
    sudo: unmount: command not found
    ubuntu@ubuntu:~$ sudo umount /mnt
    ubuntu@ubuntu:~$ sudo mount /dev/mmcblk0p5 /mnt
    ubuntu@ubuntu:~$ sudo mount -t vfat /dev/mmcblk0p2 /mnt/boot/efi
    ubuntu@ubuntu:~$ sudo modprobe dm-mod
    ubuntu@ubuntu:~$ sudo grub-install --target=x86_64-efi --efi-directory=/mnt/boot/efi --bootloader-id=ubuntu --boot-directory=/mnt/boot --recheck --debug
    grub-install: error: /usr/lib/grub/x86_64-efi/modinfo.sh doesn't exist. Please specify --target or --directory.
    ubuntu@ubuntu:~$ ls CF /usr/lib/grub
    ls: cannot access CF: No such file or directory
    /usr/lib/grub:
    grub-mkconfig_lib i386-pc
    ubuntu@ubuntu:~$

    답글삭제
  4. 위에서 알려주신대로 확인을 했는데 이상하게 마지막에 에러가 뜨고
    현재 기동한 우분투는 i386으로 기동되었다고 확인되네요...

    그런데 위에서 말씀하신대로

    ls -CF ... grub와 ls -CF /sys/firmware 는 모두 말씀하신대로 efi 폴더가 보입니다.

    위에 실행값을 드레그해서 넣었습니다.

    정말 죄송하지만 혹시 이 해결책은 없을까요?

    답글삭제
  5. 오류를 보니 제 글이 잘못된 부분이 있었네요. 수정했습니다마, grub-efi 패키지는 아래와 같이 설치하시길...
    $ sudo apt-get install --reinstall grub-efi

    그리고, 아래 명령 결과도 올려 주시길...
    $ sudo parted /dev/sda print

    답글삭제
  6. /sys/firmware 폴더에 efi/ 폴더가 있으니 USB는 UEFI 모드로 부팅한 것이겠죠. "no bootable device"라는 오류가 부팅시 생기나요?

    혹시나 해서 구글링 해보니 acer es1-111m 모델은 UEFI로 부팅시에 UEFI-BIOS에서 부팅파일을 지정해 주는 옵션이 있군요. 아래 동영상 5분 정도 이후에 화면으로 자세히 보시길... 아마 기본 EFI 폴더 내지는 Windows EFI 폴더만 찾아서 부팅하나 봅니다. 수동으로 우분투 폴더의 shimx64.efi 파일로 부팅하도록 설정해 보시길...
    https://www.youtube.com/watch?v=iD3JtoSbfOo

    그리고, Microsoft Reserved Partition은 Windows를 지웠다면 지워도 되는 파티션이고 부팅안되는 거랑은 상관없구요.

    답글삭제
  7. 아 바이오스에서 나름 해답을 찾았습니다.

    일단 F12를 통해서 우분투 부팅이 가능하지만...

    http://blog.naver.com/ftw9907/220484903008

    위의 방식대로 해도 F12를 누르고 선택하지 않으면 우분투로 부팅을 할수 없네요 ㅠㅠ

    그래도 많은 도움이 되었습니다.

    혹시 그 이상의 방법을 알고계시다면 꼭 답글 부탁드립니다.

    감사합니다. 꾸벅

    답글삭제
  8. 답글의 네이버 블로그 보니 동영상 방법과 동일하군요. 블로그에 설명이 잘 되어 있어요. BIOS에서 우분투 부팅 옵션을 위로 올려서 부팅 순서를 바꿀 수 있는 것 같은데요. 우분투가 먼저 부팅하도록 하면 될 듯 한데요. 위의 블로그에 사진을 올려 놨던데요... 우분투로 부팅해서 efibootmgr 명령을 사용해서 부팅 순서를 바꿀 수도 있는데 acer에서 될지 안될지는 acer를 써본적이 없어서 저도 모릅니다.

    답글삭제
    답글
    1. 정말 감사합니다.
      BIOS에서 우분투 부팅 옵션을 위로 올려서 부팅 순서를 바꾸면 우분투와 윈도우 듀얼부팅이 가능합니다.^^*

      이제 리눅스 초보로 입문해서 많이 해매고 있는데 블로그 자료를 읽으면서 정말 많은 도움이 되고 있습니다.

      감사합니다.

      삭제
  9. 이문제로 고생하고 있었는데 감사합니다

    답글삭제