जब मैं कमांड कैट / proc / cpuinfo चलाता हूं तो क्या होता है?


86

जब मैं लिखना क्या होता है cat /proc/cpuinfo। क्या ओएस को एक नामित पाइप (या कुछ और) है जो मक्खी पर सीपीयू जानकारी पढ़ता है और उस पाठ को उत्पन्न करता है जो हर बार मुझे कॉल करता है?


जवाबों:


72

जब भी आप किसी फ़ाइल के नीचे पढ़ते हैं /proc, तो यह कर्नेल में कुछ कोड को आमंत्रित करता है जो पाठ को फ़ाइल सामग्री के रूप में पढ़ने के लिए गणना करता है। तथ्य यह है कि मक्खी पर सामग्री उत्पन्न होती है, यह बताती है कि लगभग सभी फाइलों का समय अब ​​तक रिपोर्ट किया गया है और उनके आकार को 0 के रूप में रिपोर्ट किया गया है - यहां आपको 0 को "पता नहीं" के रूप में पढ़ना चाहिए। सामान्य फाइलसिस्टम के विपरीत, फाइलसिस्टम, जिस पर आरोहित किया /procजाता है , जिसे procfs कहा जाता है , एक डिस्क या अन्य स्टोरेज मीडिया (जैसे FAT, ext2, zfs,…) से डेटा लोड नहीं करता है या नेटवर्क पर (जैसे NFS, सांबा,…) और उपयोगकर्ता कोड ( FUSE के विपरीत ) को कॉल नहीं करता है ।

अधिकांश गैर-बीएसडी यूनियनों में प्रोकैट्स मौजूद है। इसने UNIX 8 वें संस्करण में एटी एंड टी के बेल लैब्स में अपने जीवन की शुरुआत प्रक्रियाओं के बारे में जानकारी देने के तरीके के रूप में की थी (और psअक्सर पढ़ी गई जानकारी के लिए एक बहुत-प्रिंटर है /proc)। अधिकांश procfs कार्यान्वयन में एक फ़ाइल या निर्देशिका होती है जिसे /proc/123PID 123 के साथ प्रक्रिया के बारे में जानकारी देने के लिए बुलाया जाता है। लिनक्स खरीद फाइल सिस्टम को कई और प्रविष्टियों के साथ विस्तारित करता है जो आपके उदाहरण सहित सिस्टम की स्थिति की रिपोर्ट करते हैं /proc/cpuinfo

अतीत में, लिनक्स /procने विभिन्न फाइलों का अधिग्रहण किया जो ड्राइवरों के बारे में जानकारी प्रदान करते हैं, लेकिन यह उपयोग अब इसके पक्ष में पदावनत हो गया है /sys, और /procअब धीरे-धीरे घूमता है। प्रविष्टियां पसंद हैं /proc/busऔर /proc/fs/ext4जहां वे पिछड़ी संगतता के लिए हैं, लेकिन नए समान इंटरफेस के तहत बनाई गई हैं /sys। इस उत्तर में, मैं लिनक्स पर ध्यान केंद्रित करूँगा।

/procलिनक्स पर प्रलेखन के लिए आपकी पहली और दूसरी प्रविष्टि बिंदु हैं:

  1. proc(5)आदमी पृष्ठ ;
  2. /procफाइल सिस्टम में गिरी प्रलेखन

आपका तीसरा प्रवेश बिंदु, जब प्रलेखन इसे कवर नहीं करता है, तो स्रोत को पढ़ रहा है । आप अपनी मशीन पर स्रोत डाउनलोड कर सकते हैं, लेकिन यह एक बहुत बड़ा कार्यक्रम है, और एलएक्सआर , लिनक्स क्रॉस-रेफरेंस, एक बड़ी मदद है। (LXR के कई वेरिएंट हैं, जो चल रहा lxr.linux.noहै वह अब तक सबसे अच्छा है लेकिन दुर्भाग्य से साइट अक्सर नीचे है।) C का थोड़ा ज्ञान आवश्यक है, लेकिन आपको रहस्यमयी मूल्य को ट्रैक करने के लिए प्रोग्रामर होने की आवश्यकता नहीं है। ।

