`hostname 'เก็บชื่อโฮสต์ที่ฉันตั้งไว้ที่ไหน


15

นี่มันทำให้งงมาก ไม่มีใครทราบว่าhostnameคำสั่งเก็บและอ่านชื่อโฮสต์จากที่ใด

ฉันคิดว่ามันเป็น / etc / hostname แต่ไม่มีไฟล์ดังกล่าวในระบบ Linux นี้ที่ฉันใช้ ฉันลองใช้ strace เพื่อหาที่ตั้ง แต่ไม่มีการโทรกลับอ่านข้อมูลนี้:

$ 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

จากนั้นฉันสังเกตเห็นว่ามันไม่ได้สร้างชื่อ syscall ที่ส่งคืนข้อมูลนี้

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

grep แบบเรียกซ้ำใน / etc / ไม่ส่งคืนอะไร:

grep "server-name" -r /etc 

uname เก็บข้อมูลนี้ที่ไหน แค่ในความทรงจำ?


1
คุณใช้ linux distro อะไร
amir jj

คำตอบ:


9

ดูคำถาม & คำตอบ U & L ที่เกี่ยวข้องนี้ที่ชื่อ: uname จะได้รับข้อมูลจากที่ไหน . ข้อมูลเช่นชื่อโฮสต์ยังคงอยู่ภายในโครงสร้างข้อมูลภายในเคอร์เนล Linux ในขณะที่ระบบกำลังทำงาน ในระหว่างการบูทระบบข้อมูลนี้สามารถ reattained ผ่านกลไกต่าง ๆ ที่ปกติ distro เฉพาะ

หากคุณดูที่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
           };

องค์ประกอบที่ 2 ของโครงสร้างนั้นnodename[]เป็นที่เดียวที่เก็บชื่อโฮสต์ไว้ในเคอร์เนล Linux

proc /

หากคุณดูที่/proc/sys/kernel/hostnameชื่อโฮสต์จะถูกเปิดเผยที่นี่เช่นกัน นี่เป็นตำแหน่งเสมือน/procแต่ให้วิธีการอื่นในการเข้าถึงชื่อโฮสต์ ชื่อโดเมนของระบบอยู่ที่นี่เช่น/proc/sys/kernel/domainnameกัน

หมายเหตุ:ที่น่าสนใจค่านิยมเหล่านี้มีเฉพาะ namespace UTS

ตัวอย่าง

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

จัดการชื่อโฮสต์

ในระบบด้วย Systemd คุณสามารถใช้เครื่องมือ cli hostnamectlเพื่อรับ / ตั้งชื่อโฮสต์ สิ่งนี้จะเปลี่ยนอย่างถาวรระหว่างการรีบูต

$ sudo hostnamectl set-hostname --static somehostname

นอกจากนี้คุณยังสามารถค้นหาคุณค่าของมันผ่านทาง sysctl :

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

สำหรับรุ่น Fedora นี้ ask.fedoraproject.org Q & A ครอบคลุมหัวข้อสวยอย่างทั่วถึงหัวข้อ: ถูกต้องตั้งค่าชื่อโฮสต์ - Fedora 20 ใน Amazon EC2


1
Meh hostnamectl เพียงเรียกใช้การเรียกของระบบ syscall จะจัดเก็บข้อมูลอย่างไรเพื่อให้สามารถคงการรีบูตได้? นั่นเป็นคำถามของฉันถ้าไม่เลือกเช่นกัน
Otheus

6

hostnameคำสั่งไม่เก็บได้ทุกที่ชื่อ แต่หน่วยความจำเคอร์เนล

วิธีที่ระบบตัดสินใจว่าชื่อคืออะไรตอนบูทเครื่องขึ้นอยู่กับการตั้งค่าระบบ ตัวเลือกมีตั้งแต่การอ่านชื่อจากไฟล์ไปจนถึงการใช้ DNS หรือ / etc / hosts เพื่อตั้งชื่อหลังจากมีการเชื่อมต่อเครือข่ายที่เหมาะสม


2
ไม่เคย/etc/hosts(ซึ่งใช้สำหรับการค้นหา DNS - ระบบที่อ่านชื่อโฮสต์จากนั้นผิดปกติมาก) ... แต่อาจเป็นไปได้/etc/hostname(มีชื่อที่ผ่านการรับรองโดยสมบูรณ์) หรือไม่ค่อย/etc/sysconfig/network(อาจมีHOSTNAME=...คำสั่งเชลล์) ในอินสแตนซ์ amazon EC2 คุณอาจต้องแก้ไข/etc/cloud/cloud.cfg...
David Tonhofer

4

hostname(1)เป็นเพียงส่วนหน้าของการsethostname(3)เรียกของระบบซึ่งโดยทั่วไปจะเขียนชื่อโฮสต์ไปยังตำแหน่งที่เคอร์เนลคาดว่าจะเก็บไว้

หากคุณต้องการให้การเปลี่ยนแปลงนั้นถาวรตามปรัชญา Unix ทั่วไปคุณต้องเก็บมันไว้ด้วยตัวเอง ตำแหน่งที่แม่นยำขึ้นอยู่กับระบบเริ่มต้นของคุณ ตัวอย่างเช่น init ของ OpenBSD จะอ่านชื่อโฮสต์จาก/etc/myname(ระหว่างnetstart)

ทั้งหมดนี้ควรอธิบายไว้ใน manpages ของระบบหรือเอกสารประกอบ


2

เป็นเวลานาน * ดูแลระบบฉันจะระบุชัดเจนโดยไม่มีการอ้างอิง RTFM โดยตรง: :)

   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).

สิ่งนี้ถือเป็นจริงสำหรับ distros "linux" ส่วนใหญ่

--mem


1

ที่รันไทม์จะถูกเก็บไว้ในหน่วยความจำตามที่คนอื่นตอบแล้วที่นี่แล้ว

เพื่อความอยู่รอดในการรีบูตเครื่องจะต้องจัดเก็บไว้ในไฟล์บางแห่งซึ่งเป็นการแจกจ่ายเฉพาะลินุกซ์ ใน Fedora 20 ของฉันมัน / etc / hostname

มันน่าจะเก็บไว้ใน / etc ลองค้นหาชื่อโฮสต์จริงใน ฯลฯ

grep -r `hostname` /etc

ask.fedoraproject.org นี้ Q มีวิธีการทั้งหมดที่คุณสามารถตั้งค่า / รับชื่อโฮสต์บน F20 โดยใช้hostnamectlฯลฯ : ask.fedoraproject.org/en/question/37413/…
slm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.