레이블이 boot loader인 게시물을 표시합니다. 모든 게시물 표시
레이블이 boot loader인 게시물을 표시합니다. 모든 게시물 표시

2015/02/28

디스크 두개 사용시 Grub UEFI Booting 설정


두 개 이상의 물리적 디스크와 Multi-OS 환경

하드디스크 용량이 늘어나면서 HDD(Hard Disk Drive)가 하나인 PC들이 주가 되었었는데, SSD(Solid-State Drive)가 범용화 되면서 SSD와 HDD가 동시에 탑재된 PC 사용자들도 늘어나고 있다. 자연스럽게 디스크 성능과 용량이 증가하니까 Multi-OS를 사용하려는 시도가 생기기 마련이다. 대표적으로, UEFI 모드로 Windows 8+이 SSD에 설치된 PC를 구매했는데 우분투를 같이 설치해서 사용하고자 하는 시도가 있을 수 있겠다.

여기서는 SSD와 HDD이든, 또는 HDD가 두 개이든, 물리적으로 분리된 두개의 디스크를 장착한 최근의 UEFI 모드를 사용하는 PC 환경에서 다중 OS를 사용하기 위한 Grub 설정 방법에 대해서 정리한다.

UEFI 환경에서 우분투 설치시 고려할 점

Windows 8+가 첫번째 디스크에 설치되어 있다고 가정할 때 우분투를 두 번째 디스크에 설치하는 것은 그리 어려운 일이 아니다. 우분투 설치 iso를 USB에 굽던지 USB에 저장해서 일반적인 설치 과정을 따라가면 된다. 디스크만 두번째 디스크로 지정하면 된다.

다만, 파티션은 첫번째는 EFI System 파티션(ESP; 200~300MB), 그 다음은 우분투 OS root(/) 파티션(30~50GB), Swap 파티션(RAM과 동일 용량), 사용자 데이터(/home) 파티션(나머지 용량 - 용량이 클 경우 파티션을 몇개로 더 쪼개는 것도 괜찮음) 등의 최소한 4개의 파티션을 사용하는 것이 좋다.

UEFI 모드에서는 GPT 파티션을 사용하는데 기본적으로 128개까지 파티션을 사용할 수 있는 장점이 있기 때문에 파티션을 여러 개로 쪼개서 사용하는 것이 디스크 활용 측면에서 바람직할 수 있다.

여기서, 강조하고 싶은 점은 물리적으로 분리된 디스크 마다 첫번째 파티션은 ESP(EFI System Partition)로 설정해 두는 것이 좋겠다는 것이다. 사실은 ESP는 여러 OS가 공유해서 사용하는 파티션이기 때문에 디스크가 여러 개라고 하더라도 Boot Disk의 ESP 파티션 하나 만을 사용해도 된다. 다만, 디스크마다 ESP 파티션을 두라는 것은 혹시라도 디스크를 다른 PC에 장착할 가능성이 있고 파티션 용량도 얼마 안되기에 나중을 위해서 만들어 두라는 얘기다.

Boot Disk

예전의 IDE Controller 사용시에는 HDD를 두 개이상 사용하려면 Master/Slave 점퍼를 설정해야 했던 적도 있었다. SATA Controller로 넘어 오면서 부터 Master/Slave 구분은 의미가 없게 되었다. BIOS(또는 UEFI Firmware) 설정에서 Boot Disk로 설정한 디스크가 예전의 Master Disk에 해당된다.

가령, Windows가 SSD에 설치되어 있었고 나중에 우분투를 HDD에 설치했더라도 BIOS 설정에서 우분투 HDD로 먼저 부팅하도록 설정했다면 우분투 HDD가 Boot Disk가 된다. 즉, 리눅스에서는 부팅한 첫번째 디스크는 항상 /dev/sda가 되고 두번째 디스크는 /dev/sdb가 된다. Windows에서도 마찬가지로 부팅한 디스크/파티션이 C: 드라이브가 된다. 결국은 어떤 디스크로 부팅하느냐에 따라 디스크가 첫번째냐 두번째냐라는 것이 상대적으로 결정된다는 뜻이다.

