破損したディスクからパーティションテーブルを読み取るスキップ/短縮

破損したディスクからパーティションテーブルを読み取るスキップ/短縮

私のハードドライブが破損しており、破損したブロックがたくさんあります。私の構造はddrescue非常に成功しました(成功率は99.5%)。残念ながら:

  • 必ずしもそうではありませんが、何らかの理由で重大ddrescueに破損したセクションが見つかった場合は、ディスクが「クレイジー」で、ディスクの残りの部分に読み取りエラーを返すか、並べ替えられていない読み取りエラーを報告してコンピュータをシャットダウンする必要があります。このセクションをもう一度読むには再起動する必要があります。
  • パーティションテーブルを含む最初のブロックが破損し、カーネルがパーティションテーブルの読み取りを再試行し続けるため、システムの起動に約1時間かかります。

面白い事実:パーティションテーブルをまったく読む必要はありません。 「フルディスク」リカバリを行っています。

カーネルに知らせる方法はありますか?

  • パーティションテーブルを読み取れない
  • 再試行回数を制限しますか?

システムのブートアクセラレーションは回復速度を大幅に向上させます。この手順では、システムは1時間起動し、数分間回復し続け、次のエラーのいずれかで再起動します(起動スクリプトを介してこのタスクを自動化しました)。

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

答え1

以前この質問に答えたようですが、今は見つかりませんでした...

初期起動時だけでなく、問題のあるドライブをすでに実行しているシステムにホットプラグしても問題が解決しない場合は、幸運ではありません。

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

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

losetupまた、オフセット/サイズ制限やデバイスマッパー(dmsetup)を使用してエミュレートしない限り、他のドライブのパーティションにアクセスすることはできません。そのため、パーティション全体の欠落の問題を解決する必要があります。

  • 再試行回数を制限しますか?

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

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

関連情報