Saat Senkronizasyonu Sorunları: NTP ve Chrony ile Zaman Yönetimi

Zamanlamanın kritik önemi olan bir ortamda çalışıyorsanız, saat senkronizasyonu sorunları sizi ciddi şekilde sıkıştırabilir. Log dosyalarında tutarsız zaman damgaları, Kerberos kimlik doğrulama hataları, SSL sertifika sorunları veya veritabanı replikasyon çakışmaları… Bunların hepsi çoğunlukla tek bir kaynağa işaret eder: NTP düzgün çalışmıyor. Bu yazıda hem NTP hem de modern sistemlerde daha yaygın kullanılan chrony’yi ele alacağız, gerçek dünya sorunlarını nasıl teşhis edip çözeceğinizi adım adım inceleyeceğiz.

NTP ve Chrony Nedir, Neden Önemlidir?

NTP (Network Time Protocol), ağ üzerindeki sistemlerin saatlerini senkronize etmek için kullanılan protokoldür. ntpd, bu protokolün klasik Unix/Linux implementasyonudur ve onlarca yıldır kullanılmaktadır. Ancak modern Linux dağıtımlarının büyük çoğunluğu artık chrony‘ye geçmiş durumda. RHEL 7+, CentOS 7+, Fedora, Ubuntu 18.04+ gibi sistemlerde chrony varsayılan NTP istemcisi olarak geliyor.

Chrony’nin ntpd’ye göre önemli avantajları var:

  • Hızlı senkronizasyon: Sistem yeni başlatıldığında veya ağ bağlantısı kesilip geri geldiğinde çok daha hızlı senkronize olur
  • Aralıklı bağlantı desteği: Dizüstü bilgisayarlar gibi uyku moduna giren sistemlerde daha iyi çalışır
  • Sanal makine dostu: Hypervisor’un zaman ayarlamalarına karşı daha dirençlidir
  • Daha az kaynak tüketimi: ntpd’ye kıyasla daha hafif bir yapıya sahiptir

Bununla birlikte, eski sistemleri yönetiyorsanız veya bazı kurumsal ortamlarda ntpd ile de karşılaşabilirsiniz. Bu yüzden ikisini de bilmek gerekiyor.

Teşhis: Mevcut Durumu Anlamak

Bir sorunla karşılaştığınızda önce mevcut durumu net olarak anlamanız gerekir. Hangi servis çalışıyor, saat ne kadar sapıyor, sunucularla bağlantı kurulabiliyor mu?

Chrony ile Durum Kontrolü

Chrony kullanan bir sistemde ilk bakacağınız yer chronyc komutudur:

# Genel izleme durumu
chronyc tracking

# NTP kaynaklarını listele
chronyc sources -v

# Kaynak istatistiklerini göster
chronyc sourcestats -v

chronyc tracking çıktısını şöyle yorumlayın:

Reference ID    : CA760151 (ntp1.example.com)
Stratum         : 3
Ref time (UTC)  : Mon Jan 15 10:23:45 2024
System time     : 0.000123456 seconds slow of NTP time
Last offset     : -0.000098765 seconds
RMS offset      : 0.000156789 seconds
Frequency       : 12.345 ppm slow
Residual freq   : -0.021 ppm
Skew            : 0.456 ppm
Root delay      : 0.012345678 seconds
Root dispersion : 0.000234567 seconds
Update interval : 64.3 seconds
Leap status     : Normal

Burada dikkat etmeniz gereken alanlar:

  • System time: Mevcut sapma miktarı. 0’a ne kadar yakınsa o kadar iyi
  • Stratum: Referans saatten kaç atlama uzakta olduğunuz. 1 en iyi, 15’e kadar gidebilir
  • Leap status: “Normal” olmalı. “Not synchronized” görüyorsanız sorun var demektir

NTP ile Durum Kontrolü

Eski bir sistemde hala ntpd kullanılıyorsa:

# NTP sunucu durumunu kontrol et
ntpq -p

# Detaylı sistem bilgisi
ntpq -c sysinfo

# NTP eşlerini kontrol et
ntpstat

ntpq -p çıktısında satır başındaki semboller önemlidir:

  • * : Şu an kullanılan birincil kaynak
  • + : Kullanılabilir ve iyi durumdaki kaynaklar
  • : Kullanımdan çıkarılmış kaynaklar
  • x : Sahte saat olarak işaretlenmiş kaynaklar
  • boşluk : Henüz değerlendirilmemiş kaynaklar

Eğer hiçbir satırda * yoksa, sistem senkronize değil demektir.

