11

HDへの生のアクセスを取得して、その場所が使用されているか、空き領域であるかを知るにはどうすればよいですか?ほんの一例ですが、ディスクデバイスを開いて読み取るだけで直接アクセスを取得できます。目標は、たとえば10.000バイトが使用されているかどうかを知ることです。

4

7 に答える 7

17

デバイスをブロックするだけopenで(たとえば/dev/sda)、セクターを手動で読み取ることができます。ただし、それが空であるかどうかは直接わかりません。空であるかどうかは、ファイルシステムの抽象化レベルで定義されたものです。ファイルシステムのデータ構造にはその種のデータが格納されているため、(ファイルシステムが提供する関数を使用せずに)rawブロックから保存するには、特定のファイルシステムを深く理解する必要があります。

于 2009-06-10T20:03:04.683 に答える
9

注意して積み重ねるには...

既存のドライバースタック独自のスレッドセーフ規定と内部キャッシュに協力する必要があることを忘れないでください。システム内の多くのスレッドは、常にディスクに書き込むことができます(そして書き込みます)。無料のセクターを一掃するには、それが無料であることを知って、それを使っている間は無料のままでいる必要があります。ファイルシステムがすでに使用することを決定したセクターをワイプしたが、その決定の証拠をまだディスクにフラッシュしていなかったため、それが使用されていることを知る方法がなかったとしたら、それは悪いことです。これにより、データが失われ、ユーザーが憤慨する可能性があります。

ファイルシステムが現在マウントされていないことを保証できる場合は、原則として、少なくとも/dev/sda(おそらく必要な特定のものではない)開いて、ディスク上のデータ構造を解析して、必要なことをすべて実行できます。これは、実際にはユーティリティが好きfsckmkfs実装されている方法です。

残りの大きな問題は、遭遇する可能性のあるすべてのファイルシステムのすべてのバージョンとの同期を維持する必要があることです。少なくとも、ファイルシステム自体で参照できるソースコードはありますが、カーネルからユーザーモードアプリケーションに移植するのは簡単ではありません。

私のアドバイスは、ファイルシステム自体を使用して、必要な保証を取得することです。大きなファイルを開き、ワイプパターンで埋めます。ディスクをいっぱいにします。これが、ある程度のディスクスペースが使用可能であると想定する実行中のデーモンに深刻な影響を与える可能性がある場合は、ほとんどのデーモンなどが強制終了されたシステムで実行する必要がある可能性があることに注意してください。安全なワイプを目指している場合でも、通常のファイルシステムのすべてが単一ブロックの複数の書き込みを最適化しようとするため、パス間で書き込まれたブロックを実際にディスクにフラッシュすることを心配する必要があります。

于 2009-06-10T20:46:42.583 に答える
9

ほとんどの場合、/ dev /sd*または/dev/hd*を介してブロックデバイスに直接アクセスすることは望ましくありません。他の人が述べたように、あなたは生の基礎となるファイルシステムを理解する必要があり、これは非常に難しいでしょう。

ディスク上のバイトを大きな線形アドレス空間として扱いたいアプリケーションを作成している場合は、mmap()システムコールを確認してください。ディスク上に大きな空のファイルを作成し、mmap()を使用してそれをプロセススペースにマップできます。そこから、通常のメモリ操作を使用して、基になる大きなファイルの読み取りと書き込みを行うことができます。書き込みはバッファリングされるため、一貫性を保証するのは難しい場合があることに注意してください。

このアプローチの利点は、基になるファイルが断片化されている場合でも、アクセスパターンがそれをバイトの線形コレクションと見なすことができることです。

于 2009-06-10T20:19:28.893 に答える
6

ファイルシステムのすべての空き領域を消去する場合は、ファイルシステムをゼロでいっぱいの1つの大きなファイルで埋め、ディスクに同期してから削除します。特にログファイルシステムなどを扱っている場合は、それですべてが得られるとは限りませんが、ほとんどの場合は実行されます。ディスクをワイプして画像の圧縮率を高めたい場合は、おそらくこれで十分です。セキュリティ上の理由でディスクをクリーンアップしたい場合は...カーネル開発の世界へようこそ。ディープエンドに足を踏み入れ、難燃性のものを着用することを忘れないでください。

extファイルシステムの空きブロックをゼロにするzerofreeと呼ばれるユーティリティがあり、VMイメージを対象としています。これは、マウントされたファイルシステムに対して行うべきことではないことを忘れないでください。このページには、ライブファイルシステムでこれを行うための興味深い出発点となる可能性のある古いカーネルパッチもいくつかあります。

于 2009-06-10T20:22:15.033 に答える
5

ああ、私の。

コードは次のことを行う必要があります。

  1. パーティションテーブルを調べて、どのパーティションに分類されるかを確認します。
  2. それがどのようなファイルシステムであるかを判別します。
  3. サポートするファイルシステムごとに、そのバイトが使用されているかどうかを確認するためのルーチンを提供します
  4. ファイルシステムがマウントされているかどうかを確認します
  5. そうである場合は、カーネルレコードを調べて、まだディスクに書き込まれていないものがあるかどうかを確認します。
  6. ああ、EXT4またはREISERを使用している場合は、前の答えがわからないので、あきらめた方がよいでしょう。

もし私があなただったら、あなたがやろうとしていることを再考するでしょう。

編集:彼が実際にやろうとしていることについての彼のコメントを見て、

  • rawディスクではなくパーティションを受け入れる
  • 降車が必要
  • e3fsckを呼び出して、ジャーナルをロールアップします
  • 各iノードを歩き、最後のブロックを見つけて、そのブロック内の空き領域を消去します(filesizeは、データがブロック内のどこで終了するかを示す必要があります)
  • 割り当てビットマップをウォークし、割り当てられていないブロックを見つけてワイプします
  • ここで注意が必要なのは、ジャーナルをワイプすることです。
  • 幸運を
  • ああ、ファイルシステムのドキュメントを読んでください
于 2009-06-10T20:04:50.483 に答える
2

次のような多くの要因に大きく依存します

  • ファイルシステムタイプ
  • オペレーティングシステムの種類
  • ミディアムタイプ

ソリューション:

于 2012-03-25T00:07:42.070 に答える
0

ファイルシステムやディスクツールが場所が空いているかどうかを確認するために使用するのと同じ機能を利用できる場合があります。

于 2009-06-10T20:07:51.583 に答える