"अनाम" जानकारी कहाँ से खींच रहा है?


24

uname -iजानकारी कहाँ से खींच रहा है?

क्या विवरण में मौजूद है /etc/?

क्या विवरण में मौजूद है /proc/?

यदि हां, तो उन विवरणों को आउटपुट करने के लिए यह कौन सी फाइल है?


संबंधित:
अनैम

जवाबों:


31

unameuname(2)कर्नेल से संबंधित जानकारी प्राप्त करने के लिए सिस्टम कॉल का उपयोग करता है ।

सारांश है:

#include <sys/utsname.h>
int uname(struct utsname *buf);

uname(2)द्वारा बताई गई संरचना में जानकारी कहां लौटती है buf। इसके अलावा, आप हेडर फाइल पढ़ सकते हैं utsname.hसे /usr/include/"$(arch)"-linux-gnu/sys/utsname.hबेहतर जानकारी के लिए।

man 2 unameइस बारे में अधिक विचार प्राप्त करने के लिए एक नज़र डालें ।


जब मैं "uname -i" चलाता हूं, तो आउटपुट "x86_64" है। जब मैं संदर्भ "/usr/include/x86_64-linux-gnu/sys/utsname.h" को पार करता हूं, तो मुझे "x86_64" के संदर्भ में कुछ भी दिखाई नहीं देता है। मैंने "man 2 uname" को संदर्भित किया है और यह बताता है कि utsname जानकारी के भाग को "/ proc / sys / kernel / {ostype}, {hostname}, {osrelease}, {version} और {domain.com" समस्या के माध्यम से संदर्भित किया जाता है। उन फ़ाइलों में से कोई भी "x86_64" बताते हुए कुछ भी संदर्भित नहीं करता है। कोई और सिफारिशें?
रॉय हर्नांडेज़

@RoyHernandez का आउटपुट क्या है locate --regex '^/usr/include/.*/sys/utsname.h$'?
हेमायल

आउटपुट है: "/usr/include/x86_64-linux-gnu/sys/utsname.h"
रॉय हर्नांडेज़

@RoyHernandez यह बताती है कि फ़ाइल मौजूद है और आप कुछ गलत कर रहे थे ..
heemayl

जब मैं रन करता हूं uname -iतो आउटपुट होता है x86_64। जब मैं locate --regex '^/usr/include/.*/sys/utsname.h$'आउटपुट रिटर्न चलाता हूं/usr/include/x86_64-linux-gnu/sys/utsname.h
रॉय हर्नान्डेज़

22

प्रोग्राम straceहमें सिस्टम को देखने की अनुमति देता है जो एक एप्लिकेशन कॉल कर सकता है। साथ uname -aयह स्पष्ट है कि केवल openकॉल प्रणाली पुस्तकालयों के लिए जाते हैं, ताकि तकनीकी रूप से वहाँ फाइल सिस्टम पर कोई फ़ाइल है कि unameपढ़ने के लिए खुलता है। बल्कि यह C पुस्तकालयों का उपयोग करके सिस्टम कॉल करता है।

जैसा कि heemayl ने ठीक से बताया कि unameसंरचना में संग्रहीत जानकारी को पुनः प्राप्त करने के लिए sys कॉल मौजूद है । यह मैन पेज है, निम्नलिखित सुझाव देता है:

यह एक सिस्टम कॉल है, और ऑपरेटिंग सिस्टम संभवतः इसका नाम, रिलीज़ और संस्करण जानता है। । । । । । Utsname जानकारी का हिस्सा / proc / sys / kerel nel / {ostype, hostname, osrelease, version, domainname} के माध्यम से भी सुलभ है।

Utsname जानकारी का हिस्सा / proc / sys / kerel nel / {ostype, hostname, osrelease, version, domainname} के माध्यम से भी सुलभ है।

/procफाइलसिस्टम हालांकि आभासी है, जिसका अर्थ है कि यह केवल तभी चल रहा है जब ओएस चल रहा हो। इस प्रकार कुछ विस्तार के लिए इसे कर्नेल या सिस्टम लाइब्रेरी में सेट किया गया है।

अंत में, स्रोत कोड के माध्यम से पढ़ना, uname.cजिसके साथ प्राप्त किया जा सकता है apt-get source coreutils, हम देख सकते हैं कि यह वास्तव में utsname.hलाइब्रेरी का उपयोग करता है (लाइन नंबरों के साथ मुद्रित):

 19 
 20 #include <config.h>
 21 #include <stdio.h>
 22 #include <sys/types.h>
 23 #include <sys/utsname.h>
 24 #include <getopt.h>
 25 

strace उत्पादन:

