web-dev-qa-db-ja.com

USBのスワップスペースのスキーム

最近、スワップパーティション専用に使用するUSB​​フラッシュドライブを購入しました。フラッシュメディア上のスワップファイルは書き込みサイクル数をかなり早く使い果たす可能性があることを理解していますが、それがこのUSBを購入した理由であり、ラップトップのストレージデバイス(eMMC)でそのような劣化に対処する必要はありません。 。これをスワップスペースに使用する方法について、2つのアイデアがあります。

スキーム1:1つのファイルシステムパーティションと多数の小さなスワップパーティション

USBドライブは32ギガバイトの容量を持つと宣伝されていました。ギガバイトは1000000000バイトとして定義されていますが、実際に利用可能な容量割引ファイルシステムのフォーマットは307520000000バイトです(余談ですが、ここではまだいくつかの誤った宣伝が行われています)。

このドライブでやりたいのは、GUIDパーティションテーブルでフォーマットし、その上に複数のパーティションを作成することです。1つのパーティションは他のパーティションよりも大きく、基本的なファイルシステムでフォーマットされています(例: VFAT/FAT32、ext2、ext4)。パーティションの総数は少なくとも数百になり、より大きなファイルシステムパーティションを除いて、それらは均一なサイズになり、スペースのページング/スワッピングに使用されます。ファイルシステムパーティションは次のようになります。この特定のスキームを管理するためのデータを格納するために使用されます。

ここで、ファイルシステム上の単一のパーティションやスワップファイルの代わりに多くの小さなパーティションを使用する理由は、不良ブロックがUSBドライブ全体に散らばらないようにするためです。これにより、不良ブロックを含むパーティションが使用されなくなるため、劣化の管理が容易になります。どのパーティションが使用できないかについての記録は、単一のより大きなパーティションにあるファイルシステムに保持されます。

デバイスマッパーの線形ターゲットは、USB上の任意の数の小さなパーティションから単一の大きなデバイスを作成するために使用されます。マップされたデバイスの作成に使用するパーティションの決定は、ファイルシステムパーティションに記録されたデータから行われます。暗号化されたスワップデバイスを選択した場合は、暗号化されたキーをファイルシステムパーティション(または代わりにホストマシン)に保存します。

USBドライブをどのように分割するかという問題に戻ると、生のストレージスペースの30752000000バイトは、それぞれ60062500バイトのサイズの512セクターに変換されます。 GPTスキームを使用すると、ドライブのストレージスペースの両端に1つずつ、ファイルシステムの一部としてもスワップスペースとしても使用できない2つの領域が存在することになります。パーティションをNセクターの境界に揃える方法を考えると、これら2つの領域は、使用するパーティションテーブルのサイズよりも大きくなります(GPTに含まれるパーティションエントリの数は調整可能で、最大は4294967295です。 )。

fdiskgdiskのようなツールは、デフォルトで2048-セクターの配置境界になります。これは、2048が推奨されているか、何らかの形で最適であることを示唆しているようです。パーティション境界を2048セクターに揃えると、ドライブの開始時にプライマリGPTを含む1つの2048-セクターセグメント、ドライブの終了時にバックアップGPTを含む1つの部分的な804セクターセグメント、および293262048-が残ります。それらの間のファイルシステム/スワップパーティションに使用可能なセクターセグメント。

2048-セクター境界へのパーティションの配置を維持し、ファイルシステムパーティションのサイズがXセグメントの数である場合、複数のスワップパーティションとして使用するために残されたセクターの総数Yは次のようになります。 29326-Xに等しい。ここで、スワップパーティションのサイズを同じにしたいので、Yの値は合成数である必要があります。パーティションの数が多いと、パーティションテーブルのサイズが2046セクターを超える可能性があるため、スワップパーティションの数は、Yの大きな要因の1つである必要があります。

上記を一般化すると、私はこの数学を得る:

  • 30752000000は、USBドライブのサイズ(バイト単位)です。
  • 60062500は、USBドライブのサイズ(512-バイトセクター)です。
  • pは、使用するパーティションの数です。
  • Pは、エントリ数で表したパーティションテーブルのサイズです。この値はGPTヘッダーの一部です。
  • qは、512バイトセクターのプライマリGPTのサイズです。この値はceiling(P/4)+2と同じです。
  • rは、512バイトセクター単位のバックアップGPTのサイズです。この値はceiling(P/4)+1と同じです。
  • Nは、パーティションが配置されているセクターの数です。
  • Qは、ドライブの先頭にある512- byteセクターの数であり、パーティションの一部にすることはできません。この値はNと同じです。
  • Rは、ドライブの最後にある512- byteセクターの数であり、パーティションの一部にすることはできません。この値は60062500 mod Nと同じです。
  • Xは、パーティションに使用できるN-セクターセグメントの数です。
  • Yは、N-セクターセグメント内のファイルシステムパーティションのサイズです。
  • Zは、スワップパーティションの一部として使用できるNセクターセグメントの数です。この値はX-Yと同じです。
  • Sは、使用するスワップパーティションの数です。
  • ZSで割り切れる必要があります。
  • pPを超えることはできません。
  • rNを超えることはできません。

