Raspberry PiでGPSによるNTPサーバを立てる(2016/04)
by eibow

はじめに

最近、Raspberry Pi 2を買いました。買ったとたんにRaspberry Pi 3が発売
されました。 残念 。

で、いままでの用途にRaspberry Pi(以下Raspi)は不要となったので、これで
新しいNTPサーバを、構築することにしました。

これまでNTPサーバは電波時計から時刻信号をもらって配信してました。
でも電波受信が不安定で、頻繁に電波時計とNTPサーバの同期がとれない
状態がありました。

そこで、自作GPSレシーバ(秋月で扱っていたGT-740FをUSB接続できるように
したもの)をRaspiに接続して窓際で動作させることにしました。このGPSレシーバ
は室内でも余裕で受信できますが、最近の製品では当たり前かもしれません。

自作GPSケース


OSは最新の、Raspbian Jessie (2016-03-18)を使いました。


構築方法

まず[Raspbian]最新版をSDカードにコピーして[Raspi]に差込み電源を投入します。
この作業の詳細は省略します。

[Raspbian]の[X-window]が立ち上がったら、端末を起動します。以下、端末での
作業です。
まず、OSを最新にアップデートします。次に、必要なソフトウェアを導入します。
最後に[Raspi]を再起動します。

 $ sudo apt-get update
 $ sudo apt-get upgrade
 $ sudo rpi-update
 $ sudo apt-get install gpsd gpsd-clients python-gps ntp
 $ sudo shutdown -r now



IPアドレスの固定

サーバなので、ここでIPアドレスを固定しておきます。
[/etc/dhcpcd.conf]ファイルの最後に以下の設定を追加します。
例では、
固定IP:192.168.0.100
ゲートウェイ:192.168.0.1
ネームサーバ:192.168.0.1

に設定しています。各自の環境に合わせて替えて下さい。
ゲートウェイとネームサーバのIPは通信会社のレンタル機器のIPにしておけば
いいでしょう。

 $ sudo nano /etc/dhcpcd.conf
 --------------------------------------------------------------------
     ・
    省略
     ・
     ・
 interface eth0
 static ip_address=192.168.0.100
 static routers=192.168.0.1
 static domain_name_servers=192.168.0.1
 --------------------------------------------------------------------


設定を変更したら、これを反映させるために一度[Raspi]を再起動します。
がその前に、これ以後は端末から操作しますので[Raspberry Pi Configuration]
画面で以下の操作をします。

(1)[System]タブのBootを[To CLI]へ変更
(2)[Interfaces]タブのSSHとSerialが[Enabled]であることを確認
(3)[OK]ボタンをクリック。

 $ sudo shutdown -r now


