2016年2月14日日曜日

QNAPにntpdをインストールしてNTPサーバーにしてみた

先日ノートPCを新調したため、旧PCにvSphere Hypervisor 6.0 (= vSphere ESXi)をインストールして仮想環境として利用することにした。その際に、インターネットアクセスをしないESXiや仮想マシンの時刻同期が実施できない問題が発生した。

すべてのサーバーにDNSを設定してインターネット経由で時刻同期するのはセキュリティ面でよろしくない。そこで、内部ネットワーク内にNTPサーバー(ntpdによるNTP Server)を構築することにした。

NTPサーバーは常時稼働している機器がよいのだが、ブロードバンドルーターはNTPサーバーの機能がなかったため、NAS (QNAP TS-112P)をNTPサーバーとして構築することにした。なお、QTS (QNAPの組み込みOS)は4.2.0で実施している。

QNAP TS-112P NTPサーバー構築手順

TS-112P(だけでなく、おそらくQNAPのNAS全般)はNTPクライアントの機能はあるが、NTPサーバーの機能はデフォルトでは実装されていない。そのためNTPサーバーの構築は、GUIだけでなくSSHによるCLIを使った、ちょっと入り組んだ作業が必要となる。

以下に構築手順を記載する。

1. Entwareのインストール

以前はOptwareという名前だったようだが、Entwareという名前に変わっているようだ。これは、NAS上でLinuxベースのパッケージ(ipkgと呼ばれるらしい)をインストールするためのパッケージ管理ツールとなる。ダウンロードは以下URLから。

   URL:http://apps.qnap.community/11-community/10-qnapware
   ダウンロードファイル名:Entware-ng_0.96.qpkg

インストールはNASのGUIにて、「App Center」→「マイアプリ」→「手動でインストール」の画面から行う。数分でインストールは完了する。


2. ntpdのインストール

以下コマンドでntp関連のパッケージを確認してみる。「ntpd - 4.2.8p6-1」が存在するので、これをインストールすればよい。

# /opt/bin/opkg list | grep ntp
-----------------------------
ntp-keygen - 4.2.8p6-1 - The ISC ntp suite is a collection of tools used to synchronize the system clock with remote NTP time servers and run/monitor local NTP servers. . This package contains the ntp-keygen.
ntp-utils - 4.2.8p6-1 - The ISC ntp suite is a collection of tools used to synchronize the system clock with remote NTP time servers and run/monitor local NTP servers. . This package contains ntpdc, ntpq and ntptime.
ntpd - 4.2.8p6-1 - The ISC ntp suite is a collection of tools used to synchronize the system clock with remote NTP time servers and run/monitor local NTP servers. . This package contains the ntpd server.
ntpdate - 4.2.8p6-1 - The ISC ntp suite is a collection of tools used to synchronize the system clock with remote NTP time servers and run/monitor local NTP servers. . This package contains ntpdate.
-----------------------------

以下コマンドでntpdをインストールする。依存関係によって、いくつか関連パッケージもインストールされる。

# /opt/bin/opkg install ntpd
-----------------------------
Installing ntpd (4.2.8p6-1) to root...
Downloading http://pkg.entware.net/binaries/armv5/ntpd_4.2.8p6-1_armv5soft.ipk.
Installing libopenssl (1.0.2f-1) to root...
Downloading http://pkg.entware.net/binaries/armv5/libopenssl_1.0.2f-1_armv5soft.ipk.
Installing zlib (1.2.8-1) to root...
Downloading http://pkg.entware.net/binaries/armv5/zlib_1.2.8-1_armv5soft.ipk.
Installing libcap (2.24-1) to root...
Downloading http://pkg.entware.net/binaries/armv5/libcap_2.24-1_armv5soft.ipk.
Configuring libcap.
Configuring zlib.
Configuring libopenssl.
Configuring ntpd.
-----------------------------

インストール結果を確認する。ntpdが表示されていればOK。

# /opt/bin/opkg list-installed
-----------------------------
entware-opt - 222108-2
findutils - 4.5.14-1
ldconfig - 2.22-2
libc - 2.22-2
libcap - 2.24-1
libgcc - 4.8.5-2
libopenssl - 1.0.2f-1
libpthread - 2.22-2
librt - 2.22-2
libssp - 4.8.5-2
libstdcpp - 4.8.5-2
locales - 2.22-2
ntpd - 4.2.8p6-1
terminfo - 6.0-1
zlib - 1.2.8-1
-----------------------------

インストールされたファイルについても、以下コマンドにて確認できる。

# /opt/bin/opkg files ntpd
-----------------------------
Package ntpd (4.2.8p6-1) is installed on root and has the following files:
/opt/etc/ntp.conf
/opt/sbin/ntpd
/opt/etc/init.d/S77ntpd
/opt/etc/hotplug.d/iface/20-ntpd
-----------------------------

3. /opt/etc/ntp.confの修正

ntp.confを修正する。一般的なntpdと何も変わらないため、以下のような普通のntp.confをviで編集すればよい。今回はNTP同期先として、以下2つを設定した。

   ntp.nict.jp
   ntp.jst.mfeed.ad.jp