このスキームに関する私の質問は次のとおりです。+パーティションの配置は重要ですか? +もしそうなら、パーティションを2048セクターの境界に揃えるべきですか、それとも他の数にするべきですか? + 60062500を均等に分割するN用に選択できる数はありますか。ある場合、データの重複につながりますか?それが2の累乗ではない数である場合、それは最適ではない選択でしょうか?

スキーム2:1つのファイルシステムパーティションと1つの大きなLVM2PVパーティション

このアイデアは最初のアイデアとよく似ていますが、違いは、多くの小さなスワップパーティションが、LVM2で物理ボリュームとして使用するためにフォーマットされた大きなパーティションに置き換えられることです。大きなパーティションは多くの論理ボリュームにセグメント化され、必要に応じてサイズ変更および再結合できます。ファイルシステムは、最初のスキームと同様の目的を果たします。

これにはいくつかの問題が考えられます。+ LVM2がファイルシステムのように機能するかどうか、論理ボリュームを含むデータをファイルシステム内のファイルを構成するデータのように移動するかどうかはわかりません。もしそうなら、これは不良ブロックを分離するのに問題があります。これは、最初のスキームと同様に、このスキームの要件です。 +論理ボリュームのサイズ変更と結合が、前の箇条書きで仮定したのと同様の問題に悩まされるかどうかはわかりません。 +これは最初のアイデアよりも不必要に複雑になる可能性がありますが、そうであるかどうかはわかりません。

結論として…

どのスキームを使用する必要がありますか?それぞれの下で提起された質問/問題に対する答えは何ですか?とにかく、スワップスペースに暗号化を利用できますか?それ(暗号化)は、不要なときに簡単に取り除くことができますか? zramのような圧縮スワップメモリ​​は、劣化したブロックの数を減らしますか?もしそうなら、私はそれをどのように使用しますか? USBドライブの基になるブロックサイズを確認するにはどうすればよいですか? hdparmはそれを助けていないようです。

1
Melab

ラップトップのストレージデバイス(eMMC)の劣化に対処したくない

そのための最良の方法は、十分なRAMをインストールし、スワップを完全に無効にすることです。

パーティションの総数は少なくとも数百になります[...]ファイルシステム上の単一のパーティションまたはスワップファイルの代わりにここで多くの小さなパーティションを使用する理由は、不良ブロックがUSBドライブ全体に散らばらないようにするためです。これにより、不良ブロックを含むパーティションが使用されなくなるため、劣化の管理が容易になります。

これは意味がありません。ブロックがどこにあるかは関係ありません。すべてのブロックに同じように高速(または低速)でアクセスできます。 USBスティックのマイクロコントローラーは、とにかく不良ブロックを再割り当てするか、ウェアレベリングを使用してブロック内を好きなように移動します。

したがって、小さなパーティションをたくさん作成しないでください。予想されるメモリ使用量に十分な大きさのパーティションを1つ作成します(最悪の場合、いくつのプログラムを使用しますか?)。

Lvmを使用すると、1レベルの間接参照が追加されるだけで、すべてが遅くなります。

繰り返すには:十分なRAMをインストールし、スワップを完全に無効にするのが最善です。

編集 :ウェアレベリングの説明

USBスティックのマイクロコントローラーは、スティックの実際の(物理)ブロックとUSB経由でアクセス可能な(論理)ブロックの間にレイヤーを実装します。

説明のために、スティックが標準サイズ、たとえば150論理ブロックであると主張しているとします。一部のブロックは、製造後に常に不良であることが判明し、製造プロセスでフラグが立てられます。スティックが200ブロックで製造されたとしましょう。そのうち、20ブロックは不良です。それでも問題ありません。180物理ブロックがあり、スティックが主張している150論理ブロックを超えています。

内部的には、スティックは論理ブロックと物理ブロックの間のマッピングを追跡します。ここで、(論理)ブロック0から49までのパーティションを作成し、このパーティションに各ブロックを2回書き込むとします。 1回目はスティックが物理ブロック0〜49を書き込み、2回目は物理ブロック50〜99を書き込みます。以下同様です。

したがって、どのような工夫されたパーティションスキームを思いついたとしても、「後で」使用するために適切なブロックを「保存」することはできません。トランジスタが漏れるとブロックに欠陥が生じ、すべてが非常に密に詰まっているため、これも悪い考えです。したがって、不良ブロックは隣接するブロックにも影響を及ぼし、それらを不良にする可能性があります。スティックに不良ブロックが大量にあると、とにかく重要なデータでそれを信頼できなくなります。

優先順に解決策:

1)スワッピングを完全にオフにし、使用可能なRAMのみを使用します。とにかく、USBスワップからのロード時間は、内部フラッシュストレージからのロード時間と同様になります。したがって、使用しないアプリケーションを閉じて、必要に応じて再起動してください。

2)RAMに収まるよりも多くのアプリケーションを絶対に使用する必要がある場合、または休止状態にする場合は、適切なサイズの単一のパーティションを作成し(OSテーブルを適切なサイズに保ちます)、残りのスティックを残します空の。

Swappinessを「できるだけ低く」に設定します。これはスティック上のすべての物理ブロックを使用し、数年で悪くなった場合は、それを捨てて新しいものを購入します。重要なデータを保存しようとしないでください。別のスティックを使用してください。

1
dirkt