프로그래밍/운영체제

[리눅스] 인터넷 NTP 이용한 시간 동기화와 강제 설정 방법

포도알77 2019. 7. 4. 09:29

1. 서론

리눅스기반으로 프로젝트를 진행하면서, 시간 동기화 이슈가 발생했다.

특히 라즈비안 기반의 라즈베리파이에서 RJ45를 이용한 인터넷 사용시 자동으로 동기화가 되지 않는 문제가 있었다. (라즈베리파이에는 RTC가 없기 때문에 전원을 재인가하면 시간이 안맞다.)

 

일반적인 상황이라면, 인터넷에 연결되었을 때 자동으로 시간을 동기화되지만 그렇지 않은 경우도 발생하여, 코드로 강제 동기화 하는 코드를 작성했다. 

 

2. 현재 시스템 시간 확인하기

  리눅스에서 현재 시스템 시간을 확인하기 위해서는 timedatectl을 이용하면 된다. 

timedatectl의 자세한 사용 방법은 제타 위키를 확인해보자. 링크

 

3. NTP를 이용한 시간 동기화

 NTP는 Network Time Protocol으로 네트워크상에 시간 동기화를 위한 프로토콜이다. 리눅스에서 NTP 수행하는 방법은 다음과 같다.

sudo timedatectl set-timezone "Asia/Seoul"
sudo apt-get install ntpdate --yes
sudo ntpdate 1.kr.pool.ntp.org 2.kr.pool.ntp.org 1.asia.pool.ntp.org 2.asia.pool.ntp.org time.google.com ntp2.kornet.net time.windows.com time.nist.gov

 

우선 timezone을 서울로 설정하고, ntpdate를 설치한다. 

이후 ntpdate에 NTP 서버를 입력함으로써, 해당 서버에 접근하여 시간 값을 받아온다. 일반적으로 한국 ntp 서버는 *.kr.pool.ntp.org이며, NTP 서버 풀에 자발적으로 참여하는 서버의 수에 따라서 *에 해당하는 값이 바뀐다.

 따라서 노파심에 일단 이름 있는 NTP 서버 도메인을 다 적어두었다. 구글, KT, 윈도우, nist...

 

4. 강제 동기화

 위의 코드를 보면 알겠지만 배시 명령어이다. 나는 설치시에 동기화를 한 번 수행하고 프로그램이 실행될 때 DB에 timestamp를 넣어둔다. 만약 현재 리눅스의 시스템 시간이 DB 시간보다 느린 경우에 이를 감지하고 시간을 강제적으로 변경한다. 

 강제 동기화 방법은 역시나 timedatectl을 활용한다. timedatectl은 NTP-sync 옵션이 True일 때는 수동 변경이 허용되지 않는다. 따라서 해당 옵션을 False 처리하고 시간을 강제 입력한다.

sudo timedatectl set-ntp false
sudo timedatectl set-time "2019-07-13 16:08:44"

  만약 데이터 베이스에서 timestamp를 가져오는 경우 그대로 문자열로 출력해서 입력해주어도 무방하다.

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사