GNU/Linux >> Belajar Linux >  >> Linux

Mengatur nama host:FQDN atau nama pendek?

Solusi 1:

Saya akan memilih pendekatan yang konsisten di seluruh lingkungan. Kedua solusi berfungsi dengan baik dan akan tetap kompatibel dengan sebagian besar aplikasi. Namun, ada perbedaan dalam pengelolaan.

Saya menggunakan nama pendek sebagai pengaturan HOSTNAME, dan mengatur FQDN sebagai kolom pertama di /etc/hosts untuk IP server, diikuti dengan nama pendek.

Saya belum menemukan banyak paket perangkat lunak yang menerapkan atau menampilkan preferensi di antara keduanya. Saya menemukan nama pendek lebih bersih untuk beberapa aplikasi, khususnya logging. Mungkin saya kurang beruntung melihat domain internal seperti server.northside.chicago.rizzomanufacturing.com . Siapa yang ingin melihatnya di log atau permintaan shell ?

Terkadang, saya terlibat dalam akuisisi atau restrukturisasi perusahaan di mana domain internal dan/atau subdomain berubah. Saya suka menggunakan nama host pendek dalam kasus ini karena logging, kickstarts, pencetakan, pemantauan sistem, dll. tidak memerlukan konfigurasi ulang penuh untuk memperhitungkan nama domain baru.

Penyiapan server RHEL/CentOS tipikal untuk server bernama "rizzo" dengan domain internal "ifp.com", akan terlihat seperti:

/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

-

[[email protected] ~]# 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'

Solusi 2:

Hampir semua perangkat lunak peka terhadap pengaturan nama host dengan benar. Ketika saya bekerja di Digg, saya pernah mematikan seluruh situs selama 2 jam karena membuat perubahan yang tampaknya tidak berbahaya di /etc/hosts yang memengaruhi gagasan sistem tentang nama host. Tapak ringan. Yang mengatakan, Anda mungkin sedikit bingung di sini. Saya tidak memikirkan HOSTNAME= pengaturan secara langsung setara dengan bagaimana distribusi berbasis Debian menggunakan /etc/hostname .

Apa yang berhasil bagi saya di lingkungan yang heterogen adalah:

  1. Tetapkan hostname dengan cara yang direkomendasikan vendor, menggunakan kondisional di perangkat lunak manajemen konfigurasi Anda.
  2. Gunakan hostname perintah untuk mengatur nama host yang digunakan oleh kernel, dll.
  3. Di /etc/hosts :

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Konfigurasi ini belum mengecewakan saya.

Solusi 3:

Anda pasti tidak akan kesulitan menemukan referensi online yang akan memberi tahu Anda untuk melakukannya dengan satu atau lain cara. Namun menurut saya memiliki nama pendek sebagai nama host, dan memiliki nama yang memenuhi syarat di /etc/hosts tentu jauh lebih umum. Sepertinya cara yang lebih masuk akal, karena layanan yang membutuhkan nama yang memenuhi syarat dapat diadaptasi untuk memanggil hostname --fqdn sebagai gantinya.

Saya hanya menemukan satu perangkat lunak baru-baru ini yang secara kaku membutuhkan fqdn untuk dikembalikan oleh hostname , yaitu ganeti. Mereka mendokumentasikan ini di sini. Saya tidak melihat alasan mengapa mereka tidak dapat beradaptasi dengan hostname --fqdn , namun.

Solusi 4:

Agak aneh, saat meneliti pertanyaan ini, saya sudah cukup gila untuk memeriksa kode sumber "nama host" dan menulis skrip untuk mencetak hasil investigasi (Fedora 19). Apa yang hilang adalah melihat "/etc/hosts", yang menurut pendapat saya yang sederhana harus dijauhkan dari semua ini sejak awal.

#!/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"

Output pada VM Amazon EC2 yang menjalankan Fedora 19 , setelah mengatur nilai kernel secara manual dan mengisi /etc/hostname , tetapi tanpa perubahan pada /etc/hosts mungkin kemudian menjadi seperti ini:

== 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

Cara tangguh untuk mendapatkan nama host yang memenuhi syarat di perl adalah:

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

dan dalam bash itu akan menjadi:

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
}

Catatan

Catatan 1:HOSTNAME adalah variabel shell yang disediakan oleh bash ("Secara otomatis disetel ke nama host saat ini.") tetapi tidak ada indikasi bash tiba pada nilai tersebut.

Catatan 2:Jangan pernah lupa /etc/hostname di /boot/initrams-FOO.img ...


Linux
  1. Diutamakan Operator Logika Shell &&, ||?

  2. Mengatur Hostname di Docker Compose

  3. Cara Setting &Ubah Hostname &FQDN (Fully Qualified Domain Name) di RHEL &CentOS 7

  1. Bagaimana cara mengubah nama host di Ubuntu

  2. Ubah nama host di Ubuntu menggunakan GUI dan CommandLine

  3. Apa gunanya perintah hostnamectl?

  1. Linux – Apa File Default Untuk `hostname`?

  2. Bagaimana Cara Mengubah Nama Host?

  3. Mengatur umask pengguna Apache