라즈베리 파이를 열심히 만지던 도중, 시간 동기화가 되어 있지 않은 것을 확인했다.
필자는 핫스팟을 이용하여 라즈베리 파이와 컴퓨터를 연결하는데, 아마 이 때문인 것으로 추정된다.
이를 해결하기 위해 엄청 많은 작업을 했는데, 어찌어찌 해결하는 데 성공하였다. 이에 방법을 설명하고자 한다.
사전 작업
일단 무엇이 문제인지 알아보기 위해 다음 명령을 입력한다.
timedatectl

아래와 같은 화면이 뜨는데, 봐야 할 것은 'System clock synchronized'와 'NTP service'이다.

sprout1345@sproutpi:~$ timedatectl
Local time: Tue 2024-08-27 19:51:13 UTC
Universal time: Tue 2024-08-27 19:51:13 UTC
RTC time: Thu 1970-01-01 01:15:23
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: no
NTP service: active
RTC in local TZ: no
timedatectl 출력에 따르면, 현재 시스템 시간이 UTC로 설정되어 있으며, 시간 동기화가 제대로 이루어지지 않았다. 거기에다 RTC 시간은 1970년, 즉 유닉스 시간 0으로 설정되어 있다. 총체적 난국이다.
이를 해결해보자. 필자는 rdate를 이용해 문제를 해결하였다.
rdate
rdate는 네트워크를 통해 원격 서버와 시스템 시간을 동기화하는 도구이다. 이 도구는 원격 NTP 서버에서 제공하는 정확한 시간을 가져와 로컬 시스템의 시간을 업데이트한다. 단일 동기화 작업을 수행하기 때문에, 지속적인 동기화는 제공하지 않으며, 보통 수동으로 실행한다.
또한 옛날부터 사용된 오래된 도구이기 때문에, 최신의 시스템에서는 거의 사용되지 않고, 대부분 NTP로 대체되었으며, 당연히 라즈베리 파이도 NTP를 이용해 시간을 업데이트한다.
하지만 필자는 핫스팟을 이용하므로, NTP 서비스를 이용할 수 없으므로, 이거라도 써야 한다.
사용법은 다음과 같다.
rdate [옵션] [서버 주소]
자세한 설명은 아래와 같다:
sprout1345@sproutpi:~$ rdate
Usage: rdate [-46acnpsv] [ -b sec ] [-o port] [ -t msec ] host
-4: use IPv4 only
-6: use IPv6 only
-a: use adjtime instead of instant change
-b num: use instant change if difference is greater than
num seconds, or else use adjtime
-c: correct leap second count
-n: use SNTP instead of RFC868 time protocol
-o num: override time port with num
-p: just print, don't set
-s: just set, don't print
-u: use UDP instead of TCP as transport
-t msec: does not set clock if network delay greater than msec
-v: verbose output
예를 들어, time.bora.net의 시각을 불러오고 싶다면 아래의 명령을 입력한다.
rdate -p time.bora.net

time.bora.net의 시각과 동기화하고 싶다면 아래의 명령을 입력한다.
sudo rdate -s time.bora.net
설정을 하였으면 아래의 명령을 입력하여 현재 시간과 라즈베리 파이의 시간을 확인한다.
timedatectl status

시각이 동기화된 것을 확인할 수 있다.
rdate를 서비스로 만들어 부팅 시 자동으로 실행하기
systemd 서비스를 이용하여 부팅 시 rdate 명령을 실행하도록 서비스를 설정할 수 있다.
새로운 서비스 파일을 생성한다.
아래의 명령을 입력한다:
sudo nano /etc/systemd/system/rdate.service
편집기가 열리면 아래의 내용을 참고하여 파일을 작성한다.
[Unit]
Description=Set system time using rdate
After=network-online.target
Wants=network-online.target
[Service]
ExecStartPre=/bin/sleep 30
ExecStart=/usr/sbin/rdate -s time.bora.net
Restart=on-failure
[Install]
WantedBy=multi-user.target

rdate의 경로가 다르면 오류가 나므로, 아래의 명령으로 rdate의 경로를 파악하고 이를 파일에 반영한다.
which rdate
서비스를 활성화한다.
sudo systemctl enable rdate.service


