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
mbuffer
create_compressed_fs
现在使用 1 GB 缓冲区在暂停时保持源驱动器繁忙。缓冲区的大小应使其在暂停时不会完全填满,但应确保缓冲区有足够的内存。如果您发现缓冲区始终已满并且create_compressed_fs
无法清空它,则您的源设备不是瓶颈。
我也尝试过使用pv
它来进行缓冲,但效果不是很好。如果它直接从源块设备读取,它不会让源驱动器全速生成数据,并且它也会在create_compressed_fs
暂停时设法阻塞,即使它应该继续读取。这似乎是一个错误。
图像完成后,不要忘记删除 fifo:
rm fifo