〔久留米市内の某事業所様のパソコンのシステム復旧・リカバリの依頼です。〕

お客様のノートPC(HP Pavilion g6)が、スタートアップの修復が表示されたまま、終わらない状態に陥りました。(OSは、Windows7 Pro SP1)

持ち込み診断をしました。

【前提条件】

  1. スタートアップの修復が終わらない 
  2. 症状が発症して短期間である

お客様の話によると、スタートアップの修復が終わらなくなったのは、数日前からとのことでした。修復が終わらないので強制的に電源を切って、電源を入れなおしても、スタートアップの修復が走って、、、、、、その繰り返しだったそうです。

この症状が出てまもないので、恐らく、まだ、ハードディスクは致命的な状態ではないと想像できます。データの抽出くらいなら、大丈夫でしょう。(うまくいけば、システム全体をバックアップ・リストアできるかも?)

<手順>

  1. ハードディスクのエラーチェック 
  2. データバックアップ 
  3. データ抽出 
  4. 番外:バックアップのリストア

1.ハードディスクのエラーチェック

LiveCD(Ubuntu14.04)でブート後、SMART(履歴)を見ると、Reallocated sector countの値が24となっておりました。しかし、「このディスクは正常です」と表示されています。閾値を超えていないためなのでしょう。念の為に、selftest(ショート)を実行しようと実行ボタンをクリックすると、readエラーが発生し、selftestが停止しました。

dscn1140おそらく、ハードディスクに物理的な障害が発生しているのかもしれません。さっそく、バックアップを取ることにしました。

Systemrescuecdで、ブート後、fdisk -lをしてみると、

SMARTのselftestを実行する前に見たときは、下記のように表示されていましたが、

Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x67bfeb21

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1  *         2048    409599    407552   199M  7 HPFS/NTFS/exFAT
/dev/sda2          409600 947939327 947529728 451.8G  7 HPFS/NTFS/exFAT
/dev/sda3       947939328 976560127  28620800  13.7G  7 HPFS/NTFS/exFAT
/dev/sda4       976560128 976771071    210944   103M  c W95 FAT32 (LBA)

selftest失敗後に、見ると、Size(サイズ)がとんでもないことになっていました。sdb2(Windowsで、Cドライブ)がなんと3.5Tとなっています。ハードディスクの全容量は約500GBです。

root@sysresccd /root % fdisk -l
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 122096646 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x67bfeb21

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sdb1  *         2048    409599    407552   1.6G  7 HPFS/NTFS/exFAT
/dev/sdb2          409600 947939327 947529728   3.5T  7 HPFS/NTFS/exFAT
/dev/sdb3       947939328 976560127  28620800 109.2G  7 HPFS/NTFS/exFAT
/dev/sdb4       976560128 976771071    210944   824M  c W95 FAT32 (LBA)

(修復元の旧ハードディスクは最初はsdaです。そのあと、PCから取り外して新ハードディスクと交換し、USBで接続したので、/sdbとなっています。)

dscn1128パーティションテーブルが壊れているようです。原因は、ハードディスク上のセクタに読み込み不良部分があるからでしょう。

