Meu primeiro comentário é tudo o que você afirma que funcionará somente se o sistema de arquivos no dispositivo em que você está interessado estiver montado. Mas eu acho que você sabe disso e aceita essa limitação.
O método que você propõe parece bastante completo e acho que vai pegar todos os casos.
Sobre a procura do ip em /sys/dev/block
:
- Você não está procurando
<maj>:0
ao declarar. Você está procurando<major>:<minor>
. - Esteja preparado para o caso em que você não o encontra. Alguns sistemas de arquivos como
/proc
e tipotmpfs
enfs
não possuem dispositivos associados. Você vai querer ignorá-los, pois eles não podem corresponder ao dispositivo de bloco que lhe interessa.
Ao procurar o nome do dispositivo, não digitalize /sys/dev/block/<major>:<minor>/uevent
. Em vez disso, para um readlink()
on /sys/dev/block/<major>:<minor>
em si e obter o nome de base do resultado. Você deve obter o mesmo resultado, mas é um pouco mais limpo e mais eficiente.
Se você quiser pesquisar vários dispositivos, deverá varrer /proc/mounts
e fazer a consulta /sys
inteira apenas uma vez e armazenar em cache os resultados da próxima consulta de dispositivo.
Não há nenhuma chamada de sistema show_me_mounts()
. No Linux, é para isso que o /proc/mounts
serve. Mas como você percebeu, não é perfeito. Geralmente você não verá o problema /dev/root
virtual / inexistente com uma inicialização baseada em initramfs totalmente moderna.
Editar com base na sua exigência de encontrar o disco inteiro correspondente a cada partição.
Para obter o dispositivo de bloco "externo" (= disco inteiro) dado um dispositivo de bloco "interno" (= partição), você não pode apenas alterar o número do dispositivo menor para 0.
A maneira correta de fazer isso se você encontrou 8 principais e 1 menor é procurar neste arquivo:
/sys/dev/block/8:1/../dev
Isso produzirá 8:0
, mas sem a suposição incorreta de que o ID do dispositivo secundário sempre pode ser alternado para 0.
Se você obtiver ENOENT
tentando abri-lo, é porque o tipo de dispositivo de bloco em questão não tem uma hierarquia interna / externa ou o ID de dispositivo secundário não corresponde a um dispositivo interno.