미쳐 날뛰는 시스템시계... 원인을 찾았습니다.

hayarobi의 이미지

예전에 푸념글을 한 번 쓴 적이 있습니다.

http://kldp.org/node/78250

그 푸념 중 하나가 시스템 시계가 멋대로 변한다는 어제 그 원인을 알아냈습니다. 구글링과 무한 삽질의 결과입니다.. 아하하하...하...ㅜㅜ

저처럼 시간이 timezone의 시간차도 아니고 부팅때마다 이상하게 튀는 분들을 위한 간단 해결방법을 씁니다. gentoo기준이니까 다른 배포판은 잘 모르겠습니다. (사실 문제도 거의 gentoo사용자에게서 나오는 것 같고요)

1. 시스템 시계를 현재 시각으로 맞춘다.
2. /sbin/hwclock --systohc [--utc|--localtime] 명령을 실행한다 (/etc/conf.d/clock 파일의 CLOCK변수값에 UTC를 썼으면 --utc를, local이었으면 --localtime을 쓰세요)
3. /etc/adjtime 파일을 지운다
4. /sbin/hwclock -a [--utc|--localtime] 명령을 실행한다.

이것에 대해 몇 가지 부연 설명을 해 봅니다.
리눅스는 크게 두 개의 시계를 가지고 있다고 보면 됩니다. 하나는 하드웨어 시계(바이오스 시계, CMOS시계라고도 하죠) 이건 메인보드의 내장 타이머에 의해 구동됩니다. 또 다른 하나는 시스템 시계라고 부르는 것이 있습니다. 이것은 커널에서 timer 인터럽트에 의해 구동됩니다. 보통 부팅을 하면 커널은 하드웨어 시간을 가져와서 시간대와 써머타임 등의 설정을 적용해 시스템 시간을 설정합니다. 그 이후는 시스템 시계만을 구동하죠. 하드웨어 시계는 부팅때만 씁니다.

이 하드웨어 시계는 오차가 있습니다. 물론 모든 시계가 오차가 다 있습니다. 리눅스는 똑똑하게도 그 오차를 통계적인 방법으로 조정해 주는 기능이 있습니다. 시계의 오차라는게 들쭉날쭉한 게 아니라 보통 한 쪽 방향으로만 일정하기 때문입니다. (매일 3초 빠르게 움직인다... 식이죠) 이런 오차를 저장하는 파일이 /etc/adjtime입니다. 그리고 /sbin/hwclock프로그램은 하드웨어 시계의 시각을 가져오거나 설정하면서 이 adjtime파일의 값을 참조하거나 새로운 값으로 갱신합니다.

보통은 이게 정상적으로 작동하고 오차도 0초 (요즘 보드들이 좋아져서 오차가 별로 없죠)혹은 며칠동안 1초정도 될 거고, 설령 오차가 좀 된다 해도 부팅때마다 그 오차만큼 잘 조정을 해 줘서 시간에 제대로 설정이 됩니다.

하지만, hwclock가 부팅때와 (CLOCK_SYSTOHC="yes"로 했을경우에 한해) 시스템 종료시에만 한다는 것입니다. 그리고 시간대 참조하는데 버그가 있어 보입니다. /etc/conf.d/clock의 CLOCK값을 바꾸고(utc->local이나 local->utc양쪽 다) 나서 hwclock이 바뀐 것을 제대로 인지하지 못하고 시간 조정을 하니 하드웨어 시계가 9시간만큼 오차가 있는 것으로 간주하고 그만큼의 오차율을 기록한 후 매번 부팅때마다 지 딴에는 오차를 보정하고 있던 것이었습니다.

물론 애초에 오차가 거의 없는 시계였을테니 오랜기간 쓰면서 시간을 다시 조절하고 쓰다보면 내부의 조정기능이 오차를 0에 수렴해 갈 것입니다. 참고로 제가 두어주 시간때문에 삽질하고 /etc/adjtime파일을 발견한 후 봤던 오차값은 하루에 204초였습니다. 그래서 일단 시계는 제대로 조정한 다음 adjtime파일의 오차도 0으로 재설정하는 방식으로 해결했습니다. 파일을 지우고 hwclock -a로 깨끗한 조정파일을 새로 만든 거죠.

