Sau bài này bạn làm được: đặt timezone đúng ý nghĩa nghiệp vụ vs UTC; hiểu chrony tracking offset và slew vs step; cấu hình journald không nuốt ổ; viết/vận hành rule logrotate an toàn (copytruncate vs copy); liên hệ clock skew với chứng chỉ TLS và log correlation.
UTC trên server, local TZ chỉ khi cần hiển thị
Best practice: OS clock ở UTC; app log có thể annotate local TZ nếu cần. Điều này giảm “bài toán mùa hè” khi so sánh log giữa region.
timedatectl
timedatectl list-timezones | grep -i ho
sudo timedatectl set-timezone UTC
chrony: đồng bộ NTP hiện đại
chronyc tracking
chronyc sources -v
Step vs slew: nếu offset quá lớn, chrony có thể nhảy thời gian — gây log timestamp nhảy và TTL kỳ lạ. Phòng datacenter thường theo dõi stratum và reachability NTP.
VM / container: clock thường lấy từ host — guest “chỉnh giờ tay” có thể gây conflict; ưu tiên sync từ hypervisor/doc.
TLS và log correlation phụ thuộc đồng hồ
Chứng chỉ notBefore/notAfter so với clock sai → lỗi “cert not yet valid” hoặc “expired” oan. Khi debug TLS, luôn kiểm tra date -u trên cả client và server.
journald: Storage= và giới hạn dung lượng
/etc/systemd/journald.conf:
[Journal]
Storage=persistent
SystemMaxUse=500M
MaxRetentionSec=2week
Volatile storage: Storage=volatile — reboot mất log, nhưng cứu disk nhỏ.
journalctl --disk-usage
sudo journalctl --vacuum-size=200M
logrotate: copy vs copytruncate vs create
| Directive | Hành vi | Rủi ro |
|---|---|---|
create + postrotate signal | app reopen file mới | cần app hỗ trợ signal |
copytruncate | copy rồi truncate file cũ | race mất log ngắn; fd vẫn trỏ inode cũ |
rename + signal | atomic rename | phổ biến cho nginx/apache đúng cấu hình |
Ví dụ snippet minh hoạ (đừng copy mù):
/var/log/myapp/*.log {
weekly
rotate 12
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
/bin/kill -USR1 `cat /var/run/myapp.pid` 2>/dev/null || true
endscript
}
rsyslog / syslog-ng — khi log cần ship đi xa
journald có thể forward tới syslog; từ đó ship tới Loki/Elastic. Kiến trúc cụ thể tùy observability — ở đây chỉ nhấn: một dòng log nên có request id từ app để correlate.
log2timeline mindset (rất ngắn)
Khi incident: thu thập mtime của file cấu hình, journal range, auth.log — timeline giúp trả lời “ai đổi gì lúc nào”.
Liên hệ bài trước / sau
Câu hỏi hay gặp
1. “systemd-timesyncd vs chrony?”
Tuỳ distro default; quan trọng là một nguồn truth và monitoring offset.
2. “Logrotate chạy lúc nào?”/etc/cron.daily/logrotate hoặc timer — kiểm tra distro; đừng giả định nửa đêm.
3. “Journal mất sau reboot dù đã persistent?”
Filesystem read-only hoặc /var/log/journal không tạo được — journalctl sẽ bái.
Bài tiếp theo trong loạt
→ Phần 12: Sao lưu, phục hồi và playbook incident — đóng loạt bằng checklist thực chiến.