Linux上的完整tar备份,排除某些根目录文件夹

5

我有一个问题,似乎找不到答案。

我正在尝试编写一个使用tar进行完整系统备份的shell脚本。显然,有几个文件夹我不想备份(例如/dev、/mnt、/proc、/tmp等)。由于有很多我不想备份的文件夹,因此我正在使用“exclude-from”标志保持命令相对简洁。

问题是,它没有起作用。

这里是我正在使用的tar标志:

--create
--file $BACKUP_FILE
--preserve-permissions
--same-owner
--numeric-owner
--listed-incremental $INCREMENTAL_FILE
--level=0
--xz
--directory /
--exclude-caches
--exclude-from $EXCLUDE_FILE
-v

这是我的排除文件:

/dev
/lost+found
/media
/mnt
/proc
/run
/sys
/tmp
/var/spool
/var/run
/var/tmp

当我运行脚本时,它仍备份了我不想备份的那些文件夹。使用一堆“--exclude”标志似乎不起作用(而且我宁愿不使用它们)。我尝试将“--exclude-from $EXCLUDE_FILE”更改为“--exclude-from=$EXCLUDE-FILE”,确保每行后面没有空格以及其他一些事情(无法记住,事情开始变得模糊)。
我一直在阅读tar模式,看看是否有我遗漏的内容,但我还没有找到任何东西。我尝试查看是否与tar删除前导斜杠以进行安全处理有关,但我还没有找到任何内容。
在谷歌搜索时,唯一发现的有点帮助的是一个人正在做同样的事情,并通过从其排除文件条目中删除前导“/”来解决问题。我已经尝试过了,它有效,但它排除了所有文件夹而不是根文件夹。我可能会在我的主页上有一个“media”文件夹,我想备份它,但不想备份/media文件夹,因此这不是一个合适的解决方案。
2个回答

5

虽然ArchWiki包含如何使用tar进行全系统备份的说明,但您可能更想使用rsyncArchWiki还介绍了如何使用rsync进行全系统备份。 以root身份运行:

rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /* /path/to/backup/folder

-aAX选项集将确保使用'归档模式'。这确保了符号链接、设备、权限和所有权、修改时间、ACL和扩展属性被保留。

请注意,rsync也可以从文件中读取排除模式,因此您的用例可能类似于:

rsync -aAXv --exclude-from=FILE /* /path/to/backup/folder

如果您计划将系统备份到除/mnt/media之外的其他位置,请不要忘记将其添加到排除模式列表中,以避免无限循环。此外,如果系统中存在任何绑定挂载,则也应将其排除在外,以便仅复制绑定挂载的内容一次。

我感谢被告知其他选择,但是我已经阅读了使用rsync的相关信息,而我选择使用tar。 - MendAndDefend
@anEverydayGuy:我可以问为什么吗? - Steve
最终归结为它们的设计目的(因此,尽管两者都能完成工作,但它们最擅长的领域不同)。Tar 旨在备份/长期存储,而 rsync 旨在镜像/传输文件。对于 tar 来说,进行全量/差异/增量备份很容易;而让 rsync 进行差异备份则需要更多的操作。此外,我先让 tar 工作起来了(同时尝试了两种方法),并且我对 tar 有更多的经验。 - MendAndDefend
@anEverydayGuy:Tar最初是为了运行磁带备份而开发的,这也是其名称的由来——(T)ape(ar)chive。今天,tar只是一个归档实用程序。是的,你可以使用它来运行备份,因为它包含了那些选项,但rsync是一种更新、更多功能的工具,它默认执行镜像,并内置了远程文件传输。然而,我以前从未需要创建差分(或“真正”的增量)备份,因此我无法发表评论。也许这个链接会有所帮助:https://rsync.samba.org/examples.html - Steve
如果您想通过网络连接使用 rsync,例如备份到远程服务器,则添加 -z 标志以启用数据压缩可能非常有用。当然,效果因人而异。 - András Aszódi

2
所以,你猜怎么着,我在发布30分钟后找到了一个可能的解决方案。如果我将我的排除文件条目更改为以'./'(而不是'/')开头,似乎可以工作。这很有道理,因为我正在将目录更改为根目录,所以./media === /media。
但是,我暂时不会把它标记为答案。我非常希望保持我的排除文件条目为'/',而不是'./',以便明显地排除根文件夹。是的,我可以在排除文件中留下一条评论,说当前目录是根目录,但如果可以的话,我更愿意避免这样做。

1
既然你正在使用Arch,你是否看过关于此主题的ArchWiki文章?你可能会对rsync部分感兴趣,因为它可以完成大部分工作,并支持增量备份(仅备份更改的内容)。我可能错了,但我认为tar每次都会创建一个全新的tarball。 - Two-Bit Alchemist
好的。我不太了解tar,无法为您提供帮助。如果您尚未这样做,可以考虑在Arch论坛上发布或在reddit.com/r/archlinux上自行发布。 - Two-Bit Alchemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接