Как сделать резервную копию больших каталогов с помощью Unison в Ubuntu 16.04

Автор выбралFree and Open Source Fund для получения пожертвования в рамках программыWrite for DOnations.

Вступление

Unison - это инструмент для синхронизации файлов с открытым исходным кодом. Он очень эффективен при резервном копировании больших массивов данных, в которых было добавлено или обновлено всего несколько файлов. Такая ситуация возникает, например, на корпоративном файловом сервереSamba или на почтовом сервере.

Большинство файлов на этих серверах останутся прежними, в то время как небольшое количество будет добавляться или изменяться каждый день. Unison может обнаруживать и создавать резервные копии этих новых файлов очень быстро, даже когда существуют миллионы файлов и терабайт данных. В таких ситуациях традиционным инструментам, таким какrsync, может потребоваться больше времени для выполнения той же операции резервного копирования.

В этом руководстве вы будете устанавливать и настраивать Unison на паре серверов и использовать его для резервного копирования каталога. Вы также сконфигурируете Unison для использования SSH в качестве безопасного протокола связи и создадитеcron job для периодического запуска Unison.

Предпосылки

Прежде чем начать это руководство, вам потребуется следующее:

В этом руководстве будут использоваться два сервера:

  • Серверprimary: сервер, на котором размещены данные, для которых вы будете создавать резервную копию.

  • Серверbackup: сервер, на котором будут размещаться резервные копии данных.

[[step-1 -—- Creating-additional-non-root-users]] == Шаг 1. Создание дополнительных пользователей без полномочий root

УчебникInitial Server Setup with Ubuntu 16.04 провел вас через создание пользователя sudo без полномочий root с именемsammy на сервереprimary иbackup. На этом шаге вы создадите двух новых пользователей: одного на сервереprimary и одного на сервереbackup. Это предотвращает путаницу при работе с руководством, и на сервереbackup требуется альтернативный пользователь sudo без полномочий root, если конфигурация безопасности SSH включена в конце руководства.

Вам нужно будет войти как на серверprimary, так и на серверbackup как пользовательsammy через SSH в двух окнах терминала. Следующие две команды SSH зарегистрируют вас на этих серверах:

ssh sammy@primary_server_ip
ssh sammy@backup_server_ip

Сначала на сервереprimary создайте нового пользователя с именемprimary_user с помощью этой команды:

sudo adduser primary_user

Затем дайте им права доступаsudo:

sudo usermod -aG sudo primary_user

Наконец, перейдите на учетную записьprimary_user:

su - primary_user

Затем выполните те же действия на сервереbackup, но создайте нового пользователя с именемbackup_user. Убедитесь, что вы вошли на серверыprimary иbackup как эти пользователи до конца руководства.

Теперь, когда вы создали необходимых пользователей на обоих серверах, вы можете перейти к установке программного обеспечения Unison.

[[step-2 -—- install-unison-on-both-servers]] == Шаг 2 - Установка Unison на оба сервера

На этом этапе вы установите пакет Unison на обоих серверах.

Вы будете использовать менеджер пакетов Ubuntuapt для установки Unison на обоих серверах. При использованииapt впервые за некоторое время вам следует обновить локальный индекс пакета с помощью следующей команды:

sudo apt-get update

Это гарантирует, что вы установите последнюю версию Unison. Это также поможет избежать ошибок при установке.

Далее установите Unison:

sudo apt-get install unison

Вы завершили установку Unison. На следующем шаге вы настроите SSH, чтобы Unison мог обмениваться данными между двумя серверами.

[[step-3 -—- created-ssh-keys-and-configuring-ssh]] == Шаг 3. Создание ключей SSH и настройка SSH

Первое, что вам нужно сделать, это создать пару ключей SSH на сервереprimary, поскольку вы будете использовать аутентификацию на основе ключей для SSH-соединения. Преимущество аутентификации на основе ключей заключается в том, что безопасное соединение возможно без ввода пароля. Это важно, потому что вы создадите автоматизированную процедуру резервного копирования, которая должна выполняться без ввода пароля каждый раз, когда это происходит.

