将文件系统与数据分开维护

将文件系统与数据分开维护

这可能是一个边缘情况,但这里是......

我正在从 2TB 硬盘恢复数据。仅当我使用 时它才可安装mount -r,并且我用于rsync --files-from复制重要目录。

每隔一段时间它就会失败并需要重新启动(重新启动)。我希望有一种方法可以缓存整个目录树,并使用该缓存跨越多个坐骑:换句话说,当我需要重新挂载磁盘时,我会提供缓存用于文件查找,而不是在磁盘上进行更多查找。

假设由于备份空间不足,无法对磁盘进行完整映像(使用dd或)。ddrescue

答案1

(同时)我认为做到这一点的唯一方法是独立于所使用的文件系统的,因为它作用于块层。

人们想要的是一种 lvmcache:为设备设置它,然后读取文件系统元数据 ( find /path/to/mountpoint -perm 700 -printf ""),以便将其复制到缓存设备,然后冻结缓存设备。

不幸的是lvmcache似乎没有这样的冻结功能。

但您可以执行类似的操作:您可以设置快照。您必须手动执行此操作,因为 LVM 仅在卷组内支持它。在 VG 中创建快照并查看相关设备的详细dmsetup ls信息。不关心所涉及的设备是否属于卷组(或者根本就是 LVM 设备)。dmsetup tabledmsetup

通常您会创建快照并继续使用主设备。通过恢复快照可以恢复主设备之前的状态,因为原始数据是在原始设备上更改之前写入快照的。这不是你想要的。您希望尽量减少对源设备的访问。因此,您不会挂载(新的)原始设备,而是挂载快照设备。

然后修改包含元数据的所有扇区,以便将它们写入快照设备。即使您写入两次(因为您更改了数据,然后将其更改回原始状态),因此数据本身根本没有更改,扇区仍保留快照设备的一部分。这意味着它始终从快照设备读取。如果发生崩溃,您只需恢复dmsetup配置,并且将不再访问原始设备以获取元数据。

不过,您可能需要一个相当大的快照和较小的集群大小。但您不必立即缓存整个文件系统元数据。您可以设置快照,缓存目录树的元数据,从那里复制所有文件,删除快照,创建新快照并缓存下一个子树的元数据。您可以看到(IIRC with dmsetup status)有多少快照空间正在使用中。

为了写入 inode,您可以更改时间戳 ( touch /path/to/file),特别是如果您不需要原始值。或者你(也许在某处写入原始值之后)执行例如chmod o=rwx /path/to/file ; chmod o= /path/to/file.要写入属于目录条目的所有扇区,您可以重命名所有文件(更改为某个未使用的名称并返回):

unique_suffix=4itxIIq5kyGhMVPJ
mv "$file" "${file}${unique_suffix}"
mv "${file}${unique_suffix}" "$file"

我不确定页面缓存是否足够聪明来检测没有发生任何变化,因此您可以检查快照是否确实被写入。

对所有文件的这些操作应该使用以下命令完成(也许仅针对子目录)

find /path/to/mountpoint -type f -exec ... + # for chmod and mv
find /path/to/mountpoint -type d -exec ... + # for mv

相关内容