MacBook: синхронизируем данные через rsync

Rsync я пользуюсь уже давно — для синхронизации данных между Windows системами. Для этого есть порт cwRsync, который очень просто устанавливается и настраивается. Итак, у нас имеется:

1. Удаленная система, на которой расшарена нужная директория
2. Локальная система, куда мы хотим записать изменения с удаленной системы

Синхронизация односторонняя, подразумевается, что мы возим с собой ноутбук, на который нужно время от времени скопировать файлы с десктопа и наоборот. Двусторонняя синхронизация с разрешением конфликтов — более сложный вопрос и лучше до этого не доводить 🙂

В Windows rsync видит все диски как "/cygdrive/<disk>", например "/cygdrive/c". Простой скрипт, выполняемый на ноутбуке и синхронизирующий директорию "work" с десктопом:

net use t: \\my-desktop\c
rsync -rltObv —delete —backup-dir=/cygdrive/c/backup /cygdrive/t/work /cygdrive/c
net use t: /delete

Для понимания процесса рассмотрим каждую опцию:

-r — рекурсивность, синхронизируются все директории внутри "work"
-l — можно опустить, если внутри директории нет ссылок (symbolic links), опция копирует ссылки в виде ссылок, а не файлов
-t — очень важная опция. При ее включении rsync смотрит время последней модификации файла и перезаписывает файл только в том случае, если оно отличается от времени файла на удаленном компьютере. Если ее не включить, rsync будет всегда перезаписывать все файлы, на что уйдет значительно больше времени.
-O — не применять "-t" к директориям. Если не включить эту опцию, новые директории на локальной системе не будут создаваться.
-v — выдавать на экран сообщения, какие файлы записались или удалились
-b — делать бекап всех перезаписанных или удаленных файлов
—backup-dir — директория, в которой создаются бекапы
—delete — удалять те файлы, которых нет на удаленной системе

В Windows эта схема уже давно отработана и без проблем служит мне много лет. Однако в Mac OS есть некоторые нюансы.

Если под Windows мы всегда синхронизировали между собой 2 системы с NTFS, то здесь одна из систем это FAT32 или exFAT (рассматривается случай, когда на машине стоит еще Windows и раздел с документами общий для обеих ОС). При подключении к Mac OS FAT, файлы на котором были записаны другой ОС, все файлы по умолчанию имеют статус "locked", т.е. "read only". Их нельзя перезаписать даже с админскими правами. Однако этот флажок можно снять. Делается это так:

chflags -R nouchg *

Теперь мы можем быть уверены, что rsync без проблем перезапишет наши файлы, а ненужные удалит. rsync входит в состав той FreeBSD, на базе которой сделана Mac OS, но стоит там очень старая версия. Поэтому ставим новую версию из MacPorts:

sudo port install rsync

MacPorts помещает исполняемые файлы в /opts/local/bin, соответственно путь к правильной версии rsync будет /opts/local/bin/rsync.

Новая версия rsync значительно быстрее выполняет стадию сравнения двух директорий.

Однако я столкнулся с проблемой: около половины файлов почему-то перезаписывались, несмотря на идентичность. Причина оказалась очень простая: в FAT немного другой формат представления времени файла и время может отличаться на +-1 секунду, т.е. секунды в FAT это всегда четное число. Для устранения этого безобразия в rsync есть опция modify-window, которая устанавливает допустимый разброс времени. Достаточно добавить:

—modify-window=1

и проблема решена. Если синхронизация происходит на HFS — этой проблемы нет.

И еще одна небольшая проблемка — русские и другие нелатинские буквы отображаются HEX-значениями. На саму синхронизацию это не влияет, но выглядит некрасиво. Для этого у rsync есть опция "8" — показывать полные 8-битные символы.

Итак, вот пример скрипта под Mac OS, синхронизирующий папку на разделе FAT с папокй с Windows компьютера:

#!/bin/bash
mount -t smbfs //user:password@my-desktop/c /Volumes/my-desktop-c
cd /Volumes/FAT
chflags -R nouchg *
/opts/local/bin/rsync -rltObv8 —delete —backup-dir=/Volumes/FAT/backup —modify-window=1 /Volumes/my-desktop-c/work /Volumes/FAT
umount /Volumes/my-desktop-c

Конечно директория /Volumes/my-desktop-c должна быть заранее создана, чтобы в нее подмонтировался удаленный диск.

5 комментариев MacBook: синхронизируем данные через rsync

  • Я знаю способ значительно проще и быстрее в реализации — установка DropBox-а. 🙂

  • Ну ты блин прямо гуру командной строки! Про DropBox не слышал? 🙂

  • DropBox тоже хорошо, но он для других задач предназначен. Таскать через ?нтернет 10+ Гб — это увольте 🙂 На самом деле у Apple есть iDisk — нативная служба типа дропбокса. Он сразу в Finder-е появляется и ничего ставить не нужно. У меня задача локально синхронизировать 2 машины. При этом не заморачиваясь с шифрованием. А полный бекап системы делается раз в месяц в Амазоновский клауд в шифрованном виде, но это опять же совсем другая задача.

  • ? кстати при помощи rsync собственный "dropbox" организуется очень просто 🙂 Он ведь еще и в режиме сервера работает. Ставим на любую машину, пробрасываем порт и точно так же все синхронизируем. Только нет никаких ограничений и данные не хранятся на чужом сервере.

Leave a Reply to KARPOLAN Cancel reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>