Apparemment, cela peut être fait plus simplement avec udevadm
, et je viens de découvrir comment.
Pour obtenir le DEVNAME
de udevadm
vous suffit de faire:
udevadm info -rq name $PATH
Par exemple, si vous vouliez connaître le /dev
nom de /sys/dev/char/5:1
votre choix, vous le feriez:
udevadm info -rq name /sys/dev/char/5:1
PRODUCTION
/dev/console
L' -r
option est de spécifier un --root
chemin ed - sans lui le résultat ci-dessus serait en lecture seule console
. L' -q
option spécifie une base de données --query
et il prend l'opérande name
ici - parce que nous voulons le DEVNAME
.
Un moyen très simple de trouver le chemin vers un périphérique char et / ou block étant donné uniquement les principaux: les nombres mineurs peuvent ressembler à:
mmdev() for d in /sys/dev/[cb]*/$1:$2
do [ -e "$d" ] || return
printf %c:%s: "${d#/*/*/}" "${d##*/}"
udevadm info -rq name "$d"
done
Donc en cours d'exécution:
mmdev 8 0
impressions ...
b:8:0:/dev/sda
Voici le premier que j'ai écrit.
majminpath() {
set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
udevadm info --export-db |
sed 's|^[^=]*DEVNAME=||
\|^[^/]|!h;/MAJOR=/N
\|='"$1\n.*=${2?}"'$|!d;g'
}
Cela scanne simplement la udevadm info --export-db
sortie pour les numéros correspondants. La sortie ressemble à:
P: /devices/virtual/vc/vcsa4
N: vcsa4
E: DEVNAME=/dev/vcsa4
E: DEVPATH=/devices/virtual/vc/vcsa4
E: MAJOR=7
E: MINOR=132
E: SUBSYSTEM=vc
P: /devices/virtual/vc/vcsa5
N: vcsa5
E: DEVNAME=/dev/vcsa5
E: DEVPATH=/devices/virtual/vc/vcsa5
E: MAJOR=7
E: MINOR=133
E: SUBSYSTEM=vc
#...and so on
Le workflow est comme:
tenter de retirer la [^=]*DEVNAME=
chaîne de la tête de chaque ligne
si une ligne n'a pas de premier caractère ou si son premier caractère est de /
copier cette ligne sur l' h
ancien espace
si une ligne correspond à MAJOR=
ajouter N
la ligne d'entrée ext à l'espace modèle
s'il y a 2 lignes dans l'espace du motif qui correspondent, =$1\n.*=$2$
copiez l' h
ancien espace sur l'espace du motif et l'impression automatique; sinon supprimer l'espace de motif
Donc si je le fais:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
PRODUCTION
/dev/vcsa5
/dev/sda
/dev/sda1
Mais, comme le souligne @xae, les périphériques de type bloc / caractère peuvent partager des combinaisons maj: min, et cela peut donc éventuellement imprimer plus d'un chemin par appel.