在Linux系统上快速创建大文件

DrS*_*ker 406 linux filesystems file

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

dd将完成这项工作,但是/dev/zero当您需要一个数百GB的文件进行测试时,读取和写入驱动器可能需要很长时间......如果您需要重复这样做,那么时间真的会增加.

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

使用稀疏文件不适用于此.我需要为文件分配磁盘空间.

Fra*_*nta 478

dd从其他答案是一个很好的解决方案,但它为此目的缓慢.在Linux(和其他POSIX系统)中,我们fallocate使用所需的空间而不必实际写入它,可以与大多数现代的基于磁盘的文件系统一起使用,速度非常快:

例如:

fallocate -l 10G gentoo_root.img
Run Code Online (Sandbox Code Playgroud)

  • `fallocate`正是我想要的. (19认同)
  • 这个(`fallocate`)也不适用于Linux ZFS文件系统 - https://github.com/zfsonlinux/zfs/issues/326 (6认同)
  • dd是否有可能在内部使用它?如果我在3.0.0内核上执行'dd if =/dev/zero of = zerofile bs = 1G count = 1',则写入在2秒内完成,写入数据速率超过每秒500兆字节.这在2.5英寸笔记本电脑硬盘上显然是不可能的. (5认同)
  • 请注意,fallocate不适用于`tmpfs`文件系统. (5认同)
  • ext3也不支持fallocate.https://bugzilla.redhat.com/show_bug.cgi?id=563492 (5认同)
  • 在Debian GNU/Linux中,`fallocate`是`util-linux`包的一部分.这个工具是由RedHat的Karel Zak编写的,源代码可以在这里找到:https://www.kernel.org/pub/linux/utils/util-linux/ (2认同)
  • 看起来 Linux 内核 3.5 中的“tmpfs”中添加了对“fallocate”的支持:https://kernelnewbies.org/Linux_3.5 (2认同)

小智 284

这是一个常见问题 - 尤其是在当今的虚拟环境环境中.不幸的是,答案并不像人们想象的那样直截了当.

dd是明显的第一选择,但是dd本质上是一个副本,它强制你编写每个数据块(因此,初始化文件内容)......并且初始化占用了大量的I/O时间.(想要花更长的时间吗?使用/ dev/random而不是/ dev/zero!那么你将使用CPU以及I/O时间!)最后,dd是一个糟糕的选择(尽管基本上是VM"创建"GUI使用的默认值.例如:

dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G
Run Code Online (Sandbox Code Playgroud)

truncate是另一种选择 - 并且可能是最快的......但那是因为它创建了一个"稀疏文件".本质上,稀疏文件是具有大量相同数据的磁盘的一部分,并且底层文件系统通过不真正存储所有数据来"欺骗",而只是"假装"它就在那里.因此,当您使用truncate为您的VM创建一个20 GB的驱动器时,文件系统实际上并没有分配20 GB,但它会欺骗并说有20 GB的零,即使磁盘上只有一个磁道实际上(真的)可能正在使用中.例如:

 truncate -s 10G gentoo_root.img
Run Code Online (Sandbox Code Playgroud)

fallocate是最后-和最佳 - 选择与VM磁盘分配使用,因为它基本上是"储备"(或"分配"所有你正在寻找的空间,但它并没有刻意去写东西所以.当你使用fallocate来创建一个20 GB的虚拟驱动器空间时,你确实得到了一个20 GB的文件(不是"稀疏文件",你也不会为它写任何东西而烦恼 - 这意味着几乎任何东西都可以在那里 - 有点像一个全新的磁盘!)例如:

fallocate -l 10G gentoo_root.img
Run Code Online (Sandbox Code Playgroud)

  • +1` truncate`在JFS上起作用; `fallocate`,不是那么多.一点:你不能在数字中包含小数,我需要指定`1536G`,而不是`1.5T`. (4认同)
  • 注意`swapon` 不幸的是不适用于预先分配的范围,最后我检查了。在 XFS 邮件列表上有一些关于使用 fallocate 选项来公开旧的空闲空间数据而不是将范围标记为预分配的讨论,因此 swapon 可以工作。但我认为从来没有做过任何事情。 (2认同)
  • 仅供参考,尝试从 `/dev/random` 中读取过多数据会导致随机数据用完,并且 *“当熵池为空时,从 /dev/random 读取将阻塞,直到收集到额外的环境噪声”*所以可能需要非常*非常*很长时间 (2认同)

CMS*_*CMS 144

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),但速度最快,因为它分配了所有文件空间(创建了无孔文件),但没有初始化任何文件系统它的.

  • 这个你说的mkfile在哪里,陌生人?它不在默认的RHEL安装中. (5认同)
  • 作为OS X的魅力:`mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img` (4认同)
  • 这是一个solaris实用程序.如果你搜索gpl mkfile,你会发现一些源代码示例. (2认同)
  • `xfs_mkfile` 包含在 Ubuntu 上的 **xfsprogs** 中,在我的 ext3 fs 上就像一个魅力。:) (2认同)

