Linux,Unix,BSD/RaspberryPI

[RPi] 인터넷 없는 환경에서 전원 차단으로 인하여 시스템 시계가 초기화되는 문제

채윤아빠 2022. 7. 14. 08:44
728x90
반응형

문제점 및 증상

라즈베리파이가 설치되는 현장에서 인터넷을 연결할 수 없는 상황이었습니다.
이 경우 문제가 되는 것이 라즈베리파이 내에 RTC가 없기 때문에 전원이 오랫동안 공급되지 않는 경우, 내부 시스템 시각이 전원이 공급되지 않는 동안에 멈춰 있기 때문에 점차 시간이 틀어진다는 점입니다.
게다가 전원 공급이 차단되기 전에 정상적으로 shudown을 하면 그나마 셧다운되는 시각이 남아 다음에 전원을 공급하면 셧다운 시각부터 시스템 시각이 시작됩니다.

하지만, 정상적인 셧다운이 아니라 전원 공급을 그냥 차단해 버린리고 난 후, 다시 전원을 공급하여 라즈베리파이가 부팅될 때는 마지막 셧다운 시각으로 되돌아 가기 때문에 전원을 끄는 시점이 아닌 정상적으로 셧다운한 과거의 시각으로 되돌아가는 심각한 문제가 있습니다.
만약 정상적인 샷다운 절차가 아니라, 전원을 그냥 차단하는 형태로 라즈베리파이를 켜면, 부팅되는 상황에서 시각은 매번 동일하게 됩니다. ㅠ.ㅠ

문제 재현 방법

이러한 문제를 재현하는 방법은 간단합니다.

먼저 라즈베리파이에서 무선 및 유선 인터넷 모두 비활성화 합니다. 그리고 정상적으로 셧다운(sudo shutdown -h now)을 진행하고 전원을 껐다가 켭니다.

셧다운한 시각을 기록해 둡니다. 일정시간이 지난 후(약 5분 이상), 라즈베리파이의 전원을 그냥 차단했다가 다시 전원을 공급하여 부팅을 합니다.

라즈베리파이가 부팅된 후, 시스템 시각을 확인해 보면, 마지막으로 셧다운했던 시각부터 시작됩니다.

다시 일정시간 이후에 껐다가 켰을 때 시스템 시각을 확인해 봐도 마지막으로 셧다운했던 시각부터 시작되는 것을 확인할 수 있습니다.

해결 방안

간단한 해결책은 "fake-hwclock" 패키지를 설치하고 "fake-hwclock" 명령을 cron에 등록해 두는 것입니다.

다음과 같이 "fake-hwclock" 패키지를 설치합니다.

pi@raspberrypi:~ $ sudo apt install fake-hwclock
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  ntp
The following NEW packages will be installed:
  fake-hwclock
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 7,126 B of archives.
After this operation, 32.8 kB of additional disk space will be used.
Get:1 http://archive.raspberrypi.org/debian buster/main armhf fake-hwclock all 0.11+rpt1 [7,126 B]
Fetched 7,126 B in 3s (2,130 B/s)
Selecting previously unselected package fake-hwclock.
(Reading database ... 101991 files and directories currently installed.)
Preparing to unpack .../fake-hwclock_0.11+rpt1_all.deb ...
Unpacking fake-hwclock (0.11+rpt1) ...
Setting up fake-hwclock (0.11+rpt1) ...
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
Processing triggers for man-db (2.8.5-2) ...
Processing triggers for systemd (241-7~deb10u8+rpi1) ...
pi@raspberrypi:~ $ whereis fake-hwclock
fake-hwclock: /usr/sbin/fake-hwclock /etc/fake-hwclock.data /usr/share/man/man8/fake-hwclock.8.gz

"fake-hwclock" 동작을 확인해 보면 다음과 같습니다.

pi@raspberrypi:~ $ cat /etc/fake-hwclock.data
2022-07-14 08:40:42
pi@raspberrypi:~ $ sudo fake-hwclock save
pi@raspberrypi:~ $ cat /etc/fake-hwclock.data
2022-07-14 08:44:16

"sudo fake-hwclock save"라고 명령을 실행하면 "/etc/fake-hwclock.data" 파일에 현재의 시각이 저장됩니다. 반대로 "sudo fake-hwclock load"라고 명령을 실행하면 "/etc/fake-hwclock.data" 파일의 시각 정보를 읽어서 시스템의 시각을 설정합니다.

crontab에 다음과 같이 1분마다 현재의 시각을 기록하도록 추가합니다.

*/1    *    *    *    *    sudo /usr/sbin/fake-hwclock save

마지막으로 "/etc/rc.local" 파일에 "fake-hwclock load" 명령을 추가하여 전원 차단 후, 다시 실행되었을 때 가장 최근 실행된 시각 정보로 시스템 시각을 설정되도록 합니다.

이렇게 함으로써 인터넷이 연결되지 않은 환경에서 전원이 갑작스럽게 차단되어도 시스템 시각이 마지막 정상 셧다운 시각으로 되돌아가지 않고, 마지막으로 "fake-hwclock"이 수행된 시각으로 시스템 시각이 시작되어 문제가 해결됩니다.

결론

인터넷을 연결할 수 없는 상황이라면 RTC를 추가로 장착하여, 시각을 맞추어 나갈 수도 있으나 별도의 모듈을 구매하여 장착하는 등의 수고를 들어야 하고, 혹은 샀다고 하더라도 현장에 설치할 여건이 안될 수도 있습니다.

이런 경우, "fake-hwclock"은 유일안 대안이 아닐 수 없습니다. "fake-hwclock" 패키지를 설치한 후에도 "crontab"을 설정하고, "/etc/rc.local" 파일도 수정해야하는 번거로움이 있지만 그나마 손쉬운 방법이 아닌가 합니다.

참고자료