리눅스 부팅때 시간 차

출처 : https://kldp.org/node/78688

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

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" 부분을 읽어보시면 도움이 될 듯 합니다.

 

[CentOS & Ubuntu] TimeZone 셋팅 :

출처 : http://idchowto.com/index.php/centos-ubuntu-timezone-%EC%85%8B%ED%8C%85/

­

linux시스템에서는  system clock과 hardware clock 두가지가 있습니다.
system clock은 file 생성, process 실행, 그리고 날자와 시각이 필요한 곳에 쓰이며,
date 명령 혹은 ntpd service를 통해 수동 혹은 자동으로 설정 또는 조회가 가능합니다.
hardware clock은 motherboard의 CMOS 설정과 관련이 있으며, hwclock 명령으로 설정 또는 확인 할 수 있습니다.

아래 내용은 CentOS 와 Ubuntu 시스템에서  hwclock를 이용하여 hardware clock 을 설정하는 방법입니다.

## CentOS 5.x  에서의 TimeZone Setting ##
우선 리눅스(CentOS설치시) TIME ZONE 은 “Asia/Seoul”  기준 입니다..
하지만 셋팅이 완료되고 난 후  date 와 hwclock  을 이용하여 날짜&시간 값을 확인하였을 경우  두개의 값이 서로 다른
경우가 있습니다.

================================================
[root@localhost]# date
Wed Dec 21 16:13:07 EST 2011

[root@localhost]# hwclock
Wed 21 Dec 2011 04:13:49 PM EST  -0.297984 seconds
================================================

이러한 경우는  KVM을 이용한 가상서버를 사용하는 경우, Guest VM (가상서버) 에서도 동일하게 적용됩니다.
또한 이러한 가상서버에서는 시스템의 시간이  현재 시간과의 오차가 발생하게 됩니다.

date값 과 hwclock 값을 동일하게 맞추기 위해서는 다음과 같은 방법을 이용하여 보시면 두개의 시간 값이 동기화
될 것입니다.

우선  
[root@localhost]# cat /etc/sysconfig/clock
ZONE=”Asia/Seoul”
UTC=TRUE     ======>   UTC=false
ARC=false

UTC의 기본값은 TRUE로 사용하는것으로 기본설정이 되어있습니다.
이것을 사용하지 않도록 수정합니다.

* UTC ( Universal Time Code )
  : 1972년 1월 1일부터 시행된 국제 표준시이다. UTC는 국제원자시와 윤초보정을 기반으로 표준화되었습니다.
    UTC는 그리니치 평균시(GMT)로 불리기도 하는데, UTC와 GMT는 초의 소숫점 단위에서만 차이가 나기 때문에
    일상에서는 혼용되어 사용되며, 기술적인 표기에서는 UTC가 사용됩니다.

[root@localhost ~]# cat /etc/adjtime
-131.447378 1389327336 0.000000
1389327336
UTC

[root@localhost ~]# hwclock -w –localtime     ===  운영체제의 시간을 참조하여 하드웨어 시간조정
* /etc/adjtime 의 UTC 값이 LOCAL 로 변경됩니다.

[root@localhost ~]# cat /etc/adjtime
-131.447378 1389328734 0.000000
1389328734
LOCAL

* 위와 같은 절차 진행 후 재부팅 ( reboot )
  단, 가상서버의 경우 GuestVM이 구동되는 HOST 서버의 시간이 Local 시스템의 시간으로 지정되도록
   /etc/adjtime의 UTC 설정을 LOCAL로 적용한 후에 운여되는 GuestVM을 재부팅이 아닌 종료 후 시작을 
  진행하여야 정상적으로 적용됩니다.

==========================================================================

## 우분투 (Ubuntu 12.04) 에서의 TimeZone Setting ##

* 우분투 기본설치후에도 CentOS와 마찬가지로 Timezone 셋팅은 UTC로 맞추어져 있을것입니다.
  그리고 /etc/adjtime 파일이 보이지 않는 상태일 것입니다.

첫번째로, /etc/default/rcS 파일을 열어 UTC설정을 사용않함으로 변경합니다.
[ root@ubuntu:~]# vi /etc/default/rcS
# assume that the BIOS clock is set to UTC time (recommended)
UTC=yes      ====>   “no”  로 변경

두번째로, localtime 설정
[ root@ubuntu:~]# hwclock –systohc –localtime
위의 두 단계를 실행하면 다음과 같이 /etc/adjtime 파일이 자동으로 생성됩니다.

[ root@ubuntu:~]# cat /etc/adjtime
0.000000 1389334049 0.000000
1389334049
LOCAL

* 외와 같이 우분투에서의 Timezoen 설정이 완료되면 시스템을 종료 후 시작 하면 date 값과 hwclock 값이 동기화 되어
  시간오차가 발생하지 않음을 확인할 수 있습니다.

* hwclock

  하드웨어(Rom-bios) 시간을 확인하거나 리눅스와의 시간을 동기화 시킴

  운영체제의 시간을 참조하여 하드웨어 시간조정하기
  [root@localhost ~]# hwclock -w

  하드웨어시간을 참조하여 운영체제 시간조정하기
  [root@localhost ~]# hwclock -s

==========================================================================

하드웨어 클럭 수동으로 변경하기