Boot Partition

UEFI-GPT 방식에서는 Boot Disk의 ESP 파티션이 Boot Partition이다. 이와는 달리, BIOS-MBR 방식에서는 Boot Disk의 첫번째 sector가 MBR이 저장된 Boot Sector가 되고, 첫번째 파티션이 Boot Partiton이다(단, Linux의 Grub은 첫번째가 아닌 파티션을 Boot Partition으로 지정하여 사용할 수 있음).

참고로, 리눅스의 gparted로 GPT 파티션을 만들면 MBR과의 호환성을 유지하기 위해 디스크의 앞부분 몇 sector를 조금 남겨두고 첫번째 파티션을 만든다. Grub은 BIOS-GPT 방식으로도 동작하는데 Boot Sector 공간이 작기 때문에 이 경우에는 BIOS grub 파티션이라는 1MB 정도의 파티션을 별개로 만들어야 한다.

Windows UEFI Boot Partition

UEFI 모드로 설치된 Windows의 Boot Partition은 당연히 ESP를 사용하고 이 파티션은 나중에 설치한 우분투에서도 ESP로 사용할 수 있다. 그런데, Windows의 경우 GPT 파티션 구조가 여러가지 변형이 있을 수 있다.

즉, PC Vendor들이 제공하는 Recovery Partiton, Windows에서 자체 복구 목적으로 사용하는 Winows Reserved Partion, ESP 등의 3개 파티션이 Windows OS 파티션과는 별개로 존재할 수 있다. GPT 파티션에서 파티션들은 동등하고 GUID로 파티션 Type을 구분하기 때문에 ESP가 반드시 첫번째 파티션일 필요는 없다.

그렇지만, 나중에 Grub에서 Windows가 설치된 디스크의 ESP 파티션 정보를 사용할 것이기 때문에 ESP 파티션이 몇번째 파티션인지 조사해 보아야 한다. 우분투에서 Windows 디스크의 1~3번째 파티션 각각을 하나씩 마운트해서 폴더 구조를 살펴 보는게 가장 확실한 방법이다. 우분투로 부팅했으니 Windows 디스크는 /dev/sdb가 된다. parted를 사용하면 파티션 정보를 알 수 있다.

$ sudo parted /dev/sdb print
$ sudo mount /dev/sdb1 /mnt
$ ls  /mnt/EFI/Microsoft/Boot/bootmgfw.efi

위의 ls 명령 결과 botmgfw.efi 파일이 있으면 첫번째 파티션(/dev/sdb1)이 ESP이다.

Ubuntu UEFI Boot Partition

앞서 UEFI-GPT 방식에서는 물리적으로 분리된 디스크의 첫번째 파티션을 ESP로 만들어 두는 것이 좋다고 했고 우분투 설치시에 파티셔닝을 앞서 설명한 바와 같이 했다면 우분투가 사용하는 ESP는 Windows의 ESP와 다른 디스크의 파티션임을 이해할 것이다.

만약, BIOS 설정에서 Windows 디스크로 부팅하도록 설정했다면 Grub을 Windows의 ESP 파티션에 설치해야 한다. 하지만, 여기서는 우분투의 ESP에 Grub을 설치했기 때문에 BIOS 설정에서 우분투 디스크로 부팅하도록 해야 한다.

이제, 우분투 디스크의 ESP 파티션에 설치된 Grub을 이용해서 물리적으로 분리된 Windows 디스크의 Windows boot manager를 구동할 수 있도록 Grub boot menuentry를 만들 것이다. Grub에서 우분투 부팅 설정은 우분투 설치시에 자동으로 등록되기에 신경쓸 필요도 없다.

Grub Windows UEFI Boot Menu

앞서 Winodws의 ESP 파티션 위치를 bootmgfw.efi 파일 위치로 알아낼 수 있다고 했다. 아래 두개의 명령으로 Grub 메뉴엔트리에 사용할 <hints_string>과 <fs_uuid> 정보를 얻는다.

