💾 Sauvegarde dès le branchement avec Systemd

| ~ 4 mins | 808 mots

Introduction

Dans l’article sur mon processus de gestion de photos, je notais que je n’avais pas poussé l’automatisation à fond sur la partie sauvegardes du contenu des cartes avec le NAS. C’est maintenant chose faite. Je vais donc dans cette logique, expliquer ici comment on peut facilement gérer ce type d’automatisation avec udev et systemd.

Enregistrement automatique de carte sd

Le principe est assez simple :

Créer une règle Udev

Systemd n’est pas capable par lui-même d’écouter les évènements provenant des périphériques. Le logiciel permettant cela est udev. Il faut donc rajouter une nouvelle règle .rules dans le dossier /etc/udev/rules.d/.

📝 Note : j’ai volontairement affiché ici que quelques résultats de la commande.

$ udevadm info --query=all --name=/dev/mmcblk0
…
N: mmcblk0
…
E: SUBSYSTEM=block
…
E: DEVNAME=/dev/mmcblk0
…
$ udevadm info --query=all --name=/dev/mmcblk0p1
…
N: mmcblk0p1
…
E: SUBSYSTEM=block
…
E: DEVNAME=/dev/mmcblk0p1

Il est assez facile dans le cas présent de bien filtré dans mon cas :

/etc/udev/rules.d/20-automount_sd_cards.rules

# Automount sd card on insertion
ACTION!="remove", SUBSYSTEM=="block", KERNEL=="mmcblk0p*", ENV{SYSTEMD_WANTS}+="mnt-sdcard.mount"

Ce qui signifie :

📝 Note : Il est préférable pour des raisons de fiabilité d’utilisé ACTION!="remove" plutôt que ACTION=="add".

Point de montage

Les points de montages avec systemd peuvent être aussi bien créé avec des fichiers .mount qu’avec une syntaxe /etc/fstab. Aucune des deux méthodes n’est plus valable. La mécanique de .mount à l’avantage/le désavantage de produire des fichiers séparer pour chaque point de montage, ce qui est à la fois plus complexe, mais bien plus pratique, notamment si vous cherchez à empaqueter la configuration.

Attention le nommage doit “correspondre” au point de montage ainsi mnt-sdcard correspond à /mnt/sdcard

/etc/systemd/system/mnt-sdcard.mount

[Unit]
Description=Mount SD Card
# liaison forte à save_photos.service, 
# - Demande que save_photos.service soit activé
# - s'arrètera quand save.photos.service s'arrêtera.
BindsTo=save_photos.service

[Mount]
What=/dev/mmcblk0p1
Where=/mnt/sdcard
# On préfèrera ne pas monter la carte en écriture.
Options=ro

Avec ce point de montage, systemd sait maintenant, qu’en cas d’activation de mnt-sdcard.mount:

Service de sauvegarde

On peut maintenant faire la sauvegarde a proprement dit :

/etc/systemd/system/save_photos.service

[Unit]
# liaison forte à mnt-sdcard.mount
# - Demande que mnt-sdcard.mount soit activé.
# - s'arrètera quand  mnt-sdcard.mount s'arrêtera.
# - On met une relation d'ordre pour que le montage s'execute avant.
After=mnt-sdcard.mount
BindsTo=mnt-sdcard.mount
# On empêche le démarrage manuel, seul mnt-sdcard.service doit démarrer ce service
RefuseManualStart=true

[Service]
# on démarre le service avec les droits utilisateur
User=inkey
# le type oneshot permet facileent de cumuler les commandes
Type=oneshot
# Photos
ExecStart=/home/inkey/.local/bin/phockup /mnt/sdcard/ /home/inkey/Images/Photos/ -c 6 --progress --file-type image
# Video
ExecStart=/home/inkey/.local/bin/phockup /mnt/sdcard/ /home/inkey/Vidéos/Perso/ -c 6 --progress --file-type video

📝 Note : j’ai installé phockup dans $HOME/.local/bin pour le moment

Aller plus loin ?

Notification

Le système ici ne notifie ni quand la copie est démarré ni quand elle est finie. Pour ma part, j’ai complété ce mécanisme avec des commandes qui me notifie avec xmpp. C’est très facile avec ExecStartPre et ExecStartPost.

Sécurisation

Si vous voulez vous amuser un peu, vous pouvez sécuriser un peu plus le service à l’aide de: systemd-analyze security save_photos.service

Mécanisme de Sauvegarde de données hors-ligne (“backup”)

La mécanique pourrait être ajusté pour gérer un système de sauvegarde du contenu du NAS :

C’est une méthode à la fois simple et efficace pour pouvoir faire des sauvegardes et s’assurer de cette façon que la sauvegarde est bel et bien offline.

Conclusion

Il est assez facile de gérer les points de montage avec systemd pour ce type d’usage. Bref Systemd, c’est sympa, c’est puissant, n’hésitez pas à jouer avec 😃.