đŸ Sauvegarde au branchement avec Systemd: Photos
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 monitorpermet 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,mmcblk0p1dans/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 đ.