कैसे / खरीद / * काम करता है?


61

में कई फाइलें हैं /proc, पसंद /proc/cpuinfo, /proc/meminfo, /proc/devices और इसी तरह, जो, जब खोला जाता है, तो सिस्टम जानकारी लौटाता है।

इन फ़ाइलों को चलाने के रूप में वास्तविकता में कोई अस्तित्व नहीं लगता है file उन पर केवल यह बताता है कि वे खाली हैं।

$ file /proc/cpuinfo
/proc/cpuinfo: empty

ये फाइलें बिल्कुल कैसे काम करती हैं?

जवाबों:


72

यह वास्तव में बहुत सरल है, कम से कम यदि आपको कार्यान्वयन विवरण की आवश्यकता नहीं है।

लिनक्स पर सबसे पहले, सभी फाइल सिस्टम (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) कर्नेल में लागू किए जाते हैं। कुछ लोग FUSE के माध्यम से उपयोगकर्ता कोड के लिए काम करना बंद कर सकते हैं, और कुछ केवल कर्नेल मॉड्यूल के रूप में आते हैं ( देशी ZFS लाइसेंसिंग प्रतिबंधों के कारण उत्तरार्द्ध का एक उल्लेखनीय उदाहरण है), लेकिन या तो वहाँ एक कर्नेल घटक बना हुआ है। यह एक महत्वपूर्ण मूल है।

जब कोई प्रोग्राम किसी फ़ाइल से पढ़ना चाहता है, तो यह विभिन्न सिस्टम लाइब्रेरी कॉल जारी करेगा जो अंत में कर्नेल के रूप में समाप्त होता है open(), read(), close() अनुक्रम (संभवतः के साथ seek() अच्छे उपाय के लिए फेंका गया)। कर्नेल प्रदान किए गए पथ और फ़ाइल नाम को लेता है, और फ़ाइल सिस्टम और डिवाइस I / O लेयर के माध्यम से इन्हें भौतिक रीड रिक्वेस्ट में अनुवाद करता है (और कई मामलों में रिक्वेस्ट भी लिखता है - उदाहरण के लिए atime अपडेट के लिए) कुछ अंतर्निहित मेमोरी में।

हालाँकि, इसमें उन अनुरोधों का विशेष रूप से अनुवाद नहीं करना है शारीरिक, लगातार भंडारण । कर्नेल का अनुबंध यह है कि सिस्टम कॉल के उस विशेष सेट को जारी करना विचाराधीन फ़ाइल की सामग्री प्रदान करें । जहां वास्तव में हमारे भौतिक क्षेत्र में "फाइल" मौजूद है, यह इसके लिए गौण है।

पर /proc आम तौर पर घुड़सवार के रूप में जाना जाता है procfs। यह एक विशेष फ़ाइल सिस्टम प्रकार है, लेकिन चूंकि यह एक फ़ाइल सिस्टम है, इसलिए यह वास्तव में उदा से अलग नहीं है। एक ext3 फ़ाइल सिस्टम कहीं घुड़सवार। तो यह अनुरोध उन सभी फाइल और निर्देशिकाओं के बारे में पता करने के लिए, जिसे सिस्टम फाइल कोड ड्राइवर कोड के लिए पास कर दिया जाता है और कर्नेल डेटा संरचनाओं से जानकारी के विशेष टुकड़े लौटाता है

इस मामले में "संग्रहण परत" कर्नेल डेटा संरचना है, और procfs उन तक पहुँचने के लिए एक स्वच्छ, सुविधाजनक इंटरफ़ेस प्रदान करता है। ध्यान रखें कि बढ़ते प्रोक्योरमेंट्स /proc बस सम्मेलन है; आप इसे आसानी से कहीं और माउंट कर सकते हैं। वास्तव में, ऐसा कभी-कभी किया जाता है, उदाहरण के लिए चुरोट जेल में जब वहां चल रही प्रक्रिया को किसी कारण से / खरीद की आवश्यकता होती है।

यदि आप किसी फ़ाइल पर मान लिखते हैं तो यह उसी तरह काम करता है; कर्नेल स्तर पर, की एक श्रृंखला में अनुवाद करता है open(), seek(), write(), close() कॉल जो फिर से फाइल सिस्टम ड्राइवर के पास जाती है; फिर से, इस विशेष मामले में, कोड की घोषणा करता है।