$ sudo grub-probe --target=hints_string /mnt/EFI/Microsoft/Boot/bootmgfw.efi
--hint-bios=hd1,gpt1 --hint-efi=hd1,gpt1 --hint-baremetal=ahci1,gpt1
$ sudo grub-probe --target=fs_uuid /mnt/EFI/Microsoft/Boot/bootmgfw.efi
ffff-ffff
이들 두 명령 결과 값들은 Grub 메뉴엔트리에서 아래와 같이 사용된다.
search --fs-uuid --set=root <hints_string> <fs_uuid>
즉, 위의 결과 값들을 사용하여 아래와 같이 Grub menuentry를 만든다.
menuentry "Microsoft Windows Vista/7/8+ UEFI-GPT" {
  insmod part_gpt
  insmod fat
  insmod search_fs_uuid
  insmod chain
  search --fs-uuid --set=root --hint-bios=hd1,gpt1 --hint-efi=hd1,gpt1 --hint-baremetal=ahci1,gpt1 ffff-ffff
  drivemap -s hd0 hd1
  chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
}
위에서 drivemap은 Windows가 반드시 물리적으로 첫번째 디스크여야만 부팅할 수 있는데 두번째 디스크로 인식하여 부팅할 수 없는 경우에만 사용한다. drivemap을 사용하지 않아도 되는 경우라면 굳이 사용할 필요는 없다.

위의 Grub 메뉴엔트리는 아래와 같이 편집기를 사용하여 /etc/grub.d/40_custom 파일 맨 끝에 삽입하면 된다.

$ sudo nano /etc/grub.d/40_custom

$ sudo update-grub
$ sudo reboot

재 부팅 후 위에 새로 만든 Windows Grub 메뉴를 선택해서 부팅이 잘 되는지 확인해 본다.

UEFI 환경에서 Grub을 이용한 다중 디스크의 Multi-OS Booting

UEFI 환경에서 디스크가 두개 이상인 경우 디스크 별로 서로 다른 OS를 설치해서 사용하면 관리 측면에서 편리하다. 이 경우, 각 디스크 별로 ESP 파티션을 따로 만들어 두는 게 좋고, Grub을 사용할 경우 chainloader를 이용하여 다양한 조합의 부팅 설정이 가능하다. 각각의 ESP 마다 Grub을 설치해서 Grub 자체를 Chainloading 할 수도 있다.

이 글은 두 번째 디스크의 Windows boot manager를 Grub에서 Chainloading 하는 방법에 대해 예를 들었다.

참고 사이트

https://wiki.archlinux.org/index.php/GRUB

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 명령이 제대로 동작하기 위해서 반드시 필요하다.

Ubuntu efibootmgr 활용


UEFI 모드로 설치된 Multi-OS 환경에서는 UEFI Booting을 지원하는 boot loader 들을 적절히 관리할 필요가 있다. 새로운 boot loader를 등록하거나 불필요한 boot loader를 삭제할 필요도 있고, boot loader 파일이 변경될 경우 NVRAM에 등록된 boot loader 정보를 갱신해 주어야 한다. 또, boot loader 간의 부팅 순서를 변경할 필요도 있다.

우분투를 포함한 Linux 환경에서 UEFI boot loader 정보를 관리하기 위한 도구가 efibootmgr이다. Windows에서는 bcdedit, Mac OS X에서는 bless를 사용할 수 있다. 여기서는 efibootmgr의 활용 방법에 대해 알아 본다. efibootmgr은 UEFI를 지원하는 PC 뿐만 아니라, EFI 환경의 Apple Mac PC에서도 사용할 수 있다.

부팅 정보를 직접 건드리기 때문에 부팅이 안되는 경우가 발생할 수 있으니 주의해서 사용해야 한다.

NVRAM에 등록된 boot loader 정보 확인

