2011-04-01 9 views
5

में कौन सी डिवाइस एक फ़ाइल है, मैं जानना चाहता हूं कि फ़ाइल में/dev के अंतर्गत कौन सी प्रविष्टि है। उदाहरण के लिए, यदि/dev/sdc1/media/disk के अंतर्गत आरोहित है, और मैं/मीडिया/डिस्क/foo.txt, मैं प्रतिक्रिया के रूप में/dev/sdc प्राप्त करना चाहता हूं।लिनक्स प्रोग्रामिंग:

स्टेट उस फ़ाइल पर सिस्टम कॉल का उपयोग करके मुझे इसके विभाजन प्रमुख और मामूली संख्याएं मिलेंगी (8 और 33, एसडीसी 1 के लिए)। अब मुझे "रूट" डिवाइस (एसडीसी) या उसके प्रमुख/नाबालिग को प्राप्त करने की आवश्यकता है। क्या कोई syscall या लाइब्रेरी फ़ंक्शन क्या मैं विभाजन को अपने मुख्य डिवाइस से जोड़ने के लिए उपयोग कर सकता हूं? या इससे भी बेहतर, उस उपकरण को फ़ाइल से सीधे प्राप्त करने के लिए?

brw-rw---- 1 root floppy 8, 32 2011-04-01 20:00 /dev/sdc 
brw-rw---- 1 root floppy 8, 33 2011-04-01 20:00 /dev/sdc1 

अग्रिम धन्यवाद!

उत्तर

8

त्वरित और गंदे संस्करण: df $file | awk 'NR == 2 {print $1}'

प्रोग्रामेटिक रूप से ... अच्छा, एक त्वरित कारण है कि मैंने त्वरित और गंदे संस्करण के साथ शुरुआत की। प्रोग्राम्सिक रूप से घुड़सवार फाइल सिस्टम की सूची प्राप्त करने के लिए कोई पोर्टेबल तरीका नहीं है। (getmntent()fstab प्रविष्टियां प्राप्त करता है, जो एक ही बात नहीं है।) इसके अलावा, आप विश्वसनीय रूप से mount(8) के आउटपुट को भी पार्स नहीं कर सकते हैं; विभिन्न यूनिक्स पर, माउंट पॉइंट पहला या अंतिम आइटम हो सकता है। ऐसा करने का सबसे पोर्टेबल तरीका समाप्त होता है ... पार्सिंग df आउटपुट (और यहां तक ​​कि अगर iffy है, जैसा कि आपने विभाजन संख्या के साथ देखा है।)। तो आप वैसे भी त्वरित और गंदे खोल समाधान पर वापस आ गए हैं, जब तक कि आप /dev को पार नहीं करना चाहते हैं और major(st_rdev) (major()sys/types.h से) के साथ ब्लॉक डिवाइस देखें।

यदि आप इसे लिनक्स तक सीमित करते हैं, तो आप घुड़सवार फाइल सिस्टम की सूची प्राप्त करने के लिए /proc/mounts का उपयोग कर सकते हैं। अन्य विशिष्ट यूनिक्स को समान रूप से अनुकूलित किया जा सकता है: उदाहरण के लिए, ओएस एक्स और मुझे फ्रीबीएसडी लगता है, आप sysctl()vfs पेड़ पर माउंट पॉइंट प्राप्त करने के लिए उपयोग कर सकते हैं। सबसे खराब स्थिति में आप माउंट टेबल फ़ाइल जो भी हो, उसे समझने के लिए उचित हेडर फ़ाइल ढूंढ सकते हैं और उपयोग कर सकते हैं (और हाँ, यहां तक ​​कि यह भिन्न होता है: सोलारिस पर यह /etc/mnttab पर कई अन्य प्रणालियों पर /etc/mtab है, कुछ सिस्टम /etc के बजाय /var/run में डालते हैं, और कई लिनक्स पर यह /proc/mounts पर या तो कोई भी नहीं है या एक सिम्लिंक है)। और इसका प्रारूप हर यूनिक्स-जैसे ओएस पर काफी अलग है।

+0

धन्यवाद उल्लेख किया है, लेकिन मैं यह केवल प्रणाली/पुस्तकालय कॉल का उपयोग हासिल करना चाहते हैं। साथ ही, आपका सुझाव मुझे विभाजन संख्या दे रहा है ;-) – Grieih

+0

@Grieih: इसे +1 करें क्योंकि आपने कभी निर्दिष्ट नहीं किया है कि आप इसे सी-कोड में चाहते थे। अनुलेख '-F' जोड़ना [0-9] '' विभाजन संख्या – SiegeX

