Резервное копирование с rsync в Linux

Резервное копирование с rsync в Linux

Rsync — это протокол построен для Unix-подобных систем, что обеспечивает невероятную гибкость для резервного копирования и синхронизации данных. Он может быть использован локально для резервного копирования файлов в разных каталогах или может быть сконфигурирован для синхронизации через интернет к другим хостам.

Он может быть использован в системах Windows, но доступен только через различные порты (например, Cygwin), так что в этом как-бы мы будет говорить о его установке на Linux. В данной теме «Резервное копирование с rsync в Linux» поговорим как можно легко установить и пользоваться Rsync на Debian/Ubuntu/Linux Mint а так же на RedHat/CentOS/Fedora.

Если Вы используете RedHat/CentOS/Fedora:

# sudo yum -y install rsync

Если Вы используете Debian/Ubuntu/Linux Mint:

# sudo apt-get install rsync

Опции в rsync.

Некоторые общие опции используемые в Rsync:

-v: подробный вывод;
-r: копирует данные рекурсивно (но не сохраняют временные метки и разрешение при передаче данных);
-a: archive mode, позволяет копировании файлов рекурсивно, и это также сохраняет символические ссылки, права доступа к файлам, пользовательские и групповые пермишены и метки;
-z: сжимать данные файлов;
-h: выходит  цифры в формате нормальном для чтения.

Предоставлю весь список опций.

-v, —verbose
increase verbosity

 -q, —quiet
suppress non-error messages

—no-motd
suppress daemon-mode MOTD (see caveat)

-c, —checksum
skip based on checksum, not mod-time & size

-a, —archive
archive mode; equals -rlptgoD (no -H,-A,-X)

—no-OPTION
turn off an implied OPTION (e.g. —no-D)

-r, —recursive
recurse into directories

-R, —relative
use relative path names

—no-implied-dirs
don’t send implied dirs with —relative

-b, —backup
make backups (see —suffix & —backup-dir)

—backup-dir=DIR
make backups into hierarchy based in DIR

—suffix=SUFFIX
backup suffix (default ~ w/o —backup-dir)

-u, —update
skip files that are newer on the receiver

—inplace
update destination files in-place

—append
append data onto shorter files

—append-verify
—append w/old data in file checksum

-d, —dirs
transfer directories without recursing

-l, —links
copy symlinks as symlinks

-L, —copy-links
transform symlink into referent file/dir

—copy-unsafe-links
only «unsafe» symlinks are transformed

—safe-links
ignore symlinks that point outside the tree

-k, —copy-dirlinks
transform symlink to dir into referent dir

-K, —keep-dirlinks
treat symlinked dir on receiver as dir

-H, —hard-links
preserve hard links

-p, —perms
preserve permissions

-E, —executability
preserve executability

—chmod=CHMOD
affect file and/or directory permissions

-A, —acls
preserve ACLs (implies -p)

-X, —xattrs
preserve extended attributes

-o, —owner
preserve owner (super-user only)

-g, —group
preserve group

—devices
preserve device files (super-user only)

—specials
preserve special files

-D
same as —devices —specials

-t, —times
preserve modification times

-O, —omit-dir-times
omit directories from —times

—super
receiver attempts super-user activities

—fake-super
store/recover privileged attrs using xattrs

-S, —sparse
handle sparse files efficiently

-n, —dry-run
perform a trial run with no changes made

-W, —whole-file
copy files whole (w/o delta-xfer algorithm)

-x, —one-file-system
don’t cross filesystem boundaries

-B, —block-size=SIZE
force a fixed checksum block-size

-e, —rsh=COMMAND
specify the remote shell to use

—rsync-path=PROGRAM
specify the rsync to run on remote machine

—existing
skip creating new files on receiver

—ignore-existing
skip updating files that exist on receiver

—remove-source-files
sender removes synchronized files (non-dir)

—del
an alias for —delete-during

—delete
delete extraneous files from dest dirs

—delete-before
receiver deletes before transfer, not during

—delete-during
receiver deletes during the transfer

—delete-delay
find deletions during, delete after