서비스를 시작한다.
sudo systemctl start rdate.service
서비스가 정상 작동하는지 확인한다.
sprout1345@sproutpi:~$ sudo systemctl status rdate.service
○ rdate.service - Set system time using rdate
Loaded: loaded (/etc/systemd/system/rdate.service; enabled; preset: enabled)
Active: inactive (dead) since Fri 2024-12-27 00:35:48 KST; 1min 33s ago
Process: 4370 ExecStart=/usr/sbin/rdate -s time.bora.net (code=exited, status=0/SUCCESS)
Main PID: 4370 (code=exited, status=0/SUCCESS)
CPU: 2ms
Dec 27 00:35:47 sproutpi systemd[1]: Starting rdate.service - Set system time using rdate...
Dec 27 00:35:48 sproutpi systemd[1]: rdate.service: Deactivated successfully.
Dec 27 00:35:48 sproutpi systemd[1]: Finished rdate.service - Set system time using rdate.

이후 재부팅해본다.
fake-hwclock을 사용하여 시간 저장 보조하기(선택)
fake-hwclock은 하드웨어 시계(Real-Time Clock, RTC)가 없는 시스템에서 시간 데이터를 보존하기 위해 사용되는 소프트웨어이다. 라즈베리 파이와 같은 일부 저비용 시스템에는 RTC를 유지하기 위한 수단이 없으므로, 시스템을 재부팅하거나 전원을 차단했다가 다시 켜면 시간이 초기화되며, 이를 보조하기 위해 fake-hwclock이 사용된다.
fake-hwclock은 시스템 시간이 변경되면 일정 주기마다, 또는 시스템 종료 시 현재 시간을 파일("/etc/fake-hwclock.data")에 저장하며, 시스템 부팅 시, 저장된 시간을 읽어와 시스템 시계에 설정한다. 이 시간은 저장된 시간은 정확하지 않을 수 있지만, 완전히 초기화된 시간을 사용하는 것보다는 유용하며, RTC가 없는 시스템에서 최소한의 시간 정확성을 제공한다.
물론 저장된 시간은 마지막으로 업데이트된 이후의 경과 시간을 반영하지 않으므로, 시스템이 오랫동안 꺼져 있었다면 시간이 크게 어긋날 수 있다.
fake-hwclock을 UTC로 저장하며, 이를 시스템 설정에 맞추어 로컬 시간(KST 등)으로 변경한다.
설치한다.
sudo apt install fake-hwclock
현재 저장된 시간 확인:
cat /etc/fake-hwclock.data
저장된 시간 강제 업데이트:
sudo fake-hwclock save
저장된 시간 복원:
sudo fake-hwclock load
hwclock을 이용하여 하드웨어 시계에 시간 저장하기(선택)
아까 라즈베리 파이에는 RTC가 유지되지 않는다고 말한 바 있다.
정확히 말하면 RTC의 정보를 저장해주는 수단이 없는 것으로, 컴퓨터에 비유하자면 메인보드의 전지가 없는 것이라고 할 수 있다. 이 때문에 라즈베리 파이 주변 기기로 파이에 전력을 공급해 주는 전지가 비공식 출시되어 있다.
어쨌든 하드웨어 단에서 시간은 측정되므로, 시스템 시간을 하드웨어 시계에 저장할 수 있다.
만약 파이에 전력을 계속 공급하면서 사용한다면, 그러니까 플러그를 뽑지 않고 사용한다면 아마 유용할 것이다.
설치한다.
sudo apt install util-linux-extra

명령은 아래와 같다.
모든 명령은 sudo 권한이 필요하다.
hwclock # 하드웨어 시계 읽기
hwclock --verbose # 자세한 정보 출력
hwclock --hctosys # 시스템 시간을 하드웨어 시계와 동기화; Hardware Clock to System clock, 하드웨어 시계의 시간을 시스템 시계로 설정
hwclock --systohc # 하드웨어 시계를 시스템 시간과 동기화; System clock to Hardware Clock, 시스템 시계를 하드웨어 시계에 설정
hwclock --localtime # 하드웨어 시계를 로컬 타임 기준으로 설정
hwclock --utc # 하드웨어 시계를 UTC 기준으로 설정
hwclock --set --date="2024-12-27 12:00:00" # 하드웨어 시계 시간을 직접 설정
hwclock --debug # 디버그 모드; 명령 실행 시 어떤 작업이 수행되는지 자세히 표시
위의 rdate가 실행된 후 "hwclock --systohc"를 실행하면 rdate로 동기화 된 시스템 시간을 하드웨어 시간과 동기화할 수 있다.

