这可能与这(虽然我不排除文件夹,只排除它们的内容),但我不确定我是否完全理解所提供的答案。
下列的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/*
例如......