普通块设备上的类似LVM的快照

时间:2011-09-28 10:46:08

标签: linux snapshot data-recovery raid

如果对故事不感兴趣,请跳过问题

在一个4磁盘raid 5阵列上不幸丢失2个磁盘后,我进入了一些伏都教,尽可能多地获取数据。

第一个出现弱点迹象的驱动器被替换,并且在重建期间(约80%通过),第二个驱动器在一些死区域失败。

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

在234,124和1234配置上尝试了所有只读voodoo之后,我已经能够获得大部分重要数据。 (4.1 Tb整体上只有100 Gb。)

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

关于问题

有没有办法制作任何类型的md块设备的快照,并在不改变md设备的情况下对此进行处理?

有些观点:

  • 无论性能如何,都可以接受。

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

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

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

  • 嗯,我认为很清楚:我只需要读取只读的md,然后抛弃更改。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:11)

使用device-mapper快照目标。请注意,它不会屏蔽底层坏磁盘的I / O错误,因此这最适合于文件系统损坏的好磁盘。

tl; dr - 跳过我背景故事的以下三段。

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

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

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

device-mapper快照目标使用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的替代方法:

一个。使用稀疏文件

 # 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开关,否则写入将被删除而不是立即失败。)

答案 1 :(得分:0)

如果您在其他存储设备上有足够的空间,我只需使用dd对驱动器进行映像。