Ana bilgisayar adını ayarlama: FQDN veya kısa ad?


178

Sistem ana bilgisayar adını ayarlamada "tercih edilen" yöntemin Red Hat / CentOS ve Debian / Ubuntu sistemleri arasında temelde farklı olduğunu fark ettim.

CentOS belgeleri ve RHEL dağıtım kılavuzu , ana bilgisayar adının FQDN olması gerektiğini söylüyor :

HOSTNAME=<value>, <value>Tam Nitelikli Alan Adı (FQDN) olmalıdır, örneğin hostname.example.com, ancak ana bilgisayar adı gerekli olduğunda olabilir.

RHEL yüklemek kılavuz biraz daha belirsiz:

Kur bir şekilde, ya bu bilgisayar için bir ana bilgisayar adını tedarik etmek ister tam etki alanı adı biçiminde (FQDN) hostname.domainname veya biçim kısa konak adı olarak hostname .

Debian referansı , ana bilgisayar adının FQDN'yi kullanmaması gerektiğini söylüyor :

3.5.5. Ana bilgisayar adı

Çekirdek sistem ana bilgisayar adını korur . " /Etc/init.d/hostname.sh " dizinine sembolik olarak bağlanan "S" komut satırındaki init betiği , sistem ana bilgisayar adını önyükleme sırasında ( ana bilgisayar adı komutunu kullanarak ) " / etc / hostname " içinde depolanan ada ayarlar . Bu dosya tam bir etki alanı adı değil, yalnızca sistem ana makine adını içermelidir .

IBM'in kullanacağı belirli herhangi bir öneri görmedim, ancak bazı yazılımların tercih ettiği görülüyor.

Sorularım:

  • Heterojen bir ortamda, satıcı tavsiyesini kullanmak ya da birini seçmek ve tüm ana bilgisayarlarda tutarlı olmak daha mı iyidir?
  • Ana bilgisayar adının FQDN'ye veya kısa ada ayarlanmış olmasına duyarlı olan hangi yazılımla karşılaştınız?

Yanıtlar:


106

Tüm çevre boyunca tutarlı bir yaklaşım seçerdim. Her iki çözüm de iyi çalışır ve çoğu uygulama ile uyumlu kalır. Yine de yönetilebilirlikte bir fark var.

Kısa adı HOSTNAME ayarı olarak kullanıyorum ve FQDN'yi /etc/hostssunucunun IP'si için ilk sütun olarak ayarlıyorum , ardından kısa adı izliyorum.

İkisi arasında bir tercihi uygulayan ya da görüntüleyen çok sayıda yazılım paketiyle karşılaşmadım. Bazı uygulamalar için özellikle de günlük kaydı yapan kısa adı temiz buluyorum. Belki de iç alan adlarını görünce şanssızdım server.northside.chicago.rizzomanufacturing.com. Kim bunu günlüklerde veya bir kabuk isteminde görmek ister ?

Bazen, şirket içi satın almalara veya dahili alanların ve / veya alt alanların değiştiği yerlerde yeniden yapılanmaya katılıyorum. Bu gibi durumlarda kısa ana bilgisayar adını kullanmaktan hoşlanıyorum çünkü günlüğe kaydetme, tekme başlangıçlar, yazdırma, sistem izleme vb. Yeni etki alanı adlarını hesaba katmak için tam olarak yeniden yapılandırmaya gerek duymuyor.

"İfp.com" iç alanı olan "rizzo" adlı bir sunucu için tipik bir RHEL / CentOS sunucusu kurulumu şöyle görünür:

/etc/sysconfig/network:
HOSTNAME=rizzo
...

-

/etc/hosts:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.16.100.13   rizzo.ifp.com rizzo

-

[root@rizzo ~]# hostname 
rizzo

-

/var/log/messages snippet:
Dec 15 10:10:13 rizzo proftpd[19675]: 172.16.100.13 (::ffff:206.15.236.182[::ffff:206.15.236.182]) - Preparing to               
 chroot to directory '/app/upload/GREEK'
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - FTP session opened.
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - Preparing to chroot                
to directory '/app/upload/ftp/SRRID'

