正常的块设备上的类LVM快照

跳到这个问题,如果不是故事感兴趣

在4盘RAID 5磁盘arrays上不幸丢失了2个磁盘之后,我陷入了一些巫术,以便尽可能多地获取数据。

第一个出现弱点的驱动器被replace,在重build期间(〜80%)第二个驱动器在一些死区失败。

长话短说,现在我有两个驱动器(2和4)在一致的状态。 一(3)同步,但中间有坏道。 最后(1)由于重build过程而仅部分同步。 磁盘为1.5Tb,总共4.1TBarrays。

在尝试了234,124和1234configuration的所有只读voodoo之后,我已经能够获得很大一部分重要数据。 (在4.1TB上只有100GB)。

现在下一步是尝试一些文件系统(reiserfs)重build,看看我是否能够获得更多的数据。 这些操作是破坏性的。 我有三个工作的磁盘设置在不同的国家尝试。

所以这个问题

有没有办法使任何types的md块设备快照,并在不改变MD设备的情况下工作?

一些观点:

  • 无所谓performance,很慢是可以接受的。

  • 我在外部临时驱动器上有2 * 2 Tb的存储空间,可用于快照的“更新日志”。

  • 没有足够的存储空间将整个设备(md)复制到另一个地方,并使用它制作lvm卷。 (也不是单独为每个驱动器映像的空间)

  • 无需及时可靠,数据恢复后快照将被删除(如果有的话)。

  • 那么,我认为这是很明显的:我只需要在只读md上填充内容,然后将其更改。

有任何想法吗?

谢谢!

使用设备映射程序快照目标。 只是要警告,它不会掩盖来自底层坏磁盘的I / O错误,所以这最适合具有损坏的文件系统的好磁盘。

tl; dr – 跳过我的背景的以下三段。

我处理的最新事件还涉及一个带有4个磁盘的RAID5,但位于USB机箱中。 它被格式化为NTFS,并讽刺地使用gddrescue从一个失败的笔记本电脑磁盘中恢复了一个640GB的磁盘映像,在此期间,磁盘盒报告了300GB的磁盘故障。 我没有执行ddrescue,所以坏的笔记本电脑磁盘在我被要求帮助之前被送去替换。

我到了,必须找到一种方法,在有限的时间内尽可能多地检索映像文件,以便访问RAID盒。 (这是借来的,我是从外地访问的)。机箱有一个漏洞,电源周期后,它忘记了磁盘故障,所以RAID可能会在几天内不同步地运行几天,无声地破坏了NTFS,因此ntfs-3g拒绝安装它。 我设法恢复了300GB,没有更多,但是这足以恢复图像中包含的许多其他文件丢失。 (我运行了测试盘,scrounge-ntfs和ntfsundelete,但是我选择不使用photorec。)我最终使用测试盘从NTFS中读取映像文件,但是我也尝试了使用测试盘来修复NTFS足以使ntfs-3g合作,甚至在VirtualBox中运行chkdsk,它只能将图像截断为零字节。

我发现尝试几种相互排斥的破坏性方法以找到最佳解决方案是非常有价值的。

设备映射程序快照目标使用在块级别上执行写入时复制的dm-snapshot内核模块。 在我的步骤中,我将在发生故障的磁盘/ dev / failing上进行操作。 您将需要提供足够大的块设备来存储您将要调用/ dev / cow的更改。 对于您创建的其他写时复制设备,不要重复使用快照异常存储,这一点很重要。

  # Make it much harder to accidentally overwrite anything # Run on all partition sub-devices as well, if applicable 1. blockdev --setro /dev/failing # Create /dev/mapper/top 2. echo 0 `blockdev --getsz /dev/failing` snapshot /dev/failing /dev/cow p 4 | dmsetup create top # Manipulate /dev/mapper/top as you wish # Tear-down 3. dmsetup remove top 

我提供了两个创建/ dev / cow的选项:

A.使用稀疏文件

  # Create a sparse file 1. dd if=/dev/zero bs=1048576 count=0 seek=size_in_MB of=tempfile # Print name of next unused loop device 2. losetup -f # Associate the file with a loop device 3. losetup -f tempfile # Use as /dev/cow # Use the name from #2 here 4. losetup -d /dev/loopX 5. rm tempfile 

B.使用zram内核模块(参见适用于ramzswap或compcache的文档!)

  # Create 4 of them - zram0-3 (you may run into a need for more than one) 1. modprobe zram num_devices=4 # Set size 2. echo $((1048576*size_in_MB)) > /sys/block/zram0/disksize # Associate with a loop device (dmsetup will fail with zramX but not loopX!) 3. losetup -f 4. losetup -f /dev/zram0 # Use as /dev/cow # Use the name from #3 here 5. losetup -d /dev/loopX 6. echo reset > /sys/block/zram0 

在我的时间有限的情况下,我需要将300GB的图像复制到某个地方,但是我没有空间,所以我压缩了它(到25GB)。

如果你需要存储块设备的压缩只读副本供以后使用,而不创建中间文件,我建议使用squashfs。 使用(un)chunkfs(需要FUSE)将设备分解为4GB块,然后分别在每个块上运行mksquashfs。 这样它可以存储在FAT32卷上,或者在NTFS上,而不需要从ntfs-3g创建大文件的高CPU使用率。 我建议校验和生成的文件,也许尝试par2如果你想添加冗余。

为了重新组装设备内容,您很有可能需要比默认的8个循环设备更多的内容。 要做到这一点,modprobe循环max_loop = 2048,或者如果它编译到你的内核,然后添加max_loop = 2048到你的内核命令行。 装载每个squashfs并将文件关联到循环设备。 最后,使用dmsetup使用线性目标连接它们。 (请阅读man dmsetup,最好记住-r开关,否则写入将被丢弃,而不是立即失败。)

如果你在其他存储上有足够的空间,我只需要用dd映像驱动器。