$ sudo efibootmgr -v
BootCurrent: 0001
Timeout: 5 seconds
BootOrder: 0080
Boot0000* Windows Boot Manager    ......
Boot0001* Ubuntu    ......
Boot0080* Mac OS X    ......
BootFFFF*     ACPI...... 

Grub2 boot loader 제거

위의 Ubuntu entry를 제거하려면 아래와 같이 하면 된다.

$ sudo efibootmgr -b 0001 -B

제거 됐는지 확인해 보면 아래와 같이 Boot0001* Ubuntu entry가 제거됐음을 알 수 있다.

$ sudo efibootmgr -v
BootCurrent: 0001
Timeout: 5 seconds
BootOrder: 0080
Boot0000* Windows Boot Manager    ......
Boot0080* Mac OS X    ......
BootFFFF*     ACPI......
제거 후에는 Ubuntu로 부팅할 수 없다.

Grub2 boot loader 신규 등록

다시 Ubuntu entry를 아래와 같이 추가하면 된다.

$ sudo efibootmgr -c -d /dev/sda -p 1 -l \\EFI\\ubuntu\\shimx64.efi -L "Ubuntu"

여기서 /dev/sda1이 ESP 파티션이다. 참고로, BIOS 메뉴에서 Secure Boot를 사용하지 않는 경우에는 shimx64.efi 대신 grubx64.efi를 사용해도 된다.

부팅 순서 변경

위에서 BootOrder: 0080으로 되어 있는데 Boot0080은 Mac OS X임을 알 수 있다. 즉, 기본적으로 Mac OS X로 부팅한다는 뜻이다. 앞서 Apple Mac에서 EFI Multi-OS Booting 방법을 따른다면 Mac 부팅시 Option 키를 누르지 않으면 Mac OS X로 부팅한다는 의미이다.

이제 아래와 같이 함으로써 부팅 순서를 Ubutu, Mac OS X, Windows 순으로 바꿀 수 있다. 부팅 순서를 바꾼다는 의미는 Ubuntu로 부팅할 수 없으면 Mac OS X, 그 마저 실패하면 Windows로 부팅한다는 뜻이다.

$ sudo efibootmgr -o 0001,0080,0000

아래와 같이 BootOrder가 변경됐음을 확인할 수 있다.

$ sudo efibootmgr -v
BootCurrent: 0001
Timeout: 5 seconds
BootOrder: 0001,0080,0000
Boot0000* Windows Boot Manager    ......
Boot0001* Ubuntu    ......
Boot0080* Mac OS X    ......
BootFFFF*     ACPI......

Grub에 Mac OS X Boot Entry 추가

위에서 Ubuntu로 부팅하도록 순서를 바꿨으면 Grub에 Mac OS X 부트 메뉴를 추가해 주어야 한다. 기존의 Grub 메뉴에 OS X boot entry가 있으나 이는 Hackintosh 용인 듯 하다. 아래와 같이 /etc/grub.d/40_custom 파일에 아래 내용을 추가해서 저장한다.

$ sudo nano /etc/grub.d/40_custom
 menuentry "Apple Intel-Mac OSX" {
    # Search the root device for Mac OS X's loader.
    search --file --no-floppy --set=root /usr/standalone/i386/boot.efi
    # chainload the loader, pass parameters like -v directly
    chainloader (${root})/usr/standalone/i386/boot.efi #-v
}
$ sudo update-grub

update-grub 만으로도 Windows 메뉴 엔트리는 Grub에 자동으로 포함된다.

이제 Mac에서 부팅시에 Option 키를 누르지 않으면 Ubuntu Grub으로 부팅한다. Grub에서 부팅하려는 OS를 선택할 수 있다. 물론 Option 키를 눌러서도 부팅하려는 OS를 선택할 수 있다.

Apple Mac에서 EFI Multi-OS Booting



