Khi vận hành một cụm máy chủ, hệ thống database cluster hay đơn giản là dàn máy trạm kế toán trong công ty, chỉ cần một máy lệch vài giây là log bị xáo trộn, chứng chỉ TLS/SSL báo lỗi hết hạn hoặc các giao dịch xác thực Active Directory/Kerberos lập tức lăn đùng ra chết. Thay vì để hàng chục thiết bị cùng kết nối ra ngoài Internet để lấy giờ, việc dựng một máy chủ NTP cục bộ là giải pháp tối ưu băng thông và bảo mật hơn rất nhiều.
Mình dùng Fedora làm máy development chính đã 2 năm và khá hài lòng với tốc độ cập nhật package, ngay cả trên bản Fedora Server thì Chrony luôn được chọn làm dịch vụ NTP mặc định thay thế cho ntpd cũ kỹ nhờ tốc độ đồng bộ cực nhanh và tài nguyên tiêu tốn rất nhẹ.
Quick start: Dựng NTP Server với Chrony trong 5 phút
Nếu bạn cần triển khai ngay cho lab hoặc hệ thống nội bộ, các bước thực hiện rất gọn gàng:
Bước 1: Kiểm tra và kích hoạt chronyd
Fedora Server đã cài sẵn package chrony. Bạn chỉ cần kiểm tra trạng thái dịch vụ:
systemctl status chronyd
# Nếu chưa chạy, bật và cho khởi động cùng hệ điều hành:
sudo systemctl enable --now chronyd
Bước 2: Cho phép mạng LAN đồng bộ thời gian
Mặc định Chrony chỉ chạy như một client lấy giờ từ bên ngoài về cho chính nó. Để biến nó thành NTP Server cho các máy khác, mở file cấu hình:
sudo nano /etc/chrony.conf
Tìm và bỏ comment (hoặc thêm vào cuối file) dải mạng nội bộ của bạn bằng chỉ thị allow:
# Cho phép subnet LAN 192.168.1.0/24 truy vấn giờ
allow 192.168.1.0/24
# Giữ server hoạt động ngay cả khi rớt mạng Internet
local stratum 10
Bước 3: Khởi động lại dịch vụ và mở Firewall
Fedora kích hoạt firewalld theo mặc định. Giao thức NTP chạy trên cổng UDP 123, do đó bạn cần mở cổng:
sudo systemctl restart chronyd
sudo firewall-cmd --add-service=ntp --permanent
sudo firewall-cmd --reload
Bước 4: Kiểm tra nhanh từ máy client
Trên một máy Linux khác trong cùng mạng LAN, cài đặt gói công cụ và thử query tới IP máy Fedora Server (ví dụ IP là 192.168.1.10):
chronyc -h 192.168.1.10 tracking
Nếu thấy thông số Reference ID và Stratum trả về chi tiết, NTP Server của bạn đã sẵn sàng phục vụ.
Giải thích chi tiết file cấu hình chrony.conf
Tệp /etc/chrony.conf trên Fedora có khá nhiều thông số. Dưới đây là các chỉ thị cốt lõi bạn cần nắm vững để tùy biến theo nhu cầu:
1. Nguồn máy chủ upstream (pool/server)
pool 2.fedora.pool.ntp.org iburst
- pool: Khai báo cụm máy chủ NTP công cộng. Nếu hạ tầng của bạn đặt tại Việt Nam hoặc châu Á, nên đổi sang các pool gần hơn để giảm độ trễ (latency):
server 0.asia.pool.ntp.org iburst
server 1.asia.pool.ntp.org iburst
server time.google.com iburst
Tham số iburst (initial burst) gửi 4 đến 8 gói tin dồn dập ngay khi khởi động để tính toán độ trôi xung nhịp và lấy mốc giờ chính xác chỉ sau vài giây.
2. Tham số makestep
makestep 1.0 3
NTP nguyên bản thường chỉ kéo giãn hoặc nén nhịp đồng hồ từng chút một (slew) để tránh làm nhảy cóc timestamp của database. Tuy nhiên, nếu lệch quá 1 giây, việc nắn giờ từ từ sẽ mất nhiều giờ. Chỉ thị makestep 1.0 3 cho phép Chrony nhảy cóc giờ ngay lập tức nếu độ lệch lớn hơn 1.0 giây trong 3 lần cập nhật đầu tiên sau khi khởi động.
3. Tham số driftfile
driftfile /var/lib/chrony/drift
Chrony sẽ ghi lại tốc độ chạy nhanh hay chậm của thạch anh phần cứng máy chủ vào file này. Nhờ đó, nếu máy khởi động lại hoặc tạm thời mất mạng, Chrony vẫn bù trừ sai số rất sát với thực tế.
Nâng cao: Đảm bảo giờ chuẩn khi đứt cáp Internet và phân cấp Stratum
Thiết lập Local Stratum dự phòng
Khi toàn bộ đường truyền Internet quốc tế gặp sự cố, server không liên lạc được với upstream NTP bên ngoài. Nếu không có cấu hình dự phòng, Chrony sẽ ngừng trả lời các truy vấn từ client, khiến toàn bộ máy trạm nội bộ bị mất mốc tham chiếu.
Khai báo sau sẽ giải quyết vấn đề:
local stratum 10
Dòng này bảo Chrony: “Nếu mất kết nối với các nguồn chuẩn bên ngoài, hãy tự tin dùng đồng hồ phần cứng của chính mình để cấp phát giờ cho mạng LAN với cấp bậc Stratum 10”. Mức Stratum 10 đủ thấp để khi Internet thông suốt trở lại, Chrony sẽ tự động hạ cờ này và chuyển sang nguồn thời gian chuẩn xác hơn (Stratum 1, 2) mà không gây gián đoạn.
Theo dõi và debug hiệu năng với chronyc
Lệnh chronyc là công cụ tương tác dòng lệnh đắc lực. Bạn nên lưu lại 2 lệnh sau để chẩn đoán sự cố:
# Xem danh sách nguồn thời gian và độ trôi
chronyc sources -v
# Xem thống kê chi tiết sai số thời gian
chronyc sourcestats -v
Ý nghĩa các ký hiệu quan trọng trong cột M (Mode) của output chronyc sources:
^*: Nguồn thời gian hiện tại đang được chọn để đồng bộ.^+: Nguồn dự phòng tốt, sẵn sàng thay thế nếu nguồn chính có vấn đề.^?: Không thể kết nối hoặc nguồn bị loại trừ do độ lệch quá cao.
Tips thực tế khi vận hành Chrony trong hệ thống nội bộ
Tip 1: Tắt đồng bộ giờ của Hypervisor khi chạy Fedora trong máy ảo
Nếu Fedora Server chạy trên VMware ESXi, Proxmox hoặc KVM, các công cụ như VMware Tools hay QEMU Guest Agent thường xuyên can thiệp đồng bộ giờ với máy chủ vật lý. Điều này dẫn đến hiện tượng “giằng co” (clock fight): Chrony cố nắn giờ theo chuẩn NTP Internet, còn Guest Agent lại cưỡng ép giờ theo Host.
Nên tắt tính năng time sync trong Guest Agent hoặc chỉ giữ một nguồn tham chiếu duy nhất:
# Với VMware Tools chạy trên Linux, tắt đồng bộ giờ:
vmware-toolbox-cmd timesync disable
Tip 2: Cách fix nhanh khi Client không chịu nhận giờ từ Fedora Server
Nếu phía client báo timeout hoặc không thể sync, hãy kiểm tra theo trình tự 3 điểm nghẽn phổ biến:
- Chưa nạp rule Firewall: Chạy
sudo firewall-cmd --list-servicestrên Fedora Server xem đã có mụcntpchưa. - Dải IP subnet chưa khai báo: Kiểm tra lại subnet mask trong dòng
allow. Nếu mạng của bạn là10.0.0.0/8hoặc chia VLAN192.168.10.0/24, bắt buộc phải khai báo chính xác subnet đó vào/etc/chrony.conf. - SELinux chặn file/port tùy biến: Mặc định Fedora chạy SELinux chế độ Enforcing. Nếu bạn đổi cổng NTP hoặc chuyển thư mục log/drift sang phân vùng khác, cần cập nhật context cho SELinux bằng lệnh
semanage fcontext.
Tip 3: Script một dòng kiểm tra độ lệch giờ hàng loạt máy client
Sau khi dựng xong NTP Server, bạn có thể chạy script ngắn qua SSH để rà soát toàn bộ server nội bộ xem đã bám sát giờ của máy chủ Fedora hay chưa:
for ip in 192.168.1.{20..30}; do
echo "=== Checking $ip ==="
ssh -o ConnectTimeout=2 user@$ip "chronyc tracking | grep 'System time'"
done
Mức lệch tối ưu giữa các node trong mạng nội bộ chỉ nên dao động dưới 0.0005 giây (nửa mili-giây). Với Chrony trên Fedora, việc đạt được độ chính xác này là điều hoàn toàn trong tầm tay mà không đòi hỏi phần cứng chuyên dụng.

