まえがき
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マウントできる。
コメント