Tóm tắt nhanh

Các hệ thống Linux hiện đại dùng systemd hỗ trợ ba loại hostname:

  • Pretty Hostname – tên thân thiện với con người, dùng để hiển thị.
  • Static Hostname – hostname cố định, lưu trên đĩa.
  • Transient Hostname – hostname tạm thời, chỉ tồn tại trong bộ nhớ khi chạy.

Mỗi loại phục vụ một mục đích riêng và có thứ tự ưu tiên xác định. Hiểu rõ sự khác biệt giúp bạn chọn đúng hostname cho từng trường hợp và tránh nhầm lẫn khi xác định hệ thống, phân giải tên, ghi log và cấu hình mạng.

Hostname trong Linux là gì?

Hostname là định danh mạng của máy tính. Nói đơn giản, hostname là tên mà hệ thống Linux dùng để tự nhận diện.

Khi gõ lệnh hostname trong terminal, bạn thấy tên mà hệ thống đang dùng ngay lúc đó.

Hostname xuất hiện ở:

  • Dấu nhắc shell
  • Nhật ký (logs)
  • Dịch vụ mạng
  • Kết nối từ xa

Các hệ thống Linux cũ chỉ có một hostname. Systemd giới thiệu nhiều loại hostname để xử lý đúng cách cho laptop, DHCP, container và đám mây.

Hành vi này chỉ áp dụng cho hệ thống dùng systemd.

Hiểu sự khác biệt giúp tránh nhầm lẫn khi hostname thay đổi bất ngờ hoặc không giữ lại sau khi khởi động lại.

Các bản phân phối trước systemd (RHEL 6, Debian 7, Fedora 14 và sớm hơn) lưu static hostname ở:

  • Debian/Ubuntu: /etc/hostname
  • RHEL/CentOS 6: /etc/sysconfig/network
  • Slackware: /etc/HOSTNAME

Ba loại hostname

Static Hostname

Đây là định danh cố định của hệ thống.

Nó nằm trong tệp /etc/hostname. Khi hệ thống khởi động, nó đọc tệp này và đặt hostname từ đó.

Thay đổi static hostname tồn tại qua các lần khởi động lại. Đây là hostname bạn đặt khi cài Debian/Ubuntu hoặc cấu hình máy chủ mới.

Transient Hostname

Đây là hostname hiện tại của kernel.

Nó chỉ tồn tại trong bộ nhớ. Kernel dùng tên này cho mọi hoạt động mạng thực tế ngay lúc đó.

Khi khởi động, transient hostname sao chép từ static hostname. Nhưng các chương trình như DHCP client hoặc trình quản lý mạng có thể thay đổi nó trong khi chạy.

Khi bạn khởi động lại, transient hostname được đặt lại để khớp với static hostname.

Pretty Hostname

Đây là mô tả thân thiện với con người.

Nó có thể chứa khoảng trắng, ký tự đặc biệt và UTF-8. Nó nằm trong /etc/machine-info và đóng vai trò siêu dữ liệu.

Hầu hết các công cụ bỏ qua nó. Bạn hiếm khi cần thay đổi nó.

Temporary và Transient có giống nhau không?

Trên các hệ thống Linux dùng systemd, transient hostname là thuật ngữ chính thức cho hostname chỉ lưu trong bộ nhớ và không được lưu vào /etc/hostname. Nó thường được đặt lại sau khi khởi động lại.

Thuật ngữ temporary hostname không phải thuật ngữ chính thức của systemd. Mọi người thường dùng nó một cách không chính thức để mô tả hostname không tồn tại qua các lần khởi động lại. Trong thực tế, khi tài liệu hoặc hướng dẫn đề cập đến temporary hostname, chúng thường có nghĩa là transient hostname.

Do đó, mặc dù các thuật ngữ không hoàn toàn giống nhau về mặt kỹ thuật, chúng thường chỉ cùng một hành vi: thay đổi hostname không tồn tại sau khi khởi động lại.

Transient và Static khác nhau thế nào?

Static hostname là cấu hình của bạn. Transient hostname là trạng thái hiện tại của bạn.

Hãy nghĩ static là "những gì bạn muốn" và transient là "những gì bạn đang có ngay bây giờ".

Máy chủ DHCP, VPN và container orchestrator thường thay đổi transient hostname một cách động. Chúng để static hostname của bạn không bị ảnh hưởng.