विशेष कारण आप देखते हैं file लौटने empty यह है कि procfs द्वारा उजागर की गई फ़ाइलों में से कई उजागर हैं 0 बाइट्स का आकार। 0 बाइट का आकार संभवतः कर्नेल साइड पर एक ऑप्टिमाइज़ेशन है (कई फाइलें / प्रॉप डायनेमिक हैं और आसानी से लंबाई में भिन्न हो सकती हैं, संभवत: एक रीडिंग से दूसरे में भी, और प्रत्येक डायरेक्टरी रीड पर प्रत्येक फाइल की लंबाई की गणना कर सकती है। संभावित रूप से बहुत महंगा हो सकता है)। इस उत्तर के लिए टिप्पणियों द्वारा जा रहे हैं, जिन्हें आप स्ट्रेस या इसी तरह के टूल के माध्यम से चलाकर अपने सिस्टम पर सत्यापित कर सकते हैं, file पहले मुद्दे stat() किसी भी विशेष फ़ाइल का पता लगाने के लिए कॉल करें, और फिर अवसर लेता है, यदि फ़ाइल का आकार 0 के रूप में रिपोर्ट किया जाता है, और फ़ाइल को खाली होने के रूप में रिपोर्ट करें।

यह व्यवहार वास्तव में प्रलेखित है और हो सकता है निर्दिष्ट करके ओवरराइड किया गया -s या --special-files पर file मंगलाचरण, हालाँकि जैसा कि मैनुअल पेज में बताया गया है कि इसके साइड इफेक्ट्स हो सकते हैं। नीचे दिया गया उद्धरण बीएसडी फ़ाइल 5.11 मैन पेज, दिनांक 17 अक्टूबर 2011 से है।

आम तौर पर, फ़ाइल केवल तर्क फ़ाइलों के प्रकार को पढ़ने और निर्धारित करने का प्रयास करती है जो स्टेट (2) रिपोर्ट साधारण फाइलें हैं। यह समस्याओं को रोकता है, क्योंकि विशेष फ़ाइलों को पढ़ने से अजीब परिणाम हो सकते हैं। निर्दिष्ट कर रहा है -s विकल्प फ़ाइल को तर्क फ़ाइलों को भी पढ़ने का कारण बनता है जो ब्लॉक या चरित्र विशेष फाइलें हैं। यह कच्चे डिस्क विभाजन में डेटा के फाइल सिस्टम प्रकार को निर्धारित करने के लिए उपयोगी है, जो विशेष फाइलों को ब्लॉक करते हैं। इस विकल्प के कारण फ़ाइल का आकार नापने का भी कारण बनता है जैसा कि स्टेट ने रिपोर्ट किया था (2) चूंकि कुछ प्रणालियों पर यह कच्चे डिस्क विभाजन के लिए एक शून्य आकार की रिपोर्ट करता है।


5
जब आप इसे साथ देखते हैं strace file /proc/version या ltrace -S /proc/versionअनुकूलन बल्कि छोटा है। यह एक करता है stat() पहले कॉल करें और पाता है कि आकार 0 है, इस प्रकार लंघन open() - लेकिन इससे पहले यह कई मैजिक फाइल लोड कर रहा है।
ott--

2
@ ott-- यह वास्तव में घटनाओं का एक अजीब अनुक्रम है, लेकिन यह हो सकता है इस तथ्य से संबंधित हो कि आप कई फ़ाइल नामों को पास कर सकते हैं file। इस तरह, मैजिक फाइलों को प्री-लोड करता है, फिर कमांड लाइन पैरामीटर को पैरामीटर द्वारा प्रोसेस करता है; मैजिक फाइल लोडिंग को मूव करने के बजाय "यह किस तरह की फाइल को निर्धारित करने की कोशिश करने से पहले करें इस विशेष रूप से एक "कोड का हिस्सा है, जो जटिलता को बढ़ाएगा। कॉलिंग stat() और इसके वापसी मूल्य पर अभिनय करना अनिवार्य रूप से हानिरहित है; अतिरिक्त आंतरिक राज्य के जोखिमों को ध्यान में रखते हुए बग को शुरू करने में जटिलता को जोड़ना।
a CVn

@ ott-- वास्तव में, इसका कारण file रिपोर्ट "फ़ाइल खाली है" क्योंकि यह कॉल करता है stat विशेष फ़ाइलों (नामित पाइप, डिवाइस,…) का पता लगाने के लिए, और यह खाली फ़ाइलों को संसाधित करने से रोकने का अवसर लेता है। file -s /proc/version रिपोर्ट "ASCII पाठ"।
Gilles

