ddrescue リカバリの試行によって失われたファイルを見つけるにはどうすればよいですか?

ddrescue リカバリの試行によって失われたファイルを見つけるにはどうすればよいですか?

私は1TBの故障したドライブからデータを救出中です(ハードディスクを交換する手順は?ddrescue)。システム レスキュー USB から実行したところ、エラー サイズは 557568 B で、エラーは 191 件 (おそらくすべて) でした/home(「エラー」と呼ばれるものは不良セクタではなく、連続したセクタのシーケンスであると想定しています)。

さて、私が見たいくつかのガイドでは、e2fsck新しいディスクで を実行することを提案しており、これにより、一部のファイルに「空のセクター/ブロック」が割り当てられていることが何らかの形で検出され、少なくともどのファイルを丸ごと保存できなかったかがわかるだろうと期待していました。しかし、エラーはまったく見つかりませんでした (-y何も見逃していないことを確認するために なしで実行しました)。現在、 で再度実行しています-cが、95% の時点では、これまでのところエラーは見つかりませんでした。新しいドライブには、内部にゼロまたはランダムな部分がある、正常に見えるファイルがいくつかあり、対応するソフトウェアで開くまで検出されないか、Linux Mint で必要になると思われます。

破損している可能性のあるファイルのリストを取得するために、古いドライブと新しいドライブで何かできますか? 191 個のファイルが複数のファイルに存在する可能性があるため、ファイルがいくつあるかはわかりませんが、少なくとも合計サイズは大きくありません。私が心配しているのは、古い家族の写真やビデオ (それぞれ 1 MB 以上) の大きな束で、残りはおそらく無関係か、最近バックアップされたものです。

更新: e2fsck の新しいパスにより、私がまったく理解していない新しいものが得られました:

Block bitmap differences:  +231216947 +(231216964--231216965) +231216970 +231217707 +231217852 +(231217870--231217871) +231218486
Fix<y>? yes
Free blocks count wrong for group #7056 (497, counted=488).                    
Fix<y>? yes
Free blocks count wrong (44259598, counted=44259589).
Fix<y>? yes

答え1

遭遇したすべての不良ブロックのブロック番号が必要になります(ddrescueリストが提供されるはずですが、保存してあることを願っています)。次に、どのファイルがこれらのブロックを使用しているかを調べる必要があります(例を参照)。ここ) 不良ブロックが多数ある場合は、これをスクリプト化することをお勧めします。

e2fsck役に立ちません。ファイル システム自体の一貫性をチェックするだけなので、不良ブロックに「管理」ファイル システム情報が含まれている場合にのみ動作します。

ファイル内の不良ブロックは空になります。

編集

さて、ブロック サイズについて考えてみましょう。512 バイトのデバイス ブロックを持つテスト用のファイル システムを作成しましょう。

$ dd if=/dev/zero of=fs bs=512 count=200
$ /sbin/mke2fs fs

$ ll fs
-rw-r--r-- 1 dirk dirk 102400 Apr 27 10:03 fs

$ /sbin/tune2fs -l fs
...
Block count:              100
...
Block size:               1024
Fragment size:            1024
Blocks per group:         8192
Fragments per group:      8192

したがって、ファイルシステムのブロック サイズは 1024 で、ファイルシステム ブロックは 100 個あります (および 512 バイトのデバイス ブロックが 200 個あります)。これを修復します。

$ ddrescue -b512 fs fs.new fs.log
GNU ddrescue 1.19
Press Ctrl-C to interrupt
rescued:    102400 B,  errsize:       0 B,  current rate:     102 kB/s
   ipos:     65536 B,   errors:       0,    average rate:     102 kB/s
   opos:     65536 B, run time:       1 s,  successful read:       0 s ago
Finished                                     

$ cat fs.log
# Rescue Logfile. Created by GNU ddrescue version 1.19
# Command line: ddrescue fs fs.new fs.log
# Start time:   2017-04-27 10:04:03
# Current time: 2017-04-27 10:04:03
# Finished
# current_pos  current_status
0x00010000     +
#      pos        size  status
0x00000000  0x00019000  +

$ printf "%i\n" 0x00019000
102400

したがって、16 進ddrescue単位はブロックではなくバイトです。最後に、何がdebugfs使用されているかを確認しましょう。まず、ファイルを作成し、その内容を確認します。

$ sudo mount -o loop fs /mnt/tmp
$ sudo chmod go+rwx /mnt/tmp/
$ echo 'abcdefghijk' > /mnt/tmp/foo
$ sudo umount /mnt/tmp

$ hexdump -C fs
...
00005400  61 62 63 64 65 66 67 68  69 6a 6b 0a 00 00 00 00  |abcdefghijk.....|
00005410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

したがって、データのバイト アドレスは です0x5400。これを 1024 バイトのファイル システム ブロックに変換します。

$ printf "%i\n" 0x5400
21504
$ expr 21504 / 1024
21

ついでにブロック範囲も試してみましょう:

