`Hostname`, belirlediğim host adını nerede saklıyor?


15

Bu oldukça kafa karıştırıcı. hostnameKomutun ana bilgisayar adını nereden sakladığını ve okuduğunu bilen var mı ?

Ben / etc / hostname olduğunu düşündüm ama kullandığım bu Linux sisteminde böyle bir dosya yok. Strace kullanarak nerede olduğunu bulmak için çalıştı ama hiçbir okuma çağrıları bu bilgileri döndürdü:

$ 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

Sonra bu bilgileri döndürdü unys syscall yaptı fark ettim:

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

/ Etc / dizininde yinelemeli bir grep hiçbir şey döndürmez:

grep "server-name" -r /etc 

Uname bu bilgileri nerede saklıyor? Sadece hafızada mı?


1
hangi linux dağıtımını kullanıyorsunuz?
amir jj

Yanıtlar:


9

Şu ilgili U&L Soru-Cevap başlıklı makaleye göz atın: uname, bilgilerini nereden alıyor? . Ana bilgisayar adı gibi bilgiler, sistem çalışırken Linux çekirdeğindeki bir veri yapısı içinde kalır. Bir sistemin önyüklemesi sırasında bu bilgiler, genellikle dağıtıma özgü çeşitli mekanizmalar aracılığıyla yeniden elde edilebilir.

man 2 unameMan sayfasına bakarsanız, burada belirtilen bir veri yapısı vardır:

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

Bu yapının 2. öğesi nodename[], ana bilgisayar adının Linux çekirdeğinde depolandığı bir yerdir.

/ proc

Bir göz atarsanız /proc/sys/kernel/hostname, burada da ana bilgisayar adı gösterilir. Bu sanal bir konumdur, /procancak ana bilgisayar adına erişmek için alternatif bir yöntem sağlar. Sistemin alan adı da burada /proc/sys/kernel/domainname.

NOT: İlgilenilen, bu değerler UTS ad alanına özgüdür .

Misal

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

Ana bilgisayar adını değiştirme

Systemd sistemlerinde hostnamectl, ana bilgisayar adını almak / ayarlamak için cli aracını kullanabilirsiniz . Bu, yeniden başlatmalar arasında kalıcı olarak değişecektir.

$ sudo hostnamectl set-hostname --static somehostname

Ayrıca değerini şu yollarla da öğrenebilirsiniz sysctl:

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

Fedora sürümleri için, bu ask.fedoraproject.org Soru-Cevap konuyu oldukça ayrıntılı bir şekilde ele alır : Başlık: Amazon EC2'de ana bilgisayar adını - Fedora 20 doğru şekilde ayarlamak .


1
Meh. hostnamectl bir sistem çağrısını çağırır. Sistem çağrısı, bilgileri yeniden başlatmalarda kalıcı olacak şekilde nasıl saklar? Bu benim sorum, OP'ler deđilse.
Otheus

6

hostnameKomut adı hiçbir yerinde ama çekirdek belleği saklamaz.

Sistemin açılışta adının ne olduğuna nasıl karar verdiği, sistemin nasıl yapılandırıldığına bağlıdır. Seçenekler, bir dosyadan ad okumadan, uygun bir ağ arabirimi açıldıktan sonra adı ayarlamak için DNS veya / etc / hosts kullanmaya kadar değişir.


2
Asla /etc/hosts(DNS aramaları içindir - ana bilgisayar adını oradan okuyan bir sistem o kadar yanlıştır) ... ama muhtemelen /etc/hostname(tam adı içerir) veya nadiren /etc/sysconfig/network( HOSTNAME=...kabuk komutu içerebilir ). Amazon EC2 örneğinde de değişiklik yapmanız gerekebilir /etc/cloud/cloud.cfg...
David Tonhofer

4

hostname(1)sethostname(3)temel olarak ana makine adını çekirdeğin depolanmasını beklediği yere yazan sistem çağrısının yalnızca bir ön ucudur .

Değişikliğin kalıcı olmasını istiyorsanız, genel Unix felsefesine göre bunu kendiniz saklamanız gerekir. Ancak kesin konum büyük ölçüde init sisteminize bağlıdır. Örneğin, OpenBSD'nin başlangıcı /etc/myname(sırasında netstart) ana bilgisayar adını okur .

Tüm bunlar, sisteminizin yönetim sayfalarında veya destekleyici belgelerde açıklanmalıdır.


2

Uzun bir süre * nix sysadmin olarak, doğrudan bir RTFM referansı olmadan bariz olarak belirteceğim: :)

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

Bu, çoğu "linux" dağıtım için geçerlidir.

--mem


1

Çalışma zamanında, burada diğerleri tarafından cevaplandığı gibi bellekte saklanır.

Yeniden başlatma işleminden kurtulmak için dosya üzerinde linux dağıtımına özgü bir yerde saklanması gerekir. Fedora 20'mde / etc / hostname var

Büyük olasılıkla / etc'de depolanır. İçindeki gerçek ana bilgisayar adını aramaya çalışın vb.

grep -r `hostname` /etc

Bu ask.fedoraproject.org Q, hostnamectlvb. Kullanarak F20'de
slm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.