BIOSとUEFI 、MBRとGPTについて

# BIOSとUEFIの違い

BIOS (Basic Input/Output System) と UEFI(Unified Extensible Firmware Interface) はともにマザーボード上のROMに格納されているプログラムで、PC起動時に最初に実行されハードウェアを初期化やブートローダーの起動を行います。

|  | BIOS | UEFI |
| --- | --- | --- |
| 保存場所 | マザーボード上のROM | マザーボード上のROM |
| パーティション方式 | MBR (Master BootRecord)<br>最大パーティション数: 4<br>最大ディスク要領: 2TiB| GPT(GUID Partition Table) <br>最大パーティション数: 128<br>最大ディスク要領: 9.4ZiB|
| UI | CUI | GUI |
| 起動速度 | 遅い | 早い |
| セキュアブート | 未サポート | サポート |
| ブートローダーの起動モード | 16ビットリアルモード | 32ビットまたは64ビットモード |

## BIOSの起動の流れ (GRUB)
https://www.pixelbeat.org/docs/disk/

1. **電源投入**  
コンピューターの電源が入ると、CPUはマザーボードのROM領域に格納されたのBIOSを実行し、ハードウェアの初期化(POST: Power-On Self Test)を行います。
2. **MBRの読み込み**
BIOSは、起動デバイスの最初のセクター（MBR）をメモリのアドレス0x7C00に読み込みます。
3. **ステージ1: MBRのブートストラップコードの実行**
MBR内のブートストラップコードが実行され、MBRギャップに格納されているステージ1.5のブートローダーを読み込みます。
※ 容量が512バイトに制限されるMBRには複雑なブートローダー全体を収められないため、通常いくつかのステージに分けてOSを起動します。
※ MBRギャップ(DOS互換領域)はMBRと最初のパーティション間の未使用領域(31KB)のこと
4. **ステージ1.5: ブートローダー(ステージ1.5)の実行**
ブートファイルシステムを解釈し、ブートパーティションの `/boot/grub/` に格納されたステージ2のブートローダーをメモリにロードします。
5. **ステージ2: ブートローダー(ステージ2)の実行**
カーネルをメモリに読み込み、制御をOSに移します。


## UEFIの起動の流れ (GRUB)

https://docs.oracle.com/cd/F61088_01/boot/boot-AboutUEFIBasedBooting.html


1. **電源投入**  
コンピューターの電源が入ると、CPUはマザーボードのROM領域に格納されたUEFIファームウェアを実行し、ハードウェアの初期化やPOST( Power-On Self Test)が行われます。
1. **ドライバのロードとデバイスの初期化**
 UEFIはストレージやネットワークインターフェースなどのハードウェアドライバをロードし、各デバイスを初期化します。
1. **ブートマネージャの実行**
UEFIブートマネージャはブートエントリを参照し、定義された起動順序に従って、EFIシステム・パーティション(ESP)内のブートローダー (`/EFI/BOOT/BOOTX64.EFI`) をメモリにロードします。  
※ `efibootmgr` コマンドでUEFIの起動エントリとその順序を確認できます。  
※ `.EFI` ファイルはUEFIファームウェアによって直接実行されるファイルで主にブートローダーとして機能します。  
※ `BOOTX64.EFI` は、amd64向けの標準的なUEFIブートローダーで、UEFIファームウェアが起動時に自動的に検出して実行します。  
1. **ブートローダーの起動**
ブートローダー (GRUB, Windows Boot Maagerなど)はカーネルをメモリにロードし、制御をOSに移します。


# ■ MBRとGPTの違い

BIOSではMBR形式、UEFIではGPT形式のパーティションが利用されるわけですが、その違いも整理しておきます。

| | MBR（マスターブートレコード） | GPT（GUIDパーティションテーブル）
| --- | --- | --- |
| 登場時期 | 1983年（古い規格） | 1990年代後半（UEFIの一部として登場） |
| 対応ディスク容量 | 最大2TBまで | 理論上9.4ZB（事実上無制限） |
| パーティション数 | 4 | 128 |
| ブート方式 | BIOS  | UEFI |


## MBR (マスターブートレコード)の構造


<img width="1200px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92383/ade313ea-fe75-4222-bcf0-c9e49207cc1e.png">


















