¿El major, minor
nú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
Respuestas:
Desde la interfaz de programación de Linux , §14.1
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:
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 enincude/uapi/linux/major.h
(recientemente movido desdeinclude/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 lanodev
opción).Un uso común es crear dispositivos duplicados cero, nulos y aleatorios en un chroot:
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
sd
controlador/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):
fuente
MAJ:Min
númeroCuando se crea un archivo de dispositivo
mknode
, se proporcionan los númerosmajor
yminor
. Así es como Linux identifica el dispositivo de hardware subyacente asociado con un archivo de dispositivo. En la mayoría de los casos, elmajor
número identifica al controlador mientras queminor
distingue 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.
fuente
No, en Linux no siempre son únicos.
Linux está utilizando un
devpts
sistema 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 unamajor:minor
tupla es única en unadevpts
instancia de sistema de archivos, no es única en un sistema en ejecución: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 primerscript
proceso 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:inode
tupla o combinar el número de dispositivo (del sistema de archivos devpts) con el suyomajor:minor
. El problema es que el campo "tty" de/proc/PID/stat
(el 7, vea la página deproc(5)
manual; ahí es donde las herramientas les gustalsof
ops
obtienen su información) solo contiene elst_rdev
de tty (el empaquetadomajor:minor
); Si es un esclavo pty, no hay ninguna indicación para eldevpts
sistema de archivos que lo proporciona. Los mismos problemas afectan el número de dispositivo que se puede obtener con elTIOCGDEV
ioctl.AFAICS no hay una forma confiable de identificar el terminal de control de un proceso en Linux. Correcciones y sugerencias de lo contrario bienvenido!
fuente