kiv*_*kiv 94

truncate -s 10M output.file
Run Code Online (Sandbox Code Playgroud)

将立即创建一个10 M文件(M代表1024*1024字节,MB代表1000*1000 - 与K,KB,G,GB相同......)

编辑:正如许多人所指出的,这不会在您的设备上物理分配文件.有了这个,您实际上可以创建一个任意大文件,无论设备上的可用空间如何,因为它创建了一个"稀疏"文件.

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

但这仍然是一个有用的命令

  • 这不应该是最好的答案,因为它没有解决问题,下面的'fallocate`答案. (7认同)
  • @GringoSuave但这对于可能有类似但略有不同的问题的人来说仍然有用. (4认同)
  • 当他说这行不通时,为什么建议创建稀疏文件? (2认同)

Zor*_*che 43

seek是你想要的文件大小,以字节为单位 - 1.

dd if=/dev/zero of=filename bs=1 count=1 seek=1048575
Run Code Online (Sandbox Code Playgroud)

  • dd if =/dev/zero of = 01GBfile bs = 1024 count = $((1024*1024)) (7认同)
  • 我喜欢这种方法,但是评论者出于某些原因不想要稀疏文件.:( (6认同)
  • dd if =/dev/zero of = 1GBfile bs = 1000 count = 1000000 (3认同)

Sep*_*ero 35

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
Run Code Online (Sandbox Code Playgroud)


从dd联机帮助页:

BLOCKS和BYTES之后可以跟随以下乘法后缀:c = 1,w = 2,b = 512,kB = 1000,K = 1024,MB = 1000*1000,M = 1024*1024,GB = 1000*1000*对于T,P,E,Z,Y,1000,G = 1024*1024*1024,依此类推.


小智 18

我不太了解Linux,但是这里是我多年前在DC Share上伪造大文件的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");
    }
}
Run Code Online (Sandbox Code Playgroud)


max*_*max 17

制作1 GB文件:

dd if=/dev/zero of=filename bs=1G count=1
Run Code Online (Sandbox Code Playgroud)

  • 我相信伯爵必须是1.(在centos上测试) (7认同)

小智 9

您也可以使用"是"命令.语法很简单:

#yes >> myfile
Run Code Online (Sandbox Code Playgroud)

按"Ctrl + C"停止此操作,否则会占用所有可用空间.

要清理此文件,请运行:

#>myfile
Run Code Online (Sandbox Code Playgroud)

将清理此文件.


Bar*_*own 6

我认为你不会比dd快得多.瓶颈是磁盘; 无论你怎么做,写入数百GB的数据都需要很长时间.

但是这可能适用于您的应用程序.如果您不关心文件的内容,那么创建一个内容是程序动态输出的"虚拟"文件怎么样?而不是打开()文件,使用popen()打开到外部程序的管道.外部程序在需要时生成数据.一旦管道打开,它就像一个普通文件,因为打开管道的程序可以fseek(),rewind()等.当你需要时,你需要使用pclose()而不是close()完成管道.

如果您的应用程序需要将文件设置为特定大小,则由外部程序来跟踪"文件"中的位置,并在达到"结束"时发送eof.


Ale*_*puy 5

GPL mkfile 只是 dd 的 (ba)sh 脚本包装器;BSD 的 mkfile 只是 memset 一个非零的缓冲区并重复写入。我不认为前者的表现优于 dd。后者可能会稍微优于 dd if=/dev/zero,因为它省略了读取,但任何明显更好的方法可能只是创建一个稀疏文件。

如果没有实际为文件分配空间而不写入数据的系统调用(Linux 和 BSD 缺乏这一点,Solaris 也可能如此),您可以通过使用 ftrunc(2)/truncate(1) 扩展文件来获得性能上的小幅改进到所需的大小,将文件 mmap 到内存中,然后将非零数据写入每个磁盘块的第一个字节(使用 fgetconf 查找磁盘块大小)。

  • BSD 和 Linux 实际上已经发生了错误(编辑:现在是 POSIX 并且广泛可用)。 (4认同)