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

2024-10-14 08:40:00
admin
原创
85
摘要:问题描述:如何在Linux(Red Hat Linux )系统上快速创建一个大文件?dd可以完成这项工作,但是/dev/zero当您需要几百 GB 大小的文件进行测试时,从驱动器读取和写入驱动器可能需要很长时间......如果您需要重复执行此操作,那么时间就真的会增加。我不关心文件的内容,我只想快速创建它。该...

问题描述:

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

dd可以完成这项工作,但是/dev/zero当您需要几百 GB 大小的文件进行测试时,从驱动器读取和写入驱动器可能需要很长时间......如果您需要重复执行此操作,那么时间就真的会增加。

我不关心文件的内容,我只想快速创建它。该怎么做?

使用稀疏文件对此不起作用。我需要为文件分配磁盘空间。


解决方案 1:

dd从其他答案来看,这是一个很好的解决方案,但对于此目的来说,它很慢。在 Linux(和其他 POSIX 系统)中,我们有fallocate,它使用所需的空间而无需实际写入任何内容,可以与大多数现代基于磁盘的文件系统配合使用,速度非常快:

例如:

fallocate -l 10G gentoo_root.img

解决方案 2:

这是一个常见问题——尤其是在当今的虚拟环境中。不幸的是,答案并不像人们想象的那么简单。

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

truncate是另一种选择——而且可能是最快的……但这是因为它会创建一个“稀疏文件”。本质上,稀疏文件是磁盘上包含大量相同数据的部分,底层文件系统通过不真正存储所有数据而“作弊”,只是“假装”所有数据都在那里。因此,当您使用 truncate 为您的虚拟机创建一个 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

解决方案 3:

Linux 及所有文件系统

xfs_mkfile 10240m 10Gigfile

Linux 和一些文件系统(ext4、xfs、btrfs 和 ocfs2)

fallocate -l 10G 10Gigfile

OS X、Solaris、SunOS 以及其他 UNIX

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)上运行,但速度最快,因为它分配所有文件空间(创建无孔文件)但不会初始化任何文件空间。

解决方案 4:

truncate -s 10M output.file

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

编辑:正如许多人指出的那样,这不会在设备上物理分配文件。这样,您实际上可以创建任意大文件,而不管设备上有多少可用空间,因为它会创建一个“稀疏”文件。

例如,请注意使用此命令不会占用任何硬盘空间:

### BEFORE
$ df -h | grep lvm
/dev/mapper/lvm--raid0-lvm0
                      7.2T  6.6T  232G  97% /export/lvm-raid0

$ truncate -s 500M 500MB.file

### AFTER
$ df -h | grep lvm
/dev/mapper/lvm--raid0-lvm0
                      7.2T  6.6T  232G  97% /export/lvm-raid0

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

但这仍然是一个有用的命令。例如,当使用文件进行基准测试传输时,指定大小的文件仍将被移动。