MBRは4つの領域からなる512バイトで構成されています。

1. MBR
    1. **ブートストラップコード (446バイト)**
    BIOSが読み込む実行コードで、アクティブなパーティションを特定し、そのパーティションのブートセクタ(PBR)を読み込んで制御を移します。
    1. **パーティションテーブル (64バイト)**
    4つのエントリ(各16バイト)からなり、各パーティションの情報(開始位置、サイズ、ファイルシステムの種類、アクティブフラグ
    など)を保持します。
        1. **ブートフラグ (1バイト)**: `0x80` = ブート可, `0x00` = ブート不可
        1. **開始CHSアドレス (3バイト)**: パーティションの開始位置をCHS(Cylinder-Head-Sector)形式で指定。
        1. **パーティションタイプ (1バイト)**: ファイルシステムの種類 (例: 0x07はNTFS)
        1. **終了CHSアドレス (3バイト)**: パーティションの終了位置をCHS形式で指定。
        1. **開始LBAアドレス (4バイト)**: パーティションの開始位置をLBA (Logical Block Addressing) 形式で指定
        1. **パーティションサイズ (4バイト)**: パーティションのサイズ(セクタ数)
    1. **ディスク署名(4バイト)**
    オプションの識別子で、OSがディスクを位置位に識別するために使用されます。
    1. **ブートシグネチャ (2バイト)**
    MBRの終端を示すマジックナンバー `0x55AA` 。BIOSはこの値を確認してMBRの有効性を判断します。
1. MBR Gap
MBRの末尾からさいしょのパーティションまでのみ使用領域。GRUBではこの領域にステージ1.5のブートローダーが格納される
1. パーティション

## GPT (GUIDパーティションテーブル)の構造

<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92383/c72c9912-4b74-482c-9114-8b0367c1ec3d.png">

























[出典: GUID Partition Table | wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table)

GPTはディスク上に以下の構造を持ちます。

1. **保護MBR (Protective MBR)** : LBA0
MBRディスクのみをサポートするツールがGPTパーティションを破壊することを防ぐ役割があります。
1. **プライマリGPTヘッダ (Primary GPT Header)** : LBA1
パーティションテーブルの位置やサイズ、ディスクGUIDなどの情報を含みます。
    1. **シグネチャ (8byte)** : リトルエンディアン
    1. **ヘッダのリビジョン (4byte)** : GPTのバージョン
    1. **ヘッダサイズ (4byte)** : ヘッダーのサイズ (通常92バイト)
    1. **CRC32チェックサム (4byte)** : プライマリGPTヘッダのCRC32チェックサム (リトルエンディアン)
    1. **予約 (4byte)**
    1. **現在のLBA (8byte)** : このヘッダが存在するLBA (通常LBA1)
    1. **バックアップヘッダのLBA (8byte)** : バックアップ用のGPTヘッダの位置
    1. **利用可能な最初のパーティションのLBA  (8byte)** : 利用可能な最初のパーティションの位置
    1. **利用可能な最後のパーティションのLBA  (8byte)** : 利用可能な最初のパーティションの位置
    1. **ディスクGUID  (16byte)** : ディスク全体を一意に識別するGUID (リトルエンディアン)
    1. **パーティションエントリ配列の開始LBA (8byte)** : 通常LBA2
    1. **パーティションエントリのサイズ (4byte)** 通常128
    1. **パーティションエントリ配列のCRC32チェックサム (4byte)** : パーティションエントリ配列のCRC32チェックサム (リトルエンディアン)
1. **プライマリパーティションエントリ配列 (Primary Partition Entry Array)** : LBA2 ~ LBA33
各パーティションの詳細情報を格納します。
    1. **パーティションタイプGUID (16バイト)** : パーティションの種類を指定
    1. **一意のパーティションGUID (16バイト)**: 各パーティションを一意に識別します。
    1. **開始LBA (8バイト)** : パーティションの開始位置
    1. **終了LBA (8バイト)** : パーティションの終了位置
    1. **属性フラグ (8バイト)** : 読み取り専用や非表示などの属性を設定しま。
    1. **パーティション名 (72バイト)**: UTF-16LEでエンコードされたパーティションの名前 
