1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
|
```sh
sudo apt-get install rsync
rsync_ _опции_ _источник_ _приемник_
rsync -avzhe ssh vlapa@178.20.46.157:~/git/ ~/1Tb_r1-a/Backup/_git/
```
****-v**** - Выводить подробную информацию о процессе копирования;**
-****-q**** - Минимум информации;
****-c**** - Проверка контрольных сумм для файлов;
****-a**** - Режим архивирования, когда сохраняются все атрибуты оригинальных файлов;
****-R**** - Относительные пути;
****-b**** - Создание резервной копии;
****-u**** - Не перезаписывать более новые файлы;
****-l**** - Копировать символьные ссылки;
****-L**** - Копировать содержимое ссылок;
****-H**** - Копировать жесткие ссылки;
****-p**** - Сохранять права для файлов;
****-g**** - Сохранять группу;
****-t**** - Сохранять время модификации;
****-x**** - Работать только в этой файловой системе;
****-e**** - Использовать другой транспорт, например, ssh;
****-z**** - Сжимать файлы перед передачей;
****--delete**** - Удалять файлы которых нет в источнике;
****--exclude**** - Исключить файлы по шаблону;
****--recursive**** - Перебирать директории рекурсивно;
****--no-recursive**** - Отключить рекурсию;
****--progress**** - Выводить прогресс передачи файла;
****--stat**** - Показать статистику передачи;
****--********max-size**** ****—**** максимальный размер файла для передачи;
****--********bwlimit**** ****—**** ограничение скорости для передачи файлов;
****--version**** - Версия утилиты.
```sh
sudo vim /etc/rsyncd.conf`
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock`
log file = /var/log/rsync.log`
[share] path = /tmp/share/`
hosts allow = 192.168.56.1`
hosts deny = * list = true`
uid = root gid = root`
read only = false`
```
**Здесь мы задаем путь к нашей папке для синхронизации, разрешаем доступ к серверу только с ip адреса (192.168.56.1) и запрещаем все остальные подключения. Параметры uid и gid указывают пользователя и группу, от которых будет запущен демон. Лучше не использовать root, а указать пользователя nobody и выдать ему права на ту папку, в которую будет выполняться синхронизация каталогов rsync.**
Настройка rsync завершена, остается сохранить файл, запустить сервер rsync и добавить его в автозагрузку:
```sh
sudo systemctl start rsync
sudo systemctl enable rsync
sudo service cron reload
```
**Копирование и синхронизация файлов на локальном компьютере
`rsync -zvh file /tmp/backups/`
**Указав опцию** `--progress` **вы можете видеть сколько процентов уже скопировано, а сколько еще осталось:**
`rsync -zvh --progress file /tmp/backups/`
**Синхронизация папок на локальной машине**
`rsync -azvh /home/user/documents /tmp/backups/`
**Синхронизация с удаленным сервером**
`rsync -avz /home/sergiy/tmp/ root@192.168.56.102:/home/`
**По умолчанию rsync попытается использовать транспорт ssh. Если вы хотите использовать ранее созданный сервер rsync, нужно указать это явно:**
`rsync -avz /home/sergiy/tmp/ rsync://192.168.56.102:/share`
Точно также можно синхронизировать файлы с rsync из удаленного сервера:
`rsync -avz root@192.168.56.102:/home/ /home/sergiy/tmp/`
Адрес удаленного сервера записывается в таком формате:
`имя_пользователя@адрес_машины/папка/на/удаленной_машине`
Синхронизация папок rsync будет выполняться на стандартном порту.
### _**Синхронизация файлов по SSH**_
Чтобы задать протокол подключения используется опция -e. При использовании SSH все передаваемые данные шифруются и передаются по защищенному каналу, таким образом, чтобы никто не мог их перехватить. Для использования SSH вам нужно знать пароль пользователя в системе.
Синхронизация файлов rsync с удаленного сервера по ssh будет выглядеть вот так:
`rsync -avzhe ssh root@192.168.56.102:/root/install.log /tmp/`
Если вы используете другой порт для ssh, то здесь его можно указать:
`rsync -avzhe "ssh -p 22" root@192.168.56.102:/root/install.log /tmp/`
А теперь передадим данные на тот же сервер:
`rsync -avzhe ssh backup.tar root@192.168.0.101:/backups/`
**Просмотр прогресса при синхронизации**
Для просмотра прогресса копирования файла с одной машины на другую используется опция progress:
`rsync -avzhe ssh --progress /home/user/documents root@192.168.56.102:/root/documents`
**Синхронизация не всех файлов в rsync**
Опции include и exclude позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями.
Например, скопируем все файлы, начинающиеся на букву R:
`rsync -avze ssh --include 'R*' --exclude '*'`
`root@192.168.56.102:/root/documents/ /root/documents`
**Удаление при синхронизации**
Во время синхронизации можно удалять файлы, которых нет на машине откуда идет rsync синхронизация, для этого используется опция --delete.
Например:
`rsync -avz --delete root@192.168.56.102:/documents/ /tmp/documents/`
Если перед выполнением этой команды создать в папке файл которого нет на удаленном сервере, то он будет удален.
**Максимальный размер файлов**
Вы можете указать максимальный размер файлов, которые нужно синхронизировать. Для этого используется опция --max-size. Например, будем синхронизировать только файлы меньше 200 килобайт:
`rsync -avzhe ssh --max-size='200k' /user/documents/`
`root@192.168.56.102:/root/documents`
**Удаление исходных файлов**
Есть возможность удалять исходные файлы после завершения синхронизации с удаленным сервером:
`rsync --remove-source-files -zvh backup.tar /tmp/backups/`
Таким образом, файл backup.tar будет удален после завершения копирования в папку /tmp/backups.
**Режим симуляции rsync**
Если вы новичок, и еще не использовали rsync, то возможно захотите посмотреть как отработает команда без применения реальных действий в файловой системе. Для этого есть опция dry-run. Команда только выведет все выполняемые действия в терминал, без выполнения реальных изменений:
`rsync --dry-run --remove-source-files -zvh backup.tar /tmp/backups/`
**Ограничить скорость передачи**
Вы можете ограничить использование пропускной способности сети с помощью опции ==`--bwlimit`==:
`rsync --bwlimit=100 -avzhe ssh /user/home/documents/ root@192.168.56.102:/root/documents/`
Как я уже писал выше, rsync синхронизирует только части файла, если вы хотите синхронизировать файл целиком используйте опцию ==-W==:
`rsync -zvhW backup.tar /tmp/backups/backup.tar backup.tar`
**Автоматическая синхронизация папок rsync**
Можно расписать автоматическую синхронизацию с помощью cron. Но в случае доступа к серверу по SSH необходимо будет создать ключ и загрузить его на сервер, чтобы аутентификация проходила без запроса пароля.
Создаем ключ:
`ssh-keygen -t rsa`
Загружаем ключ на сервер к с которым собираемся синхронизироваться:
`ssh-copy-id -i /home/sk/.ssh/id_rsa.pub sk@192.168.1.250`
Теперь можем переходить к настройке расписания cron. Будем запускать синхронизацию каждый день:
`crontab -e`
`00 05 * * * rsync -azvre ssh /home/user/Downloads/ 192.168.56.102:/share`
rsync синхронизация каталогов будет выполняться каждый день в пять утра.
`@hourly rsync -avzhe ssh vlapa@178.20.46.157:/home/vlapa/git/ /home/vlapa/1Tb_r1-a/Backup/_git/`
rsync синхронизация каталогов будет выполняться каждый час.
==============================
**Автоматическая синхронизация файлов с удалённым сервером**
```bash
#!/bin/bash
# Локальная директория для синхронизации
LOCAL_DIR="/path/to/local/dir"
# Удалённый сервер и директория
REMOTE_USER="user"
REMOTE_SERVER="server.com"
REMOTE_DIR="/path/to/remote/dir"
# Синхронизация с удалённым сервером
rsync -avz $LOCAL_DIR $REMOTE_USER@$REMOTE_SERVER:$REMOTE_DIR
# Вывод сообщения о завершении
echo "Синхронизация завершена!"
```
✔️ **Скрипт синхронизирует файлы из локальной директории на удалённый сервер с помощью** rsync**.**
=======================================
# Утилита rcync: синхронизация директорий и backup-ы
15.12.2019
Теги: [CLI](https://tokmakov.msk.ru/blog/tags/15) • [Linux](https://tokmakov.msk.ru/blog/tags/1) • [Директория](https://tokmakov.msk.ru/blog/tags/37) • [Команда](https://tokmakov.msk.ru/blog/tags/2) • [Конфигурация](https://tokmakov.msk.ru/blog/tags/11) • [Настройка](https://tokmakov.msk.ru/blog/tags/266) • [Сервер](https://tokmakov.msk.ru/blog/tags/301) • [Файл](https://tokmakov.msk.ru/blog/tags/35)
Утилита rsync — это программное обеспечение с открытым исходным кодом, которое можно использовать для синхронизации файлов и директорий с локального компьютера на удаленный и наоборот. Примечательная особенность rsync — возможность передавать файлы с шифрованием, используя ssh в качестве транспорта.
Синтаксис команды
$ rsync опции источник приемникКопировать
## Примеры использования
Перед тем, как копировать файлы, всегда стоит сделать пробный прогон (ключ `-n`) в режиме с показом подробностей (`-v`):
`rsync -avn /path/to/src/ user@example.com:/path/to/dstКопировать
В этом режиме `rsync` покажет список файлов, которые он скопирует. После этого можно запускать настоящее копирование:
`rsync -av /path/to/src/ user@example.com:/path/to/dstКопировать
В этой команде ключ `-a` подразумевает рекурсивное копирование всех файлов и каталогов включая их атрибуты: владелец, группа, дата создания и изменения. Ключ `-v` даст подробный отчет о работе по мере выполнения и по окончании.
Обратите внимание на слэш в конце первого аргумента — без него файлы источника `/path/to/src/файлы` будут размещены в `/path/to/dst/src/файлы`. А при наличии слэша в конце первого аргумента — файлы будут в `/path/to/dst/файлы`, что скорее всего и нужно.
По умолчанию `rsync` попытается использовать транспорт ssh. При использовании другого порта для ssh, его нужно указать:
`rsync -av -e "ssh -p 2222" /path/to/src/ user@example.com:/path/to/dstКопировать
Точно также можно скопировать файлы из удаленного сервера на локальную машину:
`rsync -av user@example.com:/remote/machine/path/ /local/machine/pathКопировать
Обратите внимание, что источник всегда является первым аргументом, а приемник — вторым.
Для автоматического копирования, например по `cron`, необходимо настроить авторизацию с использованием ключей.
## Основные опции
**Опция** `-a` или `--archive` — рекурсивно копирует файлы, включая разыменованные символьные ссылки, с сохранением связанных с файлами сведений об их владельцах, групповых и индивидуальных правах и времени последнего изменения. Использование этого ключа равносильно указанию ключей `--group`, `--links`, `--owner`, `--perms`, `--recursive` и `--times`.
**Опция** `-b` или `--backup` — переименовывает файлы, которые в противном случае должны быть удалены или перезаписаны, добавляя к их существующим именам знак тильды (~). Эта опция обычно используется вместе с `--backup-dir` — вместо переименования `rsync` перемещает эти файлы в указанный каталог.
**Опция** `--backup-dir=dir` — используется вместе с `--backup` и перемещает в директорию `dir` те файлы, которые в противном случае должны быть удалены или перезаписаны. После перемещения старой версии файла в каталог `dir` новая версия из источника копируется в приемник.
Если `dir` указан с использованием относительного пути, то это путь относительно приемника.
**Опция** `--copy-unsafe-links` — для каждого файла, являющегося символьной ссылкой на файл за пределами той иерархии, которой принадлежит источник, производится копирование файла, на который указывает ссылка, а не символьной ссылки на него.
**Опция** `--delete` заставляет `rsync` удалять файлы в приемнике, которые отсутствуют в источнике.
**Опция** `-n` или `--dry-run` — запуск утилиты без записи на диск. С опцией `--verbose` позволяет посмотреть, что будет сделано, если запустить rsync без `--dry-run`. Особенно полезно запускать перед использованием `--delete`.
**Опция** `-g` или `--group` — сохранение групповых связей копируемых файлов.
**Опция** `-l` или `--links` — для каждого файла, являющегося символьной ссылкой, копирование символьной ссылки, а не файла, на который указывает ссылка, даже если файл, на который указывает ссылка, не присутствует в источнике.
**Опция** `--link-dest=dir` — если файл существует в источнике, но его нет в приемнике, rsync ищет в каталоге `dir` файл с точно таким же именем. Если точная копия файла будет найдена, rsync создает из файла в `dir` жесткую ссылку на него в приемнике. Если точная копия не будет найдена, rsync копирует файл в приемник.
**Опция** `-o` или `--owner` — сохранение данных о владельце копируемых файлов (только для пользователей с root-правами).
**Опция** `-p` или `--perms` — сохранение данных о правах доступа копируемых файлов.
**Опция** `-r` или `--recursive` — рекурсивный спуск по каталогу-источнику и копирование всех файлов в иерархии.
**Опция** `-t` или `--times` — сохранение данных о времени последнего изменения копируемых файлов.
**Опция** `-u` или `--update` — пропускать файл, если в приемнике оказался файл новее, чем в источнике.
**Опция** `-v` или `--verbose` — вывод информации о том, что в данный момент делает rsync.
**Опция** `-z` или `--compress` — сжатие файлов в процессе копирования.
## Зеркальное копирование
Утилиту rsync можно использовать для создания зеркальной копии каталога. На удаленной системе должен быть установлен ssh-сервер (к нему можно подключиться с использованием утилиты ssh). Если нужно запускать копирование по расписанию, следует настроить авторизацию с использованием ключей.
`rsync --archive --update --delete /path/to/mirror/ user@example.com:/path/to/mirrorКопировать
Опция `--update` заставляет rsync не перезаписывать самые последние версии файлов на удаленной системе более старыми версиями таких же файлов, взятых из локальной системы. Опция `--delete` заставляет rsync удалять на удаленном сервере файлы, отсутствующие на локальной системе.
## Резервное копирование
После проведения исходного резервного копирования rsync может эффективно осуществлять дополнительное резервное копирование, экономя место на диске и время копирования. При дополнительном (инкрементном) копировании сохраняются только те файлы, которые претерпели изменения со времени последнего резервного копирования.
С помощью опции `--link-dest=dir` можно превращать каждое дополняющее резервное копирование в полноценное, путем создания жестких ссылок между дополняющими резервными копиями и неизменившимися файлами, имеющимися в исходной полноценной резервной копии.
Если `dir` задается как отосительный путь, то он задается относительно файла-приемника.
`rsync --archive --link-dest=../backup /path/to/src/ user@example.com:/path/to/dstКопировать
При запуске этой команды rsync проходит сверху вниз по содержимому каталога `/path/to/src`, проверяя каждый найденный файл. Для каждого файла в каталоге `/path/to/src` утилита ищет в каталоге `/path/to/dst` точную копию этого файла.
- Если она находит точную копию в каталоге `/path/to/dst` — переходит к следующему файлу
- Если она не находит точную копию в каталоге `/path/to/dst` — ищет точную копию в каталоге `backup`
- Если она находит точную копию файла в каталоге `backup`, утилита создает жесткую ссылку из файла в каталоге `backup` на файл в каталоге `/path/to/dst`
- Если она не находит точную копию файла в каталоге `backup`, утилита копирует файл из каталога `/path/to/src` в каталог `/path/to/dst`
Небольшой bash-скрипт, демонстрирующий создание полноценной и дополняющей резервной копии:
```bash
#!/bin/bash
rm -rf backup-two-days-ago
mv backup-one-day-ago backup-two-days-ago
mv backup-latest-state backup-one-day-ago
rsync --archive --link-dest=../backup-one-day-ago /some/path/data/ backup-latest-state
```
Можно немного доработать этот скрипт, чтобы хранить не три, а тридцать резервных копий:
```bash
#!/bin/bash
SOURCE='/home/evgeniy/data'
BACKUP='/home/evgeniy/backup'
COUNT=30 # кол-во бэкапов
rm -rf ${BACKUP}/backup-${COUNT}
for (( i = COUNT; i > 1; i-- )); do
mv ${BACKUP}/backup-$((i - 1)) ${BACKUP}/backup-${i}
done
rsync --archive --link-dest=../backup-2 ${SOURCE}/ ${BACKUP}/backup-1
```
==========================================
Шпора по флагам rsync
![[2025-06-20_22-34-47.png]]
Rsync - программка, которую можно использовать для синхронизации файлов и каталогов с локального компьютера на удаленный и наоборот. Чем-то напоминает scp.
`rsync file1 file2 ... user@host:dest
`rsync -a dir host:dest_dir
Взаимодействием с сервером возможности утилиты не ограничиваются. Все операции можно выполнять и локально. По умолчанию rsync копирует ресурсы без учета предыдущего содержимого целевого каталога.
Например, если вы перенесли каталог d, содержащий файлы a и b, на машину, на которой был файл d/c, то после копирования сервер будет содержать d/a, d/b и d/c.
Чтобы создать точную копию исходного каталога, необходимо из целевого каталога удалить не существующие в исходном каталоге файлы, например d/c в примере:
`rsync -a --delete dir host:dest_dir
Посмотрим на еще 1 пример:
`rsync -avh --del --progress dir1 dir2 dir3 backup
В результате выполнения, каталоги "dir1, dir2 и dir3", вместе со всем их содержимым, будут рекурсивно скопированы в каталог backup.
Если какие-то файлы уже есть в каталоге backup, и не были изменены, они будут пропущены.
Исключение файлов и каталогов
Еще одной значительной фичей rsync является способность исключать файлы и каталоги из процесса передачи.
Например, ты хочешь перенести локальный каталог src на хост и при этом исключить все данные с именем .git. Можно сделать следующим образом:
`rsync -a --exclude=.git src host:
|