マイコミジャーナル

知りたい!を刺激する総合専門サイト


  1. ネット

  2. ニュース

【ハウツー】FD2枚でパーティションを復旧!(2) - データのサルベージとバックアップ

2003/11/10

○gpartでパーティションテーブルを推測

いよいよパーティションテーブルの復旧作業だ。パーティションテーブルは、ハードディスク内の各パーティションの位置やサイズ、ファイルシステムの種類等を記憶しているテーブルだ。OSはこのテーブルを参照して領域情報を得ているので、これが壊れると実際のパーティションが正常でも、一切ディスク上のデータを利用できなくなる。

パーティションテーブルの概念図

パーティションテーブルの情報、つまり各パーティションの開始位置や正確なサイズなどが全てわかっていれば、壊れてしまったテーブルを作り直すことは可能だ。しかしよほど用心深い人でもない限り、そんなメモは残していないだろう。そこで、実際のパーティションを解析し、そこからパーティションテーブルの「あるべき姿」を推測する必要がある。幸い大抵のファイルシステムの先頭には特徴的なブロックがあるので、それを手がかりにすればある程度パーティションテーブルの本来の姿を推測できる。BG-Rescue Linuxには、このためのツールとして「gpart」がある。

gpartに、引数として解析対象のデバイスを指定して実行してみよう。

rescue:/# gpart /dev/hda
Begin scan...
Possible partition(Windows NT/W2K FS), size(11515mb), offset(0mb)
Possible partition(Linux ext2), size(62mb), offset(11515mb)
Possible partition(Linux swap), size(125mb), offset(11578mb)
Possible partition(Linux ext2), size(2886mb), offset(11703mb)
attempt to access beyond end of device
03:00: rw=0, want=14944412, limit 14944410
End scan.

Checking partitions...
Partition(OS/2 HPFS, NTFS, QNX or Advanced UNIX): primary
Partition(Linux ext2 filesystem): primary
Partition(Linux swap or Solaris/x86): primary
Partition(Linux ext2 filesystem): primary
Ok.

Guessed primary partition table:
Primary partition(1)
type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX)
size: 11515mb #s(23583352) s(63-23583414)
chs: (0/1/1)-(1023/254/63)d (0/1/1)-(1467/254/58)r

Primary partition(2)
type: 131(0x83)(Linux ext2 filesystem)
size: 62mb #s(128520) s(23583420-23968979)
chs: (1023/254/63)-(1023/254/63)d (1468/0/1)-(1475/254/63)r

Primary partition(3)
type: 130(0x82)(Linux swap or Solaris/x86)
size: 125mb #s(257040) s(23711940-23968979)
chs: (1023/254/63)-(1023/254/63)d (1476/0/1)-(1491/254/63)r

Primary partition(4)
type: 131(0x83)(Linux ext2 filesystem)
size: 2886mb #s(5911920) s(23968980-29880899)
chs: (1023/254/63)-(1023/254/63)d (1492/0/1)-(1859/254/63)r

gpartからの出力は3つのブロックに分かれている。まず一つ目のブロックである「Begin scan」から「End scan」の間には、各パーティションのファイルシステムの種類及びサイズ、開始位置がおおまかに示される。2つめのブロックはパーティションの検査結果だ。そして、3つめのブロック「Guessed primary partition table:」以下が、各パーティションの詳細な推測情報だ。fdiskで新たにパーティションテーブルを作成し直すために必要な情報を、間違えないように正確にメモに書き写そう。全てを書き写さなくても、以下の重要な情報だけメモをとればよい。まず、「type」のかっこ内の16進で表された数値だ。例では、1番目のパーティションは「0x07」、2番目と4番目は「0x83」、3番目は「0x82」となっている。これはファイルシステムの種類を表す値で、「0x07」はNTFS、「0x83」「0x82」はそれぞれLinuxのext2、swapファイルシステムを表している。次に、「chs」行の後半「(0/1/1)-(1467/254/58)r」のように出力される値もメモに記録しよう。これはそのパーティションがディスク上のどこにあるかをCHS(シリンダ、ヘッド、セクタ)形式で表現した値だ。つまりこの例では、最初のパーティションは「0シリンダ」から「1467」シリンダまでを占めていることを表している。

○fdiskでパーティションテーブルを復旧

gpartの出力結果をメモにとったら、fdiskを起動してパーティションテーブルを作り直す。

rescue:/# fdisk /dev/hda

まず、現在のパーティションテーブルを確認してみよう。fdiskのプロンプトに続けて「p」と入力する。

Command (m for help): p
Disk /dev/hda: 15.3GB 15303075840 bytes
255 heads, 63 sectors/track, 1860 cylinders
Units = cylinters of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System

パーティションテーブルが消失しているため、本来は最下行に表示されるはずのパーティションが一切表示されない。そこで、gpartから得た情報を元に、テーブルを作り直そう。まず、最初のパーティションだ。fdiskの「n」コマンドで新規パーティションを作成する。パーティションの種類は、パーティション番号を指定すると、「最初のシリンダ」の入力を要求される。

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1860, default 1):