7
Sizin gibi kısa adı tercih ediyorum ancak son zamanlarda bazı Oracle uygulamalarının FQDN'nin çıktısını hostnamealmasını gerektirdiğini keşfettim . Sadece içeri /etc/hostssokmak yeterince iyi değil. Bu benim tutarlılığımı karıştırdı.
James O'Gorman,

3
Bu örnekte ana bilgisayar adlarının büyük harf farkı mutlaka iyi bir uygulama ref değil: tools.ietf.org/search/rfc1178
teknopaul

2
Olmamalı /etc/sysconfig/networkgibi satırı içerir: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes

@ JasmineLognnes Doğru, düzelttim. Umarım bu beyazın umrunda değildir.
kubanczyk

1
Bu sadece tercihle ilgili değil. hostname(1)Herhangi bir Linux makinesinde görün .

39

Hemen hemen tüm yazılımlar ana bilgisayar adını doğru şekilde ayarlamaya duyarlıdır. Digg'de çalışırken, bir zamanlar /etc/hostssistemin ana bilgisayar adı nosyonunu etkilemiş gibi görünüşte masum bir değişiklik yaptığı için tüm siteyi 2 saatliğine indirdim . Hafifçe bas. Bu, burada biraz karışık olabilir dedi. Bu HOSTNAME=ayarın Debian tabanlı dağıtımların nasıl kullanıldığına doğrudan eşit olduğunu sanmıyorum /etc/hostname.

Heterojen bir ortamda benim için çalışan şey şudur:

  1. Konfigürasyon yönetimi yazılımınızdaki bir şartı kullanarak, ana bilgisayar adını satıcı tarafından önerilen şekilde ayarlayın.
  2. hostnameÇekirdek tarafından kullanılan ana bilgisayar adını ayarlamak için komutu kullanın .
  3. İçinde /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Bu yapılandırma henüz başarısız olmadı.


İşte hemen kullandığım kurulum bu. Kısa ad, etki alanı adı, ortamınızdaki ilgili makineler için DNA arama yolunda (/etc/resolv.conf) bulunduğu sürece iyi olmalıdır
gWaldo

halka açık bir yerel IP ağını özellikle tavsiye edermisiniz?
code_monk

34

Kesinlikle çevrimiçi bir şekilde referans bulmakta hiçbir sıkıntı yaşamayacaksınız, ki bu size kesinlikle bir şekilde yapacağınızı söyleyecektir. Bana öyle geliyor ki, ana bilgisayar adı olarak kısa bir isme sahip olmak ve / etc / hosts dosyasının tam adını almak kesinlikle çok daha yaygın. Daha mantıklı bir yol gibi gözüküyor, o zaman tam bir isme ihtiyaç duyan servisler hostname --fqdnyerine çağrı yapmak için uyarlanabilirler .

Son zamanlarda katı bir şekilde geri getirilmesi gereken bir fqdn gerektiren bir yazılım hostnameparçasıyla karşılaştım. Bunu burada belgeliyorlar . hostname --fqdnAncak uyum sağlayamamaları için bir sebep görmüyorum .


"Uyum sağlayamadıkları bir neden göremiyorum hostname --fqdn" başlıklı ilk paragrafta "Neden tam nitelikli bir ana bilgisayar adı" - cevabını tahmin ediyor ve çalışan bir çözümleyici gerektiriyor. Çekirdeğe sormak en güvenli ve en güvenilir seçenektir.
Womble

3
@womble - / etc / hosts dosyası machine ( 10.0.0.1 hostname.example.com hostname) ve /etc/nsswitch.conf için bir girdi içeriyorsa, DNS ( hosts: files dns) işleminden önce yerel çözünürlüğü belirledikten sonra çalışan bir çözümleyiciye sahip olmak yerel ana dosyalar tarafından yerine getirilir. Gibi bir ana bilgisayar adı yerine FQDN kullanmak için argüman nadiren su tutar. Ayrıca, bir FQDN'nin kesin hostnameolarak geri verilmesi gereken bir başka yazılım örneği de Zimbra posta sunucusu paketidir.
crashmaxed

