O método mais preciso que conheço é o uso da saída da chamada do sistema lstat (). Especificamente, o campo st_dev. Existe um utilitário de linha de comando, stat (1) que pode ser usado para ver essas informações. Por exemplo, a saída de "stat / etc / issue" no meu laptop:
File: ‘/etc/issue’
Size: 65 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1610916043 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Observe a terceira linha, primeiro campo, "Dispositivo". Aqui lista 801h. Esse valor pode ser separado em dois bytes, 8 e 1. O primeiro byte é conhecido como o número principal, o segundo byte é o menor. Então, o próximo passo é descobrir qual dispositivo principal 8, menor 1, é.
Acho que as consultas / proc / partitions são as mais rápidas. No meu caso, / proc / partitions tem o conteúdo:
major minor #blocks name
8 16 234431064 sdb
8 17 33554432 sdb1
8 18 200875608 sdb2
8 0 500107608 sda
8 1 500106584 sda1
É bastante claro a partir dessa saída que o major 8, menor 1, é sda1. Podemos confirmar isso com um ls -l / dev / sda1
brw-rw---- 1 root disk 8, 1 May 8 05:33 /dev/sda1
Observe o 8, 1 antes do registro de data.
É importante entender / lembrar que o nome de um arquivo de dispositivo como / dev / sda1 é apenas um rótulo. Os números maiores e menores são os valores significativos e importantes do arquivo do dispositivo. Se você ficar curioso, confira o utilitário mknod (1) usado para criar arquivos de dispositivos. Eu poderia criar uma nova entrada / dev chamada aardvark com major 8, menor 18 com a seguinte sintaxe:
mknod /dev/aardvark b 8 18
Então, eu poderia montá-lo facilmente:
mount /dev/aardvark /mnt
e, se olharmos para a saída do comando mount ou o conteúdo de / proc / mounts e vemos:
/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)
df -h mostra:
/dev/aardvark 192G 154G 38G 81% /mnt
... De qualquer forma, o objetivo de tudo isso é ilustrar que os detalhes importantes para identificar um dispositivo de bloco são os números principal e secundário - não o rótulo do arquivo do dispositivo - e que usar a chamada do sistema lstat () é a melhor maneira de consultar esses valores.
Como último comentário, apenas reli sua pergunta para ter certeza de que estava respondendo e percebi que você estava perguntando qual rótulo de dispositivo de origem seria exibido em / proc / mounts para uma montagem de associação. Esse seria o mesmo rótulo de dispositivo de origem usado na chamada original mount (2) para a origem do ponto de montagem do sistema de arquivos para a montagem de ligação. Talvez um exemplo ajudaria:
Eu tenho / dev / sdb2 e / dev / aardvark (o mesmo que acima). Ambos são maiores 8, menores de 18 anos. Note, eu vou montar o mesmo sistema de arquivos duas vezes. Eu faço o seguinte:
mkdir /mnt1 /mnt2 /foo
mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2
Repare que eu faço o diretório somedir em / mnt1. Mas como / mnt1 e / mnt2 possuem o mesmo sistema de arquivos montado, o somedir também será acessado através de / mnt2.
mkdir /mnt1/somedir
mkdir /foo/left /foo/right
mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right
Agora, se verificarmos / proc / mounts, vemos:
/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0
O rótulo do dispositivo de origem nas montagens de ligação / foo / ... é o mesmo que o valor originalmente fornecido na chamada mount (2) do sistema de arquivos. Lembre-se, / dev / aardvark e / dev / sdb2 no meu exemplo são o mesmo dispositivo.
Eu percebo que eu acabei de digitar um romance e o primeiro semestre realmente não responde à sua pergunta, mas parece um desperdício deletar isso. Talvez isso ajude alguém.
Boa sorte.
P.S. Tenha em mente que alguns sistemas de arquivos são baseados em rede - como NFS ou CIFS - ou são procfs ou sysfs virtuais e não possuem um dispositivo de bloco de origem. Eu não sei o que será retornado como o dispositivo na saída do stat, apenas pelo que vale a pena.