Как заполнить жесткий диск в Linux

24

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

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

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

User1
источник
Вам повезет больше, если вы спросите на serverfault.com
Кстати, 10 * 1024 * 1024 * 1024 - это то же самое, что 10 * 2 ** 30, немного проще.
Дельтарай

Ответы:

26

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

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

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

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

psmears
источник
Я обычно использую bs = (независимо от того, какая половина размера кэша находится на диске, который я пишу). На сегодняшний день это хорошо работает при создании образа разделов на больших жестких дисках для последующего изменения размера. ETA: критическое слово HALF.
atroon
20

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

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
deltaray
источник
Удивительно, но это примерно так же быстро, как использование dd if = / dev / zero of = filename bs = 1M.
Bhinesley
Синтаксис тоже легко запомнить.
AWT
7

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

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

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

qdot
источник
6

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

Fallocate -l 150G

uchihaangel
источник
3
Это необходимо имя файла , который будет указан: fallocate -l 150G foo. Тем не менее +1 за упоминание инструмента.
Камиль Мачоровски
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 показывает, что доступное пространство становится меньше.

user75112
источник