testdiskをすると一応、パーティションの候補が表示されます。グリーン(正常)で表示されているパーティションもあるのでまだ完全に破壊されているようではなさそうです。(参考:testdiskのマニュアルサイト

とにかく、いろいろ調べたり、修復を試みる前に、バックアップを取っておきます。(不用意にSMARTを実行すると、壊れかけたハードディスクに致命症を負わせることがあります。できれば、すぐにバックアップをとってそれからチェックした方が安全ですね。)

2.データバックアップ

ddrescueコマンドを利用します。(最初、GNU ddrescue 1.18.1で、バックアップしてみましたが、データが壊れており、利用できませんでした。そこで、最新のSystemrescuecdをダウンロードし、それでブートしてddrescueを実行しました。ddrescueは最新版(1.20)になっていました。)

/mnt/backupディレクトリには、さらに、外部USBハードディスク(/sdc1)を装着し、マウントしています。バックアップ用のイメージファイルを保存するためのハードディスクです。全容量は1TBです。

ntfs-3g /dev/sdc1 /mnt/backup

最初は、エラーを読み飛ばして、ざっとデータをイメージファイルに吸い出します。そのとき、エラーの箇所はlogfileに書き出します。エラは4個あるようです。なお、/sdbは、外部USB接続の旧ハードディスクです。

root@sysresccd /root % ddrescue -f -n /dev/sdb /mnt/backup/hdd.img logfile
GNU ddrescue 1.20
Press Ctrl-C to interrupt
rescued:   500107 MB,   errsize:      2048 B,    current rate:   15360 B/s
   ipos:    92779 MB,    errors:         4,      average rate:  12074 kB/s
   opos:    92779 MB,  run time: 11h 30m 18s,  remaining time:          2s
time since last successful read:          0s
Finished

2回めは、logfileを元にエラー箇所を3回リトライして読み込みます。エラーが2個に減りました。

root@sysresccd /root % ddrescue -d -f -r3 /dev/sdb /mnt/backup/hdd.img logfile
GNU ddrescue 1.20
Press Ctrl-C to interrupt
Initial status (read from mapfile)
rescued:   500107 MB,  errsize:    2048 B,  errors:       4

Current status
rescued:   500107 MB,   errsize:     12288 B,    current rate:       0 B/s
   ipos:    92779 MB,    errors:         2,      average rate:       0 B/s
   opos:    92779 MB,  run time:          1s,  remaining time:         n/a
time since last successful read:          1s
Finished

3回目です。再度読み込みのリトライを3回実行してみます。エラーは2個のままで、変化なしです。理想は0個ですが、まぁ、ハードディスクが壊れかけていることを考えればよしとします。これで、バックアップは完了です。

root@sysresccd /root % ddrescue -d -f -r3 /dev/sdb /mnt/backup/hdd.img logfile
GNU ddrescue 1.20
Press Ctrl-C to interrupt
Initial status (read from mapfile)
rescued:   500107 MB,  errsize:   12288 B,  errors:       2

Current status
rescued:   500107 MB,   errsize:     12288 B,    current rate:       0 B/s
   ipos:    92779 MB,    errors:         2,      average rate:       0 B/s
   opos:    92779 MB,  run time:          1s,  remaining time:         n/a
time since last successful read:          1s
Finished

ちなみに、ログファイルの中身は、次のようなものでした。

# Mapfile. Created by GNU ddrescue version 1.20
# Command line: ddrescue -d -f -r3 /dev/sdb /mnt/backup/hdd.img logfile
# Start time:   2016-06-16 18:34:43
# Current time: 2016-06-16 18:34:43
# Finished
# current_pos  current_status
0x159A1E0E00     +
#      pos        size  status
0x00000000  0x00B59000  +
0x00B59000  0x00001000  -
0x00B5A000  0x1599685000  +
0x159A1DF000  0x00002000  -
0x159A1E1000  0x5ED6A25000  +

下記の内容によると、ポジション0x00000000で、サイズ0x00B59000バイトのデータをステータスが+(finished block)で、読み込みが完了しています。-(failed block bad-sector(s) )は、読み込み失敗のようです。-が2個あるので、失敗したブロックは2箇所なのでしょう。ddrescueのマニュアルサイトを参考にしました。

#      pos        size  status
0x00000000  0x00B59000  +

とあるので、先頭のブロックを読み込んでいます。うまくすればパーティションテーブルも読み込まれているかもしれません。

3.データ抽出

では、さっそく、バックアップしたイメージファイルからデータを抽出してみます。loopとoffsetオプションを利用します。offset値を算出するため、抽出したいパーティション(今回は、Cドライブなので、)/sda2のstartを読み取ります。

fdisk -lu /mnt/backup/hdd.img

start値が409600だったので、offset値は、40966×512=209715200となります。

mount -o loop,offset=209715200 /mnt/backuphdd.img /mnt/windows

/mnt/windowsは、最初から、Systemrescuecdに準備されているディレクトリです。この/mnt/windowsディレクトリに抽出されたファイル、とくに\user内にお客様のアカウント名のディレクトリがあり、さらにその中を覗いてみると、ドキュメントやピクチャなど問題なく表示されています。実際には、Windowsを起動してExcelやWordが開けるかテストをするために、これらのファイルを先ほどの外部USBのハードディスク(現在は、/mnt/backupディレクトリにマウント中)にあらたにbk-dataディレクトリをつくります。

mkdir /mnt/backup/bk-data/

cp -R /mnt/windows/* /mnt/backup/bk-data/

このあと、マウントを解除後、

unmount /mnt/backup/bk-data/

Windowsが起動しているパソコンに接続して、ファイルを確認してみました。無事に、ファイルを開くことができました。あとは、このデータを新ハードディスクにコピーすれば、データの抽出は完了です。(ただし、新ハードディスクには現在、OSはインストールされていません。したがって、データをコピーしただけなので、Windows7は起動しません。次の、4.を実際には先にやってみました。)

4.番外:バックアップのリストア

データを新ハードディスクにコピーする前に、試して見る価値がありそうなことが、残っています。

つまり、hdd.imgの内容をすべて、新ハードディスクにリストアするのです。

お客様からは、できれば、元の状態で使いたいとご要望がありました。
もし、新規にOSをインストールすると、そのインストールの手間や、各種ソフト類の再インストールと設定、メール設定もふくめネットワーク関連の設定などなど、とっても面倒でございます。

では、さっそくddコマンドいやddrescueコマンドで新ハードディスクにリストアしてみます。hdd.imgは、先と同様、/mnt/backupにマウントされているとします。新ハードディスクは、/sdaとします。

ddrescue -f -n /dev/sda /mnt/backup/hdd.img

データの転送が終わったら、パソコンをシャットダウンし、Systemrescuecdを取り出し、起動させます。

緊張の一瞬です。
すると、、、、、スタートアップの修復が表示され、その実行後、Windows7が普通に起動しました。(祝)

dscn1135

復活の途中のWindows7>>スタートアップの修復が成功すれば完了

念の為にコマンドプロンプト(Windows7上で実行)で、

chkdsk c: /f

をしてディスクをチェックします。特にエラーもなく完了しました。

新ハードディスクは約750GBなので、空いているディスク領域に先ほどリストアしたデータをコピーして、お客様に納めました。システム自体は今までと同じなので、すぐに業務を再開でき、とても喜んでもらえました。