Làm thế nào để cố tình phân mảnh một tập tin


7

Tôi đang tìm cách phân đoạn một tập tin hiện có để đánh giá hiệu suất của một số công cụ. Tôi tìm thấy một giải pháp cho hệ thống tệp NTFS có tên MyFragmenter như được mô tả trong chuỗi này . Tuy nhiên tôi không thể tìm thấy bất cứ điều gì cho ext2 / 3/4 ... Tôi là khách tôi có thể phát triển trình phân mảnh tệp của riêng mình nhưng do hạn chế về thời gian, tôi muốn tìm một giải pháp nhanh hơn. Tôi đã tìm thấy một số công cụ như HJ-Split phân tách một tệp thành các bit nhỏ hơn nhưng tôi nghi ngờ điều này sẽ mô phỏng phân mảnh tệp.

Là bất kỳ giải pháp của họ có sẵn cho vấn đề của tôi?

Câu trả lời:


6

Nếu bạn muốn đảm bảo phân mảnh nhưng không ngăn chặn được (vì vậy bạn chỉ có quyền kiểm soát một phần đối với những gì xảy ra) và bạn không quan tâm đến các chi tiết cụ thể của phân mảnh, đây là cách làm nhanh và bẩn.

Để tạo một tệp gồm ncác khối trong ít nhất hai đoạn:

  1. Mở tệp bằng cách ghi đồng bộ, ghi m <n khối.
  2. Mở một tập tin khác. Thêm vào nó cho đến khi có nhiều nhất khối n - m trên đĩa. Đừng nhầm lẫn!
  3. Viết các khối n - m còn lại vào tệp đầu tiên.
  4. Đóng và unlinktập tin thứ hai.

Bạn có thể phân đoạn thành nhiều phần hơn bằng cách xen kẽ nhiều tệp hơn.

Điều này giả định hệ thống tập tin có sẵn cho loại tra tấn này, tức là không phải trong một môi trường nhiều người dùng hoặc nhiệm vụ quan trọng. Nó cũng giả sử hệ thống tập tin không có các khối dành riêng hoặc các khối dành riêng được dành riêng cho UID của bạn hoặc bạn đã root.

Không có cách nào trực tiếp để đảm bảo phân mảnh, vì các hệ thống Unix sử dụng sự trừu tượng hóa hệ thống tệp, do đó bạn không bao giờ nói chuyện với hệ thống tệp thô.

Ngoài ra, đảm bảo phân mảnh cấp hệ thống tệp cho bạn biết không có gì xảy ra ở cấp thấp hơn. LVM, RAID phần mềm và phần cứng, ánh xạ lại khu vực cấp phần cứng và các lớp trừu tượng khác có thể chơi tàn phá với mong đợi của bạn (và các phép đo).


Cảm ơn câu trả lời! Vì vậy, có vẻ như tôi sẽ không thể làm điều đó trên một hệ thống đang chạy. Tuy nhiên, vì tôi sẽ sử dụng hình ảnh đĩa, tôi có thể truy cập dữ liệu thô khi tôi thực hiện việc mua lại. Vì vậy, tôi sẽ bỏ qua LVM và như vậy. Bây giờ, tôi sẽ xem liệu tôi có thể làm điều gì đó tương tự như đề xuất của bạn trên ảnh đĩa không.
Flanfl

Vì tò mò, bạn đang cố gắng làm gì ở cấp độ cao?
Alexios

Tôi đang cố gắng đánh giá các trình khắc tệp như liên kết Scalpel và phân mảnh tệp là vấn đề chính của các công cụ này.
Flanfl

Chà, bạn không nhất thiết cần một hệ thống tập tin thực sự cho việc này: bạn có thể tạo ra một hình ảnh đĩa với các khối tín hiệu và nhiễu xen kẽ từ nhiều nguồn khác nhau. Điều này cung cấp cho bạn quyền kiểm soát thích hợp, đầy đủ về phương pháp thí nghiệm.
Alexios

Bạn đã đúng, tuy nhiên hình ảnh đĩa sẽ được sử dụng để đánh giá các công cụ khác. Và thật tuyệt khi sử dụng một hình ảnh đĩa cho tất cả các công cụ (thay vì tạo một hình cụ thể). Tôi có thể sử dụng một hệ điều hành đang chạy để tạo ra các hoạt động của người dùng và như vậy. Thêm vào đó, một yêu cầu của dự án là sử dụng hình ảnh đĩa thực tế. Vì vậy, phân đoạn tệp trong hệ thống đang chạy sẽ tốt hơn nhưng nếu tôi không thể (hoặc kết quả quá không đáng tin cậy) tôi sẽ phải tìm cách khắc phục, như làm việc trên hình ảnh đĩa thô. Một giải pháp khác là chuyển sang Windows ...
Flanfl 18/03/2016

1

Tôi vẫn chưa gặp một hệ thống tệp có mục đích chung trên Linux sẽ hy sinh thông lượng ghi khi có các tệp liền kề. Đó là, mọi đoạn hệ thống tệp nếu các phần được viết theo thứ tự không tuần tự, đặc biệt là với các tệp thưa thớt.

Cách dễ dàng: Chạy tệp qua máy khách torrent - tốt nhất là thứ gì đó không phân bổ trước tệp. BitTornado hoặc rtorrent phù hợp với hóa đơn này. (Cái trước có chế độ phân bổ cấu hình)

Cách khó: Chia tệp nguồn thành các phần có kích thước KB, xáo trộn chúng. Mở tệp đích. Đối với mỗi phần, tìm kiếm đến vị trí chính xác của nó và viết nó.

Đây là một kịch bản Perl thực hiện nó:

#!/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;

Bạn có thể kiểm tra phân mảnh bằng filefraglệnh, có trong gói e2fspross.

Đây là một ví dụ về những gì một torrent làm:

# 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

Đây là những gì tôi nhận được với tập lệnh của mình (trên 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

EDIT: Đừng bận tâm, rốt cuộc nó dường như không hoạt động tốt, ngoại trừ các tệp lớn (chắc chắn là một đoạn tệp 1,5 GB.)

Hệ thống VM có thể là bộ nhớ đệm và postpones / sắp xếp lại ghi quá nhỏ. Đây là lý do tại sao các máy khách torrent quản lý thành từng đoạn (vì chúng thường không tải xuống với tốc độ> 10MB / giây) nhưng tập lệnh của tôi thì không. Tôi nghĩ rằng nó có thể được điều chỉnh bằng cách hạ thấp ngưỡng vm. Xem/proc/sys/vm/dirty_*

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.