GNU/Linux >> Linux Esercitazione >  >> Linux

Il numero maggiore e minore è unico?

Sono major, minor numero Unico?

Abbiamo citazioni e riferimenti ad esso?

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 

Risposta accettata:

Da L'interfaccia di programmazione Linux , §14.1

Ogni file del dispositivo ha un numero ID principale e un numero ID secondario. L'ID principale identifica la classe generale del dispositivo e viene utilizzato dal kernel per cercare il driver
appropriato per questo tipo di dispositivo. L'ID minore identifica in modo univoco un particolare dispositivo
all'interno di una classe generale. Gli ID principali e secondari di un file di dispositivo vengono visualizzati dal comando
ls -l.

[…]

Ciascun driver di dispositivo registra la propria associazione con un ID dispositivo principale specifico e questa associazione fornisce la connessione tra il file speciale del dispositivo e il dispositivo. Il nome del file del dispositivo non ha rilevanza quando il kernel cerca il driver del dispositivo.

ovvero l'intenzione è di fornire una mappatura univoca di major:minor a device:instance per ogni tipo di dispositivo. A rigor di termini, puoi hanno due dispositivi distinti con la stessa major:minor, purché uno sia char e uno sia 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

Su Linux, in qualsiasi momento su un sistema i numeri major:minor per ogni tipo di dispositivo sono unici. I numeri possono tuttavia cambiare nel tempo e non è necessario che siano gli stessi su diversi sistemi Linux (anche la stessa distribuzione, kernel e hardware). Si noti che i dispositivi a caratteri e blocchi hanno spazi di numerazione distinti, ad es. il blocco maggiore 1 viene assegnato ai dischi RAM, il carattere maggiore 1 viene assegnato a un insieme di dispositivi del kernel inclusi null e zero.

Storicamente i dispositivi major erano (per lo più) statici allocato tramite un registro (ancora presente, anche se non mantenuto, nel sorgente del kernel Documentation/devices.txt ). Al giorno d'oggi molti dispositivi sono allocati dinamicamente, questo è gestito da udev e le mappature sono visualizzabili in /proc/devices . I dispositivi fissi esistono ancora in incude/uapi/linux/major.h (recentemente spostato da include/major.h )

Ora, sebbene la combinazione major:minor identifichi in modo univoco istanze di dispositivi specifici, non c'è nulla che ti impedisca di creare più nodi di dispositivi (file) che fanno riferimento allo stesso dispositivo. Non devono nemmeno essere creati in /dev (ma devono trovarsi su un filesystem che supporta la creazione di nodi dispositivo e non è montato con il nodev opzione).

Un uso comune è la creazione di dispositivi duplicati zero, null e casuali in 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

I nomi sono solo alias, al kernel non importa molto della maggior parte dei nomi o delle posizioni, si preoccupa del numero maggiore in modo che possa selezionare il driver corretto e il driver (di solito) si preoccupa del numero minore in modo da poter selezionare il istanza corretta.

Correlati:Impara l'inglese - Quando "forte" viene utilizzato dopo un numero, si riferisce a quel numero esatto o a un numero approssimativo?

La maggior parte dei nomi sono semplicemente convenzioni (sebbene alcuni siano definiti da POSIX). Nota anche che un dispositivo può registrarsi per più numeri principali, controlla il sd driver in /proc/devices; un nome di modulo driver (.ko ) non deve corrispondere al nome del dispositivo e non deve corrispondere al nodo del dispositivo in /dev e un singolo modulo driver può gestire più dispositivi logici/fisici o nomi di dispositivi.

Per ricapitolare:potresti avere due o più nodi dispositivo (in /dev/ o altrove) che hanno gli stessi numeri major:minor, ma se sono dello stesso tipo si riferiscono allo stesso dispositivo. Puoi avere un driver in grado di gestire più istanze principali, ma all'interno del kernel e all'interno del driver, per ogni tipo (carattere o blocco) il numero major:minor viene preso per riferirsi a un dispositivo specifico (principale) e a un'istanza specifica ( minore) del dispositivo.

Non puoi avere due nodi dispositivo con lo stesso tipo e major:minor e aspettarti che accedano a due diversi dispositivi logici o fisici. Quando si accede a un dispositivo, il kernel seleziona un driver in base al tipo e al numero principale (e non in base al nome del nodo del dispositivo) e per convenzione il numero minore seleziona deterministicamente un'istanza o una sottofunzione specifica.

Aggiorna Una storia interessante e una prospettiva *BSD possono essere trovate nel BSDCon di Poul-Henning Kamp del 2002 presentazione:https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

Se fai un salto indietro nel tempo fino al 1978 (per gentile concessione di Alcatel-Lucent, il Bell System Technical Journal luglio-agosto 1978) il "Sistema di condivisione del tempo Unix ‘ lo espone chiaramente (p1937):

I dispositivi sono caratterizzati da un numero di dispositivo principale, un numero di dispositivo secondario e una classe (blocco o carattere). Per ogni classe, c'è una matrice di punti di ingresso nei driver di dispositivo. Il numero di dispositivo principale viene utilizzato per indicizzare l'array quando si chiama il codice per un determinato driver di dispositivo. Il numero di dispositivo secondario viene passato al driver di dispositivo come argomento. Il numero minore non ha alcun significato se non quello attribuitogli dal conducente. Di solito, il conducente utilizza il numero minore per accedere a uno dei numerosi dispositivi fisici identici.


Linux
  1. Limitare il numero di client connessi su un VirtualHost in Apache

  2. Come aumentare il numero di inode in un filesystem Ext4?

  3. Limite pratico al numero di istantanee Btrfs?

  4. Linux:il massimo numero di Unix?

  5. Linux:in che modo il kernel Linux conosce i numeri maggiori e minori del dispositivo?

Come trovare il numero di porta di un servizio in Linux

5 modi per contare il numero di righe in un file

Modificare il numero di porta del server SSH predefinito

In che modo le funzioni della famiglia dev_*() sono utili durante il debug del kernel Linux?

Come ottenere gli indirizzi MAC dei dispositivi che non sono nella rete

Qual è il numero massimo di porte?