Apple Mac에서 EFI Multi-OS 설치 방법에서는 rEFInd를 사용해서 Triple-OS Booting하는 방법을 다루었는데 여기서는 rEFInd를 사용하지 않고 Mac 자체의 boot manager를 이용해서 Triple-OS booting 하는 방법에 대해 설명한다. 최종 목표는 Mac booting시 Option Key를 눌렀을 때 위의 사진과 같이 EFI 모드로 설치된 Triple-OS 부팅 선택 화면이 나오도록 하자는 것이다.

기본적인 개념은 UEFI Booting에서 다루었던 ESP 파티션의 fallback boot loader를 Windows boot loader로 대체함으로써 Windows 부트 메뉴가 보이도록 하고, Ubuntu 부트 메뉴 설정은 Mac에서 부트 메뉴가 보이도록 하는 방법을 따르는 것이다. 물론, Windows를 설치하지 않는 경우에는 fallback boot loader를 Grub boot loader로 대체하기만 하면 된다.

1. Mac OS X Boot Options

Mac OS X와 Recovery Mode 부트 메뉴는 별다른 설정이 필요하지는 않다. 다만, 나중에 모든 OS 별 Icon 이미지를 설정하는 방법에 대해서만 별도로 참고하면 된다.

2. Windows Boot Option

Mac OS X로 부팅한 후 터미널을 실행하여 다음과 같이 ESP 파티션을 마운트 한다.

$ sudo mkdir /mnt
$ sudo mount -t msdos /dev/disk0s1 /mnt

마운트 후 fallback boot loader를 Windows boot manager로 대체한다.

$ sudo cp /mnt/EFI/Microsoft/Boot/bootmgfw.efi /mnt/EFI/Boot/bootx64.efi

3. Ubuntu Boot Option

우분투의 경우에는 다소 복잡하다. 기본적으로 최소 10MB 크기의 추가적인 Apple hfs+ 파티션이 필요하다. 다행히 Apple Mac에서 EFI Multi-OS 설치 방법에서와 같이 추가적인 MacData 파티션을 만들어 두었다면 그것을 사용하는 것도 방법이다. Mac OS X의 터미널에서 아래의 과정을 따르면 된다. 여기서는 MacData 파티션의 Volume 명을 MDATA로 가정한다.

기본적으로 새로운 Mac 파티션에 커널 파일이 있어야 하고,

$ sudo touch /Volumes/MDATA/mach_kernel

우분투 boot loader를 지정해 주어야 한다. 아래에서 ESP 파티션의 hard link를 사용할 수 없는 이유는 파티션 간의 hard link가 불가능하기 때문이다.

$ sudo mkdir /mnt
$ sudo mount -t msdos /dev/disk0s1 /mnt

$ cd /Volumes/MDATA
$ sudo mkdir ./EFI
$ sudo cp -R /mnt/EFI/ubuntu ./EFI/
$ sudo mkdir -p ./System/Library/CoreServices
$ sudo ln /Volumes/MDATA/EFI/ubuntu/grubx64.efi /Volumes/MDATA/System/Library/CoreServices/boot.efi

마지막으로, /Volumes/MDATA/System/Library/CoreServices/SystemVersion.plist 파일을 생성하여 아래의 내용을 추가해야 한다.
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
        <key>ProductBuildVersion</key>
        <string></string>
        <key>ProductName</key>
        <string>Linux</string>
        <key>ProductVersion</key>
        <string>Ubuntu</string>
</dict>
</plist>

4. Boot Options 메뉴에 OS 별 Icon 이미지 보이기

이제 Icon 이미지를 바꿔 주는 것이 좋다. 부트 메뉴의 Icon 이미지를 바꾸려면 ESP 파티션을 포함한 각 boot loader 가 탑재된 파티션에 해당 OS의 Icon 이미지를 /.VolumeIcon.icns 파일로 복사해 주면 된다. rEFInd 패키지에는 OS 별 아이콘 이미지 파일 들이 들어 있으므로 그것들을 활용하면 된다.

5. Mac Booting 후 Option Key Test

최종적으로, 기존에 설치된 rEFInd 패키지를 제거한다.

