MBR vs GPT
MBR vs GPT
1. 개요
Firmware Interface의 종류로는 2가지가 있는데 BIOS(Basic Input Output System)와 UEFI(Unified Extensible Firmware Interface)이다. BIOS는 레거시 BIOS로 불리는 것으로 이전 컴퓨터부터 제공하던 펌웨어 인터페이스이고 UEFI는 비교적 최근에 나온 인터페이스이다. BIOS 설정화면의 경우 마우스 사용을 지원하지 않지만, UEFI의 경우 설정화면에서 마우스를 지원하거나 그외 여러 차이가 있지만 가장 큰 차이로는 파티션 타입의 지원차이인데 BIOS는 MBR(Master Boot Record), 그리고 UEFI의 경우 GPT(GUID Partition Table)를 사용하는게 일반적이다.
이러한 MBR과 GPT의 차이는 여러가지가 있지만 가장 큰 것은 지원하는 스토리지의 차이인데 MBR은 최대 2TB까지만 사용할 수 있는가하면, GPT는 8ZB까지 지원이 되는 방식이다. 말하자면 4TB짜리 하드를 끼운다고 해도 MBR 구조라면 2TB까지만 사용할 수 있다는 소리다.
2. MBR
이 MBR의 구조는 아래와 같다.
- 446Bytes Bootcode
- 64Bytes 파티션 엔트리
- 시그니쳐 2Bytes (0x55AA)
BootCode에서 파티션 엔트리를 확인하여 어디에 os가 있는지 확인하여 OS를 부팅하고 코드를 불러오는식인데 한 디스크에서 최대 4개의 운영체제를 깔 수 있다. 왜냐하면 이 파티션 엔트리는 16Bytes x 4의 구조로 되어있는데 16Bytes 한 개당 한 개의 파티션을 의미하기 때문이다. 이 16Bytes의 값에는 여러가지 세부 값이 있는데 아래와같다.
- Boot Flag(1Byte)
- 0x80이면 부팅가능, 0x00이면 부팅 불가이다.
- Starting CHS Address(3Bytes)
- 주소 지정방식이 CHS일 경우 파티션의 시작위치를 담고 있다. CHS 주소란 실린더, 헤더, 섹터를 기준으로 작성된 주소이며 몇몇 임베디드 방식을 기기를 제외하고는 현재는 사용되지 않는다.
- Partition Type(1Byte)
- 파티션의 유형을 나타낸다. NTFS나 FAT같은 포맷을 말한다.
- Ending CHS Address(3Bytes)
- CHS 주소의 끝의 주소이다.
- Starting LBA Address(4Bytes)
- 주소 지정방식이 LBA 일 경우 파티션 시작 섹터 위치를 나타내는 것인데 96년도 이후에 출시된 HDD는 대부분 이 LBA 방식을 사용한다. 섹터를 일렬로 세워서 몇 번째인지를 나타내는 방식이다.
- Size in Sector(4Bytes)
- 파티션의 총 크기를 표기하는 것으로 섹터의 개수로 표현된다. 각 파티션의 최대 크기는 0xFFFFFFFF * 512 = 2,199,023,255,552 Bytes = 2TB가 된다.
이렇게 구조의 문제로 인해 파티션당 2TB의 크기 제한이 생긴것이다.
그 뒤의 2Bytes 값은 시그니쳐인데 0x55AA가 제대로 들어가 있지 않으면 MBR이 없는 것으로 인식하고 BIOS에서 에러를 반환하게 된다.
3. GPT
GPT 방식은 구조가 조금 더 복잡한데 그 구조는 아래와 같다.
- MBR 호환을 위한 Protective MBR 512Bytes
- GPT Header 512Bytes
- Entry 1~4 512Bytes
- 파티션 테이블 엔트리 5 ~ 128개의 파티션 31 * 512Bytes
- Patitions
- Entry 1~4 512Bytes backup
- 파티션 테이블 엔트리 5 ~ 128개의 파티션 31 * 512Bytes backup
- secondary GPT Header 512Bytes
기본적으로 GPT 방식이 데이터 손상에 대한 대응이 좀더 잘 되어있다. 위의 GPT구조에서 보면 6~8번까지가 2~4번까지와 동일한 것을 알 수 있는데 이는 헤당 헤더가 손상되어 읽을 수 없을 경우 뒤에 적혀있는 백업용 Header를 참조하여 사용할 수 있게 하기 위한 것이다.
1번의 Protective MBR의 경우 MBR에 대한 호환성을 유지하기 위함인데 MBR을 읽어들이는 유틸에서 잘못 판단하여 오류를 일으키지 않도록하기 위해 사용한다.
그 다음 섹터는 GPT Header인데 512Bytes만큼 할당 되어 있는 것 치고는 92Bytes 밖에 사용하지 않는다. 92 Bytes 값 이후에는 전부 0x00 값을 갖고 있다. GPT 헤더의 세부 값은 아래와 같다.
- Signature(8Bytes)
- EFI PART 라고 되어 있다.
- Revision(4Bytes)
- 00 00 01 00인데, 이는 버전 1을 의미한다
- Header size(4Bytes)
- GPT 헤더의 크기를 이야기하는 것이고, 92Bytes이므로 0x5C값이다.
- CRC32 of Header(4Bytes)
- 무결성 체크를 위한 CRC32 값으로 Header의 시작부터 끝나는 위치까지만 체크한다.
- Reserved(4Bytes)
- 사용하지 않는 부분
- LBA of GPT Header (8Bytes)
- 현재 LBA 주소를 나타내기에 0x01이다.
- LBA of Backup GPT Header (8Bytes)
- GPT Header 정보를 백업한 Sector의 위치이다.
- Starting LBA for Partitions(8Bytes)
- 파티션을 담을 수 있는 LBA 주소로 Primary Partition Table Last LBA+1 값이다.
- Ending LBA for Partitions(8Bytes)
- 파티션을 담을 수 있는 LBA 끝 주소로 Secondary Partition Table First LBA-1 값이다.
- Disk GUID(16Bytes)
- Unix의 UUID와 동일하다.
- Partition Table Entry Starting LBA(8Bytes)
- Partition Table Entry의 시작 LBA 주소
- Number of Partition Entries(4Bytes)
- 지원하는 Partition Entry의 개수로 128개를 뜻하는 0x80이다
- Size of Partition Table Entry(4Bytes)
- GPT Partition Entry의 크기로 128Bytes이다
- CRC32 of Partition Table(4Bytes)
- Partition Table의 CRC32 값이다
- Reserved(420Bytes)
- 예약된 영역으로 사용하지 않는다.
GPT Partition Entry의 세부 내역은 아래와 같다.
- Partition Type GUID (16Bytes)
- 파티션 타입을 표현하는 정보를 기록하는 부분으로 각 시스템과 용도마다 고유한 값이 있다.이는 OS마다 다르고 파티션 타입에 따라 GUID가 다르다.
- Unique Partition GUID (16Bytes)
- 파티션마다 할당하는 고유한 값이다
- Frist LBA (8Bytes)
- 해당 파티션의 첫번째 LBA 위치이다. 리틀 엔디안으로 기재되어있다.
- Last LBA (8Bytes)
- 해당 파티션의 마지막 LBA 위치이다. 리틀 엔디안으로 기재되어있다. 일반적으로 홀수이다.
- Attribute Flags (8Bytes)
- 속성 플래그이며 이 속성 플래그는 고유한 값이 있다. 그 고유한 값들은 아래와 같다.
일반적인 경우
0 : System Partition
1 : EFI Firmware
2 : Legacy BIOS bootable(구 바이오스 부팅 방식)
3~47 : Reserved
48~63 : Individual Partition Type마이크로 소프트의 경우
60 : Read Only
61 : Shadow copy
62 : Hidden
63 : No Drive Letter구글 크롬OS의 경우
56: 성공적인 부팅 플래그
55~52: 남은 시도 횟수
51~48: 우선 순위(15 - 가장 높음, 1 - 가장 낮음, 0 - 부팅불가)
- Partition Name (72Bytes)
- 파티션 이름이며 UTF-16(LE)로 인코딩된 값으로 되어있다.
이후에는 파티션이 나열되고 뒤에서 34번째 LBA에 다시 Entry 값 4개로 시작되는 백업용 Secondary Header의 값이 나온다.
GPT 파티션 구조에 대해서 어떤 변조를 하고 싶다면 앞에 헤더값만 아니라 뒤의 헤더값도 건드려야하며 둘다 검증 패리티 값까지 다 바꿔줘야 제대로 변경이 가능하다.