
답변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_*