编辑:

编辑:

这可能与(虽然我不排除文件夹,只排除它们的内容),但我不确定我是否完全理解所提供的答案。

下列的Arch Wiki 使用 rsync 进行完整系统备份,我使用了以下备份脚本:

#!/bin/bash
rsync -aAXHs --info=progress2 --numeric-ids --delete --exclude={"/swapfile","/dev/*","/proc/*","/sys/*","/tmp/*","/run/*",
"/mnt/*","/media/*","/lost+found","/home/*/.cache/mozilla/*","/home/*/.thumbnails/*"} -e ssh / [email protected]:/path/to/my/backup/folder/

请注意,NAS 上我的备份文件夹的路径确实以 开头和结尾/,以防万一。

该代码由 backup.service systemd 服务运行:

[Unit]
Description="Full system backup service on the NAS"

[Service]
ExecStart=/usr/local/bin/backup.sh

这是由启用的 backup.timer 触发的:

[Unit]
Description="Backs up the full system"

[Timer]
OnBootSec=3min
OnUnitActiveSec=24h
Unit=backup.service

[Install]
WantedBy=multi-user.target

与 NAS(QNAP NAS)的 SSH 连接是通过私有/公共 SSH 密钥,没有密码

现在,当我 时sudo journalctl -u backup.service -b,我得到:

Aug 17 17:21:08 Solgaleo systemd[1]: Started "Full system backup service on the NAS".
Aug 17 17:23:21 Solgaleo backup.sh[14481]: [6.3K blob data]
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/uinput, ACL_TYPE_ACCESS): Operation not s>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/dri/card0, ACL_TYPE_ACCESS): Operation no>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/controlC0, ACL_TYPE_ACCESS): Operatio>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/controlC1, ACL_TYPE_ACCESS): Operatio>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/hwC0D0, ACL_TYPE_ACCESS): Operation n>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/hwC1D0, ACL_TYPE_ACCESS): Operation n>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC0D10p, ACL_TYPE_ACCESS): Operatio>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC0D11p, ACL_TYPE_ACCESS): Operatio>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC0D12p, ACL_TYPE_ACCESS): Operatio>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC0D3p, ACL_TYPE_ACCESS): Operation>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC0D7p, ACL_TYPE_ACCESS): Operation>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC0D8p, ACL_TYPE_ACCESS): Operation>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC0D9p, ACL_TYPE_ACCESS): Operation>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC1D0c, ACL_TYPE_ACCESS): Operation>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC1D0p, ACL_TYPE_ACCESS): Operation>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC1D1p, ACL_TYPE_ACCESS): Operation>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/pcmC1D2c, ACL_TYPE_ACCESS): Operation>
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/seq, ACL_TYPE_ACCESS): Operation not >
Aug 17 17:23:21 Solgaleo backup.sh[14481]: rsync: set_acl: sys_acl_set_file(dev/snd/timer, ACL_TYPE_ACCESS): Operation no>
Aug 17 17:23:22 Solgaleo backup.sh[14481]: [47.9K blob data]
Aug 17 17:23:22 Solgaleo backup.sh[14481]: [48.0K blob data]
Aug 17 17:23:22 Solgaleo backup.sh[14481]: [48.0K blob data]
Aug 17 17:23:22 Solgaleo backup.sh[14481]: [48.0K blob data]
Aug 17 17:23:22 Solgaleo backup.sh[14481]: [48.0K blob data]
[...]
Aug 17 17:24:13 Solgaleo backup.sh[14481]: file has vanished: "/home/ben/.cache/mozilla/firefox/p4vxyaiw.default-release/>
[...]

这意味着至少/dev/home/*/.cache/mozilla/*不是排除...的/swapfile 还备份了,这当然是我不想要的。

我做错什么了吗?

编辑:

早些时候,我发布了这个答案作为我的问题的解决方案:

确实给出了答案这里。但这只是在 @MC68020 评论和阅读之后我了解 rsync 如何奇怪地管理排除。

rsync 的棘手之处在于,当您尝试排除某些内容时,您需要使用相对路径,因为当它尝试匹配排除项时,它不会使用路径的第一部分进行匹配……这很奇怪。

举例来说,您正在尝试备份 /data/web/ 并将其发送到另一台服务器,因此您使用 rsync -a /data/web/ user@server:/backups/data/web/ 之类的命令来制作它发生......但您真的想跳过同步 /data/web/cache/ 文件夹。当 rsync 检查它同步的每个项目的排除列表时,它不会检查 /data/web/cache/,因为您的原始 rsync 命令基于 /data/web/ 文件夹。它只会根据列表检查“cache/”。因此,您需要将“缓存”放入列表中,而不是完整路径。

因此,在我的具体情况下,我只需要删除每个/路径开头的每个路径,因此我的路径不是绝对的,而是相对的/......最终结果是:

#!/bin/bash
rsync -aAXHs --info=progress2 --numeric-ids --delete --exclude={"swapfile","dev/*","proc/*","sys/*","tmp/*","run/*","mnt/*
","media/*","lost+found","home/*/.cache/mozilla/*","home/*/.thumbnails/*","home/*/.local/share/Trash/*"} -e ssh / [email protected]:/path/to/my/backup/folder/

然而,这是错的

rsync 过滤规则的前导/意味着“在路径的开头查看以下模式,相对于传输的根”。

如果没有前导/, rsync 会匹配路径中任何位置的模式。

例如,--exclude=tmp/*如果没有前导/,则会排除/tmp/*,但也会排除/var/tmp/*,这不是我想要做的。

Rsync 手册页说:

查看应过滤的名称的最简单方法是在使用 --verbose 时查看输出,并在名称前面放置一个 /(如果您尚未准备好复制任何名称,请使用 --dry-run 选项)文件)。

然而,这样做对我来说不起作用:

$ sudo rsync -av / tmp/ --dry-run --exclude={"/proc/*", "/run/*", "/dev/*"}|more
rsync: [sender] change_dir "/home/ben/tmp" failed: No such file or directory (2)
rsync: [sender] link_stat "/run/*," failed: No such file or directory (2)
sending incremental file list
created directory /dev/*}
./
bin -> usr/bin
lib -> usr/lib
lib64 -> usr/lib
sbin -> usr/bin
swapfile
boot/
boot/initramfs-linux-fallback.img
boot/initramfs-linux.img
boot/intel-ucode.img
boot/modelist.efi
boot/refind_linux.conf
boot/vmlinuz-linux
dev/
dev/autofs
dev/btrfs-control
dev/console
dev/core -> /proc/kcore
dev/cpu_dma_latency
dev/cuse
[...]

所以我按照手册进行操作(使用 --verbose 查看输出并/在名称前面添加,但它仍然不排除/dev/*例如......

相关内容