System time

From Gentoo Wiki
Jump to: navigation, search

The system time backed by the system clock is used in Unix systems to keep track of time. It can be set by a hardware clock or by an external time server.

Preface

Software clock vs Hardware clock

The system clock, provided by the kernel, is implemented as a simple count of the number of ticks that have transpired since the 1 January 1970 00:00:00 UT. This is called Unix time.

The hardware clock (also known as real-time clock or RTC) is typically a component on the mainboard. It runs independent of the state of the operating system all the time, also when the computer is shutdown.

UTC time vs localtime

The time for hardware clock can be modified to represent two standards: localtime or UTC time. The localtime is the real time of the time zone including DST. Preferred is UTC time because the system time gets computed by adding the time zone difference and DST. So daylight saving changes get automatically applied and changing the time zone are possible without changing the hardware clock. Exceptions can be made when using a dual-boot system; this is when the other operating system does not support or is not configured for an UTC hardware clock (by default, Windows uses localtime).

Time zone

In order to keep time properly, select the proper time zone so the system knows where it is located.

OpenRC

Look for the local time zone in /usr/share/zoneinfo. Please avoid the /usr/share/zoneinfo/Etc/GMT* time zones as their names do not indicate the expected zones. For instance, /usr/share/zoneinfo/Etc/GMT-8 is in fact GMT+8. For localtime select the "localtime" time zone.

After zone info has been selected, set the time zone in /etc/timezone, e.g. for Germany:

FILE /etc/timezone
Europe/Berlin

The information in this file is used by sys-libs/timezone-data on each package update to copy the chosen zoneinfo file to /etc/localtime. To setup this file out of order, run:

root #emerge --config timezone-data

systemd

systemd comes with the timedatectl to manage the time zone:

  • To check the current zone:
user $timedatectl
  • To list available zones:
user $timedatectl list-timezones
  • To change the time zone, e.g. for Germany:
root #timedatectl set-timezone Europe/Berlin

LC_TIME

This environment variable defines formatting of dates and times. For more details see The GNU C Library

System clock

Typically the system clock time is set up by the hardware clock on boot. Alternatively it is possible to manually set the system clock or use a network time server.

The date command can be used to manage the system clock time:

  • To check the current software clock time:
user $date
  • To set the system clock, e.g. 12:30, Dec. 17, 2012:
root #date 121712302012

Time server

See the NTP article for information concerning the use of time servers.

systemd

systemd comes with the timedatectl command to manage the system clock time:

  • To check the current software clock time:
user $timedatectl
  • To set the system clock:
root #timedatectl set-time "2012-12-17 12:30:59"

Hardware clock

To have a hardware clock, the following kernel options must be activated:

KERNEL
Device Drivers  --->
        [*] Real Time Clock  --->
        [ ]   Set system time from RTC on startup and resume
        [ ]   Set the RTC time based on NTP synchronization
 
        [*]   /sys/class/rtc/rtcN (sysfs)
        [*]   /proc/driver/rtc (procfs for rtc0)
        [*]   /dev/rtcN (character devices)
 
        <*>   PC-style 'CMOS'

At runtime, to check the current hardware clock time:

root #hwclock --show

To set the hardware clock to the current system clock:

root #hwclock --systohc

Syncing Hardware clock and System time

Typically the hardware clock is used to setup the system clock on boot. This can be done by the kernel itself or by a boot service (init script). Also on shutdown the kernel or a service can write the software clock to the hardware clock. This aids the system in having the correct time on boot.

In-kernel method

On a sufficiently modern kernel (3.9 or newer), Linux can be configured to handle setting the system time automatically. To do so, also the Set system time ... and Set the RTC time ... drivers need to be activated:

KERNEL
Device Drivers  --->
        [*] Real Time Clock  --->
        [*]   Set system time from RTC on startup and resume
        [*]   Set the RTC time based on NTP synchronization
 
        [*]   /sys/class/rtc/rtcN (sysfs)
        [*]   /proc/driver/rtc (procfs for rtc0)
        [*]   /dev/rtcN (character devices)
 
        <*>   PC-style 'CMOS'

OpenRC

Also, the service hwclock can setup the system clock on boot and sync system time to the hardware clock on shutdown. The service is enabled by default and should be disabled in favour of the above mentioned in-kernel method. The hwclock init script should not be run when using the kernel's real time clock.

root #rc-update del hwclock

If however there is a need for using the init script method, set both clock_hctosys and clock_systohc to YES in /etc/conf.d/hwclock. By default the service is configured for UTC time standard. To change to localtime add clock="local".

FILE /etc/conf.d/hwclockAdding hardware clock sync
clock_hctosys="YES" 
clock_systohc="YES"
# clock="local"

Restart the hwclock service and have the hardware clock init script run on system boot:

root #rc-service hwclock restart
root #rc-update add hwclock boot

Systemd

systemd can be used to set the system clock on boot. Use timedatectl to manage the hardware clock:

  • To check the current hardware clock time:
user $timedatectl | grep "RTC time"
  • To set the hardware clock to the current system clock (UTC time standard):
root #timedatectl set-local-rtc 0
  • To set the hardware clock to the current system clock (localtime time standard):
root #timedatectl set-local-rtc 1

See also

  • NTP - Another way to manage system time is through the network time protocol.

External resources