/procप्रविष्टियों की मुख्य हैंडलिंग fs/procनिर्देशिका में है। कोई भी ड्राइवर इसमें प्रविष्टियाँ दर्ज कर सकता है /proc(हालाँकि जैसा कि ऊपर दर्शाया गया है कि यह अब उसके पक्ष में पदावनत हो गया है /sys), इसलिए यदि आपको वह नहीं मिल रहा है जिसकी आप तलाश कर रहे हैं fs/proc, तो हर जगह देखें। में घोषित किए गए ड्राइवर कॉल फ़ंक्शन include/linux/proc_fs.h3.9 तक कर्नेल संस्करण फ़ंक्शन प्रदान करते हैं create_proc_entryऔर कुछ रैपर (विशेष रूप से create_proc_read_entry), और कर्नेल संस्करण 3.10 और इसके बाद के संस्करण केवल proc_createऔर proc_create_data(और कुछ और) प्रदान करते हैं ।

/proc/cpuinfoएक उदाहरण के रूप में लेते हुए , एक खोज "cpuinfo"आपको कॉल को proc_create("cpuinfo, …")अंदर ले जाती है fs/proc/cpuinfo.c। आप देख सकते हैं कि कोड बहुत अधिक बॉयलरप्लेट कोड है: चूंकि अधिकांश फाइलें /procकेवल कुछ पाठ डेटा को डंप करती हैं, ऐसा करने के लिए सहायक कार्य हैं। केवल एक seq_operationsसंरचना है, और असली मांस cpuinfo_opडेटा संरचना में है, जो वास्तुकला-निर्भर है, आमतौर पर arch/<architecture>/kernel/setup.c(या कभी-कभी एक अलग फ़ाइल) में परिभाषित किया जाता है । एक उदाहरण के रूप में x86 लेते हुए, हम नेतृत्व कर रहे हैं arch/x86/kernel/cpu/proc.c। वहाँ मुख्य कार्य हैshow_cpuinfo, जो वांछित फ़ाइल सामग्री को प्रिंट करता है; बाकी इन्फ्रास्ट्रक्चर वहाँ डेटा को पढ़ने की प्रक्रिया में फ़ीड करने के लिए है जिस गति से यह अनुरोध करता है। आप कर्नेल में विभिन्न चर में डेटा से मक्खी पर इकट्ठा किए जा रहे डेटा को देख सकते हैं, जिसमें सीपीयू आवृत्ति जैसे मक्खी पर गणना की गई कुछ संख्याएं भी शामिल हैं ।

