Hostname Configuration บน Linux — hostnamectl, /etc/hostname และ FQDN

Hostname คือชื่อที่ใช้ระบุตัว Server ในระบบ Network การตั้งชื่อ Hostname ที่ถูกต้องและสื่อความหมายช่วยให้การ Debug ง่ายขึ้น เพราะ Log ทุกบรรทัดจะแสดง Hostname ของ Server ที่สร้าง Log นั้น บน Infrastructure ที่มีหลาย Server การตั้งชื่อตามรูปแบบที่สม่ำเสมอ เช่น web-prod-01, db-prod-01 ช่วยให้ทีมรู้ทันทีว่า Server นั้นมีหน้าที่อะไรและอยู่ใน Environment ใด

บทความนี้อธิบายการดู, ตั้งค่า, และจัดการ Hostname บน Linux ผ่าน hostnamectl, ไฟล์ /etc/hostname, /etc/hosts รวมถึงความต่างระหว่าง Static, Transient, และ Pretty Hostname และการตั้งค่า FQDN สำหรับ Server ที่ใช้งานจริง

ประเภทของ Hostname บน Linux

# Linux มี 3 ประเภท Hostname:
# 1. Static Hostname  — ชื่อถาวรที่เก็บใน /etc/hostname (ใช้หลัง Reboot)
# 2. Transient Hostname — ชื่อชั่วคราวที่ Kernel ใช้ระหว่าง Session
#                        ถูก Set โดย DHCP หรือ mDNS (ถ้าไม่มี Static Hostname)
# 3. Pretty Hostname  — ชื่อแบบ Free-form สำหรับแสดงผล เช่น "Production Web Server"
#                        ไม่มีข้อจำกัดด้านอักขระ — เก็บใน /etc/machine-info

# ดู Hostname ทั้ง 3 ประเภท
hostnamectl status

# ตัวอย่าง Output:
#    Static hostname: web-prod-01
#  Transient hostname: web-prod-01
#    Pretty hostname: Production Web Server #01
#          Icon name: computer-server
#         Machine ID: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
#            Boot ID: 1234567890abcdef1234567890abcdef
#   Operating System: Ubuntu 24.04.2 LTS
#             Kernel: Linux 6.8.0-51-generic
#       Architecture: x86-64

ดู Hostname ปัจจุบัน

# คำสั่งพื้นฐานดู Hostname
hostname          # Static/Transient hostname
hostname -f       # FQDN (Fully Qualified Domain Name)
hostname -i       # IP Address ที่ resolve ได้จาก Hostname
hostname -I       # IP Address ทุก Interface

# ดูด้วย hostnamectl (ละเอียดกว่า)
hostnamectl status
hostnamectl --static     # แสดงเฉพาะ Static Hostname
hostnamectl --transient  # แสดงเฉพาะ Transient Hostname
hostnamectl --pretty     # แสดงเฉพาะ Pretty Hostname

# ดูจากไฟล์โดยตรง
cat /etc/hostname           # Static Hostname
cat /etc/machine-info       # Pretty Hostname และ Meta

ตั้งค่า Hostname ด้วย hostnamectl

# ตั้ง Static Hostname (ถาวร — มีผลทันทีและหลัง Reboot)
sudo hostnamectl set-hostname web-prod-01

# ตั้ง Static Hostname พร้อม FQDN
sudo hostnamectl set-hostname web-prod-01.example.com

# ตั้ง Pretty Hostname (ชื่อแสดงผล)
sudo hostnamectl set-hostname "Production Web Server #01" --pretty

# ตั้ง Transient Hostname (ชั่วคราว — Reset เมื่อ Reboot)
sudo hostnamectl set-hostname temp-hostname --transient

# ตรวจสอบ
hostnamectl status

ตั้งค่า Hostname ผ่านไฟล์ /etc/hostname

# /etc/hostname เก็บ Static Hostname (บรรทัดเดียว ไม่มี FQDN)
cat /etc/hostname
# web-prod-01

# แก้ไขโดยตรง
echo "web-prod-01" | sudo tee /etc/hostname

# หรือด้วย editor
sudo nano /etc/hostname

# ใช้งานทันทีโดยไม่ต้อง Reboot
sudo hostname -F /etc/hostname
# หรือ
sudo hostnamectl set-hostname "$(cat /etc/hostname)"

