Синхронизация домашних каталогов от нескольких клиентов на сервер - PullRequest
4 голосов
/ 03 апреля 2009

Я использую несколько ноутбуков / десктопов Linux и хочу, чтобы они «обменивались» домашними каталогами.

NFS, к сожалению, не вариант. Поэтому я пытался создать bash-скрипт с использованием rsync, но не могу понять, как это сделать.

Это мой пример прямо сейчас

`#`!/bin/bash

sync() {
  rsync -azvR --exclude-from=/home/ME/.rsync_excludes --delete -e 'ssh -ax' $1 $2
}

sync /home/ME server.domain:/home/ME
`#`sync server.domain:/home/ME /home/ME

Я думаю, что это будет прекрасно работать, если я использую только один клиентский компьютер, который обновляет файлы сервера. Правильно?

Что если я удалю файл в одном клиенте? Этот файл хотите удалить на другом клиенте (после синхронизации по причине)?

Могу ли я использовать rsync для этой цели? Стоит ли искать другую программу? Надеюсь, что нет ...

Редактировать: Поскольку это решение должно быть не только для меня, я был бы признателен, если бы решение было своего рода автоматически.

Edit2: Может быть, должно быть какое-то решение, включая репо. Subversion, Git, Mercurial или что-то еще.

Ответы [ 4 ]

9 голосов
/ 03 апреля 2009

rsync хорошо для синхронизации одной локации с мастером. Или, другими словами, зеркало от А до Б. Но это не то, что вы делаете. Вы должны были бы rsync от A до B и от B до A. Что вызывает целый ряд новых проблем. Если файл исчез, вам нужно удалить его с другой стороны или выполнить повторную синхронизацию? Возможно это было изменено на другой стороне; Вы не можете проверить.

Во всяком случае; решение этой проблемы приходит в виде унисон . Это инструмент (работает на Linux, OS X, Windows, BSD, ...) (имеет инструменты CLI, инструменты с графическим интерфейсом пользователя и может быть красиво спланирован в cron), который будет синхронизировать ваш домашний каталог или любой другой каталог. и сделан для того, чтобы иметь возможность справляться практически с любым типом конфликта или проблемы. Эти люди думали, что все лучше, чем мы могли здесь.

Кроме того, есть SCM. Многие люди используют SCM для управления своими домашними каталогами. Subversion популярен для этого, но я бы не рекомендовал его вообще. Это не только потребляет огромные объемы пространства, делает все ужасно медленным и заставляет вас синхронизироваться в зависимости от активного соединения с главным репозиторием. Есть альтернативы, такие как GIT и другие, но у всех есть свои недостатки.

В любом случае, любое решение на основе SCM нарушает одно очень большое правило SCM: вам никогда не следует хранить там большие двоичные данные. СКМ не созданы для этого. Вы не сохраняете свои коллекции фотографий, фильмы, документы, файлы для загрузки и тому подобное в SCM, даже если вы хотите синхронизировать их или сохранять их историю (особенно это касается изображений / документов).

Важно понимать, что существует разница между хранением резервных копий и синхронизацией. Ваши резервные копии должны храниться в удаленном / отдельном месте и могут содержать историю всего, что у вас есть. Я лично рекомендую rdiff-backup для этого. Он прекрасно хранит историю всего, использует алгоритм rsync под капотом, чтобы минимизировать трафик, а доступ к хранилищу резервных копий выглядит как наиболее актуальное состояние резервного копирования: вы можете просто просматривать его, как и обычные файлы.

Подводя итог, я рекомендую вам объединить unison и rdiff-backup для комплексного решения для обеспечения безопасности и надежности ваших данных.

2 голосов
/ 03 апреля 2009

Почему бы не сделать это, используя Subversion ? В связанной статье подробно рассказывается, как автор синхронизирует и сохраняет историю, используя систему контроля версий (очевидно, вам не нужно использовать Subversion - есть альтернативы)

1 голос
/ 03 апреля 2009

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

function syncDown() {
    f=${1/\\/$/}/;
    rsync -acuvz --exclude 'CVS' --exclude '*.class' --exclude '.classpath' server:projects/$f $f;
    }

function syncUp() {
    f=${1/\\/$/}/;
    rsync -acuvz --exclude 'CVS' --exclude '*.class' $f server:projects/$f;
    }

Если вы ищете автоматическую синхронизацию без присмотра, вы не получите ее: у вас всегда будут условия гонки, когда вы работаете с одним клиентом, но эта работа перезаписывается синхронизацией с другим. *

0 голосов
/ 03 апреля 2009

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

rsync выполняет только одностороннюю синхронизацию. Если вы хотите двунаправленную синхронизацию, вам нужно использовать что-то еще. (cvs / svn / git / и т. Д. Было бы уместно "что-то еще", но система контроля версий не может быть оптимальным выбором, если вам не нужна история обновлений.)

На практике это означает, что если вы rsync переходите от A к B, то каждая синхронизация сделает каталог на B похожим на каталог на A - любые изменения, сделанные на B с момента последней синхронизации, будут потерян (исключение запрещено, и с оговоркой, что rsync будет удалять файлы, только если указано --delete). Такая договоренность с авторитетной мастер-версией, которая затем передается в другие места, уместна во многих случаях, но среди них нет какой-либо совместной работы.

...