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 extrap
). - 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.
shell-script
partition
block-device
Dmitry Grigoryev
fonte
fonte
/dev/sd0a
, mas não há nenhum/dev/sd0
dispositivo (há uma/dev/sd0c
...)/dev/sda1
e/dev/mmcblk0p1
são específicos para Linux de qualquer maneira.lsblk
é relativamente recente.lsblk
també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.lsblk -dpno pkname $devname
passou em todos os meus testes! Talvez você deva adicionar uma resposta./dev/sd0c
nesse caso. As respostas abaixo funcionam para você?Respostas:
Se você estiver no Linux, poderá usar
lsblk
(que faz parteutil-linux
):fonte
lsblk
(util-linux
: 2.20.1, Ubuntu 14.04) não tem apkname
coluna, apenaskname
.$ lsblk -no pkname /dev/nvme0n1p3
retorna 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.Se um dispositivo for uma partição de outro dispositivo,
/sys/class/block/$dev
ele conterá um arquivo chamadopartition
(cujo conteúdo é o número da partição).Se for esse o caso, você pode obter o nome do dispositivo pai com:
Ou com
zsh
:Exemplo:
Os volumes LVM são completamente diferentes, não são partições, exceto no caso especial em que são um
linear
mapeamento contíguo de um PV físico.Se você estiver nesse caso, poderá obter o nome desse PV com:
Onde
$dev
é algo comodm-2
(do qual você pode obter"$(basename "$(readlink -f /dev/VG/LV)")"
).fonte
lsblk
e a sintaxe é curta, mas reconheço que sua resposta é mais genérica e portátil. Obrigado!