Принцип работы утилиты Time Machine Traveler Helper
Принцип работы утилиты Time Machine Traveler Helper

У меня есть рабочий макбук и я часто путешествую. Я боюсь потерять данные на нем, поэтому я делаю бекапы через родную Time Machine на удаленный сервер. Для этого я поднял в офисе сервер SMB, который всегда доступен через VPN.

Проблема: если включить автоматический бекап в Time Machine, система будет постоянно бекапится даже через тонкий мобильный интернет в самолете, мешая работать, исчерпав весь канал.

Решение: я написал скрипт Time Machine Traveler, который проверяет скорость доступа к SMB шаре и запускает бекап только если качество соединения высокое.

Мой скрипт работает так

  1. Проверяет доступность SMB сервера через VPN

  2. Если сервер доступен, запускает тест скорости через iperf3

  3. Если скорость хорошая, запускает бекап


Настройка сервера

Чтобы развернуть такой же сетап, вам потребуется поднять Samba сервер и настроить к нему удаленный доступ через VPN. Вы можете сделать это любым удобным способом. Я расскажу про свой способ.

VPN

Мы на работе используем модный ZeroTier. Это не совсем VPN, так как в нем нет центрального сервера, а все соединения происходят напрямую, через P2P. Это позволяет получить максимальную скорость между клиентом и SMB сервером.

В ZeroTier подключения внутри VPN сети происходят напрямую
В ZeroTier подключения внутри VPN сети происходят напрямую

В обычной схеме с VPN сервером вы всегда ограничены качеством канала между вами и сервером. И даже если офис находится в соседнем здании, вы все равно будете пропускать трафик через VPN сервер, внося задержки. В ZeroTier я выжимаю 100 Mbit/s до офиса из дома с минимальными задержками. При этом мне доступны все хосты внутри VPN сети, и чем ближе я физически к целевому хосту, тем лучше скорсть. Такое невозможно получить с центральным VPN сервером.

Я обожаю ZeroTier за его простоту в настройке. Я пользуюсь и OpenVPN и IPSec Ikev2 и все это ужасно. Сейчас добавление нового клиента в VPN сеть у нас на работе выглядит так:

sudo zerotier-cli join <network id>

Дальше администратор апрувит добавление нового клиента в веб-морде и все. Там же в веб-интерфейсе можно легко отключить клиента. Кайф!

SMB сервер

Для бекапа в Time Machine вам потребуется развернуть SMB сервер на дисковом хранилище. Это может быть NAS или голая Samba. Я использую обычную Samba настроенную по этому мануалу, чтобы включить расширения протокола для macOS.

С недавнего времени Apple забросили поддержку своего протокола AFP (Apple Filing Protocol), поэтому все мануалы по настройке сервера для Time Machine, где используется AFP устаревшие, не используйте их. Теперь достаточно обычного SMB.

Speed Test

Чтобы измерять скорость до SMB хранилища, я развернул на том же сервере iperf3, который всегда слушает порт и ждет клиентов для замеров скорости сети.

apt install iperf3

И добавил его как сервис:

# systemctl cat iperf3.service

# /lib/systemd/system/iperf3.service
[Unit]
Description=iperf3 server
After=syslog.target network.target auditd.service

[Service]
ExecStart=/usr/bin/iperf3 -s

[Install]
WantedBy=multi-user.target

Настройка клиента

В нашем случае клиенты это макбуки путешественников. На них нужно настроить Time Machine на удаленный сервер как обычно. При настройке важно подключаться к SMB серверу по тому адресу, который будет доступен через VPN.

Подключение к SMB шаре

ВАЖНО: при подключении к SMB хранилищу нужно поставить галочку "Сохранить пароль в ключнице, иначе мой скрипт не сможет сам подмонтировать диск в фоне.

При подключении к удаленному SMB важно сохранить пароль
При подключении к удаленному SMB важно сохранить пароль

Активация Time Machine

