tgoop.com/interface31/4315
Last Update:
Аппаратные часы и системное время
Время – важный параметр современных систем, так как временная метка является одной из переменных в криптографических преобразованиях и отклонение системного времени от точного может привести к различным проблемам.
Но есть и еще один тонкий момент – аппаратные часы – RTC (Real Time Clock), они же часы CMOS / BIOS.
Они отличаются от системных часов, полностью программных, тем, что являются аппаратными и идут даже тогда, когда компьютер выключен. При загрузке система считывает данные аппаратных часов и принимает их за системное время, после чего начинают работать системные часы.
Системные часы мы можем подвести от часов точного времени благодаря протоколу NTP, тем самым обеспечив соответствие системного времени точному. Затем, при выключении (либо можно выполнить эту операцию вручную), система подводит аппаратные часы на материнской плате.
И вот тут возникает ряд тонкостей. Linux считает, что аппаратные часы показывают время UTC (универсальное время, оно же по Гринвичу). Т.е. если в системе мы установили часовой пояс UTC +3 (Москва) и на часах у нас 15:00, то система установит аппаратные часы на 12:00.
Windows же считает что аппаратные часы идут в поясном времени, т.е. если у нас в системе стоит тот же часовой пояс UTC +3 и на часах 15:00, то и в аппаратные часы будет записано такое-же время.
Это вызывало многочисленные приключения при использовании двойной загрузки Linux и Windows на ПК. Но, казалось бы, те времена давно прошли.
Да, сегодня двойная загрузка проходит по разряду экзотики, но на смену ей пришла виртуализация. Многие системы виртуализации поддерживают синхронизацию времени между виртуальной машиной и гипервизором, а службы синхронизации внутри виртуальной машины отключаются, обнаружив себя в виртуалке.
И вот тут начинаются чудеса. Хост отдает виртуалке время как RTC, при этом отдает согласно собственному пониманию. Т.е. хост на Linux отдаст UTC, а хост Windows – поясное время.
В первом случае Linux-гость правильно прибавит к этому значению поясное время и получит правильное значение, а вот Windows будет считать время локальным и будет отставать (или спешить) на разницу между часовым поясом и UTC.
Во втором Windows-гость покажет правильное время, а Linux добавит к нему смещение часового пояса и будет спешить или отставать.
В большинстве случаев это решается в настройках параметров виртуальной машины, но иногда может потребоваться и ручное вмешательство.
Для того чтобы Windows использовал аппаратные часы как UTC выполните:
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
Чтобы переключиться назад просто удалите этот ключ в реестре.
В Linux для переключения на поясное время и обратно используйте:
timedatectl set-local-rtc 1
и
timedatectl set-local-rtc 0
Ну и в любом непонятном случае с часами всегда начинайте с того, в каком режиме идут RTC и в каком режиме его воспринимает система.
BY Записки IT специалиста

Share with your friend now:
tgoop.com/interface31/4315