4
@ गिल्स द -s ब्लॉक / चार विशेष उपकरणों के लिए माना जाता है। अंत में मैंने देखा file स्रोत, और fsmagic.c के अंत में मैंने यह स्पष्टीकरण देखा कि यह क्यों लौटता है ASCII text के बजाय empty: If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
ott--

15

इस निर्देशिका में, आप यह नियंत्रित कर सकते हैं कि कर्नेल डिवाइस को कैसे देखता है, कर्नेल सेटिंग्स को समायोजित करें, डिवाइस को कर्नेल में जोड़ें और उन्हें फिर से हटा दें। इस निर्देशिका में आप सीधे मेमोरी उपयोग और देख सकते हैं आई / ओ आंकड़े।

आप देख सकते हैं कि कौन से डिस्क माउंट किए गए हैं और किस फाइल सिस्टम का उपयोग किया जाता है। संक्षेप में, आपके लिनक्स सिस्टम के हर एक पहलू की इस निर्देशिका से जांच की जा सकती है, यदि आप जानते हैं कि क्या देखना है।

/proc निर्देशिका एक सामान्य निर्देशिका नहीं है। यदि आप एक बूट सीडी से बूट करते थे और अपनी हार्ड ड्राइव पर उस निर्देशिका को देखते थे, तो आप इसे खाली होने के रूप में देखेंगे। जब आप इसे अपने सामान्य चल रहे सिस्टम के तहत देखते हैं तो यह काफी बड़ा हो सकता है। हालाँकि, यह किसी भी हार्ड डिस्क स्थान का उपयोग नहीं करता है। ऐसा इसलिए है क्योंकि यह एक वर्चुअल फाइल सिस्टम है।

के बाद से /proc फ़ाइल सिस्टम एक वर्चुअल फ़ाइल सिस्टम है और मेमोरी में रहता है, एक नया /proc फ़ाइल सिस्टम हर बार आपके लिनक्स मशीन को रीबूट करने के लिए बनाया जाता है।

दूसरे शब्दों में, यह फाइल और डायरेक्टरी टाइप इंटरफेस के माध्यम से लिनक्स सिस्टम की हिम्मत को आसानी से झाँकने और थपथपाने का एक साधन है। जब आप किसी फ़ाइल को देखते हैं /proc निर्देशिका, आप सीधे लिनक्स कर्नेल में मेमोरी की एक सीमा पर देख रहे हैं और यह देख सकते हैं कि यह क्या देख सकता है।

फ़ाइल सिस्टम में परतें

Enter image description here

उदाहरण:

  • के भीतर /proc, प्रत्येक चलने वाली प्रक्रिया के लिए एक निर्देशिका है, जिसे इसकी प्रक्रिया आईडी के साथ नामित किया गया है। इन निर्देशिकाओं में ऐसी फाइलें हैं जो प्रक्रियाओं के बारे में उपयोगी जानकारी रखती हैं, जैसे:
    • exe: डिस्क पर फ़ाइल का एक प्रतीकात्मक लिंक जो इस प्रक्रिया से शुरू किया गया था।
    • cwd: जो प्रक्रिया की कामकाजी निर्देशिका का एक प्रतीकात्मक लिंक है।
    • wchan: जो, जब पढ़ा जाता है, तो प्रतीक्षा चैनल लौटाता है।
    • maps: जो, जब पढ़ा जाता है, तो प्रक्रिया के मेमोरी मैप्स को लौटाता है।
  • /proc/uptime एक स्थान द्वारा अलग किए गए दो दशमलव मानों के रूप में अपटाइम लौटाता है:
    • कर्नेल शुरू होने के बाद का समय।
    • उस समय की मात्रा जो कर्नेल निष्क्रिय है।
  • /proc/interrupts: व्यवधान से संबंधित जानकारी के लिए।
  • /proc/modules: मॉड्यूल की एक सूची के लिए।

अधिक विस्तृत जानकारी के लिए देखें आदमी खरीद या kernel.org


"यदि आप एक बूट सीडी से बूट करने के लिए थे और अपनी हार्ड ड्राइव पर उस निर्देशिका को देखते थे तो आप इसे खाली होने के रूप में देखेंगे।" यह / proc के लिए विशिष्ट नहीं है, यह किसी भी माउंट बिंदु के लिए सामान्य है जहां अंतर्निहित फ़ाइल सिस्टम को माउंट नहीं किया गया है। यदि आप उसी बूट सीडी से बूट करते हैं और कुछ ऐसा करते हैं mount -t procfs procfs /mnt/proc, आप वर्तमान में चल रहे कर्नेल / proc देखेंगे।
a CVn