Если у вас правильно настроена Samba, удаленный диск появится в списке доступных для бекапа в Time Machine. Активируйте его и выполните первый самый долгий бекап. Размер бекапа будет равен объему занятого места на диске. Когда первичный бекап выполнен, нужно убрать галочку "Автоматический Бекап".

ВАЖНО: если дисковое хранилище общее, выбирайте опцию "шифровать бекап" в time machine, иначе все ваши файлы будут лежать на сервере в открытом виде.

Установка скрипта Time Machine Traveler Helper

Мой скрипт это плагин для утилиты xbar. Эта утилита запускает шелл скрипты в фоне и красиво форматирует их вывод в системном трее.

Вот мой плагин Time_Machine_Traveler.py (Это Pull Request в библиотеку плагинов xbar)

Он еще сырой и я не буду советовать всем его устанавливать. Вам придется самому разобраться как добавить его в xbar. В данный момент я приглашаю только разработчиков протестировать и доработать плагин.

Настройки скрипта

У скрипта есть настройки, для работы вам нужно их заполнить

  • SMB_SHARE_ADDRESS — адрес SMB сервера, IP или домен, например 10.30.22.1

  • WORKGROUP_NAME — имя рабочей группы на SMB сервере. В моем случае стандартное WORKGROUP

  • SMB_MOUNT_PATH — полный путь по которому будет доступно SMB хранилище в системе. В моем случае это /Volumes/pavel Его можно посмотреть, когда SMB хранилище смонтировано с помощью утилиты df

  • SMB_USER — имя пользователя с которым подключаться к SMB

  • SMB_SHARE_PATH — имя SMB папки на сервере. Оно показано, когда вы подключаетесь к SMB серверу. В моем случае это просто pavel

  • SPEED_TEST_SERVER — адрес сервера на котором установлен iperf3. В моем случае это тот же адрес, что и SMB хранилище

  • SPEED_TEST_DURATION — время, которое будет выполняться тест скорости. По умолчанию это 10 секунд, что для меня слишком долго, так как в этот момент канал нагружается полностью. Я поставил 3 секунды

  • SPEED_TEST_TIMEOUT — таймаут подключения к серверу iperf3 в миллисекундах. Это те же задержки, которые мы видим в ping. Если поставить значение меньше 100мс, это автоматически отрежет бекап через мобильный интернет.

  • MIN_SPEED — минимальная скорость до сервера в Mbit/s. Я ставлю 60 мегабит.

  • MAX_LOAD_AVERAGE — я ненавижу, когда бекап включается в момент, когда я кодирую видео на ноутубуке. Поэтому скрипт проверяет насколько нагружена система и если LA больше этого значения, то не запускает бекап. Я ставлю 5

Скриншоты

Скорость до SMB сервера слишком медленная, бекап отменен
Скорость до SMB сервера слишком медленная, бекап отменен
Выполняется бекап. Прогресс и оставшееся время пока не показываются
Выполняется бекап. Прогресс и оставшееся время пока не показываются

⚠️ Помогите в тестировании

Это полезный инструмент для удаленных сотрудников и тех кто путешествует. На текущий момент скрипт находится в alpha версии и я прошу вас принять участие в тестировании и доработке скрипта, потому что мне уже лень.

TODO

Скрипт не готов до конца, нужно еще:

  • Убрать зависимость от стороннего python3 из brew. В идеале хочется использовать стандартный системный питон

  • Убрать зависимость от osascript

  • Сократить настройки: брать настройки адреса SMB шары и всех путей из вывода tmutil destinationinfo

  • Показывать прогресс бекапа через tmutil status. Вот референс

  • Брать дату последнего успешного бекапа из tmutil status и на основании этого сделать возможность настройки интервалов бекапов: если последний успешный бекап старше N дней, запускаем бекап.