$ rsync -aHAxvP --numeric-ids --delete --info=progress2 \n       root@mulder.bub.lan:/export/lvm-raid0/500MB.file \n       /export/raid1/
receiving incremental file list
500MB.file
    524,288,000 100%   41.40MB/s    0:00:12 (xfr#1, to-chk=0/1)

sent 30 bytes  received 524,352,082 bytes  38,840,897.19 bytes/sec
total size is 524,288,000  speedup is 1.00

解决方案 5:

其中 seek 是所需文件的大小(以字节为单位)-1。

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

解决方案 6:

示例中 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=10001000、M=10241024、GB =100010001000、G=102410241024,等等,对于 T、P、E、Z、Y。

解决方案 7:

要制作 1 GB 的文件:

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

解决方案 8:

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

解决方案 9:

您也可以使用“yes”命令。语法相当简单:

#yes >> myfile

按“Ctrl + C”停止此操作,否则它将占用所有可用空间。

要清理此文件,请运行:

#>myfile

将清理此文件。

解决方案 10:

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

但是,这里有一种可能适用于您的应用程序的方法。如果您不关心文件的内容,那么创建一个“虚拟”文件怎么样?其内容是程序的动态输出?不要使用 open() 来打开文件,而是使用 popen() 打开通向外部程序的管道。外部程序会在需要时生成数据。一旦打开管道,它就像一个普通文件一样,打开管道的程序可以执行 fseek()、rewind() 等。使用完管道后,您需要使用 pclose() 而不是 close()。

如果您的应用程序需要文件具有一定的大小,则外部程序将负责跟踪文件在“文件”中的位置,并在到达“末尾”时发送 eof。

解决方案 11:

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

缺少一个实际上为文件分配空间而不写入数据的系统调用(Linux 和 BSD 缺少这个,Solaris 可能也缺少这个),您可以通过使用 ftrunc(2)/truncate(1) 将文件扩展到所需大小,将文件 mmap 到内存中,然后将非零数据写入每个磁盘块的第一个字节(使用 fgetconf 查找磁盘块大小),从而略微提高性能。

解决方案 12:

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

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

  • /主页/大文件/512M-A

  • /主页/大文件/512M-B

  • /主页/大文件/1024M-A

  • /主页/大文件/1024M-B

然后,如果您有一个应用程序需要一个名为 /home/oracle/logfile 的 1G 文件,请执行“ ln /home/bigfiles/1024M-A /home/oracle/logfile”。

如果它位于单独的文件系统上,则必须使用符号链接。

A/B/etc 文件可用于确保不相关的应用程序之间不会发生冲突。

链接操作几乎是您能获得的最快速度。

解决方案 13:

这是我能做的最快的事情(但速度并不),但有以下限制:

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

  • 使用 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太慢,无法使用。

解决方案 14:

厚颜无耻的宣传:OTFFS 提供了一种文件系统,它能够提供任意大小(嗯,差不多。EB 是当前限制)的生成内容文件。它仅适用于 Linux,使用纯 C 语言编写,并且处于早期 alpha 阶段。

请参阅https://github.com/s5k6/otffs

解决方案 15:

所以我想创建一个包含重复 ASCII 字符串的大文件。你可能会问:“为什么?”因为我需要使用它来进行一些 NFS 故障排除。我需要文件可压缩,因为我正在与我们的 NAS 供应商共享文件副本的 tcpdump。我最初创建了一个 1g 的文件,里面充满了来自 /dev/urandom 的随机数据,但当然,因为它是随机的,这意味着它根本不会压缩,我需要将完整的 1g 数据发送给供应商,这很困难。

所以我创建了一个包含所有可打印 ASCII 字符的文件,一遍又一遍地重复,大小限制为 1g。我担心这会花很长时间。但实际上,在我看来,它进展得非常快:

cd /dev/shm
date
time yes $(for ((i=32;i<127;i++)) do printf "\\$(printf %03o "$i")"; done) | head -c 1073741824 > ascii1g_file.txt
date

Wed Apr 20 12:30:13 CDT 2022

real    0m0.773s
user    0m0.060s
sys     0m1.195s
Wed Apr 20 12:30:14 CDT 2022

将其从 nfs 分区复制到 /dev/shm 所花的时间与随机文件一样长(我知道这是意料之中的,但我想确定一下):

cp ascii1gfile.txt /home/greygnome/
uptime; free -m; sync; echo 1 > /proc/sys/vm/drop_caches; free -m; date; dd if=/home/greygnome/ascii1gfile.txt of=/dev/shm/outfile bs=16384 2>&1; date; rm -f /dev/shm/outfile 

但在执行此操作的同时,我运行了 tcpdump:

tcpdump -i em1 -w /dev/shm/dump.pcap

我能够将 pcap 文件压缩到 12M 大小!太棒了!

编辑:在你因为原帖说“我不关心内容”而责备我之前,请知道我之所以发布这个答案是因为它是 Google 搜索中对“如何在 Linux 上创建大型文件”的第一个回复。有时,忽略文件的内容可能会产生无法预料的副作用。编辑 2:fallocate在许多文件系统上似乎不可用,在 1.2 秒内创建一个 1GB 的可压缩文件对我来说似乎相当不错(又名“快速”)。

解决方案 16:

您可以使用https://github.com/flew-software/trash-dump
您可以创建任意大小且包含随机数据的文件。

这是安装 trash-dump 后可以运行的命令(创建一个 1GB 的文件)

$ trash-dump --filename="huge" --seed=1232 --noBytes=1000000000

顺便说一下我创建了它

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用