"Uname" কোথা থেকে তথ্য টানছে?


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এই সম্পর্কে আরো ধারণা পেতে।


যখন আমি "আনমেমে -i" চালাই, আউটপুটটি "x86_64" হয়। আমি যখন "/usr/incolve/x86_64-linux-gnu/sys/utsname.h" রেফারেন্সটি অতিক্রম করি তখন আমি "x86_64" উল্লেখ করে এমন কিছু দেখতে পাই না। আমি "ম্যান 2 আনমেমে" রেফারেন্স দিয়েছি এবং এতে বলা হয়েছে যে উত্স-নাম তথ্যের অংশটি "/ proc / sys / kernel / ost ostype}, {হোস্টনেম}, {osreLive}, {সংস্করণ} এবং {ডোমেইননাম}" এর মাধ্যমে উল্লেখ করা হয়েছে এই ফাইলগুলির মধ্যে কোনওটিই "x86_64" উল্লেখ করে কিছু উল্লেখ করেনি। অন্য কোন সুপারিশ?
রায় হার্নান্দেজ

@ রয় হার্নান্দেজের ফলাফল locate --regex '^/usr/include/.*/sys/utsname.h$'কী?
হিমাইল

আউটপুটটি হ'ল: "/usr/incolve/x86_64-linux-gnu/sys/utsname.h"
রায় হার্নান্দেজ

@ রায়হর্নান্দেজ এটি জানায় যে ফাইলটি আছে এবং আপনি কিছু ভুল করছেন ..
হিমাইল

আমি 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পড়ার জন্য প্রর্দশিত হবে। বরং এটি সি লাইব্রেরি ব্যবহার করে সিস্টেম কল করে।

হিমাইল যথাযথভাবে ইঙ্গিত করার সাথে unameকাঠামোতে সঞ্চিত তথ্য পুনরুদ্ধার করার জন্য সাইস কল রয়েছে । এটি ম্যান পৃষ্ঠা, নীচের পরামর্শ দেয়:

এটি একটি সিস্টেম কল এবং অপারেটিং সিস্টেমটি সম্ভবত এর নাম, প্রকাশ এবং সংস্করণ জানে। । । । । । Utsname তথ্যের অংশটি / proc / sys / ker‐el / nost ostype, হোস্টনাম, অস্রেলিজ, সংস্করণ, ডোমেননাম via এর মাধ্যমেও অ্যাক্সেসযোগ্য}

Utsname তথ্যের অংশটি / proc / sys / ker‐el / nost ostype, হোস্টনাম, অস্রেলিজ, সংস্করণ, ডোমেননাম via এর মাধ্যমেও অ্যাক্সেসযোগ্য}

/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 +++

যখন আমি "আনমেমে -i" চালাই, আউটপুটটি "x86_64" হয়। আমি যখন "/usr/incolve/x86_64-linux-gnu/sys/utsname.h" রেফারেন্সটি অতিক্রম করি তখন আমি "x86_64" উল্লেখ করে এমন কিছু দেখতে পাই না। আমি "ম্যান 2 আনমেমে" রেফারেন্স দিয়েছি এবং এতে বলা হয়েছে যে উত্স-নাম তথ্যের অংশটি "/ proc / sys / kernel / ost ostype}, {হোস্টনেম}, {osreLive}, {সংস্করণ} এবং {ডোমেইননাম}" এর মাধ্যমে উল্লেখ করা হয়েছে এই ফাইলগুলির মধ্যে কোনওটি "x86_64" উল্লেখ করে কিছু উল্লেখ করে না। অন্য কোন সুপারিশ?
রায় হার্নান্দেজ

@ রয় হার্নান্দেজ সি-তে পূর্ণসংখ্যার আকারের উপর নির্ভর করে সিপিইউয়ের আর্কিটেকচার নির্ধারণ করা সম্ভব, উদাহরণস্বরূপ - এখানে উল্লেখ করুন । সুতরাং uname.cঅগত্যা এটির জন্য একটি লাইব্রেরি ব্যবহার করার প্রয়োজন নেই - আমরা অবশ্যই উত্স কোডটি দেখতে পারি, নিশ্চিত হওয়ার জন্য।
সের্গেই কোলোডিয়াজনি

আসলে এটি কোনও লাইব্রেরির উপর নির্ভর করে। । । machine.h
সের্গেই কোলোডিয়াজনি

machine.hসিস্টেম জুড়ে peppered বলে মনে হচ্ছে। এটি কোন machine.hফাইলের উপর নির্ভর করে?
রায় হার্নান্দেজ

machine.hআমার সিস্টেমের তালিকাভুক্ত সমস্ত রয় হার্নান্দেজ /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);থেকে এটি তথ্য টানছে?
রায় হার্নান্দেজ

@ রয় হার্নান্দেজ স্ট্রাক্ট থেকে utsname, যা কল করার সময় জনবহুল uname()। উদাহরণটি সম্ভবত এটি সি বেসিকগুলি ব্যতীত কারও কাছে খুব সোজা নয়, তবে এখানে যা ঘটে থাকে তার কম-বেশি এখানে বলা হয়: একটি struct(সি ডেটা টাইপ) utsnameনামের utsnameটাইপ (সংজ্ঞায়িত টাইপ <sys/utsname.h>) ঘোষিত হয়; তারপরে এর নামক একটি পয়েন্টার utsname_ptrঘোষিত হয় (যেহেতু uname()কোনও structধরণের বিন্দু utsnameহিসাবে একটি পয়েন্টারটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে , যদিও এটি এই ক্ষেত্রে এড়ানো যেত, তবে এটি অন্য গল্প)।
কস

তারপরে কলটিতে uname()স্ট্রাক্টকে পপুলেশন করার প্রভাব রয়েছে utsname, যা printf()কলের সময় বিভিন্ন ক্ষেত্রের অভ্যন্তরে বিভিন্ন মান রয়েছে। দুর্ভাগ্যক্রমে আপনি যদি সি এর সাথে পরিচিত না হন তবে এটি সম্ভবত বিশদভাবে ধরা সহজ হবে না তবে মূল বিষয়টি হ'ল uname()উদ্দেশ্য ভিত্তিতে নির্মিত একটি ডেটা কাঠামোকে জনপ্রিয় করে তোলে, যার ক্ষেত্রগুলি পরে প্রিন্ট করা হয় printf()
কস

4

হিমাইলের উত্তরের যোগ হিসাবে আপনি unameকমান্ডের মতো কিছু তথ্য পেতে পারেন /proc/version


/ প্রোক / সংস্করণটিতে "লিনাক্স সংস্করণ 3.19.0-47-জেনেরিক (বিল্ড @ lgw01-19) (জিসিসি সংস্করণ 4.8.2 (উবুন্টু 4.8.2-19ubuntu1)) # 53 ~ 14.04.1-উবুন্টু এসএমপি সোমবার 18 জানুয়ারী 16 : 09: 14 UTC 2016 "এবং" uname -i "আউটপুট" x86_64 "।
রায় হার্নান্দেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.