Sự tách biệt này cho phép hệ thống của bạn thích ứng với các mạng khác nhau mà không mất đi định danh.

Điểm chính: Transient hostname mới thực sự quan trọng cho các hoạt động mạng. Các chương trình phân giải tên, gửi gói tin và ghi log sử dụng transient hostname.

Tổng quan ba loại hostname Linux

Điều này quan trọng khi bạn thiết lập máy chủ, khắc phục sự cố mạng hoặc quản lý môi trường động nơi hostname thay đổi.

Cách kiểm tra hostname hiện tại

1. Dùng hostnamectl (khuyến nghị)

hostnamectl

Lệnh này hiển thị tất cả các loại hostname cùng với thông tin hệ thống:

Static hostname: Ubuntu2604
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: c315a5ec7511408d8c2f9bf97f5adeaf
Boot ID: 02d8a23f494e44508d1c6ca1079849d8
Virtualization: kvm
Operating System: Ubuntu 26.04 LTS
Kernel: Linux 7.0.0-22-generic
Architecture: x86-64
Hardware Vendor: QEMU
Hardware Model: Standard PC _Q35 + ICH9, 2009_
Hardware Version: pc-q35-9.2
Firmware Version: rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org
Firmware Date: Tue 2014-04-01
Firmware Age: 12y 2month 1w 3d

Lưu ý rằng lệnh hostnamectl không hiển thị dòng transient hostname trừ khi nó khác với static.

Để xem chỉ static hostname:

hostnamectl --static

2. Dùng lệnh hostname

hostname

Lệnh này chỉ hiển thị transient hostname hiện tại (kernel đang dùng).

3. Kiểm tra tệp static hostname

cat /etc/hostname

Lệnh này hiển thị hostname được nạp khi khởi động.

4. Kiểm tra những gì chương trình thấy

uname -n

Lệnh này trả về transient hostname mà ứng dụng sử dụng, giống với lệnh hostname.

Cách thay đổi hostname Linux (từng bước)

1. Chỉ đặt transient hostname

Transient hostname chủ yếu dành cho các hệ thống không có static hostname được cấu hình. Ví dụ:

  • Máy chủ DHCP cung cấp hostname
  • Cloud-init gán hostname
  • Container runtime gán hostname

Nếu static hostname tồn tại, systemd cho rằng đó là lựa chọn có chủ đích của quản trị viên và bỏ qua transient.

Ví dụ, nếu bạn thử đặt transient hostname bằng lệnh sau khi static hostname đã được đặt:

sudo hostnamectl set-hostname webserver01 --transient

Bạn sẽ thấy thông báo:

Hint: static hostname is already set, so the specified transient hostname will not be used.

Điều này có nghĩa:

  1. Hệ thống của bạn đã có static hostname được cấu hình trong /etc/hostname.
  2. systemd ưu tiên static hostname cao hơn transient hostname.
  3. Do đó, mặc dù bạn đặt transient hostname, các ứng dụng và hệ thống sẽ tiếp tục sử dụng static hostname.

Cách kiểm tra transient hostname

Bạn cần xóa static hostname trước:

sudo hostnamectl set-hostname "" --static

hoặc xóa thủ công /etc/hostname (không khuyến nghị trên hệ thống sản xuất).

Sau đó, đặt transient hostname:

sudo hostnamectl set-hostname webserver01 --transient

Kiểm tra kết quả:

hostnamectl status
[or]
hostnamectl

Bạn sẽ thấy:

Transient hostname: webserver01
Static hostname: (unset)
Pretty hostname: Ubuntu2604
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: c315a5ec7511408d8c2f9bf97f5adeaf
Boot ID: 02d8a23f494e44508d1c6ca1079849d8
Virtualization: kvm
Operating System: Ubuntu 26.04 LTS
Kernel: Linux 7.0.0-22-generic
Architecture: x86-64
Hardware Vendor: QEMU
Hardware Model: Standard PC _Q35 + ICH9, 2009_
Hardware Version: pc-q35-9.2
Firmware Version: rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org
Firmware Date: Tue 2014-04-01
Firmware Age: 12y 2month 1w 3d

Như bạn thấy trong đầu ra trên, transient hostname là webserver01, static hostname trống (chưa đặt) và pretty hostname là Ubuntu2604.

