블로그 이미지
훅크선장

카테고리

분류 전체보기 (360)
사진이야기 (23)
펭귄컴퓨팅 (120)
컴퓨터보안 (83)
절름발이 프로그래머 (59)
하드웨어개조 (23)
멀알려줄까 (35)
홈베이킹&홈쿠킹 (2)
잡다한것들 (15)
Total
Today
Yesterday

달력

« » 2024.3
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

공지사항

태그목록

최근에 올라온 글

갑자기 어떤 이유로 인하여,
인터넷에 연결되지 않은 폐쇄망에 대한 NTP 서버 운영에 대한 정보를 찾다가 시작하게 된,
GPS 기반의 NTP 서버 만들기의 과정을 정리하였습니다.

먼저, 전세계에 있는 stratum 시계에 대한 정보는 여기를 참고하시면 됩니다. 


필요한 준비물은 3가지 입니다. 물론, 컴퓨터는 별도로 한 대 더 있어야 합니다.

1) 라즈베리파이 B+ (B+가 아닌, 이전 버전도 충분히 가능)
http://www.eleparts.co.kr/EPXDFYBF (여기 모델이 투명케이스랑 방열판 포함임)

2) 국내에서 현재 구할 수 있는 라즈베리파이용 GPS 모듈은 안테나 포함으로 여기에~,

3) 4GB 이상의 MicroSD 카드 (운영체제 설치 및 데이터 저장용)


자, 이제 시작해봅시다.

1. 라즈베리파이에 OS설치
RASPBIAN Debian Wheezy 를 설치한다. 리눅스나 맥 OS X 에서는 dd 명령어를 사용
다음을 참조

2. 라즈베리안 OS를 업데이트
라즈베리안으로 부팅한 다음, 
반드시 키보드와 언어, 지역을 미국 qwerty 자판과 미국영어로 바꾸어준다.
라즈베리안은 기본으로 영국식 키보드가 되어있어서, # 문자 안 찍힌다. (영국애들의 자존심이란...)

$ sudo apt-get update
$ sudo apt-get dist-upgrade
 위 명령어를 통해서, 최신 라즈베리안으로 업데이트 한다. (시간이 좀 걸린다.)
 
3. GPS 모듈을 장착하기 위해서, Serial Console을 비활성화 한다.
이 과정을 안하고, GPS모듈을 꽂으면, 엄청난 양의 이상한 로그메시지를 콘솔 화면에서 보게 될 것이다.
(이런 것이 생기는 이유는 기본적으로 라즈베리파이가 Serial Console을 지원하는데, 그 연결핀이 GPS 모듈과 동일하게 사용하다보니, Serial Console을 활성화한 상태로 GPS  모듈을 꽂아서 라즈베리파이를 구동하며, 해당핀을 통해서 GPS 모듈의 데이터가 계속 유입되기 때문이다.)

/boot/cmdline.txt 에서 “console=ttyAMA0,115200 kgdboc=ttyAMA0,115200” 부분을 삭제한다.
그리고
/etc/inittab 파일의 제일 뒷 부분에 있는
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
이 부분을 #를 맨 앞에 넣어서 주석처리하여 Disable 상태로 만든다.


여기에 있는 내용을 참고하였다.

3-1. 혹시, 라즈베리파이에 hdmi 모니터,키보드,마우스를 연결해서 작업하는 것이 너무 귀찮아면, ssh 원격접속으로 다 설정할 수 있다. ssh 원격접속을 위한 네트워크 설정 및 ssh 데몬 설정 내용은 다음 링크를 참고하면 된다.

4. GPIO 포트로 들어오는 PPS 신호를 처리하기 위한 설정을 한다.
/boot/cmdline.txt 의 마지막 부분에, 즉 한 라인의 제일 뒷 부분에, 
bcm2708.pps_gpio_pin=18
내용을 추가해준다.

/etc/modules 파일의 마지막 부분에 새로운 라인으로
pps-gpio
를 추가한다.

라즈베리파이를 리부팅한다. sudo poweroff 했다가, GPS 모듈을 꽂고 다시 전원을 켜면 된다.

