Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

윤초 문제에 영향을 받습니까?

Updated -
  • 2012년 6월 30일에 발생했던 예정된 윤초 문제는 시스템 데드락을 야기할 수 있고, 시스템 무응답을 발생하면서 높은 CPU 로드의 유지를 야기할 수 있는 두 가지 문제의 원인으로 확인되었습니다.

시작하기

윤초 정보에 대한 알려진 문제 등은 공식 문서인 Resolve Leap Second Issues in Red Hat Enterprise Linux를 참조하십시오.

RHEL 커널은 어떠한 달에도 윤초의 발생을 수용하고 있습니다만, RHEL의 ntpd는 윤초를 전달할 달은 한정되어 있습니다. ntp 버전 ntp-4.2.4p8에서 커널 윤초 비트 설정은 오직 6 월과 12 월 말뿐입니다. 그러나 윤초의 정보가 클라이언트에 전송되는 날이 한정되어 있지 않습니다. ntp 버전 4.2.6 이 나 이후 버전에서 ntp는 어느 달에도 월 말에 커널 윤초를 설정할 수 있도록 되어있습니다만, 대부분의 서버들은 4.2.4 이전 윤초 대신 4.2.6 이후의 것으로 일치 시키도록 해야 합니다.

NTP 서버는 어떠한 달에도 월 말에 윤초가 발생할 수 있습니다. ntp 서버를 확인하여 윤초를 발생시키도록 조정되어 있는지 확인해야 합니다.

  • 글로벌 확인

    [root@smartguy ~]$ ntpq -c "lassoc" -c "mrv &1 &999 leap,srcadr,stratum" name1.glorb.com | grep -E "leap=([^0].|.[^0])"
      srcadr=truechimer.cites.illinois.edu, leap=01, stratum=1
      srcadr=time-b.nist.gov, leap=11, stratum=1
    
  • 로컬 확인

    [root@dell-pe2950-01 ~]# ntpq -c "lassoc" -c "mrv &1 &999 leap,srcadr,stratum"
    

leap=01이 확인되면 윤초가 발생합니다. 매월 말에 확인하도록 하여 6 월과 12 월에 반드시 확인하는 것이 좋습니다.

문제 해결 방법

무엇보다도, 업데이트가 필요하다면 Leap Second Issue Detector Red Hat Labs Tool 을 확인하시기 바랍니다.

  • 주의: 디텍터 툴은 다음 RHEL6 ntp errata 을 아직 지원하지 않습니다.
    • 이것은 아래 해결 방법 #2를 위해 중요합니다.

시스템을 최신 Red Hat Enterprise 커널로 업데이트할 것을 강력하게 권장합니다. 즉, 다음의 2 개의 NTP 클라이언트의 해결 방법은 "정확함" 대신 "정밀함"이 요구되는 타임스탬프 정보를 필요로 하는 시스템에서만 사용할 수 있는 경우가 있기 때문입니다. 덧붙여 "정밀함"은 수량이 표현되는 세부 측정을 보여줍니다. "정확함"은 "진정한 값에서 측정한 오차"를 의미합니다.

  • 해결 방법 1 :
    • ntpd를 중지합니다.
    • ntptime -s 0을 실행하면 커널의 상태를 재설정합니다.
    • ntptime 를 실행하고 상태줄에 INT 혹은 DEL 이 표시되지 않는 것을 확인합니다.
    • 윤초 동안에 ntp 활성화없이 시스템을 실행합니다.
    • 추후에 다른 나라들과 함께 시스템들을 시간의 개념으로 조절하기 원할지도 모릅니다. 다음 방법들이 사용될 수 있습니다:
      • 시간을 조절하기: ntpd 가 다시 시작하는 경우, 시간은 수정될 것입니다.
      • 천천히 시간을 수정하기: ntpdate -B <some-ntp-server> 가 사용될 수 있습니다. 교정은 2000초 가량 걸립니다. 그 후에, ntpd 는 재시작 될 수 있고, 에러는 이미 수정될 것입니다. 따라서, ntpd는 어떤 조정도 필요없을 것 입니다.
      • 시간을 빠르게 수정하기: 이것은 adjtimex tick 값을 사용합니다. 다음 스크립트는 10.1 초를 위해 9% 시간을 느리게 합니다. 이전에 이미 기술한대로 해결책에 ntpdate 대신에 사용될 수 있습니다.
                #!/bin/bash
                tick=$(tickadj | awk '{print $3}')
                echo initial tick $tick
                slewtick=$[$tick * 91 / 100]
                duration=10.1
                echo correcting clock for inserted leap second...
                tickadj $slewtick
                sleep $duration
                tickadj $tick
  • 해결 방법 2 :
    • ntpd를 중지합니다.
    • ntptime -s 0 -f 0을 실행하면 커널의 상태와 빈도를 재설정합니다.
    • -x 옵션 (ntp slew 모드)에서 ntp를 설정합니다.
    • ntpd를 시작하고(slew 모드) 윤초 발생 시에 실행시켜 둡니다.

첫 번째 해결 방법은 클라이언트에서 윤초의 삽입이 무시됩니다만, 윤초가 삽입된 후에 일반 모드에서 ntp가 안전하게 다시 시작합니다.

두 번째 해결 방법은 이전 버전의 ntp는 윤초는 무시됩니다만, ntp-4.2.6p5 이상을 실행하는 시스템에서는 윤초가 삽입됩니다. 그러나 이것은 커널 대신 ntpd에 의해 이루어집니다. 이 버전의 ntpd는 자정에 settimeofday() 또는 clock_settime()를 호출하여 자동으로 시간을 되돌립니다.

정확한 타임스탬프 정보가 필요한 경우에 사용할 수 있도록 Red Hat은 Red Hat Enterprise Linux 6.1, 6.2 및 6.3에 윤초의 문제를 해결하는 패치를 맞춘 z-stream 커널을 공개했습니다. 알려진 문제를 처리하기 위해 다음 윤초가 발생하기 전에 이러한 커널을 설치해야 합니다.

Red Hat Labs 재현 테스트

Red Hat Lab Leap Second Vulnerability Detector 에서 윤초 취약점 테스트 방법이 사용가능합니다.

윤초 추가 테스트

이 프로그램은 실제 윤초를 추가할 것이고, 패치되지 않은 시스템에서는 문제가 발생할 수 있습니다. 테스트 환경에서 사용하는 것이 권고됩니다.

윤초 스트레스 테스트는 leap-a-day.c 이름으로 첨부되었으며, 다운로드하여 테스트 시스템에서 컴파일할 수 있습니다. 지침은 아래와 같습니다.

  1. kernel-headers 패키지 설치를 확인합니다:

    yum install kernel-headers
    
  2. 첨부된 leap-a-day.c 프로그램을 다운로드합니다.

  3. 로컬로 애플리케이션을 빌드합니다:

    gcc leap-a-day.c -o leap-a-day -lrt
    
  4. 애플리케이션을 수행합니다:

    *  Usage: leap-a-day [-s] [-i <num>]
    *
    *  Options:
    *      -s:     Each iteration, set the date to 10 seconds before midnight GMT.
    *              This speeds up the number of leapsecond transitions tested,
    *              but because it calls settimeofday frequently, advancing the
    *              time by 24 hours every ~16 seconds, it may cause application
    *              disruption.
    *
    *      -i:     Number of iterations to run (default: infinite)
    *
    *  Other notes: Disabling NTP prior to running this is advised, as the two
    *               may conflict in thier commands to the kernel.
    

이 테스트는 테스트 추가와 삭제 사이를 반복할 것이며, 에러가 감지되면 보고할 것입니다. 이 테스트는 시스템의 시간을 조절할 것이며, 계획이 따릅니다. 성공과 실패의 수행은 모두 아래처럼 보이게 됩니다.
주의: RHEL 4와 RHEL 5 시스템은 단지 처음 인터벌만이 유효합니다. 그다음 테스트의 수행은 추가 윤초 삽입을 테스트하기 위해 필요할 것입니다.

  • 성공:

    # ./leap-a-day -s
    Setting time to speed up testing
    This runs continuously. Press ctrl-c to stop
    
    Setting time to Tue Mar 10 19:59:50 2015
    Scheduling leap second for Tue Mar 10 20:00:00 2015
    Tue Mar 10 19:59:57 2015 +    126 us (0)    TIME_INS
    Tue Mar 10 19:59:57 2015 + 500256 us (0)    TIME_INS
    Tue Mar 10 19:59:58 2015 +    368 us (0)    TIME_INS
    Tue Mar 10 19:59:58 2015 + 500548 us (0)    TIME_INS
    Tue Mar 10 19:59:59 2015 +    740 us (0)    TIME_INS
    Tue Mar 10 19:59:59 2015 + 500850 us (0)    TIME_INS
    Tue Mar 10 20:00:00 2015 +    994 us (0)    TIME_INS
    Tue Mar 10 19:59:59 2015 + 501170 us (0)    TIME_OOP
    Tue Mar 10 20:00:00 2015 +   1278 us (1)    TIME_WAIT
    Tue Mar 10 20:00:00 2015 + 501448 us (1)    TIME_WAIT
    Tue Mar 10 20:00:01 2015 +   1660 us (1)    TIME_WAIT
    Tue Mar 10 20:00:01 2015 + 501810 us (1)    TIME_WAIT
    Tue Mar 10 20:00:02 2015 +   1999 us (1)    TIME_WAIT
    Leap complete
    
  • 실패:

    # ./leap-a-day -s
    Setting time to speed up testing
    This runs continuously. Press ctrl-c to stop
    
    Setting time to Sun Mar  8 19:59:50 2015
    Scheduling leap second for Sun Mar  8 20:00:00 2015
    Sun Mar  8 19:59:57 2015 +    166 us (0)    TIME_INS
    Sun Mar  8 19:59:57 2015 + 500310 us (0)    TIME_INS
    Sun Mar  8 19:59:58 2015 +    527 us (0)    TIME_INS
    Sun Mar  8 19:59:58 2015 + 500737 us (0)    TIME_INS
    Sun Mar  8 19:59:59 2015 +    906 us (0)    TIME_INS
    Sun Mar  8 19:59:59 2015 + 501113 us (0)    TIME_INS
    Sun Mar  8 19:59:59 2015 +   1331 us (0)    TIME_OOP
    Sun Mar  8 19:59:59 2015 + 501532 us (0)    TIME_OOP
    Sun Mar  8 20:00:00 2015 +   1918 us (1)    TIME_WAIT
    Sun Mar  8 20:00:00 2015 + 502154 us (1)    TIME_WAIT
    Sun Mar  8 20:00:01 2015 +   2299 us (1)    TIME_WAIT
    Sun Mar  8 20:00:01 2015 + 502492 us (1)    TIME_WAIT
    Sun Mar  8 20:00:02 2015 +   2683 us (1)    TIME_WAIT
    ERROR: hrtimer early expiration failure observed.
    Leap complete
    

Attachments

  • Component
  • ntp

Was this helpful?

We appreciate your feedback. Leave a comment if you would like to provide more detail.
It looks like we have some work to do. Leave a comment to let us know how we could improve.
Close

Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.