$ /sbin/debugfs fs
debugfs 1.43.3 (04-Sep-2016)
debugfs:  testb 0
testb: Invalid block number 0
debugfs:  testb 1
Block 1 marked in use
debugfs:  testb 99
Block 99 not in use
debugfs:  testb 100
Illegal block number passed to ext2fs_test_block_bitmap #100 for block bitmap for fs
Block 100 not in use
debugfs:  testb 21
Block 21 marked in use
debugfs:  icheck 21
Block   Inode number
21      12
debugfs:  ncheck 12
Inode   Pathname
12      //foo

ブロック0が無効であることを除いて、これは予想どおりに動作します。おそらく、ファイルシステムのメタデータがそこにあるためです。したがって、0x30F8A71000からのバイトアドレスについてはddrescue、パーティションではなくディスク全体を操作したと仮定すると、パーティションの開始バイトアドレスを減算します。

210330128384 - 7815168 * 512 = 206328762368

それをブロック サイズで割るtune2fsと、ファイル システム ブロックが得られます (複数の物理ブロック (破損している可能性もあります) がファイル システム ブロックを構成するため、数値は必ずしも正確な倍数である必要はありません)。

206328762368 / 4096 = 50373233.0

そして、それはあなたがテストする必要があるブロックですdebugfs

答え2

NTFS、ext3、ext4

故障したドライブからデータをコピーした後ddrescueddrutility影響を受けるファイル名を見つけます。

ddrescueマップファイルを指定して、20 秒以内に1TB パーティション上の影響を受ける N​​TFS ファイルを一覧表示することに成功しました。

ログ ファイルを現在のディレクトリに書き込みます。

リンク先のページには、NTFS、ext3、ext4 のサポートについて記載されています。

btrfs、zfs

これらのファイルシステムには独自の組み込みscrub関数があります。

答え3

すでに実装されている というユーティリティをお勧めしますddrutility。これにより、手作業による面倒な計算が不要になります。

クローン上で実行する必要がありますコピー(オリジナルではない) ドライブデバイスは次のようになります。

ddru_findbad /dev/sdb /ddrescue-disk-copy.map

ここではマップ ファイル (2 番目の引数) の使用が必須です。

このユーティリティは非常にスマートで、さまざまなファイルシステム (NTFS も含む) をサポートし、まだ分割されていないエラーのあるセクターをテストする機能 (一時的に不良としてマークする) も備えているため、手順全体をddrescue完了する必要があるかどうかを見積もることができます。また、ディスク全体が元々クローンされているため、/dev/sdbここでは がディスク全体 ( のようなパーティションではない/dev/sdb1) として使用されていることに注意してください。

このユーティリティは Debian リポジトリで入手でき、次のコマンドでインストールできます。

sudo apt install ddrutility

プロジェクトのウィキ:https://sourceforge.net/p/ddrutility/wiki/ホーム

答え4

私は Filezilla をシンプルに使用して問題を解決しました。通常の Filezilla を使用して、すべての正常なデータをバックアップします。1 つの大きなファイルが正しくコピーされていないことに気付きました (途中で停止し、転送を再開します)。幸い、同じファイルの以前のバックアップがあります。ディスクを複製するには、次の手順を使用してディスク上の不良ブロックを見つける必要がありました。

まず、HD情報を使用して問題のあるディスクを見つけますfdisk -l

2番目に、ディスクが/dev/sdb次にコマンドを実行する必要があります 不良ブロック -v /dev/sdbドライブ上の不良ブロックがすべてリストされます。幸い、いくつかあります。不良ブロックが見つからない場合は、ドライブのブロックは正常であり、他の原因を見つける必要があります。私のブロックサイズは512なので、DDを実行するにはそのデフォルトの数値を使用します。

3番目に、各ブロックのサイズは512なので、bs=512に設定します。

いつものようにDDを定期的に実行するたびに、エラーが発生した後のデータが破損します。そこで、ページで説明されているパラメータを使用します。https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html「故障したディスクの場合」の部分を検索します。

dd if=/dev/sdb of=/dev/sda bs=512 conv=noerror,sync iflag=fullblock 

しばらく時間がかかりました。不良ブロックに遭遇するたびに、故障したドライブを叩くような音がします。ブロックごとにコピーしますが、すべての不良ブロックで同じ音がします。音が鳴った回数は、別の不良ブロックが見つかり、ディスプレイにエラーメッセージが表示されるためです。'conv=エラーなし、同期'不正な読み取りをNULで埋めるのに対し、'iflag=フルブロック'短い読み取りに対応しますが、最後までデータを同期させます。破損はまったくなく、問題のあるブロックをコピーせず、空の NUL で埋めるだけです。

DD によるコピーが完了したら、過去のバックアップから Filezilla を戻して不良ファイルを置き換えたところ、すべて正常に動作しました。故障したドライブをバックアップしようとしている他の方にも、この情報が役立つことを願っています。

注: 私の不良ブロックは互いにかなり接近していました。一度に 4 ブロックほどがグループになって不良として検出されました。ブロックがディスク全体に散らばっている場合は、複数のファイルが影響を受ける可能性があります。幸い、私のケースでは、大きな 4 GB のデータベース ファイルだけが影響を受けました。

関連情報