首页 文章

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

提问于
浏览
362

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

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

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

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

14 回答

  • 419
    truncate -s 10M output.file
    

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

    EDIT: 正如许多人所指出的那样,这不会在您的设备上物理分配文件 . 通过这种方式,无论设备上的可用空间如何,您实际上都可以创建任意大文件

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

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

  • 3

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

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

    如果您的应用程序需要该文件具有一定的大小,则由外部程序来跟踪它在“文件”中的位置,并在达到“结束”时发送eof .

  • 8

    一种方法:如果您可以保证不相关的应用程序不会以冲突的方式使用这些文件,只需在特定目录中创建不同大小的文件池,然后在需要时创建指向它们的链接 .

    例如,有一个名为的文件池:

    • / 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文件可用于确保不相关的应用程序之间没有冲突的使用 .

    链接操作的速度和您一样快 .

  • 5

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

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

    dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G
    

    truncate是另一种选择 - 而且可能是最快的......但那是因为它创造了一个"sparse file" . 本质上,稀疏文件是具有大量相同数据的磁盘的一部分,而底层文件系统"cheats"并没有真正存储所有数据,而只是"pretending"它实际上分配了20 GB,但它作弊并说那里有20 GB的零,即使磁盘上的一个磁道实际上(真的)可能正在使用中 . 例如 . :

    truncate -s 10G gentoo_root.img
    

    fallocate is the final - 和 best - choice 用于VM磁盘分配,因为它基本上是"reserves"(或者"allocates"所有空间,你很难写任何东西 . 所以,当你使用fallocate创建一个20 GB的虚拟驱动器空间时,你真的得到一个20 GB的文件(不是"sparse file",你不会费心去写任何东西 - 这意味着几乎任何东西都可以在那里 - 有点像一个全新的磁盘!)例如:

    fallocate -l 10G gentoo_root.img
    
  • 2

    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联机帮助页:

    BLOCKS和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 .

  • 128

    要制作1 GB的文件:

    dd if=/dev/zero of=filename bs=1G count=1
    
  • 264

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

    #yes >> myfile
    

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

    要清理此文件,请运行:

    #>myfile
    

    将清理此文件 .

  • 42

    这是我能做的最快(快速 not ),具体如下限制:

    • 大文件的目标是填充磁盘,因此无法压缩 .

    • 使用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系统,这很好用,但更喜欢更快的东西 .

    FYI命令“dd if = / dev / urandom of = outputfile bs = 1024 count = XX”是如此之慢以至于无法使用 .

  • 34

    dd 是一个很好的解决方案,但为此目的很慢 . 在Linux中,我们有 fallocate .

    例如:

    fallocate -l 10G gentoo_root.img
    
  • 16

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

    dd if=/dev/zero of=filename bs=1 count=1 seek=1048575
    
  • 86

    我不太了解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");
        }
    }
    
  • 2

    无耻插件:OTFFS提供了一个文件系统,可以提供任意大的(好的,几乎是Exabytes是当前限制)生成内容的文件 . 它只是Linux,普通的C和早期的alpha .

    https://github.com/s5k6/otffs .

  • 12

    GPL mkfile只是围绕dd的(ba)sh脚本包装器; BSD的mkfile只是将一个非零的缓冲区存储起来并重复写入 . 我不希望前者超过dd . 后者可能会略微超出dd if = / dev / zero,因为它省略了读取,但任何做得更好的东西可能只是创建一个稀疏文件 .

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

  • 1

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

相关问题