Как преднамеренно фрагментировать файл

Я ищу способ фрагментировать существующий файл, чтобы оценить производительность некоторых инструментов. Я нашел решение для файловой системы NTFS под названием MyFragmenter, как описано в этом потоке . Однако я ничего не могу найти для ext2 / 3/4 … Я гость, я могу разработать свой собственный файловый фрагментатор, но из-за ограниченного времени мне хотелось бы найти более быстрое решение. Я нашел такой инструмент, как HJ-Split, который разбивает файл на меньшие биты, но я сомневаюсь, что это будет имитировать фрагментацию файлов.

Доступно ли решение для моей проблемы?

  • Предполагается, что «userdel -root?»
  • Как распечатать общий процент доступного пространства в конкретной файловой системе как в Linux, так и в Solaris?
  • Альтернатива xmllint для проверки правильности xml
  • Блокировать отдельную команду в Linux для конкретного пользователя
  • Проверить уязвимость для уязвимостей
  • Linux: Total swap used = swap, используемый процессами +?
  • Разработка программного обеспечения на Linux
  • Изменить разрешение экрана без монитора под Linux?
  • Запуск «патча» без создания файлов * .orig и * .rej
  • Как рассчитать сумму данных, имеющих один и тот же идентификатор в первом столбце?
  • Как я могу переназначить кнопки мыши на клавиши-модификаторы?
  • luks single signon
  • 2 Solutions collect form web for “Как преднамеренно фрагментировать файл”

    Если вы хотите обеспечить фрагментацию, но не мешать ей (так что у вас есть только частичный контроль над тем, что происходит), и вы не заботитесь о специфике фрагментации, вот быстрый и грязный способ делать что-то.

    Чтобы создать файл из n блоков по крайней мере в двух фрагментах:

    1. Откройте файл с синхронной записью, напишите m <n блоков.
    2. Откройте другой файл. Добавьте к нему до тех пор, пока на диске не останется блоков n – m. Не делайте это разреженным по ошибке!
    3. Запишите оставшиеся n-м блоки в первый файл.
    4. Закройте и unlink второй файл.

    Вы можете фрагментировать больше фрагментов, чередуя больше файлов.

    Это предполагает, что файловая система доступна для такого рода пыток, то есть не в многопользовательской или критически важной среде. Он также предполагает, что файловая система не имеет зарезервированных блоков, или зарезервированные блоки зарезервированы для вашего UID, или вы root.

    Нет прямого способа обеспечить фрагментацию, потому что в Unix-системах используется абстракция файловой системы, поэтому вы никогда не разговариваете с необработанной файловой системой.

    Кроме того, обеспечение файловой системы фрагментации ничего не говорит о том, что происходит на более низких уровнях. LVM, программный и аппаратный RAID, переназначение сектора аппаратного уровня и другие уровни абстракции могут играть хаос с вашими ожиданиями (и измерениями).

    Мне еще предстоит встретить файловую систему общего назначения в 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 команды 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 

    EDIT: Ничего, в конце концов, похоже, что это не так хорошо, за исключением довольно больших файлов (например, 1,5 ГБ фрагментов файлов).

    Система VM, вероятно, кэширует и откладывает / переупорядочивает слишком малые записи. Вот почему торрент-клиентам удается фрагментировать (поскольку они обычно не загружаются с> 10 МБ / с), но мой скрипт не работает. Я думаю, что это может быть изменено путем снижения порогов vm. См. /proc/sys/vm/dirty_*

    Linux и Unix - лучшая ОС в мире.