LinkStation LS-QLシリーズのHDDが壊れた為、HDDをパソコンに繋いで大切なデータだけでもコピーして、データをサルベージする作業をしていました。
ところが大量データのコピーと削除を繰り返すうちに誤ってコピー前のデータを消してしまうという事故が発生しました。
LinkStationのデータ部はLinuxのxfsというファイルシステム形式で出来ていて特殊です。
一度削除したファイルを元に戻す(undelete)ことが出来るのでしょうか?
調べてみたところ、testdiskと復旧天使が使えそうということが分かった為、チャレンジしてundeleteに成功しました。
本記事では、testdiskと復旧天使を使って、誤って消してしまったファイルを復活させる方法を詳しく解説します。
Linux版のUndeleteを探す
調べたら2つ出てきました。
・復旧天使(Raise Data Recovery for XFS)
復旧ソフト デモ版、体験版のダウンロード|復旧天使 公式
・TestDisk & PhotoRec
TestDisk Download - CGSecurity
復旧天使は有償のソフトで19,200円。
ただし、お試し版では無料で解析までは出来ます。
以前RDR for XFSという単体機能版もあったのですが今は販売終了しています。
TestDisk & PhotoRec はフリーソフトです。
復旧天使と比べると、痒い所に手が届かないソフトになっていますが、ちゃんとLinux版やLinuxソースまで公開しているので、ゴリゴリと動かす私には、こっちの方が合っています。
という訳でTestDisk & PhotoRecからチャレンジしました。
TestDisk & PhotoRec
せっかくLinkStationがLinuxなのだから、TestDiskもLinkStationに入れて使えたら便利ですね。
LinkStationに直接入れて使えるか
うちのLinkStation、LS-QLのアーキテクチャは、Marvellというツリーに属するようなので、Linux版、Marvell版、どちらも試してみました。
すると、Linux版は起動出来ませんでしたが、Marvell版は起動出来ました。
ところが・・・、
# ./photorec
./photorec: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
# ./testdisk /dev/md2
TestDisk 7.1-WIP, Data Recovery Utility, January 2016
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org
Terminfo file is missing.
Extract all files and subdirectories before running the program.
Press Enter key to quit.
このソフト、ユーザーインタフェースにcursesという、キーボードアクションのパラパラお絵描きを使っているため、LinkStationでは動きませんでした。
LinkStationにTerminfoを入れてTeraTermに認識させれば動きそうですが、Terminfoのインストールもかなりの壁でして、断念しました。
UbuntuのブータブルDVDでTestDiskを使う
TestDiskを使う環境はUbuntuのブータブルDVD-R(先日作ったもの)で起動されたパソコンです。
HDDを4つ繋いで、うち3つをRAID5のデグレードモードで/dev/md2に割り当てて、いざ出陣です。
もう何回同じことをやったか分かりません。目をつむっても出来そうです(笑)。
TestDiskの公式ホームページ
TestDisk Download - CGSecurity
からTestDiskをダウンロードします。拡張子は見慣れない bz2 というものが付いていました。
これは、bunzip2 というコマンドで解凍出来ました。
# bunzip2 testdisk-7.0.linux26-x86_64.tar.bz2
あとは tar xvpf コマンドで展開すれば出来上がりです。
インストーラーとかはありません。いきなり実行です。
# ./photorec_static
これであとは画面に従うだけです。
testdisk_static というコマンドも入っていますが、photorec_static から呼ばれる仕組みになっているので、直接実行する必要はありません。
photorecの使い方
コマンド実行後の使い方は、公式ホームページのOnline Documentが分かりやすいです。
TestDisk: undelete file for FAT - CGSecurity
この例ではFATのファイルを復旧していますが、XFSの場合もほぼ同じ画面の流れで出来ました。
・ログは Create を選ぶ
・Disk選択画面では /dev/md2 を選んで Proceed (事前に unmount しておく必要あり)
・Partition選択画面では XFS と書かれているところを選択
・Option はデフォルトが一番良いようです。Paranoid は「Yes (Brute force disabled)」にする。
・File Opt でファイルの種類が選べます。aviの場合はriffを選びます。
・Search を押すと次に進みます
・パーティションタイプは Other を選びます
・次に 復旧したファイルの保存先を選ばされます。とりあえず一番広く空いているパーティションを選択して、実行です。
これで、続々とファイルが復活して、最後に選んだパーティションに放り込まれます。
サルベージファイルの肥大化
TestDiskは、復旧出来そうなファイルを、どんどん無条件で保存用パーティションに書き込んでいくので、今回のように元のDiskが大きい時は、サルベージ用のパーティションもあっという間に溢れます。
そのため、本当に復旧したいファイルを残し、不要なサルベージファイルを削除する作業が必要になります。
実際やってみると、復活させたいファイルは、ほんの10個程度なのに、同じ拡張子のファイルが、暗号のようなファイル名になって、数百個とサルベージされて来ます。
これは、本当に過去、存在したファイルもあれば、動画編集・音声編集などを行った時のテンポラリファイルもあります。
今回対象とした「riff」というファイル種別には、aviファイルやwavファイルが含まれますが、ファイルの断片を見てそれに近いと思われるファイルがあれば、全て、復旧させてしまうようです。
保存用パーティションが溢れると、TestDiskは一時停止します。
そして、保存用パーティションが整理され、空きが増えると、自動的にサルベージを再開します。
多くの場合、ファイル名が正しく戻りませんので、一個一個中身を確認していたら日が暮れます・・。
TestDiskでの復旧に限界が見えてきましたね。
復旧天使の併用
そこで登場するのが「復旧天使」です。
復旧天使は優秀なサルベージソフトで、復旧されるファイルの「ファイル名」「サイズ」が、かなり正確に分かります。
ファイル名は日本語のファイルも正しく日本語で表示されますので、まさに神です。
「復旧天使」は有償ソフトですが、無料お試し版でも「ファイル名」と「サイズ」を調べるところまでは出来ますので、今回のように「TestDisk」が既に使えるようになっている状況では、「無料お試し版で十分使える」ことが分かります。
復旧天使で復旧したいファイルの「ファイル名」と「サイズ」を調べる
↓
TestDiskで上記に該当しないファイルは復元したそばから「削除」する
上記の事を無限に回していけば、何百個サルベージされようと怖いものなし!です。
復旧天使のインストール
復旧天使のホームページから「Standard RAID の Linux版」をダウンロードします。
(StandardでもLinkStationのソフトRAIDなら使えるはずですが、念の為上位ソフトを選んでいます)
・復旧天使(Raise Data Recovery for XFS)
復旧ソフト デモ版、体験版のダウンロード|復旧天使 公式
standard-raid.tar.z というファイルが落ちてきました。懐かしい compress 形式です。
しかし、Ubuntu には uncompress なんていうコマンドはありません。gzip に置き換わっているからです。
# uncompress standard-raid.tar.z
gzip: standard-raid.tar.z: not in gzip format
#
ここでハマると前に進めません。答えは以下の通りです。
# tar xvpf ./standard-raid.tar.z
r-angel-jp-standard-raid.install
#
なんと、tar が自動認識して勝手に uncompress して展開まで全部やってくれちゃいます。
インストーラーが出てきたので、インストールします。
# ./r-angel-jp-standard.install
Starting software installation...
Assuming 64bit Linux
Unpacking software manager...
Stating Software Manager via sudo
Software Manager is exited with code 1
#
失敗してしまいました。TeraTermからでは駄目なようです。
気を取り直して、GUI から実行したら、あっさり成功です。
インストーラーがGUIを使っていたのですね。
復旧天使によるスキャン
インストールが成功すると、復旧天使も自動起動されます。
あとは画面に従って以下の通り、ファイルを探させます。
・ウィザードモード で実行する(アドバンスドモードは今回の目的には合いません)
・詳細スキャン を実行する
詳細スキャンは5時間くらいかかります。
ついつい省略したくなりますが、削除済みのファイルのファイル名まで知りたい場合は、必ずこの詳細スキャンを全部やってください。
これをやらないと、TestDiskで得られた結果と同じものを、復旧天使でも見ることになり、唖然としますので(笑)。
さて、
5時間ほど待った結果、ちょっと粗いですが、123MB、1.2GB といった有効桁数で、復活させたい対象ファイルのファイルサイズを割り出すことが出来ました。
本当はサルベージしたいファイルの位置(セクター番号)まで教えてくれると嬉しいのですが、それは機能に無いようでした。
TestDiskと自動削除プログラム
サルベージ対象ファイルが判明したところで、再度、TestDiskを回すんですが、今度は「不要な復元ファイルを復元されたそばからどんどん消していくプログラム」をTestDiskと一緒に横で動かし続けることにしました。
というのも、TestDeskで復元させると、数百個・・ではなくて数千個、復旧してしまうことが分かった為です(爆)。
どんなんや・・という感じですが、そういう仕様なので。
ちなみに、数千個のファイルを1つのフォルダに集めると、フォルダのインデックスが大きくなり過ぎて、もはや、そのフォルダは、開くことも出来なくなってしまいます。
TestDiskは、500個ファイルをサルベージする毎に、新しいフォルダを作って、そこにまた500個のサルベージファイルを置きます。そんなフォルダが大量に作られる訳です。
あと、3TBのRAID5パーティションを走査すれば、3TB近い量のファイルをサルベージしますので、その置き場所も不足します。
復元させたそばから消していかないと間に合わない理由が分かりましたね!
自動削除スクリプト:一作目
まず最初に作ったプログラム(シェルスクリプト)をご紹介。
ファイル名は「findmovedelete」とし、/mnt/disk1/recovered/findmovedeleteに配置
mkdir -p /mnt/disk1/delete
mkdir -p /mnt/disk1/recovered
cd /mnt/disk1/recovered
find -maxdepth 2 -type f -name \*.wav -exec mv '{}' ../delete \;
sleep 1
find -maxdepth 2 -type f \( -not -name \*.xml -a -not -name find\* \) \( -size -698M -o -size +1182000000c \) -exec mv '{}' ../delete \;
find -maxdepth 2 -type f \( -not -name \*.xml -a -not -name find\* \) \( -size +700M -a -size -805M \) -exec mv '{}' ../delete \;
find -maxdepth 2 -type f \( -not -name \*.xml -a -not -name find\* \) \( -size +806M -a -size -919M \) -exec mv '{}' ../delete \;
find -maxdepth 2 -type f \( -not -name \*.xml -a -not -name find\* \) \( -size +920M -a -size -1G \) -exec mv '{}' ../delete \;
sleep 5
cd /mnt/disk1/delete
# find -maxdepth 1 -type f -exec rm '{}' \;
注) 実際に使う時には最終行の # を削除する必要があります。まずは削除せず移動するだけのスクリプトとし、テストしてみてから使うと安心です。
上記スクリプトでやっていることは、
・拡張子 .wav のファイルを delete フォルダに移動
・ファイルサイズが 698M, 699M, 805M, 919M, 1.0G のファイルを残し、それ以外を delete フォルダに移動
・delete フォルダにある全てのファイルを削除
という処理です。
698M, 699M, 805M, 919M, 1.0G は復旧天使でリストアップされた復元対象ファイルのサイズです。
復旧天使のファイルサイズの表示形式と有効桁数に合わせて作りました。
スクリプトのcron登録
上記は1回分なので、これを自動で何回も走らせるには、cron に登録してあげれば良いです。
その場合の crontab の書き方は、以下の通り。
*/5 * * * * /mnt/disk1/recovered/findmovedelete
上記をファイルに記載して以下のように取り込めば、5分毎に実行してくれます。
# crontab [作成したファイル名]
TestDiskは3TBをサルベージするのに8~9時間かかりますが、その裏で、上記スクリプトが掃除をしてくれれば、空き容量の少ないバックアップディスクだったとしても、目的のファイルだけ残してくれるという訳です。
「rm *」は万能ではない
スクリプトも作ったし、バッチリ! と思ったのですが、朝スタートさせて夜、家に帰ってくると、パソコンがハングしてしまっている・・・という状況に陥りました。
見てみると、TestDiskがサルベージしたファイルの数が多すぎて、Diskが溢れていました。
スクリプトの頻度・内容について、もう少しバージョンアップが必要です。
話は少しそれますが、大量のファイルをLinuxで扱う時、少し注意しなければならないことがあります。
それは「rmコマンドで大量のファイルを一度に消せない」ということです。
私のスクリプトでも find の exec オプションを使って、ファイルを一個一個削除しているのですが、その理由がこれです。
rm * の方が一度にファイルを消せるのですが、* に該当するファイルが数千個あったら、
-bash: /bin/rm: Argument list too long
と言われ、実行出来ません。
これの回避のために使っているのが、find の exec オプションです。しかし、一個一個処理しているので、時間が少しかかるのが難点です。
TestDiskのカスタマイズ
さて、話を戻して、TestDiskのサルベージファイルの多さをどうするか? ですが、これは、サルベージするファイルの種類を絞っていないことが原因です。
TestDiskのメニューで「File Opt」というオプションがあり、ここでサルベージするファイルの拡張子を選べます。
これを .avi など、目的のファイル名だけに絞るというのが1つの方法です。
しかし、やってみると分かるのですが、元々のファイル名が *.avi だったとしても、サルベージされた結果、別の拡張子ファイルとして抽出される場合が、よくあります。
.mp4、.ogg、.mpg などです。
これは TestDisk のサブプログラムが、拡張子不明のファイルを自動判定して、拡張子を決定しているために、起こります。
そこで、最初はデフォルトの状態にし、そこから試行錯誤して、「サルベージしてはいけない拡張子」を見つけ出しました。
・*.ts などのストリームファイル
・*.xfs などのファイルシステムブロックファイル
・*.jpg などの画像ファイル
・*.txt などのテキストファイル
・*.mp3 などの音楽ファイル
上記に代表されるファイルは、実際サルベージしてみると「作った覚えがない大量のデータとして分割されて」抽出される傾向があります。
とくに *.ts *.txt *.jpg *.mp3 といったファイルは、ファイルシステムの中で分断されしまっても、そのデータの一部だけでも、それらのファイルとして認識されてしまうらしく、バラバラになったものが、一個一個ファイルとして抽出されますので、長く使っていたハードディスク程、大量に出ます。
サルベージしたいファイルが *.ts だった場合は諦めるしかないのですが、まずは4~5分TestDiskを走らせてみて、余りにも大量に出るファイルは、チェックボックスを外すことです。
拡張子の種類を減らせば、TestDiskの結果もだいぶ追いついてきます。
ちょっと手間ですが、このツールは、こうやって cut and try を繰り返して使うもののようです。
対象ファイルのサイズをより正確に知る
復旧天使の走査結果がちょっと荒いファイルサイズだったので、偶然も必要ですが、もう少し正確なファイルサイズが分かれば、自動削除スクリプトを改善出来ます。
ファイルを消してしまう前に、何らかの操作のログが残っていれば、ターゲットとするファイルの正確なファイルサイズが byte 単位で判明しているケースもあるはずです。
Windows上で「ファイルのプロパティ」で表示した場合
Linux上で「ls -l」コマンドで表示した場合
などがあり得ます。TeraCopyの操作のキャプチャーにも正確なサイズが残っています。
私の場合、TeraCopyでの操作ミスが原因でしたので、TeraCopyの操作後のキャプチャーから判明しました。
操作後に真っ青になってしまって、とりあえずキャプチャ画像に残したのが良かったです。
自動削除スクリプト:二作目
ここまでに追加で分かった情報を元に、自動削除スクリプトをバージョンアップしました。
スクリプトは以下のようなものです。
mkdir -p /mnt/disk1/delete
mkdir -p /mnt/disk1/match
cd /mnt/disk1/recovered
find -maxdepth 2 -type f -name \*.wav -exec mv '{}' /mnt/disk1/delete \;
sleep 1
find -maxdepth 2 -type f \( -size 964990484c -o -size 845003342c -o -size 733445874c -o -size 1169178784c -o -size 732069316c -o -size 733214402c -o -size 964176780c \) -exec mv '{}' /mnt/disk1/match \;
sleep 15
find -maxdepth 2 -type f \( -size 964990484c -o -size 845003342c -o -size 733445874c -o -size 1169178784c -o -size 732069316c -o -size 733214402c -o -size 964176780c \) -exec mv '{}' /mnt/disk1/match \;
find -maxdepth 2 -type f \( -not -name \*.xml -a -not -name find\* \) \( -not -size 964990484c -a -not -size 845003342c -a -not -size 733445874c -a -not -size 1169178784c -a -not -size 732069316c -a -not -size 733214402c -a -not -size 964176780c \) -exec mv '{}' /mnt/disk1/delete \;
sleep 5
cd /mnt/disk1/delete
# find -maxdepth 1 -type f -exec rm '{}' \;
使用上の注意事項は前回と同じです。
今回やっていることは以下の通り。
・ファイルサイズが、964990484bytes、845003342bytes、、、、に該当するファイルは match フォルダに移動
(今回TeraCopyスクリーンショットから正確なサイズが判明したため出来ました)
・ファイルサイズに該当しないファイルで、*.xml とスクリプト自身を除く全てのファイルを delete フォルダに移動
・少し寝かしてから delete フォルダの配下のファイルを全部削除
途中、同じことを2回やっているのは、大きなファイルの場合、TestDiskがファイル抽出してファイルを作成するまでに数秒間かかるため、その途中の段階で処理されてしまわないように、2度実施しています。
このスクリプトは、5分間隔で自動起動されるように、crontab で設定しました。
*/5 * * * * /mnt/disk1/recovered/findmovematch
この方法はうまくいきました。
TestDiskのパラメタも調整したので、ダブルでうまくいったようです!
Windows10にアップグレードしたら、LinkStationのHDDが壊れて立ち上がらなくなり、パソコンからLinuxの機能を駆使して完全復旧させた私の体験の一部始終を読みたい方は、以下の記事から進んで下さい。
コメント