Son los números mayores y menores únicos

11

¿El major, minornúmero es único?

¿Tenemos alguna cita y referencia a ella?

NAME   MAJ:MIN RM   SIZE RO MOUNTPOINT
sda      8:0    0 465.8G  0 
├─sda1   8:1    0 298.2M  0 
├─sda2   8:2    0     3G  0 
├─sda3   8:3    0 458.7G  0 /
├─sda4   8:4    0     1K  0 
└─sda5   8:5    0   3.8G  0 
sr0     11:0    1  1024M  0 
Dipak Ingole
fuente
maj es hardware, menor es subdivisión del hardware principal
Kiwy

Respuestas:

20

Desde la interfaz de programación de Linux , §14.1

Cada archivo de dispositivo tiene un número de identificación mayor y un número de identificación menor. La ID principal identifica la clase general de dispositivo y el núcleo la utiliza para buscar el controlador apropiado para este tipo de dispositivo. La identificación menor identifica de forma exclusiva un dispositivo particular dentro de una clase general. El comando ls -l muestra las ID principales y secundarias de un archivo de dispositivo.

[...]

Cada controlador de dispositivo registra su asociación con un ID de dispositivo principal específico, y esta asociación proporciona la conexión entre el archivo especial del dispositivo y el dispositivo. El nombre del archivo del dispositivo no tiene relevancia cuando el núcleo busca el controlador del dispositivo.

Consulte también este antiguo capítulo (2001) Controladores de dispositivos Linux (2e) .

es decir, la intención es proporcionar un mapeo único de mayor: menor a dispositivo: instancia para cada tipo de dispositivo. Estrictamente, puede tener dos dispositivos distintos con el mismo mayor: menor, siempre que uno sea char y otro sea block:

# ls -l /dev/ram1 /dev/mem
crw-r----- 1 root kmem 1, 1 Jan  1  1970 /dev/mem
brw-rw---- 1 root disk 1, 1 Jan  1  1970 /dev/ram1

En Linux, en cualquier momento en un sistema, el principal: los números menores para cada tipo de dispositivo son únicos. Sin embargo, los números pueden cambiar con el tiempo y no necesitan ser los mismos en diferentes sistemas Linux (incluso la misma distribución, kernel y hardware). Tenga en cuenta que los dispositivos de caracteres y bloques tienen espacios de numeración distintos, por ejemplo, el bloque principal 1 se asigna a los discos RAM, el carácter principal 1 se asigna a un conjunto de dispositivos del núcleo que incluyen nulo y cero.

Históricamente, las especialidades de dispositivos se asignaron (en su mayoría) de forma estática a través de un registro (también todavía presente, aunque sin mantenimiento, en la fuente del núcleo Documentation/devices.txt). En la actualidad, muchos dispositivos se asignan dinámicamente, esto lo administra udev y las asignaciones se pueden ver en /proc/devices. Los dispositivos fijos todavía existen en incude/uapi/linux/major.h(recientemente movido desde include/major.h)

Ahora, aunque la combinación principal: menor identifica de forma exclusiva instancias específicas de dispositivos, no hay nada que le impida crear múltiples nodos (archivos) de dispositivos que se refieren al mismo dispositivo. Ni siquiera tienen que crearse /dev(pero sí tienen que estar en un sistema de archivos que admita la creación de nodos de dispositivo y no esté montado con la nodevopción).

Un uso común es crear dispositivos duplicados cero, nulos y aleatorios en un chroot:

# find /dev /var/chroot -regextype posix-extended -regex ".*/(zero|null|random)" -type c | 
xargs ls -l
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /dev/zero
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /var/chroot/sendmail/dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /var/chroot/sendmail/dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /var/chroot/sendmail/dev/zero

Los nombres son solo alias, el núcleo no se preocupa mucho por la mayoría de los nombres o ubicaciones, se preocupa por el número mayor para que pueda seleccionar el controlador correcto, y el controlador (generalmente) se preocupa por el número menor para que pueda seleccionar el instancia correcta

La mayoría de los nombres son simplemente convenciones (aunque algunos están definidos por POSIX ). Tenga en cuenta también que un dispositivo puede registrarse para múltiples números principales, verifique el sdcontrolador /proc/devices; un nombre de módulo de controlador ( .ko) no necesita ser el mismo que el nombre del dispositivo, y no necesita ser el mismo que el nodo del dispositivo /dev, y un solo módulo de controlador puede administrar múltiples dispositivos lógicos / físicos o nombres de dispositivos.


