답변1
네가 원한다면확실하게 하다파편이지만 그렇지 않다예방하다이는(따라서 발생하는 일을 부분적으로만 제어할 수 있음) 조각의 세부 사항에는 신경 쓰지 않으며 작업을 수행하는 빠르고 더러운 방법입니다.
n
두 개 이상의 조각을 포함하는 청크 파일을 생성하려면 다음 을 수행하십시오.
- 동기 쓰기로 파일을 열고 m < n 블록을 씁니다.
- 다른 파일을 엽니다. 디스크에서 최대 n - m 블록을 사용할 수 있을 때까지 추가합니다. 얇게 만드는 실수를 저지르지 마세요!
- 나머지 n - m 블록을 첫 번째 파일에 씁니다.
- 두 번째 파일을 닫습니다
unlink
.
더 많은 파일을 인터리브하여 더 많은 세그먼트를 분할할 수 있습니다.
이는 파일 시스템이 그러한 고문에 사용할 수 있다고 가정합니다. 즉, 다중 사용자 또는 업무상 중요한 환경에서는 그렇지 않습니다. 또한 파일 시스템에 예약된 블록이 없거나 예약된 블록이 UID용으로 예약되어 있거나 사용자가 루트라고 가정합니다.
아니요직접조각화를 보장하는 방법은 Unix 시스템이 파일 시스템 추상화를 사용하므로 원래 파일 시스템과 통신하지 않기 때문입니다.
또한 파일 시스템 수준의 조각화로 인해 하위 수준에서 무슨 일이 일어나고 있는지 알 수 없는지 확인하세요. LVM, 소프트웨어 및 하드웨어 RAID, 하드웨어 수준 섹터 재매핑 및 기타 추상화 계층은 기대치(및 측정치)에 큰 타격을 줄 수 있습니다.
답변2
나는 연속 파일에 대한 쓰기 처리량을 희생하는 Linux의 범용 파일 시스템을 아직 본 적이 없습니다. 즉, 특히 스파스 파일의 경우 파일이 비순차적 순서로 기록되면 모든 파일 시스템이 조각화됩니다.
쉬운 방법: 토렌트 클라이언트를 통해 파일을 실행하는 것입니다. 파일을 미리 할당하지 않는 것이 좋습니다. BitTornado 또는 rtorrent가 이 요구 사항에 적합합니다. (전자에는 구성 가능한 할당 모드가 있습니다)
어려운 방법은 소스 파일을 몇 KB 크기의 조각으로 분할한 다음 섞는 것입니다. 대상 파일을 엽니다. 각 기사마다 올바른 위치를 찾아 적어보세요.
다음은 이 작업을 수행하는 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 시스템이 너무 작은 쓰기를 캐싱하고 연기/재주문할 수 있습니다. 이것이 바로 토렌트 클라이언트가 단편화되는 이유입니다(일반적으로 10MB/s 이상의 속도로 다운로드하지 않기 때문입니다). 하지만 제 스크립트는 그렇지 않습니다. VM 임계값을 낮추면 조정할 수 있다고 생각합니다. 바라보다/proc/sys/vm/dirty_*