Geometryメニュー

最初にCHSとGeometryについて説明しておく。まずリンク先の一番下の図をみて、シリンダ・ヘッド・セクタの3次元的な概念を理解しよう。ハードディスクドライブの内部には磁性体を塗布したディスクが複数枚重ねられていて、それぞれの両面にデータを記録することができる。「パソコンは2進数の世界で0か1で成り立っている」というようなことを聞いたことがあると思うが、ディスクの表面に多数の記録粒子があって、それが磁気を帯びているかどうかで0と1を記録しているとイメージすればよい。たとえば1テラバイトの容量のHDDならば8テラ個(1バイトは8ビットだから)の記録粒子があると思えばよい。

そのときに、実際には仕切りなどはないのだが、黄色く描かれている部分のような同心円のグループを想定する。これは1枚のディスクで考えるのではなく、立体的に複数枚に渡るグループを考える。これがシリンダである。シリンダの形状をイメージすると文字通り「筒」状になっていることが分かるだろう。。そして
0から始まる通し番号を最外周からつけていけば、たとえば5番ならば最外周から6番目の筒状グループを指すことになる。

次に1つのシリンダを、ディスクの表裏でグループ分けする。今の図では2枚ディスクがあるから、1枚目の表、1枚目の裏、2枚目の表、2枚目の裏と4グループに分けられる。これがヘッドだ。一番上から
0から始まる通し番号をつけておくと、たとえば3番ならば「2枚目の裏」ということになる。

次に、1ヘッド分のシリンダを円周方向で63分割した小部屋に分ける。これがセクタ。この小部屋には、一部屋あたり512バイト分の記録粒子が含まれている。そして
1から始めて、1号室・2号室…63号室と各部屋に番号をつけておく。

このように部屋分けをしておくと、たとえば、外周からC番目のシリンダで、H番目のヘッドで、S号室のセクタと指定してやると、立体構造のHDDのなかでも、お目当てのセクタにアプローチできるようになる。これがCHS方式だ。そして構成要素である、シリンダ・ヘッド・セクタがそれぞれいくつになっているのかという構成をGeometryと呼ぶ。「このHDDのGeometryはCHS=1023/255/63だ」というような使い方をする。

TestDiskのメニュー選択画面(AnalyseとかAdvancedとかを選ぶ画面)でGeometryを選ぶと、以下のような画面になる。

TestDisk 6.2-WIP, Data Recovery Utility, November 2005
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org


Disk /dev/sda - 120 GB / 111 GiB - CHS 14593 255 63, sector size=512

Because these numbers change the way that TestDisk looks for partitions
and calculates their sizes, it's important to have the correct disk geometry.
PC partitionning programs often make partitions end on cylinder boundaries.

A partition's CHS values are based on disk translations which make them
different than its physical geometry. The most common CHS head values
are: 255, 240 and sometimes 16.




[ Cylinders ]  [   Heads   ]  [  Sectors  ]  [Sector Size]  [    Ok     ]





                          Done with changing geometry

この画面から、シリンダ・ヘッド・セクタ・セクタのサイズの値を、現在認識されている数値から、それぞれ個別に変更することが出来る。(現在TestDiskが認識している数値は4行目に表示されている)

(Windows Vistaのような例外もあるが)ほとんどのパーティション作成プログラムは、シリンダの境界となっている位置にパーティションの境界を作る。もしも基準となるCHSの設定が間違えていると、シリンダの境界位置を間違って計算してしまうので、TestDiskはブートセクタなどの大切な情報源となるセクタを見つけられなくなってしまう。

 *ある有名な童話に似ているような話

あるところに変是瑠と愚霊照というヤンキーな兄妹がいました。レスラーのように巨漢の兄と、見た目だけは可愛らしい妹のコンビで、美人局のような犯罪行為をして荒稼ぎをしていましたが、ある時とうとう警察に捕まり、富士山麓の樹海の奥深くに位置する刑務所に入れられてしまいました。しかし悪知恵のはたらく変是瑠は、刑務所まで徒歩で連行される時に、ゲーセンからくすねてポケットに入れておいたコインを、樹海の道すがら1つずつポトポトと落としていきました。投監後、監守の目を盗んでキーピックで檻の鍵をはずした兄の変是瑠は、妹の愚霊照に言いました。「ふたりで一緒に逃げるのは目立つのでヤバイ。おまえが先に行け。50歩ごとに1個ずつコインを撒いておいた。それを見つけながら進んで行けばうまく樹海を抜けられる。」 それをきいた愚霊照は「サンキュ!兄貴。恩に着るぜ。」と言って先に出て行きました。刑務所を出たところで1個目のコインはすぐに見つかりました。ところがそこから50歩進んでも次のコインなんてありません。ためしにもう50歩進んでみましたがやっぱりコインは見つかりません。ウロウロ探しているうちに監守に見つかってしまいました。「くそっ!変是瑠の野郎、大嘘つきやがって。」 愚霊照は野獣のように吼えまくりました。しかし変是瑠はきちんとコインを正確に50歩ずつの間隔で撒いていたのです。それなのにどうして愚霊照はコインを見つけられなかったのでしょう? そう、ふたりはうっかりしていたのです。変是瑠と愚霊照のふたりの歩幅が全然違うということを。

この画面でGeometryの設定を変更したとしても、TestDiskの検索パターンがその値をもとにして動作するようになるだけなので、ただちにHDD上のデータに影響を与えるものではない。もちろんBIOSの設定が変わったりすることもない。ただし間違ったGeometryの設定をしておいて、それによって正しくないパーティションの区分け情報を導き出し、そのデータを実際にHDDに書き込んでしまったら、トラブルがより一層深刻化し、ますます復旧が難しくなってしまうだろう。

 通常の場合 セクタサイズは512バイトに固定されているし、セクタも63セクタと決まっていると思って間違いない。シリンダに関しては、24bitCHS規格の時の1023セクタまでという制限はTestDiskには関係なくて、現実のHDDの容量になるような数値が表示される。上の例でもCHS=14593/255/63になっていて、14593という1023をはるかに超えた数値になっている。実際に14593*255*63*512バイトを計算してみると120GBになるのがわかるだろう。TestDiskの表示は、パーティションの境界を示すのに適しているからCHS形式を採用してはいるが、実際には伝統あるCHS規格とは違うものなのだ。

以上のことから、多くの場合
TestDiskで分析するうえで問題になるのはヘッド値である。たとえばヘッド値が本当は255の場合ならば、255*63=16065なので、16065セクタごとにシリンダの境界が来る。TestDiskはその16065セクタの倍数を基点にして、1セクタ前(NTFSバックアップブートセクタ検索)、64セクタ後(論理領域のブートセクタ)、6セクタ後(FATバックアップブートセクタ)などの重要なセクタが存在する可能性のあるセクタのみを探すわけである。むやみに全セクタを探しているわけではないのだ。

ところが、仮にTestDiskがヘッド値を240と誤認識したとしよう。240*63=15120なので、15120セクタの倍数を基点に探すことになる。そうすると、たまたま公倍数みたいなセクタに重要なデータがあるような稀な場合を除けば、全く重要なセクタが検索に引っかかってこないということになる。変是瑠と愚霊照の場合のように。

背景となる情報

データにアクセスするために、現在のBIOSやOSはLBA(Logical Block Adressing)という方法を利用している。0から始まって、1,2,3…と順番に番号をセクタに振っていくやり方だ。

しかし、IDEのハードディスクが8GB未満で、SCSIディスクも存在しなかった時代には別の方法が使われていた。データにアクセスするために、BIOSとOS(DOSやWin9x)はCHSという規格を使っていた。CHSには1023シリンダ、255ヘッド、63セクタ(総計8GB)という上限があった。504MB(1023シリンダ、16ヘッド、63セクタ)を超える容量を持つHDDでは、物理的なGeometryを変換して用いるという手法が導入されていた。(拡張CHSあるいはLargeモードと呼ばれる)

たとえばこのページの一番上のTestDiskの分析結果を見ると、255headsになっているのが分かる。ということは128枚の磁気ディスクが重なっていることになる。実際にはそんなHDDはありえない。3.5インチHDDならばせいぜい4〜5枚くらいが限界だろう。実はCHSという方式は仮想的な概念で、実際の物理的なHDDの構造をあらわしているわけではないのだ。

さらにややこしいことに、BIOSとIDEディスコントローラでは、それぞれのCHSに対する規格が異なるという問題がある。

BIOSではCHSの上限は、シリンダ10bit 、ヘッド8bit、セクタ6bitとなっている。一方IDEの仕様では、シリンダ16bit 、ヘッド4bit、セクタ8bitである。全然統一されていない。このような場合、両者間のデータの受け渡しがどうなってしまうのかと言うと、共通する部分、すなわちそれぞれの項目で少ないほうに合わさざるをえなくなってしまう。

シリンダ ヘッド セクタ 規格上限容量
BIOS 1023(10bit) 256(8bit) 63(6bit) 8GB
IDE 65536(16bit) 16(4bit) 255(8bit) 128GB
共通部分 1023(10bit) 16(4bit) 63(6bit) 504MB

このままでは504MBしか扱えない。そこでLARGEと呼ばれる変換方法を使って、なんとか8GBまで扱えるようにした。たとえばIDE方式でCHSが 4000/4/63という時には、Cを2分の1に、Hを2倍にという操作をBIOS方式に合うまで繰り返して、1000/16/63と変換して渡すというようなやりかたである。この苦肉の策は有効ではあるが、2種類のヘッド値が使い分けされるという状況から、時と場合によってはTestDiskがヘッド値を混同して認識する引き金になってしまうのである。

数あるBIOSのなかには、パーティションテーブルのデータを使って、ヘッドの数をはじき出すものがある。この時もしもパーティションテーブルが損傷してしまった場合には、IDEコントローラからのGeometry情報がそのまま代用されてしまうかもしれない。そうすると、パーティションの境界情報を導き出すことはきわめて困難になるだろう。この問題は、DOS版のTestDiskだけに限ったものではない。Linux版のTestDiskでも起こりえる問題である。(Deleteメニューのページを参照)

パーティションテーブルの詳しい構造については別ページに詳しく書いたのでここでは述べないが、パーティションテーブルの中には、パーティションの終了位置(CHS)が記録されている。終了位置はシリンダが繰り上がる直前のセクタなので、この時のヘッド値は極大値をとる。すなわちGeometryのヘッド値と同一になると考えられる。

下の図は240ヘッドの場合のパーティションテーブルの一例である。青丸で囲んだものが終了位置のヘッド値をそのままあらわしている。16進数のEFは10進数で239だ。ヘッドはゼロから数え始めるるルールなので240ヘッドと言うことだ。(時刻表示で分は59分までしかないのに、1時間は59分間ではなく60分間というのと同じ理屈)
240ヘッド
おなじく次はヘッド値255の一例である。FEは10進数で254である。
255ヘッド
ということで、パーティションテーブルにヘッド値の情報は残されているのである。もしもパーティションテーブルが無傷であれば、この情報はきわめて信頼できる。なぜならば、パーティション作成ツールが実際にパーティションを切ったその時に、同時にその実態を書き込んだ情報だからだ。8GBよりも大きな領域ではCHSは実態をあらわしてはいないが、それはシリンダ値に関してであって、ヘッド値に関しては極大値を示していると考えてよい。(こちらIntelパーティションテーブルの頁を参照)

同様に、FAT32やNTFSの場合は、ブートセクタのディスクパラメータにも、「1シリンダあたりのヘッド数」という項目があり、ヘッド値が記録されている。(ディスクパラメータのページを参照)

TestDiskはこのあと述べるような方法でGeometryの値を算出しているが、パーティションテーブル、ディスクパラメータをはじめ、入手できる情報間で矛盾があると画面に注意書きが出る。英語で書いてあるからと言って読み飛ばすのではなく、表示された内容を正しく理解するように努めないと、TestDiskはきちんと役に立ってはくれないだろう。

どのようにしてTestDiskはGeometryを算出するのか

Geometryに関するヒント

どうやって正しいヘッド値を導き出すのか?

もしもTestDiskが上記の方法で算出したGeometryがパーティションテーブルの値と異なっていた時には、メニューでAnalyseを選んだ時に

などの警告が表示される。

 下図がその一例である
Geometry警告画面
この場合は、Bad ending head が出ている。
それと同時に注目して欲しいのが、もう2行上のWarningである。
255(NTFS) != 240(HD)
という表示である。「TestDiskは240をヘッド値にしているけど、NTFSブートセクタには255って記録されているよ」という意味である。前述したようにTestDiskは賢いので、色々な所の情報を突き合わせて、矛盾がないかを調べている。

!= というのはイコールではないと言う意味のマークだが、TestDiskでこれが出たら、Geometryの設定が必要かもしれないということを覚えておいて欲しい。逆に言えば、これが出ていないときは、Geometryをいじる必要はないと考えて良いと思う。

もしもこれらの警告表示を見たら、Geometryメニューに移行して、ヘッド値の変更をすることが必要かもしれない。TestDiskが全てのパーティションの候補を見つけ出すまで、255, 16, 32, 64, 128 そして 240という値を試してみよう。255あるいは240というのが最も一般的な数値だ。もしもLinuxを唯一のOSとしてインストールしてあるのならば、16ヘッドということもありえる。

どうやって正しいセクタ値を導き出すのか?

たいていの場合、1ヘッドあたりのセクタ数はいつも63に決まっている。しかしUSB接続機種の中には32セクタというものもある。


「TestDisk非公式ヘルプ」目次へ