Para recapitular: puede tener dos o más nodos de dispositivo (en /dev/o en otro lugar) que tengan el mismo número mayor: números menores, pero si son del mismo tipo, se refieren al mismo dispositivo. Puede tener un controlador que pueda manejar múltiples instancias principales, pero dentro del núcleo y dentro del controlador, para cada tipo (char o bloque) el mayor: se toma un número menor para referirse a un dispositivo específico (mayor) y una instancia específica ( menor) del dispositivo.

No puede tener dos nodos de dispositivo con el mismo tipo y mayor: menor y esperar que accedan a dos dispositivos lógicos o físicos diferentes. Cuando se accede a un dispositivo, el núcleo selecciona un controlador según el tipo y el número principal (y no según el nombre del nodo del dispositivo) y, por convención, el número secundario selecciona de manera determinista una instancia o subfunción específica.


Actualización En la presentación de BSDCon de 2002 de Poul-Henning Kamp se puede encontrar algo de historia interesante y algo de perspectiva BSD : https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

Si retrocede en el tiempo hasta 1978 (cortesía de Alcatel-Lucent, el Boletín técnico del sistema Bell, julio-agosto de 1978), el ' Sistema de tiempo compartido Unix ' lo establece claramente (p. 1937):

Los dispositivos se caracterizan por un número de dispositivo principal, un número de dispositivo menor y una clase (bloque o carácter). Para cada clase, hay una variedad de puntos de entrada en los controladores de dispositivo. El número de dispositivo principal se usa para indexar la matriz cuando se llama al código para un controlador de dispositivo en particular. El número de dispositivo menor se pasa al controlador del dispositivo como argumento. El número menor no tiene otro significado que el que le atribuye el conductor. Por lo general, el controlador usa el número menor para acceder a uno de varios dispositivos físicos idénticos.

Sr. púrpura
fuente
Entonces, ¿podemos tener dos dispositivos con el mismo par o MAJ:Minnúmero
Dipak Ingole
1
Sí, con limitaciones. Actualizado.
Sr.Spuratic
2

Cuando se crea un archivo de dispositivo mknode, se proporcionan los números majory minor. Así es como Linux identifica el dispositivo de hardware subyacente asociado con un archivo de dispositivo. En la mayoría de los casos, el majornúmero identifica al controlador mientras que minordistingue los diferentes dispositivos que controla el controlador.

Como tal, los números deben ser únicos para cada dispositivo o no sería posible crear archivos de dispositivo correctos para todos ellos.

Graeme
fuente
0

No, en Linux no siempre son únicos.

Linux está utilizando un devptssistema de archivos virtual para proporcionar pseudoterminales (ptys), y ese sistema de archivos virtual se puede montar más de una vez y en diferentes lugares, lo cual es práctico al configurar chroots o contenedores de espacios de nombres. Si bien una major:minortupla es única en una devptsinstancia de sistema de archivos, no es única en un sistema en ejecución:

# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   34:3
# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   35:3

En el ejemplo anterior, el script(1)comando crea un pseudo-terminal y ejecuta un shell dentro de él. Es muy obvio que el pseudo-terminal creado por el primer scriptproceso no es el mismo que el creado por el segundo, pero tienen el mismo nombre y números mayores y menores.

Para identificar de forma exclusiva un pseudoterminal, debe usar su device:inodetupla o combinar el número de dispositivo (del sistema de archivos devpts) con el suyo major:minor. El problema es que el campo "tty" de /proc/PID/stat(el 7, vea la página de proc(5)manual; ahí es donde las herramientas les gusta lsofo psobtienen su información) solo contiene el st_rdevde tty (el empaquetado major:minor); Si es un esclavo pty, no hay ninguna indicación para el devptssistema de archivos que lo proporciona. Los mismos problemas afectan el número de dispositivo que se puede obtener con el TIOCGDEVioctl.

AFAICS no hay una forma confiable de identificar el terminal de control de un proceso en Linux. Correcciones y sugerencias de lo contrario bienvenido!

Mosvy
fuente