5

आप सही हैं, वे असली फाइलें नहीं हैं।

सरल शब्दों में, यह कर्नेल को सीधे कॉल करने के बजाय, पढ़ने और लिखने के सामान्य तरीकों का उपयोग करके कर्नेल से बात करने का एक तरीका है। यह यूनिक्स के "सब कुछ एक फाइल है" दर्शन के अनुरूप है।

में फाइलें /proc शारीरिक रूप से कहीं भी मौजूद नहीं है, लेकिन कर्नेल आपके द्वारा पढ़ी और लिखी गई फ़ाइलों पर प्रतिक्रिया करता है और भंडारण के लिए लिखने के बजाय, यह सूचना को रिपोर्ट करता है या कुछ करता है।

इसी तरह, में फ़ाइलें /dev वास्तव में पारंपरिक अर्थों में फाइलें नहीं हैं (हालांकि कुछ सिस्टम फाइलों में हैं /dev वास्तव में डिस्क पर मौजूद हो सकते हैं, उनके पास बहुत कुछ नहीं होगा कि वे किस डिवाइस को संदर्भित करते हैं) - वे आपको सामान्य यूनिक्स फ़ाइल I / O API का उपयोग करके डिवाइस से बात करने में सक्षम करते हैं - या कुछ भी जो इसका उपयोग करता है, जैसे गोले


1
यह अधिक पसंद है * निक्स कि केवल एक फ़ाइल को सुरक्षित किया जा सकता है। चूंकि एक्सेस कंट्रोल लिस्ट फ़ाइल सिस्टम में बनी रहती है, इसलिए फ़ाइल सिस्टम ड्रायवर द्वारा पहले से उपलब्ध सामान्य तंत्र का उपयोग करके विशेषाधिकार प्राप्त संसाधनों को सुरक्षित करना सुविधाजनक है। यह उन उपकरणों के कार्यान्वयन को सरल बनाता है जो कर्नेल संरचनाओं तक पहुंचते हैं और उन्हें खरीद फ़ाइल सिस्टम वर्चुअल फ़ाइलों से पढ़ने के बजाय उन्नत अनुमतियों के बिना चलाने की अनुमति देते हैं।
Pekka

3

के अंदर /proc निर्देशिका, दो प्रकार की सामग्री है, पहली क्रमांकित निर्देशिका और दूसरी प्रणाली सूचना फ़ाइल है।

/proc एक वर्चुअल फाइल सिस्टम है। उदाहरण के लिए, यदि आप करते हैं ls -l /proc/stat, आप देखेंगे कि इसका आकार 0 बाइट्स है, लेकिन यदि आप "कैट / प्रोक / स्टेट" करते हैं, तो आपको फ़ाइल के अंदर कुछ सामग्री दिखाई देगी।

ए करें ls -l /proc, और आप बहुत सारे निर्देशिकाओं को केवल संख्याओं के साथ देखेंगे। ये नंबर प्रक्रिया आईडी (पीआईडी) का प्रतिनिधित्व करते हैं। इस क्रमांकित निर्देशिका के अंदर की फाइलें उस विशेष PID के साथ प्रक्रिया से मेल खाती हैं।

कुछ फाइलें जो नीचे उपलब्ध हैं /proc, जैसे cpuinfo, meminfo, और loadavg जैसी सिस्टम जानकारी शामिल है।

कुछ लिनक्स कमांड इनसे जानकारी पढ़ते हैं /proc फ़ाइलें और इसे प्रदर्शित करें। उदाहरण के लिए, मुक्त कमांड, से मेमोरी जानकारी पढ़ता है /proc/meminfo फ़ाइल, इसे प्रारूपित करता है, और इसे प्रदर्शित करता है।

व्यक्ति के बारे में अधिक जानने के लिए /proc फ़ाइलें, "मैन 5 FILENAME" करें।

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.

2
यह मुझे और अधिक पसंद है "कैसे / में क्या उपयोग करना है?" बजाय "कैसे काम करता है / खरीद?" उपयोगी जानकारी, लेकिन जरूरी नहीं कि जवाब दे यह विशेष प्रश्न
a CVn

/ Proc में प्रत्येक फ़ाइल रनटाइम जानकारी है, जिसका अर्थ है कि जब आप कर्नेल का हिस्सा / proc / meminfo हिस्सा एक फ़ंक्शन चलाते हैं जो फ़ाइल सामग्री को उत्पन्न करता है।
Shailesh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.