パーティションテーブルはどこにあるのか?
ハードディスクアクセス方式「CHS」と「LBA」の違い - What am I looking for?
Linuxでは、パーティションテーブルの情報が得られるコマンドがfdisk -l(LBA方式なら-lu)ということでしたが、では、そのパーティションテーブルはいったいどこで管理されているのか?という話。
「1.2.2 古くて新しいパーティションテーブル」より
第0セクタにあるMBRの446~509バイト部分がパーティションテーブルです。
MBRの0~445バイトは、いわゆるブートストラップローダ、すなわちサーバ起動時に最初にBIOSが読み込んで実行する、GRUBのステージ1が書き込まれています。
(中略)
1セクタのサイズは512バイトですので、510~511バイト(0バイトが先頭なので最後は511バイトですね)の2バイトが余りますが、ここにはお約束で0xAA55という値が記録されます。この値が異なっているディスクは、MBRが壊れていると判断されます。
ふむふむ。ディスクの第0セクタを拙いAAで図示すると
第何セクタか→| 0 | 1 | 2 | 3 | バイト部→| 0~445 | 446~509 | 510~511 | 0 ~ 511 | 0 ~ 511 | 0 ~ 511 | なんの領域か→| ブートストラップローダ | パーティションテーブル | お約束0xAA55 | ??? | ??? | ??? |
さらに、
パーティションテーブルのサイズは64バイトしかありませんので、それほど多くの情報は書き込めません。代表的な情報として、角パーティションについて、「CHS方式で表現したパーティションの開始位置と終了位置」、および「LBA方式(セクタ番号)で表現したパーティションの開始位置とセクタ数」が記録されます(終了位置のセクタ番号は記録されません。開始位置にセクタ数を足して計算します)。
パーティションテーブルのダンプ出力コマンドとその出力結果も記載されていたので、実際に自分のマシンで打ってみた。コマンドが謎の呪文にしか見えないし、出力結果も16進数なのでカオス。
>hexdump -s 446 -n 66 -e '8/1 "%02x " 2/4 "%0d " "\n"' /dev/sda 80 01 01 00 83 fe ff ff63 154304262 00 fe ff ff 82 fe ff ff154304325 1959930 00 00 00 00 00 00 00 000 0 + 55 aa
やっていることは、MBRの446バイトから66バイト分をhexdumpでダンプ出力しているとのこと。
それぞれの列が表している情報は、16進数2桁で1バイトなので、左から順に
ブートフラグ(1バイト)、開始位置(CHS方式)(3バイト)、パーティションID(1バイト)、終了位置(CHS方式)(3バイト)、開始位置(セクタ番号:LBA方式)(4バイト)、セクタ数(LBA方式)(4バイト)、とのこと。
また、上の出力結果の最終行に表示されている05aaについてヒントが記載されていて
ちなみに、最後の2バイトは先に説明した0xAA55です。図1.3の最後が0x55AAに見える人は「リトルエンディアン」について調べることを宿題にしておきましょう。
ですと。
一応hexdumpの出力結果をfdisk -luの出力結果とも比較してみる。
>fdisk -lu ディスク /dev/sda: 160.0 GB, 160041885696 バイト ヘッド 255, セクタ 63, シリンダ 19457, 合計 312581808 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x00007b0d デバイス ブート 始点 終点 ブロック Id システム /dev/sda1 * 63 154304324 77152131 83 Linux /dev/sda2 154304325 156264254 979965 82 Linux スワップ / Solaris
(ちょっと古いマシンなので160GBしかないんだよ。もともとWinXPマシンだったものにUbuntuを乗っけたのです。)
さっきのhexdump結果だと63セクタから数えて154304262セクタ分までが、154304325セクタから数えて1959930セクタ分までががそれぞれ独立したパーティションとのことだった。
fdiskコマンドの1つ目のパーティションの終点154304324は、
63+154304262-1(63セクタ目1つ分を引く)
から。2つ目のパーティションの終点156264254は、
154304325+1959930-1(154304325目1つ分を引く)
から導けて、確かに一致した。