UEFI vs BIOS and GPT vs MBR

이 글은 머신에서 사용하는 두 개의 다른 디자인(firmware 디자인과 partitioning 디자인)에 관한 이야기다.

후반부에는 FAI를 이용한 BIOS와 GPT partition 방법을 소개한다.

  • Firmware designs
    • UEFI: Unified Extensible Firmware Interface
    • BIOS: Basic Input Output System
  • Partitioning designs
    • GPT: GUID Partition Table
    • MBR: Master Boot Record

BIOS firmware and MBR partitioning are old and legacy designs.

UEFI firmware and GPT partitioning are new and latest designs.

위 기술들을 공부하자.

UEFI

UEFI는 EFI(Extensible Firmware Interface)의 계승자이다. 1990년대 중반 인텔은 IBM의 BIOS 방식의 firmware 인터페이스는 너무 제한적이라고 생각했다.

그래서 인텔은 1998년에 EFI spec.을 개발하기 시작했다. 2005년 인텔은 EFI 개발을 중단하고 소유권은 유지한 채 Unified EFI Forum에 개발해온 EFI를 넘긴다. 그래서 현재까지도 인텔은 EFI 라이선스를 가지고 있다. 그러나 UEFI Spec.은 Forum이 소유하고 있다.

UEFI가 BIOS보다 나은 점

  • 애플리케이션을 실행할 수 있는 강력한 pre-boot 환경
  • 모듈라 디자인
  • CPU 독립적인 아키텍처(Itanium, x86, x86-64, ARM Arch32, Arm Arch64)
  • BIOS 인터페이스 호환, 레거시 부팅 지원
  • Secure Boot 가능 (Windows용. 리눅스에서는 오히려 장애가 됨)

GPT가 MBR보다 나은 점

  • 2TiB 보다 더 큰 디스크 부팅 가능(MBR은 2TiB까지만 부팅 가능)
  • 부팅가능한 파티션의 수 제한
  • 8ZiB add(512B sectors), 64ZiB (4KiB sectors)
    • ZiB: Zebibyte, <- Exbibyte <- Pebibyte <-Tebibyte <- Gibibyte
    • ZB: Zettabyte, <- Exabyte <- Petabyte <-Terabyte <- Gigabyte
  • boot code와 partition table을 분리(MBR은 boot code가 boot sector에 존재)

GPT에서 사용하는 특별 파티션 ESP(EFI System Partition)가 있다. 이 파티션은 FAT32로 포맷되고 partition type code는 EF00이다. 이 파티션에는 .efi 확장자를 가진 bootloaders와 boot manager파일들이 있다. 부팅할 때 mainboard의 UEFI compliant firmware는 모든 디스크의 ESP파티션의 EFI파일들을 검색한다.

우리는 리눅스에서 다음과 같은 의문이 생긴다.

BIOS firmware로 부팅한 머신에서 GPT를 사용할 수 있는가?

UEFI만 지원하는 머신이 점점 나오고 있다.

BIOS만 지원하는 또는 UEFI/BIOS 모두 지원하지만 BIOS로 부팅하고 싶은데 머신이 2TiB가 넘는 디스크를 가지고 있으면 우리는 GPT를 사용할 수 밖에 없다.

  • UEFI machine + GPT partition: need an ESP partition(Code EF00)
  • BIOS machine + GPT partition: need a BIOS boot partition(Code EF02)
  • BIOS + MBR(BIOS-MBR) = OK
  • BIOS + GPT(BIOS-GPT) = OK
  • UEFI + GPT(UEFI-GPT) = OK
  • UEFI + MBR = NO

Layout of GPT partition

The beginning of a GPT partitioned disk

Protective MBR | 512B |
Primary GPT Header | 512B |
Primary Partition Table entries | up to 16KiB (max. of 128 partitions)|

17KiB가 사용된다.

The end of a GPT-partitioned disk

Secondary Partition Table entries | Up to 16KiB (max. of 128 partitions) |
Secondary GPT Header | 512B |

16.5KiB가 사용된다.

위 두 개의 unpartitioned space 사이에 GPT partition이 최대 128개까지 만들어 질 수 있다. 그 중 한 파티션(주로 첫번째 파티션)은 특별한 ESP 파티션이다. ESP 파티션은 FAT32로 포맷되어야 하고 esp와 boot 플래그 설정을 가지고 code는 EF02이다. FAT32 파티션의 최소 크기는 약 32MiB이다. ESP 파티션의 필요 크기는 가변적이나 100 ~ 200 MiB 사이로 할당하는 것을 권장한다.

가장 좋은 것은 BIOS든 UEFI든 GPT로 파티션된 디스크를 부팅할 수 있도록 하면 된다. 그럼 어떻게 그렇게 할 수 있을까?

BIOS boot partition와 EFI System Partition(ESP)모두 만들자.

  • 1MB BIOS boot partition (type EF02) grub는 여기에 core image를 저장.
  • 100MB EFI System Partition (type EF00). FAT32 포맷. EFI boot 이미지 저장
  • 나머지 공간에 원하는 대로 파티션

위와 같은 설정은 나중에 시험하고 지금은 BIOS boot partition을 생성하여 BIOS-GPT 조합을 FAI에서 사용하는 법을 설명한다.

FAI의 setup-storage대로 설정하려면 다음과 같이 하면 된다.

$ cat porch/porch/templates/dpt-kubeminion.j2
disk_config disk1 disklabel:gpt-bios bootable:1 fstabkey:uuid
primary swap   10G       swap  sw
primary /      30G      ext4  rw,noatime,errors=remount-ro
primary -      50G       -       -
primary /data  10G-     xfs     rw

disklabel에 gpt-bios로 지정하면 BIOS boot partition을 자동으로 만들어준다.

다음은 FAI로 설치 후에 본 disk partition 정보이다.

# parted /dev/sda print
Model: IBM ServeRAID M5210 (scsi)
Disk /dev/sda: 2398GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name     Flags
 5      1049kB  2097kB  1049kB                  primary  bios_grub
 1      2097kB  10.7GB  10.7GB  linux-swap(v1)  primary  boot
 2      10.7GB  43.0GB  32.2GB  ext4            primary
 3      43.0GB  96.6GB  53.7GB                  primary
 4      96.6GB  2398GB  2301GB  xfs             primary

다섯번째 파티션으로 bios_grub flag를 가진 약 1MiB 크기의 BIOS boot partition이 생성되었다.