का एक बड़ा हिस्सा /procप्रति-प्रक्रिया की जानकारी है /proc/<PID>। इन प्रविष्टियों को सरणीfs/proc/base.c में पंजीकृत किया गया है ; यहां पंजीकृत कुछ फ़ंक्शन अन्य फ़ाइलों में परिभाषित किए गए हैं। आइए कुछ उदाहरण देखें कि ये प्रविष्टियाँ कैसे उत्पन्न होती हैं:tgid_base_stuff

  • cmdlineproc_pid_cmdlineउसी फ़ाइल द्वारा जनरेट किया गया है। यह प्रक्रिया में ते डेटा का पता लगाता है और इसे प्रिंट करता है।
  • clear_refsके विपरीत, अब तक हमने जो प्रविष्टियाँ देखी हैं, वे लिखने योग्य हैं, लेकिन पठनीय नहीं हैं। इसलिए proc_clear_refs_operationsसंरचना एक clear_refs_writeफ़ंक्शन को परिभाषित करती है लेकिन कोई फ़ंक्शन नहीं पढ़ती है।
  • cwdएक प्रतीकात्मक लिंक (थोड़ा जादुई एक) है proc_cwd_link, जिसके द्वारा घोषित किया गया है , जो प्रक्रिया की वर्तमान निर्देशिका को देखता है और इसे लिंक सामग्री के रूप में लौटाता है।
  • fdएक उपनिर्देशिका है। निर्देशिका पर संचालन स्वयं proc_fd_operationsडेटा संरचना में परिभाषित किए गए हैं (वे फ़ंक्शन को छोड़कर बॉयलरproc_readfd हैं, जो प्रविष्टियों की गणना करते हैं , जो कि प्रक्रिया की खुली फ़ाइलों की गणना करता है) जबकि प्रविष्टियों पर संचालन `proc_fd_inode_operations 'में होते हैं

का एक अन्य महत्वपूर्ण क्षेत्र /procहै /proc/sys, जो एक सीधा इंटरफ़ेस है sysctl। इस पदानुक्रम में एक प्रविष्टि से पढ़ना संबंधित sysctl मान का मान लौटाता है, और लेखन sysctl मान सेट करता है। Sysctl के लिए प्रवेश बिंदु हैं fs/proc/proc_sysctl.c। Sysctls के पास register_sysctlऔर दोस्तों के साथ अपनी पंजीकरण प्रणाली है ।


59

जब आपके सबसे अच्छे दोस्त पर्दे के पीछे किस तरह का जादू हो रहा है, यह जानने की कोशिश कर रहा है strace। इस उपकरण को संचालित करना सीखना सबसे अच्छी चीजों में से एक है जिसे आप पर्दे के पीछे पागल जादू के लिए एक बेहतर प्रशंसा प्राप्त करने के लिए कर सकते हैं।

$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536)                      = 0
close(3)                                = 0
...

उपरोक्त आउटपुट से आप देख सकते हैं कि /proc/cpuinfoयह केवल एक नियमित फ़ाइल है, या कम से कम एक प्रतीत होता है। तो चलो गहरी खुदाई करें।

गहरी डुबकी

# 1 - ls के साथ ।।

फ़ाइल को देखते हुए यह "बस एक फ़ाइल" प्रतीत होगी।

$ ls -l /proc/cpuinfo 
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo

लेकिन करीब से देखिए। हम अपना पहला संकेत प्राप्त करते हैं कि इसका विशेष, ध्यान दें कि फ़ाइल का आकार 0 बाइट्स है।

# 2 - स्टेट के साथ ।।

यदि हम अब फ़ाइल का उपयोग statकरते हुए देखते हैं तो हम अपना अगला संकेत प्राप्त कर सकते हैं कि कुछ खास बात है /proc/cpuinfo

# 1 चलाएं
$ stat /proc/cpuinfo 
  File: ‘/proc/cpuinfo’
  Size: 0           Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3dInode: 4026532023  Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
 Birth: -
# 2 चलाएं
$ stat /proc/cpuinfo 
  File: ‘/proc/cpuinfo’
  Size: 0           Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3dInode: 4026532023  Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
 Birth: -

एक्सेस, संशोधित करें, और परिवर्तन समय पर ध्यान दें? वे प्रत्येक पहुंच के लिए बदलते रहते हैं। यह अत्यधिक असामान्य है कि सभी 3 उसी तरह बदल जाएंगे। जब तक किसी फ़ाइल की टाइमस्टैम्प विशेषताओं को संपादित नहीं किया जाता है, तब तक वही रहता है।

# 3 - फ़ाइल के साथ ..

अभी तक एक और सुराग है कि यह फ़ाइल कुछ भी है लेकिन एक नियमित फ़ाइल है:

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

यदि यह नामित पाइप की कुछ अभिव्यक्तियाँ होती हैं, तो यह इन फ़ाइलों में से एक के समान होगी:

$ ls -l /dev/initctl /dev/zero 
prw-------. 1 root root    0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero

$ file /dev/initctl /dev/zero 
/dev/initctl: fifo (named pipe)
/dev/zero:    character special

यदि हम एक स्पर्श करते हैं emptyfile, /proc/cpuinfoतो एक फ़ाइल की तरह अधिक दिखाई देता है तो एक पाइप:

$ touch emptyfile
$ ls -l emptyfile 
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile 
emptyfile: empty
# 4 - माउंट के साथ ।।

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

$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

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

एक नज़र रखना mount:

Proc फाइलसिस्टम एक विशेष उपकरण से जुड़ा नहीं है, और जब इसे बढ़ते हैं, तो एक मनमाना कीवर्ड, जैसे कि डिवाइस विनिर्देशन के बजाय खरीद का उपयोग किया जा सकता है। (प्रथागत पसंद कोई भी कम भाग्यशाली नहीं है: उमाउंट से त्रुटि संदेश `कोई भी व्यस्त 'भ्रामक हो सकता है।)

