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 tambahanp
). - 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.
shell-script
partition
block-device
Dmitry Grigoryev
sumber
sumber
/dev/sd0a
tetapi tidak ada/dev/sd0
perangkat (ada/dev/sd0c
...)/dev/sda1
dan/dev/mmcblk0p1
khusus untuk Linux.lsblk
relatif baru.lsblk
juga 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.lsblk -dpno pkname $devname
lulus semua tes saya! Mungkin Anda harus menambahkan jawaban./dev/sd0c
dalam kasus itu. Apakah jawaban di bawah ini cocok untuk Anda?Jawaban:
Jika Anda menggunakan linux, Anda bisa menggunakan
lsblk
(yang merupakan bagian dariutil-linux
):sumber
lsblk
(util-linux
: 2.20.1, Ubuntu 14.04) tidak memilikipkname
kolom, hanyakname
.$ lsblk -no pkname /dev/nvme0n1p3
mengembalikan 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.Jika suatu perangkat adalah partisi dari perangkat lain maka
/sys/class/block/$dev
akan berisi file yang disebutpartition
(yang isinya adalah nomor partisi).Jika itu masalahnya, Anda bisa mendapatkan nama perangkat induk dengan:
Atau dengan
zsh
:Contoh:
Volume LVM sangat berbeda, mereka bukan partisi kecuali dalam kasus khusus di mana mereka adalah satu
linear
pemetaan yang berdekatan dari PV fisik.Jika Anda dalam kasus seperti itu, Anda bisa mendapatkan nama PV itu dengan:
Di mana
$dev
sesuatu sepertidm-2
(yang dapat Anda peroleh dari"$(basename "$(readlink -f /dev/VG/LV)")"
).sumber
lsblk
dan sintaksinya pendek, tetapi saya mengakui bahwa jawaban Anda lebih umum dan portabel. Terima kasih!