壊れたディスク上のパーティションテーブルの読み取りをスキップ/短縮する

壊れたディスク上のパーティションテーブルの読み取りをスキップ/短縮する

壊れたハードドライブがあり、多くのブロックが破損しています。復旧はddrescueかなり成功しています (99.5 %)。残念ながら:

  • 何らかの理由で、ddrescueひどく損傷した部分に当たると、ディスクが「おかしくなり」、ディスクの残りの部分に対して読み取りエラーのみを返すか、または非整列読み取りエラーを報告して終了します。この場合、コンピューターを再起動する必要があり、その部分を再度読み取ることができます。
  • パーティション テーブルを含む最初のブロックが壊れており、カーネルがパーティション テーブルの読み取りを何度も再試行するため、システムの起動に約 1 時間かかります。

面白いことに、パーティション テーブルをまったく読み取る必要はなく、「ディスク全体」の復旧を実行しています。

カーネルに伝える方法はあるのでしょうか

  • パーティションテーブルを読み込まないか、
  • 再試行回数を制限するには?

システムの起動を高速化すると、回復速度が大幅に向上します。このフェーズでは、システムが 1 時間起動し、その後数分間回復を継続し、上記のエラーのいずれかが原因で再起動するためです (起動スクリプトによってこれを自動化しました)。

dmesg出力:https://cloud.oprendek.sk/index.php/s/Mk8figkaspD8xRE

答え1

以前これに答えたような気がしますが、今は見つかりません...

最初の起動時だけでなく、すでに実行中のシステムに問題のあるドライブをホットプラグしたときにも問題が解決しない場合は、運が悪いと言えます。

完全な Linux インストールでは、ドライブを接続するたびに、パーティション、UUID、およびその他のメタデータがスキャンされることをほぼ防ぐことはできません。カーネルはパーティション テーブルを検出し、udev はディスク/UUID によるリンクを作成します。

ただし、パーティション テーブルのサポートはカーネルではオプションです ( CONFIG_*_PARTITION、、、、 ...の*いずれか)。そのため、これらをすべて無効にして、何もサポートしないカスタム カーネルMSDOSをコンパイルし、(UUID スキャンなども防止するために) ddrescue のみを含む最小限の initramfs 環境で使用することができます。EFIMAC

losetupこれにより、 offset / sizelimits またはデバイス マッパー ( )を使用してエミュレートしない限り、他のドライブのパーティションにアクセスできなくなりますdmsetup。したがって、パーティションの不足を全体的に回避する必要があります。

  • 再試行回数を制限するには?

再試行が行われるかどうかはわかりませんが、タイムアウト ( ) を設定することはできますが、/sys/block/*/device/timeoutsこれはドライブがまったく応答しない場合にのみ役立つと思います。

組み込みの取り外し不可能なデバイスの場合は、libata.force=<port.device>:disableカーネル パラメータを使用して完全に無効にすることもできます。

関連情報