और अगर हम procमैन पेज देखें:

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

उसी आदमी पृष्ठ में थोड़ा और नीचे:

/ Proc / cpuinfo

यह सीपीयू और सिस्टम आर्किटेक्चर पर निर्भर वस्तुओं का एक संग्रह है, प्रत्येक समर्थित आर्किटेक्चर के लिए एक अलग सूची। दो सामान्य प्रविष्टियाँ प्रोसेसर हैं जो सीपीयू नंबर और बोगोमिप्स देती हैं; एक प्रणाली स्थिरांक जिसे कर्नेल आरंभीकरण के दौरान गणना की जाती है। एसएमपी मशीनों में प्रत्येक सीपीयू की जानकारी होती है। Lscpu (1) कमांड इस फ़ाइल से अपनी जानकारी एकत्र करता है।

मैन पेज के निचले भाग में एक कर्नेल डॉक्यूमेंट का सन्दर्भ है, जिसे आप यहाँ पा सकते हैं, जिसका शीर्षक है: THE / proc FILESYSTEM । उस दस्तावेज़ से उद्धरण:

खरीद फ़ाइल सिस्टम कर्नेल में आंतरिक डेटा संरचनाओं के लिए एक इंटरफ़ेस के रूप में कार्य करता है। इसका उपयोग सिस्टम के बारे में जानकारी प्राप्त करने और रनटाइम (sysctl) पर कुछ कर्नेल मापदंडों को बदलने के लिए किया जा सकता है।

निष्कर्ष

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

मैं इस उद्धरण के साथ बंद करूँगा जो जाहिरा तौर पर man 5 procलगभग 2004 से पूर्व संस्करण में हुआ करता था, लेकिन जो भी कारण अब शामिल नहीं है। नोट: मुझे यकीन नहीं है कि इसे हटा दिया गया था क्योंकि यह बहुत अच्छी तरह से वर्णन करता /procहै:

GNU / Linux सिस्टम पर / proc निर्देशिका, कर्नेल को इंटरफ़ेस जैसी फाइल-प्रणाली प्रदान करता है। यह एप्लिकेशन और उपयोगकर्ताओं को सामान्य फ़ाइल-सिस्टम I / O ऑपरेशन का उपयोग करके कर्नेल में जानकारी सेट करने और मान सेट करने की अनुमति देता है।

खरीद फ़ाइल सिस्टम को कभी-कभी प्रक्रिया सूचना छद्म फ़ाइल सिस्टम के रूप में संदर्भित किया जाता है। इसमें `` वास्तविक '' फाइलें नहीं हैं, बल्कि रनटाइम सिस्टम की जानकारी (जैसे सिस्टम मेमोरी, डिवाइस माउंटेड, हार्डवेयर कॉन्फ़िगरेशन, आदि) हैं। इस कारण से इसे कर्नेल के लिए एक नियंत्रण और सूचना केंद्र माना जा सकता है। वास्तव में, काफी सिस्टम यूटिलिटीज इस निर्देशिका में फाइलों के लिए कॉल हैं। उदाहरण के लिए, कमांड लेस्मोड, जो कर्नेल द्वारा लोड किए गए मॉड्यूल को सूचीबद्ध करता है, मूल रूप से lspci के समान 'कैट / प्रोक / मॉड्यूल' है, जो सिस्टम के PCI बस से जुड़े उपकरणों को सूचीबद्ध करता है, जो 'cat /' के समान है। proc / पीसीआई '। इस निर्देशिका में स्थित फ़ाइलों को बदलकर आप कर्नेल पैरामीटर बदल सकते हैं जब सिस्टम चल रहा है।

