使用 rsync 创建的备份在外部驱动器上占用的空间多于在源驱动器上占用的空间

使用 rsync 创建的备份在外部驱动器上占用的空间多于在源驱动器上占用的空间

我正在使用 rsync 来备份在 Raspberry Pi 上运行的 Ubuntu。无论如何,我排除了所有其内容仅在启动后创建的常用目录。

rsync 将写入分区格式并循环设备挂载的备份映像,并将该映像写入连接的外部 USB 驱动器。与源 SD 卡上的数据相比,USB 存储驱动器上的数据占用的空间要多得多。大约为 5325MB vs 3881MB。

尝试调试
我运行此 rsync 命令来仔细检查是否在目标上创建了一些不在源上的神秘额外文件,或者与源上的文件相比,相同文件在目标上时是否变得更大:

sudo rsync -nrlpgoDv --delete --exclude-from='/home/ubuntu/exclude-list.txt' / /mnt/dst_root/

但我认为源和目标之间在文件数量或它们在源与目标中所占的大小方面没有任何重大差异。

我的问题
为什么是这样?跟扇区大小有关系吗?

使用fdisk -l我的源 Ubuntu 操作系统有:

Disk /dev/mmcblk0: 29.54 GiB, 31719424000 bytes, 61952000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x12345678

Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1 *      2048   526335   524288  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      526336 61951966 61425631 29.3G 83 Linux

我将备份写入外部存储驱动器上的图像文件中。我这样对备份映像进行分区:

echo "label: dos" | sfdisk "${IMGFILE}" > /dev/null
    sfdisk "${IMGFILE}" <<EOF > /dev/null
,256MiB,c
,+,83
EOF

然后,我在如下脚本中格式化该备份映像文件的根分区:
mkfs.ext4 -q -b 4096 "${LOOP}p2" > /dev/null

现在,附加备份映像的循环设备上的 fdisk 给出:

Disk /dev/loop6: 5.62 GiB, 6035603456 bytes, 11788288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x12345678

Device       Boot  Start      End  Sectors  Size Id Type
/dev/loop6p1        2048   526335   524288  256M  c W95 FAT32 (LBA)
/dev/loop6p2      526336 11788287 11261952  5.4G 83 Linux

fdisk -l在保存备份映像的外部存储驱动器上:

Disk /dev/sda: 3.64 TiB, 4000752599040 bytes, 7813969920 sectors
Disk model: My Passport 2627
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: B5B6FD62-945C-466D-7T49-YU5D4RRE7087

Device     Start        End    Sectors  Size Type
/dev/sda1   2048 7813967871 7813965824  3.6T Linux filesystem

由于扇区大小与 I/O 大小的差异,数据是否会占用 USB 驱动器上更多的空间?

resize2fs另外,我的备份脚本尝试使用(卸载文件系统后)缩小备份映像上的根文件系统。没有错误,但resize2fs在消除备份根文件系统中的可用空间方面做得非常糟糕。它永远不会消除所有空白空间,有时甚至不删除任何空白空间。也许这也与扇区大小有关?

更新

经过一番调查,我认为这个问题可能与 - snap 有关。它安装在我的 Ubuntu 系统中。从阅读来看,snap 应用程序似乎存储在压缩的 squashfs 文件系统中。也许当我 rsync 它们时,它们会在目标 ext4 文件系统中占用更多空间?

任何建议非常感谢!

答案1

答案
我使用 rsync 从 Pi 中运行 Ubuntu 的 SD 卡进行完整的系统备份,将其分区并格式化为与 sd 卡相同的引导 (fat32) 和根 (ext4) 文件系统。我的 rsync 命令不仅复制 的内容/var/lib/snapd,还复制/snap.事实证明这是不必要的。

Snap 应用程序作为 squashfs 映像存在,但在启动时/var/lib/snapd也会作为只读文件系统安装在dir 中。/snap

毕竟,我的备份映像中的 rootfs 并没有比正在运行的 Ubuntu 操作系统中的 rootfs 占用更多的空间。问题是我正在使用 来df command报告占用的空间。这df command是错误的选择,因为它不包括像这样的已安装对象的大小du command

这是df command正在运行的 Ubuntu Pi 操作系统上的情况...它报告 rootfs 占用的空间为 3885MB。

ubuntu@ubuntu:~$ df -BMB
Filesystem     1MB-blocks      Used Available Use% Mounted on
tmpfs               398MB       5MB     393MB   2% /run
/dev/mmcblk0p2    31312MB    3885MB   26120MB  13% /
tmpfs              1988MB       0MB    1988MB   0% /dev/shm
tmpfs                 6MB       0MB       6MB   0% /run/lock
/dev/mmcblk0p1      265MB     155MB     110MB  59% /boot/firmware
/dev/sda1       3936879MB 1386199MB 2350626MB  38% /media/4TB1

现在我du command在 Pi 中运行 Ubuntu Pi 操作系统,报告 rootfs 中使用的空间为 4.7GiB (5046MB) 这是因为它包括/snap.这与 rootfs 在我的备份映像中占用的空间量大致相同。

ubuntu@ubuntu:/usr/local/bin$ sudo du -hs /
du: cannot access '/proc/6297/task/6297/fd/4': No such file or directory
du: cannot access '/proc/6297/task/6297/fdinfo/4': No such file or directory
du: cannot access '/proc/6297/fd/3': No such file or directory
du: cannot access '/proc/6297/fdinfo/3': No such file or directory
4.7G    /

与此相反,当我将 SD 卡从 Pi 中取出时...这是在du command连接到我的笔记本电脑的 SD 卡中的 rootfs 上运行的输出:

[flex@flex ~]$ sudo du -hs /media/writable/
3.3G    /media/writable/

这是因为 snap 应用程序不再安装在 sd 卡的 /snap 目录中,因为 Pi 中没有运行 Ubuntu 操作系统。

相关内容