使用 cloop/create_compressed_fs 创建文件系统映像的最快方法

使用 cloop/create_compressed_fs 创建文件系统映像的最快方法

Cloop 是一个用于挂载压缩块设备映像的 Linux 软件包。create_compressed_fs是用于创建文件系统(或任何类型的文件或块设备)的压缩映像的随附工具。用它创建文件系统映像的最快方法是什么?假设源是一个硬盘上的分区,目标是另一磁盘上的文件。还假设源硬盘是吞吐速度的限制因素。

答案1

这个答案记录了我在尝试优化传输时学到的知识create_compressed_fs

create_compressed_fs在 Ubuntu 20.04 软件包的存储库中可用cloop-util,但 cloop 内核驱动程序不可用。要构建它,请使用来自https://git.launchpad.net/ubuntu/+source/cloop,适用于当前内核。上游源已过时。 Cloop 已添加到 Ubuntu 20.10 中。

create_compressed_fs有许多选项,包括尝试将整个磁盘映像存储在内存中的选项,因此不要使用它。此外,create_compressed_fs由于倾向于每十秒左右停止阅读几秒钟,可能会进行一些内部同步或其他操作。当不读取时,源磁盘会闲置几秒钟。

如果您的源是分区,您可能需要确保将未使用的数据归零以改进压缩。使用fstrim(如果设备支持 TRIM)或zerofree(如果设备不支持 TRIM 但是 ext2/3/4 文件系统)。

首先,找到源分区的大小

sudo blockdev --getsize64 /dev/my-partition

如果源是常规文件使用command ls -l my-imagefile,则大小是所有者和组之后的数字。

为了保证源驱动器保持全速读取,我们要在之前添加一个大的缓冲区create_compressed_fs。该pv工具可以做到这一点,并且还将实时显示吞吐量和缓冲区水平。由于它create_compressed_fs也生成自己的输出,我们希望在不同的终端中运行pv和 ,create_compressed_fs这样它们的输出就不会混乱。创建一个 fifo 让两个进程相互通信:

mkfifo fifo

在一个终端中,运行

create_compressed_fs -B <blocksize> -s <input_size> fifo <output_filename>.cloop

我喜欢使用16K块大小,但这取决于你。

同时在另一个终端中运行

sudo mbuffer -i <path_to_source_device_or_file> -m 1G >fifo

mbuffercreate_compressed_fs现在使用 1 GB 缓冲区在暂停时保持源驱动器繁忙。缓冲区的大小应使其在暂停时不会完全填满,但应确保缓冲区有足够的内存。如果您发现缓冲区始终已满并且create_compressed_fs无法清空它,则您的源设备不是瓶颈。

我也尝试过使用pv它来进行缓冲,但效果不是很好。如果它直接从源块设备读取,它不会让源驱动器全速生成数据,并且它也会在create_compressed_fs暂停时设法阻塞,即使它应该继续读取。这似乎是一个错误。

图像完成后,不要忘记删除 fifo:

rm fifo

相关内容