मेरे द्वारा सेट किए गए होस्टनाम को `होस्टनाम` कहाँ संग्रहीत करता है?


15

यह काफी हैरान करने वाला है। क्या किसी को पता है कि hostnameकमांड स्टोर और होस्टनाम कहां से पढ़ता है?

मुझे लगा कि यह / etc / hostname था लेकिन इस लिनक्स सिस्टम पर ऐसी कोई फाइल नहीं है जिसका मैं उपयोग कर रहा हूं। मैंने यह जानने के लिए स्ट्रेस का उपयोग करने की कोशिश की कि वह कहाँ स्थित है, लेकिन कोई रीड कॉल ने यह जानकारी नहीं दी:

$ strace hostname 2>&1 | grep read
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340^\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\30\2\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\0\0\0\0\0\0"..., 832) = 832
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 248
read(3, "", 1024)                       = 0

तब मैंने देखा कि इसने यह जानकारी लौटा दी है

uname({sys="Linux", node="server-name", ...}) = 0

एक पुनरावर्ती grep में / etc / रिटर्न कुछ भी नहीं:

grep "server-name" -r /etc 

यह जानकारी कहाँ संग्रहीत करता है? बस स्मृति में?


1
आप किस लाइन डिस्ट्रो का उपयोग कर रहे हैं?
अमीर जज

जवाबों:


9

इस संबंधित U & L Q & A शीर्षक पर एक नज़र डालें: इसका कहां से मिलता है? । होस्टनाम जैसे जानकारी लिनक्स कर्नेल के भीतर एक डेटा संरचना के भीतर बनी रहती है, जबकि सिस्टम चल रहा है। सिस्टम के बूट के दौरान यह जानकारी विभिन्न प्रकार के तंत्रों के माध्यम से प्राप्त की जा सकती है जो आमतौर पर विशिष्ट विशिष्ट है।

यदि आप उस man 2 unameमैन पेज को देखते हैं तो वहां एक डेटा संरचना उल्लिखित है:

           struct utsname {
               char sysname[];    /* Operating system name (e.g., "Linux") */
               char nodename[];   /* Name within "some implementation-defined
                                     network" */
               char release[];    /* Operating system release (e.g., "2.6.28") */
               char version[];    /* Operating system version */
               char machine[];    /* Hardware identifier */
           #ifdef _GNU_SOURCE
               char domainname[]; /* NIS or YP domain name */
           #endif
           };

उस संरचना का दूसरा तत्व, nodename[] एक स्थान है जहां होस्टनाम लिनक्स कर्नेल के भीतर संग्रहीत किया जाता है।

/ proc

यदि आप एक बार देख लेते हैं /proc/sys/kernel/hostname, तो होस्टनाम यहां भी उजागर हो जाता है। यह एक आभासी स्थान है, /procलेकिन यह आपको होस्टनाम तक पहुँचने के लिए एक वैकल्पिक तरीका देता है। सिस्टम का डोमेन नाम यहाँ भी है,/proc/sys/kernel/domainname

नोट: ब्याज की, ये मूल्य विशिष्ट नामस्थान हैं

उदाहरण

$ sudo hostname
oldhost
$ sudo unshare --uts /bin/bash
$ sudo echo newhost > /proc/sys/kernel/hostname 
$ hostname
newhost
$ exit
$ hostname
oldhost

होस्टनाम में हेरफेर करना

Systemd के साथ सिस्टम पर आप hostnamectlhostname पाने / सेट करने के लिए cli टूल का उपयोग कर सकते हैं । यह इसे रिबूट के बीच स्थायी रूप से बदल देगा।

$ sudo hostnamectl set-hostname --static somehostname

आप यह भी पता लगा सकते हैं कि यह किसके माध्यम से है sysctl:

$ sudo sysctl -a | grep kernel.hostname
kernel.hostname = myhostname

फेडोरा रिलीज़ के लिए, यह ask.fedoraproject.org क्यू एंड ए विषय को काफी अच्छी तरह से कवर करता है, जिसका शीर्षक है: सही ढंग से होस्टनाम सेट करना - अमेज़ॅन ईसी 2 पर फेडोरा 20


