Linux tar 保留文件特殊属性使用小结

本文是小结 Linux 下 tar 程序在备份和恢复文件时,是否能保留除常规拥有者、群组、权限之外的其它特殊权限。包括:ACL 权限、chattr 权限、getcap 查看的文件扩展属性和 selinux 权限。视频演示:【Linux tar 保留文件特殊属性使用小结】 https://www.bilibili.com/video/BV1QC41187yZ/

本文测试环境是 Deepin 20.9 Linux、ext4 和 btrfs 文件系统,GNU tar 1.30。最新的 tar 1.35 版本结果也一样。为了减少复杂度,建立备份和恢复备份均使用 sudo 在 root 权限下进行,root 用户默认保留常规拥有者、群组、权限属性,即默认启用选项:保留常规权限( -p, --preserve-permissions, --same-permissions )、保留常规拥有者和群组( --same-owner )。

这里使用3个测试文件,相关信息如下(以下命令均是 tar 1.30 在 ext4 文件系统中执行,btrfs 的结果没有实质的差别):

littlebat@deepin:~/tmp$ ls -la acl.txt attr.txt /usr/bin/ping
-rw-rw----+ 1 littlebat2 littlebat2 0 3月 5 11:24 acl.txt
-rw-r--r-- 1 littlebat littlebat 0 3月 5 11:24 attr.txt
-rwxr-xr-x 1 root root 65200 3月 9 2021 /usr/bin/ping
littlebat@deepin:~/tmp$ getfacl acl.txt
file: acl.txt
owner: littlebat2
group: littlebat2
user::rw-
user:learndiary:rw-
group::rw-
mask::rw-
other::---
littlebat@deepin:~/tmp$ lsattr attr.txt
----i---------e---- attr.txt
littlebat@deepin:~/tmp$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
littlebat@deepin:~/tmp$

因为我使用 Deepin 20.9 没启用 selinux,就是就不测试 selinux 了。我在启用了 selinux 的系统试过,用法类似。

备份文件:

littlebat@deepin:~/tmp$ sudo tar --acls --selinux --xattrs -cvvf test.tar acl.txt attr.txt /usr/bin/ping
请输入密码:
验证成功
-rw-rw----+ littlebat2/littlebat2 0 2024-03-05 11:24 acl.txt
-rw-r--r-- littlebat/littlebat 0 2024-03-05 11:24 attr.txt
tar: 从成员名中删除开头的“/”
-rwxr-xr-x root/root 65200 2021-03-09 03:46 /usr/bin/ping
tar: 从硬连接目标中删除开头的“/”
littlebat@deepin:~/tmp$

恢复文件:

littlebat@deepin:~/tmp$ mkdir test
littlebat@deepin:~/tmp$ sudo tar --acls --selinux --xattrs --xattrs-include='*' -xvvf test.tar -C test
-rw-rw----+ littlebat2/littlebat2 0 2024-03-05 11:24 acl.txt
-rw-r--r-- littlebat/littlebat 0 2024-03-05 11:24 attr.txt
-rwxr-xr-x root/root 65200 2021-03-09 03:46 usr/bin/ping
drwxr-xr-x 正在创建目录: usr
drwxr-xr-x 正在创建目录: usr/bin
littlebat@deepin:~/tmp$

恢复后文件属性:

littlebat@deepin:~/tmp$ cd test
littlebat@deepin:~/tmp/test$ ls -la acl.txt attr.txt usr/bin/ping
-rw-rw----+ 1 littlebat2 littlebat2 0 3月 5 11:24 acl.txt
-rw-r--r-- 1 littlebat littlebat 0 3月 5 11:24 attr.txt
-rwxr-xr-x 1 root root 65200 3月 9 2021 usr/bin/ping
littlebat@deepin:~/tmp/test$ getfacl acl.txt
file: acl.txt
owner: littlebat2
group: littlebat2
user::rw-
user:learndiary:rw-
group::rw-
mask::rw-
other::---
littlebat@deepin:~/tmp/test$ lsattr attr.txt
--------------e---- attr.txt
littlebat@deepin:~/tmp/test$ getcap usr/bin/ping
usr/bin/ping = cap_net_raw+ep
littlebat@deepin:~/tmp/test$

前面可以看出,chattr 增加的不可更改文件属性没有恢复。是因为现在 GNU tar 还没有实现保留 chattr 设置属性的功能。

另外,在保留类似 /usr/bin/ping 这样的扩展属性上,恢复备份时必须具体指定 --xattrs-include 模式,否则只会默认恢复user命名空间的扩展属性。tar 1.30 联机的 man 文档里扩展属性说得不清楚,最新的相关文档可以查看下面的参考网址1:“GNU tar Extended File Attributes”,据我测试也适用于 tar 1.30。

参考网址:
1、GNU tar Extended File Attributes: https://www.gnu.org/software/tar/manual/html_node/Extended-File-Attributes.html
2、GNU tar how to preserve file immutable attribute set by "chattr +i" in Linux? https://unix.stackexchange.com/questions/771454/gnu-tar-how-to-preserve-file-immutable-attribute-set-by-chattr-i-in-linux
3、Extended attributes https://wiki.archlinux.org/title/Extended_attributes

One thought on “Linux tar 保留文件特殊属性使用小结”

发表评论

电子邮件地址不会被公开。 必填项已用*标注