@crashmaxed: Bu, hiçbiri belirli bir ortamda mümkün olamayabilen veya yanlışlıkla batırılmayabilecek olan ekstra gereksinimlerdir. FQDN'nin çekirdek veri yapılarında bulunması çok basittir.
womble

11

Biraz teğetsel olarak, bu soruyu araştırırken, "hostname" kaynak kodunu kontrol etmek ve araştırma sonuçlarını yazdırmak için bir senaryo yazmak için yeterince çılgına dönüyorum (Fedora 19). Eksik olan, benim düşünceme göre ilk başta bunların hepsinden uzak durulması gereken "/ etc / hosts" dosyasına bir bakış.

#!/bin/bash

function pad {
   if [[ $1 == '?' ]]; then
      printf "%-23s" "?"
   else
      printf "%-23s" "'$1'"
   fi
}

# ----- Kernel -----

# Two ways to configure the kernel values: 
# 1) Put FQDN into "kernel.hostname" and nothing into "kernel.domainname"
# 2) Put machine name into "kernel.hostname" and DNS domain name into "kernel.domainname" (makes more sense)

echo "== Kernel values =="
echo

H=`/sbin/sysctl -n kernel.hostname`
D=`/sbin/sysctl -n kernel.domainname`

echo "Kernel hostname: '$H'"
echo "Kernel domainname: '$D'"

# ----- What does bash say -----

echo
echo "== According to bash =="
echo

echo "HOSTNAME = '$HOSTNAME'"

# ----- Hostname config file ------

echo
echo "== Hostname config file =="
echo

ETCH="/etc/hostname"

if [[ -f $ETCH ]]; then
   CONTENTS=`cat $ETCH`
   echo "File '$ETCH' contains: '$CONTENTS'"
else
   echo "File '$ETCH' does not exist"
fi

# ----- Network config file ------

echo
echo "== Network config file =="
echo

SYSN="/etc/sysconfig/network"

if [[ -f $SYSN ]]; then
   LINE=`grep -e "^HOSTNAME=" $SYSN`
   if [[ -n $LINE ]]; then
      echo "File '$SYSN' contains: '$LINE'"
   else 
      echo "File '$SYSN' exists but does not contain a line for 'HOSTNAME'"
   fi
else
   echo "File '$SYSN' does not exist"
fi

# ----- Nodename -------

echo
echo "== Nodename =="
echo

UNAME=`uname --nodename` # On Linux, this is the hostname

echo "The 'nodename' given by 'uname --nodename' is: '$UNAME'"

# ----- The 'hostname' mess ------

THE_HOSTNAME=`hostname`
SHORT_NAME=`hostname --short`
NIS_DNAME=`domainname`     
YP_DNAME=`hostname --yp`    # Same as `nisdomainname` ; this may fail with "hostname: Local domain name not set"

if [[ $? != 0 ]]; then
   YP_DNAME="?"
fi

echo
echo "== 'hostname' directly obtained values =="
echo
echo "The result of gethostname();"
echo "...obtained by running 'hostname'"
echo "Hostname: $(pad $THE_HOSTNAME)"
echo
echo "The part before the first '.' of the value returned by gethostname();"
echo "...obtained by running 'hostname --short'"
echo "Short name: $(pad $SHORT_NAME)"
echo
echo "The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';"
echo "...on Linux, this is the kernel-configured domainname;"
echo "...obtained by running 'domainname'"
echo "NIS domain name: $(pad $NIS_DNAME)"
echo
echo "The result of yp_get_default_domain(), which may fail;"
echo "...obtained by running 'ĥostname --yp'"
echo "YP default domain: $(pad $YP_DNAME)"

DNS_DNAME=`hostname --domain`  # Same as `dnsdomainname`'
FQDN_NAME=`hostname --fqdn`
ALIAS_NAME=`hostname --alias`

echo
echo "== 'hostname' values obtained via DNS =="
echo
echo "The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --domain'"
echo "DNS domain name: $(pad $DNS_DNAME)"
echo
echo "The 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --fqdn'"
echo "Fully qualified hostname: $(pad $FQDN_NAME)"
echo
echo "Alias obtained by gethostbyname(gethostname());"
echo "...obtained by running 'hostname --alias'"
echo "Hostname alias: $(pad $ALIAS_NAME)"