—delete-after
receiver deletes after transfer, not during

—delete-excluded
also delete excluded files from dest dirs

—ignore-errors
delete even if there are I/O errors

—force
force deletion of dirs even if not empty

—max-delete=NUM
don’t delete more than NUM files

—max-size=SIZE
don’t transfer any file larger than SIZE

—min-size=SIZE
don’t transfer any file smaller than SIZE

—partial
keep partially transferred files

—partial-dir=DIR
put a partially transferred file into DIR

—delay-updates
put all updated files into place at end

-m, —prune-empty-dirs
prune empty directory chains from file-list

—numeric-ids
don’t map uid/gid values by user/group name

—timeout=SECONDS
set I/O timeout in seconds

—contimeout=SECONDS
set daemon connection timeout in seconds

-I, —ignore-times
don’t skip files that match size and time

—size-only
skip files that match in size

—modify-window=NUM
compare mod-times with reduced accuracy

-T, —temp-dir=DIR
create temporary files in directory DIR

-y, —fuzzy
find similar file for basis if no dest file

—compare-dest=DIR
also compare received files relative to DIR

—copy-dest=DIR
… and include copies of unchanged files

—link-dest=DIR
hardlink to files in DIR when unchanged

-z, —compress
compress file data during the transfer

—compress-level=NUM
explicitly set compression level

—skip-compress=LIST
skip compressing files with suffix in LIST

-C, —cvs-exclude
auto-ignore files in the same way CVS does

-f, —filter=RULE
add a file-filtering RULE

-F
same as —filter=’dir-merge /.rsync-filter’

repeated: —filter=’- .rsync-filter’

—exclude=PATTERN
exclude files matching PATTERN

—exclude-from=FILE
read exclude patterns from FILE

—include=PATTERN
don’t exclude files matching PATTERN

—include-from=FILE
read include patterns from FILE

—files-from=FILE
read list of source-file names from FILE

-0, —from0
all *from/filter files are delimited by 0s

-s, —protect-args
no space-splitting; wildcard chars only

—address=ADDRESS
bind address for outgoing socket to daemon

—port=PORT
specify double-colon alternate port number

—sockopts=OPTIONS
specify custom TCP options

—blocking-io
use blocking I/O for the remote shell

—stats
give some file-transfer stats

-8, —8-bit-output
leave high-bit chars unescaped in output

-h, —human-readable
output numbers in a human-readable format

—progress
show progress during transfer

-P
same as —partial —progress

-i, —itemize-changes
output a change-summary for all updates

—out-format=FORMAT
output updates using the specified FORMAT

—log-file=FILE
log what we’re doing to the specified FILE

—log-file-format=FMT
log updates using the specified FMT

—password-file=FILE
read daemon-access password from FILE

—list-only
list the files instead of copying them

—bwlimit=KBPS
limit I/O bandwidth; KBytes per second

—write-batch=FILE
write a batched update to FILE

—only-write-batch=FILE
like —write-batch but w/o updating dest

—read-batch=FILE
read a batched update from FILE

—protocol=NUM
force an older protocol version to be used

—iconv=CONVERT_SPEC
request charset conversion of filenames

—checksum-seed=NUM
set block/file checksum seed (advanced)

-4, —ipv4
prefer IPv4

-6, —ipv6
prefer IPv6

—version
print version number

-h, —help
show help

rsync can also be run as a daemon, in which case the following options are accepted:

—daemon
run as an rsync daemon

—address=ADDRESS
bind to the specified address

—bwlimit=KBPS
limit I/O bandwidth; KBytes per second

—config=FILE
specify alternate rsyncd.conf file

—no-detach
do not detach from the parent

—port=PORT
listen on alternate port number

—log-file=FILE
override the «log file» setting

—log-file-format=FMT
override the «log format» setting

—sockopts=OPTIONS
specify custom TCP options

-v, —verbose
increase verbosity

-4, —ipv4
prefer IPv4

-6, —ipv6
prefer IPv6

-h, —help
show this help (if used after —daemon)

 

Синтаксис

Локальное использование:

# rsync [OPTION...] SRC... [DEST]

