3.4 KiB
3.4 KiB
title, created, source, tags
| title | created | source | tags |
|---|---|---|---|
| 要使用 `rsync` 同步数据后保证恢复时权限和属性与原始 | 2026-05-31 | Cherry Studio |
要使用 rsync 同步数据后保证恢复时权限和属性与原始一致,需要使用正确的参数来保留所有权、权限、时间戳等元数据。以下是不同场景下的解决方案:
1. 超级用户(Root)恢复(源和目标均为Root权限)
如果需要完全恢复用户、组、权限、时间戳等元数据,必须使用 root 或 sudo 运行:
sudo rsync -avAXH --numeric-ids --delete /source/ user@remote:/destination/
关键参数说明:
-
-a(--archive):递归同步并保留权限、所有者、时间戳等 -
-v(--verbose):输出详细信息 -
-A(--acls):保留ACLs(访问控制列表) -
-X(--xattrs):保留扩展属性(如SELinux标签) -
-H(--hard-links):保留硬链接 -
--numeric-ids:以数字形式保留用户/组ID(不依赖目标机器的用户名映射) -
--delete:删除目标端存在但源端不存在的内容(完全一致恢复)
2. 非Root用户恢复(仅保留部分权限)
如果源数据 不是 root 所有,或者目标服务器 不信任 root 访问,可以仅保留可管理的权限:
rsync -av --no-perms --no-owner --no-group --times /source/ user@remote:/destination/
或(部分保留):
rsync -rtlgoDv --no-perms --no-owner /source/ user@remote:/destination/
参数说明:
-
--no-perms、--no-owner、--no-group:跳过权限和所有权(非root用户无法修改这些) -
--times(-t):仅保留时间戳 -
-D:保留设备文件(仅限root) -
-o(--owner)、-g(--group):尝试保留用户/组(可能仅在root下有效)
3. 跨服务器同步的完整权限保障方案
如果既要同步数据,又想 以后能完整恢复(即使源服务器崩溃),最佳方式是:
- 备份元数据(先存一份权限信息,以防后续恢复):
getfacl -R /source/ > /backup/source_permissions.acl
- 用
rsync完整同步数据:
sudo rsync -avAXH --numeric-ids --delete /source/ user@remote:/destination/
- 恢复时重新应用权限:
sudo setfacl --restore=/backup/source_permissions.acl
4. 限制非Root权限的方案
如果源数据 有 root 权限部分,但目标机器 不能使用 root,可以采用:
- 只同步你能控制的文件:
rsync -av --rsync-path="sudo -u targetuser rsync" \
--filter="- *root*" /source/ user@remote:/destination/
- 使用
fakeroot(模拟root权限)(仅适用于部分环境):
fakeroot rsync -av /source/ user@remote:/destination/
- 在恢复时手动修复权限(适用于少量文件):
chmod/chown 手工调整权限
总结
| 方案 | 适用场景 | 能否100%恢复权限 |
|---|---|---|
root+-aAXH |
需要完整恢复 | ✅ 可以 |
--numeric-ids |
跨机器同步 | ✅ 可以 |
非root rsync |
受限权限 | ❌ 部分丢失 |
| ACL备份+恢复 | 安全恢复 | ✅ 可以 |
如果数据是关键业务,建议 先测试恢复流程,确保 rsync 参数正确,避免权限丢失!