这可能是一个边缘情况,但这里有......
我正在从 2TB 硬盘恢复数据。仅当我使用它时才可挂载mount -r
,并且我正在使用rsync --files-from
它来复制重要目录。
每隔一段时间它就会失败,需要重新启动(电源循环)。我希望有一种方法可以缓存整个目录树,并使用跨越多个挂载的缓存:换句话说,当我需要重新挂载磁盘时,我会提供用于文件查找的缓存,而不是做更多的寻找磁盘。
假设由于备份空间不足,磁盘无法完整映像(使用dd
或)。ddrescue
这可能是一个边缘情况,但这里有......
我正在从 2TB 硬盘恢复数据。仅当我使用它时才可挂载mount -r
,并且我正在使用rsync --files-from
它来复制重要目录。
每隔一段时间它就会失败,需要重新启动(电源循环)。我希望有一种方法可以缓存整个目录树,并使用跨越多个挂载的缓存:换句话说,当我需要重新挂载磁盘时,我会提供用于文件查找的缓存,而不是做更多的寻找磁盘。
假设由于备份空间不足,磁盘无法完整映像(使用dd
或)。ddrescue
我看到的(同时)唯一的方法是独立于使用的文件系统,因为它作用于块层。
人们想要的是一种 lvmcache:为设备设置它,然后读取文件系统元数据 (
find /path/to/mountpoint -perm 700 -printf ""
),以便将其复制到缓存设备,然后冻结缓存设备。不幸的是,lvmcache 似乎没有这样的冻结功能。
但是你可以做类似的事情:你可以设置一个快照。您必须手动执行此操作,因为 LVM 仅在卷组内支持它。在 VG 中创建快照,
dmsetup ls
并dmsetup table
查看相关设备的详细信息。dmsetup
不关心所涉及的设备是否属于卷组(或根本是 LVM 设备)。通常您会创建一个快照并继续使用主设备。主设备之前的状态可以通过恢复快照来恢复,因为原始数据在原始设备上被更改之前被写入快照。这不是你想要的。您希望最小化对源设备的访问。因此,您不挂载(新)源设备,而是挂载快照设备。
然后修改所有包含元数据的扇区,以便将它们写入快照设备。即使你写了两次(因为你改变了数据,然后又把它改回原来的状态),这样数据本身就完全没有改变,扇区保留了快照设备的一部分。这意味着它总是从快照设备中读取。如果发生崩溃,您只需恢复
dmsetup
配置,就不会再访问源设备以获取元数据。不过,您可能需要一个具有较小集群大小的相当大的快照。但是您不必一次缓存整个文件系统元数据。您可以设置快照,缓存目录树的元数据,从那里复制所有文件,删除快照,创建新快照并缓存下一个子树的元数据。您可以看到(IIRC with
dmsetup status
)有多少快照空间正在使用中。为了编写 inode,您可以更改时间戳 (
touch /path/to/file
),尤其是在您不需要原始值的情况下。或者您(可能在某处写入原始值之后)执行 egchmod o=rwx /path/to/file ; chmod o= /path/to/file
。为了写入属于目录条目的所有扇区,您可以重命名所有文件(使用一些未使用的名称并返回):我不确定页面缓存是否足够聪明,可以检测到没有更改,因此您可以检查快照是否真的被写入。
应该对所有文件进行这些操作(可能仅针对子目录)