$ sudo rm -rf /EFI/refind

제거한 후, Mac을 재부팅하여 Option 키를 눌렀을 때 위의 사진과 같은 OS 선택 메뉴가 나오는지, 또 해당 OS로 제대로 부팅하는 지 확인해 본다.

기타 참고 사항

Mac에서 bless를 이용하여 Grub boot loader로 부팅하도록 할 수 있는데 아래와 같이 하면 된다.

$ sudo bless --folder=/Volumes/MDATA --file=/Volumes/MDATA/EFI/ubuntu/grubx64.efi --setBoot


참고 사이트

http://glandium.org/blog/?p=2830
https://help.ubuntu.com/community/UEFIBooting

2014/08/25

UEFI Booting


최근 수년 내의 PC 들은 하드웨어적으로 UEFI를 기본적으로 지원하고 있었지만 UEFI 모드로 OS를 설치하는 사용자는 그리 많지 않았다. 물론, Mac OS X에서는 인텔 맥에 EFI를 채택한지 오래고, Windows는 Vista 이후 64-bit에서 UEFI를 지원하기 시작했으며, 우분투의 경우엔 12.04.2 버전 이후 64-bit에 대해 UEFI를 지원하기 시작했다. 2012년 10월 말 Windows 8 출시 이후, 이를 탑재한 PC 들이 보급되면서 UEFI로 부팅하는 PC가 본격적으로 늘어나고 있다. 그 전의 PC들은 Windows가 BIOS 모드로 탑재됐던데 반해 최신 Windows PC들은 UEFI가 기본이 됐기 때문이다.

여기서는 UEFI 환경에서 Multi-OS를 설치하기 위해 알아 두어야 할 몇가지 기본 사항에 대해 다룬다. 물론, 단일 OS 사용자라 해도 UEFI는 BIOS 방식을 대체할 수 밖에 없기 때문에 UEFI booting 방식에 대해 알 필요가 있다.

UEFI 방식의 장점

BIOS 방식과 비교해서 UEFI 방식을 사용함으로써 사용자가 실제로 느낄 수 있는 장점은 별로 많지 않을 수 있다.

부팅 속도가 빠르긴 하지만 대단한 차이는 아니고,  2TB 이상의 대용량 디스크를 사용할 수 있지만 일반 PC 사용자들에게 보편화 된 것은 아니다. 물론 추세적으로 몇 년 내에는 분명히 장점이 될 전망이다. 현 시점에서 가장 내세울 수 있는 장점은 주 파티션(Primary Partition) 수이다. BIOS 방식에서 사용하는 MBR 파티션은 최대 4개의 주 파티션 만을 허용하므로 OS를 여러 개 설치하려면 1개의 주 파티션을 이용한 확장 파티션을 사용해야 한다. 확장 파티션은 데이터의 안전성에 취약하다. 이에 반해 UEFI 방식에서는 GPT 파티션을 사용하는데 기본적으로 128개의 주 파티션을 만들 수 있다. 즉, Multi-OS 환경에서는 UEFI 방식이 장점이 될 수 있다.

UEFI 환경의 Boot Process

UEFI Firmware가 하드웨어를 초기화하고 나서 NVRAM에 등록된 boot manager 정보를 읽어 boot entry에 정의된 UEFI application을 실행한다. 이 application은 UEFI shell이 될 수도 있고 OS 별 boot manager/loader도 될 수 있다. boot manager는 또 다른 boot loader를 호출 할 수도 있고 최종 boot loader가 OS의 kernel을 호출함으로써 OS가 기동된다. 이 boot manager/loader 들은 OS 설치시 EFI System Partition에 설치된다.

EFI System Partiton(ESP)

