Un Raspberry Pi 3 B+ comme serveur Time Machine en SMB

Depuis quelques années, je vois des gens qui essayent de transformer un Raspberry Pi en serveur Time Machine (j’ai même écrit des articles sur le sujet). Mais c’est une mauvaise idée : le Raspberry Pi est lent (seulement 100 Mb/s en Ethernet) et le support de la sauvegarde en AFP sur les logiciels libres manque de fiabilité. Mais avec l’arrivée du Raspberry Pi 3 B+ et de la sauvegarde en SMB, ça devient un peu plus viable.

Avant de commencer, un peu d’explications : ce que je fais ici, c’est de la proof of concept, pour montrer que ça fonctionne. Si vous ne connaissez pas bien Linux (c’est d’ailleurs mon cas), ça risque d’être un long calvaire. Si vous voulez utiliser un Raspberry Pi comme serveur Time Machine (ce qui n’est pas réellement une bonne idée, soit dit en passant) et que le côté découverte ne vous intéresse pas, attendez quelques mois, le temps que les bonne versions arrivent directement dans les distributions. Actuellement, il faut compiler certains trucs manuellement et c’est franchement lourd.

La sauvegarde en SMB, j’en ai déjà parlé : c’est disponible depuis Sierra, c’est plus fiable que l’AFP dans les implémentations tierces et ça fonctionne assez bien. Avec Samba 4.8 (qui date de mars 2018), c’est proposé nativement. Bon, le problème qui se pose, c’est que le Raspberry Pi ne propose que Samba 4.5, donc au moment d’écrire ces lignes (mai 2018), il faut compiler manuellement Samba.

Le Raspberry Pi 3 B+ permet d’améliorer (un peu) les performances en utilisant une puce plus rapide pour l’Ethernet. Ce n’est pas extraordinaire, mais ça reste plus rapide. En fait, ils utilisent un adaptateur Ethernet 1000 mais interfacé en USB 2.0 (comme l’ancien). Dans des tests théoriques, on peut atteindre 300 Mb/s environ (et pas 1000, donc). En pratique, avec un disque dur externe en USB sur le même bus, on est plus proche des 150 Mb/s (entre 160 et 260 Mb/s). C’est mieux que les anciens modèles, mais assez lent tout de même pour des sauvegardes.

La compilation

On peut espérer que ça changera un jour (Debian/Raspbian n’est pas la distribution la plus rapide pour intégrer les nouveautés) donc pour le moment, c’est franchement lourd à installer. Il faut installer manuellement Samba 4.8, qui a besoin de dépendances qui ne sont pas à jour dans Raspbian, donc il faut installer manuellement des trucs avant.

Première étape, donc, la dernière version d’OpenLDAP (en vrai, je ne suis même pas totalement certain que c’est nécessaire, mais dans le doute, je l’ai installé). Parce que Samba 4.8 demande OpenLDAP 2.4.46 et Raspbian n’installe au mieux que la 2.4.44. Je commence pas un tas de dépendances nécessaires pour Samba.

apt-get install -y libreadline-dev git build-essential libattr1-dev libblkid-dev autoconf python-dev python-dnspython libacl1-dev gdb pkg-config libpopt-dev libldap2-dev dnsutils acl attr libbsd-dev docbook-xsl libcups2-dev libgnutls28-dev tracker libtracker-sparql-1.0-dev libpam0g-dev libavahi-client-dev libavahi-common-dev bison flex

sudo apt-get install libdb-dev
wget ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.46.tgz
gunzip -c openldap-2.4.46.tgz | tar xf -
cd openldap-2.4.46/
./configure
make depend
make
sudo make install

Ensuite, la compilation de Samba 4.8.

wget https://download.samba.org/pub/samba/stable/samba-4.8.0.tar.gz
tar -xzvf samba-4.8.0.tar.gz
cd samba-4.8.0
./configure --systemd-install-services --with-shared-modules=idmap_ad --enable-debug --enable-selftest --with-systemd --enable-spotlight --prefix=/opt/samba4
make
sudo make install

Ca prend du temps, genre 1 heure sur un raspberry Pi 3+ ('build' finished successfully (59m40.944s)).

Une fois installé, j’ai mis Samba4 dans le path, en modifiant directement /etc/profile. Il faut ajouter la seconde ligne à la fin.

sudo nano /etc/profile
export PATH=$PATH:/opt/samba4/bin:/opt/samba4/sbin

Le disque dur

Alors, j’ai d’abord tenté avec un disque dur formaté en HFS+, comme dans les tutoriaux pour l’AFP. Mais j’avais un comportement bizarre, donc je suis passé en ext4 (plus simple). Il faut connecter un disque dur externe (dans mon cas un PiDrive de 314 Go) et le formater en ext4.

