23

Я тестирую часть кода и хочу заполнить жесткий диск данными. Я обнаружил, что dd может создавать огромные файлы в одно мгновение, но df не согласен. Вот что я попробовал:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lh показывает файл 10G. Однако df -h показывает, что раздел не сжимался. Итак, что мне нужно сделать, чтобы df распознал, что данные взяты? Я надеюсь на что-то быстрое, что я кодирую в модульном тесте.

7 ответов7

25

Проблема с уловкой seek=<big number> состоит в том, что файловая система (обычно) умна: если часть файла никогда не записывалась (и, следовательно, является всеми нулями), она не удосуживается выделить для нее место. Итак, как вы видели, у вас может быть файл объемом 10 ГБ, который не занимает места (это называется "разреженным файлом" и может быть очень полезен в некоторых случаях, например, при определенных реализациях базы данных).

Вы можете принудительно распределить пространство с помощью (например):

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

что займет гораздо больше времени, но на самом деле заполнит диск. Я рекомендую сделать размер блока намного больше единицы, потому что это будет определять, сколько системных вызовов вызывает процесс dd - чем меньше размер блока, тем больше системных вызовов и, следовательно, тем медленнее он будет работать. (Хотя за пределами 1 МБ или около того это, вероятно, не будет иметь большого значения и может даже замедлить ход событий ...)

18

В качестве другого варианта этого вы можете использовать yes вместе с одной строкой, и это примерно в 10 раз быстрее, чем запускать dd, если =/dev/urandom of = largefile. Как это

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
7

Вы создали так называемый "разреженный файл" - файл, который, поскольку большая его часть пуста (т. Е. Считывается как \0), не занимает места на диске, кроме того, что фактически записано (1B, после 10 ГБ). разрыва).

Я не верю, что вы могли бы создавать огромные файлы, мгновенно занимая реальное дисковое пространство - занимая физическое пространство, значит, файловая система должна распределять блоки диска для вашего файла.

Я думаю, что вы застряли со старомодным «dd if =/dev/zero of = filename bs = 100M count = 100», которое ограничено скоростью последовательной записи вашего диска.

6

Если вы просто тестируете случаи с заполненными файловыми системами, возможно, Fallocate достаточно хорош. И быстрее тоже! например

Fallocate -l 150G

3

Прекратите использовать seek и используйте очень большой bs и / или count . Так как вы создаете разреженный файл, и, очевидно, вам не нужно этого делать.

3

Если вы хотите буквально заполнить жесткий диск, сделайте это:

dd if=/dev/zero of=zeros bs=1M

Вы можете при желании указать количество, если вы хотите ограничить размер, но если вы опустите счет, он будет работать до тех пор, пока у вас не будет свободного места на диске.

dd if=/dev/zero of=zeros bs=1M count=10240

Как упоминалось в psmears, вы получите лучшую производительность, если установите размер блока в 1 МБ (bs = 1M) вместо 1 B (bs = 1). Это все еще займет некоторое время, но если вы хотите проверить ход выполнения вашей команды, откройте отдельную консоль и выполните следующие команды:

ps aux | grep dd

Используйте PID dd в этой команде (замените PID на pid dd):

kill -USR1 PID

Тогда посмотрите на ваш терминал. Конечно, это ограниченное использование, когда вы просто пытаетесь заполнить диск (вы можете просто использовать df или du для проверки свободного места на диске или размера файла, соответственно). Однако бывают и другие случаи, когда удобно, чтобы dd выводил свой прогресс.

Дополнительный кредит: одно практическое использование для обнуления свободного места состоит в том, что после этого вы можете затем удалить "нулевые" файлы и добавить весь раздел (или диск, если вы обнулили все разделы) в файл образа диска (скажем, , disk-backup.dd), затем сожмите файл. Свободное пространство теперь очень сжимаемо, поэтому ваше сжатое dd-изображение будет намного меньше оригинального блочного устройства, содержимое которого оно содержит.

Shenanigans: заархивируйте большой файл с нулями и отправьте его по электронной почте всем своим друзьям. Скажи им, что это действительно круто.

2

Вы создаете не разреженный файл объемом 1 ТБ с помощью следующей команды:

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

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

df -h показывает, что доступное пространство становится меньше.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .