答え1
欲しいなら確実にする破片だがそうではない防ぐこれは(したがって何が起こるのかを部分的にのみ制御することができます)、断片の詳細には気にしません。
n
複数のフラグメントを含むチャンクファイルを作成するには、次の手順を実行します。
- 同期書き込みでファイルを開き、m<n ブロックを書き込みます。
- 別のファイルを開きます。ディスク上で最大n - mブロックが利用可能になるまで追加します。薄くする間違いを犯さないでください!
- 残りのn - mブロックを最初のファイルに書き込みます。
- 2番目のファイルを閉じます
unlink
。
より多くのファイルをインターリーブして、より多くのセグメントを分割できます。
これは、ファイルシステムがそのようなアドバイザーに使用できると仮定します。つまり、マルチユーザーや業務上重要な環境ではそうではありません。また、ファイルシステムに予約済みブロックがない、予約済みブロックがUID用に予約されている、またはユーザーがrootであると想定します。
いいえ直接断片化を保証する方法は、Unixシステムがファイルシステム抽象化を使用するため、元のファイルシステムと通信しないためです。
また、ファイルシステムレベルの断片化により、下位レベルで何が起こっているのかわからないことを確認してください。 LVM、ソフトウェアおよびハードウェアRAID、ハードウェアレベルセクタの再マッピング、およびその他の抽象化層は、期待値(および測定値)に大きな影響を与える可能性があります。
答え2
私は、連続ファイルの書き込みスループットを犠牲にするLinuxの汎用ファイルシステムをまだ見たことがありません。言い換えれば、特にスパースファイルの場合、ファイルが非順次順序で書き込まれると、すべてのファイルシステムが断片化されます。
簡単な方法:急流クライアントを介してファイルを実行することです。ファイルを事前に割り当てないことをお勧めします。 BitTornadoまたはrtorrentはこの要件に適しています。 (電子には設定可能な割り当てモードがあります)
難しい方法は、ソースファイルを数キロバイトのサイズの部分に分割してから混ぜることです。ターゲットファイルを開きます。記事ごとに正しい場所を見つけて書き留めてください。
これはこれを行うPerlスクリプトです。
#!/usr/bin/perl
use List::Util qw/shuffle/;
use IO::Handle;
use constant BLOCK_SIZE => 4096;
my ($src, $dst) = @ARGV;
my $size = (stat($src))[7];
my @blocks = shuffle(0 .. ($size / BLOCK_SIZE));
my ($srcfh, $dstfh);
open $srcfh, "<", $src or die "cannot open $src: $!";
open $dstfh, ">", $dst or die "cannot open $dst: $!";
truncate $dstfh, $size; # undefined behaviour
my $buf;
for my $blockno (@blocks) {
seek $_, $blockno * BLOCK_SIZE, 0 for ($srcfh, $dstfh);
read $srcfh, $buf, BLOCK_SIZE;
print $dstfh $buf;
$dstfh->flush;
}
close $dstfh;
close $srcfh;
filefrag
e2fsprogsパッケージに含まれているコマンドを使用して、断片化を確認できます。
トレントができることの例は次のとおりです。
# ls -sh amd64memstick-5.1.2.fs.gz
239M amd64memstick-5.1.2.fs.gz
# filefrag amd64memstick-5.1.2.fs.gz
amd64memstick-5.1.2.fs.gz: 585 extents found
これは私のスクリプト(ext3の)が得るものです:
$ ls -sh source.tar
42M source.tar
$ perl fragment.pl source.tar fragmented.tar
$ md5sum fragmented.tar source.tar
f77fdd7ab526ede434f416f9787fa9b3 fragmented.tar
f77fdd7ab526ede434f416f9787fa9b3 source.tar
# filefrag fragmented.tar
fragmented.tar: 395 extents found
編集する:心配しないでください。大きなファイル(確かに1.5GBのファイルの一部)を除いて、まったく機能しないようです。
VMシステムが小さすぎる書き込みをキャッシュして延期/再注文することがあります。これがTorrentクライアントが断片化される理由です(通常、10 MB / s以上の速度でダウンロードしないため)。しかし、私のスクリプトはそうではありません。 VMのしきい値を下げれば調整できると思います。バラより/proc/sys/vm/dirty_*