Когда у вас есть эта пара ключей на сервереprimary, вы скопируете открытый ключ на серверbackup, а затем протестируете, может ли Unison обмениваться данными между серверами с помощью SSH.

Когда вы создаете пару ключей SSH, вы обычно используете надежный пароль. Однако Unison будет работать автоматически, поэтому пароль нельзя вводить вручную при каждом запуске. Нажмите клавишуENTER, не вводя пароль. Это создаст пару паролей SSH без пароля.

Выполните следующую команду из домашнего каталогаprimary_user на сервереprimary, чтобы сгенерировать пару ключей SSH:

ssh-keygen -t rsa -b 4096 -f .ssh/unison-primary

Используемые здесь параметры означают следующее:

  • -t rsa: устанавливает тип создаваемого ключа. Ключи RSA являются наиболее совместимым типом.

  • -b 4096: устанавливает длину ключа. Чем длиннее ключ, тем он надежнее. Длина ключа4096 - это текущая рекомендуемая длина ключа для ключей RSA.

  • -f .ssh/unison-primary: устанавливает имя ключа и место, где он будет сохранен. В этом случае вы сохраните ключ в каталоге SSH по умолчанию,.ssh, используя имя по вашему выбору.

Показанная выше команда создает открытые и закрытые ключи SSH в следующих двух файлах:

  • .ssh/unison-primary

  • .ssh/unison-primary.pub

Первый - это закрытый ключ SSH, а второй - открытый ключ. Вам необходимо скопировать содержимое файла открытого ключа на серверbackup. Самый простой способ отобразить содержимое файла открытого ключа для копирования - использовать командуcat для вывода содержимого на терминал:

cat .ssh/unison-primary.pub

На сервереbackup в домашнем каталогеbackup_user откройте файл.ssh/authorized_keys в текстовом редакторе. Здесь вы будете использоватьnano:

nano .ssh/authorized_keys

Вставьте открытый ключ в редактор, затем сохраните и выйдите.

Теперь вы можете проверить, что конфигурация SSH работает, войдя вbackup с сервераprimary через SSH. Это важно, потому что вам нужно будет принять и сохранить отпечаток ключа SSH-сервера для сервераbackup, иначе Unison не будет работать. В вашем терминале на сервереprimary выполните следующую команду из домашнего каталогаprimary_user:

ssh -i .ssh/unison-primary backup_user@backup_server_ip

Параметр-i .ssh/unison-primary указывает SSH использовать определенный ключ или файл идентификации. Здесь вы будете использовать созданный вами новый ключunison-primary.

Примите отпечаток пальца, нажавY, а затемENTER, и войдите в систему и выйдите из нее. Вам просто нужно было подтвердить, что SSH работает между серверами, и сохранить отпечаток SSH сервераbackup. Отпечаток пальца может быть сохранен только вручную, поэтому это необходимо сделать до того, как процесс будет автоматизирован позже в руководстве.

Затем убедитесь, что Unison подключится, выполнив следующую команду из домашнего каталогаprimary_user на сервереprimary:

ssh -i .ssh/unison-primary [email protected] unison -version

В этой команде вы использовали ту же команду SSH, которую использовали для проверки соединения, добавив в конце команду Unison. Когда команда помещается в конце соединения SSH, SSH войдет в систему, выполнит команду и затем выйдет. Командаunison -version указывает Unison напечатать номер своей версии.

Если все работает, вы увидите ответ, показывающий версию Unison на сервереbackup:

Outputunison version 2.48.3

Теперь, когда вы подтвердили, что Unison может связываться между серверами с помощью ключей SSH, вы готовы перейти к настройке Unison.

[[step-4 -—- configuring-unison]] == Шаг 4 - Настройка Unison

На этом шаге вы настроите Unison для выполнения простого одностороннего резервного копирования каталога с сервераprimary на серверbackup.