Yaygın Sorunlar ve Çözümleri

Sorun 1: Servis Başlamıyor veya Çalışmıyor

Sisteminizde saat senkronizasyonu çalışmıyorsa ilk yapacağınız şey servis durumunu kontrol etmektir:

# Chrony servis durumu
systemctl status chronyd

# Servis loglarını görüntüle
journalctl -u chronyd -n 50 --no-pager

# Servis başlatma
systemctl start chronyd
systemctl enable chronyd

Sık karşılaştığım bir senaryo: Sistem kurulurken hem chronyd hem de systemd-timesyncd aktif bırakılmış. Bu ikisi birbirleriyle çakışır. Kontrol edin:

# Çakışan servisleri kontrol et
systemctl status systemd-timesyncd
timedatectl status

Eğer systemd-timesyncd çalışıyorsa ve siz chrony kullanmak istiyorsanız:

systemctl disable systemd-timesyncd
systemctl stop systemd-timesyncd
systemctl start chronyd

Sorun 2: NTP Sunucularına Bağlanamıyor

Sık karşılaşılan bir durum: Chrony çalışıyor ama senkronize olamıyor. İlk yapmanız gereken bağlantıyı test etmek:

# NTP sunucusuna UDP 123 portundan erişim testi
nc -zuv pool.ntp.org 123

# Alternatif: ntpdate ile tek seferlik test (ntpdate yüklüyse)
ntpdate -q pool.ntp.org

# Chrony ile manuel test
chronyc ntpdata 162.159.200.1

Eğer bağlantı problemi varsa, firewall kurallarını kontrol edin:

# iptables ile kontrol
iptables -L OUTPUT -n | grep 123
iptables -L INPUT -n | grep 123

# firewalld ile kontrol
firewall-cmd --list-all

# NTP için firewalld kuralı ekle
firewall-cmd --permanent --add-service=ntp
firewall-cmd --reload

Kurumsal ortamlarda çok sık görülen bir durum: Dış NTP sunucularına erişim güvenlik duvarıyla engellenmiş ama iç NTP sunucusu da tanımlı değil. Böyle bir durumda /etc/chrony.conf dosyasını düzenleyip şirket içi NTP sunucusunu eklemeniz gerekir:

# /etc/chrony.conf düzenle
vim /etc/chrony.conf

Dosya içeriği şuna benzemelidir:

# Şirket içi NTP sunucuları
server ntp1.internal.company.com iburst prefer
server ntp2.internal.company.com iburst

# Fallback olarak public NTP (erişim varsa)
# server 0.pool.ntp.org iburst

# Drift dosyası
driftfile /var/lib/chrony/drift

# Log ayarları
logdir /var/log/chrony

# Yerel saat kaynağı (diğer sunucular bağlanamadığında)
local stratum 10

# İzin verilen istemci aralıkları (bu sunucu da NTP sunucusuysa)
# allow 192.168.1.0/24

Değişiklikten sonra servisi yeniden başlatın:

systemctl restart chronyd

Sorun 3: Büyük Saat Sapması

Chrony varsayılan olarak büyük saat sapmalarını (genellikle 1000 saniyenin üzeri) otomatik düzeltmez. Bu güvenlik açısından önemlidir, ama bazen sorun yaratır. Bir VM’yi yedekten geri getirdiniz veya uzun süre kapalı kalan bir sunucuyu açtınız, saat farkı çok büyük…

Önce mevcut farkı görmek için:

# Sistem saati ile NTP zamanı arasındaki farkı göster
chronyc tracking | grep "System time"

# Veya date komutu ile manuel kontrol
date
timedatectl

Büyük bir sapma varsa, chrony’yi zorla senkronize ettirebilirsiniz:

# Chrony'yi zorla senkronize et (servisi durdurmadan)
chronyc makestep

# Veya tek seferlik büyük adım izni ver
chronyc -a makestep 1.0 3

Eğer bu çalışmazsa, servisi geçici olarak durdurip ntpdate veya chronyd -q ile senkronize edebilirsiniz:

# Servisi durdur
systemctl stop chronyd

# Tek seferlik senkronizasyon
chronyd -q 'server ntp1.example.com iburst'

# Servisi yeniden başlat
systemctl start chronyd

Chrony yapılandırmasında büyük sapmaları otomatik düzeltmek için makestep direktifini ekleyebilirsiniz:

# /etc/chrony.conf dosyasına ekle
# İlk 3 seferinde 1 saniyeden büyük sapmaları anında düzelt
makestep 1.0 3