Доступ через удаленные оболочки (PULL):

# rsync [OPTION...] [USER@]HOST:SRC... [DEST]

Доступ черезудаленные оболочки (PUSH):

# rsync [OPTION...] SRC... [USER@]HOST:DEST

Доступ через демона Rsync (PULL):

# rsync [OPTION...] [USER@]HOST::SRC... [DEST]
# rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

Доступ через демона Rsync (PUSH):

rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

Используйте только один аргумент с SRC и не аргумент DEST будет перечислять исходные файлы вместо копирования.

Примеры использования Rsync

1. Локальное копирование между папками

— Например вы хотите скопировать данные между 2-мя папками на локальном компьютере, а сделать можно  это так. В первой части этого урока, мы будет создавать резервные копии файлов с your_dir_1 чтобы your_dir_2. Оба из этих каталогов находятся на одном жестком диске, но это будет работать точно так же, если каталоги существовали на двух разных дисках.

# rsync -av --delete /your_dir_1/ /your_dir_2/

Эта команда будет синхронизировать содержимое your_dir_1 в your_dir_2 при любых изменениях.Если Rsync находит файл, который был изменен, создан или удален в your_dir_1 , он будет отражать те же изменения в your_dir_2.

Есть много различных переключателей, которые можно использовать для Rsync, чтобы персонализировать ее к конкретным потребностям. Вот некоторые ключи Rsync чтобы сделать  резервные копии:

-a = Рекурсивно выполняя со всеми теми свойствами которые вы создавали данные файлы (рекурсивно в каталогах), ссылки (копия символических ссылок как символические ссылки), perms  (сохранить разрешения), время (сохранить время модификации), группа (сохраняет группу), владелец (сохранить владельца), сохранить файлы устройств, и сохранить специальные файлы.
-V = verbose. Он будет отображать весь процесс копирования, поэтому я думаю, что важно, чтобы вы могли видеть то, что Rsyncделает когда копирует резервные копии.
—delete  = Это опция удаляет любые файлы, которые находятся в your_dir_2 и которых нет в your_dir_1.

# rsync -av --delete /home/captain/dir1_for_test /home/captain/dir2_for_test

— Это следующая команда будет синхронизировать один файл на локальной машине из одного места в другое место. В этом примере, имя файла my_backup.tar нужно скопировать или синхронизировать с папкой /tmp/my_backups/my_folder:

# rsync -zvhmy_backup.tar /tmp/my_backups/

2. Копировать / Синхронизировать каталог на локальном компьютере

Следующая команда будет передавать или синхронизировать все файлы из одной директории в другую директорию, в той же машине. Здесь, в этом примере,  /root/my_rpmpkgs содержит некоторые файлы пакетов и вы хотите выполнить копирования в /tmp/my_backups/

# rsync -avzh /root/my_rpmpkgs /tmp/my_backups/

3. Использование Rsync для внешних резервных копий

— Копировать/ Синхронизировать удаленный каталог на локальном компьютере

Эта команда поможет вам синхронизировать удаленный каталог на локальный ПК. Здесь, в этом примере, каталог  /home/captain/my_rpmpkgs который находится на удаленном сервере копируется в вашем локальном компьютере в  /tmp/my_myrpmss:

# rsync -avzh captain@14.18.10.70:/home/captain/my_rpmpkgs /tmp/my_myrpms

—  Скопировать каталог из локального сервера на удаленный сервер

Эта команда будет синхронизировать каталог из локальной машины на удаленной машине. Например: Существует папку в локальных компьютерных «my_rpmpkgs», который содержит некоторые пакеты RPM и вы хотите передать содержание локального каталога (отправить) на удаленный сервер, вы можете использовать следующие команды:

# rsync -avz my_rpmpkgs/ root@12.18.40.11:/home/captain

Автоматическое  резервное копирование сRSYNC.

Чтобы выполнялось синхронизация ваших данных  автоматически в заданное время (чтобы не нагружать сервер), можно использовать Cron. Для редактирования файла крона для пользователя из еоторого вы вошли в систему, выполните команду:

# crontab -e

Следующая команда запустит команду Rsync каждый день в 10 вечера:

0 22 * * * rsync -av –delete -e 'ssh -p 2222' /home/captain/dir1_for_test captain@148.251.233.175:/your_dir_2/

Можно написать небольшой скрипт и засунуть его тоже в крон на выполнение:

# vim script_for_cron.sh
#!/bin/sh

RSYNC=/usr/bin/rsync 
SSH=/usr/bin/ssh 
KEY=/home/thisuser/cron/thishost-rsync-key 
RUSER=remoteuser 
RHOST=remotehost 
RPATH=/remote/dir 
LPATH=/this/dir/

$RSYNC -az -e "$SSH -i $KEY" $RUSER@$RHOST:$RPATH $LPATH

И после чего уже вставить данный скрипт в крон на выполнение.

4. Rsync через SSH

С Rsync, мы можем использовать SSH (Secure Shell) для передачи данных, используя протокол SSH при передаче наших данных вы можете быть обеспечены, что ваши данные передаются через защищенное соединение с шифрованием, так что никто не может считать ваши данные.

Кроме того, когда мы используем Rsync мы должны предоставить пользователю его пароля, чтобы выполнить эту конкретную задачу, так что использование опции SSH отправим наши логины в зашифрованном виде, так что ваши пароли будут в безопасности.

Копирование файла с локального на удаленный сервер с SSH

Rsync может быть сконфигурирован по-разному для внешних резервных копий, но мы будем использовать способ наиболее практичный -это туннельный Rsync через SSH. Большинство серверов и даже на многих клиентских компьютерах или серверах уже есть SSH, и он может быть использован для ваших резервных копий с помощью RSYNC . Я покажу вам процесс, как можно скопировать все данные папки your_dir_1 в your_dir_1  по локальной сети или интернет. Работает это таким образом на локальном компьютере мы выполним данную команду для того чтобы все данные скопировалися на сервер ( убедитесь что на сервере стоит уже SSH):

# rsync -av –delete -e ssh /your_dir_1/ your_remove_user@your_remove_IP:/your_dir_2/

У меня это выглядит вот так:

# rsync -av –delete -e ssh /home/captain/dir1_for_test captain@148.251.233.175:/your_dir_2/

Если вы используете другой SSH порт ( стандартный 22-й), то можно указать любой другой передавая параметр, а выглядит это вот так:

# rsync -av –delete -e 'ssh -p 2222' /home/captain/dir1_for_test captain@148.251.233.175:/your_dir_2/

Можно добавить опцию «-i» если вам нужно использовать RSA ключ на сервере:

# rsync -av –delete -e 'ssh -i /home/captain/RSA_ssh_keys/test_ssh_key' /home/captain/dir1_for_test captain@148.251.233.175:/your_dir_2/

PS: Только не забудьте его сгенерировать.

— Копирование файла с удаленного сервера на локальный сервер с SSH

Чтобы указать протокол использования в Rsync вам нужно задать «-e» опцию с названием протокола который вы хотите использовать. Здесь, в этом примере, мы будем использовать «SSH» с опцией «-e» и выполнить передачу данных:

# rsync -avzhe ssh root@19.16.60.79:/home/captain/some_install.log /tmp/

5. Показать прогресс при передаче данных с Rsync

Чтобы показать прогресс во время передачи данных с одной машины на другую, мы можем использовать «—progress» для него. Он отображает файлы и время, оставшееся до завершения передачи:

# rsync -avzhe ssh --progress /home/captain/my_rpmpkgs root@44.66.66.66:/root/my_rpmpkgs

6. Использование опций «—Include» и «—exclude»

Эти два варианта позволяет включать и исключать файлы, указав параметры с этими опциями — помогает нам указать те файлы или каталоги, которые мы хотим включить в синхронизации и исключить файлы и папки.

Здесь, в этом примере, команда Rsync будет включать в себя те файлы и директории, которые начинается только с ‘R’ и исключить все другие файлы и директории:

# rsync -avze ssh --include 'R*' --exclude '*' root@66.66.66.66:/var/lib/my_rpm/ /root/my_rpm

