我与 同步数据rsync --delete --backup --backup-dir=[some directory] -avz [source] [destination]
。
- 在执行rsync的机器上,
[source]
和[destination]
目录都是本地挂载的NFS导出(即运行rsync的机器是NFS客户端)。 - 成功
rsync
+一些检查后,备份被删除。
我 LAN 的另一台机器是应用程序服务器,并且[destination]
在本地安装了相同的 NFS 导出。由于应用程序方面的一些复杂性,我有无控制上,看起来应用程序通过文件的 inode 来引用文件,而不是使用它们的名称。当文件从以下位置更改时,这会带来困难[source]
:
- 假设在 上
[destination]
,该文件有 inode123
- 应用程序“指向”具有 inode 的文件
123
[source]
rsync 检测到此文件的和版本之间存在差异[destination]
,并且必须传输它- 在传输之前,它会通过“移动”它来创建备份:备份文件现在具有索引节点
123
- 文件的更新版本由 rsync 传输,并获取一个新的 inode(
456
) - 成功进行 rsync + 检查后,备份将被删除:不再有文件具有
123
inode - 该应用程序仍然指向 inode
123
,已损坏
- 您确认我已经清楚了
rsync --backup
工作原理和索引节点吗? - rsync 选项如何
--inplace
使用--backup
:
- rsync 会创建一个有自己的 inode 的备份文件吗?
- 文件会保留其当前的索引节点吗?
答案1
通过索引节点引用文件几乎是不可能的。要打开文件,需要打开目录中文件名的引用。然后你就有了一个文件句柄,它现在独立于文件名(这就是为什么文件可以从文件系统中删除但仍然处于打开和活动状态)。因此,我们假设该文件在应用程序的整个生命周期中都保持打开状态。您现在需要使用 替换该文件的内容rsync
。
通常,rsync
会在任何现有实例旁边创建目标文件的临时副本,然后在最后一刻删除(或备份)原始文件并切换到替换文件。可以使用该选项修改此行为--inplace
,这样就不会创建新副本,而是rsync
写入实际目标。
现在,您还指定了--backup
,因此执行正确的操作并在允许更新原始实例rsync
之前为备份创建一个副本。--inplace
您可以通过一个简短的示例来了解这一点:
# Prepare scenario
mkdir /tmp/624404
cd /tmp/624404
date >src
cp -p src dst
# Initial files, with inodes
ls -li src dst
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:49 dst
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:49 src
# Update, copy, and list
date >src
rsync --times --inplace --backup src dst
ls -li
total 12
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst
149194 -rw-r--r-- 1 roaima 29 Dec 14 11:49 dst~
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:50 src
# Update again, copy, and list
date >src
rsync --times --inplace --backup src dst
ls -li
total 12
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst
149194 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst~
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:50 src
您可以看到目标 ( dst
) 文件仍然具有其原始 inode,但备份已被赋予一个新 inode。第二次更新显示索引节点此后被保留。
在您的实例中,这听起来确实--inplace --backup
是您所需要的。但是,请注意手册页警告,
警告:您不应使用此选项来更新其他人正在访问的文件,因此在选择使用此选项进行副本时要小心。
不是默认的原因--inplace
是,中断的部分复制可能会使目标文件处于不一致的状态,并且作者认为拥有内部一致的过时文件比损坏的文件更好-最新文件。可以使用--inplace
和等标志来修改此类行为--partial
(甚至--append
从rsync
3.0.0 版本开始)。