我正在使用 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 操作系统。