Cada nodo de dispositivo debajo /dev
tiene su propio par de números mayor / menor. Sé que podemos recuperar este par de números del nodo del dispositivo mediante stat
, de esta manera:
stat -c 'major: %t minor: %T' <file>
O, ls -l
también muestra estos números.
Pero, ¿cómo podemos obtener nodo (s) de dispositivo por números mayores y menores dados? La única forma en que soy consciente es algún tipo de truco ls -l
+ awk
, pero realmente espero que haya una mejor solución.
Respuestas:
Encontré un enfoque más simple usando el sys pseudofilesystem, en / sys / dev tiene los dispositivos ordenados por tipo y luego por mayor / menor, el archivo uevent contiene el nombre del dispositivo y un montón de otra información.
Así por ejemplo,
Ecos
Nota: Esto fue probado en Debian Wheezy
fuente
for file in $(ls /sys/dev/block/ ); do source /sys/dev/block/${file}/uevent; if [ "$DEVNAME" == "sda1" ] ; then echo ${file}; fi done;
No estoy seguro de lo que quieres decir.
Creará el archivo del dispositivo llamado
foo
como un dispositivo de bloque con mayor 8 y menor 0. Si quiere encontrar uno o cualquiera de los archivos/dev
que tienen el mismo tipo, mayor y menor, puede hacer (conzsh
):Para dispositivo de bloque
8:0
:para dispositivo char
226:0
:Tenga en cuenta que cualquier cosa puede crear archivos
/dev
. En los viejos tiempos, era un script que creaba archivos estáticos allí. En algún momento, incluso tenías un sistema de archivos especial a la/proc
.En las versiones modernas de Linux, generalmente se
udev
basa en la entrada del núcleo.El nombre que elige para el archivo del dispositivo base se basa en el
DEVNAME
proporcionado por el núcleo.udev
las reglas pueden cambiar eso, pero generalmente no lo hacen, y algunasudev
reglas agregarán algunos enlaces simbólicos más por conveniencia (como los que/dev/disk/by...
están).Puede ir de mayor: menor a kernel
DEVNAME
mirando:También puede obtener esa información de la
udev
base de datos como lo ha demostrado mikeserv.fuente
Aparentemente se puede hacer de manera más simple
udevadm
, y acabo de descubrir cómo.Para obtener el
DEVNAME
deudevadm
Solo hay que hacer:Por ejemplo, si quisieras saber el
/dev
nombre/sys/dev/char/5:1
que harías:SALIDA
La
-r
opción es especificar una--root
ruta ed; sin ella, el resultado anterior sería de solo lecturaconsole
. La-q
opción especifica una base de datos--query
y toma el operandoname
aquí, porque queremos elDEVNAME
.Una forma muy simple de encontrar la ruta a un dispositivo de bloqueo y / o carácter dado solo el mayor: los números menores podrían verse así:
Entonces corriendo:
huellas dactilares...
Aquí está el primero que escribí.
Esto solo escanea la
udevadm info --export-db
salida para los números coincidentes. El resultado se ve así:El flujo de trabajo es como:
intente quitar la
[^=]*DEVNAME=
cuerda del encabezado de cada líneasi una línea no tiene un primer carácter o su primer carácter es
/
copiar esa línea sobre elh
espacio antiguoSi una línea coincide,
MAJOR=
anexeN
la línea de entrada ext al espacio del patrónsi hay 2 líneas en el espacio del patrón que coinciden
=$1\n.*=$2$
, copie elh
espacio anterior sobre el espacio del patrón y autoimprima; de lo contrario, elimine el espacio del patrónEntonces si lo hago:
SALIDA
Pero, como señala @xae, los dispositivos de tipo block / char pueden compartir combinaciones maj: min, por lo que esto podría imprimir más de una ruta por llamada.
fuente
Por desgracia , la
/sys/dev
jerarquía solo se agregó al kernel tan tarde como 2.6.27 ( cf. la confirmación relevante contra la base de código del kernel), por lo que necesitamos un enfoque "bifurcado".Sea
$M
y$m
, respectivamente, el número mayor y menor de nuestro archivo de dispositivo.Publicar 2.6.27 núcleos
Según lo sugerido por otros, el enfoque más simple libera el poder del
sysfs
sistema de archivos "virtual", persiguiendo directamente los archivos nombrados$M:$m
en la carpeta/sys/dev
(es de esperar más de un archivo si no sabemos si nuestro dispositivo es un personaje) o uno basado en bloques), y luego obtener eluevent
archivo (en un subshell para evitar la contaminación del espacio de nombres):Pre 2.6.27 núcleos
Supongamos, por simplicidad, que nuestro archivo es un dispositivo de bloque (se aplica un enfoque similar para los dispositivos de caracteres). Buscaremos la cadena en
$M:$m
toda la/sys/block
jerarquía, examinando (debajo de esa carpeta) el contenido de cada archivo cuyo nombre seadev
. Si/sys/block/<...>/<DEV>/dev
es uno de esos archivos, entoncesDEV
está obligado a ser el nombre de nuestro dispositivo:fuente
En Linux es posible aprovechar ciertos archivos en
/proc
el sistema de archivos virtual.La forma simple del patrón ya proporciona información sobre el dispositivo deseado en la salida, sin embargo, también es posible el filtrado adicional para extraer solo una cadena en particular.
fuente
Hay una función de biblioteca:
makedev()
Dadas las ID de dispositivos mayores y menores, makedev () las combina para producir una ID de dispositivo, devuelta como resultado de la función.
Para más detalles visite: http://man7.org/linux/man-pages/man3/major.3.html
fuente