# Sincronització de fitxers: rsync i grsync

## 1. Introducció

`rsync` (*Remote Sync*) és una de les eines més potents i versàtils de Linux per a la **còpia i sincronització de fitxers**, tant en local com en remot. La seva característica principal és l'**algorisme delta**: només transfereix les diferències entre fitxers, estalviant temps i amplada de banda.

![rsync logo](https://proferamon.com/tic/imatges/rsync/rsync01.png)

`grsync` és una **interfície gràfica (GUI)** per a `rsync`, que facilita el seu ús a usuaris menys familiaritzats amb la línia d'ordres.


## 2. `rsync`

### 2.1 Característiques principals

- Transferència incremental: només copia el que ha canviat.
- Preservació de permisos, propietaris, dates i enllaços simbòlics.
- Compressió de dades durant la transferència (`-z`).
- Transferència xifrada via SSH.
- Suport per a exclusions i filtres.
- Mode simulació (*dry run*) per previsualitzar els canvis.
- Funciona en local i en remot (SSH, dimoni rsync).

### 2.2 Instal·lació

```bash
# Debian/Ubuntu
sudo apt install rsync

# Fedora/RHEL
sudo dnf install rsync

# Arch/Manjaro
sudo pacman -S rsync
```

### 2.3 Sintaxi bàsica

```bash
rsync [OPCIONS] ORIGEN DESTÍ
```

L'origen i el destí poden ser:

- Rutes locals: `/home/ramon/documents/`
- Remotes via SSH: `usuari@host:/ruta/`
- Remotes via dimoni rsync: `usuari@host::mòdul`

> **Important:** La barra final (`/`) a l'origen té significat:
>
> - `rsync origen/ destí/` → copia el **contingut** d'origen dins destí
>
> - `rsync origen destí/` → copia el **directori** origen dins destí (crea `destí/origen/`)

### 2.4 Opcions principals

| Opció               | Descripció                                                       |
|---------------------|------------------------------------------------------------------|
| `-a`, `--archive`   | Mode arxiu: preserva permisos, dates, propietari, grups, enllaços simbòlics, dispositius. Equivalent a `-rlptgoD` |
| `-v`, `--verbose`   | Mostra els fitxers processats                                    |
| `-z`, `--compress`  | Comprimeix les dades durant la transferència                     |
| `-r`, `--recursive` | Copia recursivament directoris                                   |
| `-u`, `--update`    | Salta fitxers al destí que siguin més nous                       |
| `-n`, `--dry-run`   | Simulació: mostra què faria sense fer res                        |
| `-P`                | Equivalent a `--progress --partial`: mostra progrés i reprèn    |
| `--progress`        | Mostra el progrés de cada fitxer                                 |
| `--partial`         | Conserva els fitxers parcialment transferits                     |
| `-e`                | Especifica el programa de transport remot (p. ex. `ssh`)         |
| `--delete`          | Elimina al destí els fitxers que ja no existeixen a l'origen     |
| `--exclude`         | Exclou fitxers o directoris per patró                            |
| `--include`         | Inclou fitxers que coincideixen amb el patró                     |
| `--filter`          | Regles de filtratge avançades                                    |
| `--bwlimit`         | Limita l'amplada de banda (en KB/s)                                |
| `-h`, `--human-readable` | Mostra mides en format llegible (KB, MB, GB)              |
| `--stats`           | Mostra estadístiques al final                                    |
| `--checksum`        | Compara fitxers per checksum en lloc de data/mida                |
| `--link-dest`       | Fa còpies incrementals amb enllaços durs (hard links)            |
| `-l`                | Copia els enllaços simbòlics com a tals                          |
| `-p`                | Preserva els permisos                                            |
| `-t`                | Preserva les dates de modificació                                |
| `-o`                | Preserva el propietari (cal ser root)                            |
| `-g`                | Preserva el grup                                                 |
| `--log-file`        | Desa un registre de l'operació en un fitxer                      |

### 2.5 Exemples pràctics

#### Còpia local

```bash
# Copiar un directori localment
rsync -av /home/ramon/documents/ /backup/documents/

# Sincronitzar eliminant fitxers esborrats a l'origen
rsync -av --delete /home/ramon/documents/ /backup/documents/

# Simulació prèvia
rsync -avn --delete /home/ramon/documents/ /backup/documents/
```

#### Còpia remota via SSH

```bash
# Copiar directori local cap a servidor remot
rsync -avz /home/ramon/web/ usuari@servidor.cat:/var/www/html/

# Copiar des d'un servidor remot cap a local
rsync -avz usuari@servidor.cat:/var/www/html/ /backup/web/

# Especificar port SSH diferent de 22
rsync -avz -e "ssh -p 2222" /dades/ usuari@servidor.cat:/backup/dades/

# Amb clau SSH privada
rsync -avz -e "ssh -i ~/.ssh/id_rsa" /dades/ usuari@servidor.cat:/backup/
```

#### Exclusions

```bash
# Excloure un directori
rsync -av --exclude='node_modules/' /projecte/ /backup/projecte/

# Excloure múltiples patrons
rsync -av --exclude='*.tmp' --exclude='*.log' --exclude='.git/' /projecte/ /backup/

# Usar un fitxer d'exclusions
rsync -av --exclude-from='exclusions.txt' /dades/ /backup/

# Contingut d'exclusions.txt:
# *.tmp
# *.log
# .git/
# node_modules/
# __pycache__/
```

#### Limitar l'amplada de banda

```bash
# Limitar a 1 MB/s
rsync -avz --bwlimit=1000 /dades/ usuari@servidor.cat:/backup/
```

#### Còpies de seguretat incrementals amb `--link-dest`

```bash
# Primera còpia completa
rsync -av /home/ramon/ /backup/2025-06-01/

# Còpies incrementals (els fitxers no canviats s'enllaçen amb hard links)
rsync -av --link-dest=/backup/2025-06-01/ /home/ramon/ /backup/2025-06-02/
rsync -av --link-dest=/backup/2025-06-02/ /home/ramon/ /backup/2025-06-03/
```

Cada directori de còpia sembla una còpia completa, però ocupa molt poc espai gràcies als hard links.

### 2.6 `rsync` com a dimoni

`rsync` pot funcionar com a dimoni independent (sense SSH), útil per a sincronitzacions internes a la xarxa:

#### Fitxer de configuració `/etc/rsyncd.conf`

```ini
[backup]
    path = /srv/backup
    comment = Directori de còpies de seguretat
    read only = false
    auth users = ramon
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.1.0/24
```

#### Fitxer de contrasenyes `/etc/rsyncd.secrets`

```ini
ramon:contrasenya_segura
```

```bash
chmod 600 /etc/rsyncd.secrets
```

#### Iniciar el dimoni

```bash
sudo systemctl enable --now rsync
```

#### Connectar al dimoni

```bash
rsync -av usuari@servidor::backup /backup/local/
```

### 2.7 Automatització amb cron

```bash
# Backup diari a les 2:00 de la matinada
0 2 * * * rsync -avz --delete /home/ramon/ /backup/home/ >> /var/log/rsync_backup.log 2>&1
```

### 2.8 Algorisme de transferència delta

`rsync` divideix cada fitxer en blocs i calcula checksums. Compara els checksums entre origen i destí i només transfereix els blocs que difereixen. Això el fa molt eficient per a:

- Fitxers grans amb poques modificacions (bases de dades, màquines virtuals).
- Connexions lentes o amb amplada de banda limitada.
- Sincronitzacions freqüents de grans estructures de directoris.

### 2.9 Sortida i estadístiques

```bash
rsync -avh --stats /origen/ /destí/
```

Exemple de sortida amb `--stats`:

```ini
Number of files: 1,234
Number of created files: 12
Number of deleted files: 3
Number of regular files transferred: 45
Total file size: 2.34G bytes
Total transferred file size: 12.5M bytes
Literal data: 12.5M bytes
Matched data: 2.33G bytes
File list size: 45.6K
Total bytes sent: 12.6M
Total bytes received: 1.23K
```



## 3. `grsync`: interfície gràfica per a `rsync`

### 3.1 Descripció

`grsync` és una aplicació GTK que proporciona una **GUI amigable** per configurar i executar operacions `rsync` sense necessitat de recordar opcions de línia d'ordres.

### 3.2 Instal·lació

```bash
# Debian/Ubuntu
sudo apt install grsync

# Fedora/RHEL
sudo dnf install grsync

# Arch/Manjaro
sudo pacman -S grsync
```

### 3.3 Característiques de la interfície

- **Origen i destí:** selectors gràfics de directoris.
- **Opcions visuals:** caselles de verificació per a les opcions més comunes d'`rsync`.
- **Sessions:** permet desar perfils de sincronització per reutilitzar-los.
- **Simulació:** botó de *dry run* per previsualitzar els canvis.
- **Log en temps real:** mostra la sortida d'`rsync` mentre s'executa.
- **Traducció de les opcions:** mostra l'ordre `rsync` equivalent que executarà.

### 3.4 Opcions disponibles a la GUI

La interfície agrupa les opcions en pestanyes:

**Opcions bàsiques:**

- Preservar el temps, permisos, propietari, grup
- Copiar enllaços simbòlics
- Eliminar fitxers al destí (`--delete`)
- Mode verbós
- Compressió

**Opcions avançades:**

- Excloure patrons
- Limitar l'amplada de banda
- Opcions SSH personalitzades
- Opcions addicionals (camp de text lliure per a qualsevol opció rsync)

### 3.5 Gestió de sessions

`grsync` permet desar configuracions com a **sessions** amb nom:

1. Configurar els paràmetres desitjats.
2. Menú **Sessions → Desa sessió**.
3. Assignar un nom (p. ex. `backup_home`, `sincro_web`).
4. Per recuperar-la: menú **Sessions → Obre sessió**.

Les sessions es desen a `~/.grsync/` en format text pla.

### 3.6 Execució des de la línia d'ordres

`grsync` permet obrir directament una sessió guardada:

```bash
grsync --session="backup_home"
```

Això facilita l'automatització des de scripts o cron mantenint la configuració visual.

## 4. Comparativa `rsync` vs. altres eines

| Eina       | Ús                           | Avantatges                              | Inconvenients                       |
|------------|------------------------------|-----------------------------------------|-------------------------------------|
| `rsync`    | Còpia/sincronització general | Incremental, SSH, molt configurable     | Sintaxi complexa per a novells      |
| `cp`       | Còpia simple local           | Senzill                                 | Sense incremental ni remot          |
| `scp`      | Còpia remota via SSH         | Senzill per a fitxers puntuals          | Sense incremental                   |
| `sftp`     | Transferència interactiva SSH| Interactiu                              | Manual, sense automatització        |
| `unison`   | Sincronització bidireccional | Detecta canvis en ambdós extrems        | Més complex de configurar           |
| `rclone`   | Sincronització amb cloud     | Suporta S3, Drive, Dropbox, etc.        | No usa l'algorisme delta d'rsync    |



## 5. Bones pràctiques

1. **Sempre fer un `--dry-run` primer** (`-n`) per veure què canviarà.
2. **Anar amb compte amb `--delete`**: eliminarà fitxers al destí de manera permanent.
3. **Usar `--backup`** per conservar versions anteriors dels fitxers sobreescrits:
   ```bash
   rsync -av --backup --backup-dir=/backup/old/ /origen/ /destí/
   ```
4. **Verificar la barra final** a l'origen per evitar duplicació de directoris.
5. **Logs:** sempre redirigir la sortida a un fitxer quan s'automatitza.
6. **Connexions SSH:** usar claus sense contrasenya per a tasques automatitzades.
7. **Provar la connectivitat** abans d'automatitzar tasques remotes.


## 6. Casos d'ús habituals

```bash
# 1. Mirror d'un lloc web
rsync -avz --delete /var/www/html/ usuari@servidor2:/var/www/html/

# 2. Còpia de seguretat de /home excloent fitxers grans
rsync -avz --exclude='*.iso' --exclude='*.vmdk' /home/ /backup/home/

# 3. Sincronització bidireccional (amb precaució)
# Origen → Destí
rsync -av /dades/ /backup/
# Destí → Origen (si cal)
rsync -av /backup/ /dades/

# 4. Transferència amb progrés visible
rsync -avhP fitxer_gran.iso usuari@servidor:/tmp/

# 5. Còpia preservant ACL i atributs estesos
rsync -avAX /origen/ /destí/
```



## 7. Resum d'ordres (referència ràpida)

```bash
# Còpia local bàsica
rsync -av /origen/ /destí/

# Còpia amb sincronització (elimina al destí)
rsync -av --delete /origen/ /destí/

# Còpia remota
rsync -avz /origen/ usuari@host:/destí/

# Simulació
rsync -avn --delete /origen/ /destí/

# Amb progrés
rsync -avhP /origen/ /destí/

# Excloure patrons
rsync -av --exclude='*.tmp' /origen/ /destí/

# Còpia incremental amb hard links
rsync -av --link-dest=/backup/anterior/ /origen/ /backup/nou/

# Limitar ample de banda
rsync -avz --bwlimit=500 /origen/ usuari@host:/destí/

# Estadístiques
rsync -avh --stats /origen/ /destí/
```



## 8. Referències

- `man rsync` — Manual complet de l'ordre
- `man rsyncd.conf` — Configuració del dimoni rsync
- [rsync.samba.org](https://rsync.samba.org) — Lloc oficial del projecte
- [Arch Wiki: rsync](https://wiki.archlinux.org/title/Rsync)
- `man grsync` — Manual de grsync


#### Versions d'aquest document

+ HTML - [rsync.html](https://proferamon.com/tic/rsync.html)
+ PDF - [rsync.pdf](https://proferamon.com/tic/docs/rsync.pdf)
+ ODT - [rsync.odt](https://proferamon.com/tic/odt/rsync.odt)
+ MD - [rsync.md](https://proferamon.com/tic/md/rsync.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)