ตั้งค่า /etc/hosts ให้ตรงกับ Hostname

หลังเปลี่ยน Hostname ต้องอัพเดต /etc/hosts ให้ Hostname ใหม่ชี้ไปที่ localhost (127.0.1.1) เพื่อป้องกัน Application ที่ Resolve Hostname แล้วได้รับ “hostname: Name or service not known”

# ดู /etc/hosts ปัจจุบัน
cat /etc/hosts

# โครงสร้างที่ถูกต้องหลังเปลี่ยน Hostname
# 127.0.0.1   localhost
# 127.0.1.1   web-prod-01.example.com  web-prod-01
# ::1         localhost ip6-localhost ip6-loopback

# แก้ไข /etc/hosts
sudo nano /etc/hosts

# เปลี่ยนบรรทัด 127.0.1.1 ให้ตรงกับ Hostname ใหม่
# 127.0.1.1   <FQDN>  <short-hostname>

# ตัวอย่าง:
# 127.0.1.1   web-prod-01.example.com  web-prod-01

# ทดสอบว่า Resolve ได้
hostname -f             # ควรได้ FQDN
getent hosts $(hostname)  # ควรได้ 127.0.1.1

รูปแบบ Hostname ที่แนะนำ

# หลักการตั้งชื่อ Hostname ที่ดี:
# - ใช้ตัวอักษรพิมพ์เล็ก a-z, ตัวเลข 0-9, และ hyphen (-) เท่านั้น
# - ห้ามขึ้นต้นหรือลงท้ายด้วย hyphen
# - ความยาวไม่เกิน 63 อักขระต่อ Label, ไม่เกิน 253 อักขระรวม
# - ห้ามใช้ underscore (_) — ไม่ถูกต้องตามมาตรฐาน RFC
# - ห้ามใช้ตัวพิมพ์ใหญ่ (case-insensitive แต่ Convention ใช้พิมพ์เล็ก)

# รูปแบบที่แนะนำสำหรับ Infrastructure:
# {role}-{environment}-{number}
# เช่น:
web-prod-01     # Web Server, Production, #1
web-prod-02     # Web Server, Production, #2
db-prod-01      # Database, Production, #1
cache-staging-01 # Cache Server, Staging, #1
lb-prod-01      # Load Balancer, Production, #1

# หรือตาม Data Center/Region:
web-th-prod-01   # Web, Thailand, Production, #1
db-sg-prod-01    # Database, Singapore, Production, #1

# FQDN = Hostname + Domain
# web-prod-01.internal.example.com
# db-prod-01.db.example.com

ตั้งค่า FQDN และ Domain

# FQDN (Fully Qualified Domain Name) = Short Hostname + Domain
# เช่น web-prod-01.example.com

# วิธีที่ 1: ตั้ง Hostname เป็น FQDN โดยตรง
sudo hostnamectl set-hostname web-prod-01.example.com

# วิธีที่ 2: ตั้ง Short Hostname แล้วกำหนด Domain ใน /etc/hosts
# /etc/hostname: web-prod-01
# /etc/hosts:
#   127.0.1.1  web-prod-01.example.com  web-prod-01

# วิธีที่ 3: ตั้งผ่าน DNS Search Domain ใน /etc/resolv.conf
# hostname: web-prod-01
# /etc/resolv.conf: search example.com
# → hostname -f จะได้ web-prod-01.example.com

# ตรวจสอบ FQDN
hostname -f
python3 -c "import socket; print(socket.getfqdn())"

# ตรวจสอบ Domain
hostname -d

เปลี่ยน Hostname บน Cloud VPS

บน Cloud VPS ที่ใช้ Cloud-init Hostname อาจถูก Reset กลับเป็นค่าเดิมหลัง Reboot หรือ Cloud-init Run ต้องปิดการ Manage Hostname โดย Cloud-init ก่อน

# ตรวจสอบว่า Cloud-init จัดการ Hostname หรือไม่
cat /etc/cloud/cloud.cfg | grep manage_etc_hosts
cat /etc/cloud/cloud.cfg | grep preserve_hostname

# ปิด Cloud-init ไม่ให้ Reset Hostname
# วิธีที่ 1: แก้ไข /etc/cloud/cloud.cfg
sudo sed -i 's/manage_etc_hosts: true/manage_etc_hosts: false/' /etc/cloud/cloud.cfg