Kernel hiện dùng webserver01 cho mọi thứ. Nhưng sau khi khởi động lại, nó quay về Ubuntu2604 hoặc static hostname gốc bạn đã đặt khi cài đặt.

2. Đặt static hostname

sudo hostnamectl set-hostname production-db --static

Lệnh này ghi vào /etc/hostname:

cat /etc/hostname

Bạn sẽ thấy đầu ra: production-db

Sau khi khởi động lại, cả static và transient đều là production-db. Bạn có thể xác minh bằng các lệnh sau:

hostnamectl --static
hostnamectl --transient

Pretty hostname (nếu đã đặt) vẫn không thay đổi.

3. Đặt cả hai cùng lúc

sudo hostnamectl set-hostname my-server

Không có cờ nào, lệnh này đặt cả static và transient thành cùng một giá trị.

Đây là điều bạn muốn trong hầu hết các trường hợp.

4. Cách cũ (không khuyến nghị, chỉ để tham khảo)

sudo hostname quick-test

Lệnh này thay đổi transient hostname trực tiếp trong kernel.

Nó hoạt động, nhưng systemd không theo dõi thay đổi đúng cách. Dùng hostnamectl để nhất quán.

Các tình huống thực tế

Mạng DHCP

Bạn đặt static hostname của laptop là my-laptop.

Khi kết nối vào mạng công ty, máy chủ DHCP có thể đặt transient hostname thành client-192-168-1-100.

Trong khi kết nối, hệ thống dùng client-192-168-1-100. Khi ngắt kết nối hoặc khởi động lại, nó trở về my-laptop.

Điều này xảy ra tự động. NetworkManager và dhclient xử lý nó.

Môi trường container

Docker và Kubernetes đặt transient hostname dựa trên ID container hoặc tên pod.

Static hostname của máy chủ vẫn không thay đổi. Mỗi container nhận transient hostname riêng khi chạy.

Sự cô lập này ngăn xung đột và đơn giản hóa việc điều phối.

Chế độ bảo trì

Bạn đang làm việc trên máy chủ sản xuất và muốn báo hiệu nó đang được bảo trì.

Đặt transient hostname:

sudo hostnamectl set-hostname MAINTENANCE-DO-NOT-USE --transient

Hostname này xuất hiện trong tất cả nhật ký và dấu nhắc terminal ngay lập tức.

Sau khi bảo trì, khởi động lại. Hostname trở về giá trị static ban đầu.

Không có tệp cấu hình nào bị thay đổi. Không có rủi ro quên đặt lại.

Các vấn đề hostname thường gặp

Vấn đề 1: Hostname không tồn tại sau khi khởi động lại

Triệu chứng: Bạn thay đổi hostname, nhưng nó quay lại sau khi khởi động lại.

Nguyên nhân: Bạn chỉ thay đổi transient hostname.

Khắc phục: Đặt static hostname. Để cập nhật hostname hiện tại ngay lập tức:

# Update both static and transient at once (recommended)
sudo hostnamectl set-hostname your-hostname
# OR update only static (transient will match after reboot)
sudo hostnamectl set-hostname your-hostname --static

Vấn đề 2: Hostname tự động thay đổi

Triệu chứng: Hostname của bạn thay đổi khi kết nối vào các mạng khác nhau.

Nguyên nhân: Máy chủ DHCP đang ghi đè transient hostname của bạn.

Khắc phục cho NetworkManager (phổ biến nhất):

# Set a permanent hostname that DHCP cannot override
sudo nmcli general hostname your-permanent-hostname
sudo systemctl restart NetworkManager

Cách khác (sửa tệp cấu hình):

Sửa /etc/NetworkManager/NetworkManager.conf:

[main]
hostname-mode=none

Sau đó khởi động lại NetworkManager:

sudo systemctl restart NetworkManager

Khắc phục cho dhclient cũ (nếu dùng cấu hình mạng tĩnh không có NetworkManager):

Sửa /etc/dhcp/dhclient.conf và thêm:

supersede host-name "your-permanent-hostname";

Vấn đề 3: hostnamectl hiển thị giá trị khác với lệnh hostname

Triệu chứng: hostnamectl và hostname hiển thị tên khác nhau.

Nguyên nhân: Một thứ gì đó đã thay đổi hostname kernel mà không cập nhật systemd.

Khắc phục: Khởi động lại systemd-hostnamed:

