<< NEW | main | OLD>>
いろいろとありまして、物理セクタ番号からそれに対応する
ストライプボリューム上の論理セクタ番号を求めることになりました。

ストライプボリュームに関するよくある解説では、ザックリとした概要はわかるのですが
具体的にバイナリデータを見せながら説明している例はみあたらなかったため、
今回物理セクタから論理セクタ番号への変換過程で確認が必要となった
ストライプボリュームの内部構造について、実際のデータを交えながらご紹介します。

<環境>
・Windows7 64bit Ultimate(ただしストライプボリュームの構築はVistaだったかも)
・1.5TBのHDD(非AFT) x 3本の全領域を使用したストライプボリューム

<注意点>
・今回は非AFTモデルなのでAFT採用モデルには当てはまらない部分があるかもしれません。
・私もまだまだ勉強中につき記事の内容には誤りがあるかもしれません。
 もし間違いがありましたらご指摘いただけると助かります。

以上ご了承ください。



a. ストライプボリュームの開始セクタ

まず前提知識としてストライプボリュームのようなマルチパーティションボリュームは
LDM(Logical Disk Manager)によって管理されています。
大まかな仕組みはこちらなどが参考になります。

BOOK Preview インサイドMicrosoft Windows 第4版 下
第10章 ストレージ管理 10.3.2 ダイナミックディスク


上記サイトでも触れられていますが、ボリュームの開始位置やサイズ情報のは
データ領域の後方にあるLDMデータベース領域にあります。早速見てみましょう。

20140505_01.png

使用しているのは以前も使用したActive@ Disk Editorです。
ただVBLK Blockのパースはイマイチですね。。。
一応Record typeをツリーの名称に反映してくれているみたいなので
Partition(Record type = 0x33)のエントリーを探します。

私の環境はディスク3本丸々使ったストライプボリュームなので、
恐らくその3つと思われるレコードがそれぞれ見つかりました。
ASCIIで見ると"Disk3"、"Disk4", "Disk5"といった文字列が見えます。

今回は比較的単純な構成だったのでわかりやすかったですが、
複数のボリュームが存在するようなシステムでは
guidなどを参照しながらもう少し丁寧な特定作業が必要になりそうです。


次にこのレコードのData部からパーティション開始位置の情報を探します。
VBLK - Technicalによると、PartitionレコードのData構造は、
まず可変長の"Object Id"と"Name"がきて、
4byteのゼロ区切り、続く8byteに"Log Commit Id"がきます。
その次の8byteの"start"が開始セクタでしょうかね。
上の画像では0x07C1となっています。十進に直すと1,985です。
しかしセクタ1,985付近を確認してみてもデータは全てゼロでした。

そこでふと思いつきMBRによる一般的なパーティション開始セクタの63を
足してみるとちょうど2,048になることに気づきました。
早速セクタ2,048付近を見てみます。

20140505_02.png

一つ前のセクタまでずっとゼロが続いていたところに突如としてデータが現れました。
見た感じNTFSのパーティションブートレコード(PBR)のようですね。
パーティションの先頭と期待した位置にちゃんとPBRがきていることから、
データ領域の開始セクタは(私の環境では)物理セクタ2,048で間違いなさそうです。

論理ボリュームの先頭データと比較すると、ぴったり一致していることがわかります。

20140505_03.png



b. ストライプボリュームのデータ構造

RAID0の説明としてはしばしばこういったものを目にします。

BOOK Preview インサイドMicrosoft Windows 第4版 下
第10章 ストレージ管理 10.3.3 マルチパーティションボリューム管理


仕組みとしては知っていても、では本当にそうなっているのか、
実際に覗いて確認した人はあまりいないのではないでしょうか?

ここではディスク3本(それぞれA,B,Cとします)のストライプボリュームに
蓄積されているデータが、きちんと以下の様な構造になっているのかということを
実際のデータから確認したいと思います。
なおチャンクサイズは暫定でデフォルトの64KB(128セクタ)と仮定しておきます。

<予想されるデータ構造>
チャンク1: 論理セクタ000-127 - ディスクAのセクタ2,048-2,175
チャンク2: 論理セクタ128-255 - ディスクBのセクタ2,048-2,175
チャンク3: 論理セクタ256-383 - ディスクCのセクタ2,048-2,175
チャンク4: 論理セクタ384-511 - ディスクAのセクタ2,176-2,303
チャンク5: 論理セクタ512-639 - ディスクBのセクタ2,176-2,303
チャンク6: 論理セクタ640-767 - ディスクCのセクタ2,176-2,303
チャンク7: 論理セクタ768-895 - ディスクAのセクタ2,304-2,431
……(以下続く)……


