打包时默认记录权限和属主,但需root身份才能完整保存UID/GID;深层属性如ACL、capability、SELinux须显式加--acls、--xattrs、--selinux参数;路径应使用-C或先cd避免绝对路径。

打包时保留读写权限和所属用户属性,关键不是“加不加参数”,而是用谁的身份执行、是否在正确路径下操作。
打包阶段:默认就记录,但需 root 身份才完整
tar 在打包时默认会记录文件权限(rwx)、属主 UID、属组 GID、时间戳等元数据,无需额外参数。但普通用户运行 tar -cf backup.tar /path 时:
- 能记录原始权限(如
755、644),但无法读取 /etc/passwd 中的属主名,归档里只存数字 UID/GID - 若源文件属主是 root(UID 0),普通用户打包后仍存为 0,但解压时无法还原成 root —— 这是解压阶段的问题,不是打包没记
- 真正需要显式干预的,是深层属性:ACL、capability、SELinux 上下文,它们默认不记录
必须加的参数:仅针对扩展属性
如果源文件用了 setfacl、setcap 或 SELinux 标签(比如容器二进制或 audit 工具),光靠默认打包不够,需显式启用:
-
--acls:保存并还原访问控制列表 -
--xattrs:保存扩展属性(含cap_net_raw等 capability) -
--selinux:保存 SELinux 安全上下文(如system_u:object_r:bin_t:s0)
例如完整打包命令:sudo tar --acls --xattrs --selinux -czf app-full.tar.gz -C /opt app/
路径与工作目录影响归属记录
打包路径写法决定归档内路径结构,间接影响还原效果:
- 错误:直接
tar -cf backup.tar /opt/app→ 归档内含绝对路径/opt/app/xxx,解压可能越权写入系统目录 - 正确:先
cd /opt,再sudo tar -cf backup.tar app/→ 归档内是相对路径app/xxx,安全可控 - 更稳妥:用
-C指定根目录,sudo tar -C /opt -cf backup.tar app/
验证打包是否成功记录了属性
打包完成后,可用以下命令快速检查:
-
tar -tzf backup.tar.gz | head -n 5:确认路径无多余前缀 -
tar -tvf backup.tar.gz etc/passwd | awk '{print $1,$3,$4}':看权限列(如rw-r--r--)和属主属组字段是否非当前用户 -
tar -tvf backup.tar.gz --acls | grep ACL:若有输出,说明 ACL 已记录

















