Задача: разобрать как синхронизировать данные между двумя доверенными системами. Позволю себе привести отрывок из очень интересного и захватывающего произведения — Ясинского Анджея — Ник,
– Я сейчас тебе скину инфу, вечером дома почитаешь и пришлешь мне свои соображения. В первую очередь меня интересуют затраты времени и кого из программистов ты привлечешь к работе.Шеф достал из кармана свой бадди-комп и что-то пробормотал в него. Мой комп высветил перед глазами информацию о прямом коннекте и начал загрузку информации. Наши с шефом компы были настроены друг на друга, так что не пришлось делать лишних телодвижений, чтобы подтвердить прием.
-
- Вот этот открывок из произведения и надоумил меня, а ведь можно сделать такое в реальном исполнение. Поэтому данная заметка будет своего рода решением сформированной задачи на основе любимого произведения.Т.е. мне нужно сделать синхронизацию файлов между системами
Ubuntu 12.04.5 Desktop/Server, Windows 7, Server 2008 R2
-
-
- В роли инструмента который будет играть практическую роль выступит утилита — unison
-
Для того, чтоб синхронизация файлов работала нужно использовать одинаковую версию. Сейчас я пока разберу, как настроить двухстороннюю связь между двумя системами под управлением
Ubuntu 12.04.5 Server amd64
192.168.0.136 srv-phone
192.168.0.197 srv-mon
- Обновляю информацию по репозитариям и устанавливаю данную утилиту из дефолтных репозитариев:
ekzorchik@srv-phone:~$ sudo apt-get update --fix-missing && sudo apt-get upgrade -y
ekzorchik@srv-mon:~$ sudo apt-get update --fix-missing && sudo apt-get upgrade -y
Также на обоих системах должно быть синхронизировано время:
Текущая доступная версия из репозитариев:
ekzorchik@srv-phone:~$ sudo apt-cache show unison | grep Version
Version: 2.40.65-1ubuntu1
а на официальном сайте уже доступна: 2.40.102
ekzorchik@srv-mon:~$ sudo apt-get install unison -y
ekzorchik@srv-phone:~$ sudo apt-get install unison -y
Настраиваю доступ между системами по ключам ssh:
Повторять здесь шаги не буду потому как есть опубликованная практическая заметка:
Для первой системы доступ на основе публичных ключей:
ekzorchik@srv-phone:~$ ssh-keygen -t rsa
ekzorchik@srv-phone:~$ cat ~/.ssh/id_rsa.pub | ssh -p 22 ekzorchik@192.168.0.197 'umask 077;test -d .ssh | mkdir .ssh; cat >> .ssh/authorized_keys'
The authenticity of host ‘192.168.0.197 (192.168.0.197)’ can’t be established. ECDSA key fingerprint is 89:fd:7c:8d:07:15:42:73:c3:27:10:34:8b:5c:a2:b8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added ‘192.168.0.197’ (ECDSA) to the list of known hosts.
ekzorchik@192.168.0.197’s password:712mbddr@
Для второй системы доступ на основе публичных ключей:
ekzorchik@srv-mon:~$ ssh-keygen -t rsa
ekzorchik@srv-mon:~$ cat ~/.ssh/id_rsa.pub | ssh -p 22 ekzorchik@192.168.136 'umask 077;test -d .ssh| mkdir .ssh; cat >> .ssh/authorized_keys'
Отлично. Но не забываем проверить, что аутентификация между двумя системами работает и пароль не запрашивается. Т.к. у меня на обоих системах присутствует учетная запись ekzorchik, то перед подключение через ssh не надо указывать под каким пользователем происходит аутентификация, если у Вас пользователь, а он будет отличен от рассмотренного в этой заметке то следует использовать ключ "-
l” <user_name>
. Теперь перехожу к настройке самой утилиты: – Unison — утилита которая помимо rsync может осуществлять двухсторонную синхронизацию файлов/каталогов. К примеру вы подключаете свой внешний носитель к системе и прям как во большинстве фильмов данные с компьютера копируются Вам. Разве Вам такого не хотелось.
На заметку: если осуществлять синхронизацию между различными системами, Ubuntu, Windows то обязательным условияем является использованием одинаковой версии программа, потому как есть полученные практические ошибки при использовании различных версий.
Каталог который буду настраивать на синхронизацию:
ekzorchik@srv-phone:~$ mkdir shara
— содержащий наработки повседневного использования в течении всего времени работы в одной компании:
ekzorchik@srv-phone:~$ du -sh shara/
90M shara/
Задача: нужно настроить двухстороннюю синхронизацию для определенных директорий с файлами:
Чтобы начать синхронизацию:
ekzorchik@srv-phone:~$ unison shara/ ssh://192.168.0.197//home/ekzorchik/shara
Contacting server… Connected [//srv-mon//home/ekzorchik/shara -> //srv-phone//home/ekzorchik/shara] Looking for changes Warning:
No archive files were found for these roots, whose canonical names are: /home/ekzorchik/shara //srv-mon//home/ekzorchik/shara 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 local srv-mon dir —-> tips_firma [f]
Proceed with propagating updates? [] y
Propagating updates UNISON 2.40.65 started propagating changes at 12:16:34.07 on 25 Nov 2014 [BGN] Copying tips_mebetal from /home/ekzorchik/shara to //srv-mon//home/ekzorchik/shara Shortcut: copied /home/ekzorchik/shara/tips_firma/tips_exe/user.txt from local file /home/ekzorchik/shara/.unison.tips_firma.9ffec30340641776fecf8dcd7a31f5f8.unison.tmp/file.txt Shortcut: copied /home/ekzorchik/shara/tips_firma/~$ps_report_25_11_2014_v1.docx from local file /home/ekzorchik/shara/.unison.tips_firma.9ffec30340641776fecf8dcd7a31f5f8.unison.tmp/~$ps_report_20_11_2014_v1.docx [END] Copying tips_firma UNISON 2.40.65 finished propagating changes at 12:16:43.22 on 25 Nov 2014 Saving synchronizer state Synchronization complete at 12:16:43 (1 item transferred, 0 skipped, 0 failed)
Файлы переехали на вторую систему:
ekzorchik@srv-mon:~$ du -sh shara/
90M shara/
Входе перемещения каталога потребовалось ответить на вопросы мастера касательно процесса синхронизации, но так не очень то и удобно, мне нужна бесшовная синхронизация. Добиться такого можно составить специальный файл ответов (расширение prf). Данный файл располагается в профиле пользователя в скрытой директории:
ekzorchik@srv-phone:~$ ls -al | grep .unison
drwx—— 2 ekzorchik ekzorchik 4096 Nov 25 12:16 .unison
Далее прорабатываю составление файла ответов:
ekzorchik@srv-phone:~$ nano .unison/default.prf
# Unison preferences file
root = shara/
root = ssh://ekzorchik@192.168.0.197//home/ekzorchik/shara
#Для включения пакетного режима и автоматического ответа на вопросы
batch = true
auto = true
confirmbigdel = false
fastcheck = true
prefer = newer
# выводить в консоль информацию о действиях если поставить значение true то на консоль не будет выводиться ничего.
silent = false
times = true
unicode = true
#файлы которые нужно пропускать при синхронизации
#подстановочные ключевые слова: Name, Path, BelowPath, Regex
ignore = Name ~$*
ignore = Name .~
ignore = Name *.tmp
#если синронизация между системами Windows & Ubuntu, то для трансформации прав
perms = 0
#сохраняем лог с результатами работы в отдельном файле
log = true
logfile = /home/ekzorchik/.unison/unison.log
#Определяем команду для отображения отличий между копиями файлов при конфликте
diff = diff -y -W 79 –suppress-common-lines
Сохраняем внесенные изменения:
Протестирую работу:
Если на srv-phone удалили все текстовые файлы в каталоге share/tips_firma/*.txt
ekzorchik@srv-phone:~$ rm shara/tips_firma/*.txt
ekzorchik@srv-phone:~$ unison
UNISON 2.40.65 finished propagating changes at 16:02:40.72 on 25 Nov 2014
Saving synchronizer state
Synchronization complete at 16:02:40 (604 items transferred, 0 skipped, 0 failed)
На заметку: если не нужен вывод в консоль в момент выполнения команды unison, то следует в профиль синхронизации для параметра silent = false присвоить значение true. Изменения применятся мгновенно.
проверю, что случилось со всеми текстовыми файлами на srv-mon:
ekzorchik@srv-mon:~$ ls shara/tips_firma/*.txt
ls: cannot access shara/tips_firma/*.txt: No such file or directory
их нет, как и должно быть синхронизация прошла успешно.
Теперь можно настроить запланированное задание для учетной записи файлы которой происводятся синхронизировать:
ekzorchik@srv-phone:~$ crontab -e
* 1 * * * /usr/bin/unison &> /dev/null
Сохраняем внесенные изменения. Этим заданием я говорю, запускать каждый час утилиту unison для синхронизации каталог обозначенного в дефолтном профиле именуемом, как default.prf. Если профилей у Вас несколько, то нужно указать так: /usb/bin/unison profile.prf
Но следует быть осторожный при такой двухсторонней синхронизации, удалив файлы с другого хоста srv-mon, а на первом хосте srv-phone Отработало задание, которое произведет сверку файлов и также удалит на первом их. По сути получается, что синхронизировать по двухстороннему обмену ключевые каталоги следует очень внимательно, можно быстро попращаться со всеми файлами вслучае каких либо изменений по нечаянности. Но как дополнительный рубеж можно подключить систему контроля версий — git, как выход.
Отлично с настройкой под мои текущие задачи все более или менен понятно, теперь разберу как произвести обновление до самой актуальной версии: 2.40.102 которая доступна для Ubuntu 14.04.1, поэтому просто посредством сайта packages.ubuntu.com найду пути пакетов которые скачаю и установлю в систему в ручном режиме:
ekzorchik@srv-phone:~$ wget -c http://mirrors.kernel.org/ubuntu/pool/universe/u/unison/unison_2.40.102-2ubuntu1_amd64.deb
ekzorchik@srv-phone:~$ wget -c http://mirrors.kernel.org/ubuntu/pool/universe/u/unison2.32.52/unison2.32.52_2.32.52-7ubuntu1_amd64.deb
ekzorchik@srv-phone:~$ wget -c http://mirrors.kernel.org/ubuntu/pool/universe/m/meta-unison/unison-all_2.40+2_all.deb
Устанавливаю по такому же порядку как и производил скачивание:
ekzorchik@srv-phone:~$ sudo dpkg -i unison_2.40.102-2ubuntu1_amd64.deb
ekzorchik@srv-phone:~$ sudo dpkg -i unison2.32.52_2.32.52-7ubuntu1_amd64.deb
ekzorchik@srv-phone:~$ sudo dpkg -i unison-all_2.40+2_all.deb
Проверяю текущую версию:
ekzorchik@srv-phone:~$ unison -version
unison version 2.40.102 — отлично самая последняя актуальная. Точно такие же действия произвожу и на второй системе:
Информацию по конструктивным особенностям работы текущей версии можно подчерпнуть из справки: (много интересного описано)
ekzorchik@srv-phone:~$ unison -doc all
На заметку: от марта 2023
года, нашел более лучший сервис который обеспечит меня доверительным обменом файлов, об этом см заметку Доверительный обмен файлами через syncthing
Ранее я рассматривал похожую утилиту lftp которую можно также приспособить для решения описанного здесь решения, но как ещё одно средство выбора исполнения поставленной задачи такая утилита, как unison тоже имеет право на свое существование. Отличие к примеру от утилиты rsync, то что первым делом при первой синхронизации происходит подсчет и хранение контрольных сумм новых и измененных файлов ну а уже после если файлы на основе этого и просходит отслеживание, а утилита lftp проделывается точно такие же манипуляции. Считаю что на этом моменте я пока завершу данную заметку, поставленную цель выполнил, прощаюсь, с уважением автор блога — ekzorchik.