rsync 是否链接到精确的文件或仅链接到同名的文件?

rsync 是否链接到精确的文件或仅链接到同名的文件?

我为最近更换的计算机(内部硬盘到外部硬盘)编写了一个小型 rsync 备份脚本。

当我拿到新电脑时,我将文件复制过来(将旧内置硬盘复制到新内置硬盘)。相同的文件结构、文件名等。

我想知道是否可以在现在连接到旧外部硬盘的新计算机上运行备份脚本。

我预见到的潜在问题是 rsync 是否链接到确切的文件还是仅仅链接到文件名。

我记得读过一些关于文件系统的内容,其中每个文件都有特定的标识符(序列号或其他东西),更改名称不会改变该号码。

因此,如果 rsync 链接到该数字而不是目录结构中特定位置的文件名,它可能会通过重复复制所有内容或产生其他奇怪的结果,使外部 HD 变得一团糟。

只是 rsync 使用硬/软链接来工作,而我对此还不够了解,不知道具体细节或它们的含义......

任何帮助都值得感激!

MacOS Ventura 13.4.1,APFS(文件系统)

答案1

总结

没什么可担心的。让你的脚本使用rsync --dry-run --verbose …亲自看看。如果看起来合理,请继续使用原始脚本(不带--dry-run)。


Inode 编号

我记得读过一些关于文件系统的内容,其中每个文件都有特定的标识符(序列号或其他东西),更改名称不会改变该号码。

索引节点数字。Unix/Linux 中的本机文件系统通常使用此概念(macOS 是 Unix)。内部不使用 inode 的文件系统看起来好像使用了它们,因此可以以类似的方式处理它们。所以是的,文件确实有序列号,ls -i并打印它们。

因此,如果 rsync 链接到该数字而不是仅仅链接到文件名……

rsync不基于 inode 编号,它使用路径名(路径名由文件名)。inode 编号并非旨在表示文件系统之外的任何内容。我指的不是文件系统类型;我的意思是,它们位于文件系统特定实例的内部,与另一个文件系统(即使是同一类型)中的 inode 编号无关。

您说得对,如果rsync尝试基于 inode 编号,它可能会造成严重破坏。它不会这样做。据我所知没有通过 inode 号访问文件的标准接口。并且您(或rsync)在创建新文件时无法请求某个数字。对于不使用 inode 且仅显示为使用 inode 的文件系统,inode 编号可能会动态生成,并且在许多(所有?)情况下,无法保证在您卸载并再次挂载此类文件系统后,完全相同的编号与完全相同的文件相关联。

所有这些意味着程序不应该关心 inode 编号,除非它们应该处理文件系统本身的核心。inode 编号是文件系统内部的。程序应该在不同的抽象级别上工作,cp并且rsync它们确实如此。不同的抽象级别是带有路径名的目录树。

有一种情况是,当程序想要识别硬链接时,inode 编号会“泄露”并被此类程序(安全地)使用。硬链接文件是两个或多个指向单个文件(inode 编号)的路径名。程序可以比较 inode 编号,从而判断哪些路径名指向同一个文件。硬链接仅在单个文件系统内有效;碰巧具有相同 inode 编号但存在于不同文件系统中的文件不相关,程序会考虑到这一点。

例如rsync您可以使用--hard-links/-H选项:

这告诉rsync您查找源中的硬链接文件并将目标上的相应文件链接在一起。如果没有此选项,源中的硬链接文件将被视为单独的文件。

[…]

请注意,rsync 只能检测传输集内文件之间的硬链接。[…]

来源:man 1 rsync

rsync -H尝试在源中发现硬链接并在目标上创建硬链接。但即便如此,目标上的 inode 编号与源中的 inode 编号也没有任何关系。当rsync -H注意到源中的某些路径名指向同一文件系统中的相同 inode 编号时,它将尝试使目标上的相应路径名指向一些单个 inode 编号;换句话说,它将尝试创建硬链接文件。具体编号超出了 的范围(和能力)rsync。该工具不需要关心编号,因为即使创建硬链接的接口(link(2))也使用路径名,而不是 inode 编号。


我可以只运行备份脚本吗?

我复制了文件(从旧内置硬盘复制到新内置硬盘)。文件结构、文件名等都相同。我想知道我是否可以在现在连接到旧外置硬盘的新电脑上运行备份脚本。

你可以。新源中的 inode 编号可能(并且很可能)与旧源中的 inode 编号完全不同,但这完全没有关系。源的目录结构相同就足够了。

记住--dry-run/-n为了安全起见,创建脚本副本并使其使用rsync --dry-run --verbose …或类似;运行它并分析输出。不过,您遇到的问题(如果有)与 inode 编号无关。

相关内容