Como obter o nome do disco que contém uma partição específica

4

Se eu sei que uma partição é, por exemplo /dev/sda1 , como posso obter o nome do disco ( /dev/sda neste caso) que contém a partição?

  • A saída deve ser apenas um caminho para o disco (como /dev/sda ).
  • Ele não deve exigir manipulação de string, porque eu preciso que ele funcione para diferentes tipos de disco.
por Snoop05 30.08.2015 / 17:20

3 respostas

6

Você pode observar em /sys o dispositivo de bloco de um determinado nome de partição. Por exemplo, / dev / sda1:

$ ls -l /sys/class/block/sda1
lrwxrwxrwx 1 root root /sys/class/block/sda1 -> \
 ../../devices/pci0000:00/.../ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1

Um script para levar arg /dev/sda1 e imprimir /dev/sda é:

part=$1
part=${part#/dev/}
disk=$(readlink /sys/class/block/$part)
disk=${disk%/*}
disk=/dev/${disk##*/}
echo $disk

Eu não tenho o lvm etc. para testar, mas provavelmente há algum caminho similar.

Há também lsblk :

$ lsblk -as /dev/sde1
NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sde1    8:65   1  7.4G  0 part 
'-sde   8:64   1  7.4G  0 disk 

e como @don_crissti disse que você pode obter o pai diretamente com:

lsblk -no pkname /dev/sda1
    
por 30.08.2015 / 18:18
0

Talvez não seja bonito:

for d in 'fdisk -l 2>/dev/null | grep "^Disk " | cut -d":" -f1 | cut -f2'
do
  if [ 'fdisk -l $d 2>/dev/null | grep -c "/dev/sda1"' -gt 0 ]
  then
    echo On disk $d
  fi
done

Funciona apenas para discos 'reais', não para o LVM.

    
por 30.08.2015 / 18:27
0

Funciona apenas com a localidade UTF-8. lvm, zfs, raid testado ok.

parent_tree_disk() {
  lsblk | awk '/^[A-Za-z]/{d0=$1; print d0};/^[└─├─]/{d1=$1; print d0, d1};/^  [└─├─]/{d2=$1; print d0, d1, d2}' | sed 's/[├─└─]//g'
}

alias pd='parent_tree_disk'

comando shell: # pd
NAME
sda
sda sda1
sda sda2
sda sda2 cl-root
sda sda2 cl-swap

comando shell: # pd | awk '/ sda2 / {print $ 1}'
sda

E você pode usar outro filtro na saída da lista pd, como sort, uniq ...

    
por 25.10.2018 / 04:51