1
भावहीन। hostnamectl बस एक सिस्टम कॉल को आमंत्रित करता है। Syscall जानकारी को कैसे संग्रहीत करता है ताकि यह रिबूट में लगातार बना रहे? यह मेरा सवाल है, अगर ओपी भी नहीं।
ओथियस

6

hostnameआदेश नाम कहीं भी लेकिन कर्नेल स्मृति की दुकान नहीं है।

सिस्टम कैसे तय करता है कि बूट समय पर उसका नाम क्या है, यह इस बात पर निर्भर करता है कि सिस्टम कैसे कॉन्फ़िगर किया गया है। विकल्प एक फ़ाइल से एक नाम पढ़ने से लेकर, एक उपयुक्त नेटवर्क इंटरफ़ेस लाने के बाद नाम सेट करने के लिए DNS या / etc / होस्ट का उपयोग करने के लिए होता है।


2
कभी नहीं /etc/hosts(जो DNS लुकअप के लिए है - एक सिस्टम जो इसके होस्टनाम को पढ़ता है ओह बहुत गलत है) ... लेकिन संभवतः /etc/hostname(पूरी तरह से योग्य नाम शामिल है) या शायद ही कभी /etc/sysconfig/network( HOSTNAME=...शेल कमांड हो सकती है )। एक /etc/cloud/cloud.cfg
अमेज़ॅन

4

hostname(1)sethostname(3)सिस्टम कॉल के लिए केवल एक फ्रंट-एंड है , जो मूल रूप से होस्टनाम को लिखता है जहां कर्नेल को संग्रहीत करने की उम्मीद है।

यदि आप चाहते हैं कि परिवर्तन स्थायी हो, तो सामान्य यूनिक्स दर्शन के अनुसार आपको इसे स्वयं संग्रहित करना होगा। हालांकि सटीक स्थान आपके init सिस्टम पर बहुत अधिक निर्भर करता है। उदाहरण के लिए, OpenBSD का init होस्टनाम /etc/myname( से (के दौरान) पढ़ता हैnetstart ) ।

यह सब आपके सिस्टम के मैनपेज या सहायक प्रलेखन में वर्णित किया जाना चाहिए।


2

एक लंबे समय के रूप में * nix sysadmin, मैं स्पष्ट आरटीएफएम संदर्भ के बिना, स्पष्ट बताऊंगा: :)

   hostnamectl may be used to query and change the system hostname and
   related settings.

   This tool distinguishes three different hostnames: the high-level
   "pretty" hostname which might include all kinds of special characters
   (e.g. "Lennart's Laptop"), the static hostname which is used to
   initialize the kernel hostname at boot (e.g. "lennarts-laptop"), and
   the transient hostname which is a fallback value received from network
   configuration. If a static hostname is set, and is valid (something
   other than localhost), then the transient hostname is not used.

   Note that the pretty hostname has little restrictions on the characters
   used, while the static and transient hostnames are limited to the
   usually accepted characters of Internet domain names.

   The static hostname is stored in /etc/hostname, see hostname(5) for
   more information. The pretty hostname, chassis type, and icon name are
   stored in /etc/machine-info, see machine-info(5).

यह अधिकांश "लिनक्स" डिस्ट्रोस के लिए सही है।

--mem


1

रनटाइम के दौरान इसे मेमोरी में स्टोर किया जाता है, जैसा कि यहां पहले से ही दूसरों द्वारा बताया गया है।

एक रिबूट से बचने के लिए इसे फ़ाइल पर संग्रहीत करना होगा, जो कि लिनक्स वितरण विशिष्ट है। मेरे फेडोरा 20 पर यह / etc / hostname है

यह सबसे अधिक संभावना है / में संग्रहीत आदि में वास्तविक hostname के लिए खोज करने के लिए प्रयास करें

grep -r `hostname` /etc

यह ask.fedoraproject.org क्यू के सभी तरीकों के सेट / का उपयोग कर F20 पर होस्ट नाम प्राप्त कर सकते हैं hostnamectlआदि .: ask.fedoraproject.org/en/question/37413/...
SLM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.