如何在Linux(Red Hat Linux)系统上快速创建大文件?
dd可以完成这项工作,但是/dev/zero
当您需要一个大小为数百GB的文件进行测试时,读取和写入驱动器可能会花费很长时间。
我不在乎文件的内容,我只想快速创建它。如何才能做到这一点?
为此,使用稀疏文件将不起作用。我需要为文件分配磁盘空间。
df
将报告什么?测试执行特定功能的应用程序。答案取决于您要测试的内容。无论如何,我有点晚了-我现在看到
如何在Linux(Red Hat Linux)系统上快速创建大文件?
dd可以完成这项工作,但是/dev/zero
当您需要一个大小为数百GB的文件进行测试时,读取和写入驱动器可能会花费很长时间。
我不在乎文件的内容,我只想快速创建它。如何才能做到这一点?
为此,使用稀疏文件将不起作用。我需要为文件分配磁盘空间。
df
将报告什么?测试执行特定功能的应用程序。答案取决于您要测试的内容。无论如何,我有点晚了-我现在看到
Answers:
dd
其他答案是一个很好的解决方案,但为此目的它很慢。在Linux(和其他POSIX系统)中,我们可以fallocate
使用所需的空间而无需实际写入,可以非常快地与大多数现代的基于磁盘的文件系统一起使用:
例如:
fallocate -l 10G gentoo_root.img
fallocate
正是我想要的。
fallocate
)在Linux ZFS文件系统上也将不起作用-github.com/zfsonlinux/zfs/issues/326
fallocate
是该util-linux
软件包的一部分。该工具是由RedHat的Karel Zak编写的,可在以下位置找到源代码:kernel.org/pub/linux/utils/util-linux
这是一个常见问题-尤其是在当今的虚拟环境中。不幸的是,答案并不像人们想象的那样简单。
dd是最明显的首选,但dd本质上是一个副本,它迫使您写入每个数据块(因此,初始化文件内容)...而且初始化是占用大量I / O时间的方法。(想让它花费更长的时间吗?使用/ dev / random而不是/ dev / zero!然后您将使用CPU和I / O时间!)最后,dd是一个不好的选择(尽管本质上是dd VM“创建” GUI使用的默认值)。例如:
dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G
截断是另一种选择-可能是最快的...但这是因为它会创建“稀疏文件”。本质上,一个稀疏文件是磁盘上具有许多相同数据的部分,而底层文件系统实际上并没有真正存储所有数据,而是“假装”所有数据都在“欺骗”。因此,当您使用truncate为VM创建20 GB的驱动器时,文件系统实际上并没有分配20 GB,但是它作弊并说那里有20 GB的零,即使磁盘上只有一个磁道可能实际上(确实)正在使用。例如:
truncate -s 10G gentoo_root.img
fallocate是最后-和最佳 - 选择与VM磁盘分配使用,因为它基本上是“储备”(或“分配”所有的空间你正在寻找的,但它并没有刻意去写东西所以。当您使用fallocate创建20 GB虚拟驱动器空间时,您确实会得到20 GB文件(而不是“稀疏文件”),并且您也不必费心向其中写入任何内容-这意味着实际上任何内容都可以包含在其中。那里-有点像全新的磁盘!)例如:
fallocate -l 10G gentoo_root.img
truncate
在JFS上起作用;fallocate
, 没那么多。一点:数字中不能包含小数,我需要指定1536G
,而不是1.5T
。
fallocate
手册页,这是只支持btrfs
,ext4
,ocfs2
,和xfs
文件系统
swapon
不幸的是,最后我检查了一下。在XFS邮件列表上进行了一些讨论,其中涉及使用fallocate选项来公开旧的自由空间数据,并且没有将范围标记为预分配,因此swapon将起作用。但是我认为什么也没做。
/dev/random
可能会导致随机数据用尽,并且“当熵池为空时,从/ dev / random进行的读取将阻塞,直到收集到其他环境噪声为止”,因此可能需要非常非常非常很长时间
xfs_mkfile 10240m 10Gigfile
fallocate -l 10G 10Gigfile
mkfile 10240m 10Gigfile
prealloc 10Gigfile 10737418240
尝试使用mkfile <size>
myfile作为替代dd
。使用该-n
选项时,会注明大小,但是直到将数据写入磁盘块时才分配磁盘块。如果没有该-n
选项,则该空间将填充为零,这意味着要写入磁盘,这意味着要花费时间。
mkfile派生自SunOS,并非到处都有。大多数Linux系统具有xfs_mkfile
完全相同的工作方式,尽管有名称,但不仅仅是在XFS文件系统上。它包含在xfsprogs(用于Debian / Ubuntu)或类似的命名软件包中。
大多数Linux系统还具有fallocate
,它仅可在某些文件系统(例如btrfs,ext4,ocfs2和xfs)上工作,但速度最快,因为它会分配所有文件空间(创建非有孔文件),但不会初始化任何文件空间它的。
mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img
xfs_mkfile
包含在Ubuntu的xfsprogs中,在我的ext3 fs上就像一个护身符。:)
truncate -s 10M output.file
会立即创建一个10 M文件(M代表1024 * 1024字节,MB代表1000 * 1000-与K,KB,G,GB ...相同)
编辑:正如许多人指出的那样,这不会在设备上实际分配文件。这样,您实际上可以创建一个任意的大文件,而不管设备上的可用空间如何,因为它会创建一个“稀疏”文件。
因此,这样做时,您将推迟物理分配,直到访问文件为止。如果将此文件映射到内存,则可能无法达到预期的性能。
但这仍然是一个有用的命令
fallocate
下面的答案可以。
搜寻是您想要的文件大小,以字节为单位-1。
dd if=/dev/zero of=filename bs=1 count=1 seek=1048575
truncate
似乎要好得多。
示例,其中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联机帮助页中:
块和字节后面可以跟以下乘法后缀: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。
truncate
。
制作1 GB的文件:
dd if=/dev/zero of=filename bs=1G count=1
dd if=/dev/zero of=filename bs=20G count=1
只会创建2GB的文件!不是20GB。
一种方法:如果可以确保不相关的应用程序不会以冲突的方式使用文件,则只需在特定目录中创建大小不同的文件池,然后在需要时创建指向它们的链接。
例如,有一个名为以下文件的池:
然后,如果您的应用程序需要一个名为/ home / oracle / logfile的1G文件,请执行“ln /home/bigfiles/1024M-A /home/oracle/logfile
”。
如果在单独的文件系统上,则必须使用符号链接。
A / B / etc文件可用于确保不相关的应用程序之间没有冲突的使用。
链接操作的速度尽可能快。
GPL mkfile只是dd周围的(ba)sh脚本包装;BSD的mkfile只是存储一个非零的缓冲区,然后重复写入。我不希望前者的表现优于dd。后者可能会稍微忽略dd if = / dev / zero,因为它会忽略读取,但是做得更好的任何事情可能只是创建一个稀疏文件。
如果没有系统调用实际上为文件分配空间而不写数据(Linux和BSD也缺少此功能,也许还有Solaris),则可以通过使用ftrunc(2)/ truncate(1)扩展文件来在性能上获得小幅提高达到所需大小后,将文件映射到内存,然后将非零数据写入每个磁盘块的第一个字节(使用fgetconf查找磁盘块的大小)。
无耻的插件:OTFFS提供了一个文件系统,该文件系统提供生成的内容的任意大文件(嗯,差不多。埃字节是当前限制)。它是仅限Linux的普通C语言,并且处于早期alpha版本。
这是我可以执行的最快速度(不是很快),但有以下限制:
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
太慢以至无法使用。