hwclock --set --date="2015-10-10 22:10:00"

==========================================================================

==========================================================================
* rdate를 이용한 시간 동기화
# rdate -s time.bora.net && date > /dev/null && clock -r > /dev/null && clock -w > /dev/null 2> /dev/null

========================================================================== 

 

듀얼부팅 시스템에서 시스템 시간 설정 문제

출처 : http://hssuh.tistory.com/438

OS에 따라 (바이오스에 저장된) 시스템 시각을 UTC(국제 표준시)로 설정하는 것도 있고 그냥 해당 지역시각으로 설정하는 것도 있습니다. 리눅스를 비롯한 유닉스 계열의 경우에는 일반적으로 UTC로 설정을 하는 게 기본이고, 시스템에 따라서 설정 파일을 조정해서 지역시각으로 설정해서 쓰기도 합니다. Windows XP에서는 지역시각이 기본설정인데, 그냥 메뉴에서는 시스템 시각을 UTC로 설정할 수 있는 옵션이 나와있지 않습니다.

리눅스와 Windows XP를 듀얼부팅하는 시스템을 구축해서 사용하시는 분들의 경우에는 일반적으로 리눅스 쪽에서 시스템 시각을 UTC가 아닌 지역시각으로 활용하는 방식을 사용합니다.

하지만 Mac OS X과 Windows XP로 듀얼부팅 시스템을 구축하는 경우에는 그게 여의치가 않습니다. Mac OS X에서 (적어도 제가 알기로는) 시스템 시각을 무조건 UTC로 설정해 버리기 때문인데요, 그러다 보니 Mac OS X으로 부팅을 했다가 윈도우즈로 부팅을 하면 시스템 시각을 다시 세팅하기 전에는 시스템 시각이 UTC로 맞춰져서 이상하게 보이게 됩니다.

매번 그걸 바꾸는 것도 바보같은 짓이고 해서 스크립트 같은 걸 만들어 돌려야 하나 하는데, 구글링을 하다 보니 http://miknight.blogspot.com/2006/06/storing-system-time-in-utc-in-windows.html에서 그 해결책을 알려주더군요.

Windows XP에서 레지스트리 편집기를 시동(시작 버튼->실행 선택, regedit 입력하고 확인 버튼 클릭)한 다음 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 으로 들어가셔서 RealTimeIsUniversal 이라는 키가 있는지 확인해 보시고 있으면 1로 설정해 주세요. 없으면(저도 없었어요) 메뉴에서 편집->새로 만들기->DWORD 값 을 선택하신 다음 이름은 RealTimeIsUniversal로, 값은 1로 설정해 주시면 됩니다.

이렇게 하고 나서 리부팅하면 그 후로는 시간이 제대로 표시될 거예요.

혹시 이 방법을 썼을 때 어떤 부작용이 생길지는 저도 모릅니다. 실제로 잘 작동하지 않는 경우가 있다는 얘기도 있고 그런데, 일단 저는 제대로 작동하고 있어서 이렇게 써 보렵니다. 문제가 생기면 뭐 스크립트 만들어서 부팅할 때마다 자동으로 시스템 시각을 동기화시키도록 하든지 해야겠어요.

 

레드햇 system time zone 변경 문서.

출처 : https://access.redhat.com/solutions/7089#

How to change the system time zone from command line in Red Hat Enterprise Linux 6 and earlier.

 

문제
How can the system timezone be changed from the command line without using system-config-date (or redhat-config-date in RHEL3)?

 

환경

Red Hat Enterprise Linux 3
Red Hat Enterprise Linux 4
Red Hat Enterprise Linux 5
Red Hat Enterprise Linux 6

 

How to change the system time zone from command line in Red Hat Enterprise Linux 6 and earlier - Red Hat Customer Portal

해결

  1. Find the desired time zone file in the /usr/share/zoneinfo/ directory, for example: "America/New_York".

  2. Change the ZONE= declaration in /etc/sysconfig/clock to ensure the time zone is read properly by the tzdata-update command each time the tzdata package gets updated (or when system-config-date is run), e.g.:

    ZONE="America/New_York"
    
  3. Run tzdata-update
    This will replace /etc/localtime with the appropriate zone file by reading /etc/sysconfig/clock
    Note: Replacing /etc/localtime with symlinks to a zone file in RHEL4, RHEL5, or RHEL6 is Unsupported

  4. Run the date command to ensure it reports the expected time and date.

Notes on UTC

  • It is generally advisable to configure the system clock to use UTC, which results in the BIOS storing the time in UTC (Coordinated Universal Time) instead of local time.

    • This is especially recommended if a system is configured with a time zone that observes daylight saving time or if the system's users will connect remotely from other time zones.

    • This is not recommended if the system is configured to dual-boot with Microsoft Windows.

  • To enable UTC in RHEL 6, ensure the third line of /etc/adjtime reads as follows:

    UTC
    
    • See man hwclock under the Adjust Function header for details on the /etc/adjtime file.
  • To enable UTC in earlier versions of RHEL, ensure /etc/sysconfig/clock contains a line like the following:

    UTC=true
    
    • See /usr/share/doc/initscripts*/sysconfig.txt for details on the /etc/sysconfig/clock file.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다