Due to the recent pandemic outbreak I had to switch to working from home. At the office I am using MacBook Pro which gets backed up to the dedicated Time Capsule device. It works as expected, nothing extra there. Unfortunately at home I didn’t have such contraption, but I had a custom built NAS based on Ubuntu 18.04 LTS. It turns out that you can emulate Time Machine by using Samba, just need to build it yourself as the one shipped lacks Spotlight support.
Please note that I based this tutorial on Mac TimeMachine with Samba 4.8.* on Ubuntu 18.10 and added some changes to have it working on clean Ubuntu 18.04 LTS. I also changed Samba 4.8.0 to 4.9.18 due to security issues which also fixed compatibility with libtracker-sparql.
First step is to install tools and dependencies required
apt update apt install -y libreadline-dev git build-essential libattr1-dev libblkid-dev autoconf apt install -y python-dev python-dnspython libacl1-dev gdb pkg-config libpopt-dev libldap2-dev apt install -y dnsutils acl attr libbsd-dev docbook-xsl libcups2-dev libgnutls28-dev apt install -y tracker libtracker-sparql-2.0-dev libpam0g-dev libavahi-client-dev libavahi-common-dev apt install -y bison flex avahi-daemon liblmdb-dev libjansson-dev libgpgme-dev libarchive-dev
/etc/avahi/services/timemachine.service with following contents (please note that there are some underscores there that are invisible when rendered but are copied correctly)
<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">%h</name> <service> <type>_smb._tcp</type> <port>445</port> </service> <service> <type>_device-info._tcp</type> <port>0</port> <txt-record>model=TimeCapsule8,119</txt-record> </service> <service> <type>_adisk._tcp</type> <txt-record>sys=waMa=0,adVF=0x100</txt-record> <txt-record>dk0=adVN=TimeMachine Home,adVF=0x82</txt-record> </service> </service-group>
Download Samba source code archive and verify it. You need to unzip the tar file first as tar file is signed and not gzipped file (which is a bit odd).
cd /usr/src wget https://download.samba.org/pub/samba/samba-pubkey.asc gpg --import samba-pubkey.asc wget https://download.samba.org/pub/samba/stable/samba-4.9.18.tar.gz gunzip samba-4.9.18.tar.gz wget https://download.samba.org/pub/samba/stable/samba-4.9.18.tar.asc gpg --verify samba-4.9.18.tar.asc
After confirming its fine, unpack it and build it. On Atom N2800 with 4GB RAM and using pendrive as a storage it takes bit shy of 1 hour
tar -xzvf samba-4.9.18.tar.gz cd samba-4.9.18 ./configure --sysconfdir=/etc/samba --systemd-install-services --with-systemddir=/lib/systemd/system --with-shared-modules=idmap_ad --enable-debug --e nable-selftest --with-systemd --enable-spotlight --jobs=`nproc --all` make --jobs=`nproc --all` make install --jobs=`nproc --all`
Create Samba configuration file
/etc/samba/smb.conf. Please adjust
TimeMachine Home to point at the directory where you want to keep backups. In my case it was /zstorage/backups/timemachine which is stored on ZFS.
[global] # Basic Samba configuration server role = standalone server passdb backend = tdbsam obey pam restrictions = yes security = user printcap name = /dev/null load printers = no socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=524288 SO_SNDBUF=524288 server string = Samba Server %v map to guest = bad user dns proxy = no wide links = yes follow symlinks = yes unix extensions = no acl allow execute always = yes log file = /var/log/samba/%m.log max log size = 1000 # Special configuration for Apple's Time Machine fruit:model = MacPro fruit:advertise_fullsync = true fruit:aapl = yes ## Definde your shares here [TimeMachine Home] path = /zstorage/backups/timemachine/%U valid users = %U writable = yes durable handles = yes kernel oplocks = no kernel share modes = no posix locking = no vfs objects = catia fruit streams_xattr ea support = yes browseable = yes read only = No inherit acls = yes fruit:time machine = yes fruit:aapl = yes spotlight = yes create mask = 0600 directory mask = 0700 comment = Time Machine
Create logs location and storage subdirectory (matching what you defined in previous step). Change USERNAME to your users name. Please note that this user needs to exist on the system running Samba daemon.
mkdir -p /var/log/samba mkdir -p /zstorage/backups/timemachine/ mkdir -m 700 /zstorage/backups/timemachine/USERNAME chown USERNAME /zstorage/backups/timemachine/USERNAME
Update password for the user
/usr/local/samba/bin/smbpasswd -a $USERNAME
Add Samba binaries path to
/etc/profile and re-read the file
echo 'export PATH=/usr/local/samba/bin/:/usr/local/samba/sbin/:$PATH' >> /etc/profile source /etc/profile
Apply a fix to systemd service definition (without it smbd won’t start correctly) and then start the daemon
sed -i 's/Type=notify/Type=simple/g' /lib/systemd/system/smb.service systemctl enable --now smb.service
If you have a firewall running you need to allow port 445 access, for ufw it would be (assuming 192.168.0.0/24 is your LAN)
ufw allow from 192.168.0.0/24 to any port 445
Now you can setup your MacBook to use it the same way as it uses Time Capsule.