स्रोत: proc छद्म फ़ाइल-सिस्टम

संदर्भ


1
कूल, :) यह पहली चीज है जिसे मैंने कोशिश की थी जैसा मैंने सवाल देखा था:strace -o catcpuproc.txt cat /proc/cpuinfo
एमके

1
अच्छा जवाब! यदि आप गहरी खुदाई करना चाहते हैं, तो लिनक्स पर, कर्नेल स्रोत में खरीद फाइल सिस्टम का स्रोत fs / proc में है। आप देखेंगे कि fs / proc / cpuinfo.c है, लेकिन, दुर्भाग्य से, यह खाली है क्योंकि हेवी लिफ्टिंग पूरे आर्क में फैली हुई है / क्योंकि यह आर्किटेक्चर पर निर्भर है। एक सरल उदाहरण के लिए fs / proc / uptime.c देखें। फ़ाइल पर नज़र रखने से हम अनुमान लगा सकते हैं कि uptime_proc_show वह वर्कहॉर्स है जो हमें वह डेटा मिलता है जो हम चाहते हैं और हम इसे कॉल किए जा रहे फ़ंक्शंस में डाइविंग करके इसे और अधिक एक्सप्लोर कर सकते हैं। Seq_file इंटरफ़ेस को समझने के लिए और इसे कैसे देखें में इसका उपयोग किया जाता है:
स्टीवन डी

1
linux.com/learn/linux-training/… और lwn.net/Articles/22355 (थोड़ा सा दिनांक)
स्टीवन डी

1
@ एसएलएम: +1, शानदार जवाब। लेकिन मेरे लिए, पहला संकेत यह एक विशेष फ़ाइल है, इसका आकार ^ ^ 0 बाइट्स है, फिर भी आप इसमें से बहुत सी चीजें (कुछ पाइप फ़ाइलों की तरह थोड़ी) को बिल्ली कर सकते हैं।
ओलिवियर दुलक

@OlivierDulac - अच्छी बात है। मैंने आपकी प्रतिक्रिया के आधार पर अतिरिक्त संपादन किए हैं। LMK अगर मैं कोई और सुधार कर सकता हूँ। धन्यवाद।
slm

14

@ एसएलएम द्वारा दिया गया उत्तर बहुत व्यापक है, लेकिन मुझे लगता है कि एक सरल व्याख्या परिप्रेक्ष्य में बदलाव से आ सकती है।

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

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

फाइलसिस्टम के कुछ उदाहरण जो स्टोरेज डिवाइस का उपयोग नहीं करते हैं (कम से कम सीधे):

  • फ़ाइल-सिस्टम डेटा या गणना डेटा का उपयोग करते हुए। प्रोक एक उदाहरण है, क्योंकि यह विभिन्न कर्नेल मॉड्यूल से डेटा प्राप्त करता है। एक चरम उदाहरण extremefs (github.com/philipl/pifs) है
  • सभी FUSE फाइल सिस्टम, जो एक नियमित यूजरस्पेस प्रोग्राम के साथ डेटा को संभालते हैं
  • फाइलसिस्टम जो एक और फाइलसिस्टम के डेटा को ऑन-द-फ्लाई में बदलते हैं, उदाहरण के लिए एन्क्रिप्शन, कम्प्रेशन या यहां तक ​​कि ऑडियो ट्रांसकोडिंग (khenriks.github.io/mp3fs/) का उपयोग करके

Plan9 OS ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs ) एक सामान्य प्रोग्रामिंग इंटरफ़ेस के रूप में फ़ाइलों का उपयोग करने का एक चरम उदाहरण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.