Chaque nœud de périphérique sous /dev
possède sa propre paire de numéros majeurs / mineurs. Je sais que nous pouvons récupérer cette paire de nombres à partir du nœud de l'appareil au moyen de stat
, comme ceci:
stat -c 'major: %t minor: %T' <file>
Ou, ls -l
montre également ces chiffres.
Mais comment obtenir des nœuds d'appareil en utilisant des nombres majeurs et mineurs donnés? La seule façon dont je suis au courant est une sorte de ls -l
+ awk
truc, mais je l' espère vraiment il y a une meilleure solution.
Réponses:
J'ai trouvé une approche plus simple en utilisant le pseudofichier système sys , dans / sys / dev vous avez les appareils classés par type puis par majeur / mineur, le fichier uevent contient le nom de l'appareil et un tas d'autres informations.
Ainsi, par exemple,
Echoes,
Remarque: cela a été testé dans Debian Wheezy
la source
for file in $(ls /sys/dev/block/ ); do source /sys/dev/block/${file}/uevent; if [ "$DEVNAME" == "sda1" ] ; then echo ${file}; fi done;
Pas sûr de ce que vous voulez dire.
Créera le fichier de périphérique appelé en
foo
tant que périphérique de bloc avec 8 majeur et 0 mineur. Si vous voulez trouver un ou l'un des fichiers/dev
qui ont le même type, majeur et mineur, vous pouvez faire (aveczsh
):Pour périphérique bloc
8:0
:pour le périphérique char
226:0
:Notez que tout peut créer des fichiers dans
/dev
. Autrefois, c'était un script créant des fichiers statiques dedans. À un moment donné, vous aviez même un système de fichiers spécial à la/proc
.Sur les versions modernes de Linux, il est généralement
udev
basé sur les entrées du noyau.Le nom qu'il choisit pour le fichier de périphérique de base est basé sur celui
DEVNAME
fourni par le noyau.udev
les règles peuvent changer cela mais ne le font généralement pas, et certainesudev
règles ajouteront d'autres liens symboliques pour plus de commodité (comme/dev/disk/by...
ceux-ci).Vous pouvez passer du majeur: mineur au noyau
DEVNAME
en regardant:Vous pouvez également obtenir ces informations de la
udev
base de données comme l'a montré mikeserv.la source
Apparemment, cela peut être fait plus simplement avec
udevadm
, et je viens de découvrir comment.Pour obtenir le
DEVNAME
deudevadm
vous suffit de faire:Par exemple, si vous vouliez connaître le
/dev
nom de/sys/dev/char/5:1
votre choix, vous le feriez:PRODUCTION
L'
-r
option est de spécifier un--root
chemin ed - sans lui le résultat ci-dessus serait en lecture seuleconsole
. L'-q
option spécifie une base de données--query
et il prend l'opérandename
ici - parce que nous voulons leDEVNAME
.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 à:
Donc en cours d'exécution:
impressions ...
Voici le premier que j'ai écrit.
Cela scanne simplement la
udevadm info --export-db
sortie pour les numéros correspondants. La sortie ressemble à:Le workflow est comme:
tenter de retirer la
[^=]*DEVNAME=
chaîne de la tête de chaque lignesi une ligne n'a pas de premier caractère ou si son premier caractère est de
/
copier cette ligne sur l'h
ancien espacesi une ligne correspond à
MAJOR=
ajouterN
la ligne d'entrée ext à l'espace modèles'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 motifDonc si je le fais:
PRODUCTION
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.
la source
Hélas , la
/sys/dev
hiérarchie n'a été ajoutée au noyau qu'en 2.6.27 ( cf. la validation pertinente contre la base de code du noyau), nous avons donc besoin d'une approche «bifurquée».Soit
$M
et$m
, respectivement, le nombre majeur et mineur de notre fichier de périphérique.Post 2.6.27 kernels
Comme suggéré par d'autres, l'approche la plus simple libère la puissance du
sysfs
système de fichiers «virtuel», en poursuivant directement pour les fichiers nommés$M:$m
sous le dossier/sys/dev
(plus d'un fichier est à prévoir si nous ne savons pas si notre appareil est un caractère- ou basé sur des blocs), puis à sourcer leuevent
fichier (dans un sous-shell afin d'éviter la pollution de l'espace de noms):Pré 2.6.27 noyaux
Supposons, par souci de simplicité, que notre fichier est un périphérique de bloc (une approche similaire s'applique aux périphériques de caractères). Nous rechercherons la chaîne
$M:$m
dans toute la/sys/block
hiérarchie, en examinant (sous ce dossier) le contenu de chaque fichier dont le nom se trouve êtredev
. Si/sys/block/<...>/<DEV>/dev
est un de ces fichiers, alorsDEV
est lié au nom de notre appareil:la source
Sous Linux, il est possible de profiter de certains fichiers dans
/proc
un système de fichiers virtuel.La forme simple du modèle fournit déjà des informations sur le périphérique souhaité dans la sortie, mais un filtrage supplémentaire pour extraire une seule chaîne particulière est également possible.
la source
Il existe une fonction de bibliothèque:
makedev()
Étant donné les ID de périphérique majeurs et mineurs, makedev () les combine pour produire un ID de périphérique, renvoyé comme résultat de la fonction.
Pour plus de détails, visitez: http://man7.org/linux/man-pages/man3/major.3.html
la source