sudo systemctl restart systemd-hostnamed

Hoặc đặt lại hostname bằng hostnamectl.

Vấn đề 4: Hostname không hợp lệ làm hỏng DNS hoặc dịch vụ

Triệu chứng: Dịch vụ lỗi, DNS không phân giải, hoặc chứng chỉ SSL không hoạt động.

Nguyên nhân: Hostname chứa ký tự không hợp lệ.

Quy tắc hostname hợp lệ (RFC 1123):

  • Chỉ chữ thường (a-z), số (0-9) và dấu gạch ngang (-)
  • Phải bắt đầu và kết thúc bằng chữ hoặc số
  • Tối đa 64 ký tự
  • Không có khoảng trắng, dấu gạch dưới hoặc ký tự đặc biệt

Khắc phục: Đặt hostname hợp lệ:

sudo hostnamectl set-hostname valid-hostname-01

Lưu ý: Pretty hostname (thân thiện với con người) không có hạn chế về ký tự. Chúng có thể chứa khoảng trắng, chữ hoa, biểu tượng cảm xúc và ký tự đặc biệt.

4 lệnh Linux để xác minh hostname

Kiểm tra tất cả các loại hostname:

hostnamectl

Xác minh tệp static hostname:

cat /etc/hostname

Kiểm tra kernel nghĩ gì:

hostname

Xem những gì chương trình thấy:

uname -n

Tất cả các lệnh này sẽ hiển thị kết quả nhất quán nếu bạn đã đặt cả static và transient.

Giới hạn và rủi ro

Không có đảm bảo đồng bộ

Nếu một chương trình thay đổi transient hostname trực tiếp qua lệnh hostname, systemd-hostnamed có thể tạm thời ở trạng thái không nhất quán. Tuy nhiên, systemd phát hiện thay đổi hostname kernel khi đọc.

Thực hành tốt nhất: Chỉ dùng hostnamectl cho mọi thay đổi hostname để duy trì tính nhất quán. Nếu gặp sự không nhất quán, khởi động lại dịch vụ:

sudo systemctl restart systemd-hostnamed

DHCP có thể ghi đè cài đặt của bạn

Trên mạng DHCP, transient hostname của bạn có thể thay đổi mà không báo trước. Máy chủ DHCP có thể đẩy tùy chọn hostname ghi đè giá trị transient của bạn.

