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

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

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

  • Как восстановить мой Linux?
  • Автоматически устанавливать атрибуты файлов в заданном каталоге
  • Как извлечь необработанные данные extode inode с диска?
  • Что происходит с записью каталога при переименовании файла
  • Как установщики дистрибуции избегают инициализации ext2 / 3/4?
  • Есть ли способ выполнить fsck автоматически после сбоя питания?
  • Ext3 Вопрос ведения журнала на макете и диске
  • Не удалось установить жесткий диск ext2
  • 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_*

    Interesting Posts

    Получение числа и имен окон в Xvfb

    Являются ли остальные выражения эквивалентными логическим и && или || и где я должен отдать предпочтение одному другому?

    В каких ситуациях пользователь не позволял оболочке записывать свою команду в историю?

    Как установить пакет Debian из Интернета?

    sed работает при вводе из эха, но не из файла

    Как я могу использовать флэш-память формата низкого уровня в Linux?

    Шифровать вывод apt-listchanges перед отправкой электронной почты

    Возможны ли жесткие ссылки для каталогов в файловых системах ext2 / 3/4?

    Загрузка в неграфический режим из приглашения Grub RHEL / CentOS 7

    Укажите строки / столбцы полноэкранного X-терминала?

    Попытка монтировать ext4-раздел из eMMC дает ошибку «Invalid Argument»

    Почему не следует уважать опцию ro?

    Как назначить значение переменной с регулярным выражением (bash)?

    Как проверить, остановлен ли процесс из командной строки?

    У меня есть диск с 24 ГБ и жесткий диск 1 Тб. Как получить Ubuntu для установки на моем 24 ГБ и моем домашнем каталоге на 1 ТБ

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