+1

@Greih को हटा देगा: अद्यतन देखें। दुर्भाग्य से, मैं एक कारण के लिए इसके साथ गया था। – geekosaur

2

जो आप खोज रहे हैं वह असंभव है - ब्लॉक डिवाइस फ़ाइल और विभाजन का वर्णन करने वाले विभाजन के बीच कोई 1: 1 कनेक्शन नहीं है।

पर विचार करें:

  1. आप अलग अलग नामों के साथ एकाधिक ब्लॉक युक्ति फ़ाइलें (लेकिन एक ही बड़ी और छोटी संख्या) बना सकते हैं और वे अप्रभेद्य हैं (न: 1)

  2. आप एक का उपयोग कर सकते विभाजन को माउंट करने के लिए माउंट करने के लिए एक तर्क के रूप में डिवाइस फ़ाइल ब्लॉक करें और फिर विभाजन को छोड़कर ब्लॉक डिवाइस फ़ाइल को हटा दें। (0: 1)

तो कुछ विशिष्ट और संकीर्ण मामलों को छोड़कर आप जो चाहते हैं उसे करने का कोई तरीका नहीं है।

1

प्रमुख संख्या आपको बताएगी कि यह कौन सा डिवाइस है: 3 - 1 नियंत्रक पर आईडीई, 22 - दूसरे नियंत्रक पर आईडीई और एससीएसआई के लिए 8।

मामूली संख्या आपको विभाजन संख्या बताएगी और - आईडीई उपकरणों के लिए - यदि यह प्राथमिक या माध्यमिक ड्राइव है।आईडीई और एससीएसआई के लिए यह गणना अलग है।

आईडीई के लिए यह है: एक्स * 64 + पी, एक्स नियंत्रक पर ड्राइव संख्या (0 या 1) और पी विभाजन

है SCSI के लिए यह है: y * 16 + पी, जहां y की दूरी पर है संख्या और पी विभाजन

3

जो जानकारी आप चाहते हैं वह sysfs में मौजूद है जो लिनक्स डिवाइस पेड़ को उजागर करती है। यह सिस्टम पर उपकरणों के बीच संबंधों को मॉडल करता है और चूंकि आप किसी विभाजन से पैरेंट डिस्क डिवाइस को निर्धारित करने का प्रयास कर रहे हैं, यह देखने का स्थान है। मुझे नहीं पता कि क्या कोई कठोर और तेज़ नियम हैं जो आप कर्नेल के भविष्य के संस्करणों के साथ अपने कोड को तोड़ने के लिए भरोसा कर सकते हैं, लेकिन कर्नेल डेवलपर्स एक स्थिर इंटरफ़ेस के रूप में sysfs को बनाए रखने का प्रयास करते हैं।

यदि आप /sys/dev/block/<major>:<minor> पर देखते हैं, तो आप देखेंगे कि यह पूंछ घटक block/<disk-device-name>/<partition-device-name> होने के साथ एक सिम्लिंक है। यदि आप उस पर readlink(2) सिस्टम कॉल करना चाहते थे, तो आप डिस्क डिवाइस का नाम प्राप्त करने के लिए लिंक गंतव्य को पार्स कर सकते थे। खोल में (के बाद से यह इस तरह से व्यक्त करने के लिए आसान है, लेकिन सी में यह कर बहुत आसान हो जाएगा):,

$ echo $(basename $(dirname $(readlink /sys/dev/block/8:33))) 
sdc 

वैकल्पिक रूप से आप (डिस्क निर्देशिका में विभाजन निर्देशिका के घोंसले का लाभ ले सकता है खोल में फिर से, लेकिन सी से, अपने एक open(2), read(2), और close(2)):

$ cat /sys/dev/block/8:33/../dev 
8:32 

अपने प्रमुख शुरू कर मान लिया गया है कि: नाबालिग एक विभाजन, नहीं गैर नेस्टेड डिवाइस के कुछ अन्य प्रकार के लिए वास्तव में है।

0

नहीं syscall, लेकिन:

df -h /path/to/my/file

से https://unix.stackexchange.com/questions/128471/determine-what-device-a-directory-is-located-on

तो तुम df के स्रोत कोड देख कर आपको यह क्या करता है हो सकता है।

मुझे पता है इस पोस्ट पुरानी है, लेकिन इस सवाल का मेरे खोज में 2 परिणाम था और कोई भी df -h

संबंधित मुद्दे