最近、スワップパーティション専用に使用するUSBフラッシュドライブを購入しました。フラッシュメディア上のスワップファイルは書き込みサイクル数をかなり早く使い果たす可能性があることを理解していますが、それがこのUSBを購入した理由であり、ラップトップのストレージデバイス(eMMC)でそのような劣化に対処する必要はありません。 。これをスワップスペースに使用する方法について、2つのアイデアがあります。
USBドライブは32ギガバイトの容量を持つと宣伝されていました。ギガバイトは1000000000
バイトとして定義されていますが、実際に利用可能な容量割引ファイルシステムのフォーマットは307520000000
バイトです(余談ですが、ここではまだいくつかの誤った宣伝が行われています)。
このドライブでやりたいのは、GUIDパーティションテーブルでフォーマットし、その上に複数のパーティションを作成することです。1つのパーティションは他のパーティションよりも大きく、基本的なファイルシステムでフォーマットされています(例: VFAT/FAT32、ext2、ext4)。パーティションの総数は少なくとも数百になり、より大きなファイルシステムパーティションを除いて、それらは均一なサイズになり、スペースのページング/スワッピングに使用されます。ファイルシステムパーティションは次のようになります。この特定のスキームを管理するためのデータを格納するために使用されます。
ここで、ファイルシステム上の単一のパーティションやスワップファイルの代わりに多くの小さなパーティションを使用する理由は、不良ブロックがUSBドライブ全体に散らばらないようにするためです。これにより、不良ブロックを含むパーティションが使用されなくなるため、劣化の管理が容易になります。どのパーティションが使用できないかについての記録は、単一のより大きなパーティションにあるファイルシステムに保持されます。
デバイスマッパーの線形ターゲットは、USB上の任意の数の小さなパーティションから単一の大きなデバイスを作成するために使用されます。マップされたデバイスの作成に使用するパーティションの決定は、ファイルシステムパーティションに記録されたデータから行われます。暗号化されたスワップデバイスを選択した場合は、暗号化されたキーをファイルシステムパーティション(または代わりにホストマシン)に保存します。
USBドライブをどのように分割するかという問題に戻ると、生のストレージスペースの30752000000
バイトは、それぞれ60062500
バイトのサイズの512
セクターに変換されます。 GPTスキームを使用すると、ドライブのストレージスペースの両端に1つずつ、ファイルシステムの一部としてもスワップスペースとしても使用できない2つの領域が存在することになります。パーティションをN
セクターの境界に揃える方法を考えると、これら2つの領域は、使用するパーティションテーブルのサイズよりも大きくなります(GPTに含まれるパーティションエントリの数は調整可能で、最大は4294967295
です。 )。
fdisk
やgdisk
のようなツールは、デフォルトで2048
-セクターの配置境界になります。これは、2048が推奨されているか、何らかの形で最適であることを示唆しているようです。パーティション境界を2048
セクターに揃えると、ドライブの開始時にプライマリGPTを含む1つの2048
-セクターセグメント、ドライブの終了時にバックアップGPTを含む1つの部分的な804セクターセグメント、および29326
2048
-が残ります。それらの間のファイルシステム/スワップパーティションに使用可能なセクターセグメント。
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
は、使用するスワップパーティションの数です。Z
はS
で割り切れる必要があります。p
はP
を超えることはできません。r
はN
を超えることはできません。このスキームに関する私の質問は次のとおりです。+パーティションの配置は重要ですか? +もしそうなら、パーティションを2048
セクターの境界に揃えるべきですか、それとも他の数にするべきですか? + 60062500
を均等に分割するN
用に選択できる数はありますか。ある場合、データの重複につながりますか?それが2の累乗ではない数である場合、それは最適ではない選択でしょうか?
このアイデアは最初のアイデアとよく似ていますが、違いは、多くの小さなスワップパーティションが、LVM2で物理ボリュームとして使用するためにフォーマットされた大きなパーティションに置き換えられることです。大きなパーティションは多くの論理ボリュームにセグメント化され、必要に応じてサイズ変更および再結合できます。ファイルシステムは、最初のスキームと同様の目的を果たします。
これにはいくつかの問題が考えられます。+ LVM2がファイルシステムのように機能するかどうか、論理ボリュームを含むデータをファイルシステム内のファイルを構成するデータのように移動するかどうかはわかりません。もしそうなら、これは不良ブロックを分離するのに問題があります。これは、最初のスキームと同様に、このスキームの要件です。 +論理ボリュームのサイズ変更と結合が、前の箇条書きで仮定したのと同様の問題に悩まされるかどうかはわかりません。 +これは最初のアイデアよりも不必要に複雑になる可能性がありますが、そうであるかどうかはわかりません。
どのスキームを使用する必要がありますか?それぞれの下で提起された質問/問題に対する答えは何ですか?とにかく、スワップスペースに暗号化を利用できますか?それ(暗号化)は、不要なときに簡単に取り除くことができますか? zram
のような圧縮スワップメモリは、劣化したブロックの数を減らしますか?もしそうなら、私はそれをどのように使用しますか? USBドライブの基になるブロックサイズを確認するにはどうすればよいですか? hdparm
はそれを助けていないようです。
ラップトップのストレージデバイス(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を「できるだけ低く」に設定します。これはスティック上のすべての物理ブロックを使用し、数年で悪くなった場合は、それを捨てて新しいものを購入します。重要なデータを保存しようとしないでください。別のスティックを使用してください。