(rsync 开启)已挂载卷:硬链接似乎被保留,但空间按完整文件计算

(rsync 开启)已挂载卷:硬链接似乎被保留,但空间按完整文件计算

我正在尝试使用 rsnapshot/rsync 从服务器到 Hetzner 存储箱设置一个节省空间的轮换备份方案。我很难理解目标上的硬链接如何影响报告的磁盘使用情况。简而言之:即使备份目标上似乎有硬链接,但它们似乎没有被计入磁盘使用情况,而是被算作完整文件。

由于 rsnapshot 的目标文件夹必须位于本地文件系统上,因此我设置了一个由两部分组成的工作流程:

  1. 使用以下方式创建本地快照快照,位于源服务器上的本地文件夹中
  2. 使用 SSH 通过 rsync 同步本地快照同步到达目的地

这似乎工作得很好,速度很快,但我有一个担心:目标上报告的磁盘使用情况(带有du -sh)似乎累积了所有快照的大小,尽管它们似乎已经通过硬链接正确复制。注意:由于 Hetzner 存储箱不允许交互式 SSH 登录,因此我将这个备份目标作为具有 CIFS 的已安装卷进行检查。

例如,经过 3 轮 rsnaphsot + rsync 组合后,目标文件夹包含daily.0daily.1daily.2文件夹。当检查这些快照文件夹中的随机文件中是否存在硬链接时,我确实得到了预期的结果:

  1. 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 的文件(符合预期)

  2. 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具有误导性,或者文件是否确实占用了比您预期更多的磁盘空间。(考虑到您的其他指标,我相当肯定是前者。)

相关内容