BY_IP_ADDR=`hostname --ip-address`
ALL_IP_ADDR=`hostname --all-ip-addresses`
ALL_FQDN_NAMES=`hostname --all-fqdn`

echo
echo "== 'hostname' values obtained by collecting configured network addresses =="
echo
echo "Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;"
echo "...obtained by running 'hostname --ip-address'"
echo "By IP address: $BY_IP_ADDR"
echo
echo "Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;"
echo "...obtained by running 'hostname --all-ip-addresses'"
echo "All IP addresses: $ALL_IP_ADDR"
echo
echo "Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);"
echo "...obtained by running 'hostname --all-fqdn'"
echo "All fully qualified hostnames: $ALL_FQDN_NAMES"

Çekirdek değerlerini el ile ayarladıktan ve doldurduktan sonra Fedora 19 çalıştıran Amazon EC2 VM'deki çıktı şu /etc/hostnameşekilde /etc/hostsolabilir:

== Kernel values ==

Kernel hostname: 'kyubee'
Kernel domainname: 'homelinux.org'

== According to bash ==

HOSTNAME = 'ip-172-31-24-249.localdomain'

== Hostname config file ==

File '/etc/hostname' contains: 'kyubee.homelinux.org'

== Network config file ==

File '/etc/sysconfig/network' exists but does not contain a line for 'HOSTNAME'

== Nodename ==

The 'nodename' given by 'uname --nodename' is: 'kyubee'

== 'hostname' directly obtained values ==

The result of gethostname();
...obtained by running 'hostname'
Hostname: 'kyubee'

The part before the first '.' of the value returned by gethostname();
...obtained by running 'hostname --short'
Short name: 'kyubee'

The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';
...on Linux, this is the kernel-configured domainname;
...obtained by running 'domainname'
NIS domain name: 'homelinux.org'

The result of yp_get_default_domain(), which may fail;
...obtained by running 'ĥostname --yp'
YP default domain: 'homelinux.org'

== 'hostname' values obtained via DNS ==

The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --domain'
DNS domain name: ''

The 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --fqdn'
Fully qualified hostname: 'kyubee'

Alias obtained by gethostbyname(gethostname());
...obtained by running 'hostname --alias'
Hostname alias: ''

== 'hostname' values obtained by collecting configured network addresses ==

Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;
...obtained by running 'hostname --ip-address'
By IP address: fe80::8f6:8eff:fe49:9e21%eth0 172.31.24.249

Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;
...obtained by running 'hostname --all-ip-addresses'
All IP addresses: 172.31.24.249

Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);
...obtained by running 'hostname --all-fqdn'
All fully qualified hostnames: ip-172-31-24-249.eu-west-1.compute.internal

Perl'de tam olarak nitelenmiş ana bilgisayar adını almanın esnek yolu şöyle olacaktır:

sub getHostname {

   my $hostname_short = `/bin/hostname --short`;
   if ($? != 0) { print STDERR "Could not execute 'hostname --short' -- exiting\n"; exit 1 }
   chomp $hostname_short;

   my $hostname_long  = `/bin/hostname`;
   if ($? != 0) { print STDERR "Could not execute 'hostname' -- exiting\n"; exit 1 }
   chomp $hostname_long;

   if ($hostname_long =~ /^${hostname_short}\..+$/) {
      # "hostname_long" is a qualified version of "hostname_short"
      return $hostname_long
   }
   else {
      # both hostnames are "short" (and are equal)
      die unless ($hostname_long eq $hostname_short);

      my $domainname = `/bin/domainname`;
      if ($? != 0) { print STDERR "Could not execute 'domainname' -- exiting\n"; exit 1 }
      chomp $domainname;

      if ($domainname eq "(none)") {
         # Change according to taste
         return "${hostname_short}.localdomain"
      }
      else {
         return "${hostname_short}.${domainname}"
      }
   }
}

ve bash olacaktır:

function getHostname {

   local hostname_short=`/bin/hostname --short`

   if [ $? -ne 0 ]; then
      echo "Could not execute 'hostname --short' -- exiting" >&2; exit 1
   fi

   local hostname_long=`/bin/hostname`

   if [ $? -ne 0 ]; then
      echo "Could not execute 'hostname' -- exiting" >&2; exit 1
   fi

   if [[ $hostname_long =~ ^"$hostname_short"\..+$ ]]; then
      # "hostname_long" is a qualified version of "hostname_short"
      echo $hostname_long
   else
      # both hostnames are "short" (and are equal)
      if [[ $hostname_long != $hostname_short ]]; then
         echo "Cannot happen: '$hostname_long' <> '$hostname_short' -- exiting" >&2; exit 1
      fi

      local domainname=`/bin/domainname`

      if [ $? -ne 0 ]; then
         echo "Could not execute 'domainname' -- exiting" >&2; exit 1
      fi

      if [[ domainname == '(none)' ]]; then
         # Change according to taste
         echo "${hostname_short}.localdomain"
      else
         echo "${hostname_short}.${domainname}"
      fi
   fi
}

notlar

Not 1: HOSTNAME, bash'ın sağladığı bir kabuk değişkenidir ("Geçerli ana bilgisayarın adına otomatik olarak ayarlanır."), Ancak bu değere bash geldiğine dair hiçbir gösterge yoktur.

Not 2: /boot/initrams-FOO.img ... / etc / hostname dosyasını asla unutma


4
Bunun açık olması gerektiğine üzüldüm, peki, bunun ana bilgisayar adını ayarlamakla ne ilgisi var?
Chris S

Temel olarak, Fedora 19 EC2 örneklerimdeki ana makine adını belirlerken yaptığım notlar. Sonuç olarak: 1) FQHN'yi / etc / hostname içinde ayarlayın 2) / etc / hosts dosyasına dokunmayın 3) Değerin alınmaması durumunda, 'çekirdek ana bilgisayar adını' FQHN'ye veya niteliksiz ana bilgisayar adına ayarlayabilirsiniz. / etc / hostname 4) 'Çekirdek etki alanı adını' sadece '(hiçbiri)' işaretinden daha iyi olan etki alanı adına ayarlayabilirsiniz.
David Tonhofer

-4

/ Etc / hosts seçenekleri iyi çalışıyor.

Ancak tüm uygun dosyaların güncellendiğinden emin olmak istiyorsanız kurulum aracını çalıştırın


Dağıtımımın bir "kurulum" aracı yok; hangi dağıtımdan kullanıyorsunuz
nickgrim

Herhangi bir redhat tabanlı işletim sistemi kullandığınız rhel / centos / fedora whar işletim sistemi kurulum aracına sahip misiniz?
Riaan

3
Soru RHEL ve Debian merkezli dağıtımlar arasındaki farklılıklar hakkında konuştuğundan, her ikisinin de kullandığını varsaymalıyız. Debian merkezli dağıtımlarda 'setup' aracı yoktur.
Martijn Heemels

-4

Hm ... Linux ana bilgisayarlarında, HOSTNAME ve FQDN'yi değiştirmek istiyorsanız, 3 adımı çözmelisiniz (örneğin, yeni ana bilgisayar: rizzo.ifp.com ):

Adım # 1 NETWORK özellikleri config içindeki HOST değerini değiştirin:

sudo vi /etc/sysconfig/network

Dize değiştirin veya ekleyin:

HOSTNAME=rizzo.ifp.com

Adım 2 - Ana makinenizi yapılandırın

sudo vim /etc/hosts
#IPv4
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
[External IP]   rizzo rizzo.ifp.com

Adım # 3 Sunucunuzu yeniden başlatın Aferin, sadece yeni konfigürasyonu kontrol edin

[rizzo@rizzo]# hostname -f
rizzo.ifp.com

-4

Sipariş doğru değil. Olmak zorunda:

1.2.3.4 full.example.com full

Yani örnek şöyle olabilir:

[External IP] rizzo.example.com rizzo 

4
Bu sorunun gerçekten kaliteli cevapları var. Bu yeni bir şey eklemez.
Esa Jokinen
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.