진행하기 전에 호스트 컴퓨터에서 NTP 시간을 동기화해야 하는 C 응용 프로그램을 개발 중입니다. 기본적으로 명령을 실행하는 래퍼 C 함수를 작성했습니다.ntpq -p
출력에 * 문자가 포함되어 있으면 연결되어 있고 계속할 준비가 되어 있다고 가정합니다. 성공적인 NTP 동기화에 대한 출력 예:
remote refid st t when poll reach delay offset jitter
==============================================================================
*myserver.domain.com xxx.xxx.xxx.xxx 2 u 729 1024 377 1.120 -1.834 2.282
출력되는 경우확실히* 문자가 포함되어 있으면 내 프로그램이 잠시 잠자기 상태가 된 다음 다시 확인합니다. * 문자를 찾을 때까지 이 과정을 반복합니다.
그러나 내 컴퓨터 중 하나에서 * 문자가 재부팅 후 최종적으로 표시되는 데 오랜 시간이 걸리는 것을 발견했습니다(~5분). 하지만 더 빠르게 동기화된 것 같습니다. 즉, 를 실행하면 datetime
NTP 서버에서 가져와야 하는 정확한 시간처럼 보이지만 * 문자는 몇 분 후에야 표시됩니다.
이는 기본적으로 시스템이 다시 시작된 후 5분 동안 실행되지 않으므로 내 애플리케이션에 부정적인 영향을 미칩니다.
나는 ntp.conf 파일에서 "iburst" 옵션을 사용하고 있는데, 그것이 빨리 동기화되기를 바라고 있습니다.
# my NTP server config
server myserver.domain.com iburst
이번에도 동기화가 빠른 것 같지만 ntp -q
출력에서 * 문자를 보고하는 데 시간이 걸립니다.
이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 또한 - NTP 동기화가 완료되었는지 확인하는 더 좋은 명령이 있습니까?
편집 #1: 더 많은 정보 추가
나는 Chris Davies의 답변을 통해 ntpd가 동기화된 것으로 간주되기 전에 8번의 성공적인 폴링이 필요하다는 것을 이해합니다. 이는 내 시계가 동기화되지 않았음에도 불구하고 올바르게 보이는 이유를 설명합니다. 이해가 되지 않는 것은 iburst 옵션을 설정한 경우에도 시작 시 폴링이 너무 느리게 진행되는 이유입니다.
나는 refid = .STEP을 발견했습니다. 초기 시작시. 이는 초기 동기화가 매우 크다는 것을 의미하기 때문에 이것이 관련이 있는지 확실하지 않습니다.
편집 #2: 전체 시퀀스는 다음과 같습니다.
호스트 시작 - 초기 NTP 동기화가 발생한 것으로 보이며 변경 사항이 매우 컸으므로 refid = .STEP입니다.
얼마 후 refid는 내 NTP 서버의 IP 주소를 업데이트했습니다. 그러나 8회 연속 성공이 발생하지 않았기 때문에 여전히 비동기 상태로 간주됩니다. 그리고 64초마다만 폴링하므로 동기화 시간이 더 길어집니다. 참고: IBURST를 활성화했습니다!
NTP 데몬 서비스를 다시 시작하면 즉시 백업되어 동기화됩니다. 이제 iburst가 제대로 작동하는 것 같습니다.
재부팅 후 NTP 데몬이 시작되면 iburst 옵션이 실패한 것과 거의 같습니다. 하지만 서비스를 다시 시작하면 제대로 작동합니다.
답변1
시스템이 initramfs를 사용합니까? 그렇다면 수정 후 업데이트되었나요 ntp.conf
? 그렇지 않은 경우 시스템은 ntpd
initramfs에 저장된 이전 버전을 사용하여 부팅 프로세스 초기에 부팅될 수 있습니다. 이는 부팅 시 이 옵션이 무시되는 것처럼 보이는 이유를 설명할 수 있습니다.ntp.conf
iburst
재시작 시 ntpd
최신 버전이 사용되므로 ntp.conf
이 iburst
옵션이 적용됩니다.
초기 동기화로 인해 항상 매우 큰 변경 사항이 발생하는 경우( refid = .STEP.
말한 대로) 배포판 ntpdate
에서 부팅하기 전에 부팅 시 실행할 수 있는지 확인하세요 ntpd
. 아이디어는 ntpdate
큰 단계가 처리된 다음 ntpd
이미 정확한 시간에 매우 가까운 시스템 시계에서 시작하여 이상적으로 iburst
단계를 변경하지 않고도 성공할 수 있다는 것입니다.
답변2
NTP 클라이언트는 서버 Reachable
값이 가 될 때까지 자체적으로 동기화된 것으로 간주하지 않습니다 377
. 이는 8비트 시프트 레지스터로, 매 사이클마다 원격 서버에 접근 가능한지 여부를 나타내는 Poll
값이 0
가장 낮은 비트로 시프트된다. 1
8진수 값은 원격 서버에서 연속적으로 8번의 성공적인 읽기를 377
나타냅니다 .11111111
이런 일이 발생하면 *
선택한 "truechimer"(합리적인 시간을 제공하는 서버) 옆에 하나가 표시될 뿐만 아니라 +
완전히 액세스할 수 있지만 현재 선택되지 않은 다른 "truechimer"도 표시됩니다.
이상적으로는 홀수 개의 원격 NTP 서버와 둘 이상의 서버가 있어야 합니다. 3은 좋은 숫자입니다. 풀링된 서버를 사용하는 경우 다음과 같이 보일 수 있습니다.
0.pool.ntp.org
1.pool.ntp.org
2.pool.ntp.org