더 구체적인 원인 내용과 해결 방법을 쓰고싶긴 하지만 지금 이 정도 글도 충분히 장황하고 이해하기 힘들 것 같아 이만 줄입니다. 더 자세히 알고싶으신 분은 /etc/init.d/clock 스크립트와 man hwclock에서 "The Adjust Function" 부분을 읽어보시면 도움이 될 듯 합니다.

로미의 이미지

슈팅하셨다니 축하 드립니다.

저는 귀찮아서 그냥 부팅할때

/usr/bin/rdate -s time.kriss.re.kr
/sbin/clock -w

를 스크립트에 먹여서 사용합니다.

괜찮은 방법일까요?

==========
Signature:
끝까지 읽어 주셔서 감사합니다.(뭐가 감사한거야!?)

단, 끝까지 읽고 악성댓글, 깎아내리기, 따질려고 댓글 달려고 하는 당신!!
그 덧글 달 생각 마시고 그냥 PASS!! 해 주세요.

Signature:
끝까지 읽어 주셔서 감사합니다.(이봐 로미, 뭐가 감사한거야?!)

혹시 댓글로 싸움을 즐기려는 님!?
당신은 眞性 변퉤 입니다~ :P

이제는 무늬만 백수로 가장한 개발자가 아닌 진정한 개발자가 되어야겠다.
이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

언제나 newbie의 마음가짐.

hayarobi의 이미지

/sbin/clock의 옵션을 보니 제 배포판의 /sbin/hwclock과 같은 기능을 하는 듯 하네요.

저렇게 고쳐도 되고 ntp같은 것 설치해서 시작 스크립트에서 수행할 수도 있을텐데, 왠지 그 방법은 문제를 해결 못 하고 꽁수로 피해가는 느낌이라서 근본적인 해결책을 찾아뒤졌던 거였죠.

=================
잠못자는 한솔아빠

youlsa의 이미지

저는 이것저것 귀찮아서 rdate를 호출하는 스크립을 cron.hourly에 넣어버렸습니다. -_-;

언발에 오줌 자주 누기...
미봉책을 이어서 영원으로...

-_-

=-=-=-=-=-=-=-=-=
http://youlsa.com

=-=-=-=-=-=-=-=-=
http://youlsa.com

zienie의 이미지

예전에 관리하던 서버에 그렇게 넣어줬습니다. lol
##########################################################
넘어지는건 아직 괜찮다.
하지만 넘어질때마다 무언가를 주워서 일어나자.

##########################################################
넘어지는건 아직 괜찮다.
하지만 넘어질때마다 무언가를 주워서 일어나자.

송효진의 이미지

conf.d/clock 에서 sync 하도록 하면,
갑자기 확 바뀔 일은 없습니다.

그 다음 세부 조정은 clockspeed 추천합니다.
emerge clockspeed
echo "clockspeed &" >> /etc/conf.d/local.start
clockspeed&

ntpclockset timeserverip // 요게 시간을 가져오면서 오차를 보정해 줍니다.
가끔 한번씩 실행해 주면 시간서버와의 오차를 보정하여,
한 1주일정도 매일 실행하고, 그다음부터 1주일 한번정도 2달 지나면 거의 잊어도 좋을겁니다.

emerge money

emerge money
http://wiki.kldp.org/wiki.php/FuntooInstallLog - 명령어도 몇 개 안돼요~
http://xenosi.de/

ydhoney의 이미지

64bit 라면 시간 설정에 대한 이슈가 있긴 한데 그 외에는 사실 마땅히 있을 이유는 없어요. 뭐 필요하다면 ntpd 설정하시면 되고 -_-a 
 
====================여기부터 식은어치====================
안녕하세요. 저는 야동 초등학교 2학년 6반 11번입니다!! 제 컴퓨터에 리눅스를 깔아보고 싶습니다. 리눅스라는건 어제 처음 들어 보았습니다.
리눅스에서도 카트라이더는 되겠지요? 설마 안되나요? 안되면 왜 쓰나요? =3=33 리눅스에서는 카트라이더 캐릭터 머리가 너무 커서 못받아들이나요?

doodoo의 이미지

아 ..대단 하십니다....
저도 한때 미쳐 날뛰는 시계땜시 신경이 많이 쓰였었는데...
결국 해결 못했었지요 ㅠㅠ

그때도 우분투...지금도 우분투..근데..지금은 새로 깔아서(64비트로 깔아서?) 이상이
없네요 ^^;

hys545의 이미지

즐린

추춴

즐린