Быстро создать большой файл в системе Linux - PullRequest
385 голосов
/ 03 ноября 2008

Как я могу быстро создать большой файл в системе Linux ( Red Hat Linux )?

dd выполнит эту работу, но чтение с /dev/zero и запись на диск может занять много времени, когда вам нужен файл размером несколько сотен ГБ для тестирования ... Если вам нужно чтобы сделать это несколько раз, время действительно складывается.

Меня не волнует содержимое файла, я просто хочу, чтобы он был создан быстро. Как это можно сделать?

Использование разреженного файла не подойдет для этого. Мне нужно, чтобы файл был выделен на диске.

Ответы [ 14 ]

447 голосов
/ 16 апреля 2011

dd из других ответов - хорошее решение, но оно медленное для этой цели. В Linux (и других системах POSIX) у нас есть fallocate, который использует желаемое пространство без необходимости его фактической записи, работает с большинством современных дисковых файловых систем, очень быстро:

Например:

fallocate -l 10G gentoo_root.img
278 голосов
/ 02 августа 2012

Это общий вопрос, особенно в современной среде виртуальных сред. К сожалению, ответ не так прост, как можно предположить.

dd является очевидным первым выбором, но dd по сути является копией, и это заставляет вас записывать каждый блок данных (таким образом, инициализируя содержимое файла) ... И эта инициализация - это то, что отнимает так много времени ввода-вывода , (Хотите, чтобы это заняло еще больше времени? Используйте / dev / random вместо / dev / zero ! Тогда вы будете использовать процессор и время ввода-вывода!) В В конце концов, dd - плохой выбор (хотя по умолчанию виртуальная машина по умолчанию "создает" GUI). Например:

dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G

усечение - другой выбор - и, вероятно, самый быстрый ... Но это потому, что он создает "разреженный файл". По сути, разреженный файл - это раздел диска, который содержит много одинаковых данных, и основная файловая система «обманывает», на самом деле не сохраняя все данные, а просто «притворяясь», что все это есть. Таким образом, когда вы используете усечение для создания 20 ГБ диска для вашей виртуальной машины, файловая система фактически не выделяет 20 ГБ, но обманывает и говорит, что там есть 20 ГБ нулей, хотя всего одна дорожка на диске может фактически (действительно) использоваться. E.g.:

 truncate -s 10G gentoo_root.img

fallocate является окончательным - и наилучшим - выбором для использования с диском виртуальных машин, поскольку он по существу «резервирует» (или «выделяет») все пространство, которое вы ищете, но ничего не пишите. Поэтому, когда вы используете fallocate для создания виртуального дискового пространства объемом 20 ГБ, вы действительно получаете файл размером 20 ГБ (а не «разреженный файл», и вы не потрудитесь написать что-нибудь на него - а это значит, что там может быть что угодно - что-то вроде нового диска!) Например:

fallocate -l 10G gentoo_root.img
136 голосов
/ 03 ноября 2008

Linux и все файловые системы

xfs_mkfile 10240m 10Gigfile

Linux & и некоторые файловые системы (ext4, xfs, btrfs и ocfs2)

fallocate -l 10G 10Gigfile

OS X, Solaris, SunOS и, возможно, другие UNIX *

mkfile 10240m 10Gigfile

HP-UX

prealloc 10Gigfile 10737418240

Объяснение

Попробуйте mkfile <size> myfile в качестве альтернативы dd. С опцией -n размер отмечается, но дисковые блоки не выделяются до тех пор, пока в них не будут записаны данные. Без опции -n пробел заполняется нулями, что означает запись на диск, что означает время.

mkfile является производным от SunOS и доступен не везде. Большинство систем Linux имеют xfs_mkfile, который работает точно так же, и не только в файловых системах XFS, несмотря на название. Он включен в xfsprogs (для Debian / Ubuntu) или аналогичных именованных пакетах.

Большинство систем Linux также имеют fallocate, который работает только на определенных файловых системах (таких как btrfs, ext4, ocfs2 и xfs), но является самым быстрым, поскольку он выделяет все файловое пространство (создает не дырявые файлы), но не инициализирует ничего из этого.

92 голосов
/ 20 августа 2010
truncate -s 10M output.file

создаст файл размером 10 M мгновенно (M означает 1024 * 1024 байта, MB означает 1000 * 1000 - то же самое с K, KB, G, GB ...)

РЕДАКТИРОВАТЬ: , как отмечали многие, это не будет физически распределять файл на вашем устройстве. При этом вы можете создать произвольный большой файл независимо от доступного места на устройстве, поскольку он создает «разреженный» файл.

Таким образом, при этом вы будете откладывать физическое распределение до получения доступа к файлу. Если вы отображаете этот файл в память, у вас может не быть ожидаемой производительности.

Но это все еще полезная команда, чтобы знать

42 голосов
/ 03 ноября 2008

Где искать - размер файла, который вы хотите в байтах - 1.

dd if=/dev/zero of=filename bs=1 count=1 seek=1048575
34 голосов
/ 22 февраля 2012

Примеры, где искать - это размер файла, который вы хотите в байтах

#kilobytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200K

#megabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200M

#gigabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200G

#terabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200T


Из справочной страницы дд:

За блоками и байтами могут следовать следующие мультипликативные суффиксы: c = 1, w = 2, b = 512, кБ = 1000, K = 1024, МБ = 1000 * 1000, M = 1024 * 1024, GB = 1000 *1000* 1000, G = 1024 *1024* 1024 и т. Д. Для T, P, E, Z, Y.

16 голосов
/ 25 апреля 2012

Я не очень много знаю о Linux, но вот код C, который я написал, чтобы подделывать огромные файлы на DC Share много лет назад.

#include < stdio.h >
#include < stdlib.h >

int main() {
    int i;
    FILE *fp;

    fp=fopen("bigfakefile.txt","w");

    for(i=0;i<(1024*1024);i++) {
        fseek(fp,(1024*1024),SEEK_CUR);
        fprintf(fp,"C");
    }
}
14 голосов
/ 27 сентября 2015

Чтобы создать файл размером 1 ГБ:

dd if=/dev/zero of=filename bs=1G count=1
8 голосов
/ 12 декабря 2013

Вы также можете использовать команду «да». Синтаксис довольно прост:

#yes >> myfile

Нажмите «Ctrl + C», чтобы остановить это, иначе оно съест все ваше доступное пространство.

Чтобы очистить этот файл, запустите:

#>myfile

очистит этот файл.

5 голосов
/ 03 ноября 2008

Я не думаю, что вы получите намного быстрее, чем дд. Узким местом является диск; запись сотен гигабайт данных займет много времени, независимо от того, как вы это делаете.

Но вот возможность, которая может работать для вашего приложения. Если вас не волнует содержимое файла, как насчет создания «виртуального» файла, содержимое которого является динамическим выводом программы? Вместо открытия () файла, используйте popen (), чтобы открыть канал к внешней программе. Внешняя программа генерирует данные всякий раз, когда это необходимо. Когда канал открыт, он действует как обычный файл, так как программа, открывшая канал, может использовать fseek (), rewind () и т. Д. Вам нужно будет использовать pclose () вместо close (), когда вы сделано с трубой.

Если вашему приложению нужен файл определенного размера, внешняя программа должна будет отследить, где он находится в «файле», и отправить eof, когда достигнут «конец».

...