如何 quickly 在Linux(Red Hat Linux)系统上创建大文件?
dd将完成这项工作,但读取 /dev/zero
并写入驱动器可能需要很长时间才需要一个数百GB的文件进行测试......如果你需要反复这样做,那么时间真的会增加 .
我不关心文件的内容,我只是想快速创建它 . 如何才能做到这一点?
使用稀疏文件不适用于此 . 我需要为文件分配磁盘空间 .
如何 quickly 在Linux(Red Hat Linux)系统上创建大文件?
dd将完成这项工作,但读取 /dev/zero
并写入驱动器可能需要很长时间才需要一个数百GB的文件进行测试......如果你需要反复这样做,那么时间真的会增加 .
我不关心文件的内容,我只是想快速创建它 . 如何才能做到这一点?
使用稀疏文件不适用于此 . 我需要为文件分配磁盘空间 .
14 回答
将立即创建一个10 M文件(M代表1024 * 1024字节,MB代表1000 * 1000 - 与K,KB,G,GB相同......)
EDIT: 正如许多人所指出的那样,这不会在您的设备上物理分配文件 . 通过这种方式,无论设备上的可用空间如何,您实际上都可以创建任意大文件
因此,在执行此操作时,您将推迟物理分配,直到访问该文件 . 如果要将此文件映射到内存,则可能无法获得预期的性能 .
但这仍然是一个有用的命令
我认为你不会比dd快得多 . 瓶颈是磁盘;无论你怎么做,写入数百GB的数据都需要很长时间 .
但是这可能适用于您的应用程序 . 如果你不关心文件的内容,那么如何创建一个内容是程序动态输出的“虚拟”文件呢?而不是打开()文件,使用popen()打开到外部程序的管道 . 外部程序在需要时生成数据 . 一旦管道打开,它就像一个普通文件一样,打开管道的程序可以fseek(),rewind()等 . 当你需要时,你需要使用pclose()而不是close()完成管道 .
如果您的应用程序需要该文件具有一定的大小,则由外部程序来跟踪它在“文件”中的位置,并在达到“结束”时发送eof .
一种方法:如果您可以保证不相关的应用程序不会以冲突的方式使用这些文件,只需在特定目录中创建不同大小的文件池,然后在需要时创建指向它们的链接 .
例如,有一个名为的文件池:
/ home / bigfiles / 512M-A
/ home / bigfiles / 512M-B
/ home / bigfiles / 1024M-A
/ home / bigfiles / 1024M-B
然后,如果您的应用程序需要名为/ home / oracle / logfile的1G文件,请执行“
ln /home/bigfiles/1024M-A /home/oracle/logfile
” .如果它位于单独的文件系统上,则必须使用符号链接 .
A / B / etc文件可用于确保不相关的应用程序之间没有冲突的使用 .
链接操作的速度和您一样快 .
这是一个常见问题 - 尤其是在当今的虚拟环境环境中 . 不幸的是,答案并不像人们想象的那样直截了当 .
dd是显而易见的第一选择,但是dd本质上是一个副本,它强制你编写每个数据块(因此,初始化文件内容)......并且初始化占用了大量的I / O时间 . (想要花更长的时间吗?使用/dev/random而不是/dev/zero!然后你将使用CPU以及I / O时间!)最后,dd是一个糟糕的选择(虽然基本上是VM使用的默认值"create"图形用户界面) . 例如:
truncate是另一种选择 - 而且可能是最快的......但那是因为它创造了一个"sparse file" . 本质上,稀疏文件是具有大量相同数据的磁盘的一部分,而底层文件系统"cheats"并没有真正存储所有数据,而只是"pretending"它实际上分配了20 GB,但它作弊并说那里有20 GB的零,即使磁盘上的一个磁道实际上(真的)可能正在使用中 . 例如 . :
fallocate is the final - 和 best - choice 用于VM磁盘分配,因为它基本上是"reserves"(或者"allocates"所有空间,你很难写任何东西 . 所以,当你使用fallocate创建一个20 GB的虚拟驱动器空间时,你真的得到一个20 GB的文件(不是"sparse file",你不会费心去写任何东西 - 这意味着几乎任何东西都可以在那里 - 有点像一个全新的磁盘!)例如:
seek的示例是您想要的文件大小(以字节为单位)
从dd联机帮助页:
要制作1 GB的文件:
您也可以使用“是”命令 . 语法很简单:
按“Ctrl C”停止此操作,否则会占用所有可用空间 .
要清理此文件,请运行:
将清理此文件 .
这是我能做的最快(快速 not ),具体如下限制:
大文件的目标是填充磁盘,因此无法压缩 .
使用ext3文件系统 . (fallocate不可用)
这是它的要点......`
`
在我们的例子中,这是一个嵌入式Linux系统,这很好用,但更喜欢更快的东西 .
FYI命令“dd if = / dev / urandom of = outputfile bs = 1024 count = XX”是如此之慢以至于无法使用 .
dd
是一个很好的解决方案,但为此目的很慢 . 在Linux中,我们有fallocate
.例如:
seek是你想要的文件大小,以字节为单位 - 1 .
我不太了解Linux,但是这里是我多年前在DC Share上伪造大文件的C代码 .
无耻插件:OTFFS提供了一个文件系统,可以提供任意大的(好的,几乎是Exabytes是当前限制)生成内容的文件 . 它只是Linux,普通的C和早期的alpha .
见https://github.com/s5k6/otffs .
GPL mkfile只是围绕dd的(ba)sh脚本包装器; BSD的mkfile只是将一个非零的缓冲区存储起来并重复写入 . 我不希望前者超过dd . 后者可能会略微超出dd if = / dev / zero,因为它省略了读取,但任何做得更好的东西可能只是创建一个稀疏文件 .
缺少实际为文件分配空间而不写入数据的系统调用(Linux和BSD缺少此功能,可能还有Solaris),通过使用ftrunc(2)/ truncate(1)扩展文件,可能会获得性能上的小改进到所需的大小,将文件mmap到内存中,然后将非零数据写入每个磁盘块的第一个字节(使用fgetconf查找磁盘块大小) .
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),但速度最快,因为它分配了所有文件空间(创建了无孔文件),但没有初始化任何一个 .