hwclock을 서비스로 만들어 자동으로 하드웨어 시계에 시간 저장하기(선택)
hwclock 또한 방금 만든 rdate.service처럼 서비스로 만들어 자동으로 실행되게끔 설정할 수 있다.
서비스 파일을 생성한다.
sudo nano /etc/systemd/system/sync-rtc.service
서비스 파일에 아래의 내용을 입력하고 저장한다.
[Unit]
Description=Synchronize hardware RTC with system time
After=rdate.service
Requires=rdate.service
[Service]
Type=oneshot
ExecStart=/sbin/hwclock --systohc
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

서비스를 활성화한다.
sudo systemctl enable sync-rtc.service

서비스를 시작한다.
sudo systemctl start sync-rtc.service
서비스가 정상적으로 실행되었는지 확인한다.
sudo systemctl status sync-rtc.service
sprout1345@sproutpi:/etc/systemd/system$ sudo systemctl status sync-rtc.service
● sync-rtc.service - Synchronize hardware RTC with system time
Loaded: loaded (/etc/systemd/system/sync-rtc.service; enabled; preset: enabled)
Active: active (exited) since Sun 2025-01-12 18:40:39 KST; 4s ago
Process: 9640 ExecStart=/sbin/hwclock --systohc (code=exited, status=0/SUCCESS)
Main PID: 9640 (code=exited, status=0/SUCCESS)
CPU: 335ms
Jan 12 18:40:38 sproutpi systemd[1]: Starting sync-rtc.service - Synchronize hardware RTC with system time...
Jan 12 18:40:39 sproutpi systemd[1]: Finished sync-rtc.service - Synchronize hardware RTC with system time.

위와 비슷한 SUCCESS 메시지가 출력되면 성공이다.
재부팅 이후 timedatectl을 이용해 잘 작동하는지 확인하자.
하나로 합치기
스크립트를 만들어서, 이를 활용하는 것도 가능하다.
스크립트를 생성한다:
/usr/local/bin/ntp_fallback.sh

#!/usr/bin/env bash
set -e
# 1. 현재 NTP 동기화 상태를 확인
NTP_SYNCED=$(timedatectl show -p NTPSynchronized --value)
if [ "$NTP_SYNCED" = "yes" ]; then
echo "NTP가 정상적으로 동기화되었습니다. 추가 작업을 수행하지 않습니다."
exit 0
else
echo "NTP 동기화 실패! rdate로 수동 동기화 시도합니다."
# 2. rdate로 시간 동기화
/usr/sbin/rdate -s time.bora.net
# 3. hwclock으로 RTC를 시스템 시간으로 동기화
/sbin/hwclock --systohc
echo "rdate 및 hwclock 완료."
exit 0
fi
sudo chmod +x /usr/local/bin/ntp_fallback.sh
권한도 준다.
서비스 파일을 작성한다:
sudo nano /etc/systemd/system/ntp-fallback.service

