💾 Sauvegarde dès le branchement avec Systemd
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 :
- Je branche une carte SD à mon NAS.
- La carte est détecté et est monté par le système.
- Le système démarre la sauvegarde, ici avec le logiciel `phockup qui me trie en même temps le tout.
- Le système démonte la carte automatiquement lorsque la sauvegarde est terminé.
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/
.
-
la commande
udevadm monitor
permet d’écouter les évènements Udev, elle nous permet ainsi de pouvoir constater que l’évènement de branchement/débranchement de la carte est bien défini. Cela me permet ainsi de découvrir que le peripheral de carte SD, est, dans mon cas/dev/mmcblk0
. -
Il est possible d’en savoir plus tant que le périphérique est branché avec la commande :
udevadm info --query=all --name=<devname>
, elle retourne plein d’informations par périphérique qu’on pourra ensuite utilisé pour notre règle.
📝 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 :
- Si une action provenant d’un périphérique de système block d’un périphérique donc le nom kernel commence par
mmcblk0p
(une partition de mmcblk0) active un évènement qui n’est pas “remove”, alors, on demande à activer l’unité systemdmnt-sdcard.mount
📝 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
:
- qu’il doit monter la 1ére partition de
mmcblk0
,mmcblk0p1
dans/mnt/sdcard
. - qu’il doit la monter en lecture seule.
- qu’il doit démarrer
save_photos.service
. Les cartes SD de photos ne contenant qu’une seule partition, cela rend les choses plus simples.
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 :
- on branche un disque
- le système détecte qu’il s’agit d’un disque de sauvegarde, probablement à l’aide d’un label de partition.
- la sauvegarde commence.
- la sauvegarde se termine et le disque est démonté automatiquement
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 😃.