Régles UDEV et UDISK se bloquent

Bonjour,
j’ai créer une régle UDEV pour qu’au raccordement d’un disque dur externe, HDD dans boitier USB, elle lance un script pour rsync.

ACTION=="add",ENV{ID_FS_LABEL}=="Sauvegardes2", ENV{ID_MODEL}=="003-9VT166", RUN+="/usr/local/bin/rsync-USB.sh"

La régle UDEV fonctionne, elle lance bien mon script qui est en bash sinon erreur.
Le problème c’est que kde le monte automatiquement via UDISK je pense ou plasma mais après que mon script soit fini.
Donc mon contôle du montage de la partition indique que c’est pas monté donc le script se termine et ensuite le disque se monte dans la seconde.
j’ai mis 99 a ma régle UDEV.
Merci.
Cordialement.

C’est bien galére mon histoire.
Donc même avec un 99 ma régles udev passe avant et donc quand je lance le script le disque n’est pas monté.
de plus comme c’est lancer via udev la commande mount est sans effet.

Si je j’aujoute via kde mon script il echoue si je le lance au clic droit via la notification de connexion car pas en root.

Donc comment faire pour demander le mot de passe root en gui pour lancer un script ?

une idée :

  1. tu mets sur le DD un fichier genre /media/monDD/DemarrageScript
    tu fais un cron qui lances ton script uniquement quand le fichier /media/monDD/DemarrageScript existe , fichier qui n’existe que quand le DD est monté
  2. dans le même genre un script cron+bash qui vérifie si quelquechose de nouveau est monté

tu as aussi pkexec pour éxécuter un root

J’ai fait avec pkexec « mon script » dans action du périphérique justement.
Maintenant l’idéal serait que pkexec me lance une console qui me lance le script pour avoir en direct le déroulement !!!
mais

pkexec  "/usr/bin/konsole -e rsync-USB.sh" "$@"
Error accessing /usr/bin/konsole -e rsync-USB.sh: No such file or directory

Une idée ?

Executer un scrip à chaque fois qu’un disque USB est connecté.:

SUBSYSTEM=="block", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/usr/local/bin/rsync-USB.sh'$env{ID_SERIAL}' '$links' '$devnode'"

Pour que ce soit avec un disque spécifique, c’est avec la règle ACTION:

ATTR{idVendor}=="VVVV", ATTR{idProduct}=="PPPP", ACTION=="add", RUN+="/usr/local/bin/rsync-USB.sh '$env{ID_SERIAL}' '$links' '$devnode'"

Où VVVV et PPPP sont les id vendor et product de ta clef.

Dans ton script tu fait une vérification que le disque est monté. Si ce n’est pas le cas, tu le fait, sinon tu l’utilises directement.
Comme ça si KDE le monte directement lui même, tu es en mesure de faire fonctionner ta synchro.

Comme ça peu importe que ton udev soit éxécuté avant ou après.
Et Dans ton script tu vérifie avec son vendor ID et son product IS via du lsblk ou du lshw.

C’est étrange car avec:

#ACTION=="add", ENV{ID_FS_LABEL}=="Sauvegardes2", ENV{ID_MODEL}=="003-9VT166", RUN+="/usr/local/bin/rsync-USB.sh"

La régles lance le script mais il échou car pas monté.

ENV{ID_FS_LABEL}=="Sauvegardes2", ENV{ID_MODEL}=="003-9VT166", RUN+="/usr/local/bin/rsync-USB.sh"

lance le script qui échou puis le lance une seconde fois qui reussi car le dd est enfin monté. mais en contre parti lance le script à la déconnexion aussi, logique.

ENV{ID_FS_LABEL}=="Sauvegardes2", ENV{ID_MODEL}=="003-9VT166" , ACTION=="add", RUN+="/usr/local/bin/rsync-USB.sh '$env{ST2000DL_003-9VT166_5D120EFFFFFF-0:0}' '$links' '$devnode'"

j’ai pas de ATTR{idProduct} donc j’ai adapté
Ta régle échou aussi, elle passe avant le montage donc le disque n’est pas monté et le script échou.

PS dans le script mount n’as aucun effet :

if grep -q "/media/debcat/Sauvegardes2" /etc/mtab && grep -q "/mnt/Sauvegardes" /etc/mtab; then
    echo "-------- Les disques sont montés, on y va  --------"
 else
    echo "-------- Les disques sont démontés, on les monte --------"
    mount /mnt/Sauvegardes
    mount /media/debcat/Sauvegardes2
fi

C’est ton script qui pose problème. De plus, il y a peut etre aussi une question de droit d’execution (sous quel user le script s’execute). Quand à ton test il n’est pas bon.
Pour tester si ton disque est monté utilise le device et non le point de montage, car si KDE le monte avant, il est possible que le montage ne soit pas le même que ce que tu fais toi. findmnt est pas mal pour tester un montage.