7. использовании опции  «—delete»

Если файл или каталог не существует в источнике, но уже существует в месте назначения, вы, возможно захотите удалить уже существующий файл / каталог во время синхронизации.

Мы можем использовать опцию «—delete» чтобы удалить файлы, которые не существуют в исходном каталоге. Источник и цель находятся в синхронизации:

# touch test_file.txt
# rsync -avz --delete root@66.66.66.66:/var/lib/my_rpm/ .

8. Установка максимального размера для файлов для передачи

Вы можете указать максимальный размер файла, который будет передан на синхронизацию. Вы можете сделать это с опцией «—max-size». Здесь, в этом примере, максимальный размер файла составляет 200k, так эта команда будет передавать только те файлы, которые равны или меньше, чем 200k:

# rsync -avzhe ssh --max-size='200k' /var/lib/my_rpm/ root@66.66.66.66:/root/tmp_rpm

9. Автоматически удалить исходные файлы после успешной передачи

Теперь предположим, что у вас есть основной веб-сервер и сервер резервного копирования данных, вы создали ежедневное резервное копирование и он синхронизируется с сервером резервного копирования, теперь вы не хотите сохранять эту локальную копию резервной копии в вашем веб-сервере. Следующая команда автоматически удалит фсе переданные файлы с сервера-передатчика, а делается это с опцией  «—remove-source-files»:

# rsync --remove-source-files -zvh my_backup.tar /tmp/my_backups/

10. Выполнять «Dry Run» с rsync

Если вы новичок и  вы не знаете то и как работает в Rsync, то Rsync может действительно испортить файлы\папки в вашей папке, а затем выполнять отмены может быть утомительной работой.

# rsync --dry-run --remove-source-files -zvh my_backup.tar /tmp/my_backups/

Использование этой опции не будет делать каких изменений, только  выполнит прогон команды и покажет вывод команды, если вывод показывает точно такие же данные которые вы ожидали, то вы можете удалить опцию «—dry-run» из вашей команды и выполнить заново на терминале.

11. Установка «Bandwidth Limit» для передачи файлов

Вы можете установить предел пропускной способности при передаче данных от одной машины к другой машине с помощью опции «—bwlimit». Эта опция помогает нам ограничить пропускную способность ввода / вывода (I/O):

# rsync --bwlimit=100 -avzhe ssh /var/lib/rpm/ root@192.168.0.100:/root/tmprpm/

Кроме того, по умолчанию Rsync синхронизирует измененные блоки и байты, только если вы явно хотите синхронизировать весь файл, то вы используете опцию ‘-w’ с ним.

# rsync -zvhW my_backup.tar /tmp/my_backups/my_backup.tar

Тема «Резервное копирование с rsync в Linux» завершена. Спасибо что читаете http://linux-notes.org

3 thoughts on “Резервное копирование с rsync в Linux

  1. Не работает ваш скрипт.
    root@DM001S002:/media/bak# rsync -av –delete -e ‘ssh -p 22′ /media/bak/exchange root@10.200.2.202:/media/bak/exchange
    rsync: Failed to exec \#342\#200\#230ssh: No such file or directory (2)
    rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.9]
    rsync: connection unexpectedly closed (0 bytes received so far) [sender]
    rsync error: error in IPC code (code 14) at io.c(605) [sender=3.0.9]
    root@DM001S002:/media/bak#

    • Значит что-то делаете не так. Попозже я еще раз все проверю и напишу ответ. Возможно, где то допустил я ошибку, постараюсь все исправить.

  2. rsync -av –delete -e ‘ssh -p 22′ /media/bak/exchange root@10.200.2.202 /media/bak/exchange
    В таком виде скрипт копирует все /media/bak/exchange/exchange
    соответственно запустив несколько раз получим
    /media/bak/exchange/exchange /exchange
    /media/bak/exchange/exchange /exchange /exchange
    /media/bak/exchange/exchange /exchange /exchange /exchange
    /media/bak/exchange/exchange /exchange /exchange /exchange /exchange

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.