Sorun 4: Saat Geri Gidiyor (Backward Jump)

Bu, özellikle Kerberos veya TLS kullanan sistemlerde kritik bir sorundur. Saatin geri atlaması, kimlik doğrulama tokenlarının geçersiz sayılmasına ve servis kesintilerine yol açabilir.

Chrony, saati normal şartlarda geri atmak yerine “slew” (yavaş düzeltme) yöntemiyle yavaşlatarak ilerler. Ama bazen bunu görmek zordur. Log dosyalarını kontrol edin:

# Chrony loglarında saat adımlarını ara
grep -i "step|jump|backward" /var/log/chrony/tracking.log

# Sistem loglarını kontrol et
journalctl -u chronyd --since "1 hour ago" | grep -i "step|adjust|offset"

Saatin geri gitmesini önlemek için chrony yapılandırmasında maxdistance ve maxdrift değerlerini ayarlayabilirsiniz. Ayrıca rtcsync direktifi ile donanım saatini de senkronize etmek önemlidir:

# /etc/chrony.conf içinde
rtcsync
maxdistance 1.5

Sorun 5: Sanal Makine Saat Sorunları

Sanal makinelerde saat senkronizasyonu özellikle sinir bozucu olabilir. Hypervisor’un kendi zaman düzeltmeleri ile NTP çakışabilir.

VMware ortamında, VMware Tools’un kendi saat senkronizasyonu chrony ile çakışabilir. Kontrol edin:

# VMware Tools saat senkronizasyonu durumu (VMware ortamında)
vmware-toolsd --cmd "vmx.set_option synctime 0 0"

# veya /etc/vmware-tools/tools.conf dosyasını düzenle
cat /etc/vmware-tools/tools.conf

/etc/vmware-tools/tools.conf dosyasına şunu ekleyin:

[vmtools]
disable-timesync = true

KVM/libvirt ortamında da benzer durum geçerli. kvm-clock ve chrony’nin birlikte çalışmasında sorun yaşıyorsanız:

# KVM clock durumunu kontrol et
cat /sys/devices/system/clocksource/clocksource0/current_clocksource

# Chrony'nin slew oranını artır (VM'ler için önerilen)
# /etc/chrony.conf dosyasına ekle:
# maxslewrate 1000

Timezone (Saat Dilimi) Sorunları

NTP senkronizasyonu doğru olsa bile yanlış saat dilimi ciddi sorunlara yol açabilir. Log dosyalarındaki zaman damgaları tutarsız görünüyorsa, saat dilimi de kontrol listenizdedir.

# Mevcut saat dilimini kontrol et
timedatectl

# Mevcut timezone'u görüntüle
cat /etc/timezone
ls -la /etc/localtime

# Kullanılabilir saat dilimlerini listele
timedatectl list-timezones | grep Istanbul

# Saat dilimini değiştir
timedatectl set-timezone Europe/Istanbul

# Kontrol et
date

Dikkat: Bazı uygulamalar saat dilimi değişikliğini algılamak için yeniden başlatılması gerekebilir. Özellikle Java tabanlı uygulamalar JVM başlangıcındaki timezone bilgisini cache’ler.

Hardware Clock (Donanım Saati) Sorunları

Sistem saati doğru olsa bile donanım saati (RTC – Real Time Clock) yanlışsa, her yeniden başlatmada sorunlarla karşılaşabilirsiniz.

# Donanım saatini görüntüle
hwclock --show
hwclock -r

# Sistem saatini donanım saatine yaz
hwclock --systohc

# Donanım saatini sistem saatine oku
hwclock --hctosys

# RTC'nin UTC mi yoksa lokal zamanda mı tutulduğunu kontrol et
timedatectl | grep "RTC in local TZ"

Önemli not: Linux sistemlerde RTC’nin UTC’de tutulması en iyi pratiktir. Eğer Windows ile dual-boot yapıyorsanız bu konuda dikkatli olun; Windows varsayılan olarak RTC’yi lokal zamanda tutar.

# RTC'yi UTC moduna al
timedatectl set-local-rtc 0

Gerçek Dünya Senaryosu: Kubernetes Cluster’ında Saat Senkronizasyonu

Kubernetes ortamında çalışıyorsanız, tüm node’ların saatinin senkronize olması kritiktir. Etcd, sertifika doğrulama ve log korelasyonu doğrudan buna bağlıdır.

Tüm node’ların saat durumunu hızlıca kontrol etmek için:

