Transformer le Raspberry Pi en Time Machine
Pour ceux qui ont un Mac, vous connaissez Time Machine qui permet de faire des sauvegardes incrémentales de votre système vers un disque dur ou une Time Capsule. Nous allons voir comment transformer notre Raspberry Pi Home Server en une Time Capsule.
Dans l‘article de préparation du disque dur nous avions créé une partition HFS+. C’est le format qui doit être utilisé pour pouvoir sauvegarder vos données depuis le Mac. Nous allons voir comment la préparer et comment connecter le Mac vers le Raspberry Pi.
- Installer le service avahi si ce n’est pas déjà (voir l’article sur AirPlay)
apt-get install avahi-daemon libavahi-client-dev libdb5.3-dev db-util db5.3-util libgcrypt11 libgcrypt11-dev
- Télécharger Netatalk 3.0 (avec wget par exemple). A l’écriture de cet article,il semble que la version 3.1 ne fonctionne pashttp://sourceforge.net/projects/netatalk/files/netatalk/3.0/netatalk-3.0.tar.gz/download
- Lancer la configuration, la compilation et l’installation
cd netatalk-3.0 ./configure --with-init-style=debian --with-zeroconf make make install
- Installer les packages contenant les outils pour les partitions HFS
apt-get install hfsplus hfsutils hfsprogs
- Créer la partition HFS+
mkfs.hfsplus /dev/sda1
- Désactiver le journaling sur la partition HFS+ sinon l’enregistrement Time Machine ne fonctionnera (et le disque ne sera pas trouvé)
- Aller dans le home
- Créer un fichier disable.c en y copiant le contenu suivant
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/mman.h> #include <fcntl.h> #include <byteswap.h> int main(int argc, char *argv[]) { int fd = open(argv[1], O_RDWR); if(fd < 0) { perror("open"); return -1; } unsigned char *buffer = (unsigned char *)mmap(NULL, 2048, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if(buffer == (unsigned char*)0xffffffff) { perror("mmap"); return -1; } if((buffer[1024] != 'H') && (buffer[1025] != '+')) { fprintf(stderr, "%s: HFS+ signature not found -- aborting.n", argv[0]); return -1; } unsigned long attributes = *(unsigned long *)(&buffer[1028]); attributes = bswap_32(attributes); printf("attributes = 0x%8.8lxn", attributes); if(!(attributes & 0x00002000)) { printf("kHFSVolumeJournaledBit not currently set in the volume attributes field.n"); } attributes &= 0xffffdfff; attributes = bswap_32(attributes); *(unsigned long *)(&buffer[1028]) = attributes; buffer[1032] = '1'; buffer[1033] = '0'; buffer[1034] = '.'; buffer[1035] = '0'; buffer[1036] = 0; buffer[1037] = 0; buffer[1038] = 0; buffer[1039] = 0; printf("journal has been disabled.n"); return 0; }
- Compiler le programme
gcc disable.c
- Désactiver le journal
./a.out /dev/sda1
- Créer un user timemachine. Mémorisez le mot de passe que vous allez choisir il sera demandé sous Time Machine pour accéder au disque
adduser timemachine
- Créer le point de montage de la partition
mkdir /media/usbdrive/timemachine
- Modifier les droits du point de montage avec le user et le groupe créé à l’étape 7
chown timemachine:timemachine /media/usbdrive/timemachine
- Monter la partition /dev/sda1 avec le user timemachine en lecture/écriture. Ajouter la ligne suivante dans /etc/fstab
/dev/sda1 /media/usbdrive/timemachine hfsplus force,rw,uid=timemachine,gid=timemachine 0 0
- Vous pouvez tester le bon fonctionnement du montage
mount /dev/sda1
La commande mount doit vous afficher la ligne suivante (à la suite des autres points de montage)
/dev/sda1 on /media/usbdrive/timemachine type hfsplus (rw,relatime,umask=22,uid=1001,gid=1002,nls=utf8)
- A ce stade, le disque est prêt. Il reste à le rendre disponible sur le réseau. Pour cela, on commence par configurer netatalk. Editer le fichier /usr/local/etc/afp.conf pour définir où se trouve le répertoire pour Time Machine
[Global] uam list = uams_guest.so, uams_dhx.so, uams_dhx2.so, [Time Machine Raspberry] path = /media/usbdrive/timemachine time machine = yes
- Créer le fichier /etc/avahi/services/afpovertcp.service. Le Raspberry Pi va apparaitre avec l’icône d’un serveur Mac.
<?xml version="1.0" standalone='no'?><!--*-nxml-*--> <!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>548</port> <txt-record>model=Xserve</txt-record> </service> </service-group>
- Relancer les services netatalk et avahi
update-rc.d netatalk defaults service netatalk restart service avahi-daemon restart
- Maintenant dans le finder, vous devez voir votre Raspberry Pi
Le Raspberry Pi dans le Finder
- Ouvrir les préférences Time Machine, choisir le disque
Choix du disque sous Time Machine
- Saisir le user timemachine et son mot de passe
Saisie du user et mot de passe pour Time Machine
- Et voilà, la sauvegarde est en cours !
Sauvegarde Time Machine en cours
Voilà. Une belle Time Capsule, certes sans le beau logo d’Apple mais pas au prix d’Apple non plus ! 😉