129 lines
3.4 KiB
Markdown
129 lines
3.4 KiB
Markdown
---
|
||
title: 要使用 `rsync` 同步数据后保证恢复时权限和属性与原始
|
||
created: 2026-05-31
|
||
source: Cherry Studio
|
||
tags:
|
||
---
|
||
要使用 `rsync` 同步数据后保证恢复时权限和属性与原始一致,需要使用正确的参数来保留**所有权、权限、时间戳等元数据**。以下是不同场景下的解决方案:
|
||
|
||
---
|
||
|
||
### **1\. 超级用户(Root)恢复(源和目标均为Root权限)**
|
||
|
||
如果需要完全恢复**用户、组、权限、时间戳**等元数据,必须使用 `root` 或 `sudo` 运行:
|
||
|
||
```bash
|
||
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 访问,可以仅保留可管理的权限:
|
||
|
||
```bash
|
||
rsync -av --no-perms --no-owner --no-group --times /source/ user@remote:/destination/
|
||
```
|
||
|
||
或(部分保留):
|
||
|
||
```bash
|
||
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\. 跨服务器同步的完整权限保障方案**
|
||
|
||
如果既要同步数据,又想 **以后能完整恢复**(即使源服务器崩溃),最佳方式是:
|
||
|
||
1. **备份元数据**(先存一份权限信息,以防后续恢复):
|
||
|
||
|
||
```bash
|
||
getfacl -R /source/ > /backup/source_permissions.acl
|
||
```
|
||
|
||
2. **用** `rsync` **完整同步数据**:
|
||
|
||
|
||
```bash
|
||
sudo rsync -avAXH --numeric-ids --delete /source/ user@remote:/destination/
|
||
```
|
||
|
||
3. **恢复时重新应用权限**:
|
||
|
||
|
||
```bash
|
||
sudo setfacl --restore=/backup/source_permissions.acl
|
||
```
|
||
|
||
---
|
||
|
||
### **4\. 限制非Root权限的方案**
|
||
|
||
如果源数据 **有 root 权限部分**,但目标机器 **不能使用 root**,可以采用:
|
||
|
||
1. **只同步你能控制的文件**:
|
||
|
||
|
||
```bash
|
||
rsync -av --rsync-path="sudo -u targetuser rsync" \
|
||
--filter="- *root*" /source/ user@remote:/destination/
|
||
```
|
||
|
||
2. **使用** `fakeroot`**(模拟root权限)**(仅适用于部分环境):
|
||
|
||
|
||
```bash
|
||
fakeroot rsync -av /source/ user@remote:/destination/
|
||
```
|
||
|
||
3. **在恢复时手动修复权限**(适用于少量文件):
|
||
|
||
|
||
```bash
|
||
chmod/chown 手工调整权限
|
||
```
|
||
|
||
---
|
||
|
||
### **总结**
|
||
|
||
| 方案 | 适用场景 | 能否100%恢复权限 |
|
||
| --- | --- | --- |
|
||
| **root+**`-aAXH` | 需要完整恢复 | ✅ 可以 |
|
||
| `--numeric-ids` | 跨机器同步 | ✅ 可以 |
|
||
| **非root** `rsync` | 受限权限 | ❌ 部分丢失 |
|
||
| **ACL备份+恢复** | 安全恢复 | ✅ 可以 |
|
||
|
||
如果数据是关键业务,建议 **先测试恢复流程**,确保 `rsync` 参数正确,避免权限丢失! |