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 do bloco pai (por exemplo /dev/sda), dado o nome do dispositivo da partição (por exemplo /dev/sda1). Eu sei que poderia simplesmente largar o último caractere, mas isso não funcionaria em alguns casos:

  • Os leitores de cartão MMC normalmente 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 LVM são uma chaleira totalmente diferente de peixe. Não preciso apoiá-los agora, mas se levá-los em consideração exigir pouco esforço extra, não me importaria.

Dmitry Grigoryev
fonte
Quão portátil? Meu laptop tem a sua partição raiz /dev/sd0a, mas não há nenhum /dev/sd0dispositivo (há uma /dev/sd0c...)
thrig
@don_crissti, /dev/sda1e /dev/mmcblk0p1são específicos para Linux de qualquer maneira. lsblké relativamente recente.
Stéphane Chazelas
lsblktambém usa os números de nó do dispositivo para encontrar o número correto, em vez de apenas usar o nome. parece que a solução mais simples para Linux e util-linux provavelmente sempre estará disponível.
ilkkachu
1
@don_crissti lsblk -dpno pkname $devnamepassou em todos os meus testes! Talvez você deva adicionar uma resposta.
Dmitry Grigoryev
@thrig Bem, sim, eu definitivamente esperaria que o script retornasse /dev/sd0cnesse caso. As respostas abaixo funcionam para você?
Dmitry Grigoryev

Respostas:

15

Se você estiver no Linux, poderá usar lsblk(que faz parte util-linux):

lsblk -no pkname /dev/sda1
don_crissti
fonte
2
Meu lsblk( util-linux: 2.20.1, Ubuntu 14.04) não tem a pknamecoluna, apenas kname.
heemayl 8/09/16
3
@heemayl - ele foi adicionado apenas há quatro anos por isso não está disponível em distribuições que usam versões mais antigas ...
don_crissti
$ lsblk -no pkname /dev/nvme0n1p3retorna 7 linhas no meu sistema. Sim, esta partição é criptografada e contém LVM, essa não é uma situação trivial. Não sei como você deve coletar com segurança a linha certa de um script.
elboulangero
16

Se um dispositivo for uma partição de outro dispositivo, /sys/class/block/$devele 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, não são partições, exceto no caso especial em que são um linearmapeamento contíguo de um PV físico.

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

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

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

Stéphane Chazelas
fonte
Aceitei a resposta de don_crissti porque tenho lsblke a sintaxe é curta, mas reconheço que sua resposta é mais genérica e portátil. Obrigado!
Dmitry Grigoryev