Чтобы настроить Unison, вам сначала нужно создать каталог конфигурации в домашнем каталогеprimary_user на сервереprimary:

mkdir .unison

Затем вам нужно открыть новый файл с именемdefault.prf в текстовом редакторе в каталоге.unison. Этот файл содержит конфигурацию Unison. Откройте файл с помощью следующей команды:

nano .unison/default.prf

Затем введите следующее:

default.prf

force = /home/primary_user/data
sshargs = -i /home/primary_user/.ssh/unison-primary

Эти две строки означают следующее:

  • force: это гарантирует, что изменения будут отправленыonly с сервераprimary на серверbackup. Путь/home/primary_user/data - это расположение каталога, в котором хранятся данные, для которых вы хотите создать резервную копию.

  • sshargs: эта опция указывает Unison использовать сгенерированный вами SSH-ключ.

Если каталог, содержащий данные, которые вы хотите скопировать, не находится в домашнем каталогеprimary_user, то вы должны убедиться, что он доступен для чтения и записиprimary_user. Если вы не знакомы с правами собственности и разрешениями Linux, ознакомьтесь с руководствомIntroduction to Linux Permissions, чтобы узнать больше.

Unison теперь настроен, поэтому вы можете перейти к его тестированию, создав резервную копию каталога.

[[step-5 -—- backing-up-a-directory-with-unison]] == Шаг 5 - Резервное копирование каталога с помощью Unison

Теперь вы готовы сделать резервную копию каталога, когда настроен Unison. Вы создадите резервную копию каталога/home/primary_user/data на сервереprimary в каталоге/home/backup_user/data/ на сервереbackup. Каталог, содержащий данные для резервного копированияmust, будет тем же каталогом, который вы поместили в.unison/default.prf рядом с параметромforce.

Вам понадобятся некоторые данные для резервного копирования, чтобы проверить работоспособность Unison. Создайте несколько пустых файлов на сервереprimary, а затем проверьте, передал ли их Unison на серверbackup.

Сначала создайте каталог, в котором будут храниться данные для резервного копирования, выполнив следующую команду из домашнего каталогаprimary_user:

mkdir data/

Затем используйте командуtouch, чтобы создать пять пустых файлов:

touch data/file{1..5}

Последняя часть команды,file{1..5}, использует расширение скобок Bash для создания пяти файлов. Когда bash задан{1..5}, он автоматически подставляет недостающие числа:2,3 и4. Этот метод полезен для быстрого перечисления нескольких файлов.

Теперь, когда у вас есть каталогdata и несколько тестовых файлов для резервного копирования, вы можете запустить Unison для резервного копирования файлов на серверbackup. Следующая команда сделает это:

unison -batch -auto /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data

Эти параметры означают следующее:

  • batch: беги, не задавая вопросов.

  • auto: автоматически принимать любые неконфликтующие действия.

Поскольку вы используете Unison в режиме простой односторонней синхронизации, вам не придется разрешать конфликты. Это означает, что вы можете безопасно установить эти параметры.

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

В одностороннем режиме push данные вprimary всегда сохраняются, а данные в резервной копии перезаписываются.

Эта команда напечатает длинное сообщение при первом запуске. Сообщение гласит следующее:

OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //primary_server_ip//home/backup_user/data]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
        /home/primary_user/data
        //backup_server_ip//home/backup_user/data
This can happen either
because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different
archive format.

Update detection may take a while on this run if the replicas are
large.

Unison will assume that the 'last synchronized state' of both replicas
was completely empty.  This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.

If you see this message repeatedly, it may be because one of your machines
is getting its address from DHCP, which is causing its host name to change
between synchronizations.  See the documentation for the UNISONLOCALHOSTNAME
environment variable for advice on how to correct this.

Donations to the Unison project are gratefully accepted:
http://www.cis.upenn.edu/~bcpierce/unison

  Waiting for changes from server
