GUIDパーティションテーブル

2018年9月4日火曜日

GUIDパーティションディスクからの起動
GUIDパーティションテーブル(GPT)の規格はUEFI(EFI)の規格とセットであるが GUIDパーティションテーブルのディスクからの起動にはEFIブートが必須というわけではない
Windowsの場合は無理な場合が多いが LinuxではGPTのディスクからも従来通りの方法(MBRを利用した方法)での起動は可能

GUIDパーティションテーブル
GUIDパーティションテーブルの先頭のセクタ(LBA0)は従来のMBRと同じものになっている
これは互換性や安全性のため
GPTに対応していない機器にディスクを接続してしまったときに ディスクと認識されなかったり さらには初期化のされていないディスクと勘違いされていきなり初期化されたりしないようにするため
従来のMBRパーティションでは MBR内にパーティション情報を格納してたが GPTではここにはパーティションを情報を格納しない
MBRにつづく第2セクタ(LBA1)にあるパーティションテーブルヘッダおよび第3セクタからはじまるパーティションエントリに情報を格納する
MBRパーテョンでは基本パーテョションが4つまでであったり 大きなサイズ(2TB以上)のディスクを扱えなかったりしたのは MBR内のパーティション情報を格納する領域の大きさ的にそれが限界であったため
GPTではこのパーテョション情報を格納する領域は十分に広い
パーティションは128個まで ディスクサイズは8ZiB(ゼビバイト)まで扱える(もちろん 情報が格納できるというだけで実際に使えるかどうかはOSなどの対応による)

MBRブート
MBRブートでのブートローダはMBR内に格納する
MBRのサイズは全体で512B(1セクタ)であるが上記のパーティションテーブル情報分があるのでブートローダに利用できる領域は446Bしか用意されていない
このサイズでは多機能なブートローダは格納できない
そこでGRUBなどの多機能なブートローダでは MBR内には多機能なブートローダの本体を読み出すだけのブートローダをインストールして 本体は別の(もっと大きなサイズのプログラムを置ける)場所から読み込むようになっている

MBRの第1パーテョション
MBRパーティションでは第1パーティションは第1シリンダ(63セクタ)以降から始まるというルールがあった
このルールのためMBRの第2セクタから62セクタまでの61セクタ(約31KB)は必ず空きになっていた(MBR Gap) GRUBではこの領域にブートローダの本体を置き MBR上のブートローダがこれをロードして本体が実行されるようになっている
この領域に本体を置いておく利点は OSの管理外の領域であるために 一度書き込んだデータのディスク上の物理的な位置(セクタ位置)は変化しない
本体のインストール時にそのセクタ位置を記録しておけば それをもとにMBRのブートローダが本体の位置を確定することができる
OSの管理するファイルシステム上に書き込んだ場合 OS側のファイルシステムの調整によって本体のファイルそのものは消去されなくてもディスク上の物理的な位置は変化する可能性がある
そうなった場合 最初に記録したセクタ位置から本体のファイルが移動して読み込めなくなる(MBR上のブートローダはファイルシステムを理解できないので本体の移動に追従できない) パーティションツールによってはMBRパーティションであっても 第2セクタからすぐに第1パーティションを切ることが可能であるが そのようなことをするとGRUBなどのブートローダはうまくインストールできない可能性がある

GUIDパーティションテーブルとMBRブート
GRUB2はGPTでのMBRブートに対応している
ただし GPTでは先頭のMBRの次の第2セクタからパーティション情報の領域がすぐに始まってしまう(MBR Gapがない)のでMBRの場合と同じ場所にGRUBの本体をインストールすることができない
そこでGPTでGRUB2のMBRブートを利用する場合 GRUBの本体をインストールするための専用の領域を確保する必要がある

bios_grub領域
linuxのpartd(GNU Parted)の場合パーティションにbios_grubオプションを設定することによってGRUBの本体をインストールする領域にすることが可能
その他のGPT対応のパーティションニングツールではパーティションタイプをEF02に設定する
GRUB(GRUB2)はGPTディスクへのインストール時にこの領域をみつけるとそこに本体を自動的にインストールする
GRUB2の説明を読むとこの領域は最低31KB必要とかかれているがこれはMBR Gapが最低31KBだったことに対応している
GRUB2はこのbios_grub領域がない場合でも /bootディレクトリ以下に本体(ファイル)をインストールして起動するようにすることができる
この場合 そのファイルのディスク上の物理的なセクタ位置をインストール時に記録して その情報をもとにMBRのブートローダが本体の位置を特定して読み込む
ただし 何からの原因で/bootのファイルシステムが調整されてファイルの物理的なセクタ位置が変更されてしまうと起動できなくなる
bios_grub領域を利用することを推奨

余談
MBRはなぜ 2TiB以上のパーティションを作成できないのか?
答えは、MDRで定義されているパーティションサイズのエリアが 4 byte しかないからです
パーティションのサイズは、セクター(1セクター = 512 byte) で保存されます
つまり、4 byte = 32 bit ですから、
2^32 x 512 = 2^30 x 2^2 x 512 = 2,048 GiB = 2 TiB
※ GiB = 2^30
32bit OS では、最大メモリアクセス可能なのは、4GiB までです

32bit OS とは、そもそも 32bit毎に処理を行うことで、最大容量が32bitということでもあります
つまり、
2^32 = 2^30 x 2^2 = 4 GiB
となり、4GiBが最大となる
バイトの単位には、KBとKiBのように2つの単位表記があります
これは、 情報通信分野では、KB(キロバイト) = 2^10、 MB(メガバイト) = 2^20 などと 2のべき乗(累乗)で慣用的に用いられますが、 SI基準(SI接頭辞)において、KB(キロバイト) = 10^3、 MB(メガバイト) = 10^6 などと 10のべき乗(累乗)で表すため、非常に混乱をきたすころがあります
(正しくは後者であり、あくまで前者は慣用的に使われているというだけ) その混乱を避けるために、2のべき乗(累乗)で表した 2進接頭辞 で各単位を表したのが、KiB(キビバイト)であり、MiB(メビバイト)などです(KiBは、kibibyte と表され、kilo binary byte の略)
以下は、その単位の一覧になります
SI接頭辞 2進接頭辞
単位名(記号) SI基準値 慣用値(2進接頭辞の値) 単位名(記号) SIとの倍率慣用値÷SI基準値
キロバイト (kB)103210キビバイト (KiB)1.02
メガバイト (MB)106220メビバイト (MiB)1.05
ギガバイト (GB)109230ギビバイト (GiB)1.07
テラバイト (TB)1012240テビバイト (TiB)1.10
ペタバイト (PB)1015250ペビバイト (PiB)1.13
エクサバイト (EB)1018260エクスビバイト (EiB)1.15
ゼタバイト (ZB)1021270ゼビバイト (ZiB)1.18
ヨタバイト (YB)1024280ヨビバイト (YiB)1.21

Copyright © 2010 休眠 | Free Blogger Templates by Splashy Templates | Layout by Atomic Website Templates