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

前端之家收集整理的这篇文章主要介绍了linux – 普通块设备上类似LVM的快照前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

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

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

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

所以问题

有没有办法制作任何类型的md块设备的快照,并在不改变md设备的情况下处理这个问题?

一些要点:

>无论性能如何,非常慢是可以接受的.
>我在外部临时驱动器上有2 * 2 Tb的存储空间,可用于快照的“更改日志”.
>我没有足够的存储空间将整个设备(md)复制到另一个地方并用它制作一个lvm卷. (也不是分别为每个驱动器成像的空间)
>不需要及时可靠,快照将在数据恢复后删除(如果有的话).
>嗯,我认为很清楚:我只需要读取只读md然后抛弃更改.

有任何想法吗?

谢谢!

最佳答案
使用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的替代方法

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

原文链接:https://www.f2er.com/linux/440253.html

猜你在找的Linux相关文章