![Как заполнить жесткий диск в Linux](https://rvso.com/image/1259416/%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B6%D0%B5%D1%81%D1%82%D0%BA%D0%B8%D0%B9%20%D0%B4%D0%B8%D1%81%D0%BA%20%D0%B2%20Linux.png)
Я тестирую часть кода и хочу заполнить жесткий диск данными. Я обнаружил, что это dd
может создавать огромные файлы в одно мгновение, но df
не подходит. Вот что я попробовал:
dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))
ls -lh
показывает файл 10G. Однако df -h
показывает, что раздел не сжался. Так что мне нужно сделать, чтобы df
распознать, что данные теперь взяты? Я надеюсь на что-то быстрое, что я закодирую в юнит-тесте.
решение1
Проблема этого seek=<big number>
трюка в том, что файловая система (обычно) умна: если часть файла никогда не записывалась (и, следовательно, заполнена нулями), она не утруждает себя выделением для нее места — так что, как вы видели, у вас может быть файл размером 10 ГБ, который не занимает места (это называется «разреженный файл» и может быть очень полезным в некоторых случаях, например, в определенных реализациях баз данных).
Вы можете принудительно выделить пространство (например):
dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))
что займет гораздо больше времени, но фактически заполнит диск. Я рекомендую сделать размер блока намного больше единицы, потому что это определит, сколько системных вызовов dd
сделает процесс — чем меньше размер блока, тем больше системных вызовов, и, следовательно, тем медленнее он будет работать. (Хотя за пределами 1 МБ или около того это, вероятно, не будет иметь большого значения и может даже замедлить работу...)
решение2
В качестве другого варианта вы можете использовать yes вместе с одной строкой, и это примерно в 10 раз быстрее, чем запуск dd if=/dev/urandom of=largefile. Вот так
yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
решение3
Вы создали так называемый «разреженный файл» — файл, который, поскольку большая его часть пуста (т. е. читается как \0), не занимает места на диске, кроме того, что фактически записано (1 Б после 10 ГБ пробела).
Я не верю, что можно создавать огромные файлы, мгновенно занимающие реальное дисковое пространство — занятие физического пространства означает, что файловой системе придется выделять блоки на диске для вашего файла.
Думаю, вы застряли со старомодным «dd if=/dev/zero of=filename bs=100M count=100», который ограничен скоростью последовательной записи вашего диска.
решение4
Прекратите использовать seek
и используйте очень большой bs
и/или count
. Как это вы делаетеразреженный файл, и очевидно, что вам не следует этого делать.