Как программно установить аппаратные часы в Linux?

Linux предоставляет вызов stime(2) для установки системного времени. Однако, хотя это обновит время системы, он не устанавливает аппаратные часы BIOS в соответствии с новым системным временем.

системы Linux обычно синхронизируют аппаратные часы с системным временем при выключении и с периодическими интервалами. Однако, если машина получает циклическое питание до одной из этих автоматических синхронизаций, время будет неправильным при перезапуске машины.

Как вы гарантируете, что аппаратные часы обновляются, когда вы устанавливаете системное время?

5 ответов


проверить РУЦ man-страницы для деталей, но если вы вошли в систему как root, что-то вроде этого:

    struct       rtc_time {
        int         tm_sec;      
        int         tm_min;      
        int         tm_hour;     
        int         tm_mday;     
        int         tm_mon;      
        int         tm_year;     
        int         tm_wday; /* unused */
        int         tm_yday; /* unused */
        int         tm_isdst;/* unused */
    };

struct rtc_time rt;
/* set your values here */
fd = open("/dev/rtc", O_RDONLY);
ioctl(fd, RTC_SET_TIME, &rt);
close(fd);

после вызова stime () сделайте следующее:

system("/sbin/hwclock --systohc");

дополнительные сведения см. На странице руководства hwclock(8).


Я бы начал с чтения исходного кода hwclock.


Я также хотел бы отметить, что аппаратные часы точны только до точки (я видел системы, которые будут терять/получать пару секунд в день).

вы рассматривали возможность настройки демона сетевого времени для синхронизации часов с сервером времени?

по общему признанию, эта синхронизация не происходит до тех пор, пока демон не начнет, поэтому синхронизация ваших аппаратных часов также помогает между питанием и моментом, когда демон синхронизируется со временем сервер.


если текстовый редактор отличается от kubuntu (kate по умолчанию в Редакторе), используйте свой собственный с в терминале.

  1. запустить терминал
  2. скопируйте и вставьте эту команду sudo kate /etc/default/rcS пресс Enter
  3. введите пароль пользователя (ваш пароль для входа) нажмите Enter
  4. текстовый редактор откроется на рабочем столе
  5. изменить строку UTC=yes to UTC=no
  6. и нажать "Сохранить" (вверху панели вкладок текстового редактора)
  7. перезагрузка