Приручаем rsync в Mac OS X

    Большая часть пользователей компьютеров Apple пользуются встроенным в Mac OS X решением для резервного копирования своих данных — Time Machine (TM). Я, однако, принадлежу к меньшинству, которое не пользуется «машиной времени».

    Дело в том, что мне нужен бэкап по сети, а по сети Time Machine умеет копировать данные либо на Time Capsule, либо на общую папку, расшаренную на компьютере под управлением Mac OS X Leopard (и выше). Time Capsule я покупать не собираюсь, потому что она мне не внушает доверия, а другого мака в доме нет. Существуют различные хаки, при помощи которых можно заставить TM записывать резервные копии в любую сетевую папку, но у всех этих хаков есть побочные эффекты, бороться с которыми как-то не хочется. Поэтому — rsync, rsync и ещё раз rsync. Однако Apple не была бы Apple, если бы в духе заботы о пользователе не разложила на этом пути грабли, с которыми мы сейчас и будем бороться :)

    Грабли заключаются в том, что в комплекте с Mac OS X поставляется очень странная версия rsync. Давайте посмотрим на неё внимательнее при помощи команды rsync --version:

    rsync version 2.6.9 protocol version 29
    Capabilities: 64-bit files, socketpairs, hard links, symlinks, batchfiles,
    inplace, IPv6, 64-bit system inums, 64-bit internal inums


    Во-первых, она очень древняя (текущая версия — 3.0.7 — отличается усовершенствованным алгоритмом сравнения файлов и работает быстрее). Во-вторых, эппловский rsync собран с поддержкой метаданных файловой системы HFS+ и поддерживает специальный ключ -E для сохранения этих самых метаданных… но при этом на другом конце должна быть такая же «модифицированная» версия rsync. То есть «получателем» резервной копии опять же может выступать только компьютер с Mac OS X (Tiger или выше).

    Не беда, эта проблема по большей части решается. Для начала мы скомпилируем на маке последнюю версию rsync (у вас должен быть установлен Xcode).

    Загружаем исходные тексты:
    cd ~/Desktop
    curl -O rsync.samba.org/ftp/rsync/src/rsync-3.0.7.tar.gz
    tar -xzvf rsync-3.0.7.tar.gz
    rm rsync-3.0.6.tar.gz
    curl -O rsync.samba.org/ftp/rsync/src/rsync-patches-3.0.7.tar.gz
    tar -xzvf rsync-patches-3.0.7.tar.gz
    rm rsync-patches-3.0.7.tar.gz
    cd rsync-3.0.7


    Применяем релевантные патчи:
    patch -p1 <patches/fileflags.diff
    patch -p1 <patches/crtimes.diff


    Теперь собираем:
    ./prepare-source
    ./configure
    make
    sudo make install


    Проверяем, что у нас получилось:
    melchior:~ pavel$ /usr/local/bin/rsync --version
    rsync version 3.0.7 protocol version 30
    Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.
    Web site: rsync.samba.org
    Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, no iconv, symtimes, file-flags


    Теперь необходимо скомпилировать rsync на Linux-машине, которая будет использоваться для бэкапа, с применением патча fileflags, но БЕЗ патча crtimes! В Ubuntu 9.10 для этого надо сначала установить «средства производства»:

    sudo apt-get install build-essential
    sudo apt-get build-dep rsync


    Делаем тестовый прогон:

    /usr/local/bin/rsync -aHAXxzv --protect-args --fake-super --rsync-path="/usr/local/bin/rsync" ~/Documents/ pavel@192.168.1.5:/home/pavel/backup

    Осталась только одна проблема: при попытке сделать бэкап на ext3-раздел, rsync ругнётся на то, что расширенные атрибуты файлов не помещаются в отведённое под них пространство. Для решения этой проблемы я отформатировал диск, на который производится бэкап, в XFS.

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

    rsync хорош и тем, что можно написать скрипт и регулярно запускать его cron'ом. В этом случае резервное копирование будет осуществляться без вашего вмешательства. Но это уже тема для отдельной записи…

    Комментарии 11

      +1
      кстати, вместо ручной сборки rsync настоятельно рекомендую использовать homebrew (http://github.com/mxcl/homebrew).
      там RSync как раз свежий.
        0
        Или MacPorts. Вариантов масса на самом деле.
          0
          просто homebrew — самый легкий из всех, на словах объяснить не могу, но подсознательно — ощущаю :)
        +1
        для Snow Leopard нужно с --prefix=/usr/bin собирать
        и ./prepare-source не обязательно делать
          0
          Про ./prepare-source — согласен.

          А зачем собирать с --prefix=/usr/bin? По-моему, rsync отлично себя чувствует в /usr/local/bin
          0
          /me пользуется тайммашиной с бэкапом на FreeBSD. ЧЯДНТ?
          (секрет в расшаривании диска по AFP и «defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1»)
            0
            Я же написал, что знаю про этот рецепт. Про создание sparse bundle на сетевом диске — тоже знаю. Но у этих способов есть возможные побочные эффекты, с которыми я мириться не готов.
              0
              скажите какие побочные эффекты у тайм машины при бэкапе на winshare?
            0
            Странно, у меня тайм-машина отлично бэкапит на внешний юсб винт WD.
              0
              Я, конечно, извиняюсь за некоторую резкость, но вы явно текст не прочитали. Я специально в самом начале написал, что мне нужен бэкап по сети.
                0
                да, действительно невнимательно прочитал, был неправ :)

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое