Time Machine Backup Target

Time Machine Backup Target

We will install Net talk to provide APF and Avahi to advertise and host on a external drive. The RPI4B firmware natively supports USB 3.0 and booting from SSD drives. Will boot from the SD card as want separate data partition. Booting from SSD is not the issue. With a 4 and latest OS it is a case of selecting the SSD drive instead of a SD card when writing the image. I want to be able to replace the data directory as required so proceeding with an separate drive. The bigger picture is to replace the XEON based device that hosts ~ 4TB for backups. There must be a RAID option with external power for the capacity but for now going with a WD 240TB Green Drive to verify its operation.

Using the ‘Green’ range as they are designed to be low power / preformance. The SSD will consume 0.60A (2.8W) and transfer over SATA III (6 Gb/s). The RPI4B is able to supply a total of 1.2 amps to its 4 USB ports if the RPi4B is powered from a 3 amp power supply and supports USB3 interface (5 Gb/s) so will be a practical match.

First ensure OS is up to date;

# sudo apt-get update && sudo apt-get upgrade -y

hfsplus partition.

Here I will format an USB3 SSD hard drive using hfsplus.

# sudo apt-get install hfsutils hfsprogs -y

So this is what an fdisk -l shows when the device has the SD card to boot and OS (/dev/mmcdlk0p1/2) and ext SSD drive with single partition (/dev/sda);

 Disk /dev/mmcblk0: 14.9 GiB, 15931539456 bytes, 31116288 sectors
 Units: sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disklabel type: dos
 Disk identifier: 0x74129c0a
 Device         Boot  Start      End  Sectors  Size Id Type
 /dev/mmcblk0p1        8192   532479   524288  256M  c W95 FAT32 (LBA)
 /dev/mmcblk0p2      532480 31116287 30583808 14.6G 83 Linux
 Disk /dev/sda: 223.6 GiB, 240065175552 bytes, 468877296 sectors
 Disk model: 40G2G0A-00JH30  
 Units: sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disklabel type: gpt
 Disk identifier: 7CEE32DA-6AA7-45DF-83B3-CBB22D661899
 Device     Start       End   Sectors   Size Type
 /dev/sda1   2048 468877262 468875215 223.6G Linux filesystem

Will format as hfplus as native filesystem of Mac OS X and label accordingly;

# sudo mkfs.hfsplus /dev/sda1 -v TimeMachine

Create mount point and update permissions to allow user access;

# sudo mkdir /media/tm && sudo chmod -R 777 /media/tm && sudo chown root:users /media/tm

Determine the UUID of your USB hard drive as will be use for fstab;

$ ls -lha /dev/disk/by-uuid
 total 0
 drwxr-xr-x 2 root root 100 Oct  7 13:13 .
 drwxr-xr-x 7 root root 140 Oct  7 13:13 ..
 lrwxrwxrwx 1 root root  15 Oct  7 13:13 7616-4FD8 -> ../../mmcblk0p1
 lrwxrwxrwx 1 root root  15 Oct  7 13:13 87b585d1-84c3-486a-8f3d-77cf16f84f30 -> ../../mmcblk0p2
 lrwxrwxrwx 1 root root  10 Oct  7 13:13 95042b43-d161-3363-b0a8-99291c5789d1 -> ../../sda1

then edit fstab to mount the USB hard drive on boot;

proc            /proc           proc    defaults          0       0
PARTUUID=74129c0a-01  /boot           vfat    defaults          0       2
PARTUUID=74129c0a-02  /               ext4    defaults,noatime  0       1
UUID=95042b43-d161-3363-b0a8-99291c5789d1    /media/tm hfsplus force,rw,user 0 0 
tmpfs /var/tmp tmpfs nodev,nosuid,size=512M 0 0 
tmpfs /tmp tmpfs nodev,nosuid,size=512M 0 0

Test that mounting works as expected;

$ sudo mount -a
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
 /dev/root        15G  3.1G   11G  23% /
 devtmpfs        776M     0  776M   0% /dev
 tmpfs           937M     0  937M   0% /dev/shm
 tmpfs           937M  8.6M  928M   1% /run
 tmpfs           5.0M  8.0K  5.0M   1% /run/lock
 tmpfs           937M     0  937M   0% /sys/fs/cgroup
 tmpfs           512M     0  512M   0% /var/tmp
 tmpfs           512M  4.0K  512M   1% /tmp
 /dev/sda1       224G  184G   41G  82% /media/tm
 /dev/mmcblk0p1  253M   50M  204M  20% /boot
 tmpfs           188M     0  188M   0% /run/user/109
 tmpfs           188M     0  188M   0% /run/user/1001


Netatalk provides Apple Filing Protocol (APF) which is Apple’s proprietary network protocol for delivering files over a network. It is Apple’s alternative to the Server Message Block (SMB) and Network File System (NFS) protocols. Version 3.x is now available from the Pi repository so can install wit apt-get .

# sudo apt-get install netatalk -y

check netatalk installed version 3.x;

# netatalk -V
 netatalk 3.1.12 - Netatalk AFP server service controller daemon
 This program is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation; either version 2 of the License, or (at your option) any later
 version. Please see the file COPYING for further information and details.
 netatalk has been compiled with support for these features:
Zeroconf support:    Avahi  
Spotlight support:    Yes               
afpd:    /usr/sbin/afpd         
cnid_metad:    /usr/sbin/cnid_metad    
tracker manager:    /usr/bin/tracker daemon        
dbus-daemon:    /usr/bin/dbus-daemon           
afp.conf:    /etc/netatalk/afp.conf  
dbus-session.conf:    /etc/netatalk/dbus-session.conf 
netatalk lock file:    /var/lock/netatalk

update /etc/nsswitch;

# /etc/nsswitch.conf
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files
group:          files
shadow:         files
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4 mdns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

and update afp.conf;

# /etc/netatalk/afp.conf
; Netatalk 3.x configuration file
  mimic model = TimeCapsule6,106

[Time Machine]
  path = /media/tm
  time machine = yes

Adding the following will allow support for home directories.

  basedir regex = /home


Avahi is a software solution enabling an easy-to-use, zero-configuration local network. It is a GNU alternative to Apple’s Bonjour software solution allowing communication between your Pi and your Mac.

At first, we will install all the prerequired elements for Avahi :

sudo apt-get install db5.1-util libgcrypt11-dev avahi-daemon libavahi-client-dev libdb5.3-dev -y

Now that Avahi is installed, we need to make sure that it starts at the boot of the Raspberry Pi. To do this, just type the following command :

sudo update-rc.d avahi-daemon defaults
sudo service avahi-daemon start
sudo service netatalk start

then reboot the PI.

You should be able to see the device from the Mac in finder with Time Capsule icon. There wont be home directories as yet but will be able to select and use the disk for Time Machine.


During the process of building mirrors and testing (decided to use HW over software) managed to break the config more that once. Issues would manifest as an inability to boot and connecting a screen to the device didn’t always enable a resolution. However being able to pull the SD card and mount in another device then edit proved invaluable. So the practice is to build the boot disk on SD card, test and once stable write the SD card to the SSD drive.

# Write SD card to SSD drive. dmesg to conform device names
sudo dd of=/dev/sdf if=/dev/sde bs=4096k status=progress

# repair dirty fs
sudo fsck /dev/sda1

# use Disk ID in fstab
sudo blkid
ls -lha /dev/disk/by-uuid

# edit fstab once mounted in another device 
proc            /proc           proc    defaults          0       0
PARTUUID=75030815-01  /boot           vfat    defaults          0       2
PARTUUID=75030815-02  /               ext4    defaults,noatime  0       1
UUID=b878672f-e52f-451e-bd08-ebee78718437  /mnt/timemachine      ext4    defaults,errors=remount-ro 0	0 
tmpfs /var/tmp tmpfs nodev,nosuid,size=256M 0 0 
tmpfs /tmp tmpfs nodev,nosuid,size=1024M 0 0

sudo fsck.hfsplus -f /dev/sda1

Software RAID straight forward;

sudo apt-get install mdadm -y

sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="E183-6233" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="75030815-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="1232a209-2596-48f0-a078-731d10b918ad" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="75030815-02"
/dev/sdb1: LABEL="4TB02" UUID="6ec671a5-b278-4c1f-b246-2c5a3b0327c2" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="67924807-e66f-3b47-9655-c62f6c2a4896"
/dev/sda1: LABEL="4TB01" UUID="74bd0e3c-332b-4b9a-a738-403e06a2ffdf" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="47d25b7e-39b9-2b49-adc8-61282cc279fd"

sudo mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm --detail --scan

sudo -i
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
mkfs.ext4 -v -m .1 -b 4096 -E stride=32,stripe-width=64 /dev/md0

# Add to /etc/fstab
UUID=5af30b6a-2ce2-45ac-92ca-f4559c02c97e /mnt/raid0 ext4 defaults 0 0