Bölümleme aygıt adından engelleme aygıtı adı nasıl alınır?


14

/dev/sdaBölümleme cihaz adı (ör /dev/sda1. ) Verilen üst blok aygıt adı (örneğin ) elde etmek için taşınabilir bir yol arıyorum . Son karakteri bırakabileceğimi biliyorum, ancak bu bazı durumlarda işe yaramaz:

  • MMC kart okuyucuları genellikle gibi adlara /dev/mmcblk0sahipken, bölümleri gibi adlara sahiptir /dev/mmcblk0p1(ekstralara dikkat edin p).
  • isteğe bağlı: bazı blok cihazlarda hiç bölüm tablosu yoktur ve tek bir bölüm olarak biçimlendirilir. Bu durumda, bölme aygıtı ile üst blok aygıtı aynıdır.

LVM hacimleri tamamen farklı bir balık su ısıtıcısıdır. Onları şu anda desteklememe gerek yok, ancak bunları dikkate almak biraz fazla çaba gerektiriyorsa, aldırmam.


Ne kadar taşınabilir? Dizüstü bilgisayarımın kök bölümü var, /dev/sd0aancak /dev/sd0cihaz yok (bir /dev/sd0c...)
thrig

@don_crissti /dev/sda1ve /dev/mmcblk0p1yine de Linux'a özgüdür. lsblkolsa da nispeten yenidir.
Stéphane Chazelas

lsblkayrıca, yalnızca adı kullanmak yerine doğru olanı bulmak için aygıt düğümü numaralarını kullanır. Linux ve util-linux için en basit çözüm muhtemelen her zaman kullanılabilir olacaktır.
ilkkachu

1
@don_crissti lsblk -dpno pkname $devnametüm sınavlarımı geçti! Belki bir cevap eklemelisin.
Dmitry Grigoryev

@thrig Evet, kesinlikle betiğin /dev/sd0cbu durumda geri dönmesini beklerdim . Aşağıdaki cevaplar sizin için uygun mu?
Dmitry Grigoryev

Yanıtlar:


16

Eğer linux kullanıyorsanız lsblk( kullanabilirsiniz util-linux):

lsblk -no pkname /dev/sda1

2
Benim lsblk( util-linux: 2.20.1, Ubuntu 14.04) pknamesütununa sahip değil kname.
heemayl

3
@heemayl - sadece dört yıl önce eklendi, bu yüzden eski sürümleri kullanan dağıtımlarda mevcut değil ...
don_crissti

$ lsblk -no pkname /dev/nvme0n1p3Sistemimde 7 satır döndürüyor. Evet, bu bölüm şifreli ve LVM içeriyor, bu önemsiz bir durum değil. Doğru satırı bir senaryodan nasıl güvenilir bir şekilde alacağınızı bilmiyorum.
elboulangero

16

Bir aygıt başka bir aygıtın bölümü /sys/class/block/$devise, adı partition(içeriği bölüm numarası olan) bir dosya içerir .

Bu durumda, ana cihazın adını şu şekilde alabilirsiniz:

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

Veya zsh:

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

Misal:

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

LVM hacimleri tamamen farklıdır, fiziksel bir PV'nin bir bitişik eşlemesi oldukları özel durum haricinde bölümler değildir linear.

Böyle bir durumdaysanız, şu PV'nin adını alabilirsiniz:

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

$devGibi bir şey nerede dm-2(hangi alabilirsiniz "$(basename "$(readlink -f /dev/VG/LV)")").


Don_crissti'nin cevabını kabul ettim çünkü ben varım lsblkve sözdizimi kısadır, ancak cevabınızın daha genel ve taşınabilir olduğunu kabul ediyorum. Teşekkürler!
Dmitry Grigoryev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.