# Tüm node'larda chrony durumunu kontrol et (ansible ile)
ansible all -m command -a "chronyc tracking" -b

# Node'lar arasındaki saat farkını hesapla
for node in node1 node2 node3; do
  echo "=== $node ==="
  ssh $node "date +%s%N && chronyc tracking | grep 'System time'"
done

Eğer node’lar arasında büyük fark varsa ve etcd sorun çıkarıyorsa:

# Etcd lider seçim loglarını kontrol et
journalctl -u etcd --since "30 minutes ago" | grep -i "time|clock|timeout"

# Tüm node'larda aynı anda chrony'yi yeniden başlat
ansible all -m systemd -a "name=chronyd state=restarted" -b

Monitoring ve Alerting

Saat senkronizasyonu sorunlarını proaktif olarak izlemek için basit bir script hazırlayabilirsiniz:

#!/bin/bash
# /usr/local/bin/check_ntp_sync.sh

THRESHOLD=0.1  # 100ms eşik değeri (saniye cinsinden)
LOG_FILE="/var/log/ntp_check.log"

# Chrony offset değerini al
OFFSET=$(chronyc tracking | grep "System time" | awk '{print $4}')
OFFSET_ABS=$(echo $OFFSET | tr -d '-')

# Sayısal karşılaştırma için bc kullan
IS_PROBLEM=$(echo "$OFFSET_ABS > $THRESHOLD" | bc -l)

if [ "$IS_PROBLEM" -eq 1 ]; then
    echo "$(date): UYARI - NTP sapması yuksek: ${OFFSET} saniye" | tee -a $LOG_FILE
    # Mail veya alert gönder
    # mail -s "NTP Sync Problem: $(hostname)" [email protected] < /dev/null
    exit 1
else
    echo "$(date): NTP senkronizasyonu normal: ${OFFSET} saniye" >> $LOG_FILE
    exit 0
fi

Bu scripti cron ile düzenli çalıştırabilirsiniz:

# /etc/cron.d/ntp-check dosyası
*/5 * * * * root /usr/local/bin/check_ntp_sync.sh

Chrony Log Analizi

Chrony, zaman içinde oluşan sapmaları ve düzeltmeleri kaydeder. Bu logları analiz etmek, sorunun kaynağını anlamada çok yardımcı olur:

# Chrony log dizinini kontrol et
ls -la /var/log/chrony/

# Tracking logunu oku
tail -f /var/log/chrony/tracking.log

# Son 24 saatteki sapmaları filtrele
awk '{print $1, $2, $6}' /var/log/chrony/tracking.log | tail -100

# Statistics logunu kontrol et
cat /var/log/chrony/statistics.log

Chrony log kaydını aktif etmek için /etc/chrony.conf dosyasına şu satırları ekleyin:

logdir /var/log/chrony
log tracking measurements statistics

Hızlı Teşhis Referansı

Bir sorunla karşılaştığınızda şu sırayı takip edin:

  • Adım 1: timedatectl ile genel durumu kontrol edin
  • Adım 2: chronyc tracking veya ntpq -p ile senkronizasyon durumunu görün
  • Adım 3: systemctl status chronyd ile servis durumunu kontrol edin
  • Adım 4: journalctl -u chronyd -n 100 ile son log girişlerine bakın
  • Adım 5: nc -zuv 123 ile network bağlantısını test edin
  • Adım 6: /etc/chrony.conf dosyasındaki sunucu tanımlarını doğrulayın
  • Adım 7: chronyc sources -v ile kaynak durumlarını detaylı inceleyin

Sonuç

Saat senkronizasyonu sorunları genellikle sessiz sedasız gelir ama etkisi son derece geniş kapsamlı olabilir. SSL hatalarından Kerberos sorunlarına, log analizinden veritabanı replikasyonuna kadar pek çok kritik süreç zamanın doğru olmasına bağlıdır.

Chrony, modern Linux sistemlerinde ntpd’nin yerini almış ve çoğu senaryoda daha iyi bir tercih olarak öne çıkmıştır. Bununla birlikte, temel prensipleri anlamak her iki araçla da verimli çalışmanızı sağlar.

En önemli pratik tavsiyem: NTP izlemeyi altyapı monitoring sistemlerinizin standart bir parçası haline getirin. Bir sorun oluşana kadar beklemek yerine proaktif izleme ve alerting kurarsanız, gece yarısı kriz çözme yerine sabah sakin bir kafayla problemi ele alırsınız. Zaman yönetimi, hem sistem yönetiminde hem de günlük hayatta her şeydir.

Benzer Konular

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir