我正在尝试使用 rsnapshot/rsync 从服务器到 Hetzner 存储箱设置一个节省空间的轮换备份方案。我很难理解目标上的硬链接如何影响报告的磁盘使用情况。简而言之:即使备份目标上似乎有硬链接,但它们似乎没有被计入磁盘使用情况,而是被算作完整文件。
由于 rsnapshot 的目标文件夹必须位于本地文件系统上,因此我设置了一个由两部分组成的工作流程:
- 使用以下方式创建本地快照快照,位于源服务器上的本地文件夹中
- 使用 SSH 通过 rsync 同步本地快照同步到达目的地
这似乎工作得很好,速度很快,但我有一个担心:目标上报告的磁盘使用情况(带有du -sh
)似乎累积了所有快照的大小,尽管它们似乎已经通过硬链接正确复制。注意:由于 Hetzner 存储箱不允许交互式 SSH 登录,因此我将这个备份目标作为具有 CIFS 的已安装卷进行检查。
例如,经过 3 轮 rsnaphsot + rsync 组合后,目标文件夹包含daily.0
、daily.1
和daily.2
文件夹。当检查这些快照文件夹中的随机文件中是否存在硬链接时,我确实得到了预期的结果:
find /mnt/user.your-storagebox.de/rsync-backup/ -name "output.file" -print0 | xargs -0 ls -li
:351317 -rw-rw---- 3 root root 8650 Dec 15 11:25 /mnt/user.your-storagebox.de/rsync-backup/daily.0/home/user/output.file 351317 -rw-rw---- 3 root root 8650 Dec 15 11:25 /mnt/user.your-storagebox.de/rsync-backup/daily.1/home/user/output.file 351317 -rw-rw---- 3 root root 8650 Dec 15 11:25 /mnt/user.your-storagebox.de/rsync-backup/daily.2/home/user/output.file
返回 3 个具有相同 inode 且链接数为 3 的文件(符合预期)
find /mnt/user.your-storagebox.de/rsync-backup/ -samefile /mnt/user.your-storagebox.de/rsync-backup/daily.0/home/user/output.file
/mnt/user.your-storagebox.de/rsync-backup/daily.0/var/tomcat/vhosts/output.file /mnt/user.your-storagebox.de/rsync-backup/daily.2/var/tomcat/vhosts/output.file /mnt/user.your-storagebox.de/rsync-backup/daily.1/var/tomcat/vhosts/output.file
返回 3 个文件(符合预期)
我猜这表明这些快照已被正确地作为硬链接复制到目的地。
然而……当检查目标位置的磁盘使用情况时:du -sh /mnt/user.your-storagebox.de/rsync-backup
,返回的值为 12G。这是出乎意料的,因为原始源文件夹只有大约 4G。显然,尽管存在硬链接,但磁盘使用量是累计计算的?
另一方面,当通过 检查目标文件夹时rsnapshot du
,我得到的输出是做似乎考虑到了硬链接:
4.3G /mnt/user.your-storagebox.de/rsync-backup/daily.0/
41K /mnt/user.your-storagebox.de/rsync-backup/daily.1/
41K /mnt/user.your-storagebox.de/rsync-backup/daily.2/
4.3G total
这很令人困惑:要么快照是通过硬链接复制的,并且应该占用最小的空间(检查 inode 时似乎是这种情况),要么快照没有被复制,并且占用的空间比预期的要多得多(如输出所示du -sh
)。
我主要关心的是:此已安装卷上报告的磁盘使用情况是否正确?在使用du -sh
已安装卷时,我应该注意哪些注意事项?
答案1
我的版本du
(Debian,du (GNU coreutils) 8.30
) 处理带有硬链接的文件,并且只计算一次多个实例。看来你的版本不是这样。不过,你可以相当轻松地验证这一点
准备场景
mkdir zzz # Scenario workspace
tar cf zzz/etc.1 /etc # Ignore "tar: Removing leading `/' from member names"
试验 #1。两个文件被复制但未建立硬链接
cp zzz/etc.1 zzz/etc.2 # Create copy
du -s zzz/etc.1 # 2580 KB, in my instance
du -s zzz/etc.2 # As you would expect, the same value
du -s zzz # 5164 KB, because the files are "different"
试验 #2. 两个文件硬链接在一起
rm zzz/etc.2
ln zzz/etc.1 zzz/etc.2 # Create hardlink
du -s zzz/etc.1 # Unchanged from above, of course, 2850 KB
du -s zzz/etc.2 # As you would expect, still the same value
du -s zzz # For me, this is still the same value, 2580 KB
如果您的实例du
无法处理同一硬链接文件的多个实例,那么您的试验#2将返回两者的总和,etc.1
就像etc.2
试验#1一样。
使用此信息,您可以确定您的版本是否du
具有误导性,或者文件是否确实占用了比您预期更多的磁盘空间。(考虑到您的其他指标,我相当肯定是前者。)