Cette commande donne la liste des trucs connectés. Le disque dur doit être /dev/sda1 ou /dev/sda2 généralement.

sudo fdisk -l

On formate le disque dur en ext4 avec le nom TimeMachine.

sudo mkfs.ext4 /dev/sda2 -L TimeMachine

Le résultat donne la liste des disques avec l’UUID (notez-le).

sudo blkid

Les dossiers pour le montage du disque.

mkdir -p /media/time_machine
sudo chmod -R -f 777 /media/time_machine

Dans la suite, deux commandes pour créer un point de montage. Ensuite, dans le fichier fstab, entrez les valeurs nécessaires pour monter le disque dur au démarrage. La seconde ligne, à placer à la fin, contient les paramètres. Mettez l’UUID du disque.

sudo nano /etc/fstab
UUID=votre_UUID /media/time_machine ext4 defaults 0 2

Enfin, le fichier de configuration de Samba. Il contient la base pour tester, et il partage le disque dur qui est dans /media/time_machine.

sudo nano /opt/samba4/etc/smb.conf

[global]
map to guest = Bad User
vfs objects = catia fruit streams_xattr
log file = /var/log/samba/%m
log level = 2
mdns name = mdns

# Time Machine
fruit:veto_appledouble = no
fruit:encoding = native
fruit:metadata = stream

# Security
server min protocol = SMB2

[Time Machine]
fruit:time machine = yes
path = /media/time_machine
guest only = yes
writeable = yes

Maintenant, on peut tester en lançant manuellement Samba.

sudo /opt/samba4/sbin/smbd -s /opt/samba4/etc/smb.conf

Sur le Mac, le partage doit apparaître et vous devez pouvoir lire, écrire et effacer (pas trivial, dans mes premiers essais, je pouvais lire et écrire mais pas modifier) (pas très pratique). Dans Time Machine, vous pouvez ajouter le disque dur, qui devrait permettre la sauvegarde. Il faut se connecter en Invité quand macOS le demande. Au passage, si vous avez une erreur OSS17 à l’ajout, rien de grave : il faut se déconnecter du disque avant l’ajout dans le Finder.

Ajouter le disque dur


Se connecter


En invité


L’erreur fatale (ou pas)

Les performances

C’est le moment amusant. En SMB, en testant avec un logiciel de test, j’arrive à ~20 Mo/s en écriture (~160 Mb/s) et ~35 Mo/s en lecture (la limite de l’USB 2.0 avec un disque dur), soit ~260 Mb/s. Le Raspberry Pi 3 B+ peut difficilement dépasser ça : l’Ethernet et le disque dur se partagent un unique bus USB 2.0 à 480 Mb/s en théorie. Lors de mes premiers tests avec le Raspberry Pi 3 B+ et une alimentation de 12 W (2,4 A, issue d’un iPad), les sauvegardes plantaient assez rapidement. Je me suis rendu compte que mon alimentation ne suffisait pas, même en utilisant un disque dur qui consomme peu. Ca doit marcher avec un modèle alimenté, mais pour les tests, je me suis rabattu sur un Rasperry Pi 2 (v2) qui consomme beaucoup moins, sans aucun souci.

Pas extraordinaire

En pratique, si vous voulez utiliser le Pi 3 B+ et son Ethernet un peu plus rapide, pensez à installer une bonne alimentation ou un disque dur qui a sa propre alimentation.

Lancer Samba au démarrage

Normalement, on peut lancer Samba au démarrage automatiquement avec systemd. Sauf que comme j’ai bidouillé et tâtonné pas mal… ça ne marche pas. Ma solution artisanale fonctionne, mais ce n’est pas très propre.

La méthode que j’ai utilisé est celle qui passe par init.d. Première chose, copiez le contenu de ce fichier dans le presse-papier.

Ensuite, tapez la commande suivante, collez le contenu dans le fichier et modifiez les trois lignes qui suivent.
sudo nano /etc/init.d/samba4

dir="/home/pi"
cmd="sudo /opt/samba4/sbin/smbd -s /opt/samba4/etc/smb.conf"
user="pi"

Ensuite, tapez ces deux commandes et redémarrez.

sudo chmod 755 /etc/init.d/samba4
sudo update-rc.d samba4 defaults

Normalement, si tout se passe bien, le partage démarre automatiquement.

Pour terminer, je le rappelle : ce n’est pas une façon propre de le faire. Il vaut mieux attendre que Samba 4.8 soit intégré directement dans les distributions, pour profiter d’une installation propre et dans les règles. Mais ça montre que ça reste possible de l’utiliser.