skolodya@ubuntu:$ strace uname -a
execve("/bin/uname", ["uname", "-a"], [/* 58 vars */]) = 0
brk(0)                                  = 0x1478000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6935000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=137226, ...}) = 0
mmap(NULL, 137226, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efee6913000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1840928, ...}) = 0
mmap(NULL, 3949248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7efee6350000
mprotect(0x7efee650b000, 2093056, PROT_NONE) = 0
mmap(0x7efee670a000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ba000) = 0x7efee670a000
mmap(0x7efee6710000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7efee6710000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6912000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6910000
arch_prctl(ARCH_SET_FS, 0x7efee6910740) = 0
mprotect(0x7efee670a000, 16384, PROT_READ) = 0
mprotect(0x606000, 4096, PROT_READ)     = 0
mprotect(0x7efee6937000, 4096, PROT_READ) = 0
munmap(0x7efee6913000, 137226)          = 0
brk(0)                                  = 0x1478000
brk(0x1499000)                          = 0x1499000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=7216688, ...}) = 0
mmap(NULL, 7216688, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efee5c6e000
close(3)                                = 0
uname({sys="Linux", node="eagle", ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6934000
uname({sys="Linux", node="eagle", ...}) = 0
uname({sys="Linux", node="eagle", ...}) = 0
write(1, "Linux eagle 4.1.0-040100rc2-gene"..., 113Linux eagle 4.1.0-040100rc2-generic #201505032335 SMP Mon May 4 03:36:35 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
) = 113
close(1)                                = 0
munmap(0x7efee6934000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

जब मैं "uname -i" चलाता हूं, तो आउटपुट "x86_64" है। जब मैं संदर्भ "/usr/include/x86_64-linux-gnu/sys/utsname.h" को पार करता हूं, तो मुझे "x86_64" के संदर्भ में कुछ भी दिखाई नहीं देता है। मैंने "man 2 uname" को संदर्भित किया है और यह बताता है कि utsname जानकारी के भाग को "/ proc / sys / kernel / {ostype}, {hostname}, {osrelease}, {version} और {domain.com" समस्या के माध्यम से संदर्भित किया जाता है। उन फ़ाइलों में से कोई भी "x86_64" बताते हुए कुछ भी संदर्भित नहीं करता है। कोई और सिफारिशें?
रॉय हर्नांडेज़

@RoyHernandez C में पूर्णांक के आकार के आधार पर सीपीयू की वास्तुकला को निर्धारित करना संभव है, उदाहरण के लिए - यहाँ देखें । तो इसके uname.cलिए किसी पुस्तकालय का उपयोग करने की आवश्यकता नहीं है - हम निश्चित रूप से स्रोत कोड को देख सकते हैं।
सर्गी कोलोडियाजनी

दरअसल, यह एक पुस्तकालय पर निर्भर करता है। । । machine.h
सर्गी कोलोडियाज़नी

machine.hपूरे सिस्टम में पेप्पर लगता है। machine.hयह किस फाइल पर निर्भर करता है?
रॉय हर्नांडेज़

machine.hमेरे सिस्टम पर सूचीबद्ध @RoyHernandez /usr/src/linux-headers-3.19.0-33निर्देशिका में प्रतीत होती है । यह बहुत संभावना है कि यह वर्तमान में चल रहे कर्नेल द्वारा उपलब्ध कराई गई लाइब्रेरी का उपयोग करता है
सर्जि कोलोडियाज़नी

6

बेशक हीमायल का जवाब सही है।

बस मज़े के लिए, यहां काम कर रहे सी स्निपेट डेटा को दिखाते हुए लौटाते हैं uname()( unameयदि आप चाहें तो एक तरह का होममेड ): इसे संकलित करें gcc uname.c -o unameऔर इसके साथ चलाएं ./uname:

#include <stdio.h> // printf()
#include <sys/utsname.h> // uname()

int main() {
        int ret; // stores the return value of uname()
        struct utsname utsname; // stores the data returned by uname()
        struct utsname *utsname_ptr = &utsname; // pointer to the struct holding the data returned by uname()

        ret = uname(utsname_ptr); // calls uname() on utsname_ptr and stores its return value in ret

        /* prints the fields of utsname */

        printf("%s\n", utsname.sysname);
        printf("%s\n", utsname.nodename);
        printf("%s\n", utsname.release);
        printf("%s\n", utsname.version);
        printf("%s\n", utsname.machine);

        /* returns the return value of uname() */

        return(ret);
}
% ./uname 
Linux
user-X550CL
4.2.0-25-generic
#30-Ubuntu SMP Mon Jan 18 12:31:50 UTC 2016
x86_64

printf("%\n", utsname.machine);इसकी जानकारी कहाँ से खींच रहा है?
रॉय हर्नांडेज

@RoyHernandez उस संरचना से utsname, जिसे कॉल करने के दौरान आबादी है uname()। उदाहरण शायद सी मूल बातें के बिना किसी के लिए बहुत सीधा नहीं है, लेकिन यहां कम या ज्यादा क्या होता है: ए struct(सी डेटा प्रकार) utsnameनाम का प्रकार utsname(परिभाषित में टाइप <sys/utsname.h>) घोषित किया जाता है; तब नाम के एक पॉइंटर को utsname_ptrघोषित किया जाता है (चूंकि uname()एक पॉइंटर को एक तर्क के रूप में एक structप्रकार से स्वीकार करता है utsname, हालांकि इस मामले में इससे बचा जा सकता था, लेकिन यह एक और कहानी है)।
कोस २४'१६ को

फिर कॉल uname()में संरचना को आबाद करने का प्रभाव होता है utsname, जो printf()कॉल के समय विभिन्न क्षेत्रों के अंदर विभिन्न मूल्यों को समाहित करता है। यदि आप सी से परिचित नहीं हैं, तो शायद यह विस्तार से समझने में आसान नहीं है, लेकिन मुद्दा यह है कि uname()उद्देश्य पर निर्मित एक डेटा संरचना को पॉप्युलेट करता है, जिसके खेतों को बाद में प्रिंट किया जाता है printf()
कोस

4

हेमायल के उत्तर के अतिरिक्त, आप unameकमांड से कुछ जानकारी प्राप्त कर सकते हैं /proc/version


/ proc / संस्करण में "लिनक्स संस्करण 3.19.0-47-जेनेरिक (बिल्ड @ lgw01-19) (gcc संस्करण 4.8.2 (Ubuntu 4.8.2-19ubuntu1)) # 53 ~ 14.04.1-Ubuntu SMP सोम जनवरी 18 16 शामिल हैं। : 09: 14 UTC 2016 "और" uname -i "आउटपुट" x86_64 "है।
रॉय हर्नांडेज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.