| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| comfilepi:set_date_and_time [2026/03/20 06:51] – mfranklin | comfilepi:set_date_and_time [2026/04/05 23:54] (current) – [System Clock Compensation] mfranklin |
|---|
| |
| NOTE: Modern Linux has a built-in safety feature that checks system's date and time is prior to the date and time that the operating system was built, and if so, uses the build date and time instead of the set date and time. So, if manually setting the date and time for testing, be sure to use a date and time after the operating system's build date and time. | NOTE: Modern Linux has a built-in safety feature that checks system's date and time is prior to the date and time that the operating system was built, and if so, uses the build date and time instead of the set date and time. So, if manually setting the date and time for testing, be sure to use a date and time after the operating system's build date and time. |
| | |
| | ===== Drift Compensation ===== |
| | |
| | There are two clocks that have the potential to drift: The RTC and the operating system's system clock. Both will drift independently, so the Linux operating system provides utilities to configure compensation for both. |
| | |
| | ==== RTC Drift Compensation ==== |
| | |
| | If you notice the RTC drifting over time, and the drift is consistent and predictable, it is possible to configure the OS to compensate for the drift using the following procedure: |
| | |
| | - With Internet time synchronization disabled, but with an Internet connection, run <html><code>sudo ntpdate pool.ntp.org</code></html> to manually synchronize the system time to an Internet time server. |
| | - Run <html><code>sudo hwclock --systohc --utc --update-drift</code></html> to synchronize the RTC with the system time, and to ensure the ''/etc/adjtime'' records the last calibration time. |
| | - Power off the panel PC for a few days; the longer the better. |
| | - Boot the panel PC |
| | - Run <html><code>sudo ntpdate pool.ntp.org</code></html> to manually synchronize the system time to an Internet time server. |
| | - Run <html><code>sudo hwclock --systohc --utc --update-drift</code></html> to synchronize the RTC with the system time, and to record the drift compensation, as measured over the idle time period, to the ''/etc/adjtime'' file. |
| | |
| | That procedure will update the [[https://manpages.debian.org/trixie/util-linux/adjtime_config.5.en.html|/etc/adjtime]] file with a drift compensation measurement determined from the above procedure. |
| | |
| | Finally, to ensure the system time is updated from the RTC, with drift compensation, create the following udev rule file at ///etc/udev/rules.d/85-hwclock.rules//: |
| | |
| | <code> |
| | ACTION=="add", SUBSYSTEM=="rtc", KERNEL=="rtc0", TAG+="systemd", ENV{SYSTEMD_WANTS}+="hwclock.service" |
| | </code> |
| | |
| | And create the following service at ///etc/systemd/system/hwclock.service//: |
| | |
| | <code> |
| | [Unit] |
| | Description=Set system clock from RTC with adjtime compensation |
| | ConditionPathExists=/dev/rtc0 |
| | ConditionPathExists=/etc/adjtime |
| | |
| | [Service] |
| | Type=oneshot |
| | ExecCondition=/bin/sh -ec 'timedatectl show --property=NTP 2>/dev/null | grep -qx "NTP=no"' |
| | ExecStart=/sbin/hwclock --rtc=/dev/rtc0 --hctosys |
| | </code> |
| | |
| | Reboot, and after booting, the ComfilePi should have its system time synchronized with the RTC, and adjusted to compensate for the RTC's drift. Confirm with the ''date'' command. |
| | |
| | ==== System Clock Compensation ==== |
| | |
| | After configuring the RTC's drift compensation, the system clock's drift compensation can be configured. For that we need [[https://manpages.debian.org/trixie/adjtimex/adjtimexconfig.8.en.html|adjtimexconfig]]. |
| | |
| | Run the following commands in a terminal. |
| | <code> |
| | sudo apt update |
| | sudo apt install adjtimex |
| | sudo adjtimexconfig |
| | sudo systemctl enable adjtimex.service |
| | </code> |
| | |
| | The ''adjustimexconfig'' command will measure the amount of drift the system clock has relative to the RTC, save it to ///etc/default/adjtimex// and the //adjtimex.service// will load that at every boot to compensate. |
| |
| [[comfilepi:index|ComfilePi - Industrial Raspberry Pi Panel PC]] | [[comfilepi:index|ComfilePi - Industrial Raspberry Pi Panel PC]] |