Di mana `hostname` menyimpan nama host yang telah saya atur?

15

Ini cukup membingungkan. Adakah yang tahu di mana hostnameperintah menyimpan dan membaca nama host?

Saya pikir itu adalah / etc / hostname tetapi tidak ada file pada sistem Linux yang saya gunakan. Saya mencoba menggunakan strace untuk menemukan di mana ia berada tetapi tidak ada panggilan baca yang mengembalikan informasi ini:

$ 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

Lalu saya perhatikan itu syscall tidak sama yang mengembalikan informasi ini:

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

Grep rekursif di / etc / menghasilkan apa-apa:

grep "server-name" -r /etc 

Di mana uname menyimpan informasi ini? Hanya dalam ingatan?

Peter Krumins
sumber
1
distro linux apa yang Anda gunakan?
amir jj

Jawaban:

9

Lihatlah U&L terkait Q&A berjudul: Di mana uname mendapatkan informasinya? . Informasi seperti nama host tetap ada dalam struktur data dalam kernel Linux, saat sistem sedang berjalan. Selama boot sistem informasi ini dapat disambungkan kembali melalui berbagai mekanisme yang biasanya khusus distro.

Jika Anda melihat man 2 unamehalaman manual ada struktur data yang disebutkan di sana:

           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
           };

Elemen ke-2 dari struktur itu, nodename[]adalah satu tempat di mana nama host disimpan dalam kernel Linux.

/ proc

Jika Anda melihatnya /proc/sys/kernel/hostname, nama host juga akan ditampilkan di sini. Ini adalah lokasi virtual /proc, tetapi ini memberi Anda metode alternatif untuk mengakses nama host. Domainname sistem juga ada di sini /proc/sys/kernel/domainname,.

CATATAN: Yang menarik, nilai-nilai ini adalah spesifik namespace UTS .

Contoh

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

Memanipulasi nama host

Pada sistem dengan Systemd Anda dapat menggunakan alat cli hostnamectluntuk mendapatkan / mengatur nama host. Ini akan mengubahnya secara permanen di antara reboot.

$ sudo hostnamectl set-hostname --static somehostname

Anda juga dapat mengetahui nilainya melalui sysctl:

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

Untuk rilis Fedora, tanya & Jawab pada ask.fedoraproject.org ini mencakup topik dengan cukup seksama, berjudul: Mengatur nama host dengan benar - Fedora 20 di Amazon EC2 .

slm
sumber
1
Ah. hostnamectl hanya memanggil system call. Bagaimana syscall menyimpan informasi sehingga persisten di seluruh reboot? Itu pertanyaan saya, kalau bukan OP juga.
Otheus
6

The hostnameperintah tidak menyimpan nama mana saja tapi memori kernel.

Bagaimana sistem menentukan namanya pada saat boot tergantung pada bagaimana sistem dikonfigurasi. Pilihan berkisar dari membaca nama dari file, hingga menggunakan DNS atau / etc / hosts untuk mengatur nama setelah antarmuka jaringan yang sesuai telah muncul.

Kyle Jones
sumber
2
Tidak pernah /etc/hosts(yang untuk pencarian DNS - sistem yang membaca nama hostnya dari oh begitu salah) ... tetapi mungkin /etc/hostname(berisi nama yang sepenuhnya memenuhi syarat) atau jarang /etc/sysconfig/network(mungkin berisi HOSTNAME=...perintah shell). Pada contoh amazon EC2 Anda mungkin juga harus memodifikasi /etc/cloud/cloud.cfg...
David Tonhofer
4

hostname(1)hanyalah sebuah front-end untuk sethostname(3)panggilan sistem, yang pada dasarnya menulis nama host ke tempat kernel mengharapkannya untuk disimpan.

Jika Anda ingin perubahan menjadi permanen, sesuai filosofi Unix umum Anda harus menyimpannya sendiri. Namun lokasi tepatnya sangat tergantung pada sistem init Anda. Sebagai contoh, init OpenBSD membaca nama host dari /etc/myname(selama netstart).

Semua ini harus dijelaskan di halaman manual sistem Anda atau dokumentasi pendukung.

Vucar Timnärakrul
sumber
2

Sebagai lama * nix sysadmin, saya akan menyatakan yang jelas, tanpa referensi RTFM langsung: :)

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

Ini berlaku untuk sebagian besar distro "linux".

--mem

mem
sumber
1

Saat runtime disimpan dalam memori seperti yang sudah dijawab oleh yang lain di sini.

Untuk bertahan dari reboot harus disimpan di file di suatu tempat, yang khusus distribusi linux. Pada Fedora 20 saya, ini adalah / etc / hostname

Kemungkinan besar disimpan di / etc. Cobalah untuk mencari nama host yang sebenarnya di dll

grep -r `hostname` /etc
Arnaud Kleinveld
sumber
Tanya.fedoraproject.org Q ini memiliki semua cara Anda dapat mengatur / mendapatkan nama host di F20 menggunakan hostnamectldll .: ask.fedoraproject.org/en/question/37413/…
slm