我正在使用 rsync 备份在 Raspberry Pi 的 SD 卡上运行的 Ubuntu 22.04 服务器。当 Ubuntu 也在运行时,我使用以下命令运行备份:
> rsync -aDH --partial --numeric-ids --delete --force --exclude "${MNTPATH}" --exclude '/dev' --exclude '/lost+found' --exclude '/media' --exclude '/mnt' \ > --exclude '/proc' --exclude '/run' --exclude '/sys' --exclude '/tmp' --exclude '/var/swap' --exclude '/etc/udev/rules.d/70-persistent-net.rules' \ > --exclude '/var/lib/asterisk/astdb.sqlite3-journal' "${OPTIONS[@]}" / "${MNTPATH}/"
因此,所有(我认为)其内容仅在运行时出现的目录都被排除在备份之外……以及 /media 和 /mnt 目录。
但是... 我得到的备份总是比我预期的要大很多。备份是使用 rsync 创建的,它被创建在一个truncate
已分区和格式化的映像文件上(启动分区为 fat32,根分区为 ext4)。
当我循环安装此图像文件并取出 Ubuntu 服务器 SD 卡并将它们分别安装到我的笔记本电脑中时,我得到了以下信息:
备份映像上的根分区已在运行 Manjaro 的笔记本电脑上循环安装。
[flex@flex~]$ sudo du -hs /media/writable/
4.8G /media/writable/
SD 卡上的根分区包含从 Pi 中取出的 SD 卡上制作备份的操作系统。
[flex@flex~]$ sudo du -hs /media/writable1/
3.3G /media/writable1/
为什么备份比原始备份大 1.5GB?备份应该更小一些,因为它排除了 SD 卡上运行的 Ubuntu 的许多运行时目录。
更多调试
我运行了这个 rsync 命令来仔细检查目标上是否创建了一些源上没有的神秘的额外文件,或者与在源上相比,相同的文件在目标上是否变得更大:
sudo rsync -nrlpgoDv --delete --exclude-from='/home/ubuntu/exclude-list.txt' / /mnt/dst_root/
/home/ubuntu/exclude-list.txt
dev
lost+found
media/4TB1
mnt
proc
run
sys
tmp
但就文件数量或文件在源和目标中占用的大小而言,我没有发现源和目标之间有任何大的差异。
Snap 已安装
ubuntu@ubuntu:/snap$ ls -l
total 20
-r--r--r-- 1 root root 548 Apr 19 11:11 README
drwxr-xr-x 2 root root 4096 May 21 21:30 bin
drwxr-xr-x 4 root root 4096 May 27 17:19 core20
drwxr-xr-x 4 root root 4096 May 21 21:30 lxd
drwxr-xr-x 4 root root 4096 May 27 17:18 snapd
ubuntu@ubuntu:/snap$ snap list
Name Version Rev Tracking Publisher Notes
core20 20220512 1498 latest/stable canonical* base
lxd 5.0.0-b0287c1 22927 5.0/stable/… canonical* -
snapd 2.55.5 15909 latest/stable canonical* snapd
ubuntu@ubuntu:/snap$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 379M 4.7M 375M 2% /run
/dev/mmcblk0p2 30G 3.7G 25G 13% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/mmcblk0p1 253M 148M 105M 59% /boot/firmware
/dev/sda1 3.6T 1.3T 2.2T 37% /media/4TB1
ubuntu@ubuntu:/snap$ sudo losetup -a
/dev/loop1: [45826]:1392 (/var/lib/snapd/snaps/core20_1498.snap)
/dev/loop4: [45826]:7068 (/var/lib/snapd/snaps/snapd_15541.snap)
/dev/loop2: [45826]:77516 (/var/lib/snapd/snaps/lxd_22915.snap)
/dev/loop0: [45826]:7407 (/var/lib/snapd/snaps/core20_1437.snap)
/dev/loop5: [45826]:7773 (/var/lib/snapd/snaps/snapd_15909.snap)
/dev/loop3: [45826]:7426 (/var/lib/snapd/snaps/lxd_22927.snap)
我的理论
这是因为 snap 吗?可能是因为当我从 Ubuntu rsync 时,我复制了 snap 安装和数据文件以及存在于压缩的 squashfs 文件系统中的设置,因此它们在目标上占用的空间较少?
如果我的理论是正确的,我可以从备份中排除哪些与 Snap 相关的内容(如果有的话)?我在某处读到,排除 /snap 可能不安全,因为其中可能有与应用程序相关的设置。
任何建议都非常感谢。
干杯,
柔性
答案1
经过进一步调查并得到有益的回应后Raspberry Pi 线程和这个snapcraft.io 线程我有一个答案。
Snap 应用程序存储在 squashfs 映像文件中。它们位于/var/lib/snapd/
并在操作系统启动时安装/snap
。我在正在运行的 Ubuntu 操作系统的整个根目录上运行 rsync,并且没有从备份中排除任何与 snap 相关的内容。
因此,我的备份映像文件包含 中的 snap 应用程序的副本/var/lib/snapd/
以及 中安装的相同应用程序/snap
。 snap 的可写系统数据位于 下方/var/snap
,可写用户数据位于 中,~/snap
因此没有必要备份 中的任何内容/snap
。 这就是为什么我的备份包含比所需更多的数据。
从技术上讲,我的备份映像中的数据并没有像源 SD 卡上那样占用更多空间,而这正是我最初的想法。我之所以感到困惑,是因为我运行的方式du command
。我将 SD 卡从 Pi 中取出,并将其安装在笔记本电脑中,然后在 SD 卡根分区上运行命令。我应该在 SD 卡上运行操作系统时运行该命令。当操作系统未运行时,的内容/snap
实际上是空的。
将 SD 卡从 Pi 中取出,并将其根分区安装在/media/writable1
[flex@flex~]$ sudo du -hs /media/writable1/
3.3G /media/writable1/
将 SD 卡连接到 Pi 并通过该卡运行 Ubuntu...
ubuntu@ubuntu:~$ sudo du -hs /
du: cannot access '/proc/1118/task/1118/fd/4': No such file or directory
du: cannot access '/proc/1118/task/1118/fdinfo/4': No such file or directory
du: cannot access '/proc/1118/fd/3': No such file or directory
du: cannot access '/proc/1118/fdinfo/3': No such file or directory
4.7G /
当然还有其他方法备份快照和备份快照应用程序设置。但就我进行整个系统备份的情况而言,可以安全地/snap
从该备份中省略该目录,并且其余的快照相关数据将不会像在源上那样在目标上占用更多空间。