O major, minor
número é único?
Temos citações e referências a ele?
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
Respostas:
Na interface de programação do Linux , §14.1
Veja também este capítulo antigo (2001) Linux Device Drivers (2e) .
ou seja, a intenção é fornecer um mapeamento exclusivo de instância major: minor to device: para cada tipo de dispositivo. Estritamente, você pode ter dois dispositivos distintos com o mesmo major: menor, desde que um seja char e um seja block:
No Linux, a qualquer momento no sistema, os principais: números menores para cada tipo de dispositivo são únicos. No entanto, os números podem mudar com o tempo e não precisam ser os mesmos nos diferentes sistemas Linux (mesmo a mesma distribuição, kernel e hardware). Observe que os dispositivos de caracteres e de bloco têm espaços de numeração distintos, por exemplo, o bloco principal 1 é atribuído aos discos RAM, o caractere principal 1 é atribuído a um conjunto de dispositivos do kernel, incluindo nulo e zero.
Historicamente, os majores de dispositivos eram (principalmente) alocados estaticamente por meio de um registro (também ainda presente, embora não mantido, na fonte do kernel
Documentation/devices.txt
). Atualmente, muitos dispositivos são alocados dinamicamente, isso é gerenciado pelo udev e os mapeamentos visíveis no/proc/devices
. Os dispositivos fixos ainda existem emincude/uapi/linux/major.h
(movidos recentemente deinclude/major.h
)Agora, embora a combinação major: minor identifique exclusivamente instâncias específicas de dispositivos, não há nada para impedir a criação de vários nós (arquivos) de dispositivos que se referem ao mesmo dispositivo. Eles nem precisam ser criados
/dev
(mas precisam estar em um sistema de arquivos que suporte a criação de nós do dispositivo e não é montado com anodev
opção).Um uso comum é criar dispositivos zero, nulo e aleatórios duplicados em um chroot:
Os nomes são apenas aliases, o kernel não se importa muito com a maioria dos nomes ou locais, se importa com o número principal para selecionar o driver correto, e o motorista (geralmente) se importa com o número menor para selecionar o instância correta.
A maioria dos nomes é simplesmente convenção (embora alguns sejam definidos pelo POSIX ). Observe também que um dispositivo pode se registrar para vários números principais; verifique o
sd
driver/proc/devices
; um nome de módulo de driver (.ko
) não precisa ser igual ao nome do dispositivo e não deve ser o mesmo que o nó do dispositivo/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 (dentro
/dev/
ou fora) que têm o mesmo número maior: números menores, mas, se forem do mesmo tipo, se referirão ao mesmo dispositivo. Você pode ter um driver que pode lidar com várias instâncias principais, mas dentro do kernel e dentro do driver, para cada tipo (caractere ou bloco), o principal: número menor é usado para se referir a um dispositivo específico (principal) e uma instância específica ( menor) do dispositivo.Você não pode ter dois nós de dispositivo com o mesmo tipo e principal: 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 com base no tipo e no número principal (e não no nome do nó do dispositivo) e, por convenção, o número menor seleciona deterministicamente uma instância ou sub-função específica.
Atualização Alguma história interessante e algumas perspectivas do * BSD podem ser encontradas na apresentação do BSDCon de Poul-Henning Kamp em 2002 : https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/
Se você voltar no tempo para 1978 (cortesia da Alcatel-Lucent, o Jornal Técnico do Sistema Bell de julho a agosto de 1978), o ' Sistema de compartilhamento de tempo Unix ' o define claramente (pág. 1937):
fonte
MAJ:Min
númeroQuando um arquivo de dispositivo é criado por
mknode
, os númerosmajor
eminor
são fornecidos. É assim que o Linux identifica o dispositivo de hardware subjacente associado a um arquivo de dispositivo. Na maioria dos casos, omajor
número identifica o driver, enquantominor
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 dispositivo corretos para todos eles.
fonte
Não, no Linux nem sempre são únicos.
O Linux está usando um
devpts
sistema de arquivos virtual para fornecer pseudoterminals (ptys), e esse sistema de arquivos virtual pode ser montado mais de uma vez e em locais diferentes, o que é prático ao configurar chroots ou contêineres de namespace. Enquanto umamajor:minor
tupla é única em umadevpts
instância do sistema de arquivos, não é exclusiva em um sistema em execução:No exemplo acima, o
script(1)
comando cria um pseudo-terminal e executa um shell dentro dele. É óbvio que o pseudo-terminal criado pelo primeiroscript
processo não é o mesmo que o criado pelo segundo, mas eles têm o mesmo nome e números maiores e menores.Para identificar exclusivamente um pseudoterminal, você precisa usar a
device:inode
tupla ou combinar o número do dispositivo (do sistema de arquivos devpts) com o delesmajor:minor
. O problema é que o campo "tty" do/proc/PID/stat
(7º, veja a página deproc(5)
manual; é aí que as ferramentas gostamlsof
oups
obtêm suas informações) contém apenas ost_rdev
do tty (o compactadomajor:minor
); se é um escravo pty, não há indicação para odevpts
sistema de arquivos que o fornece. Os mesmos problemas afetam o número do dispositivo que pode ser obtido com oTIOCGDEV
ioctl.AFAICS não há uma maneira confiável de identificar o terminal de controle de um processo no Linux. Correções e sugestões são bem-vindas!
fonte