São os principais, menor número único

9

O major, minor number é exclusivo?

Temos alguma citação e referência a ela?

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 
    
por Dipak Ingole 11.04.2014 / 10:30

3 respostas

16

De A interface de programação Linux , §14.1

Each device file has a major ID number and a minor ID number. The major ID identifies the general class of device, and is used by the kernel to look up the appropriate driver for this type of device. The minor ID uniquely identifies a particular device within a general class. The major and minor IDs of a device file are displayed by the ls ­-l command.

[...]

Each device driver registers its association with a specific major device ID, and this association provides the connection between the device special file and the device. The name of the device file has no relevance when the kernel looks for the device driver.

Veja também este antigo (2001) capítulo de Drivers de Dispositivos Linux (2e) .

i.e. a intenção é fornecer um mapeamento exclusivo de major: minor para device: instance para cada tipo de dispositivo. Estritamente, você pode ter dois dispositivos distintos com o mesmo major: menor, contanto que um seja char e um seja bloco:

# 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

No Linux, a qualquer momento em um sistema , o principal: números menores para cada tipo de dispositivo são exclusivos. Os números podem, no entanto, mudar ao longo do tempo, e não precisam ser os mesmos em diferentes sistemas Linux (mesmo a mesma distribuição, kernel e hardware). Tenha em atenção que os dispositivos de caracteres e blocos têm espaços de numeração distintos, por ex. o bloco maior 1 é atribuído aos discos RAM, o caractere principal 1 é atribuído a um conjunto de dispositivos kernel, incluindo nulo e zero.

Historicamente, os majores de dispositivos eram (principalmente) estaticamente alocados por um registro (também ainda presente, embora sem manutenção , na fonte do kernel Documentation/devices.txt ). Atualmente, muitos dispositivos são alocados dinamicamente, isso é gerenciado por udev , e os mapeamentos visíveis em /proc/devices . Os dispositivos fixos ainda existem em incude/uapi/linux/major.h (movido recentemente de include/major.h )

Agora, embora a principal: combinação secundária identifique exclusivamente instâncias de dispositivo específicas, não há nada que impeça a criação de nós de vários dispositivos (arquivos) que se referem ao mesmo dispositivo. Eles nem precisam ser criados em /dev (mas eles precisam estar em um sistema de arquivos que suporte a criação de nós de dispositivos e não são montados com a opção nodev ).

Um uso comum é a criação de dispositivos zero, nulos e aleatórios duplicados em um 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

Os nomes são apenas aliases, o kernel não se importa muito com a maioria dos nomes ou locais, ele se preocupa com o número principal para poder selecionar o driver correto, e o driver (geralmente) se importa com o número menor. pode selecionar a instância correta.

A maioria dos nomes é simplesmente convencional (embora alguns alguns sejam definidos por POSIX ). Observe também que um dispositivo pode se registrar para vários números principais, verifique o driver sd em /proc/devices ; um nome de módulo de driver ( .ko ) não precisa ser o mesmo nome do dispositivo e não precisa ser igual ao nó do dispositivo em /dev , e um único módulo de driver pode gerenciar vários dispositivos lógicos / físicos ou nomes de dispositivos.

Para recapitular: você pode ter dois ou mais nós de dispositivo (em /dev/ ou em outro lugar) que tenham o mesmo major: números menores, mas se forem do mesmo tipo, eles se referem ao mesmo dispositivo. Você pode ter um driver que possa lidar com várias instâncias principais, mas dentro do kernel e dentro do driver, para cada tipo (char ou bloco) o principal: número menor é usado para se referir a um dispositivo específico (maior) e uma instância específica ( menor) do dispositivo.

Você não pode ter dois nós de dispositivo com o mesmo tipo e maior: menor e esperar que eles acessem dois dispositivos lógicos ou físicos diferentes. Quando um dispositivo está sendo acessado, o kernel seleciona um driver baseado no tipo e no número principal (e não baseado no nome do nó do dispositivo), e por convenção o número menor seleciona deterministicamente uma instância específica ou subfunção.

Atualizar Alguma história interessante e alguma perspectiva * BSD podem ser encontradas na apresentação de 2002 do BSDCon de Poul-Henning Kamp:   link

Se você voltar no tempo para 1978 (cortesia da Alcatel- Lucent, o Jornal Técnico do Sistema Bell julho-agosto de 1978) o ' Unix Time Sharing System ' define claramente (p1937):

Devices are characterized by a major device number, a minor device number, and a class (block or character). For each class, there is an array of entry points into the device drivers. The major device number is used to index the array when calling the code for a particular device driver. The minor device number is passed to the device driver as an argument. The minor number has no significance other than that attributed to it by the driver. Usually, the driver uses the minor number to access one of several identical physical devices.

    
por 11.04.2014 / 11:20
2

Quando um arquivo de dispositivo é criado por mknode , os números major e minor são fornecidos. É assim que o Linux identifica o dispositivo de hardware subjacente associado a um arquivo de dispositivo. Na maioria dos casos, eles major number identificam o driver enquanto o minor distingue os diferentes dispositivos que o driver controla.

Como tal, os números devem ser exclusivos para cada dispositivo ou não seria possível criar arquivos de dispositivos corretos para todos eles.

    
por 11.04.2014 / 11:24
1

O número principal para discos SCSI é 8.

Haverá um número principal separado para cada tipo de disco.

Como @Kiwy disse em seu comentário, o número principal é usado para identificar o tipo de disco, e o menor número representa a subdivisão do disco de hardware principal.

Fonte

Na captura de tela acima, você pode ver que o maior número de partições lvm criptografadas é diferente das partições comuns.

    
por 11.04.2014 / 10:50