1. **パーティション**
1. **セカンダリパーティションエントリ配列**: 末尾
冗長性確保のための「パーティションエントリ配列 (Partition Entry Array)」のバックアップ
1. **セカンダリGPTヘッダー**: 末尾
冗長性を確保するための「GPTヘッダ (GPT Header)」のバックアップ


# ■ 用語

## セクタ

セクタとはHDDやSSDなどのストレージデバイスにおけるデータの最小記録単位で、ディスク上のデータはこのセクタ単位で読み書きされます。
セクタサイズには以下の種類があります。

- **512n** (512バイトセクタ)
物理・論理セクタサイズともに512バイト。従来の標準的なサイズ
- **512e** (512エミュレーション)
物理セクタサイズは4KBだが、互換性のために論理セクタサイズを512バイトとして扱う
- **4Kn** (4KBネイティブ)
物理・論理セクタサイズともに4KB。近年主流となっているサイズ


## CHS (Cylinder-Head-Sector) と LBA (Logical Block Addressing)

CHSとLBAはいずれもストレージ上のデータの物理的な位置を指定するための方式です。

| 項目 | CHS方式 | LBA方式|
| --- | --- | --- |
| アドレス指定方法 | シリンダー、ヘッド、セクタの組み合わせ | セクタに通し番号を割り当てて指定| 
| 容量制限 | 約8.4GB（BIOSの制限による） | 最大128PiB（48ビットLBAの場合）| 
| 柔軟性 | デバイスの物理構造に依存 | デバイスの物理構造に依存しない| 
| 対応デバイス | ハードディスク | ハードディスク、SSD、CD-ROM、テープドライブなど| 

### CHS(Cylinder-Head-Sector)


CHS(Cylinder-Head-Sector)はHDDにおいて、シリンダー・ヘッド・セクターの3値を使って、データ物理的な位置を指定するための古典的なアドレッシング方法です。

1. **シリンダー(トラック)**: 各プラッタ(円盤)のどの同心円かを指定
1. **ヘッド** : どのディスクかをヘッド番号で指定
1. **セクタ** : シリンダー(トラック)上のどこのセクタかを指定

<img width="300" alt="image.png (480.8 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92383/f8668695-cb04-4a2b-aee8-8938ecc5d895.png">










[出典: Cylinder-head-sector | wikipedia](https://en.wikipedia.org/wiki/Cylinder-head-sector)

### LBA (Logical Block Addressing)

HDDやSSDなどのストレージデバイス上の各セクタに対して、先頭から順に一意の番号(LBA0, LBA1, LBA2, ...)を割り当てる現在主流のアドレッシング方式です。


## ESP (EFIシステムパーティション)

UEFIにおいて、起動プロセスに必須のパーティションで、ブートローダー(`/EFI/BOOT/BOOTX64.EFI`)やデバイスドライバ、システムユーティリティを格納します。
ファイルシステムは `FAT32` でフォーマットされ、パーティションサイズは一般的に100MB ~ 1GB程度です。
パーティションタイプGUIDは `C12A7328-F81F-11D2-BA4B-00A0C93EC93B` となります。

fdiskやpartedコマンドでパーティションがESPかを確認することができます。

```bash
fdisk -l
# Disk /dev/nvme0n1: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors
# Disk model: KIOXIA-EXCERIA PLUS G3 SSD
# Units: sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# I/O size (minimum/optimal): 512 bytes / 512 bytes
# Disklabel type: gpt
# Disk identifier: 38496A13-AD66-44C7-8B35-7C373B9B75AB
#
# Device           Start        End    Sectors  Size Type
# /dev/nvme0n1p1    2048    2203647    2201600    1G EFI System
# /dev/nvme0n1p2 2203648 2931892223 2929688576  1.4T Linux filesystem
```

```bash
parted /dev/nvme0n1 print
# Model: KIOXIA-EXCERIA PLUS G3 SSD (nvme)
# Disk /dev/nvme0n1: 2000GB
# Sector size (logical/physical): 512B/512B
# Partition Table: gpt
# Disk Flags:
#
# Number  Start   End     Size    File system  Name  Flags
#  1      1049kB  1128MB  1127MB  fat32              boot, esp
#  2      1128MB  1501GB  1500GB  ext4
```