UEFI firmware가 UEFI boot loader를 실행하기 위한 파티션을 EFI System Partition(ESP)이라고 한다. 즉, OS와는 독립적인 부트 파티션이라고 이해하면 된다. OS를 최초로 설치하면 여기에 UEFI shell이나 boot manager 또는 boot loader를 탑재한다. Multi-OS 환경에서는 OS 설치시 각각의 OS들이 자신들이 제공하는 boot loader를 ESP에 설치한다. ESP 파티션은 FAT 12/16/32 파일시스템을 사용해야 하고, Linux 환경에서는 gparted에서 boot flag를 설정해 주어야 한다. Microsoft에서는 파티션 최소 Size로 260MB를 권장하고 있다. 필수 사항은 아니지만, GPT 파티션을 최초 구성할 때 첫번째 파티션을 ESP로 잡아주는 것이 좋다. GPT 파티션들은 동등하지만 ESP 파티션은 PC가 부팅하기 위해서 반드시 필요한 파티션이다.

그런데, NVRAM의 boot entry의 정보가 깨졌거나 정보가 없을 때 UEFI 모드로 부팅을 할 수 있도록 하기 위해 기본 부트로더(Fallback boot loader)를 사용한다. 기본 부트로더는 ESP 파티션의 /EFI/Boot/bootx64.efi 파일이다.  ESP 파티션은 FAT 파일시스템을 사용하므로 대소문자 구분이 없고, 경로 명도 Windows 경로 방식을 사용하기도 한다. 즉, 기본 부트로더를 \efi\boot\BootX64.efi 라고 해도 이상할 것이 없다.

EFI System Partition 폴더 구조

아래에 Triple-OS 환경의 ESP 파티션 폴더 구조를 참고할 필요가 있다. 기본 부트로더인 /EFI/Boot/bootx64.efi 파일을 제외하면 OS 벤더별로 자신 만의 폴더 구조를 유지하고 있음을 알 수 있다. 기본 부트로더는 대체로 OS 설치 시 자신의 boot loader를 복사하는데 Mac의 경우엔 기본 부트로더가 없다. 이 경우엔 사용자가 grub2나 rEFInd와 같은 boot loader 파일을 복사해 주는 것이 좋다.

/-- EFI/
    |-- APPLE/
    |   `-- EXTENSIONS/
    |       `-- Firmware.scap
    |-- Boot/
    |   `-- bootx64.efi       : Fallback boot loader
    |-- Microsoft
    |   `-- Boot
    |       |-- BCD
    |       |-- BCD.LOG
    |       |-- BOOTSTAT.DAT
    |       |-- Fonts/
    |       |-- Resources/
    |       |-- boot.stl
    |       |-- bootmgfw.efi  : Windows boot manager
    |       |-- bootmgr.efi
    |       `-- memtest.efi
    `-- ubuntu/
        |-- MokManager.efi    : Machine owner's key manager
        |-- grub.cfg          : redirect to grub-efi installed partition/folder
        |-- grubx64.efi       : Grub2 boot loader with secure boot disabled
        `-- shimx64.efi       : Grub2 boot loader with secure boot enabled

참고 사항

최근의 PC 들은 UEFI Firmware를 대체로 내장하고 있으나 제조사 별로 UEFI 표준을 정확히 따르지는 않고 있음에 유의할 필요가 있다. Apple Mac의 경우에도 자체 EFI 방식을 사용하고 있다.

또한, UEFI 규격에는 CSM(Compatibilty Support Module)이 있어서 Legacy BIOS emulation을 지원하므로 사용자들은 자신의 PC가 UEFI 모드로 부팅되고 있는지 BIOS 모드로 부팅되고 있는지 모를 수도 있다. Firmware에 설정된 방식으로 부팅하므로 OS 설치시에는 반드시 현재 설정된 모드로만 설치가 가능하다는 점에 유의해야 한다.

부팅시에 BIOS Setup UI를 사용한다는 것은 더이상 정확한 표현은 아니지만 의사 소통을 위해 관행에 따라야 할 것이다. Apple Mac의 경우에는 BIOS Setup UI가 없이 파티션 정보를 가지고 EFI 모드로 부팅하거나 CSM(BIOS) 모드로 부팅할 수 있다.


참고 사이트

https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface
http://www.rodsbooks.com