Reconciling changes
dir      ---->            /
Propagating updates
UNISON 2.48.3 started propagating changes at 16:30:43.70 on 03 Apr 2019
[BGN] Copying  from /home/primary_user/data to //backup_server_ip//home/backup_user/data
[END] Copying
UNISON 2.48.3 finished propagating changes at 16:30:43.71 on 03 Apr 2019
Saving synchronizer state
Synchronization complete at 16:30:43  (1 item transferred, 0 skipped, 0 failed)

Эта информация предупреждает, что это первая синхронизация. В нем также содержатся советы о том, как решить проблему, если вы видите это сообщение при каждом запуске синхронизации. В последнем разделе рассказывается, какие данные Unison синхронизируются во время этого прогона.

При каждом последующем запуске он будет печатать гораздо меньше информации. Вот вывод, когда файлы не были обновлены:

OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
Looking for changes
  Waiting for changes from server
Reconciling changes
Nothing to do: replicas have not changed since last sync.

Это результат изменения/data/file1 на сервереprimary:

OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
Looking for changes
  Waiting for changes from server
Reconciling changes
changed  ---->            file1
Propagating updates
UNISON 2.48.3 started propagating changes at 16:38:37.11 on 03 Apr 2019
[BGN] Updating file file1 from /home/primary_user/data to //backup_server_ip//home/backup_user/data
[END] Updating file file1
UNISON 2.48.3 finished propagating changes at 16:38:37.16 on 03 Apr 2019
Saving synchronizer state
Synchronization complete at 16:38:37  (1 item transferred, 0 skipped, 0 failed)

После каждого запуска синхронизации серверbackup будет иметь точную копию каталогаdata на сервереprimary.

[.warning] #Warning: Любые новые файлы или изменения в каталогеdata на сервереbackup будут потеряны при запуске Unison.
#

Теперь вы можете запустить Unison для резервного копирования каталога. На следующем шаге вы автоматизируете процесс резервного копирования, запустив Unison сcron.

[[step-6 -—- created-a-unison-cron-job]] == Шаг 6 - Создание задания Unison Cron

В этом разделе вы создадите заданиеcron, которое будет запускать Unison и выполнять резервное копирование каталогаdata на серверbackup с указанной частотой.

Crontab - это файл, который читается процессом cron. Содержащиеся в нем команды загружаются в процесс cron и выполняются с заданными интервалами.

Вы можете просмотреть содержимое crontab для вашего текущего пользователя, выполнив следующую команду:

crontab -l

Параметр-l отображает содержимое crontab текущего пользователя. Если вы не редактировали crontab ранее, вы увидите следующую информацию:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Затем запустите командуcrontab на сервереprimary с флагом-e, чтобы открыть его в режиме редактирования:

crontab -e

Если вы не имеете редактор командной строки по умолчанию настроены, вам будет предложено выбрать редактор первый раз, когда вы запустите команду. Выберите редактор по вашему выбору, чтобы открыть crontab.

Открыв crontab, добавьте следующую команду в первую пустую строку под существующим текстом:

...
* */3 * * * /usr/bin/unison -log -logfile /var/log/unison.log -auto -batch -silent /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data

Команда, которую вы будете использовать, почти такая же, как та, которую вы использовали выше при ручном резервном копировании, но с некоторыми дополнительными опциями. Эти дополнительные параметры следующие:

  • -silent: отключает весь вывод, кроме ошибок. Нормальный вывод не требуется, когда Unison выполняется из crontab, так как некому читать его.

  • -log: указывает Unison регистрировать свои действия.

  • -logfile: указывает, где Unison будет регистрировать свои действия.

В этом примере Unison запускается каждые 3 часа. Вы можете изменить это на любую частоту, которая лучше соответствует вашим требованиям.

Всякий раз, когда вы редактируете crontab, вы всегда должны помещать пустую строку внизу перед сохранением и выходом, иначе cron может некорректно загрузить файл crontab. Это может привести к тому, что команды не будут выполнены.

После внесения этих изменений сохраните и закройте файл.

