O método mais preciso que conheço é usar a 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 número menor. Portanto, o próximo passo é descobrir qual é o dispositivo maior 8, menor 1.
Acho consultoria / proc / partições para ser o mais rápido. 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 8 maiores, 1 menor é 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 carimbo de data.
É importante entender / lembrar que o nome de um arquivo de dispositivo como / dev / sda1 é apenas um rótulo. Os números principais e secundários são os valores significativos e importantes do arquivo do dispositivo. Se você ficar curioso, consulte o utilitário mknod (1) usado para criar arquivos de dispositivo. Eu poderia criar uma nova entrada / dev chamada aardvark com 8 maiores, 18 menores com a seguinte sintaxe:
mknod /dev/aardvark b 8 18
Então, eu poderia montá-lo facilmente:
mount /dev/aardvark /mnt
e, se observarmos a saída do comando mount ou o conteúdo de / proc / mounts e veremos:
/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 principais e secundários - não o rótulo do arquivo do dispositivo - e que o uso da chamada de 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 apareceria em / proc / mounts para uma montagem de ligação. Esse seria o mesmo rótulo do 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 ajude:
Eu tenho / dev / sdb2 e / dev / aardvark (o mesmo que acima). Ambos são 8 maiores, 18 menores. Note que montarei o mesmo sistema de arquivos duas vezes. Eu faço o seguinte:
mkdir /mnt1 /mnt2 /foo
mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2
Observe que eu criei o diretório em / mnt1. Mas como / mnt1 e / mnt2 têm o mesmo sistema de arquivos montado, algo também poderá ser alcançado 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, veremos:
/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.
Sei que acabei de escrever um romance e a primeira metade não responde realmente à sua pergunta, mas parecia um desperdício excluí-la. Talvez ajude alguém.
Boa sorte.
PS Lembre-se de que alguns sistemas de arquivos são baseados em rede - como NFS ou CIFS - ou são procfs ou sysfs, como virtuais, e não possuem um dispositivo de bloqueio de origem. Não sei o que será retornado como o dispositivo na saída stat, apenas pelo que vale a pena.
$PWD
(que é o que estou montando) estiver enterrado em uma série de links simbólicos, montagens de ligação, etc., eu precisaria examinar recursivamente o caminho para obter pontos de montagem.