与本地到本地的--checksum的Rsync?

时间:2012-05-09 23:52:18

标签: linux bash unix rsync

我首先尝试解决问题。我们有一个构建到大型文件树的项目。构建是几百MB,包含许多(小)文件,其中只有一小部分在构建之间发生变化。我们希望保留这些构建的一些历史记录,为了有效地执行此操作,我们希望硬链接在构建之间不会更改的文件。为此,我们使用rsync(作为cp的更强大的兄弟),从本地来源到具有选项--link-dest的本地目标,用于执行硬连接魔法。

这适用于增量构建:大多数文件未被触及,rsync正确地执行硬链接。使用完全重新编译构建(我们必须这样做是出于与此无关的原因),事情看起来并不像预期的那样。由于重新编译,所有文件都获得了新的时间戳,但在内容方面,大多数文件仍然与之前的版本相同。但即使我们将rsync--checksum选项一起使用(因此rsync"同步" /基于内容的硬链接,而不是文件大小+时间戳),任何内容都不会再被硬链接。

插图

我试图通过这个简单的(bash)脚本来隔离/说明问题:

echo "--- Start clean"
rm -fr src build*

echo "--- Set up src"
mkdir src
echo hello world > src/helloworld.txt

echo "--- First copy with src as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/src src/ build1/

echo "--- Second copy with first copy as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/build1 src/ build2/

echo "--- Result (as expected)"
ls -ali src/helloworld.txt build*/helloworld.txt

echo "--- Sleep to have reasonable timestamp differences"
sleep 2

echo "--- 'Remake' src, but with same content"
rm -fr src/helloworld.txt
echo hello world > src/helloworld.txt

echo "Third copy with second copy as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/build2 src/ build3
# Using --modify-window=10 gives results as expected
# rsync -a --modify-window=10 --link-dest=$(pwd)/build2 src/ build3

echo "Final result, not as expected"
ls -ali src/helloworld.txt build*/helloworld.txt

第一个结果如预期:所有三个副本都是硬链接(相同的inode)

30157018 -rw-r--r--  3 stefaan  staff  12 May 10 01:28 build1/helloworld.txt
30157018 -rw-r--r--  3 stefaan  staff  12 May 10 01:28 build2/helloworld.txt
30157018 -rw-r--r--  3 stefaan  staff  12 May 10 01:28 src/helloworld.txt

最终结果与预期/期望不符:

30157018 -rw-r--r--  2 stefaan  staff  12 May 10 01:28 build1/helloworld.txt
30157018 -rw-r--r--  2 stefaan  staff  12 May 10 01:28 build2/helloworld.txt
30157026 -rw-r--r--  1 stefaan  staff  12 May 10 01:28 build3/helloworld.txt
30157024 -rw-r--r--  1 stefaan  staff  12 May 10 01:28 src/helloworld.txt

第三个副本build3/helloworld.txt未与build2中的第三个副本硬链接,即使内容相同,因此校验和检查应该会看到这一点。

问题

有人知道这里有什么问题吗?我的期望是错的吗?或者是rsync在从本地同步到本地时忽略--checksum选项,例如因为它知道查看inode数字比在校验和上花费时间更聪明吗?

1 个答案:

答案 0 :(得分:3)

问题是使用'-a'标志会强制保留修改时间(隐式地,' - t')。

如果您使用'-rlpgo'(或使用'-a'跟' - no-times'),修改时间将不再考虑保留,因此将共享inode。您仍然需要指定'--size-only'或'--checksum'(后者显然更安全),因此它不会根据文件时间进行比较。

文档无法清楚区分哪些标记用于触发更新,哪些标记用于控制属性的保存