3

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

Подробности:

Устройства, которые я использую:

  • Настольный ПК, двойная загрузка Windows 10 / Arch Linux
  • Ноутбук (Arch Linux)
  • NAS (самостоятельная сборка, на нем работает FreeNAS)

До сих пор я использовал rsync для резервного копирования на NAS (в одностороннем порядке моя установка с двойной загрузкой использует одинаковое хранилище для обеих ОС).

Проблема в том, что я хотел бы синхронизировать ноутбук. Поэтому мне нужно сделать какую-то двустороннюю синхронизацию.

Проблемы, которые возникают здесь:

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

    • Я не могу синхронизировать свой ноутбук за пределами локальной сети (и в локальной сети я чаще всего использую настольный ПК); Локальная (обновленная) версия может быть довольно устаревшей и приводить к некоторым конфликтам.
  2. Я хочу использовать только локальную сеть (вероятно, существующую сетевую папку NAS), а не ownCloud или что-то подобное, потому что у нас довольно ограниченная полоса пропускания, где я живу, и у меня есть довольно большие файлы для синхронизации.

Мои идеи

Я нашел этот вопрос: как мне настроить rsync и любые другие сценарии, чтобы имитировать минимальную жизнеспособную копию DropBox? и изучил решение с помощью lsyncd (Live Syncing Daemon), который синхронизирует локальные каталоги с удаленными целями. Это может решить проблему № 1, но я все еще должен быть готов к конфликтам. Кроме того, я не смог найти никаких документов о lsyncd для Windows, поэтому я предполагаю, что он там не будет работать.

Я также рассмотрел возможность включения Unison в решение; Кажется, он выполняет двустороннюю синхронизацию. Может быть, я мог бы использовать его вместе с lsyncd. Я не уверен насчет разрешения конфликтов. Я обнаружил подсказку, что с -batch конфликты просто пропускаются. Но как мне обрабатывать конфликтующие файлы в долгосрочной перспективе (в конце концов, я хочу их синхронизировать)?

Итак, мой вопрос, как я могу это сделать?

2 ответа2

2

Итак, мое собственное решение требует немного больше сценариев, чем от Journeyman Geek. Я использовал unison для sync-части и zenity для предупреждения конфликтов.

Сценарии

Скрипт bash (поместите это в ваши startup-приложения):

#!/bin/bash
if [ -z "$(arp | grep MAC_ADDRESS_OF_NAS)" ]; then
    zenity --warning --text="NAS not found. Aborting."
fi;
unison sync -batch=true -repeat=watch |& while read -r line; do
    if test -n "$(echo $line | grep skipped:)"; then
        zenity --warning --text="$line"; 
    fi;
done

Конфигурация unison (поместите это как sync.prf в ~/.unison/):

root=/home/my-username/the-data-i-want-to-backup/
root=/mnt/NAS/some/sub/path/

# follow all symlinks
follow = Path *

# automatically do everything (if there are no conflicts)
auto = true

# for some reason unison fails if I sync the permissions
perms = 0
dontchmod = true

Подробное объяснение (и устранение неполадок для производных)

  1. Сначала я проверяю, находится ли NAS в локальной сети. Если его MAC-адрес не появляется в выводе arp , я предполагаю, что мне не нужно синхронизировать. Это, вероятно, требует дальнейшей доработки, так как я редко полностью выключаю свой ноутбук, чтобы скрипт не запускался при подключении к сети. Может быть, я добавлю задание cron или что-то вроде «on-network-connect»
  2. zenity можно использовать для создания графических диалогов из bash-скрипта. Вам, вероятно, нужно установить его. Основное использование довольно просто.
  3. unison sync запускает синхронизацию. Он ищет профиль конфигурации с именем ~/.unison/sync.prf . Я мог бы заменить sync чем-то другим (как в имени файла, так и в команде).
  4. Чтобы пропустить конфликтующие файлы, я указываю -batch=true . Я не делаю этого в конфигурационном файле, потому что я хочу запустить unison sync вручную, если произойдет конфликт.
  5. Мне не нужен сторонний инструмент для отслеживания изменений: -repeat=watch делает именно то, что я хочу. Sidenote: на самом деле он запускает полную ресинхронизацию при любом изменении, так что это может быть лучше, но для меня это нормально.
  6. Выход unison -команда немного странно, потребовалось некоторое время , чтобы получить эту работу:
    • Если есть конфликт, вывод содержит skipped: FILENAME
    • Похоже, что это происходит на STDERR, а не на STDOUT, поэтому мне нужно передать с |&
    • По какой-то причине я не мог понять, что это не сработало с простым grep для меня. Я пробовал что-то вроде unison sync ... |& grep "skipped:" | xargs zenity --text="{}" , но это не будет выполнено до тех пор, пока окончательно не завершится унисон (он работал нормально без -repeat= и нормально работал без grep)
  7. По вышеуказанным причинам я придерживался цикла while, чтобы прочитать ввод и использовать grep только в каждой строке.
  8. В профиле унисон обратите внимание, что я использовал абсолютные пути. По какой-то причине он не работал с ~/my/folder

Дополнительные примечания

  • Я тот, кто склонен к чрезмерной инженерии. Я установил скрипт, генерирующий мне унисон-профиль. Если вам интересно:

    #!/bin/bash
    
    HOME_DIR=$(cd ~; pwd)
    
    REPO_DIR="$(dirname "$(readlink -f $0)")"
    
    UNISON_PRF=$HOME_DIR/.unison/sync.prf
    
    # write sync script
    read -e -p "Local sync dir: [like ~/Data] " LOCAL_SYNC_DIR
    # make path absolute:
    LOCAL_SYNC_DIR="${LOCAL_SYNC_DIR/#\~/$HOME_DIR}"
    read -e -p "Remote sync dir: [like /mnt/NAS/Data/] " REMOTE_SYNC_DIR
    REMOTE_SYNC_DIR="${REMOTE_SYNC_DIR/#\~/$HOME_DIR}"
    
    rm "$UNISON_PRF"
    echo "root=$LOCAL_SYNC_DIR" > "$UNISON_PRF"
    echo "root=$REMOTE_SYNC_DIR" >> "$UNISON_PRF"
    cat "$REPO_DIR/sync.prf" >> "$UNISON_PRF"
    
    # user info
    echo "IMPORTANT: You need to put $REPO_DIR/unison/sync.sh to your startup applications for this to work properly!"
    
2

В зависимости от вашего NAS - я очень люблю синхронизацию BitTorrent для этого. Он работает на большинстве систем (включая системы Raspberry Pis и MIPS) с поддержкой нескольких пользовательских систем NAS (например, моего Seagate). Вы просто выбираете папку для совместного использования, генерируете ключ и используете ключ для настройки общего ресурса в каждой системе, в которой вы хотите его использовать. Он достаточно умен, чтобы обнаружить, что вы находитесь в локальной сети, работает за ее пределами. Бесплатная версия работает достаточно хорошо для моих нужд - я в основном использую ее для синхронизации загрузок из системы, на которой я постоянно работаю, и резервных копий множества небольших файлов, которые я добавляю нечасто.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .