first commit
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
---
|
||||
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` 参数正确,避免权限丢失!
|
||||
Reference in New Issue
Block a user