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

댓글 6개:

  1. 작성자님 이런 좋은 글을 올려주셔서 감사합니다

    답글삭제
  2. 잘 아시는 것 같아서 질문드려요.
    MBR로 디스크(ssd 1)에 윈도우 1개 설치했고 GPT로 설정하여 윈도우(ssd 2)를 설치했는데,
    제가 알기로는 그냥 부팅 순서만 바꾸면 1개 PC에서 2개의 OS 사용할 수 있는 걸로 아는데,
    아무리해도 MBR SSD와 GPT SSD를 완전히 독립해서 써야만 인식합니다.

    SSD 2개에 각각의 윈도우를 설치해서 부팅순서만 그때그때바꿔서 쓰려면, MBR, GPT 이걸 통일해줘야하나요?

    답글삭제
  3. 좀 늦었지만 참고하시기 바랍니다. Grub2는 UEFI와 BIOS 부팅 방식을 지원하지만 두 개의 다른 패키지입니다. 부팅 프로세스와 부팅 영역의 위치 및 Binary가 다릅니다. 그니까 MBR 파티션을 사용하려면 BIOS 용 Grub2를 사용하면 됩니다. BIOS용 Grub2도 GPT 파티션을 지원합니다. Grub2 chainloading을 사용하면 문제가 해결되지 않을까 추측합니다(님과 같은 식으로 사용해 본 적은 없으니까요).
    다만, BIOS 용 Grub2를 사용하려면 BIOS/UEFI Firmware Setup 설정에서 UEFI를 사용하지 않도록 설정하셔야 합니다. 그리고, 가능하다면 GPT 파티션으로 통일하고 UEFI 환경에서 사용하는 것이 추세에 맞지 않나 싶습니다. Windows 만으로는 MBR과 GPT 파티션을 동시에 인식하지 못할 겁니다.

    답글삭제
  4. 이해하기 쉽게 정리가 잘 되있는 글이네요..
    조언을 구하고 싶어서 글남깁니다.
    혹시 ssd에 windows10을 설치하고 hdd(dev/sdb)에 linux를 설치했는데
    부트로더를 grub가 아닌 window boot manager를 사용할 방법이 있을까요?

    답글삭제
    답글
    1. 별로 권장하고 싶진 않군요. 왜냐면 기본적으로 grub이 빠르고 잘못돼도 복구가 쉽기 때문이죠. grub에서 Windows가 먼저 부팅되도록 하고 grub 메뉴를 숨길 수도 있고...

      그래도 해 보시겠다면 잘 될지 모르지만, Windows 관리자 권한으로 CMD 또는 PowerShell 실행 후 아래와 같이 해 보시길...

      # bcdedit 사용법 도움말 참고
      C:\> bcdedit /?
      C:\> bcdedit /copy "{bootmgr}" /d "Ubuntu Secure Boot"
      항목을 {11111111-1111-1111-1111-111111111111}에 성공적으로 복사했습니다.

      # disk2의 EFI 파티션을 아래 명령과 같이 지정하는데, diskpart 실행해서 list volumes로 찾아 보시길..
      C:\> bcdedit /set "{11111111-1111-1111-1111-111111111111}" device partition=\Device\HarddiskVolume3
      C:\> bcdedit /set "{11111111-1111-1111-1111-111111111111}" path \EFI\ubuntu\shimx64.efi
      C:\> bcdedit /displayorder "{11111111-1111-1111-1111-111111111111} /addlast
      C:\> bcdedit /set "{bootmgr}" timeout 10

      # 뭔가 잘못됐을 때 다시 Windows로 부팅해서 원상 복구
      C:\> bcdedit /delete "{11111111-1111-1111-1111-111111111111}"

      삭제