ntp.confは以下のように編集した。

-----------------------------
driftfile  /opt/var/spool/ntp/ntp.drift

restrict default ignore
restrict -6 default ignore

restrict 127.0.0.1
restrict -6 ::1

restrict ntp.nict.jp kod nomodify notrap nopeer noquery
restrict ntp.jst.mfeed.ad.jp kod nomodify notrap nopeer noquery
restrict 192.168.33.0 mask 255.255.255.0 kod nomodify notrap nopeer noquery

server ntp.nict.jp iburst true
server ntp.jst.mfeed.ad.jp iburst
-----------------------------

4. 起動スクリプトの確認

ntp.confの設定が終われば後は起動させればよい。起動用のスクリプトは以下ディレクトリに保存されている。

/opt/etc/init.d/S77ntpd

このファイルの修正は不要だが、一応中身を確認してみる。

# cat /opt/etc/init.d/S77ntpd
-----------------------------
#!/bin/sh

ENABLED=yes
PROCS=ntpd
ARGS="-c /opt/etc/ntp.conf -f /opt/var/spool/ntp/ntp.drift -s /opt/var/spool/ntp -k /opt/etc/ntp -l /opt/var/spool/ntp/ntp.log"
PREARGS=""
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

. /opt/etc/init.d/rc.func
-----------------------------

共通のrc.funcというスクリプトに変数を渡してntpdを起動する仕組みなっている。rc.func内のstart()関数を確認すると、以下コマンドでサービス実行を行う作りになっていることがわかる。

$PREARGS $PROC $ARGS > /dev/null 2>&1 &

したがって、ntpdの場合は以下コマンドにて起動することになる。

ntpd -c /opt/etc/ntp.conf -f /opt/var/spool/ntp/ntp.drift -s /opt/var/spool/ntp -k /opt/etc/ntp -l /opt/var/spool/ntp/ntp.log

※オプションの説明
-c : 設定ファイルの指定
-f : driftファイルの指定
-s : 統計情報の保存先ディレクトリを指定
-k : NTP認証キーファイルの指定(今回は未使用)
-l : ログの出力先ファイルの指定

5. ntpd起動

起動スクリプトを用いてntpdを起動させる。

# /opt/etc/init.d/S77ntpd start
-----------------------------
 Starting ntpd...              done.
-----------------------------

起動後に同期状況を確認する。右側に*が付いている行があれば、同期成功。

# ntpq -p
-----------------------------
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp3.jst.mfeed. 133.243.236.17   2 u    -   64    1   33.206   -0.580   2.465
*ntp-a3.nict.go. .NICT.           1 u    1   64    1   39.792   -3.131   1.182
-----------------------------

なお当方の環境では、なぜかクライアントからNASに対して時刻同期すると失敗したので、一度ntpdの再起動を実施した。

# /opt/etc/init.d/S77ntpd restart
-----------------------------
 Shutting down ntpd...              done.
 Starting ntpd...              done.
-----------------------------

6. ntpクライアントからの同期確認

WindowsからNASに対して時刻同期を実施してみると、以下の通り正常にNASと同期した。


Linuxも同様に成功。

# ntpq -p
-----------------------------
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*192.168.33.3    133.243.238.164  2 u    1   64    1    0.144    1.795   0.051
-----------------------------

7. (参考情報)NAS再起動時の自動起動設定

結論から言うと、特に設定は不要。NASの再起動時に自動でntpdは起動する。

どこに起動設定が入っているか確認してみると、Entwareの起動スクリプト内に組み込まれていることがわかったので、参考までに記載する。

# cat /etc/rcS.d/QS106Entware-ng
-----------------------------
~ 略 ~

case "$1" in
  start)

~ 略 ~

  /bin/echo "Enable Entware-ng/opkg"
        # sym-link $QPKG_DIR to /opt
        /bin/rm -rf /opt
        /bin/ln -sf $QPKG_DIR /opt
        # adding opkg apps into system path ...
        /bin/cat /root/.profile | /bin/grep "source" 1>>/dev/null 2>>/dev/null
        [ $? -ne 0 ] && /bin/echo "source /opt/etc/profile" >> /root/.profile
        # startup Entware-ng services
        /opt/etc/init.d/rc.unslung start
    ;;

~ 略 ~
-----------------------------

内部でrc.unslungというスクリプトを呼び出していることがわかるので、さらに内容を確認してみると、/opt/etc/init.d内の起動スクリプトに対して起動処理を実施していることがわかる。

# cat /opt/etc/init.d/rc.unslung
-----------------------------
~ 略 ~

for i in $(/opt/bin/find /opt/etc/init.d/ -perm '-u+x' -name 'S*' | sort $ORDER ) ;
do
    case "$i" in
        S* | *.sh )
            # Source shell script for speed.
            trap "" INT QUIT TSTP EXIT
            #set $1
            #echo "trying $i" >> /tmp/rc.log
            . $i $ACTION $CALLER
            ;;

~ 略 ~
-----------------------------

参考URL

Optware IPKG

Install Optware IPKG