LXF171:Unison: Доступ к своим файлам
Olkol (обсуждение | вклад) (Новая страница: «Категория: Учебники == Unison: Доступ к своим файлам == [[Файл: |left | thumb|100px|'''Наш эксперт''' Дж…») |
Версия 13:15, 18 ноября 2018
|
|
|
Unison: Доступ к своим файлам
[[Файл: |left | thumb|100px|Наш эксперт Джеймс Литтон занимал руководящие должности в нескольких организациях и является партнером и директором Identity Automation LP.]] Хотите разделять свои данные между разными системами без проблем с приватностью и собственностью на них? Джеймс Литтон показывает, как.
При мыслях о своих данных у многих из нас возникает внутренняя борьба: мы подыскиваем наилучший способ гарантировать их сохранность. В прежние времена все данные умещались на нескольких дискетах; потом мы перешли к лентам, CD, DVD, NAS и, наконец, к облачным хранилищам.
Рассмотрев типичную стратегию управления данными, мы обнаружим, что зачастую она фрагментарна и неэффективна. Ваши повседневные файлы, возможно, хранятся на Dropbox, что позволяет легко разделять их между разными компьютерами, которыми вы регулярно пользуетесь. Этот вариант прекрасно подходит для электронных таблиц, баз данных и документов — все вместе это довольно скромный объем данных. Но когда доходит до фотографий, музыки и фильмов, начинаются проблемы. Для файлов мультимедиа нужно гораздо больше места, и они часто оказываются на домашнем сервере NAS, и, возможно, время от времени копируются на внешний USB-диск.
Предположим, что общий объем ваших данных — 500 ГБ, и вы хотите собрать их все в одном месте. Такое позволяет сделать Dropbox — за $ 499 в год, и это, честно говоря, довольно разумная цена, но многим из нас не нравится то, что их данные будут находиться на серверах Amazon S3 и выйдут из-под контроля. Данные можно зашифровать, но с их конфиденциальностью и собственностью на них не все так просто. Чтобы избавиться от этих недостатков, исследуем варианты построения собственной системы.
Альтернативные решения
На первый взгляд, существуют относительно простые для реализации решения, такие как OwnCloud и Sparkleshare. Оба выглядят простейшим способом создать полноценную замену Dropbox, но если подумать о задачах этого проекта, то нам вовсе не нужно реализовывать всю функциональность Dropbox. Другими словами, нам не нужны ни web-интерфейс, ни возможность делиться файлами с другими, а нужна только возможность выборочно разделять файлы между компьютерами. То есть лучше бы взять что-нибудь полегче Sparkleshare или OwnCloud.
Учитывая простоту и возможности решений для командной строки, предоставляемые rsync, эта утилита приходит на ум первой. Однако проблема rsync в том, что она не приспособлена для двусторонней синхронизации. У нее есть несколько полезных опций, позволяющих довольно близко подобраться к двусторонней синхронизации, но достичь таковой полностью нельзя. Хорошая иллюстрация — отсутствие эффективного способа реакции на удаление файлов. Существуют способы это обойти, которые включают сохранение вывода в лог-файлы, сравнение и удаление, но это излишне усложняет дело.
Если необходим простой сервер для резервного копирования данных, находящихся на одном компьютере, rsync прекрасно подойдет, но нам нужно нечто более интеллектуальное, поэтому мы обратимся к Unison. Unison — утилита синхронизации файлов, работающая в Linux, BSD, OS X и Windows. Она позволяет синхронизировать набор файлов и каталогов, которые хранятся в разных местах, путем распространения изменений между наборами.
Прежде чем рассуждать о стратегии, важно понять, как именно работает Unison. На самом базовом уровне Unison поддерживает пары реплик синхронизированными. Уловили слово «пары»? При каждом запуске Unison он синхронизирует две реплики, и ничего больше. Если реплик больше двух, потребуется хорошо продуманная схема, которая гарантирует, что данные синхронизируются именно так, как мы воображаем.
Реплики
Теперь уместно спросить: «А что такое реплика?» По-простому, реплика — это набор файлов и каталогов. Реплики могут соответствовать разным хостам, но это не обязательно. Чтобы лучше понять идею, представьте, что у вас есть компьютер дома и компьютер в офисе, и вы хотите, чтобы домашний каталог автоматически синхронизировался между этими компьютерами. Пусть у вас также есть внешние USB-диски для резервных копий дома и в офисе. В этот сценарий вовлечено всего два компьютера, но реплик Unison четыре.
Задумавшись о том, какую структуру синхронизации выбрать, вы получите различные «топологии», которые похожи на известные сетевые топологии — линия, звезда, сетка, кольцо и другие. Описанный выше сценарий соответствует линейной модели, но лучший способ организации нашей системы — с помощью хаба и модели «звезда». В такой конфигурации в центре находится сервер, и на каждом из компьютеров имеется один профиль Unison, который синхронизирует данные с сервером; эту схему мы и реализуем на нашем уроке.
Для нашего тестового случая рассмотрим ситуацию, при которой на регулярной основе используются четыре компьютера: офисный настольный компьютер, домашний настольный компьютер, домашний ноутбук и ноутбук для поездок. Мы заменим Dropbox на всех этих четырех компьютерах. На двух компьютерах установлена Mac OS X, на двух других — Linux.
При работе с Unison важно обеспечить, чтобы на всех системах, участвующих в синхронизации, была установлена одна и та же версия программы. Воспользуемся версией 2.40, это последний стабильный релиз.
На платформе Mac загрузите графическую оболочку версии 2.40.69 с сайта http://alan.petitepomme.net/unison/index.html. Смонтируйте dmg и скопируйте Unison в каталог приложений. Теперь откройте Unison, и программа попросит вас установить версию утилиты для командной строки — скажите «да». Утилита установится в /usr/bin/. Для проверки выполните команду
unison -version
Unison должен вывести номер версии — 2.40.69. В Ubuntu 12.04 Unison можно установить из репозиториев Ubuntu, скомандовав
sudo apt-get install unison
Проверить установку можно командой
unison -version
Программа должна вывести номер версии — 2.40.65. Теперь можно создать профиль Unison. Профиль определяет, как Unison будет синхронизировать две реплики. Создадим файл профиля под названием lxfsync.prf в нашем системном каталоге Unison:
root = /home/lxf/Unison
root = ssh://lxf@example.com//home/lxf/Unison
fastcheck = true
batch = true
force = newer
times = true
sshargs = -C
Строки 1 и 2 задают местоположение реплик. Строка 3 велит Unison применять время изменения и размер файла как «псевдономер узла» при сканировании реплик на наличие изменений, вместо считывания содержимого каждого файла целиком. Строка 4 отключает интерфейс пользователя. Строка 5 велит Unison брать файл с последним временем изменения. Строка 6 означает, что будет сохраняться время изменения файлов; и, наконец, в строке 7 включается сжатие SSH для увеличения производительности. Замечание об опции times: увы, она не поддерживает каталоги. При копировании каталога время его создания будет соответствовать созданию каталога копии, а не исходного каталога.
Теперь мы готовы к первичной синхронизации. Для начала выберите один из компьютеров, создайте копию каталога Dropbox и назовите ее Unison.
cp -r ~/Dropbox ~/Unison
Затем мы подключимся к нашему серверу Unison через SSH и создадим соответствующий каталог, в который будут синхронизироваться наши четыре компьютера.
mkdir ~/Unison
Синхронизируем наши данные
Теперь нужно переместить копию данных с ноутбука на сервер. Чтобы убедиться в шифровании данных при передаче между компьютерами, взгляните на параметры: с их помощью мы указали, что для подключения к удаленной реплике нужно пользоваться SSH. Синхронизация запускается следующей командой:
unison -ui text lxfsync
Первые два параметра велят Unison запускаться в текстовом режиме. Третий параметр — имя профиля, который мы хотим использовать.
По окончании синхронизации Unison должен сообщить количество переданных элементов. Если некоторые элементы были пропущены или возникли ошибки, подробную информацию о транзакции можно получить, заглянув в файл журнала — ~/unison.log.При запуске Unison вы видели, что вас просят ввести пароль учетной записи на сервере. А так как мы собираемся автоматизировать этот процесс, аутентификация должна проходить без вашего вмешательства.
Чтобы достичь этой цели, воспользуемся аутентификацией SSH по ключу. Для этого на каждом компьютере, синхронизируемом с сервером, нужно сгенерировать уникальный ключ. Чтобы сделать это на ноутбуке, выполните следующую команду:
ssh-keygen -t rsa
После этого в каталоге ~/.ssh должно появиться два файла: id_rsa и id_rsa.pub. Файл id_rsa.pub — наш публичный ключ, и его нужно скопировать на сервер, чтобы демон SSH мог доверять этому ключу. Переместим файл командой scp:
scp ~/.ssh/id_rsa.pub lxf@example.com:~/.ssh/Computer1.pub
Теперь нужно предупредить демон SSH на сервере, чтобы он доверял этому ключу. Для этого подключимся к серверу по SSH и скомандуем:
cat ~/.ssh/Computer1.pub >> authorized_keys
Чтобы проверить нашу работу, снова запустим команду Unison с ноутбука. Если все в порядке, на сей раз у нас не спросят пароль:
unison -ui text lxfsync
Хотя это и не обязательно, многим нравится, что агент Dropbox информирует их о происшедших изменениях; перенесем эту возможность на четыре наших компьютера, синхронизируемые с сервером. Так как синхронизация производится с помощью скриптов оболочки, нужно установить утилиты, которые позволят обратиться к системе оповещений рабочего стола. На платформе Mac можно воспользоваться Growl посредством growelnotify. На компьютерах Ubuntu воспользуемся NotifyOSD с помощью notify-send.
На платформе Mac загрузите Growl 1.2.2 с growl.info. После загрузки смонтируйте dmg и установите Growl, дважды щелкнув на скрипте Growl.pkg. Откройте каталог Extras, затем growlnotify, и установите growlnotify, запустив скрипт growlnotify.pkg. Теперь можно отправлять оповещения Growl с командной строки. Чтобы это проверить, откройте терминал и выполните команду
growlnotify --message “Hello World”
В Ubuntu для передачи сообщений демону оповещений рабочего стола нужно установить библиотеку libnotify. Установить ее можно из репозиториев Ubuntu, командой
sudo apt-get install libnotify-bin
Чтобы ее проверить, попробуйте выполнить следующую команду:
notify-send “Hello World”
Если все хорошо, ваши сообщения появятся на соответствующих рабочих столах.
Объединяем все вместе
Теперь мы умеем синхронизировать данные и отправлять оповещения. Давайте удобства ради объединим все эти действия в одном скрипте.
- !/bin/bash
/bin/ping -c 1 www.google.com 2>&1 >/dev/null
if [“$?” == 0 ]; then
root=”/home/lxf”
image=”$root/.unison/sync.png”
stat=`/usr/bin/unison -ui text -logfile “$root/unison.log” lxfsync 2>&1 >/dev/null | tail -1`
if [${PIPESTATUS[0]} != 0 ]; then
notify-send “Unison” “Sync Error” -i “$image” -t 0
exit 1
fi
if [ ${stst:0:7} == “Nothing” ]; then
exit 0
else
stat2=`echo “$stat” | grep -Po ‘(?<=\().*?(?=\))’`
fi
notify-send “Unison” “$stat2” -i “$image”
else
exit 1
fi
Как видите, наш скрипт очень прост. В строке 1 задается тип скрипта (Bash). В строке 2 проверяется подключение к Интернету. В строке 3 анализируется результат проверки, и если подключения нет, мы переходим к строке 18, в которой скрипт завершается с кодом ошибки, означающим, что синхронизация завершилась неудачно.
В том случае, если подключение доступно, в строках 4 и 5 задаются несколько переменных, после чего мы переходим к строке 6. В данной строке мы запускаем Unison, получаем последнюю строку вывода и сохраняем ее в переменной $stat, которой воспользуемся позже. В строке 7 мы проверяем, вернул ли Unison код 0, означающий успешную синхронизацию. Если мы получили другой код ошибки, то в строке 8 мы отправляем оповещение рабочего стола об ошибке синхронизации.
При успешном завершении синхронизации в строке 11 мы анализируем переменную $stat, чтобы понять, выполнил ли Unison какие-либо действия. Если первое слово в переменной — “Nothing [Ничего]”, то мы выходим из скрипта, потому что обновлений не было; в противном случае переходим к строке 14, где получаем строку в круглых скобках и сохраняем ее в переменной $stat2, после чего переходим в строку 16 и отображаем результаты пользователю.
Чтобы все работало без нашего участия, скрипт должен запускаться регулярно и синхронизироваться с сервером. С этой задачей прекрасно справится cron. Давайте сделаем интервал синхронизации в пять минут следующей командой:
crontab -e
Теперь добавим следующее:
- /5 * * * * DISPLAY=:0 /home/lxf/sync.sh
- /5 велит cron запускаться каждые пять минут. Следующие четыре звездочки велят cron запускаться каждые пять минут каждого часа каждого дня каждого месяца. DISPLAY=:0 направляет вывод скрипта на текущий монитор.
Вот и все! Теперь вы обзавелись бесплатной заменой Dropbox, которая находится под вашим контролем. Некоторые из вас, несомненно, поинтересуются: а как же лучше всего делиться файлами с членами семьи и друзьями? Здесь лучше Dropbox вам не найти. Продолжайте пользоваться бесплатной учетной записью и делиться файлами по мере необходимости, не беспокоясь об остальных данных. |