Бекап макбуков на удаленный сервер Time Machine для путешественников

Принцип работы утилиты 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

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

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, иначе все ваши файлы будут лежать на сервере в открытом виде.

image-loader.svg

Установка скрипта 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 дней, запускаем бекап.

© Habrahabr.ru