在 Linux 系统上快速创建不可压缩的大文件

Quickly create an uncompressible large file on a Linux system

在 Linux 系统上,我需要创建一个大文件(大约 10GB),不可压缩的文件。

此文件应该驻留在 Docker 图像中,需要测试在本地注册表中传输和存储大型 docker 图像的性能。因此,我需要图像“本质上”大(即:不可压缩),以绕过优化机制。

fallocate(在 Quickly create a large file on a Linux system 中描述)非常适合快速创建大文件,但结果是一个 0 熵大文件,高度可压缩。大图推送到registry时,只需要几MB。

那么,如何创建一个大的、不可压缩的文件?

您可以托盘使用 /dev/urandom/dev/random 来填充您的文件,例如

@debian-10:~$ SECONDS=0; dd if=/dev/urandom of=testfile bs=10M count=1000 ;echo $SECONDS
1000+0 record in
1000+0 record out
10485760000 bytes (10 GB, 9,8 GiB) copied, 171,516 s, 61,1 MB/s
171

使用更大的 bs 需要一点时间:

*@debian-10:~$ SECONDS=0; dd if=/dev/urandom of=testfile bs=30M count=320 ;echo $SECONDS
320+0 record in
320+0 record out
10066329600 bytes (10 GB, 9,4 GiB) copied, 164,498 s, 61,2 MB/s
165

171秒VS。 165 秒

在 4GiB 的真实数据上花费不到 3 分钟是否可以接受?

一个“随机集”可以通过给dd准备好数据而不是生成它来获得。 最简单的方法是使用已满程度大于所需文件大小的磁盘, 我使用了带有随机二进制文件和视频的磁盘。如果你担心数据泄露,你可以用一些东西来处理你的数据。

一切都去 /dev/shm,因为写入 RAM 比写入磁盘快得多。 当然,必须有足够的空闲 space 我有 4GB 所以示例中的文件是 4GB 我的处理器是第一代老i7。

% time dd if=/dev/sdb count=40 bs=100M >/dev/shm/zerofil
40+0 records in
40+0 records out
4194304000 bytes (4,2 GB, 3,9 GiB) copied, 163,211 s, 25,7 MB/s

real    2m43.313s
user    0m0.000s
sys     0m6.032s

% ls -lh /dev/shm/zerofil
-rw-r--r-- 1 root root 4,0G mar  5 13:11 zerofil

% more /dev/shm/zerofil
3��؎м
f`f1һ���r�f�F����fa�v
f�fFf��0�r'f�>
^���>b��<
...