如何在Linux (Red Hat Linux)系统中快速创建大文件?
dd可以完成这项工作,但是从/dev/zero读取并写入驱动器可能会花费很长时间,因为您需要一个几百gb大小的文件进行测试……如果你需要重复这样做,时间就会增加。
我不关心文件的内容,我只想快速创建它。如何做到这一点呢?
使用稀疏文件不能解决这个问题。我需要为文件分配磁盘空间。
如何在Linux (Red Hat Linux)系统中快速创建大文件?
dd可以完成这项工作,但是从/dev/zero读取并写入驱动器可能会花费很长时间,因为您需要一个几百gb大小的文件进行测试……如果你需要重复这样做,时间就会增加。
我不关心文件的内容,我只想快速创建它。如何做到这一点呢?
使用稀疏文件不能解决这个问题。我需要为文件分配磁盘空间。
当前回答
GPL mkfile只是dd的一个(ba)sh脚本包装器;BSD的mkfile只是memsets一个非零的缓冲区,并重复写入它。我不期望前者的性能优于dd。后者可能略微优于dd if=/dev/zero,因为它省略了读取操作,但任何性能明显更好的可能只是创建一个稀疏文件。
如果没有一个系统调用实际为文件分配空间而不写入数据(Linux和BSD缺乏这个,可能Solaris也是如此),您可能会通过使用ftrunc(2)/truncate(1)将文件扩展到所需的大小,将文件mmap到内存中,然后将非零数据写入每个磁盘块的第一个字节(使用fgetconf查找磁盘块大小)来获得性能上的小幅改进。
其他回答
这是我在以下约束条件下所能做到的最快速度(并不快):
大文件的目标是填满磁盘,因此不能压缩。 使用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速度太慢,无法使用。
一种方法是:如果可以保证不相关的应用程序不会以冲突的方式使用这些文件,那么只需在特定目录中创建一个大小不同的文件池,然后在需要时创建指向它们的链接。
例如,有一个文件池叫做:
/ home / bigfiles 512M-A / home / bigfiles 512M-B / home / bigfiles 1024M-A / home / bigfiles 1024M-B
然后,如果你有一个应用程序需要一个1G的文件,名为/home/oracle/logfile,执行“ln /home/bigfiles/1024M-A /home/oracle/logfile”。
如果它在单独的文件系统上,则必须使用符号链接。
可以使用A/B/etc文件来确保不相关的应用程序之间没有冲突的使用。
链接操作已经尽可能快了。
你也可以使用“yes”命令。语法相当简单:
#yes >> myfile
按“Ctrl + C”停止它,否则它将耗尽所有可用空间。
要清除该文件,请执行以下命令:
#>myfile
将清除此文件。
其中seek是所需文件大小(以字节为单位)的示例
#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
从dd手册页:
block和BYTES后面可以跟着下面的乘法后缀:c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000, M=1024*1024, GB =1000*1000*1000, G=1024*1024*1024,对于T, P, E, Z, Y,依次类推。
这是一个常见的问题——尤其是在当今的虚拟环境中。不幸的是,答案并不像人们想象的那么简单。
Dd显然是第一选择,但Dd本质上是一个副本,它迫使您写入每个数据块(因此,初始化文件内容)…初始化占用了大量的I/O时间。(想要花更长的时间?使用/dev/random而不是/dev/zero!然后你将使用CPU以及I/O时间!)最后,dd是一个糟糕的选择(尽管它本质上是VM“create”gui使用的默认值)。例句:
dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G
truncate is another choice -- and is likely the fastest... But that is because it creates a "sparse file". Essentially, a sparse file is a section of disk that has a lot of the same data, and the underlying filesystem "cheats" by not really storing all of the data, but just "pretending" that it's all there. Thus, when you use truncate to create a 20 GB drive for your VM, the filesystem doesn't actually allocate 20 GB, but it cheats and says that there are 20 GB of zeros there, even though as little as one track on the disk may actually (really) be in use. E.g.:
truncate -s 10G gentoo_root.img
fallocate是用于虚拟机磁盘分配的最终——也是最好的——选择,因为它本质上是“保留”(或“分配”您正在寻找的所有空间,但它不需要写任何东西。因此,当您使用fallocate创建一个20 GB的虚拟驱动器空间时,您实际上得到了一个20 GB的文件(不是一个“稀疏文件”,并且您不会费心向其写入任何内容—这意味着几乎任何东西都可以在其中—有点像一个全新的磁盘!)例如:
fallocate -l 10G gentoo_root.img