====== HowTo Reduce System Clock Drift ====== The DNS-323 (like most computer devices) has two clocks - the "hardware clock" that runs all the time, and the "system clock" that runs only while the computer is on. To measure and reduce the system clock drift you will need: * [[telnet]] access to your DNS-323 * a ''busybox'' binary with the [[http://www.linuxcommand.org/man_pages/adjtimex8.html|adjtimex]] function defined (from [[http://home.sconk.se:8080/dns323/dns-323.rar|here]] or [[http://www.inreto.de/dns323|here]]) //The D-Link provided /bin/busybox (FW v1.02b) does **NOT** have adjtimex defined// * internet access to a [[http://www.ntp.org|NTP]] time server (or a time server on your local network) //Note: The release notes for firmware v1.04 claim to have "Fixed clock drift issue".// ===== Measure the clock drift ===== To measure the default clock drift, you can set up a cron job to run the following script ''log_time.sh'' to record the NTP calendar time at one hour intervals. This script uses [[http://www.pool.ntp.org/|pool.ntp.org]] to get accurate calendar time. #!/bin/sh # FILE: log_time.sh LOG=/mnt/HD_a2/log_time.log NTPSERVER=pool.ntp.org # look for zombie sntp processes PID=$(/bin/pidof sntp) # kill zombie sntp process if [ -n "$PID" ] ; then /bin/kill -9 $PID fi # log NTP time /usr/sbin/sntp $NTPSERVER >> $LOG Create this script and place it on the DNS-323 hard drive, i.e. ''/mnt/HD_a2''. Don't forget to make it executable with: # chmod a+x log_time.sh [[Telnet]] to the DNS-323 and create a new cron job with the command # /bin/crontab -e and add the following line to the crontab (using [[wp>vi]] commands) 0 * * * * /mnt/HD_a2/log_time.sh Let the cron job run for several hours, then examine the log. Find the difference in time between two successive entries. Each entry in the log is recorded when the DNS-323 system clock determines that 60 minutes of system time has passed. From the following log: ''22:59:43.663 (line 2) - 21:59:58.687 (line 1) = 00:59:44.976'', this means 59 minutes and 44.976 seconds of NTP calendar time has passed but the DNS-323 computed 60 minutes has passed... the DNS-323 system clock is drifting just over 15 seconds fast, each hour. /mnt/HD_a2/log_time.log... 2007 Feb 22 21:59:58.687 + 13.589 +/- 0.240 secs 2007 Feb 22 22:59:43.663 + 27.586 +/- 0.133 secs 2007 Feb 22 23:59:31.404 + 41.601 +/- 0.272 secs ===== Fix the clock drift ===== To fix the clock drift you need a ''busybox'' binary with the ''adjtimex'' function defined. In this example the ''busybox3'' binary is located in the ''/mnt/HD_a2/lnx_bin'' directory. The ''adjtimex'' function, with the ''-t ticks'' option, allows the root user to set the number of clock "//ticks//" in a day. To fix the clock drift you need to compute the number of clock "//ticks//" that your DNS-323 will need for 24 hours of calendar time. The Linux kernel, used by the DNS-323, is supposed to have 10000 clock "//ticks//" per day (someone else may be better able to explain this?), so each clock "//tick//" is equal to 8.64 seconds of calendar time per day. In my example, the DNS-323 will run 360 seconds (15 seconds per hour ∗ 24 hours) fast each day. 360 seconds is equal to 41.667 "//ticks//" (360 seconds ÷ 8.64 seconds per "//tick//") Subtracting 41 clock "//ticks//" from the standard number (10000) of "//ticks//" in a day, ( 10000 - 41 = 9959) give the number of clock "//ticks//" in a day for this DNS-323. I can [[telnet]] to the DNS-323 and issue the following command to fix the clock drift... # /mnt/HD_a2/lnx_bin/busybox3 adjtimex -t 9959 After setting the new "//tick//" value, let the cron job run for several more hours and review the log file. You may have to adjust the "//tick//" value further. I settled on 9960, which keeps my DNS_323 system clock accurate within one tick (8.64 seconds) per day (<1 second drift per hour). There is an additional option ''-f frequency'' for the ''adjtimex'' function, (see man page [[http://www.linuxcommand.org/man_pages/adjtimex8.html|here]]), which allows you to further tune the clock drift in finer increments than one "//tick//" (8.64 seconds per day). When you find the correct "//tick//" value for you system, place the ''adjtimex'' command in your [[fun_plug]] script so the correct clock "//ticks//" are set each time you restart your system. Then remove the cron job with the ''crontab -e'' command.