ここで、gpartで得た各パーティションの先頭シリンダの番号を入力する。但し、gpartがシリンダを「0」からカウントしているのに対し、fdiskが「1」からカウントしていることには注意しよう。gpartで「1467シリンダ」と表現された場合、fdiskでは1をプラスして「1468」と入力しなければならない。

パーティションが作成できたら再度プロンプトに「p」を入力し、パーティションテーブルを表示してみよう。

Command (m for help): p
Disk /dev/hda: 15.3GB 15303075840 bytes
255 heads, 63 sectors/track, 1860 cylinders
Units = cylinters of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 1 1468 11791678+ 83 Linux

Systemが「Linux」になっているが、gpartによればこのパーティションはNTFSだったはずだ。システムIDを書き換えてNTFSに変更しよう。プロンプトから「t」と入力し、パーティションを選択したら、gpartからtypeとして報告された16進数の値を入力する。NTFSは「0x07」だったので、「07」と入力しよう。

Command (m for help): t
Partition number (1-4): 1
Hex code(type L to list codes): 07

同様に、2番目以下のパーティションも作成し、システムIDをgpartの報告に合わせて変更する。全てのパーティションを作成できたら、fdiskの「w」コマンドでディスクにパーティションテーブルを書き込む。「ディスクのデータを消してしまうのではないだろうか」という心配が頭を過ぎるが、どのみちもうパーティションテーブルは壊れているのだ。ここでパーティションテーブルを書き込んでも、新たに失うものは何もない。

パーティションテーブルが復旧できたら、試しにパーティションをマウントしてみよう。例として、NTFSの第1パーティションを/mntディレクトリにマウントしてみる。

rescue:/# mount -t ntfs /dev/hda1 /mnt
NTFS: Warning! NTFS volume version is Win2k+: Mounting read-only
rescue:/# ls /mnt

パーティションテーブルが正しく修復できていれば、このパーティションに保存されていたファイルが見えるはずだ。

○ftpを使ってデータを避難

さて、もしこのディスクのバックアップをとっていないなら、中身が見えているうちに大切なファイルを安全な場所に避難しておきたい。パーティションが復旧できたように見えても、そこからきちんとOSが起動するとは限らないのだ。そこで、BG-Rescue Linuxのネットワーク機能を使って、ネットワーク上の他のホストにファイルをバックアップしてみよう。当然だが、BG-Rescue Linuxはただ起動しただけではNICにIPアドレスが割り当てられていないので他のホストと通信できない。まず、ifconfigコマンドを使ってIPアドレスを割り当てよう。

rescue:/# ifconfig eth0 192.168.0.5 netmask 255.255.255.0

外のネットワークとの通信が必要なら、ゲートウェイの設定も行う。

rescue:/# route add default gw 192.168.0.1

BG-Rescue Linuxはメモリ上に展開された仮想的なファイルシステム上で稼働しているので、CD-ROMから起動している場合でも、/etc/resolv.confを書き換えてDNSに名前解決させることもできる。

ネットワークに接続できたら、FTPで他のホストにファイルをバックアップしよう。接続までは一般的なLinuxのシェルやWindowsのコマンドプロンプトから実行するFTPコマンドと同じだ。

rescue:/# cd /mnt
rescue:/mnt# ftp 192.168.0.x (接続先FTPサーバのアドレス)

BG-Rescue Linuxに収録されているFTPクライアント「cmdftp」は、接続してから後の操作が一般的なFTPコマンドと多少異なる。リモートホストに対してあるディレクトリ以下のファイルを一気にバックアップしたければ、uコマンドを使用できる。例えば、マウントしたNTFSパーティションの中の「docs」フォルダ全体をサルベージするなら、次のようにすればよい。

cmdftp:/xxxxx> u docs/* docs

なおcmdftpで利用できる他のコマンドについては、プロンプトから「h」と入力してヘルプを参照して欲しい。

○まとめ

残念ながら、今回解説した方法でパーティションテーブルが常に元通りになるわけではない。ハードディスクドライブのアドレス管理はBIOSとの絡みでCHSやLBAなど様々な方法があり、OSによって起動可能なディスク上の位置の制限もあるため、単純に数字だけ合わせればいいというものでもないからだ。たとえその場では復旧できたとしても、fdiskで作り直したパーティションテーブルで運用し続けるよりは、なるべく早期にOSからクリーンインストールし直した方が安心なことに変わりはない。しかし、現実には障害が起きた時に大切なファイルのバックアップが残っていないこともあるだろうし、仕事の締め切り前でOSのインストールなどやっていられない場合もある。BG-Rescue Linuxのような、Linuxの利点を活かした障害復旧ツールは、不意のトラブルに対する緊急の回避策として現実的な対応を可能にしてくれるだろう。

(鶴田展之)

【ハウツー】FD2枚でパーティションを復旧!(1) - BG-Linuxのインストール
http://pcweb.mycom.co.jp/news/2003/11/10/16.html

BG-Rescue Linux
http://home.tiscalinet.ch/bgiannone/rescue/


画像で見るニュース(ネット)

特別企画


注目サイト