パーティションデバイス名からブロックデバイス名を取得する方法は?


12

/dev/sdaパーティションデバイス名(例/dev/sda1)を指定して、親ブロックデバイス名(例)を取得するポータブルな方法を探しています。私は最後のキャラクターを落とすことができることを知っていますが、場合によってはうまくいかないでしょう:

  • MMCカードリーダーには通常、などの名前が付いていますが/dev/mmcblk0、パーティションには/dev/mmcblk0p1(余分に注意してくださいp)のような名前が付いています。
  • オプション:一部のブロックデバイスにはパーティションテーブルがまったくなく、単一のパーティションとしてフォーマットされています。この場合、パーティションデバイスと親ブロックデバイスは同じです。

LVMボリュームは、まったく異なるケトルです。私は今それらをサポートする必要はありませんが、それらを考慮に入れるのに余分な努力がほとんど必要ないなら、私は気にしません。


どのくらいポータブルですか?私のラップトップのルートパーティションはオンになって/dev/sd0aいますが、/dev/sd0デバイスがありません(/dev/sd0c... があります)
-thrig

@don_crissti、/dev/sda1そして/dev/mmcblk0p1とにかくLinux固有です。lsblkしかし比較的最近です。
ステファンシャゼラス16

lsblkまた、単に名前を使用するのではなく、デバイスノード番号を使用して正しい番号を見つけます。とにかく、Linuxとutil-linuxの最も簡単なソリューションは常に利用できるようです。
イルッカチュ

1
@don_crissti lsblk -dpno pkname $devnameはすべてのテストに合格しました!おそらく答えを追加する必要があります。
ドミトリーグリゴリエフ

@thrigええ、そうだとすれば、スクリプトが必ず返ってくると思い/dev/sd0cます。以下の答えはあなたに合っていますか?
ドミトリーグリゴリエフ

回答:


15

Linuxを使用している場合は、次を使用できますlsblk(これはの一部ですutil-linux)。

lsblk -no pkname /dev/sda1

2
lsblkutil-linux:2.20.1、Ubuntu 14.04)にはpkname列がありませんkname
-heemayl

3
@heemayl- わずか 4年前に追加されたため、古いリリースを使用するディストリビューションでは使用できません
...-don_crissti

$ lsblk -no pkname /dev/nvme0n1p3私のシステムで7行を返します。はい、このパーティションは暗号化されており、LVMが含まれています。これは些細な状況ではありません。スクリプトから正しい行を確実に取得する方法がわからない。
-elboulangero

16

デバイスが別のデバイスのパーティションである場合、そのコンテンツがパーティション番号である/sys/class/block/$devというファイルが含まれますpartition

その場合は、次を使用して親デバイスの名前を取得できます。

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

またはzsh

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

例:

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

LVMボリュームは完全に異なり、物理PVの1つの連続したマッピングである特別な場合を除き、パーティションではありませんlinear

そのような場合は、次のコマンドでそのPVの名前を取得できます。

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

$devようなものがdm-2あります(から取得できます"$(basename "$(readlink -f /dev/VG/LV)")")。


don_crisstiの答えは、たまたまlsblk構文が短いため受け入れましたが、あなたの答えはより一般的で移植性があることを認めます。ありがとう!
ドミトリーグリゴリエフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.