# dmesg | grep pps 명령으로 부팅과정에서 pps 디바이스를 인식하였는지를 알 수 있다.:

4-1. /etc/motd 파일에 쓰여있는 내용을 다 지운다.

# sudo rm -f /etc/motd
#sudo touch /etc/motd

매번 로그인할 때마다, 귀찮은 문구들이 뜨는 것을 없앨 수 있다.

5. PPS 를 지원하는 ntp 패키지 버전을 받아서, 컴파일 하고 설치한다.
위 링크에 있는 내용을 참고하였다.

다운로드하는 곳은 http://archive.ntp.org/ntp4/
현재 stable 버전은은 ntp-4.2.6p5.tar.gz

$ mkdir ntp                  # make a convenient working directory, if you don't already have one
$ cd ntp                     # enter that directory
$ sudo apt-get install libcap-dev # once-off, required to prevent later file not found error
# Get the desired tarball, current or development - use one of the following:
$ tar xvfz ntp-4.2.6p5.tar.gz
$ cd ntp-4.2.6p5
$ ./configure --enable-linuxcaps # takes 11-15 minutes
$ make # takes 18-25 minutes
$ sudo make install          # puts ntp* in /usr/local/bin/ntp*, takes 30-60 seconds

$ sudo /etc/init.d/ntp stop
$ sudo cp /usr/local/bin/ntp* /usr/bin/
ntp로 시작하는 파일뿐만 아니라, 새로 컴파일된 모든 파일을 복사해야 한다.

apt-get remove ntp를 해야된다고도 하는데, 이건 패키지의 설치파일들을 한번 비교해보면 될 듯~~!

$ sudo /etc/init.d/ntp start
$ ntpq -crv -pn # optional step to check for version and basic function


5. 2014년 12월 30일에 확인한 바로는,

# sudo apt-get dist-upgrade
명령어를 수행하면, ntp패키지가 4.2.6p5+dfsg-2+deb7u1 으로 업그레이드 되어, 별도의 atom pps 지원용의 패키지를 컴파일 하지 않아도 된다. 새로운 ntp 패키지는 atom pps를 지원하고 있다.


6. pps 도구와 gpsd 프로그램들을 받아서 설치하고 테스트해본다.

아래를 참조하였다.

제일 먼저 다음 명령어를 실행하여야 한다.
$ sudo apt-get install pps-tools

그리고, gpsd 관련 프로그램들을 설치한다.
pi@raspberrypi:~$ sudo apt-get install gpsd gpsd-clients python-gps


7. gpsd 데몬을 실행시킨다.
우리가 사용하는 gps 모듈은 디바이스 명칭이 ttyAMA0 이며, 반드시 모듈과의 연동속도를 지정해주어야 한다.
이 제품은 38400 baud rate가  기본 속도이다~!

gpsd가 동작하게 하려면, 반드시
# sudo stty -F /dev/ttyAMA0 38400
명령을 먼저 해줘야 한다.

# sudo gpsd -F /var/run/gpsd.sock /dev/ttyAMA0
 하고, gpsd 데몬을 띄우면


# sudo cgps -s
 명령으로 gps 상태가 잘 동작함을 알 수 있다.
다음과 같은 화면이 출력되어야만, 라즈베리파이와 gps 모듈이 잘 연동되고 있는 것이다.


┌───────────────────────────────────────────┐┌─────────────────────────────────┐
│    Time:       2012-06-18T15:05:10.0Z     ││PRN:   Elev:  Azim:  SNR:  Used: │
│    Latitude:    51.231848 N               ││  14    43    249    40      Y   │
│    Longitude:    0.514014 E               ││  25    75    283    37      Y   │
│    Altitude:   132.3 m                    ││   2    26    085    31      Y   │
│    Speed:      0.0 kph                    ││  12    56    070    18      Y   │
│    Heading:    0.0 deg (true)             ││   9    19    133    22      Y   │
│    Climb:      0.0 m/min                  ││  27    09    133    17      Y   │
│    Status:     3D FIX (1 secs)            ││   4    17    045    31      Y   │
│    GPS Type:                              ││  32    05    321    20      Y   │
│    Longitude Err:   +/- 8 m               ││  29    41    192    18      Y   │
│    Latitude Err:    +/- 9 m               ││  31    28    304    42      Y   │
│    Altitude Err:    +/- 27 m              ││                                 │
│    Course Err:      n/a                   ││                                 │
│    Speed Err:       +/- 68 kph            ││                                 │
│                                           ││                                 │
│                                           ││                                 │
│                                           ││                                 │
│                                           ││                                 │
│                                           ││                                 │
└───────────────────────────────────────────┘└─────────────────────────────────┘


