パーティションのお勉強
今日はパーティションのお勉強です。長いので面白い所だけ。
プライマリ・マスタ/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
涙が出そうな位詳しい情報が見れます。グレイト。