Если кто не знает, Time Machine — это такой замечательный бэкап-сервис из коробки для Apple OS X, тут и тут можно почитать поподробнее. Если у вас есть мак, и вы не пользуетесь «машиной времени», то это совершенно напрасно. Time Machine делает постоянные дифференциальные бэкапы, поэтому она удобна даже в случае прекрасной жизни ваших HDD / SSD. Можно в любой момент открутить назад историю и восстановить случайно удаленный файл, или, что еще важнее, предыдущую версию измененного файла.
Предполагается, что пользователи будут использовать либо обычный жесткий диск, либо специальный сетевой девайс Time Capsule. Традиционный внешний жесткий диск — решение для очень организованных людей, которые регулярно (хотя бы ежедневно) будут его подключать для автоматического бэкапа, иначе польза от тайм машины будет весьма ограничена (хотя прошлогодний бэкап все же лучше, чем совсем ничего). С тайм-капсулой будет гораздо удобнее и надежнее. Кроме функции бэкапа, она может выполнять еще и функцию сетевой шары, раздачи Wi-Fi (фактически Time Capsule — это Wi-Fi роутер с HDD). Но устройство стоит денег, и оно не такое универсальное. Мне захотелось прикрутить на свой сервер работающий на Ubuntu возможность делать бэкапы тайм-машиной. И это не так сложно, о чем и будет эта заметка.
Итак у нас Ubuntu 12.04 LTS. Необходимая нам функциональность находится в пакете netatalk, это опенсорсная реализация протокола AppleTalk, также нам понадобится поставить пакет avahi-daemon для реализации zeroconf инфраструктуры в нашей сети, в данном случае это имитация любимого яблочной техникой Bonjour.
avahi-daemon можно поставить сразу:
sudo aptitude install avahi-daemon
C netatalk чуть сложнее, на момент написания заметки уже вышла релизная версия 2.2.2 с кучей новых фиксов (см. http://netatalk.sourceforge.net), а в репах убунты все еще была версия полугодовалой давности 2.2.1. Я захотел поставить версию новее. Это можно сделать сборкой из исходников, но в тот момент можно было сделать и по-другому. На launchpad уже появился готовенький пакет 2.2.2, так что качаем его и ставим.
wget http://launchpadlibrarian.net/103717335/netatalk_2.2.2-1_amd64.deb
sudo dpkg -i netatalk_2.2.2-1_amd64.deb
Далее необходимо сконфигурировать сервисы.
Создаем файл afpd.service, который описывает конкретные сервисы раздаваемые по AppleTalk Filing Protocol демоном afpd:
sudo nano /etc/avahi/services/afpd.service
со следующим содержимым:
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
<service>
<type>_device-info._tcp</type>
<port>0</port>
<txt-record>model=Xserve</txt-record>
</service>
</service-group>
Здесь можно изменить имя сервиса и иконку удаленного компьютера, которые отображаются в Finder на маке, за них отвечают строки
<name replace-wildcards="yes">%h</name>, где %h — имя компьютера (host);
<txt-record>model=Xserve</txt-record>, где вместо Xserve можно поставить: Macmini, iMac, MacPro, Xserve, MacBook, MacBookPro, MacBookAir.
Далее конфигурируем netatalk. Конфиг в /etc/default/netatalk можно не менять, все должно работать и так. А вот /etc/netatalk/AppleVolumes.default нужно изменить.
sudo nano /etc/netatalk/AppleVolumes.default
Переходим в конец файла (Ctrl + V бегать по страницам быстрее).
Добавляем строчку:
/data/backups/TimeMachine "TimeMachine" cnidscheme:dbd options:tm,upriv,usedots allow:alex
, где /data/backups/TimeMachine — путь к каталогу, в котором будут храниться бекапы;
«TimeMachine» — имя расшаренного ресурса.
В options должно быть tm — ресурс для тайм-машины.
allow:alex — пользователь, имеющий доступ к каталогу. Он (в данном случае alex) должен быть на вашем сервере (я еще для удобства сделал так, чтобы пользователь на убунте и на маке имел одно имя), создать пользователя можно с помощью команды useradd.
Можно добавить еще разделяемую шару, например:
/data/common "Common" cnidscheme:dbd options:usedots,upriv dperm:0776 fperm:0666 allow:@shares
Тут в опциях уже не надо указывать tm.
Здесь dperm:0777 fperm:0666 — права на создаваемые каталоги и файлы,
allow:@shares — доступ только пользователям входящим в группу shares (создать группу можно с помощью groupadd, а добавить пользователя в существующую группу usermod -a -G groupname username)
Права и группа — для того, чтобы данной шарой можно было удобно пользоваться несколькими людьми. Для этого людям создаются учетки, и им добавляется группа shares. К сожалению, я не нашел возможности сделать как в самбе, чтобы новые файлы создавались от имени группы, поэтому пришлось дать полные права для others, иначе файлы, созданные одним человеком не могли бы редактироваться другими.
Рестартуем сервис:
sudo service netatalk restart
Перезапуск avahi
sudo service avahi-daemon restart
Вот в общем и все.
PS
Хотя нет, без напильника не обошлось. Т.е. сразу нифига не заработало, симптом такой: в файндере пробуем подключиться к шаре, а он говорит, что там ничего и нет, куда подключаться? Оказалось, что afpd не стартанул толком.
cat /var/log/syslog
давал следующее:
May 12 03:13:26 mini-server afpd[13367]: =============================================================== May 12 03:13:26 mini-server afpd[13367]: INTERNAL ERROR: Signal 11 in pid 13367 (2.2.2) May 12 03:13:26 mini-server afpd[13367]: =============================================================== May 12 03:13:26 mini-server afpd[13367]: BACKTRACE: 3 stack frames: May 12 03:13:26 mini-server afpd[13367]: #0 /usr/sbin/afpd(netatalk_panic+0x1c) [0x7fd5ac5e6b0c] May 12 03:13:26 mini-server afpd[13367]: #1 /usr/sbin/afpd(+0x53c0c) [0x7fd5ac5e6c0c] May 12 03:13:26 mini-server afpd[13367]: #2 /lib/x86_64-linux-gnu/libc.so.6(+0x364c0) [0x7fd5aaf444c0]
Гугление проблемы дало вариант решения. Открываем /etc/netatalk/afpd.conf:
sudo nano /etc/netatalk/afpd.conf
и меняем самую последнюю строчку на
- -tcp -noddp -uamlist uams_dhx.so,uams_dhx2_passwd.so -nosavepassword
Проблема оказалась в библиотеке uams_dhx2.so, которая не дружит с Lion, помогла замена на uams_dhx2_passwd.so.