Linux 上的完整 tar 备份,不包括某些根文件夹
Full tar backup on Linux, excluding certain root folders
我有一个问题,我似乎找不到答案。
我正在尝试编写一个 shell 脚本来使用 tar 进行完整的系统备份。显然,有几个文件夹我不想备份(/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 模式,所以看看是否有我遗漏的东西,我还没有遇到任何东西。我试着看看这是否与 tar 出于安全目的去除前导斜线有关,但我还没有找到任何东西。
虽然在谷歌上搜索,但我发现唯一有帮助的是一个人在做同样的事情并通过从他的排除文件条目中删除前导“/”来解决它。我已经尝试过了并且它有效,但它排除了所有文件夹而不是根文件夹。我家里可能会有一个 'media' 文件夹,我想备份那个文件夹而不是 /media 文件夹,所以这不是一个合适的解决方案。
算了,我在发帖 30 分钟后找到了可能的解决方案。如果我将我的排除文件条目更改为以“./”(而不是“/”)开头,它似乎可以工作。这是有道理的,因为我正在将目录更改为根目录,所以 ./media === /media.
不过,我暂时不会将其标记为答案。我非常希望将我的排除文件条目保留为“/”而不是“./”,这样很明显我排除了根文件夹。是的,我可以在排除文件中留下评论说当前目录是根目录,但如果可以的话我宁愿避免它。
虽然ArchWiki includes instructions on how to perform a full system backup with tar, you probably want to use rsync instead. The ArchWiki also describes how to perform a full system backup with rsync。作为 root,运行:
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /* /path/to/backup/folder
-aAX
组选项将确保使用 'archive mode'。这可确保保留符号链接、设备、权限和所有权、修改时间、ACL 和扩展属性。
请注意,rsync 还可以从文件中读取排除模式,因此您的用例可能类似于:
rsync -aAXv --exclude-from=FILE /* /path/to/backup/folder
如果您计划在 /mnt
或 /media
以外的地方备份您的系统,请不要忘记将其添加到排除模式列表中以避免无限循环。另外,如果系统中有任何绑定挂载,也应该将它们排除在外,这样绑定挂载的内容只会被复制一次。
我有一个问题,我似乎找不到答案。
我正在尝试编写一个 shell 脚本来使用 tar 进行完整的系统备份。显然,有几个文件夹我不想备份(/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 模式,所以看看是否有我遗漏的东西,我还没有遇到任何东西。我试着看看这是否与 tar 出于安全目的去除前导斜线有关,但我还没有找到任何东西。
虽然在谷歌上搜索,但我发现唯一有帮助的是一个人在做同样的事情并通过从他的排除文件条目中删除前导“/”来解决它。我已经尝试过了并且它有效,但它排除了所有文件夹而不是根文件夹。我家里可能会有一个 'media' 文件夹,我想备份那个文件夹而不是 /media 文件夹,所以这不是一个合适的解决方案。
算了,我在发帖 30 分钟后找到了可能的解决方案。如果我将我的排除文件条目更改为以“./”(而不是“/”)开头,它似乎可以工作。这是有道理的,因为我正在将目录更改为根目录,所以 ./media === /media.
不过,我暂时不会将其标记为答案。我非常希望将我的排除文件条目保留为“/”而不是“./”,这样很明显我排除了根文件夹。是的,我可以在排除文件中留下评论说当前目录是根目录,但如果可以的话我宁愿避免它。
虽然ArchWiki includes instructions on how to perform a full system backup with tar, you probably want to use rsync instead. The ArchWiki also describes how to perform a full system backup with rsync。作为 root,运行:
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /* /path/to/backup/folder
-aAX
组选项将确保使用 'archive mode'。这可确保保留符号链接、设备、权限和所有权、修改时间、ACL 和扩展属性。
请注意,rsync 还可以从文件中读取排除模式,因此您的用例可能类似于:
rsync -aAXv --exclude-from=FILE /* /path/to/backup/folder
如果您计划在 /mnt
或 /media
以外的地方备份您的系统,请不要忘记将其添加到排除模式列表中以避免无限循环。另外,如果系统中有任何绑定挂载,也应该将它们排除在外,这样绑定挂载的内容只会被复制一次。