Si le script se lance, alors c’est ton script qui n’est pas bon, car une fois lancé udev a fait son job.
Quand au product id, il y a toujoursune valeur normalement.

kde le monte systématiquement sur /media/debcat/Sauvegardes2 (qui est son label)
que je regarde avec lsmount ou lsblk c’est sytématiquement sur le même point de montage
le idproduct il me le donne sur le boitier usb pas le disque en lui-même.

ATTRS{configuration}=="USB Mass Storage"
ATTRS{devnum}=="4"
ATTRS{devpath}=="6"
ATTRS{idProduct}=="2329"
ATTRS{idVendor}=="152d"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="JMicron"

le script c’est sous root qu’il s’éxecute vu que c’est udev qui le lance, d’ailleurs j’ai un if qui contrôles si c’est pas root il le stope.

un udevadm test /dev/sde1 montre que la régles udev s’éxecute avant la création des symlinks :

Reading rules file: /usr/lib/udev/rules.d/99-systemd.rules
Reading rules file: /etc/udev/rules.d/99.usbbackup.rules
sde1: /usr/lib/udev/rules.d/50-udev-default.rules:74 GROUP 6
sde1: /usr/lib/udev/rules.d/60-persistent-storage.rules:77 LINK 'disk/by-id/usb-ST2000DL_003-9VT166_5D120EFFFFFF-0:0-part1'
sde1: /usr/lib/udev/rules.d/60-persistent-storage.rules:83 LINK 'disk/by-id/usb-ST2000DL_003-9VT166_5D120EFFFFFF-0:0-part1'
sde1: /usr/lib/udev/rules.d/60-persistent-storage.rules:108 LINK 'disk/by-path/pci-0000:00:1d.7-usb-0:6:1.0-scsi-0:0:0:0-part1'
sde1: /usr/lib/udev/rules.d/60-persistent-storage.rules:128 Importing properties from results of builtin command 'blkid'
sde1: Probe /dev/sde1 with raid and offset=0
sde1: /usr/lib/udev/rules.d/60-persistent-storage.rules:133 LINK 'disk/by-uuid/71c59457-2399-4fa4-b490-e89c195b1c17'
sde1: /usr/lib/udev/rules.d/60-persistent-storage.rules:134 LINK 'disk/by-label/Sauvegardes2'
sde1: /usr/lib/udev/rules.d/60-persistent-storage.rules:141 LINK 'disk/by-partuuid/64fcac9d-b727-584d-b2fc-d2bc3d6d9168'
sde1: /etc/udev/rules.d/99.usbbackup.rules:12 RUN '/usr/local/bin/rsync-USB.sh '$env{ST2000DL_003-9VT166_5D120EFFFFFF-0:0}' '$links' '$devnode''
sde1: Preserve permissions of /dev/sde1, uid=0, gid=6, mode=0660
sde1: Successfully created symlink '/dev/disk/by-path/pci-0000:00:1d.7-usb-0:6:1.0-scsi-0:0:0:0-part1' to '/dev/sde1'
sde1: Successfully created symlink '/dev/disk/by-id/usb-ST2000DL_003-9VT166_5D120EFFFFFF-0:0-part1' to '/dev/sde1'
sde1: Successfully created symlink '/dev/disk/by-partuuid/64fcac9d-b727-584d-b2fc-d2bc3d6d9168' to '/dev/sde1'
sde1: Successfully created symlink '/dev/disk/by-label/Sauvegardes2' to '/dev/sde1'
sde1: Successfully created symlink '/dev/disk/by-uuid/71c59457-2399-4fa4-b490-e89c195b1c17' to '/dev/sde1'
sde1: Successfully created symlink '/dev/block/8:65' to '/dev/sde1'
sde1: sd-device: Created db file '/run/udev/data/b8:65' for '/devices/pci0000:00/0000:00:1d.7/usb5/5-6/5-6:1.0/host4/target4:0:0/4:0:0:0/block/sde/sde1'
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb5/5-6/5-6:1.0/host4/target4:0:0/4:0:0:0/block/sde/sde1
DEVNAME=/dev/sde1

Normal d’un point de vue USB, et comme les règles udev sont justement liée à USB, il faut donc mettre ce que tu as sur le boitier car c’est lui l’interface USB pas le disque.
N’oublie pas que:
key==« value » override l’action.
key+=« value » ajoute cette action à celle du même type déjà existante dans les mêmes conditions.
Dans tes logs il ne dit pas qu’il a exécuté ton script, mais qu’il a lu ton fichier de règle.
Et j’insiste, mieux vaut que tu mette idproduct et idvendor, car c’est un périphérique USB pas un disque branché sur une iterface IDE, SATA ou autre.

Journactl :

sept. 17 21:42:34 debcat kernel: usb 5-6: new high-speed USB device number 20 using ehci-pci
sept. 17 21:42:35 debcat kernel: usb 5-6: New USB device found, idVendor=152d, idProduct=2329, bcdDevice= 1.00
sept. 17 21:42:35 debcat kernel: usb 5-6: New USB device strings: Mfr=1, Product=2, SerialNumber=5
sept. 17 21:42:35 debcat kernel: usb 5-6: Product: USB to ATA/ATAPI Bridge
sept. 17 21:42:35 debcat kernel: usb 5-6: Manufacturer: JMicron
sept. 17 21:42:35 debcat kernel: usb 5-6: SerialNumber: 5D120EFFFFFF
sept. 17 21:42:35 debcat kernel: usb-storage 5-6:1.0: USB Mass Storage device detected
sept. 17 21:42:35 debcat kernel: usb-storage 5-6:1.0: Quirks match for vid 152d pid 2329: 8020
sept. 17 21:42:35 debcat kernel: scsi host4: usb-storage 5-6:1.0
sept. 17 21:42:35 debcat mtp-probe[14439]: checking bus 5, device 20: "/sys/devices/pci0000:00/0000:00:1d.7/usb5/5-6"
sept. 17 21:42:35 debcat mtp-probe[14439]: bus: 5, device: 20 was not an MTP device
sept. 17 21:42:35 debcat mtp-probe[14440]: checking bus 5, device 20: "/sys/devices/pci0000:00/0000:00:1d.7/usb5/5-6"
sept. 17 21:42:35 debcat mtp-probe[14440]: bus: 5, device: 20 was not an MTP device
sept. 17 21:42:36 debcat kernel: scsi 4:0:0:0: Direct-Access     ST2000DL 003-9VT166            PQ: 0 ANSI: 2 CCS
sept. 17 21:42:36 debcat kernel: sd 4:0:0:0: Attached scsi generic sg5 type 0
sept. 17 21:42:36 debcat kernel: sd 4:0:0:0: [sde] 3907029168 512-byte logical blocks: (2.00 TB/1.82 TiB)
sept. 17 21:42:36 debcat kernel: sd 4:0:0:0: [sde] Write Protect is off
sept. 17 21:42:36 debcat kernel: sd 4:0:0:0: [sde] Mode Sense: 34 00 00 00
sept. 17 21:42:36 debcat kernel: sd 4:0:0:0: [sde] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
sept. 17 21:42:36 debcat kernel:  sde: sde1
sept. 17 21:42:36 debcat kernel: sd 4:0:0:0: [sde] Attached SCSI disk
sept. 17 21:42:36 debcat dbus-daemon[631]: [system] Activating service name='org.kde.kded.smart' requested by ':1.32' (uid=1000 pid=1136 comm="/usr/bin/kded5") (using servicehelper)
sept. 17 21:42:36 debcat dbus-daemon[631]: [system] Successfully activated service 'org.kde.kded.smart'
sept. 17 21:42:37 debcat kernel: EXT4-fs (sde1): recovery complete
sept. 17 21:42:37 debcat kernel: EXT4-fs (sde1): mounted filesystem with ordered data mode. Quota mode: none.
sept. 17 21:42:37 debcat udisksd[637]: Mounted /dev/sde1 at /media/debcat/Sauvegardes2 on behalf of uid 1000

Le pb n’est pas là, le script se lance bien au montage la régle fonctionne sans souci.
je m’envois un mail par exemple et il arrive
Il y a un pb entre kde qui utilise udisk et udev
et un pb de cmd mount dans un script lancer par udev.

Quel problème? si tu ne précise pas, il va être difficile de t’aider.

J’ai mis les info dans la regle et la c’est encore pire car çà crée le dossier et le disque ne se monte pas du coup le script fonctionne mais me remplis la partition racine comme un dosssier simple.
une fois l’alerte de 0% disponible sur le disque le script s’arrete et à se moment là kde monte l’usb sur un dossier Sauvegarde21 vu que Sauvegarde2 existe

ATTR{idVendor}=="152d", ATTR{idProduct}=="2329", ACTION=="add", RUN+="/usr/local/bin/rsync-USB.sh '$env{ST2000DL_003-9VT166_5D120EFFFFFF-0:0}' '$links' '$devnode'"

Pour mount si je le place dans le script il n’a aucune action comme si la ligne n’existait pas.
Que se soit au début ou dans un if c’est inexistant du moment ou udev le lance.
J’ai essaye
mount /mnt/Sauvegardes > disque satta interne > rien
mount /media/debcat/Sauvegardes2 > disque usb > rien
mount /dev/sdd1 /mnt/Sauvegardes > disque satta interne > rien
/bin/mount /dev/sdd1 /mnt/Sauvegardes > disque usb > rien
Script en bash

