パーティションテーブルはどこにあるのか?

ハードディスクアクセス方式「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つ分を引く)
から導けて、確かに一致した。