ではまずチャンクサイズから確認しましょう。
先ほどと同じようにVBLK Blockから
Component(Record type = 0x32)のレコードを参照します。

20140505_04.ng

VBLK - Technicalを参考にしながらチャンクサイズの場所を探すと
赤枠で囲った位置であることがわかります。
最初の1byteの0x01はデータ長を表すので、
実際のデータは次の1byteの0x80、つまり十進の64になりますね。


チャンクサイズがデフォルト値の64KBに設定されていることが確認できたので、
次はいよいよ64KBごとのチャンク境界面を実際に観察して
物理・論理それぞれの位置関係が先ほど予想したとおりの
順で並んでいるかを確認したいと思います。

20140505_05.png

ここまでピッタリに一致すると気分がいいですね!
これで物理セクタと論理セクタを正確に結びつけることが可能になりました。



c. 物理セクタから論理セクタへの変換計算

ではここまでの成果を踏まえて実際に論理セクタ番号を求めてみます。
やっていることは難しくありませんが、
ちょっと複雑なので段階を追って計算していきましょう。
流れとしては、まずチャンク番号を割り出して(①②)、
最後にチャンク内の端数セクタを足しています(③④)。


①物理ディスク前方に存在するチャンク数
= Int((物理セクタ番号 - データ領域オフセット) / チャンクサイズ)

②チャンク番号 = ① * ディスク数 + ディスク番号

③チャンク開始セクタからのオフセット
= (物理セクタ番号 - データ領域オフセット) - (① * チャンクサイズ)

④論理セクタ番号 = (② - 1) * チャンクサイズ + ③

※Int()は括弧内を切り捨てにするという意味です。
※「データ領域オフセット」はディスク先頭からデータ開始セクタまでのオフセットです(本記事aで確認した内容)。
※「チャンクサイズ」の単位はセクタです。
※「チャンク番号」は論理ボリューム先頭のチャンクを便宜的に1とし順番に番号を振ったものです(本記事b参照)。
※「ディスク番号」は本記事bの例で言うとディスクAが1, Bが2、Cが3となります。



今回私が求めたかったのは3本あるディスクのうちの2本目(ディスク番号=2)の
物理セクタ2,191,318,632に相当する論理セクタ番号です。
したがって以下のような計算で求めることが出来ます。

①Int((2,191,318,632 - 2,048) / 128) = 17,119,660
②17,119,660 * 3 + 2 = 51,358,982
③(2,191,318,632 - 2,048) - (17,119,660 * 128) = 104
④(51,358,982 - 1) * 128 + 104 = 6,573,949,672


というわけで先日の記事でいきなり出てきた6,573,949,672という数字は、
実はこんなふうにして求めたものだったのでした。
Windows/.NET comments(0) -


コメント


フォーム

ブログ内検索

自作ツールなど
■棒読みちゃんプラグイン
2ch専用ブラウザ読み上げ(改良版)

■IntelliPark設定ツール
WDIDLE3 for Windows

■マウスユーティリティ
Wheelpool

■ユーザー入力監視ソフト
iDLEM@STER

■さぽている攻略 [公開終了]
さぽつ~る(さぽつーる)
アイテムリスト成型
調合成功率計算
カテゴリー別

openclose

プロフィール

百合亞

Author:百合亞
敬虔な百合信仰者かつ崇拝者
将来の夢は女の子

管理人にメール

お名前:
メール:
件 名:

りんく
ことのはアムリラート

美少女万華鏡 -罪と罰の少女-

FLOWERS

2017年5月26日発売のNavel新作『月に寄りそう乙女の作法2.1エスパル』を応援しています!

「天結いキャッスルマイスター」応援中!

『想いを捧げる乙女のメロディー』2017年3月24日発売予定

オトメ*ドメイン

eye★phon(アイ・フォン)『つい・ゆり ~おかあさんにはナイショだよ~』

AXL新作第12弾「恋する乙女と守護の楯~薔薇の聖母~」 2016年1月29日発売予定!

お嬢様と秘密の乙女

カミツレ

【ハピメア】応援バナー

【白雪の騎士】応援バナー

ノブレスオブルージュ

シロガネオトメ

『ヒメゴト・マスカレイド』応援中!

屋上の百合霊さん

天使の羽根を踏まないでっ

「キミとボクとエデンの林檎」公式サイトへ

『るいは智を呼ぶファンディスク』を応援しています!

『処女はお姉さまに恋してる ~2人のエルダー~』絶賛発売中!!

りんく2
藤真拓哉オフィシャルブログ
CrystalDiskInfo - 水晶雫

マリかう

Powered by FC2 Blog    Templete by hacca*days.

PR