8. 마지막으로 ntp 서버를 설정한다.
 
/etc/ntp.conf 파일을 다음과 같이 수정한다.


driftfile /var/lib/ntp/ntp.drift statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable # Server from shared memory provided by gpsd server 127.127.28.0 minpoll 4 maxpoll 4 fudge 127.127.28.0 time1 0.000 refid GPS # By default, exchange time with everybody, but don't allow configuration. #restrict -4 default kod notrap nomodify nopeer noquery #restrict -6 default kod notrap nomodify nopeer noquery # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 restrict ::1

다음은 IP 접속제한을 풀어내는 disable 설정이다.

#restrict -4 default kod notrap nomodify nopeer noquery

아마도 다음과 같은 내용이 있었을 것인데, 우리는 폐쇄망에 있기 때문에 인터넷의 시간서버 설정을 모두 제거한다.

server 0.debian.pool.ntp.org iburst

server 1.debian.pool.ntp.org iburst server 2.debian.pool.ntp.org iburst server 3.debian.pool.ntp.org iburst

실제로 우리의  GPS 모듈에서 시간을 받아오는 설정은 다음과 같다.

# Server from shared memory provided by gpsd
server 127.127.28.0 minpoll 4 maxpoll 4
fudge  127.127.28.0 time1 0.000 refid GPS

/etc/ntp.conf 파일을 수정하였으면, ntp 데몬을 재시작시킨다.

sudo /etc/init.d/ntp restart


그리고, ntp 서버의 상태를 확인한다.

# sudo ntpq -p -n
위 명령을 수행하며, 다음과 비슷하게 표시되어야 한다.
특히, reach 값은 377 이어야 한다.  377이 되기까지는 어느정도 시간이 걸린다. GPS신호가 꽤 많이 잡히게 되어야 하기 때문이다.

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*127.127.28.0    .GPS.            0 l    7   16  377    0.000   -353.23 15.024

9. 다음의 링크를 참고해서, 열심히 공부하면 시간을 좀더 정확하게  offset 값에 따라서 보정하는 방법을 알 수 있다.


보정이란게, ntp.conf 파일에서 다음 내용의 0.000을 앞에서 offset 값을 써주기만 하면 된다. offset 값은 지리적 위치나 위성의 gps 신호에 따라서 매번 변하기 때문에, 적당한 평균값이나 최소값을 사용해야만 할 것이다.
fudge  127.127.28.0 time1 0.000 refid GPS
10. 미해결 상황
아직 해결하지 못한 문제가 있다.
혹시라도 라즈베리파이가 꺼졌다가 다시 켜거나, 재부팅된 상황이 생긴다면,
반드시 꼭 다음의 명령어를 한번 실행해줘야 한다.
# sudo stty -F /dev/ttyAMA0 38400

gps 모듈의 연동속도를 지정하는 것인데, gpsd 데몬이 실행되기 위한 필수요소이다.

rc.local 파일에 추가하여, 리눅스 부팅시마다 실행되도록 해 보았으나 효과가 없었다.
setserial 패키지를 설치해서 설정을 적용도 시켜봤으나 실패하였다.

아직 왜 그래야 하는지 잘 모르겠으나, 아무튼 위 명령어를 한번 반드시 수행해주지 않으면,
gpsd가 정상적으로 동작하지 않으며, ntpd 데몬이 시간 정보를 가져오지 못하는 결과를 초래한다.

혹시 누군가 해결방법을 안다면 알려주시기 바란다.


Posted by 훅크선장
, |