Como obter o nome do dispositivo de bloco do nome do dispositivo de partição?

12

Estou procurando uma maneira portátil de obter o nome do dispositivo de bloqueio pai (por exemplo, /dev/sda ), dado o nome do dispositivo de partição (por exemplo, /dev/sda1 ). Eu sei que poderia deixar o último caractere, mas isso não funcionaria em alguns casos:

  • Os leitores de cartões MMC geralmente têm nomes como /dev/mmcblk0 , enquanto suas partições têm nomes como /dev/mmcblk0p1 (observe o extra p ).
  • opcional: alguns dispositivos de bloco não possuem nenhuma tabela de partição e são formatados como uma única partição. Nesse caso, o dispositivo de partição e o dispositivo de bloco pai são os mesmos.

Os volumes de LVM são uma chaleira de peixe totalmente diferente. Eu não preciso apoiá-los agora, mas se levá-los em conta requer pouco esforço extra, eu não me importaria.

    
por Dmitry Grigoryev 08.09.2016 / 21:14

2 respostas

14

Se você está no linux você pode usar lsblk (que faz parte de util-linux ):

lsblk -no pkname /dev/sda1
    
por 08.09.2016 / 21:39
15

Se um dispositivo for uma partição de outro dispositivo, /sys/class/block/$dev conterá um arquivo chamado partition (cujo conteúdo é o número da partição).

Se for esse o caso, você pode obter o nome do dispositivo pai com:

basename "$(readlink -f "/sys/class/block/$dev/..")"

Ou com zsh :

echo /sys/class/block/$dev(:A:h:t)

Exemplo:

$ dev=sda1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
sda
$ dev=nbd0p1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
nbd0

Os volumes LVM são completamente diferentes, eles não são partições exceto no caso especial em que eles são um mapeamento linear contíguo de um PV físico.

Se você estiver nesse caso, pode obter o nome desse PV com:

ls "/sys/class/block/$dev/slaves"

Onde $dev é algo como dm-2 (que você pode obter de "$(basename "$(readlink -f /dev/VG/LV)")" ).

    
por 08.09.2016 / 21:27