विभाजन डिवाइस नाम से ब्लॉक डिवाइस नाम कैसे प्राप्त करें?


14

मैं मूल ब्लॉक डिवाइस नाम (जैसे /dev/sda) प्राप्त करने के लिए एक पोर्टेबल तरीका खोज रहा हूं जिसे विभाजन डिवाइस नाम (जैसे /dev/sda1) दिया गया है। मुझे पता है कि मैं सिर्फ आखिरी चरित्र को छोड़ सकता हूं, लेकिन यह कुछ मामलों में काम नहीं करेगा:

  • एमएमसी कार्ड पाठकों के नाम आमतौर पर पसंद होते हैं /dev/mmcblk0, जबकि उनके विभाजन के नाम जैसे होते हैं /dev/mmcblk0p1(अतिरिक्त नोटिस करें p)।
  • वैकल्पिक: कुछ ब्लॉक डिवाइसेस में कोई भी विभाजन तालिका नहीं होती है और उन्हें एक ही विभाजन के रूप में स्वरूपित किया जाता है। इस स्थिति में, विभाजन डिवाइस और पैरेंट ब्लॉक डिवाइस समान हैं।

LVM वॉल्यूम मछली की पूरी अलग-अलग केतली हैं। मुझे अभी उनका समर्थन करने की आवश्यकता नहीं है, लेकिन अगर उन्हें ध्यान में रखते हुए थोड़ा अतिरिक्त प्रयास करने की आवश्यकता है, तो मुझे कोई आपत्ति नहीं होगी।


कैसे पोर्टेबल? मेरे लैपटॉप का रूट विभाजन है, /dev/sd0aलेकिन कोई /dev/sd0डिवाइस नहीं है (एक है /dev/sd0c...)
thrig

@don_crissti, /dev/sda1और /dev/mmcblk0p1वैसे भी लिनक्स-विशिष्ट हैं। lsblkहालांकि अपेक्षाकृत हाल ही में है।
स्टीफन चेज़लस

lsblkकेवल नाम का उपयोग करने के बजाय, सही को खोजने के लिए डिवाइस नोड संख्याओं का उपयोग करता है। लगता है कि लिनक्स के लिए सबसे सरल समाधान और उपयोग-लिनेक्स हमेशा वैसे भी उपलब्ध होगा।
ilkachachu

1
@don_crissti lsblk -dpno pkname $devnameने मेरे सारे टेस्ट पास कर लिए! शायद आपको जवाब जोड़ना चाहिए।
दिमित्री ग्रिगोरीव

@ अच्छी तरह से हाँ, मैं निश्चित रूप से स्क्रिप्ट को /dev/sd0cउस मामले में वापस करने की उम्मीद करूंगा । नीचे दिए गए जवाब आपके लिए काम करते हैं?
दिमित्री ग्रिगोरीव

जवाबों:


16

यदि आप linux पर हैं, तो आप उपयोग कर सकते हैं lsblk(जो इसका हिस्सा है util-linux):

lsblk -no pkname /dev/sda1

2
मेरा lsblk( util-linux: 2.20.1, Ubuntu 14.04) pknameकॉलम नहीं है , बस kname
हेमायल सेप

3
@heemayl - यह केवल चार साल पहले जोड़ा गया था ताकि पुराने रिलीज का उपयोग करने वाले
डिस्ट्रो

$ lsblk -no pkname /dev/nvme0n1p3मेरे सिस्टम पर 7 लाइन देता है। हां, यह विभाजन एन्क्रिप्टेड है, और इसमें एलवीएम शामिल है, यह एक तुच्छ स्थिति नहीं है। मुझे नहीं पता कि आपको स्क्रिप्ट से सही लाइन पिक करने के लिए कैसे माना जाता है।
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

एलवीएम वॉल्यूम पूरी तरह से अलग हैं, वे विशेष मामले को छोड़कर विभाजन नहीं हैं जहां वे linearएक भौतिक पीवी के एक सन्निहित मानचित्रण हैं।

यदि आप ऐसे किसी मामले में हैं, तो आप उस पीवी का नाम ले सकते हैं:

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

जहां $devकुछ ऐसा है dm-2(जिसे आप प्राप्त कर सकते हैं "$(basename "$(readlink -f /dev/VG/LV)")")।


मैंने don_crissti के उत्तर को स्वीकार कर लिया है क्योंकि मेरे पास ऐसा करने के लिए है lsblkऔर सिंटैक्स कम है, लेकिन मैं स्वीकार करता हूं कि आपका उत्तर अधिक सामान्य और पोर्टेबल है। धन्यवाद!
दिमित्री ग्रिगोरीव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.