Pages : 1
#1 Le 25/03/2008, à 19:59
- Manekineko
Demande d'aide sur Udev et shell
Bonsoir,
Il ne s'agit pas d'un développement de logiciel pour Ubuntu, mais pour moi. Cependant, le sujet intéressera certainement d'autres linuxiens et je suis disposé à filer le code à ceux qui veulent.
Ceci dit, j'ai découvert udev il y a une heure il semble correspondre parfaitement à mes besoins. J'ai lu comment créer des règles, mais je bloque au moment de l'application pratique.
Voici ce que je possède :
- Disques durs USB externes encodés avec le logiciel truecrypt.
- Disques durs internes encodés avec le logiciel truecrypt.
- Une clé USB qui contient les fichiers clefs qui permettent le décodage.
- Je connais les mot de passes associés aux fichiers et aux disques durs.
Voici ce que je veux faire :
Version courte :
1. J'ai envie d'un système simple et pratique. Quand je branche un disque, si la clé keyfile est branchée, le disque est reconnu et truecrypte le monte automatiquement dans le bon dossier.
2. Lorsque je branche la clé, tous les disques présents qui sont concernés sont montés par truecrypt dans les bons dossiers.
3. Lorsque je retire la clé, les disques concernés sont démontés proprement.
Version semi-détaillée :
1. Lorsque je connecte un des disques durs USB, udev execute mon_scripte.sh
mon_scripte.sh recherche la clé USB citée plus haut, la monte si nécessaire, puis exécute truecrypt avec les bons paramètres pour rendre utilisable le disque que je viens de brancher. (demander le mdp, mount, etc...)
Si la clé n'est pas trouvée, il ne se passe rien.
2. Lorsque je connecte la clé, udev execute mon_scripte.sh qui monte la clé et recherche les disques durs interne et externe pour executer truecrypt dessus et les monter, etc...
3. Lorsque je démonte ou que j'arrache la clé, udev appelle mon_scripte.sh qui sync et démonte tous les périphériques truecrypte montés. Ensuite, ubuntu me sert mon café.
Cet endroit, là où c'est que je bloque :
Comme dit, j'ai lu la doc sur l'écriture de regles udev. J'ai vu qu'on pouvait faire executer un scripte lors d'un évenement (branchement ou débranchement de tel ou tel périphérique)
Donc, dans l'idée, j'appelle le scripte à chaque branchement ou retrait d'un périphérique usb quelconque. Ensuite, il cherche tous les /dev/xxxx branchés et détermine certains paramètres (ex: s'agit-il de mon disque externe WD 500 Go noir ?) et agit en conséquences.
Je bloque sur cette deuxième partie : Comment deviner quel périphérique est branché, son Vendor ID, S/N, s'il est déjà monté où non, etc... ?
Merci pour votre aide !
Hors ligne
#2 Le 25/03/2008, à 20:04
- teke
Re : Demande d'aide sur Udev et shell
Je pense que le moyen le plus simple est encore le uuid du disque :
ls -l /dev/disk/by-uuid/
Il y a une page sur le sujet dans la doc.
#3 Le 26/03/2008, à 12:04
- Manekineko
Re : Demande d'aide sur Udev et shell
Merci pour ta réponse.
J'avais vu cette partie. On peut également obtenir l'uuid avec "vol_id -u /dev/xxx".
Bon, j'arrive à récupérer le texte fourni par "ls -l /dev/disk/by-uuid/" dans mon scripte bash, mais je ne sais pas comment isoler les /dev/xxx dans des variables ou une boucle for/while pour les traiter un par un.
Ensuite, si j'y arrive, je ne sais pas non plus comment tester pour savoir s'ils sont montés ou pas.
C'est la partie clé de mon scripte. Parce que écrire les règles Udev, semble assez facile. Donc, je ne devrai pas avoir de mal à appeler mon scripte lorsqu'un périphérique est branché ou débranché.
Par contre, scanner le système à la recherche des autres, c'est une autre affaire....
Hors ligne
#4 Le 26/03/2008, à 13:08
- teke
Re : Demande d'aide sur Udev et shell
houlala....
Je crois que tu te complique la vie là...
Une boucle if qui vérifie l'existence du fichier avec ton uuid dans /dev/disk/by-uuid/ est bien plus simple... si le fichier existe alors exécution du code qui suit.
#5 Le 26/03/2008, à 14:23
- Manekineko
Re : Demande d'aide sur Udev et shell
D'accord. Mais concretement ? Comment je fais.
En fait, je débute presque complètement en programmation shell. Mais je sais programmer dans d'autres langages donc ça ira vite. Il faut juste que j'arrive à trouver les bonnes instructions.
Pour le moment j'en suis à
liste_texte=$(ls -l /dev/disk/by-uuid/)
qui place sur une seule ligne tout le texte retourné par ls -l /dev/disk/by-uuid/ dans la variable liste_texte. Après il faut extraire les données. j'ai lu pas mal de choses sur la programmation shell, mais je n'ai pas trouvé d'instructions pour travailler sur des tableaux ou des chaînes de caractères.
Si bash n'est pas adapté, je peux aussi me tourner perl ou python, puisque j'en suis à apprendre.
Edit 26/03/08 14:26 [Je viens de trouver ceci. C'est plus complet que tout ce que j'ai vu jusqu'à présent. Je le lis.]
J'ai trouvé :
test -e /dev/disk/by-uuid/uuid_du_disque_que_je_cherche
qui permet de tester si le disque est branché.
Donc, je n'ai finalement pas besoin de
ls -l /dev/disk/by-uuid/
Si ?
Maintenant, il faut déterminer si le disque est monté ou pas.
Dernière modification par Manekineko (Le 26/03/2008, à 14:41)
Hors ligne
#6 Le 26/03/2008, à 14:54
- Manekineko
Re : Demande d'aide sur Udev et shell
Finalement, l'uuid n'est pas une bonne idée : certains peripheriques de stockage n'en ont pas.
Par exemple, mon baladeur accepte une carte mémoire. Lorsqu'il est branché, la mémoire interne apparaît en sda et la carte mémoire en sdb1.
sdb1 a un uuid XXXX-XXXX alors que sda n'en a pas et n'apparaît donc pas dans /dev/disk/by-uuid/
J'ai peut-être vu trop compliqué ?
Et il y a aussi un autre problème :
Voici ce que udevinfo dit de mon mp3 usb, pour sda, la mémoire interne qui va contenir la clé de décodage des disques durs :
looking at device '/block/sda':
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{dev}=="8:0"
ATTR{range}=="16"
ATTR{removable}=="1"
ATTR{size}=="1956864"
ATTR{stat}==" 41 69 880 143 0 0 0 0 0 100 143"
ATTR{capability}=="13"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host2/target2:0:0/2:0:0:0':
KERNELS=="2:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="0"
ATTRS{vendor}=="RockChip"
ATTRS{model}=="USB MP3 "
ATTRS{rev}=="1.00"
ATTRS{state}=="running"
ATTRS{timeout}=="60"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0x349"
ATTRS{iodone_cnt}=="0x349"
ATTRS{ioerr_cnt}=="0x1"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{evt_media_change}=="0"
ATTRS{queue_depth}=="1"
ATTRS{queue_type}=="none"
ATTRS{max_sectors}=="64"
La première partie n'est pas spécifique. Je ne veux pas me fier juste à la taille. La seconde partie l'est.
Mais si je base ma règle udev sur la seconde partie, comment est-ce que je peux indiquer à mon scripte sur quel /dev/sdxx est branché la cl usb qui contient les fichiers ?
DRIVERS=="sd", ATTRS{vendor}=="RockChip", ATTRS{model}=="USB MP3 ", ATTRS{rev}=="1.00", RUN+="/usr/bin/my_program.sh /dev/sdxx"
Dernière modification par Manekineko (Le 26/03/2008, à 15:23)
Hors ligne