如何在Linux (Red Hat Linux)系统中快速创建大文件?

dd可以完成这项工作,但是从/dev/zero读取并写入驱动器可能会花费很长时间,因为您需要一个几百gb大小的文件进行测试……如果你需要重复这样做,时间就会增加。

我不关心文件的内容,我只想快速创建它。如何做到这一点呢?

使用稀疏文件不能解决这个问题。我需要为文件分配磁盘空间。


当前回答

truncate -s 10M output.file

将立即创建一个10m的文件(M代表10241024字节,MB代表10001000 -与K, KB, G, GB…相同)

编辑:正如许多人指出的那样,这将不会在您的设备上物理分配文件。这样你就可以创建一个任意的大文件,而不管设备上的可用空间有多大,因为它创建了一个“稀疏”文件。

例如,注意到这个命令没有占用硬盘空间:

### BEFORE
$ df -h | grep lvm
/dev/mapper/lvm--raid0-lvm0
                      7.2T  6.6T  232G  97% /export/lvm-raid0

$ truncate -s 500M 500MB.file

### AFTER
$ df -h | grep lvm
/dev/mapper/lvm--raid0-lvm0
                      7.2T  6.6T  232G  97% /export/lvm-raid0

因此,在执行此操作时,您将推迟物理分配,直到文件被访问为止。如果将此文件映射到内存,则可能无法获得预期的性能。

但这仍然是一个需要知道的有用命令。例如,当使用文件进行基准传输时,指定的文件大小仍然会被移动。

$ rsync -aHAxvP --numeric-ids --delete --info=progress2 \
       root@mulder.bub.lan:/export/lvm-raid0/500MB.file \
       /export/raid1/
receiving incremental file list
500MB.file
    524,288,000 100%   41.40MB/s    0:00:12 (xfr#1, to-chk=0/1)

sent 30 bytes  received 524,352,082 bytes  38,840,897.19 bytes/sec
total size is 524,288,000  speedup is 1.00

其他回答

我对Linux不太了解,但这是我多年前在DC共享上编写的伪造大文件的C代码。

#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");
    }
}

所以我想用重复的ascii字符串创建一个大文件。“为什么?”你可能会问。因为我需要使用它进行一些NFS故障排除。我需要文件是可压缩的,因为我正在与我们NAS的供应商共享文件副本的tcpdump。我最初创建了一个1g的文件,里面装满了来自/dev/urandom的随机数据,但当然,由于它是随机的,这意味着它根本不会压缩,我需要将完整的1g数据发送给供应商,这很困难。

因此,我创建了一个文件,其中包含所有可打印的ascii字符,一遍又一遍地重复,大小限制为1g。我担心会花很长时间。恕我直言,事情进展得非常快:

cd /dev/shm
date
time yes $(for ((i=32;i<127;i++)) do printf "\\$(printf %03o "$i")"; done) | head -c 1073741824 > ascii1g_file.txt
date

Wed Apr 20 12:30:13 CDT 2022

real    0m0.773s
user    0m0.060s
sys     0m1.195s
Wed Apr 20 12:30:14 CDT 2022

将它从nfs分区复制到/dev/shm所花费的时间与随机文件一样长(我知道,这是人们所期望的,但我想确定):

cp ascii1gfile.txt /home/greygnome/
uptime; free -m; sync; echo 1 > /proc/sys/vm/drop_caches; free -m; date; dd if=/home/greygnome/ascii1gfile.txt of=/dev/shm/outfile bs=16384 2>&1; date; rm -f /dev/shm/outfile 

但在这样做的同时,我运行了一个tcpdump:

tcpdump -i em1 -w /dev/shm/dump.pcap

我能够将pcap文件压缩到12M大小!Awesomesauce !

编辑:在你因为OP说“我不关心内容”而指责我之前,要知道我发布这个答案是因为它是谷歌搜索中“如何创建一个大文件linux”的第一个回答之一。有时,忽略文件的内容可能会产生不可预见的副作用。 编辑2:fallocate在许多文件系统上似乎不可用,在1.2秒内创建一个1GB的可压缩文件对我来说似乎很不错(也就是“快速”)。

我不认为你会比dd快很多,瓶颈是磁盘;无论你怎么做,写入几百GB的数据都将花费很长时间。

But here's a possibility that might work for your application. If you don't care about the contents of the file, how about creating a "virtual" file whose contents are the dynamic output of a program? Instead of open()ing the file, use popen() to open a pipe to an external program. The external program generates data whenever it's needed. Once the pipe is open, it acts just like a regular file in that the program that opened the pipe can fseek(), rewind(), etc. You'll need to use pclose() instead of close() when you're done with the pipe.

如果你的应用程序需要文件有一定的大小,它将由外部程序来跟踪它在“文件”中的位置,并在到达“结束”时发送一个eof。

其中seek是你想要的文件的大小,单位是字节- 1。

dd if=/dev/zero of=filename bs=1 count=1 seek=1048575

你可以使用https://github.com/flew-software/trash-dump 您可以创建任意大小和随机数据的文件

这里有一个命令,你可以在安装垃圾转储(创建一个1GB的文件)后运行

$ trash-dump --filename="huge" --seed=1232 --noBytes=1000000000

顺便说一下,这是我创造的