Bagaimana cara memblokir nama perangkat dari nama perangkat partisi?

12

Saya mencari cara portabel untuk mendapatkan nama perangkat induk blok (misalnya /dev/sda) mengingat nama perangkat partisi (misalnya /dev/sda1). Saya tahu saya bisa menghilangkan karakter terakhir, tetapi itu tidak akan berhasil dalam beberapa kasus:

  • Pembaca kartu MMC biasanya memiliki nama seperti /dev/mmcblk0, sementara partisi mereka memiliki nama seperti /dev/mmcblk0p1(perhatikan tambahan p).
  • opsional: beberapa perangkat blok tidak memiliki tabel partisi sama sekali dan diformat sebagai satu partisi. Dalam hal ini, perangkat partisi dan perangkat blok orang tua adalah sama.

Volume LVM adalah ketel ikan yang sama sekali berbeda. Saya tidak perlu mendukung mereka sekarang, tetapi jika memperhitungkannya membutuhkan sedikit usaha ekstra, saya tidak akan keberatan.

Dmitry Grigoryev
sumber
Bagaimana portabel? Laptop saya memiliki partisi root pada /dev/sd0atetapi tidak ada /dev/sd0perangkat (ada /dev/sd0c...)
thrig
@don_crissti, /dev/sda1dan /dev/mmcblk0p1khusus untuk Linux. lsblkrelatif baru.
Stéphane Chazelas
lsblkjuga menggunakan nomor simpul perangkat untuk menemukan yang benar, bukan hanya menggunakan nama. tampaknya solusi paling sederhana untuk Linux dan util-linux sepertinya akan selalu tersedia.
ilkkachu
1
@don_crissti lsblk -dpno pkname $devnamelulus semua tes saya! Mungkin Anda harus menambahkan jawaban.
Dmitry Grigoryev
@ thrig Ya, saya pasti berharap skrip untuk kembali /dev/sd0cdalam kasus itu. Apakah jawaban di bawah ini cocok untuk Anda?
Dmitry Grigoryev

Jawaban:

15

Jika Anda menggunakan linux, Anda bisa menggunakan lsblk(yang merupakan bagian dari util-linux):

lsblk -no pkname /dev/sda1
don_crissti
sumber
2
My lsblk( util-linux: 2.20.1, Ubuntu 14.04) tidak memiliki pknamekolom, hanya kname.
heemayl
3
@heemayl - itu ditambahkan hanya empat tahun lalu sehingga tidak tersedia di distro yang menggunakan rilis yang lebih lama ...
don_crissti
$ lsblk -no pkname /dev/nvme0n1p3mengembalikan 7 baris pada sistem saya. Yap, partisi ini dienkripsi, dan mengandung LVM, ini bukan situasi sepele. Saya tidak tahu bagaimana Anda seharusnya mengambil jalur yang benar dari sebuah skrip.
elboulangero
16

Jika suatu perangkat adalah partisi dari perangkat lain maka /sys/class/block/$devakan berisi file yang disebut partition(yang isinya adalah nomor partisi).

Jika itu masalahnya, Anda bisa mendapatkan nama perangkat induk dengan:

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

Atau dengan zsh:

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

Contoh:

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

Volume LVM sangat berbeda, mereka bukan partisi kecuali dalam kasus khusus di mana mereka adalah satu linearpemetaan yang berdekatan dari PV fisik.

Jika Anda dalam kasus seperti itu, Anda bisa mendapatkan nama PV itu dengan:

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

Di mana $devsesuatu seperti dm-2(yang dapat Anda peroleh dari "$(basename "$(readlink -f /dev/VG/LV)")").

Stéphane Chazelas
sumber
Saya telah menerima jawaban don_crissti karena kebetulan saya punya lsblkdan sintaksinya pendek, tetapi saya mengakui bahwa jawaban Anda lebih umum dan portabel. Terima kasih!
Dmitry Grigoryev