본문 바로가기

Study/라즈베리파이 공부

[라즈베리파이] 현재 시간 정보를 자동으로 가져와서 유지하는 방법

반응형

라즈베리파이는 현재 시간 정보를 유지하지 못합니다. 

작고 저렴하지만 파워풀한 라즈베리파이에 RTC(Real Time Clock) 블록은 포함되어 있지 않습니다. 다시 말하면 라즈베리파이에는 현재 시간 정보를 유지하는 기능이 없다는 이야기입니다. 그래서 오랫동안 껐다가 재부팅하면 현재 시간이 잘 맞지 않는 문제가 발생합니다.

 

라즈베리파이에 RTC block이 없는 이유?

제가 라즈베리파이를 설계한 사람은 아니지만 10년 이상 Embedded 환경에서 개발을 한 경험을 바탕으로 미루어 짐작하자면, 원가 절감과 크기 절감을 위한 게 아닌가 싶습니다. 라즈베리파이는 상업적인 목적이 아닌 교육적인 목적을 위해 만들어진 것이기 때문입니다. 필수적인 기능이 아니므로 RTC를 지원하지 않으면 더 저렴하고 저 작은 크기로 보드를 제공할 수 있기 때문입니다. 

 

RTC는 아주 간단한 기능이지만, 이를 제공하기 위해서는 H/W적으로 필요한 부품이 있습니다. 바로, 코인 배터리나 슈퍼 커패시터 같이 라즈베리파이가 꺼진 상태에서 시간 정보가 저장된 SRAM을 유지하고, 클럭을 발생시켜 시간 정보를 증가시켜줄 전원이 필요한 것입니다. 

 

RTC 정보를 유지하고 증가시키기 위한 코인 배터리

 

위의 사진은 일반적인 PC에서 RTC 정보를 유지하기 위한 코인 배터리입니다. CR2032 같은 얇은 배터리를 사용하는데, 배터리의 지름만 2cm에 달합니다. 소켓의 크기까지 감안하면 라즈베리파이 보드의 크기를 훨씬 크게 만들어야 합니다. 라즈베리파이에 위와 같은 코인 배터리 소켓이 포함되어있다고 생각해보십시오. 슈퍼커패시터로 대체한다고 하더라도 크기와 비용의 증가를 어느 정도 감수해야 합니다. 

 

라즈베리파이에 RTC 블록이 없는 이유에 대해서는 충분히 설명된 것 같습니다. 

그럼 지금부터는 라즈베리파이에 현재 시간을 자동으로 가져오는 방법에 대해서 설명드리겠습니다. 

 

라즈베리파이에 현재 시간을 자동으로 가져오는 방법(#1)

라즈베리파이에 현재 시간을 가져오는 방법에 대해서는 이미 관련 정보를 손쉽게 찾을 수 있습니다. 대표적인 방법인 rdate 패키지를 설치하여 부팅 시에 가져오는 방법입니다. 

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install rdate
$ sudo rdate -s time.bora.net

부팅 시마다 실행될 수 있도록 rc.local 파일에 rdate -s time.bora.net 명령을 추가해주면 됩니다. 

하지만 아쉽게도 위의 방법은 저에게 도움이 되지 않았습니다. 회사에서 사용 중인 라즈베리파이의 경우 방화벽 문제인지 time.bora.net으로 ping 조차도 나가지 않았습니다. 

 

라즈베리파이에 현재 시간을 자동으로 가져오는 방법(#2)

그래서 찾은 대안은 회사 내부에 있는 서버에서 주기적으로 라즈베리파이에 시간 정보를 전송하는 것이었습니다. 서버에서 crontab을 이용하여 주기적으로 라즈베리파이의 ssh에 접속하여 timedatectl 명령을 통해서 시간을 설정하는 방법입니다. 

#!/bin/bash

current_time=$(date '+%Y-%m-%d %H:%M:%S')
ssh frankler@192.168.25.2 "timedatectl set-time \"$current_time\""

 

$ date '+%Y-%m-%d %H:%M:%S' 명령을 수행한 결과를 currnet_time 변수에 저장하게 됩니다. 

$ echo $current_time 명령을 실행해보면 2021-08-15 23:37:24와 같은 형식으로 현재 시간 정보가 저장되어 있는 것을 확인하실 수 있습니다. 

 

ssh 명령을 통해서 라즈베리파이에 접속해서 timedatectl 명령을 통해서 current_time에 저장된 시간으로 현재 시간을 설정하게 해 주면 됩니다. 주기적으로 접속해서 시간 정보를 전달해야 하므로 crontabl으로 위의 쉘 스크립트를 등록하면 되겠습니다. 

 

라즈베리파이에 현재 시간을 자동으로 가져오는 방법(#3)

다음 방법은 라즈베리파이 부팅 시에 서버로부터 시간 정보를 가져오는 방법입니다. 라즈베리파이에서 부팅 시에 서버의 ssh에 접속하여 시간 정보를 가져온 후 timedatectl 명령을 통해서 현재 시간을 설정하는 방법입니다. 

$ current_time=$(ssh frankler@192.168.25.1 "date '+%Y-%m-%d %H:%M:%S'")
$ timedatectl set-time "$current_time"

 

위의 명령을 라즈베리파이의 rc.local 파일에 등록해두면 부팅 시에 자동으로 서버로부터 현재시간 정보를 가져와서 라즈베리파이에 설정하게 됩니다. 

 

끝맺음 말

이상으로 라즈베리파이에 현재시간 정보를 자동으로 가져오는 방법에 대한 설명을 모두 마칩니다. 

부디 유용한 정보였기를 바랍니다. 

 

감사합니다. 

반응형