C’est les logs qu’ils nous faudrait, il faudrait que ton génère des logs pour être correct, il faudrait aussi que nous ayons le script complet.
Car si ton script remplit complètement le point de montage c’est qu’il est clairement mal fait.
tes mount s’ils passent mal, il génèrent obligatoirement des logs dans le système.
Pour la syntaxe de ton mount, si le montage n’est pas dans /etc/fstab, ça ne peux pas marcher par exemple.

Alors la partition /mnt/Sauvegardes est bien dans /etc/fstab
J’ai 3 scripts rsync sur le même code je change juste le $QUOI et le $OU dans les constantes pour sauvegarder et les deux autres fonctionnent en interne ou via SSH.
Voici le script :

#!/bin/bash
set -xv
#----------------------------------------------rsync-USB.sh---------------------

#Constantes
EXCLUDE=/usr/local/etc/Rsync/rsync-USB-exclude.exclude
QUOI=/mnt/Sauvegardes
OU=/media/debcat/Sauvegardes2
LOG=/home/debcat/Documents/log/Sauvegardes/USB

 (

echo "----------------Contrôles avant de sauvegarder------------"
 # ------------------------------Vérification si root lance le script----------------------
if [ $(id -u) -ne 0 ]; then
   kdialog --title " Ce script doit être lancé en tant que root " --passivepopup "Rien à faire" 10
   exit 1
else
 # ------------------------------Vérification de la date de la dernière sauvegardes----------------------
if grep -q "$(date +%m)" $LOG/A-USB-date.log; then
echo "----------------Déjà sauvegardé------------"
mail -s "Déjà sauvegardé sur l'USB" <<< "" debcat@debcat.home
exit 1
else
# ------------------------------Vérification si le disque est monté----------------------
if grep -q "/media/debcat/Sauvegardes2" /etc/mtab && grep -q "/mnt/Sauvegardes" /etc/mtab; then
   echo "-------- Le disque est monté, on y va  --------"
else
echo "-------- Le disque est démonté, on le monte --------"
#

/usr/bin/mount /mnt/Sauvegardes

fi
 fi
   fi
  echo "Sauvegarde débutée à $(date +%H-%M-%S)"
/usr/bin/mail -s "Sauvegarde débutée à $(date +%H-%M-%S)" <<< "" debcat@debcat.home

  ionice -c 3 nice -n -20 rsync -PavvhbxHAX --stats --fsync --delete --exclude-from=$EXCLUDE --backup-dir=$OU/Gestion/Incréments/$(date '+%A-%d-%m-%y') $QUOI/ $OU
cd $LOG
find . -type f -mtime +100 -exec rm -f {} \;
echo $(date +%m) >> $LOG/A-USB-date.log
echo "-------- Sauvegarde terminée --------"
echo "Sauvegarde terminée à $(date +%H-%M-%S)"
) | tee -a /home/debcat/Documents/log/Sauvegardes/USB/$(date +%A-%d-%m-%y-%H).log

sed '/uptodate/d;/sender/d;/did move/d;/generator/d;/backed up/d' $LOG/$(date +%A-%d-%m-%y-%H).log > $LOG/$(date +%A-%d-%m-%y-%H).txt
mail -s "Sauvegarde terminée à $(date +%H-%M)" debcat@debcat.home < $LOG/$(date +%A-%d-%m-%y-%H).txt
exit 0

tu devrais plutôt imbriquer tes if/then/else/fi avec des if/then/elif/then/else/fi

Sur la partie mount, que vois-tu dans /var/log/syslog ou journald?

rien justement aucune erreur comme si mount n’existait pas pour udev

Bonjour,
petit compte-rendu.
Je confirme que je n’ai pas trouvé de solution pour mon usage.
Quoique je fasse comme rêgle UDEV je n’arrive pas à se que je souhaite.
J’ai désactivé l’auto-montage dans kde.
crée la rêgle udev pour monté le disque usb via systemd-mount, si c’est la seule action RUN dans la rêgle, cela monte bien le disque dans /run/media/system/ label si rien n’est spécifié.
RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode"
ou votre dossier si vous l’ajoutez dans la ligne :
RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /media/debcat/Sauvegardes2"

Si j’ajoute un autre RUN comme mon script par exemple.
le montage ne se fait qu’à la fin de l’execution du script donc pour ma part avec le contrôles de partitions c’est pas bon ça fait échouer le script.
Dans le cas d’un autre RUN sytemd-mount crée uniquement le point de montage sans monter le disque car il y a un autre run derriere après coup un simple cd ou ls fait monté le disque.
Mais toutes mes commande ajoutées à mon script échoue à faire monter le disque il y a un verrou qui saute à la fin de l’execution.
Donc j’arrête là.
Merci