[Unit]
Description=Fallback time sync using rdate and sync RTC
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStartPre=/bin/sleep 30
ExecStart=/usr/local/bin/ntp_fallback.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable ntp-fallback.service
sudo systemctl start ntp-fallback.service
서비스로 등록한다.
sprout1345@sproutpi:~$ systemctl status ntp-fallback.service
● ntp-fallback.service - Fallback time sync using rdate and sync RTC
Loaded: loaded (/etc/systemd/system/ntp-fallback.service; enabled; preset: enabled)
Active: active (exited) since Tue 2025-04-29 00:03:28 KST; 30s ago
Process: 2372 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS)
Process: 2374 ExecStart=/usr/local/bin/ntp_fallback.sh (code=exited, status=0/SUCCESS)
Main PID: 2374 (code=exited, status=0/SUCCESS)
CPU: 1.016s
Apr 29 00:02:56 sproutpi systemd[1]: Starting ntp-fallback.service - Fallback time sync using rdate and sync RTC...
Apr 29 00:03:26 sproutpi ntp_fallback.sh[2374]: NTP 동기화 실패! rdate로 수동 동기화 시도합니다.
Apr 29 00:03:28 sproutpi ntp_fallback.sh[2374]: rdate 및 hwclock 완료.
Apr 29 00:03:28 sproutpi systemd[1]: Finished ntp-fallback.service - Fallback time sync using rdate and sync RTC.
요렇게 나오면 성공
여담
이 글에 따르면 rdate를 사용하는 것이 좋지 않다고 한다. 다른 도구를 사용할 수 있다면 그것을 사용하자.
서버 시간 동기화: 제발 21세기엔 rdate 쓰지 말자 – JellyPo 아파트
한줄 요약: 시간 동기화는 간단하지 않다.최소한 NTP 프로토콜 사용 이 글을 쓰는 이유는… 2020년 12월 현 시점에서 rdate(와 cron)로 시간 동기화 하겠다는 충격적인 블로그 글을 봐서… 결론부터 말
mini.jellypo.pe.kr
그렇지만 필자는 핫스팟 때문에 ntp를 사용할 수 없다.......
추가로, 라즈베리 파이를 핫스팟이 아닌 공유기에 연결하니 정상적으로 NTP를 이용하여 시간 동기화를 할 수 있었다.
참고 자료
https://itstudy402.tistory.com/40
우분투/라즈베리파이 시간 동기화 (rdate / bora.net)
서버 환경을 사용하다 보면 시스템 시간이 현재시간이랑 달라질 때가 많습니다. 시간이 조금씩 뒤틀리거나, 전원을 껐다가 다시 전원을 킬 때 전원 OFF였던 기간 동안 시간이 멈춰있는 경우도 많
itstudy402.tistory.com
https://gracefulprograming.tistory.com/91
[Linux] rdate로 시간동기화 하기
개요rdate 명령어는 리눅스의 시간을 timeserver와 동기화하는 명령어입니다. 리눅스는 서버로 운영되는 경우가 많은데 서버 시간은 서버에서 동작하는 여러 서비스에 영향을 주게 되기 때문에 항
gracefulprograming.tistory.com
https://feccle.tistory.com/102
HWclock 에 대해 알아보겠습니다.
Ⅰ. Linux 및 유닉스 기반 운영 체제에서 시간 설정하는 방법 system clock과 hardware clock 로 시간 설정을 할 수 있습니다. 1) system clock은 file 생성, process 실행, 그리고 날짜와 시각이 필요한 곳에 쓰이
feccle.tistory.com
https://mini.jellypo.pe.kr/wp/?p=11149
NTP 설정 및 운영 주의점 – JellyPo 아파트
리눅스 ntpd(혹은 chrony)와 timesyncd 같이 쓰지 말 것 결론부터 말하면, 시간 동기화 데몬은 서버에 한 개만 실행 중이어야 한다. 추가내용: 서버 시간 동기화: 제발 21세기엔 rdate 쓰지 말자 systemd를
mini.jellypo.pe.kr
https://mini.jellypo.pe.kr/wp/?p=11212
서버 시간 동기화: 제발 21세기엔 rdate 쓰지 말자 – JellyPo 아파트
한줄 요약: 시간 동기화는 간단하지 않다.최소한 NTP 프로토콜 사용 이 글을 쓰는 이유는… 2020년 12월 현 시점에서 rdate(와 cron)로 시간 동기화 하겠다는 충격적인 블로그 글을 봐서… 결론부터 말
mini.jellypo.pe.kr
'Raspberry Pi' 카테고리의 다른 글
| Raspberry Pi #9 - Raspberry Pi에 저장된 네트워크 연결 정보 변경하기 (0) | 2025.07.01 |
|---|---|
| Raspberry Pi #8 - Raspberry Pi 5에서 BitNet AI 모델을 로컬로 실행 (2) | 2025.05.01 |
| Raspberry Pi #6 - wiringPi 라이브러리를 이용한 핀 제어(C/C++) (1) | 2025.04.01 |
| Raspberry Pi #5 - gpiozero 라이브러리를 이용한 핀 제어 (0) | 2025.03.01 |
| Raspberry Pi #4 - raspi-config (0) | 2025.02.15 |
댓글