Комментарии (22)


  1. kungfury1337
    10.09.2021 12:04
    +1

    Прикольная тема.

    Пробовал ли реализовать такой функционал через предустановленный в мак «автоматор »?

    Что-то мне подсказывает что это будет проще и быстрее????


    1. zhovner Автор
      10.09.2021 12:05
      +1

      Я не знаю как с помощью автоматора сделать такой же красивый GUI в системном трее. Тем более питон я знаю лучше чем скриптовый язык макоси.


  1. ailinykh
    10.09.2021 12:13

    Убрать зависимость от стороннего python3 из brew. В идеале хочется использовать стандартный системный питон

    На macOS 12 Monterey Beta при вызове системного питона вылезает предупреждение о том, что он deprecated. Возможно в следующей macOS не будет его вовсе


    1. zhovner Автор
      10.09.2021 12:13
      +1

      В макосе есть python3.8 но он спрятан. Возможно речь про про python 2.7?


  1. Akuma
    10.09.2021 12:30

    Идея прикольная, но почему именно скорость тестируете? Это нагружает канал периодическими тестами, а на том же мобильном будет и вовсе ломать интернет при плохой доступности.

    Может проще опираться на активный интерфейс?

    Вот тут есть пример на AppleScript https://apple.stackexchange.com/questions/99968/enable-disable-time-machine-depending-on-network-connection-type


    1. zhovner Автор
      10.09.2021 12:43

      Может проще опираться на активный интерфейс?

      У меня в ноутбуке нет ethernet, там есть только WiFi, поэтому такой вариант бесполезен. Кроме того, сейчас по WiFi я выжимаю >200 мегабит, так что эти модели уже не актуальны.


      Это нагружает канал периодическими тестами

      Вы правы, но они длятся всего 3 секунды. Поэтому я хочу брать дату последнего успешного бекапа из tmutil status и на основании этого сделать возможность настройки интервалов бекапов: если последний успешный бекап старше N дней, запускаем бекап. То есть если поставить бекап раз в 5 дней, то тесты скорости будут выполняться только если система готова для бекапа.


  1. KorP
    10.09.2021 12:35
    +1

    Но ведь если поехать куда-то в отпуск, где будет несколько дней плохого интернета и соответственно не будет бекапа и что-то случается с ноутбуком - прощайте данные? Почему просто не бекапится на внешний hdd?


    1. zhovner Автор
      10.09.2021 12:44

      бекапится на внешний hdd

      Лишний дроч для тех у кого много свободного времени. Носить с собой какие-то провода, выделать время для этого. Зачем, если можно потратить это время с большей пользой.


      1. KorP
        10.09.2021 12:47
        +5

        т.е. сидеть в отпуске за компом это норм, а подключить хард это дроч? ну...


        1. VanKrock
          10.09.2021 14:33

          Если у вас украдут рюкзак, то скорее всего с ноутбуком и внешним хдд


          1. KorP
            10.09.2021 14:38
            +2

            Тут можно придумать десяток вариантов - почему тот или иной способ плох. Мы же не знаем, как и куда путешествует автор. Когда я путешествую - хард остаётся в отеле/машине, а ноутбук "ходит" со мной, соответственно в моём случае или надо быть очень невезучим, что бы украли всё из всех мест сразу, либо всё-таки степень защиты у меня выше :) Но всё зависит от обстоятельств.


    1. AotD
      10.09.2021 18:12

      И почему обязательно отпуск? Может я digital-nomad (читай бомж с ноутбуком), а NAS у меня в бункере Hetzner'а поднят)


  1. Marwin
    10.09.2021 12:42

    А расскажите кто-нить какой щас самый трушный способ бекапиться через Time Machine на виндовый сервер. У меня сейчас там специально только для этого через hyper-v запущена убунта со старым Netatalk, что как бы не комильфо. Может как-то перейти на WSL хотя бы? но я не уверен, что бекап будет адекватно записываться на NTFS. Ну или хотя бы в виртуальной убунте на самбу по smb... но из тех мануалов, что я видел, при smb там что-то монтировать надо в макоси в виде виртуального диска и вообще выглядит как костыли. А запускать на сервере еще одну макось для бекапа в неё... на hyper-v оно не пашет само собой (а мне он нужен для основной работы)... тоже не вариант


    1. zhovner Автор
      10.09.2021 12:49
      +2

      убунта со старым Netatalk

      Вроде бы это уже мертво. Samba более актуальна.


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

      Вроде бы WSL скрывает от линукса NTFS и проблем не должно быть, сам не пробовал.


      из тех мануалов, что я видел, при smb там что-то монтировать надо в макоси в виде виртуального диска

      Это обычное подключение по SMB, только для пользователя это выглядит как сетевой диск. Все удаленные ФС так монтируются, это совершенно нормальное поведение. Мой скрипт делает то же самое. Даже родная эпловая Time Capsule (WiFi роутер с жестким диском) точно так же монтируется.


      1. Marwin
        10.09.2021 12:56

        Вроде бы это уже мертво. Samba более актуальна.

        да, но пока еще работает на big sur

        Вроде бы WSL скрывает от линукса NTFS и проблем не должно быть, сам не пробовал.

        расширенные атрибуты файлов всё равно хранить как-то надо

        Даже родная эпловая Time Capsule (WiFi роутер с жестким диском) точно так же монтируется

        а вот при Netatalk оно ничего не монтирует... со стороны макоси выглядит очень опрятно. Я поэтому и сомневаюсь, что теперь остался только какой-то менее красивый метод.

        PS я сам виндузятник... сорян, если пишу дичь. Но у жены макбук, и надо как-то выкручиваться ))


        1. zhovner Автор
          10.09.2021 13:06

          расширенные атрибуты файлов всё равно хранить как-то надо

          У самбы вроде есть для этого опция https://www.samba.org/samba/docs/current/man-html/vfs_streams_xattr.8.html


          1. Marwin
            10.09.2021 13:14

            это вроде обратная история... когда ты пытаешься сохранить файл с дата стримом из винды с NTFS на самбовую шару на ext.

            А вот как WSL самба будет хранить на NTFS разделе xattr от APFS - это вопрос )


            1. vvzvlad
              12.09.2021 20:55

              Оно же там хранит в блобах все, а не напрямую в файловой системе, не? У меня на линуксовой файловой системе так и есть — просто набор бинарных файликов, а макось как-то сама их монтирует как образ своей фс, внутри которой бекап


  1. click0
    10.09.2021 17:48

    Достаточно было пинговать SMB шару и потом проверять, не в самолете ли бук.


  1. Tiberiy1976
    11.09.2021 23:41

    А почему не использовать для бекапа важных данных iCloud?


    1. zhovner Автор
      12.09.2021 00:41

      Разумеется, у меня есть сервисы для файлов вроде Dropbox, iCloud. Но я хочу, чтобы если у меня украли ноутбук, я покупал новый и через пару часов уже продолжал работать. Есть много вещей в системе, которые нельзя так просто бекапить. Например настройки, системная ключница (сертификаты для подписи программ нельзя засунуть в iCloud ключницу) и многое другое. Вручную дрочиться с бекапом отдельных файлов мне нехватает времени.


    1. vvzvlad
      12.09.2021 20:53

      iCloud отвратительная штука для всего, что чуть больше набора документов. Я попытался засунуть туда 14гб файлов из дропбокса, столкнулся с непонятными глюками, зависаниями синка (вроде все норм, добавляешь файл, он уходит на сервер… и появляться на других устройствах через пару часов) и так далее. Плюс еще и нормально туда папки, находящиеся в других местах не засунешь: если у тебя файлы лежат в Downloads или еще где, не существует нормального способа бекапить их в айклауд.

      Я в итоге добавил к TimeMachine локально еще и Backblaze, который создает пофайловую копию. Восстановиться с нее нельзя, и истории нет(впрочем, ее можно докупить), но в качестве дополнительной копии, которая делается откуда угодно, был бы интернет, подойдет.