시스템 시간과 RTC를 다음 값으로 설정했습니다.
date -s 2021.08.30-09:59:30 >/dev/null 2>/dev/null //set system time
hwclock -w //sync RTC to system time
또한 /etc/TZ( 의 /etc/localtime과 동일한 파일 busybox
)는 다음과 같이 저장됩니다.
LMT0:00LMT-1:00,M5.5.1/10,M8.5.1/10
일광 절약 시간제는 5월 마지막 월요일 오전 10시에 적용되고 8월 마지막 월요일 오전 10시에 종료됩니다.
시스템 동작을 관찰하기 위해 의도적으로 시스템 시간과 RTC를 DST 종료 날짜 30초 전으로 설정했습니다.
DST가 끝나면 시스템 시간(또는 RTC?)이 1시간씩 감소해야 합니다.
결과는 다음과 같습니다. 시스템 시간과 RTC가 둘 다 감소한 것이 아니라 시스템 시간만 1시간 감소한 것은 분명합니다.
~ # cat /etc/TZ
LMT0:00LMT-1:00,M5.5.1/10,M8.5.1/10
~ # date -s 2021.08.30-09:59:30 >/dev/null 2>/dev/null
~ # hwclock -w
~ #
~ # date
Mon Aug 30 09:59:36 LMT 2021
~ # hwclock
Mon Aug 30 09:59:42 2021 0.000000 seconds
~ #
~ #
~ # date
Mon Aug 30 09:59:49 LMT 2021
~ # hwclock
Mon Aug 30 09:59:53 2021 0.000000 seconds
~ # date
Mon Aug 30 09:00:00 LMT 2021
~ # hwclock
Mon Aug 30 10:00:03 2021 0.000000 seconds
~ # date
Mon Aug 30 09:00:05 LMT 2021
~ # hwclock
Mon Aug 30 10:00:06 2021 0.000000 seconds
그러나 반면에 다르게 동작합니다! 이번에는 일광 절약 시간제 진입 시 시스템 동작을 관찰하고 싶었습니다.
/etc/TZ는 다음과 같이 저장됩니다.
LMT0:00LMT-1:00,M8.5.1/10,M12.5.1/10
일광 절약 시간제는 8월 마지막 월요일 오전 10시에 적용되고 12월 마지막 월요일 오전 10시에 종료됩니다.
또한 시스템 시간과 RTC를 다음 값으로 설정했습니다.
date -s 2021.08.30-09:59:30 >/dev/null 2>/dev/null //set system time
hwclock -w //sync RTC to system time
DST가 적용되면 시스템 시간(또는 RTC?)을 한 시간 먼저 추가해야 합니다.
결과는 다음과 같습니다. 시스템 시간과 RTC가 1시간 증가한 것이 분명합니다.
~ # cat /etc/TZ
LMT0:00LMT-1:00,M8.5.1/10,M12.5.1/10
~ # date -s 2021.08.30-09:59:30 >/dev/null 2>/dev/null
~ # hwclock -w
~ #
~ # date
Mon Aug 30 09:59:35 LMT 2021
~ # hwclock
Mon Aug 30 09:59:37 2021 0.000000 seconds
~ # date
Mon Aug 30 09:59:48 LMT 2021
~ # hwclock
Mon Aug 30 09:59:51 2021 0.000000 seconds
~ # date
Mon Aug 30 11:00:04 LMT 2021
~ # hwclock
Mon Aug 30 11:00:06 2021 0.000000 seconds
왜 이런 모순된 동작이 발생하는지 궁금합니다.
답변1
hwclock
레지스터에 있는 하드웨어 시계의 정확한 값이 무엇이라고 생각하시나요 ?
그렇게는 되지 않습니다.
입증하다:
# date; hwclock; TZ=UTC hwclock; grep rtc_time /proc/driver/rtc
Wed 1 Sep 18:33:18 EEST 2021
2021-09-01 18:33:18.870798+03:00
2021-09-01 15:33:18.981738+00:00
rtc_time : 15:33:20
hwclock
및 의 출력이 어떻게 나타나는지 확인하세요 TZ=UTC hwclock
.
hwclock
하드웨어 시계의 값을 표시합니다.필요에 따라 현재 시간대로 변환합니다(DST 오프셋 및 시간대 포함).. 원시 값을 보려면 다음을 사용해야 합니다 cat /proc/driver/rtc
. 시스템이 클래식 PC CMOS 시계 드라이버, UEFI 시계 인터페이스 또는 기타 실시간 시계 드라이버를 사용하는지 여부에 따라 이 드라이버는 time_t
( 또는 time64_t
) 및 시계 설정 프로세스로 돌아갑니다.
nor 옵션은 하드웨어 시계를 가져오거나 설정할 때도 사용되지 않으므로 --utc
하드웨어 시계의 로컬/UTC 상태는 파일의 세 번째 줄(있는 경우)에 의해 결정됩니다 --local
./etc/adjtime
첫 번째 테스트에서는 DST가 적용될 때 하드웨어 시계를 설정하므로 UTC 오프셋은 -1(UTC=로컬-1시간)입니다. 하드웨어 시계가 현지 시간을 사용하도록 설정된 경우 예상대로 09:59:30으로 설정됩니다.
그러나 하드웨어 시계가 UTC를 사용하도록 설정된 경우 시계 레지스터에 설정된 실제 값은 다음과 같습니다.08:59:30. DST 전환 전 시계를 보면 이 오프셋이 자동으로 검색되므로 hwclock
예상되는 09:59:**를 볼 수 있습니다.
DST 전환이 발생하면 하드웨어 시계가 현지 시간으로 설정된 경우 시계 레지스터는 10:00:00 값으로 증가합니다. 현재는 현지 시간이고 DST 오프셋이 0이므로 hwclock
10:00:00으로 표시됩니다.
그러나 하드웨어 시계가 UTC 시간으로 설정되면 이제 시계 레지스터의 값은 09:00:00이 됩니다. 이제 DST 변환 후 UTC 오프셋이 0이 되므로 hwclock
09:00:00으로도 표시됩니다.
운영 체제 시계는 항상 내부적으로 UTC로 실행되고 시간대 + DST 규칙에 따라 현지 시간으로 변환되므로 예상대로 09:00:00(DST 아님)으로 표시됩니다.
hwclock
여기서 얻은 결과는 10:00:00이므로 파일의 세 번째 줄에 가 표시 /etc/adjtime
되어야 하는 것 같습니다 LOCAL
.
두 번째 테스트에서는 DST가 비활성화될 때 시계를 설정하므로 총 UTC 오프셋은 0이 됩니다. 이제 UTC를 사용하도록 설정하든 현지 시간을 사용하든 시계 레지스터는 09:59:30으로 설정됩니다. 이전 테스트를 통해 현지 시간으로 설정되어 있음을 알고 있습니다.
DST 전환 시간이 도래하면 하드웨어 시계 레지스터는 10:00:00...을 읽게 되며 레지스터 값은 현재 시간대에 따라 형식화되어 표시되므로 문제가 있습니다. 유효한 시간대 규칙에 따르면오늘 현지시간 10:00:00에는 존재하지 않습니다!
DST 변환으로 인해 이 특정 날짜에는 현지 시간 10:00:00 값을 나타낼 수 있는 UTC 타임스탬프 값이 없습니다. 09:59:59 UTC는 현지 시간 09:59:59이지만 10:00입니다. : 00 UTC는 현지 시간 11:00:00입니다. 시간 값 glibc
이 시간대 변환 및 서식 지정 루틴을 거치면 존재하지 않는 10:00:00이 11:00:00으로 푸시됩니다.
따라서 DST를 표준 시간으로 변환한 후 처음 1시간 동안 하드웨어 시계를 쿼리하면,hwclock
시간을 잘못 알려줄 수도 있다시계 레지스터의 실제 값은 유효한 현지 시간 값으로 표시될 수 없기 때문입니다. 이는 단지 표시 아티팩트일 뿐입니다. /proc/driver/rtc
이 마법 같은 순간에도 올바른 값이 계속 표시되어야 합니다.
이는 하드웨어 시계를 현지 시간으로 설정하면 발생할 수 있는 모든 예상치 못한 문제의 좋은 예입니다.
링크로 마무리하겠습니다Tom Scott의 컴퓨터 타이밍에 관한 10분짜리 YouTube 동영상은 매우 적용 가능합니다.나는 당신이 결론을 높이 평가할 것이라고 생각합니다.