Identify Your NTP Daemon
First, determine which NTP daemon your system uses:
root@server:~# systemctl list-units --type=service | grep -E "ntp|chrony|time"
chronyd.service loaded active running NTP client/server
systemd-timesyncd.service loaded active running Network Time Synchronization
| Daemon | Config File | Query Command |
| ntpd (classic) |
/etc/ntp.conf |
ntpq -p |
| chronyd |
/etc/chrony/chrony.conf or /etc/chrony.conf |
chronyc sources |
| systemd-timesyncd |
/etc/systemd/timesyncd.conf |
timedatectl timesync-status |
| W32Time (Windows) |
Registry / GPO |
w32tm /query /status |
Daemon Not Starting
Symptom: Service fails to start or immediately stops
The NTP service won't start, or starts and immediately crashes.
Check Service Status
root@server:~# systemctl status chronyd
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
Active: failed (Result: exit-code) since...
root@server:~# journalctl -xeu chronyd --no-pager | tail -50
Common Causes & Solutions
Cause 1: Configuration Syntax Error
root@server:~# chronyd -p
root@server:~# ntpd -n -d -c /etc/ntp.conf
Cause 2: Port 123 Already in Use
root@server:~# ss -ulnp | grep 123
UNCONN 0 0 *:123 *:* users:(("ntpd",pid=1234,fd=16))
root@server:~# systemctl stop ntpd
root@server:~# systemctl start chronyd
Cause 3: Permission Issues
root@server:~# ls -la /var/lib/chrony/drift
root@server:~# chown chrony:chrony /var/lib/chrony/drift
root@server:~# chown ntp:ntp /var/lib/ntp/drift
Cause 4: Multiple NTP Services Conflicting
root@server:~# systemctl disable --now systemd-timesyncd
root@server:~# systemctl disable --now ntpd
root@server:~# systemctl enable --now chronyd
Stratum 16 / No Sync Source
Symptom: System shows stratum 16 or "unsynchronised"
Stratum 16 means the NTP daemon has no valid time source. This is the "invalid/unknown" stratum level.
root@server:~# ntpq -c rv
...stratum=16, precision=-23...
root@server:~# chronyc tracking
Reference ID : 00000000 ()
Stratum : 0
...
Leap status : Not synchronised
Solutions
Check NTP Server Configuration
root@server:~# grep -E "^server|^pool" /etc/chrony/chrony.conf
pool 2.debian.pool.ntp.org iburst
server ntp.rdem-systems.com iburst prefer
Test Server Connectivity
root@server:~# chronyc sources -v
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? ntp.rdem-systems.com 0 6 0 - +0ns[ +0ns] +/- 0ns
Force Initial Sync
root@server:~# chronyc makestep
root@server:~# systemctl stop ntpd
root@server:~# ntpdate -b pool.ntp.org
root@server:~# systemctl start ntpd
Stuck in .INIT State
Symptom: NTP shows .INIT for all servers
The refid column shows ".INIT." indicating the daemon hasn't completed initial synchronization.
root@server:~# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
0.pool.ntp.org .INIT. 16 p - 64 0 0.000 0.000 0.000
Common Causes
- System time too far off (>1000 seconds default panic threshold)
- Network issues preventing NTP queries
- DNS resolution failing
- Firewall blocking responses
Solution: Check DNS Resolution
root@server:~# host pool.ntp.org
pool.ntp.org has address 162.159.200.1
pool.ntp.org has address 162.159.200.123
root@server:~# echo "server 195.154.XXX.XXX iburst" >> /etc/ntp.conf
Solution: Fix Large Time Offset
root@server:~# ntpdate -q pool.ntp.org
server 162.159.200.1, stratum 3, offset -3600.123456...
root@server:~# systemctl stop ntpd
root@server:~# ntpdate -b pool.ntp.org
root@server:~# systemctl start ntpd
Wait Time
Initial synchronization can take 5-15 minutes depending on network conditions and polling intervals. Check the "reach" value - it should increase from 0 to 377 over time as queries succeed.
False Ticker Detection
Symptom: Server marked with 'x' (falseticker)
NTP has determined this server's time differs significantly from the majority of sources.
root@server:~# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
xntp1.example.com .GPS. 1 u 45 64 377 12.543 -250.284 1.023
*ntp2.example.com .PPS. 1 u 42 64 377 28.123 0.842 2.156
Understanding False Tickers
NTP uses a voting algorithm. If one server disagrees with the majority by more than a threshold, it's marked as a "false ticker" (x) and excluded from time calculations.
Solution 1: Add More Servers
With only 2 servers, NTP can't determine which is correct. Use at least 4 servers:
server ntp.rdem-systems.com iburst prefer
pool 0.pool.ntp.org iburst maxsources 2
pool 1.pool.ntp.org iburst maxsources 2
Solution 2: Verify Server Accuracy
root@server:~# ntpdate -q ntp1.example.com
root@server:~# ntpdate -q ntp2.example.com
Solution 3: Check GPS/PPS Source
If a GPS receiver is marked false ticker, check:
- GPS antenna signal strength
- Number of satellites locked (need 4+)
- PPS signal cable and configuration
Reach Value is 0
Symptom: Reach column shows 0 for all servers
No successful NTP queries have been received. The daemon cannot communicate with any server.
root@server:~# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
pool.ntp.org .POOL. 16 p - 64 0 0.000 0.000 0.000
Understanding Reach
Reach is an 8-bit octal register showing the last 8 query results. 377 (octal) = 11111111 (binary) = all 8 queries succeeded. 0 = no successful queries.
Diagnostic Steps
root@server:~# tcpdump -i any port 123 -c 10
root@server:~# iptables -L -n | grep 123
root@server:~# ntpdate -d pool.ntp.org 2>&1 | head -30
root@server:~# traceroute -U -p 123 pool.ntp.org
Common Fixes
- Open firewall:
ufw allow 123/udp
- Check DNS works:
host pool.ntp.org
- Use IP instead of hostname in config
- Restart daemon:
systemctl restart chronyd
- Wait - reach increases every poll interval
Chrony-Specific Issues
chronyc "506 Cannot talk to daemon"
Symptom: chronyc commands fail with connection error
Solution
root@server:~# systemctl status chronyd
root@server:~# grep cmdport /etc/chrony/chrony.conf
"makestep" Doesn't Work
Check makestep configuration
makestep 1 3 # Step if offset > 1s, first 3 updates
makestep 1 -1 # Step if offset > 1s, unlimited times
Slow Initial Sync
Speed up initial synchronization
server ntp.rdem-systems.com iburst
initstepslew 10 ntp.rdem-systems.com pool.ntp.org
Windows W32Time Issues
"The computer did not resync because no time data was available"
Solution
C:\> net stop w32time
C:\> w32tm /unregister
C:\> w32tm /register
C:\> net start w32time
C:\> w32tm /config /manualpeerlist:"pool-ntp.rdem-systems.com,0x8" /syncfromflags:manual /update
C:\> w32tm /resync /force
Domain Controller Time Issues
Configure PDC Emulator
C:\> w32tm /config /manualpeerlist:"pool-ntp.rdem-systems.com" /syncfromflags:manual /reliable:yes /update
C:\> net stop w32time && net start w32time
C:\> w32tm /resync
Hyper-V Time Sync Conflicts
Virtual Machine Warning
Hyper-V VMs have time sync integration services that can conflict with W32Time. Disable VM time sync if using external NTP:
PS C:\> Disable-VMIntegrationService -VMName "YourVM" -Name "Time Synchronization"
KVM / Proxmox VE Time Sync
Proxmox VE Virtual Machines
KVM guests on Proxmox VE can experience significant clock drift if NTP is not properly configured inside the VM. The paravirtualized clock (kvm-clock) helps, but a dedicated NTP client remains essential for production workloads.
root@vm:~# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
kvm-clock
root@vm:~# cat /etc/chrony/chrony.conf
server ntp1.rdem-systems.fr iburst
server ntp2.rdem-systems.fr iburst
makestep 1 3
rtcsync
root@vm:~# systemctl restart chronyd && chronyc tracking
Complete guide: Hosting a public NTP server on a Proxmox VM →