TestDiskはHDDを検索したり、情報(LBAサイズやCHSジオメトリ)を入手するために、BIOS(INT13Hのような割り込み命令)やOS(WindowsのAPIなど)の機能を利用する。瞬時にHDDの構成を調べてパーティションテーブルと比較し、エラーがないか確認する。もしもパーティションテーブルにエラーがあったならば、TestDiskを使って修復することが出来る。パーティションを見失ったり、たとえ丸ごとパーティションテーブルの情報が消えてしまったとしても、TestDiskはパーティションを探し出してきて、新しいパーティションテーブルを作り出すことが可能である。もしも必要とあらば、新しいMBR(ブートストラップローダ)を作ることさえ可能なのだ。
だが、TestDiskが見つけ出してきたパーティションの候補リストを吟味して、どの候補がトラブル直前まで使用していた正しいパーティションであるのかを選び出すのは、ユーザーの眼力にかかっている。特に、今までに何回もパーティションを切りなおされたHDDを対象としてDeeper Searchをかけた場合には、TestDiskは、乱立した多数の候補を表示する可能性が高いので、取捨選択能力をいっそう求められる。以前に使われていて今は消されてしまったパーティションの情報でさえも、TestDiskは重要セクタの残骸から見つけ出してくるからだ。
TestDisk 6.5-WIP, Data Recovery Utility, October 2006 Christophe GRENIER <grenier@cgsecurity.org> http://www.cgsecurity.org Disk /dev/sda - 120 GB / 111 GiB - CHS 14593 255 63 Current partition structure: Partition Start End Size in sectors 1 * FAT32 0 1 1 1010 254 63 16241652 [NO NAME] 2 P Linux 1011 0 1 1023 254 63 208845 [/boot] 3 E extended LBA 1024 0 1 14592 254 63 217985985 5 L Linux RAID 1024 1 1 3573 254 63 40965687 [md0] X extended 3574 0 1 4210 254 63 10233405 6 L Linux RAID 3574 1 1 4210 254 63 10233342 [md1] X extended 4211 0 1 14592 254 63 166786830 7 L Linux 4211 1 1 14592 254 63 166786767 *=Primary bootable P=Primary L=Logical E=Extended D=Deleted [Proceed ] [ Backup ] Try to locate partition
失われたパーティションを復旧するために、HDDの現在のパーティション構造を分析し、パーティションを検索する。
TestDiskはパーティション構成をクイックチェックする。扱うことの出来るパーティションテーブルの形式は、Intel・Mac・無形式(パーティションのない小さなメディアのような場合)・Sun・XBoxである。
Windowsの場合はIntelを選ぶ |
Intel形式のパーティションテーブルの場合は、MBRに存在するテーブルと、拡張領域が存在する場合には拡張パーティションブートレコードから成り立っている。MBRのパーティションテーブルは4つまでのエントリを持つことができ、そのうちの最大1つのエントリを、(複数の論理領域を含んだ)拡張領域のものとすることができる。拡張領域というのは論理領域の器(コンテナ)のようなものだと考えればよい。MBRや拡張パーティションブートレコードといったセクタは、終端が0x55 0xAA という2バイトで終わっていなければならない。(x86 CPUはリトルエンディアンであるから、本当は0xAA55)
パーティションテーブルの各エントリは16バイトからなっており、
情報の種類 | バイト数 |
ブートインディケータ | 1 |
開始位置(CHS) | 3 |
システムID | 1 |
終了位置(CHS) | 3 |
開始位置(LBA) | 4 |
総セクタ数(LBA) | 4 |
のような構成になっている。ブートインディケータが80になっている領域がアクティブ(ブータブル)な基本領域であって、最大でも一つの領域にしか付けることができない。CHS規格はシリンダに関して最大1024(0〜1023)に制限されており、これが有名な8GBの壁の原因になっている。(1024*255*63 = 16450560 sectors = 8422686720 バイト)
現代のOSやBIOSはデータアクセスにLBA方式を使うが、FAT12/16/32のブートセクタは、いまだにCHSジオメトリとの関連を捨て切っていない。TestDiskは、それぞれの値がきちんと規格に合っているか、たとえば、1未満の数値がセクタ値になっていないか、逆に1ヘッドあたりのセクタ値(通常の場合63)を上回るような数値になっていないかをチェックする。
LBAの開始位置・総セクタ数が、CHSの開始位置・終了位置と矛盾していないかもチェックする。全てのパーティションの終了位置がHDDの容量を超えた位置にないかどうか、互いの領域が重なり合っていないかもチェックする。
LBAとCHSの比較であるが、先頭から8GB以降の位置はCHSに制限があるため単純な比較をすることはできない。比較方法の詳細は、Intelパーティションテーブルの解説ページを参照のこと。参照先の原則を満たしているかどうかをチェックしているわけだ。 |
ファイルシステムの形式によって、TestDiskはブートセクタに簡易チェックをかける。NTFSやFATの場合には、セクタ末尾に0xAA55のブートシグニチャがあるかどうかというようなチェックだ。このチェックは極めて短時間に、最小限チェックとして完了する。
2番目の段階として、TestDiskはここまでのステップの分析結果に全く影響を受けずに、いちから失われたパーティションを再度検索する。この段階の検索能力こそが、TestDiskのキモと呼べる部分だ。TestDiskはパーティションの存在を求めて、HDDの中の関連のあるセクタをすべてスキャンする。Intel形式(PC/AT互換機)のパーティションテーブルでは、通常の場合、基本領域はシリンダの最初(ヘッド0・セクタ1)から始まり、論理領域は少し後ろ(ヘッド1・セクタ1)から始まる。パーティションの始点となり得るすべてのセクタに対して、よく知られたファイルシステムであることを示す特徴的なヘッダが存在しないかどうか検索する。見つかった情報から、パーティションの領域を推定し、候補のリストとして画面に表示する。
FAT32・NTFSのブートセクタについては、ディスクパラメータのページを参照のこと。ブートセクタが残っていれば、パーティションの始点や総セクタ数・ジオメトリなどの重要な情報が得られることが分かると思う。 |
FAT32のパーティションを決定するために、TestDiskは0xAA55というエンドマークを探し、FAT32という文字列を探し、FATのブートセクタに特徴的なマシン語のジャンプ命令である 0xeb 0xXX 0x90 や 0xe9 0xXX 0xXXを探す。(xxは任意のバイトであることを示す)
0xeb: ショート ジャンプ。 現在のアドレスの-128〜+127番地以内へのジャンプ。
0x90: NOP (何もしない命令)
0xe9: ニアー ジャンプ。同じセグメント内でのジャンプ。
セクタサイズは512バイトで、1クラスタあたりのセクタ数は1,2,4,8,16,32,64,128のどれかで、2つのFATのコピーを持ち、メディアIDはF8でなければならず、マイクロソフトのガイドラインでは意味のないものとされてはいるが、FAT32という文字列が必ず存在する。
領域の全クラスタ数によって、TestDiskはFATの種類を識別をする。(クラスタ数が65525以上ならばFAT32というように)
FAT16にはクラスタ数が65524個までという制約がある。 |
FAT32に対しては幾つかの特異的なチェックも実行される。ルートディレクトリの開始クラスタ番号は2から最大クラスタ数までの間の数でなければならないとか、ルートフォルダの項目数や16bit表示の総セクタ数はFAT32では常に0でなければならないとか、FAT32のファイルシステムバージョンは(通常使われないが)00でなければならないとか、である。
NTFSの場合には、TestDiskは、0xAA55のエンドマークとNTFSという文字列、そして幾つかのFAT固有の項目の値がゼロになっていることを確認する。これは、予備のセクタ・FATの数・ルートフォルダの項目数・16bit表示の総セクタ数・32bit表示のFAT32の総セクタ数・FATあたりのセクタ数などのことである。1クラスタあたりのセクタ数はゼロよりも大きな値でなければならない。
FATやNTFSでは、ブートセクタのなかにパーティションのサイズに関する情報が書かれている。
TestDisk 6.5-WIP, Data Recovery Utility, October 2006 Christophe GRENIER <grenier@cgsecurity.org> http://www.cgsecurity.org Disk /dev/sda - 120 GB / 111 GiB - CHS 14593 255 63 Analyse cylinder 1011/14592: 00% FAT32 0 1 1 1010 254 63 16241652 [NO NAME] Stop
分析が終了すると、TestDiskは見つかったパーティション候補を一覧表示する。
TestDisk 6.5-WIP, Data Recovery Utility, November 2006 Christophe GRENIER <grenier@cgsecurity.org> http://www.cgsecurity.org Disk /dev/sda - 120 GB / 111 GiB - CHS 14593 255 63 Partition Start End Size in sectors * FAT32 0 1 1 1010 254 63 16241652 [NO NAME] P Linux 1011 0 1 1023 254 63 208845 [/boot] D Linux 1024 1 1 3573 254 63 40965687 D Linux RAID 1024 1 1 3573 254 63 40965687 [md0] D Linux 3574 1 1 4210 254 63 10233342 D Linux RAID 3574 1 1 4210 254 63 10233342 [md1] L Linux 4211 1 1 14592 254 63 166786767 Structure: Ok. Use Up/Down Arrow keys to select partition. Use LEFT/RIGHT Arrow keys to CHANGE partition characteristics: *=Primary bootable P=Primary L=Logical E=Extended D=Deleted Keys A: add partition, L: load backup, T: change type, P: list files, ENTER: to continue FAT32, 8315 MB / 7930 MiB
表示された候補のファイルシステムが、FAT・NTFS・ext2/ext3・ReiserFSの場合には、キーボードのPキーを押すことで、ルートに存在するフォルダ・ファイルのリストを見ることができる。
*注釈
TestDisk 6.5-WIP, Data Recovery Utility, October 2006 Christophe GRENIER <grenier@cgsecurity.org> http://www.cgsecurity.org * FAT32 0 1 1 1010 254 63 16241652 [NO NAME] Use right arrow to change directory, q to quit Directory / -rwxr-xr-x 0 0 805306368 20-Jul-2005 10:35 PAGEFILE.SYS drwxr-xr-x 0 0 0 14-Feb-2005 22:41 WINDOWS -r-xr-xr-x 0 0 4952 28-Aug-2001 15:00 Bootfont.bin -r-xr-xr-x 0 0 251712 3-Aug-2004 22:59 NTLDR -r-xr-xr-x 0 0 47564 3-Aug-2004 22:38 NTDETECT.COM -rwxr-xr-x 0 0 212 14-Feb-2005 22:51 BOOT.INI drwxr-xr-x 0 0 0 14-Feb-2005 22:47 Documents and Settings dr-xr-xr-x 0 0 0 14-Feb-2005 22:55 Program Files -rwxr-xr-x 0 0 0 14-Feb-2005 22:56 CONFIG.SYS -rwxr-xr-x 0 0 0 14-Feb-2005 22:56 AUTOEXEC.BAT -r-xr-xr-x 0 0 0 14-Feb-2005 22:56 IO.SYS -r-xr-xr-x 0 0 0 14-Feb-2005 22:56 MSDOS.SYS drwxr-xr-x 0 0 0 14-Feb-2005 23:02 System Volume Information -rwxr-xr-x 0 0 536399872 20-Jul-2005 10:36 HIBERFIL.SYS
見つかった候補を取捨選択し、パーティションテーブルを編集することができる。
3通りの編集機能が存在する。
記号 | 種類 |
---|---|
* | アクティブな基本領域 |
P | 基本領域 |
L | 論理領域 |
D | 領域として取り扱わない |
編集の状況によって、画面にOKあるいはBadと表示される。
Structure: Ok は、すべて問題がない場合に表示される。2つの拡張領域に挟まれている基本領域が無いこと、アクティブな基本領域が0または1個であること、互いに重なり合う領域が存在しないことなどの要件を全て満たしている必要がある。
パーティションテーブルの編集を完了したならば、Enterキーを押す。もしもユーザーが何か編集操作をした場合には、TestDiskは、編集した結果のデータをHDDのパーティションテーブルに実際に書き込むか([Write])、更に詳細な分析([Deeper Search])に移行するかを尋ねてくる。
TestDisk 6.5-WIP, Data Recovery Utility, October 2006 Christophe GRENIER <grenier@cgsecurity.org> http://www.cgsecurity.org Disk /dev/sda - 120 GB / 111 GiB - CHS 14593 255 63 Partition Start End Size in sectors 1 * FAT32 0 1 1 1010 254 63 16241652 [NO NAME] 2 P Linux 1011 0 1 1023 254 63 208845 [/boot] 3 E extended LBA 1024 0 1 14592 254 63 217985985 5 L Linux RAID 1024 1 1 3573 254 63 40965687 [md0] 6 L Linux RAID 3574 1 1 4210 254 63 10233342 [md1] 7 L Linux 4211 1 1 14592 254 63 166786767 [ Quit ] [Deeper Search ] [ Write ] Return to main menu
上の画面で[Write]を選ぶと、下の画面のように、本当に書き込んでよいかどうか最終確認を求めてくる。
TestDisk 6.5-WIP, Data Recovery Utility, October 2006 Christophe GRENIER <grenier@cgsecurity.org> http://www.cgsecurity.org Write partition table, confirm? (Y/N)