2010-08-19 8 views
16

मैं सीधे सी प्रोग्राम से पूरी हार्ड डिस्क तक पहुंचना चाहता हूं। इस पर कोई एफएस नहीं है और कभी भी एक होने वाला नहीं है।लिनक्स: सी प्रोग्राम से हार्ड डिस्क सीधी पहुंच (बिना किसी एफएस के)

मैं बस/dev/sda (उदाहरण के लिए) खोलना चाहता हूं और डिस्क के ब्लॉक/सेक्टर स्तर पर I/O करना चाहता हूं।

मैं लिनक्स पर्यावरण में सी प्रोग्रामिंग सीखने के लिए कुछ प्रोग्राम लिखने की योजना बना रहा हूं (मुझे सी भाषा, पायथन, पर्ल और जावा पता है) लेकिन लिनक्स पर्यावरण के साथ विश्वास की कमी है।

मेरे सीखने के उद्देश्यों के लिए मैं क्योटो-कैबिनेट के साथ खेलने और हार्ड डिस्क के सीधे "ब्लॉक/सेक्टर" में गणना की गई हैश से संबंधित मूल्य को सहेज रहा हूं, जोड़ी रिकॉर्डिंग: "हैश, ब्लॉक/सेक्टर संदर्भ "एक क्योटो-कैबिनेट हैश डेटाबेस फ़ाइल में।

अगर यह संभव है मानक सीआई/हे कार्यों का उपयोग कर या अन्यथा मैं एक "डिवाइस ड्राइवर" या कुछ और की तरह लिखने के लिए होगा मैं नहीं जानता ...

उत्तर

7

के रूप में ड्राइव के लिए डिवाइस फ़ाइलें (जैसे /dev/sda) ब्लॉक डिवाइस हैं, इसका मतलब है कि आप फ़ाइल को लगभग सामान्य फ़ाइल की तरह खोल सकते हैं, ढूंढ सकते हैं और उपयोग कर सकते हैं।

18

जैसा कि अन्यत्र उल्लेख किया गया है, * NIX सिस्टम के तहत, /dev/sda जैसे ब्लॉक डिवाइस को सादे फाइलों के रूप में एक्सेस किया जा सकता है। ध्यान दें कि यदि फ़ाइल सिस्टम को डिवाइस से आरोहित किया गया है, तो इसे लिखने के लिए फ़ाइल के रूप में खोलना असफल हो जाएगा।

यदि आप ब्लॉक डिवाइस के साथ खेलना चाहते हैं, तो मैं पहले loop device का उपयोग करने की सलाह दूंगा, जो ब्लॉक डिवाइस के रूप में एक सादा फ़ाइल प्रस्तुत करता है। उदाहरण के लिए:

dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K 
losetup /dev/loop0 $PWD/loop_file_10MB 

उसके बाद, /dev/loop0 जैसे कि यह एक ब्लॉक डिवाइस था व्यवहार करते हैं, लेकिन सभी जानकारी लिखित फ़ाइल में संग्रहीत किया जाएगा।

+0

त्वरित उत्तर के लिए धन्यवाद। मैं इसे पहले लूप उपकरणों के साथ आज़मा दूंगा। –

+3

+1 परीक्षण के लिए लूप डिवाइस का उपयोग करने के लिए भी। – MarkR

5

हां, जैसा कि अन्य ने ध्यान दिया है, आप बस ब्लॉक डिवाइस खोल सकते हैं।

हालांकि, ब्लॉक सीमाओं और पूरे ब्लॉक पर आईओ (वैसे भी लिखना) करना वाकई अच्छा विचार है। आप इन आईओ करने के लिए pread() और pwrite() जैसे कुछ का उपयोग कर सकते हैं, या कुछ या सभी डिवाइस को mmap।

आईओक्ट्स का एक समूह है जिसका उपयोग किया जा सकता है, कुछ और जानकारी के लिए "मैन एसडी" देखें। ऐसा लगता है कि वे सभी एक ही स्थान पर दस्तावेज नहीं हैं।

linux/fs.h BLKROSET और अन्य ioctls के एक झुंड में परिभाषित कर रहे हैं, तो आप उन्हें कैसे उपयोग करने के लिए पता लगाने के लिए चारों ओर देखने के लिए है। आप उपयोगी चीजें कर सकते हैं जैसे पता लगाएं कि डिवाइस कितना बड़ा है, और ब्लॉक आकार क्या है।

util-linux-एनजी पैकेज के स्रोत कोड, अपने दोस्त है यह उदाहरण हैं।

+0

बहुत धन्यवाद @ मार्कर। मैं इसे ध्यान में रखूंगा, लेकिन लिनक्स प्रोग्रामिंग में लगभग नौसिखिया के रूप में, शायद शुरू करना बहुत कठिन हो सकता है ... –

+0

लिनक्स प्रोग्रामिंग लगभग विंडोज प्रोग्रामिंग की तरह है, इसलिए यह कोई समस्या नहीं होनी चाहिए ... आप एक को देखते हैं एपीआई, इसे आज़माने के लिए एक टेस्ट प्रोग्राम लिखें, फिर इसे अपने ऐप में इस्तेमाल करें। बस विंडोज की तरह। – MarkR

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