0. 概要
年末の忙しい時期にハードディスクのデータが全て消えるという体験はしたことがありますか?
先輩として忠告しておくと凄い悲しい気持ちになります。
そこで、頭記にもある意気込みでデータ復旧をしていったので、備忘録として残しておきます。
1. 前提条件
まず置かれている状況。
1.1. 状況
初めに、rm -rf *
を実行します。
目的とするソースコードやファイルが全て消えたことを確認してからがスタートラインです。
この状況から概ね以下の方法をとるでしょう。
- 急いで
やってしまったマシン
をシャットダウンする - 他のPCでLinuxのライブUSBを作成
- LinuxのライブUSBで
やってしまったマシン
を起動する - ライブOSから
やってしまったマシン
のディスクをfdisk -l
で見て確認 - 後は、
TestDisk
やext4magic
、foremost
、extundelete
を駆使してファイルを復旧
普通なら、ここまですれば凡そのファイルは復旧されます。
しかしながら、この場合でも頑なに復旧を拒まれる場合があります。
1.2. 条件
ここで現状の条件をまとめておくと、
-
TestDisk
やext4magic
、foremost
、extundelete
でファイルを復旧できない - ディスク自体は物理的に破損していない
- ハードウェアRaid 1+0
- ext4のファイルシステム
- 問題発生後すぐにシャットダウンしたのでinodeが切れているだけで論理的にはファイルが残っていそう
- データ復旧業者に断られる
最後は、データ復旧業者にお願いしたところTestDisk
やext4magic
、foremost
、extundelete
で復旧出来ない場合は、相当やってしまっているので無理ですと言われ、
どうしてもお願いしますと価格交渉したところ、最低でも100万円からですと言われました。
2. データを復旧する
まず物理的に逝ったわけではなく、インデックスが外れてしまっただけで目的とするファイルはディスク中の情報の海にいると仮定します。
そこでまずは、RAIDがややこしいのダンプして1つのファイルにします。その次にファイルを復旧させていきたいと思います。
dump
以下でダンプをする。
# 対象のディスクを確認する
$ sudo fdisk -l
> sda1
# ダンプする
$ dd if=/dev/sda1 of=./dump.img bs=512M
これで1つのファイルになった。
今回、復旧させたいのは主にソースコード。
そして、そのソースコードは多分、このダンプファイルのどこかにいる。
recover
ダンプファイルが1テラくらいあり、どこに何のデータがあるかなんてまるで見当もつかない。
そこで、ソースコードの1部を想像して、あるテキストのバイナリコードがあるところを引っ張ってくるようにする。
そう、Grepを使う。
grep -i -a -B[size before] -A[size after] 'SEARCH_TEXT' DEVICE > OUTPUT_PATH
-i
はケースセンシティブにしない(大文字小文字を区別しない)
-a
はバイナリサーチ
例えば、python
であれば#!/usr/bin/python
なんて書かれていたりする。
その場合は、こんな感じで使う。
grep -i -a -B10 -A1000 '#!/usr/bin/python' /dev/sda1 > ./backup.txt
これで地道にソースコードを追っていった結果、部分的に復旧することが出来た。
なお、画像なら画像のヘッダーを同様に検索にかければよい。
因みに\r
->^M
で検索を掛ければ大体のテキストを持ってこれる。
部分的にデータは引っ掛かるものの、この部分データから1つのファイルに成型していくのが、地獄の作業。
一先ず、この方法でかけらでも復旧できないようなら諦めた方が良さそう。
データは消さないに限る。