Nếu tính ổn định của hostname quan trọng, hãy cấu hình NetworkManager hoặc DHCP client của bạn để bỏ qua hostname do máy chủ cung cấp (xem Vấn đề thường gặp #2).

Nhầm lẫn trong container và VM

Bên trong container hoặc VM, hành vi hostname phụ thuộc vào virtualization hoặc container runtime:

  • Docker: Kế thừa hostname của máy chủ trừ khi chỉ định --hostname
  • LXC/LXD: UTS namespace riêng với hostname độc lập
  • Cloud VM: cloud-init thường đặt hostname khi khởi động

Luôn xác minh hostname thực tế bên trong môi trường nơi nó quan trọng:

hostname

Xác thực static hostname

hostnamectl có xác thực static hostname theo tiêu chuẩn RFC 1123. Các ký tự không hợp lệ (khoảng trắng, dấu gạch dưới, ký tự đặc biệt) bị từ chối với lỗi.

Tuy nhiên, lệnh hostname (bỏ qua systemd) và pretty hostname chấp nhận bất kỳ chuỗi nào.

Quy tắc quan trọng cho static hostname:

  • Chỉ chữ thường (a-z), số (0-9) và dấu gạch ngang (-)
  • Phải bắt đầu và kết thúc bằng chữ hoặc số
  • Tối đa 64 ký tự
  • Không có khoảng trắng, dấu gạch dưới (_) hoặc ký tự đặc biệt

Lưu ý: hostnamectl xác thực hostname trước khi áp dụng. Nếu bạn chỉ định hostname chứa ký tự không được hỗ trợ, lệnh có thể tự động xóa hoặc sửa đổi các ký tự đó thay vì hiển thị lỗi. Hành vi chính xác có thể khác nhau giữa các bản phân phối Linux và phiên bản systemd.

Ví dụ, trên hệ thống Ubuntu 26.04 thử nghiệm của chúng tôi, lệnh sau:

sudo hostnamectl set-hostname 'bad_hostname#$!'

tự động xóa các ký tự không được hỗ trợ và đặt hostname thành: badhostname

Vì vậy, như đã nói, hostname Linux chỉ nên chứa chữ cái, số và dấu gạch ngang (-). Để tránh kết quả không mong muốn, hãy chọn hostname tuân theo các quy tắc đặt tên này ngay từ đầu.

Khi nào dùng Transient vs Static

Dùng transient hostname khi:

  • Kiểm tra thay đổi cấu hình tạm thời
  • Chạy trong môi trường DHCP nơi tên thay đổi thường xuyên
  • Báo hiệu trạng thái đặc biệt (bảo trì, thử nghiệm, staging)
  • Bạn muốn linh hoạt trong thời gian chạy mà không thay đổi vĩnh viễn

Dùng static hostname khi:

  • Thiết lập máy chủ sản xuất với định danh cố định
  • Cấu hình dịch vụ phụ thuộc vào hostname nhất quán
  • Quản lý bản ghi DNS trỏ đến máy cụ thể
  • Bạn cần hostname tồn tại qua các lần khởi động lại

Đặt cả hai khi:

  • Triển khai hệ thống mới cần định danh vĩnh viễn
  • Bạn muốn nhất quán ngay lập tức trên toàn bộ hệ thống
  • Thiết lập máy chủ hoặc máy trạm tiêu chuẩn

FAQ: Câu trả lời nhanh cho các câu hỏi thường gặp

H: Thay đổi hostname có cần khởi động lại không?

A: Không. Dùng hostnamectl thay đổi hostname ngay lập tức. Chỉ chỉnh sửa thủ công /etc/hostname mới cần khởi động lại hoặc systemctl restart systemd-hostnamed để có hiệu lực.

H: Có thể dùng chữ hoa trong hostname không?

A: Không cho static hostname. hostnamectl từ chối chữ hoa. Pretty hostname có thể dùng chữ hoa tự do. Luôn dùng chữ thường, số và dấu gạch ngang cho static hostname để tránh vấn đề tương thích dịch vụ.

H: Độ dài hostname tối đa là bao nhiêu?

A: 64 ký tự theo tiêu chuẩn POSIX. Giữ dưới 64 ký tự để tương thích.

H: Thay đổi hostname có làm hỏng kết nối SSH không?

A: Không. Các kết nối SSH hiện tại vẫn hoạt động. Kết nối mới sử dụng hostname mới trong dấu nhắc và nhật ký.

H: Có cần cập nhật /etc/hosts sau khi thay đổi hostname không?

A: Tùy thuộc vào bản phân phối của bạn.

Trên Debian/Ubuntu: Thêm:

127.0.1.1 your-hostname

Fedora/RHEL: Thường không cần.

Hệ thống hiện đại với systemd-resolved hoặc nss-myhostname: Thường không cần.

Kiểm tra /etc/hosts hiện tại của bạn. Nếu bạn thấy mục nhập cho hostname cũ, hãy cập nhật nó. Nếu không, bạn có thể không cần.

Kết luận

Transient và temporary có nghĩa giống nhau trong giao tiếp hàng ngày, nhưng transient là thuật ngữ chính xác của systemd.

Static hostname tồn tại vĩnh viễn. Transient hostname chỉ tồn tại cho đến khi khởi động lại hoặc thay đổi thủ công. Cả hai đều phục vụ mục đích rõ ràng trong các tình huống khác nhau.

Dùng hostnamectl cho mọi thay đổi hostname. Kiểm tra công việc của bạn với hostnamectl để thấy cả ba loại cùng lúc.

Đặt static hostname cho định danh vĩnh viễn. Dùng transient hostname cho trạng thái tạm thời hoặc khi hệ thống bên ngoài quản lý hostname một cách động.

Bạn nên biết loại nào bạn đang thay đổi, khi nào nó tồn tại và khi nào không.

Tài nguyên:

  1. systemd hostname documentation
  2. hostnamectl man page
  3. systemd-hostnamed service
  4. Debian Administrator's Handbook – Network Configuration
  5. RFC 1178: Choosing a Name for Your Computer
  6. RFC 1123: Requirements for Internet Hosts
  7. Arch Linux Wiki: Network configuration
  8. NetworkManager hostname handling
  9. Debian Wiki: Hostname
  10. systemd GitHub repository – hostnamed source code