web-dev-qa-db-ja.com

特定のパーティションを含むディスク名を取得する方法

たとえば、パーティションが/dev/sda1であることがわかっている場合、そのパーティションを含むディスク名(この場合は/dev/sda)を取得するにはどうすればよいですか?

  • 出力は、ディスクへのパス(/dev/sdaなど)のみである必要があります。
  • 文字列操作は必要ありません。さまざまなディスクタイプで機能するためです。
6
Snoop05

特定のパーティション名のブロックデバイスを/sysで確認できます。たとえば、/ 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

Arg /dev/sda1を取得して/dev/sdaを出力するスクリプトは次のとおりです。

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

試用するlvmなどはありませんが、おそらく同じようなパスがいくつかあります。


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 

そして@don_crisstiが言ったように、あなたは直接親を得ることができます:

lsblk -no pkname /dev/sda1
8
meuh

UTF-8ロケールでのみ機能します。 lvm、zfs、raidはテスト済みです。

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'

シェルコマンド:# pd
名前
sda
sda sda1
sda sda2
sda sda2 cl-root
sda sda2 cl-swap

シェルコマンド:# pd | awk '/ sda2/{print $ 1}'
sda

そして、あなたはソート、一意のようなpdリスト出力で他のフィルターを使うことができます...

1
Anton Riab

おそらく美しくないでしょう:

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

LVMではなく、「実際の」ディスクに対してのみ機能します。

0
Marco