パーティションのお勉強

今日はパーティションのお勉強です。長いので面白い所だけ。

プライマリ・マスタ/dev/hdaを覗いてみる

僕の場合、プライマリ・マスタが起動ディスクになってます。BIOSの設定で起動ディスクが変えられます。

ということは、プライマリ・マスタ/dev/hdaの中にブートレコードが入っているハズ。

さて、rootになってハードディスクの中を覗いてみます。

%# cat /dev/hda | head | hexdump -C | head -40
00000000  eb 48 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.H..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
(略)
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00008200  f8 65 00 00 c4 97 01 00  63 14 00 00 65 4a 01 00  |.e......c...eJ..|


おぉ、linuxのブートレコードが確認出来ます。最初の512バイト(0x1FF番地)までがブートレコードっす。0x1FE,0x1FFブートシグネチャ55aaも確認出来ますね。詳しくはOS自作入門を。

基本パーティション/dev/hda1を覗いてみる

次は基本パーティションを覗いてみます。

僕の場合は/dev/hda1の中にカーネルが入ってます。ちと覗いてみると、

%# cat /dev/hda1 | head | hexdump -C | head
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000400  f8 65 00 00 c4 97 01 00  63 14 00 00 65 4a 01 00  |.e......c...eJ..|
00000410  d4 65 00 00 01 00 00 00  00 00 00 00 00 00 00 00  |.e..............|
00000420  00 20 00 00 00 20 00 00  d8 07 00 00 ba 56 76 47  |. ... .......VvG|
(略)

hda1の中にはブートレコードが含まれてないようです。

よく見ると、/dev/hdaの0x8200番地と、/dev/hda1の0x400番地が一致している事が確認できます。

一個目の基本パーティション(/dev/hda1)は、0x7e00番地から始まるみたい。

疑問

0x200〜0x7dffまでの空白は何に使うんだろう・・・。

ん?

そういえば、メモリ上の0x7c00〜0x7dffはブートセクタが読み込まれる番地だ。何故、メモリとハードディスクの番地を一致させる必要があるのだろうか。


うはぁ、激しく謎めいてきたぞ。何か理由がありそうだ。もうちょっと調べてみよう。

基本パーティションを詳しく

もうちょっと詳しく、基本パーティションを見てみよう

fdisk -lをすると、

%# fdisk -l

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        9729    78043770   8e  Linux LVM

僕のハードディスクの切りかたはイマイチだった・・・次回はもうちょっとうまくやろう。


さて、もう一度ブート部分(末尾64バイトの1ブロック)を眺めてみると、

000001b0                                             80 01
000001c0  01 00 83 fe 3f 0c 3f 00  00 00 8e 2f 03 00

おっと、何かが見えるぜ。

80 Bootフラグ
01 01 00 開始ヘッダ、セクタ、シリンダ(未使用?)
83 IDがファイルシステム
fe 3f 0c 終了ヘッダ、セクタ、シリンダ(未使用?)
3f 00 00 00 パーティション開始位置のセクタ番号
8e 2f 03 00 パーティションの大きさ

らしい。詳しくはHow to modify the partition table : FAT32 & Extended DOS partitionを。


計算してみると、

0x3f * 0x200(512) = 0x7E00

おぉぉぉ/dev/hda1の開始アドレスが出た!!

次。

0x32f8e = 208782

blocksの倍になってるが、パーティションサイズもでた。


fdiskはブートレコードの(ブートシグネチャを除いた)末尾64バイトを見ている。

  • 16バイトx4個しかないので、基本パーティションは4個しか持てない。
  • ついでに、大きなディスクサイズを持とうと思うと色々問題も出てくる。だから、/bootはディスクの先頭部分に置かなければならない。

ファイルシステムの各種情報を表示する

すげー使えそうなコマンド。

%# dumpe2fs /dev/hda1 | head
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:   /boot
Last mounted on:          <not available>
Filesystem UUID:          63cc68e1-a58d-4b30-b96a-563e1f4ae0bb
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux

涙が出そうな位詳しい情報が見れます。グレイト。