Затем создайте файл журнала, в который Unison будет записывать на сервереprimary. Следующая команда создаст этот файл:

sudo touch /var/log/unison.log

Затем сделайтеprimary_user владельцем файла.

sudo chown primary_user /var/log/unison.log

Вы можете проверить состояние резервных копий Unison, прочитав файл журнала в/var/log/unison.log. Unison будет регистрировать что-либо только в том случае, если он создал резервную копию нового или обновленного файла или обнаружит ошибку.

Unison теперь периодически выполняет резервное копирование из crontab. Последний и необязательный шаг - сделать конфигурацию SSH более безопасной.

[[step-7-optional -—- securing-ssh]] == Шаг 7 (необязательно) - Защита SSH

В этом руководстве вы создали и использовали ключ SSH без пароля. Это проблема безопасности, которую вы можете решить, ограничив возможностиbackup_user, когда они входят через SSH на серверbackup.

Вы сделаете это, настроив SSH, чтобы позволитьbackup_user выполнять одну команду только при входе в систему через SSH. Это означает, что созданный вами ключ SSH может использоваться только для выполнения резервных копий Unison и ничего больше. Это приводит к тому, что вы не сможете подключиться к серверуbackup по SSH какbackup_user. Это связано с тем, что для входа в систему требуется больше, чем одна разрешенная команда.

Если вам нужно получить доступ к серверуbackup какbackup_user, вы должны сначала войти в систему как пользовательsammy, а затем перейти наbackup_user с помощьюsu - backup_user.

Отредактируйте файл конфигурации SSH на сервереbackup в/etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config

Затем добавьте следующие строки в конец файла:

/etc/ssh/sshd_config

Match User backup_user
  ForceCommand unison -server

Эти параметры конфигурации будут делать следующее:

  • Match User: Когда указанный пользователь входит в систему, SSH применит следующую опцию конфигурации с отступом.

  • ForceCommand: это ограничивает подходящего пользователя следующей командой. В этом случаеbackup_user может запускать только командуunison -server.

Сохраните и выйдите из текстового редактора. Затем перезагрузите службу SSH, чтобы включить новую конфигурацию:

sudo systemctl reload ssh.service

Вы можете проверить это, попытавшись войти на серверbackup какbackup_user через SSH с сервераprimary.

ssh -i .ssh/unison-primary backup_user@backup_server_ip

Если настройки/etc/ssh/sshd_config работают, вы увидите следующее:

OutputUnison 2.48

Сеанс SSH будет зависать до тех пор, пока сеанс не будет завершен с помощьюCTRL иC, потому что Unison ожидает команды.

Это показывает, что сервер Unison был вызван автоматически при входе в систему, и никакой другой доступ невозможен вне связи с сервером Unison.

Теперь у вас есть работающая и безопасная система резервного копирования Unison, которая будет резервировать ваши данные так часто, как вы этого хотите.

Заключение

В этом руководстве вы установили и настроили программное обеспечение для синхронизации файлов Unison для резервного копирования каталога по SSH. Вы также сконфигурировали cron для автоматического запуска резервного копирования по указанному расписанию и защитили SSH, чтобы не использовать ключ без пароля.

При определении, следует ли вам использовать Unison, есть несколько вещей, которые вы должны учитывать:

  • Унисон может быть не лучшим выбором, когда у вас меньше файлов или меньше данных. В этом случаеrsync будет более подходящим выбором. Вы можете узнать больше об использовании rsync в руководствеHow To Use Rsync to Sync Local and Remote Directories on a VPS.

  • Резервное копирование больших объемов данных может занять много времени и может занять ваше распределение пропускной способности через общедоступные сетевые интерфейсы. Если ваши серверыprimary иbackup представляют собой капли DigitalOcean, то вы сможете выполнить резервное копирование Unison гораздо быстрее и безопаснее, если будете использовать частную сеть. Дополнительные сведения о бесплатных частных сетях DigitalOcean см. В документацииPrivate Network Overview.

Related