# วิธีที่ 2: สร้าง Drop-in Config
sudo tee /etc/cloud/cloud.cfg.d/99-hostname.cfg <<'EOF'
preserve_hostname: true
manage_etc_hosts: false
EOF

# วิธีที่ 3: ตั้ง Hostname ใน Cloud-init User Data (ตอน Provision)
# #cloud-config
# hostname: web-prod-01
# fqdn: web-prod-01.example.com
# manage_etc_hosts: true

# หลังตั้งค่า ให้ตั้ง Hostname อีกครั้ง
sudo hostnamectl set-hostname web-prod-01
# แล้ว Reboot เพื่อตรวจสอบว่า Hostname คงอยู่

Script เปลี่ยน Hostname อัตโนมัติ

#!/bin/bash
# /usr/local/bin/set-hostname.sh
# ตั้งค่า Hostname และอัพเดต /etc/hosts อัตโนมัติ

NEW_HOSTNAME="${1}"
DOMAIN="${2:-internal.example.com}"

if [ -z "$NEW_HOSTNAME" ]; then
    echo "Usage: $0 <hostname> [domain]"
    echo "Example: $0 web-prod-01 example.com"
    exit 1
fi

FQDN="${NEW_HOSTNAME}.${DOMAIN}"
OLD_HOSTNAME=$(hostname)

echo "เปลี่ยน Hostname: ${OLD_HOSTNAME} → ${NEW_HOSTNAME}"
echo "FQDN: ${FQDN}"

# ตั้ง Static Hostname
sudo hostnamectl set-hostname "${NEW_HOSTNAME}"

# อัพเดต /etc/hostname
echo "${NEW_HOSTNAME}" | sudo tee /etc/hostname

# อัพเดต /etc/hosts
# ลบบรรทัด 127.0.1.1 เดิม แล้วเพิ่มใหม่
sudo sed -i '/^127\.0\.1\.1/d' /etc/hosts
echo "127.0.1.1   ${FQDN}  ${NEW_HOSTNAME}" | sudo tee -a /etc/hosts

# ปิด Cloud-init preserve_hostname (ถ้ามี)
if [ -f /etc/cloud/cloud.cfg ]; then
    sudo sed -i 's/preserve_hostname: false/preserve_hostname: true/' /etc/cloud/cloud.cfg
    if ! grep -q "preserve_hostname" /etc/cloud/cloud.cfg; then
        echo "preserve_hostname: true" | sudo tee -a /etc/cloud/cloud.cfg
    fi
fi

echo ""
echo "✅ ผลลัพธ์:"
echo "   Hostname: $(hostname)"
echo "   FQDN: $(hostname -f)"
echo ""
echo "⚠️  กรุณา Reboot เพื่อให้ทุก Service รับรู้ Hostname ใหม่"

สรุป

การตั้งค่า Hostname บน Linux ทำได้ผ่าน hostnamectl set-hostname ที่อัพเดตทั้ง /etc/hostname และ Kernel Hostname พร้อมกัน ต้องอัพเดต /etc/hosts ให้มีบรรทัด 127.0.1.1 FQDN short-hostname ด้วยเสมอ เพื่อป้องกัน Application ที่ต้องการ Resolve Hostname ล้มเหลว สำหรับรูปแบบการตั้งชื่อให้ใช้ตัวอักษรพิมพ์เล็ก, ตัวเลข, และ hyphen เท่านั้น ตามรูปแบบ role-environment-number เช่น web-prod-01 บน Cloud VPS ที่มี Cloud-init ต้องตั้งค่า preserve_hostname: true ด้วย

แนะนำบริการ DE

การตั้งค่า Hostname และ FQDN บน Server ต้องการสิทธิ์ Root Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบ สามารถตั้งชื่อ Server ได้อย่างอิสระ กำหนด FQDN สำหรับ Mail Server หรือ Web Application และรองรับการตั้งค่า Cloud-init เพื่อ Provision Server หลายเครื่องพร้อมกัน

หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Hostname และ DNS เอง Cloud Hosting ของ DE จัดการ Server Configuration ทั้งหมดให้อัตโนมัติ รองรับการผูก Domain และตั้งค่า DNS ผ่าน Control Panel ได้ทันที