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

Вступление

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

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

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

Шаг 1 - Создание дополнительных пользователей без прав root

Учебное пособие « Начальная установка сервера с Ubuntu 18.04» помогло вам создать пользователя sudo без полномочий root с именем sammy как на основном, так и на резервном сервере. На этом шаге вы создадите двух новых пользователей, одного на основном сервере и одного на сервере резервного копирования. Это предотвращает путаницу при работе с руководством, и на резервном сервере требуется альтернативный пользователь sudo без полномочий root, если в конце руководства включена конфигурация безопасности SSH.

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

ssh sammy@primary_server_ip
ssh sammy@backup_server_ip

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

sudo adduser primary_user

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

sudo usermod -aG sudo primary_user

Наконец, измените учетные записи на primary_user:

su primary_user

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

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

Шаг 2 - Установка Unison на обоих серверах

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

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

sudo apt-get update

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

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

sudo apt-get install unison

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

Шаг 3 - Создание ключей SSH и настройка SSH

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

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

Начните с того, что убедитесь, что .ssh каталог существует:

mkdir .ssh

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

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

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

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

-t rsa: Это устанавливает тип ключа, который будет создан. Ключи RSA являются наиболее совместимым типом.
-b 4096: Это устанавливает длину ключа. Чем длиннее ключ, тем он надежнее. Длина ключа 4096- это текущая рекомендуемая длина ключа для ключей RSA.
-f .ssh/unison-primary: Устанавливает имя ключа и место, где он будет сохранен. В этом случае вы сохраните ключ в каталоге по умолчанию SSH .ssh, используя выбранное вами имя.
Предыдущая команда создает открытый и закрытый ключи SSH в следующих двух файлах:

.ssh/unison-primary
.ssh/unison-primary.pub

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

cat .ssh/unison-primary.pub

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

nano .ssh/authorized_keys

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

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

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

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

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

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

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

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

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

Output
unison version 2.48.3

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

Шаг 4 - Настройка Unison

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

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

mkdir .unison

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

nano .unison/default.prf

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

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

Смысл этих строк заключается в следующем

force Это гарантирует, что изменения будут переданы только с основного сервера на сервер резервного копирования. /home/primary_user/data Путь расположение каталога, содержащие данные, которые вы хотите создать резервную копию.
sshargs: Эта опция указывает Unison использовать сгенерированный вами ключ SSH.
Если каталог, содержащий данные, для которых вы хотите выполнить резервное копирование, не находится в домашнем каталоге primary_user, вы должны убедиться, что он доступен для чтения и записи для primary_user. Если вы не знакомы с владением и разрешениями Linux, ознакомьтесь с руководством « Введение в Linux», чтобы узнать больше.

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

Шаг 5 - Резервное копирование каталога с помощью Unison

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

/home/primary_user/data/home/backup_user/data/.unison/default.prf

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

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

mkdir /home/primary_user/data

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

touch /home/primary_user/data/file{1..5}

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

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

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

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

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

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

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

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

Output
Contacting 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 синхронизируются во время этого прогона.

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

Output
Contacting 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 изменении на основном сервере:

Output
Contacting 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)

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

Предупреждение: любые новые файлы или изменения в data каталоге на сервере резервного копирования будут потеряны при запуске Unison.

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

Шаг 6 - Создание задания Unison Cron

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

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

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

crontab -l

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

Output
no crontab for primary_user

Затем выполните crontab команду на основном сервере с -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

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

-silent: Отключает все выходные, кроме ошибок. Нормальный вывод не требуется, когда Unison выполняется из crontab, так как некому читать его.
-log: Поручает Unison регистрировать свои действия.
-logfile: Указывает, где Unison будет регистрировать свои действия. В этом примере Unison запускается каждые 3 часа. Вы можете изменить это на любую частоту, которая лучше соответствует вашим требованиям.
Всякий раз, когда вы редактируете crontab, вы всегда должны помещать пустую строку внизу перед сохранением и выходом, иначе cron может некорректно загрузить файл crontab. Это может привести к тому, что команды не будут выполнены.

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

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

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 более безопасной.

Шаг 7 (необязательно) - защита SSH

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

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

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

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

sudo nano /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_user через SSH с основного сервера.

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

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

Output
Unison 2.48

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

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

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

Заключение

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

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

Автору будет очень приятно узнать обратную связь о своем руководстве.

Комментариев 0