При работе с Linux-системами часто возникает необходимость быстро создать файл большого размера. Это может потребоваться для тестирования производительности дисковой подсистемы при заполнении, проверки лимитов дисковых квот или имитации работы с объемными данными. Традиционный метод, использующий команду dd if=/dev/zero of=test bs=1M count=1024, к сожалению, отличается низкой скоростью, особенно при создании файлов на десятки и сотни гигабайт. Ожидание записи 10 ГБ может занять значительное время, нагружая при этом дисковую подсистему и процессор.

Однако существуют более эффективные и быстрые инструменты для решения этой задачи: fallocate и truncate. Эти команды позволяют создавать файлы практически мгновенно, предлагая разные подходы к выделению дискового пространства.

Мгновенное создание файла с реальным выделением пространства: fallocate

Команда fallocate предназначена для быстрого выделения или освобождения блоков дискового пространства для файла. Она не записывает нули в файл, а лишь помечает блоки как занятые в метаданных файловой системы, что делает процесс практически мгновенным. Файл сразу же занимает указанный объем на диске и готов к использованию в тестах, где важен реальный размер.

Пример создания файла размером 1 ГБ:

fallocate -l 1G hugefile

Эта команда работает на современных файловых системах, таких как ext4, XFS и Btrfs, и значительно ускоряет тестирование, поскольку не требует фактической записи данных.

Создание «разреженного» (sparse) файла: truncate

Команда truncate изменяет размер файла до указанного значения. Если файл увеличивается, он расширяется, при этом новые области остаются «дырявыми» (sparse) — то есть, они не занимают физического пространства на диске, пока в них не будут записаны данные. Это идеальный вариант для сценариев, где необходимо создать файл определенного размера, но при этом не требуется моментально занимать реальное дисковое пространство, например, для эмуляции очень больших файлов или для тестов, где важен логический размер, а не физическое потребление.

Пример создания разреженного файла размером 10 ГБ:

truncate -s 10G sparsefile

Такой файл будет отображаться как имеющий размер 10 ГБ, но при этом фактически займет очень мало места на диске (лишь для своих метаданных).

Основные различия: fallocate vs. dd vs. truncate

  • fallocate: Выделяет реальные физические блоки на диске, но делает это мгновенно, не записывая данные. Файл сразу же занимает указанное место.
  • truncate: Устанавливает логический размер файла. Если файл увеличивается, он становится «разреженным» (sparse), то есть, занимает минимальное физическое пространство до тех пор, пока в него не будут записаны данные.
  • dd if=/dev/zero: Последовательно записывает каждый байт данных (нули) в файл. Это приводит к высокой нагрузке на дисковую подсистему и процессор, что делает процесс очень медленным для больших объемов. Подходит для очень старых файловых систем или специфических сценариев тестирования производительности записи.

Проверка поддержки fallocate файловой системой

Чтобы убедиться, что ваша файловая система поддерживает fallocate, можно выполнить простой тест:

fallocate -l 1M test && rm test

Если команда успешно завершится без сообщений об ошибках, значит, fallocate поддерживается и может быть использован на вашей системе.

Использование fallocate или truncate вместо dd может значительно сэкономить ваше время и ресурсы при создании тестовых файлов, делая процесс системного администрирования и тестирования более эффективным.