为更大的块设备创建写缓存循环设备

为更大的块设备创建写缓存循环设备

所以,长话短说。 * 我有一个带有 HP 控制器的 5.5TB RAID5 阵列。 * HP 使用一种非常非常痛苦的 RAID5 算法(参考:延迟奇偶校验) * 我编写了一个新的块驱动程序,它将请求转换为它创建的新块设备,转换为 HP 阵列的旧磁盘 - 转换是一种方式(阅读仅有的)。

所以我有一个 5.5TB 的“数组”,看起来挂载没问题,EXT4 文件系统模块抱怨日志不是 100%,几个目录由于错误而无法读取,但其余数据似乎完好无损足以相信我的区块驱动程序正在做正确的事情。

但是,我非常谨慎。我不想只是打开只读模式并在文件系统上运行 fsck 却发现它完全破坏了它,因为我没有考虑到一些事情。

我想做的是将块设备映射到块级别的循环设备;所以我可以在它上运行 fsck (写入将缓存在循环设备中)并且读取将被联合(如果没有为该扇区记录写入 - 读取块设备,如果有,则读取循环设备)。

问题是,我没有足够的磁盘空间来创建 5.5TB 文件 - 即使这样配置 - 来充当写入缓存,而且这似乎是浪费时间,因为可能只会有几 GB 的写入 -最大值,因为 fsck 完成了它的工作。

问题:有没有一种方法可以将块设备环回/联合到一个文件中,该文件的大小基本上为零,并且会随着我所做的写入而增长?

提前致谢。

答案1

您可以在写时复制模式下使用 dm-snapshot 或 NBD。

这里提供了 dm-snapshot 解决方案(抱歉不再重复):

https://raid.wiki.kernel.org/index.php/Recovering_a_failed_software_RAID#Making_the_harddisks_read-only_using_an_overlay_file

至于 NBD,您可以安装nbd-servernbd-client,然后像这样使用它:

mount /mnt/storage # something with some free space
losetup --read-only /dev/sda1 /dev/loop0 # to ensure it's readonly
ln -s /dev/loop0 /mnt/storage/loop0
nbd-server 127.0.0.1@4242 /mnt/storage/loop0 -c

符号链接是必要的,因为 nbd-server 坚持将临时写入缓存文件存储到与其服务的文件相同的位置。因此,如果没有链接,它最终会变得/dev/根本没有用处。

最后与客户端连接:

nbd-client 127.0.0.1 4242 /dev/nbd0

此 NBD 解决方案的唯一问题是,无论临时存储是否可用,它都会使用大量 RAM(取决于您的设备大小)。由于fsck它本身有时也非常需要内存,因此如果您没有安装大量内存,则可能会耗尽内存。

相关内容