突然やってくる悲劇

電脳

まえがき

OSに関係したことではないが、突然起動しなくなって困ることは何年に1回かはやってくる。バックアップがあれば良いが、無い場合も以外と多い気がする。

ある日呼ばれて行くとかなり嫌な状態。回復できませんとか青いバーコードの画面 が見えている。

とりあえずUSBディスクを繋いでバックアップに挑む。コマンドラインから、notepadを起動して、右クリックからコピーと貼り付けが可能であれば、まだ軽傷。 このような詳細モードからのコマンドライン起動は、小さな Live Windowsが起動されて Xドライブなる。C:とやれば移動できる。ただC:ドライブにあるアカウントにアクセス するのでユーザー名とパスワードは必要になる。

軽傷でない場合は、このアカウントを読み出す事ができない場合や、C:ドライブにアクセス中にドライブが見えなくなるケースは重症だ。

復旧ツール

Windowsで吸い出すのは早々に諦め Ubuntuを使ってみた。OSは何でもいい。 Rufus(ルーファス)が有名らしく ubuntu imageを焼いた。 Rufasでなくても RaspberryPI Imagerでも良いかもしれない。 この辺は疎いのでスルーしてほしい。

今回は、 DellのノートPCなのでUSBから起動できるように変更する。 secure bootを disableに変更してbootデバイスを作成する。USBが挿してあれば 認識する。

USBから立ち上がったら、日本語を選びUbuntuを使ってみるで起動する。 gpartedとかで、ディスクの構成を確認すると良い。 パーティションが切ってあるだけなので、OSの部分は /dev/sda3として認識されている。この部分のデータだけを吸い出すこととする。

最初に吸出しツールとテストツールを入れる。

$ sudo add-apt-repository universe
$ sudo apt install gddrescue 
$ sudo apt install testdisk

LiveOSなので、ファイルに書いておいて別のサーバーに置いておくと良い。 sftpして実行するだけが簡単かと思う。

sudo ddrescue -d -f -r5 -v /dev/sda3 /dev/sdc dd.log

これもファイルにしておいて、何回も実行するとよい。dd.log は都度  put とgetをする。

dd.logには吸出し位置と不良セクタのエリアが記録される。 重症であればある程、再起動は必須になるからこのマップファイルは重要だ。 壊れたエリアにアクセスするとI/Oエラーが発生して認識しなくなる。

ubuntu@ubuntu:~$ ./ddres.sh
GNU ddrescue 1.23
About to copy 988180 MBytes from '/dev/sda3' to '/dev/sdc'
    Starting positions: infile = 0 B,  outfile = 0 B
    Copy block size: 128 sectors       Initial skip size: 19328 sectors
Sector size: 512 Bytes

Press Ctrl-C to interrupt
Initial status (read from mapfile)
rescued: 696486 MB, tried: 270240 MB, bad-sector: 270240 MB, bad areas: 69

Current status
     ipos:  972374 MB, non-trimmed:        0 B,  current rate:  63766 kB/s
     opos:  972374 MB, non-scraped:        0 B,  average rate:  34435 kB/s
non-tried:   15805 MB,  bad-sector:  270240 MB,    error rate:       0 B/s
  rescued:  702133 MB,   bad areas:       69,        run time:      2m 44s
pct rescued:   71.05%, read errors:        0,  remaining time:      1h 24m
                              time since last successful read:          0s
Copying non-tried blocks... Pass 1 (forwards)

これは1回目の吸出しで、non-triedが0になるまで高速に読む。 読めないところがあると、bad areasをカウントアップしてマークしてから、次のエリアを読む。

ubuntu@ubuntu:~$ ./ddres.sh
GNU ddrescue 1.23
About to copy 988180 MBytes from '/dev/sda3' to '/dev/sdc'
    Starting positions: infile = 0 B,  outfile = 0 B
    Copy block size: 128 sectors       Initial skip size: 19328 sectors
Sector size: 512 Bytes

Press Ctrl-C to interrupt
Initial status (read from mapfile)
rescued: 718045 MB, tried: 270134 MB, bad-sector: 270134 MB, bad areas: 69

Current status
     ipos:   91006 MB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:   91006 MB, non-scraped:        0 B,  average rate:   4362 kB/s
non-tried:        0 B,  bad-sector:  258669 MB,    error rate:  41323 kB/s
  rescued:  729510 MB,   bad areas:       70,        run time:     43m 47s
pct rescued:   73.82%, read errors:  5314062,  remaining time:         n/a
                              time since last successful read:         44s
Retrying bad sectors... Retry 1 (forwards)

に変わる。読み出しが進むと、 bad-sectorの容量が減っていく。 このRetryのブロックはログに – がマークされたブロックになる。 read errors がカウントアップするとI/Oエラーでディスクを認識していないので 止めてやりなおす。70エリア、300GB位が読みにくかった。 最終的には3エリア位が読めなかった。また読めないファイルも特定できた。 読めないところもあるので、その場合は諦める。

  --- snip --
0xDC7B650000  0x00010000  -
0xDC7B660000  0x24D000000  +
0xDEC8660000  0x00010000  -
0xDEC8670000  0x24D000000  +
0xE115670000  0x00010000  -
0xE115680000  0x4FEB80000  +

FreeBSDでも用意しておこう

FreeBSDの場合は、buildworldと buildkernelした環境をUSBに書いてインストーラーとしている。スクリプトにすれば、gpartしたり、 ZFSにしたり色々できて便利だ。

折角なので、この USBもUEFI対応に作りなおした。UEFIブートは gpartでEFIパーティションとfreebsd-ufsパーティションを作るだけで、ブートローダーはUEFIのお呪いを 書くだけなので難しくない。

pkg install ddrescue
pkg install testdisk
pkg install fusefs-ntfs
pkg install fusefs-sshfs

とかを入れてみた。FreeBSDも ntfsやsshfsでマウントできる。ただ fusefsのカーネルモジュールが必要だ。CloneZillaを使ったときに sshfsが便利だと思った。sambaの代わりに使えて便利だ。また Windowsのディスクもそのままマウントできる。 sshfsでマウントしたZFSなファイルシステムに ddrescureできる。また、vfs.usermount=1しておけばユーザレベルでsshfsマウントできる。

コメント

タイトルとURLをコピーしました