パソコンの端末ソフトを起動し、以下の操作で[Raspi]とSSHで接続します。
(注:Linuxの場合の操作です)

 $ ssh このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。
 このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。's password:■■■■
 The programs included with the Debian GNU/Linux system are free software;
 the exact distribution terms for each program are described in the
 individual files in /usr/share/doc/*/copyright.

 Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
 permitted by applicable law.
 Last login: Fri Apr 1 11:11:10 2016 from 192.168.0.10
 pi@raspberrypi:~ $



gpsd のセットアップ

USB ポートに GPS レシーバーを接続し、コマンドlsusb を使って認識されて
いるか確認します。以下の例では
Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
という行が GPS になります。
USBに他のシリアル系のものを接続しなければ /dev/ttyUSB0 として認識
されているはずです。

 $ lsusb
 Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
 Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
           SMSC9512/9514 Fast Ethernet Adapter
 Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. LAN9500
           Ethernet 10/100 Adapter / SMSC9512/9514 Hub
 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 $ ls -l /dev/ttyUSB0
 crw-rw---- 1 root dialout 188, 0 3月 25 22:54 /dev/ttyUSB0

 

実際の画面1



gpsd を起動する前に設定ファイルを以下のように編集しておきます。

 $ sudo nano /etc/default/gpsd
 --------------------------------------------------------------------
 # Default settings for the gpsd init script and the hotplug wrapper.
 # Start the gpsd daemon automatically at boot time
 START_DAEMON="true"
 # Use USB hotplugging to add new USB devices automatically to the daemon
 USBAUTO="true"
 # Devices gpsd should collect to at boot time.
 # They need to be read/writeable, either by user gpsd or the group dialout.
 DEVICES="/dev/ttyUSB0"
 # Other options you want to pass to gpsd
 GPSD_OPTIONS="-F /var/run/gpsd.sock -b -n"
 --------------------------------------------------------------------


編集が終わったら、サービスの有効化と起動を行います。
起動していることも確認します。

 $ sudo systemctl enable gpsd
 $ sudo systemctl start gpsd
 $ sudo systemctl status gpsd
 ● gpsd.service - GPS (Global Positioning System) Daemon
  Loaded: loaded (/lib/systemd/system/gpsd.service; static)
  Active: active (running) since 金 2016-03-25 22:54:41 JST; 1 weeks 6 days ago
 Main PID: 611 (gpsd)
  CGroup: /system.slice/gpsd.service
       └─611 /usr/sbin/gpsd -N -F /var/run/gpsd.sock -b -n /dev/ttyUSB0



正常にGPSが稼働していて、きちんとgpsdが動作していれば、[cgps -s]を使って
現在時刻や現在地の緯度経度などの情報が表示されます。

$ cgps -s

実際の画面2



NTPd の設定

最後に、GPSと時刻同期するようにNTPを設定すれば完了です。
設定ファイルは以下のようにしています。

 $ nano /etc/ntp.conf
 --------------------------------------------------------------------
 # /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

 driftfile /var/lib/ntp/ntp.drift


 # Enable this if you want statistics to be logged.
 #statsdir /var/log/ntpstats/

 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


 # You do need to talk to an NTP server or two (or three).
 #server ntp.your-provider.example

 # pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will
 # pick a different set every time it starts up. Please consider joining the
 #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



 # Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
 # details. The web page <http://support.ntp.org/bin/view/Support/AccessRestric$
 # might also be helpful.
 #
 # Note that "restrict" applies to both servers and clients, so a configuration
 # that might be intended to block requests from certain clients could also end
 # up blocking replies from your own upstream servers.

 # 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

 # Clients from this (example!) subnet have unlimited access, but only if
 # cryptographically authenticated.
 #restrict 192.168.123.0 mask 255.255.255.0 notrust


 # If you want to provide time to your local subnet, change the next line.
 # (Again, the address is an example only.)
 #broadcast 192.168.123.255

 # If you want to listen to time broadcasts on your local subnet, de-comment the
 # next lines. Please do this only if you trust everybody on the network!
 #disable auth
 #broadcastclient

 # gps ntp
 server 127.127.28.0 minpoll 4 maxpoll 4
 fudge 127.127.28.0 time1 0.490 refid GPS stratum 15
 server ntp.nict.jp iburst

 --------------------------------------------------------------------



編集が終わったら、サービスの有効化と起動を行い、起動しているかどうか
確認します。

 $ sudo systemctl enable ntp
 $ sudo systemctl start ntp
 $ sudo systemctl status ntp
● ntp.service - LSB: Start NTP daemon
 Loaded: loaded (/etc/init.d/ntp)
 Active: active (running) since 日 2016-04-10 13:08:15 JST; 45min ago
 CGroup: /system.slice/ntp.service
      └─732 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 106:111

 4月 10 13:08:15 raspberrypi ntpd[732]: Listen and drop on 0 v4wildcard 0.0...3
 4月 10 13:08:15 raspberrypi ntpd[732]: Listen and drop on 1 v6wildcard :: ...3
 4月 10 13:08:16 raspberrypi ntpd[732]: Listen normally on 2 lo 127.0.0.1 U...3
 4月 10 13:08:16 raspberrypi ntpd[732]: Listen normally on 3 eth0 192.168.0...3
 4月 10 13:08:16 raspberrypi ntpd[732]: Listen normally on 4 lo ::1 UDP 123
 4月 10 13:08:16 raspberrypi ntpd[732]: Listen normally on 5 eth0 2001:a59a...3
 4月 10 13:08:16 raspberrypi ntpd[732]: Listen normally on 6 eth0 fe80::c2f...3
 4月 10 13:08:16 raspberrypi ntpd[732]: peers refreshed
 4月 10 13:08:16 raspberrypi ntpd[732]: Listening on routing socket on fd #...s
 4月 10 13:53:36 raspberrypi systemd[1]: Started LSB: Start NTP daemon.


しばらく待ってから ntpq コマンドで同期の状態を確認しておきます。

実際の画面3



WindowsPCからNTPサーバと同期を取る方法

まず「コントロールパネル」→「日付と時刻の設定」を起動します。
次に「インターネット時刻」タブをクリックし、「設定の変更」をクリックします。

実際の画面4


サーバー欄にIPアドレスを入力し、「今すぐ更新」をクリックします。
同期に成功するとその旨のメッセージが表示されます。「OK」をクリックして完了です。
以後は定期的にNTPサーバと同期して時刻を合わせます。

実際の画面5


以上