如何在Linux (Red Hat Linux)系统中快速创建大文件?
dd可以完成这项工作,但是从/dev/zero读取并写入驱动器可能会花费很长时间,因为您需要一个几百gb大小的文件进行测试……如果你需要重复这样做,时间就会增加。
我不关心文件的内容,我只想快速创建它。如何做到这一点呢?
使用稀疏文件不能解决这个问题。我需要为文件分配磁盘空间。
如何在Linux (Red Hat Linux)系统中快速创建大文件?
dd可以完成这项工作,但是从/dev/zero读取并写入驱动器可能会花费很长时间,因为您需要一个几百gb大小的文件进行测试……如果你需要重复这样做,时间就会增加。
我不关心文件的内容,我只想快速创建它。如何做到这一点呢?
使用稀疏文件不能解决这个问题。我需要为文件分配磁盘空间。
当前回答
这是我在以下约束条件下所能做到的最快速度(并不快):
大文件的目标是填满磁盘,因此不能压缩。 使用ext3文件系统。(fallocate不可用)
这是它的要点……
// include stdlib.h, stdio.h, and stdint.h
int32_t buf[256]; // Block size.
for (int i = 0; i < 256; ++i)
{
buf[i] = rand(); // random to be non-compressible.
}
FILE* file = fopen("/file/on/your/system", "wb");
int blocksToWrite = 1024 * 1024; // 1 GB
for (int i = 0; i < blocksToWrite; ++i)
{
fwrite(buf, sizeof(int32_t), 256, file);
}
在我们的情况下,这是一个嵌入式linux系统,这工作得很好,但更喜欢更快的东西。
供您参考,命令dd if=/dev/urandom of=outputfile bs=1024 count = XX速度太慢,无法使用。
其他回答
这是我在以下约束条件下所能做到的最快速度(并不快):
大文件的目标是填满磁盘,因此不能压缩。 使用ext3文件系统。(fallocate不可用)
这是它的要点……
// include stdlib.h, stdio.h, and stdint.h
int32_t buf[256]; // Block size.
for (int i = 0; i < 256; ++i)
{
buf[i] = rand(); // random to be non-compressible.
}
FILE* file = fopen("/file/on/your/system", "wb");
int blocksToWrite = 1024 * 1024; // 1 GB
for (int i = 0; i < blocksToWrite; ++i)
{
fwrite(buf, sizeof(int32_t), 256, file);
}
在我们的情况下,这是一个嵌入式linux系统,这工作得很好,但更喜欢更快的东西。
供您参考,命令dd if=/dev/urandom of=outputfile bs=1024 count = XX速度太慢,无法使用。
所以我想用重复的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的可压缩文件对我来说似乎很不错(也就是“快速”)。
创建一个1gb的文件:
dd if=/dev/zero of=filename bs=1G count=1
Linux和所有文件系统
xfs_mkfile 10240m, 10gigs文件
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),但它是最快的,因为它分配所有的文件空间(创建非空洞文件),但不初始化任何文件。
GPL mkfile只是dd的一个(ba)sh脚本包装器;BSD的mkfile只是memsets一个非零的缓冲区,并重复写入它。我不期望前者的性能优于dd。后者可能略微优于dd if=/dev/zero,因为它省略了读取操作,但任何性能明显更好的可能只是创建一个稀疏文件。
如果没有一个系统调用实际为文件分配空间而不写入数据(Linux和BSD缺乏这个,可能Solaris也是如此),您可能会通过使用ftrunc(2)/truncate(1)将文件扩展到所需的大小,将文件mmap到内存中,然后将非零数据写入每个磁盘块的第一个字节(使用fgetconf查找磁盘块大小)来获得性能上的小幅改进。