タスクスケジューラを使う(1)~DiskStation DS218j

DDNS関係, Synology DiskStation DS218j, YAMAHA NVR500DDNS, DSM, MyDNS, NAS, Synology, システム管理, 落雷

NOMIは自宅にいなかったのでカミさんの言葉を信じるしかないのですが、

「家にカミナリが落ちてテレビのあたりでなんかバチッていったよー。もう死んだと思ったー。」

生きてるやん、という突っ込みはともかく、カミさんの代わりに我が家のルーターYAMAHA NVR500のLANポートの2番が死んでました。微妙な死に方ですね。どう壊れたのかはわかりませんが、エラーが出るでもなく、ケーブルを挿しても全く無反応で、最初からその2番コネクタは存在しなかったかのような感じの壊れ方です。

まあとりあえずは2番コネクタさえ使わなければ支障はないのですが、もしも落雷による異常電流が故障の原因だとしたら、そのうち他の部分も壊れてしまうかもしれません。

というわけで、ブリッジモードで使っていたNECのWi-FiアクセスポイントWG1200HSをルーターモードに変えて、大急ぎでPPPoE設定やらポートマッピング設定やらをやって、動作確認をして設定を保存。これでNVR500が壊れてもインターネット接続だけは担保できるようになりました。

NVR500とWG1200HS|タスクスケジューラを使う~DiskStation DS218j

ちなみに下がNVR500、上がWG1200HSです(埃っぽくてすみません)。

とはいうものの、ルーターの機能も性能も、WG1200HSはNVR500には全く太刀打ちできないわけで、自宅のSynology DiskStation DS218jからホームページを配信するという仕事だけでもWG1200HSには相当重荷ではあります。

WG1200HSはトラブルもほとんどなく、優秀なWi-Fiアクセスポイントなのですが、そこは専門外ということでしょうね、

また、NOMI宅のルーターをNVR500からWG1200HSに変更した場合、NVR500ではできるのにHG1200HSではできないことがいくつかあります。

  • 静的DNSレコードの登録

LAN内から自宅公開Webサーバーにアクセスする方法】でも説明した通り、自宅内のLANにある公開サーバーに最も簡単に接続する手段が、ルーターに静的DNSレコードを書いてあげることです。

NVR500では単純に、

ip host wwq.mydns.jp 192.168.77.201

と書いてあげるだけで良いのですが、WG1200HSにはそういう設定はできません。パソコンならhostsへの追記で対応できますがスマホはそうはいかないので困ったものですが、Synology DiskStation DS218jでDNSサーバーを動かせば問題は解決します。

  • DHCPサーバー

WG1200HSが実装しているDHCPサーバー機能では、ゲートウェイと参照DNSを任意に設定することができないようです。ゲートウェイはともかく、WG1200HSをDHCPサーバーとしてLAN内のパソコンやスマホに接続情報を割り当てようとすると、参照DNSサーバーはWG1200HS自身になってしまうようです。そうすると、せっかくDS218jでDNSサーバーを稼働させてLAN内公開サーバー問題を解決しても、パソコンやスマホがDS218jのDNSサーバーを参照することができません。ですが、WG1200HSのDHCPサーバーを停止することは可能なので、その代わりにDS218jのDHCPサーバーを動かせば問題は解決します。

  • ルーター独自のダイナミックDNS

当然のことですがルーターのメーカーYAMAHAのDDNSサービス「ネットボランチ」が使えなくなります。が、DS218が実装しているDDNSサービスを既に使っていますので、使えなくなっても特に困ることはないでしょう。

と、ここまではWG1200HSの弱点をすべてDS218jが肩代わりしてくれるようです。DS218j様様ですね。

しかしまだ問題があります。

  • ダイナミックDNSサービス"MyDNS"へのIPアドレス通知

現在はNVR500のLuaスクリプトを使って通知しています。

WG1200HSにはそれに代わる仕組みがありません。ここをどうにかしないとこのサイトの運営ができなくなってしまいますが、DS218jを使ってMyDNSへIPアドレスを通知する方法が見つかれば問題解決です。

というわけでここからが本題です。お待たせしました。

DSMにはメーカーのSynology社が提供しているDDNSの他に、著名なDDNSの通知機能に対応しています。

DS218jがサポートするDDNS|タスクスケジューラを使う~DiskStation DS218j

ところが残念なことにNOMIが利用させていただいているMyDNSには対応していないようです。

自宅サーバーやVPSに使える無料のダイナミックDNS (Dynamic DNS) | MyDNS.JP

日本では結構メジャーなサービスだと思うのですが、Synology社から見たらローカルサービスの一つに過ぎない、ということでしょう。

とはいえ、そもそもDDNSサービスへの通知は専用ツールなど使わないでも良いのが普通です。特にMyDNSは、通知方法の選択肢が多く、ユーザーが色々な方法を工夫して対応している、という感じです。利用者が多いのでネット上の情報も豊富です。

MyDNSのIP通知設定|タスクスケジューラを使う~DiskStation DS218j

https://www.mydns.jp/?MENU=030

例えばメールクライアントを立ち上げといて一定時間ごとに受信要求するとか、そういう単純な方法でも良いのがありがたいサービスですね。

UNIX系のOSで自宅サーバーをやっている人が良く使うのが、wgetコマンドを作ったスクリプトを書いてcrontabで定期的にHTTPで認証を行う、というヤツです。

GNU Wget

GNU Wget(あるいは単に Wget)はウェブサーバからコンテンツを取得するダウンローダであり、GNUプロジェクトの一部である。その名称はワールド・ワイド・ウェブ(WWW)とプログラムの主要な機能であるデータ取得を意味する英語の「getゲット」から派生したものである。現在Wgetはウェブ閲覧のために用いられるTCP/IPに基づいたもっともポピュラーなプロトコルである、HTTPHTTPS及びFTP によるダウンロードが利用可能である。

crontab

crontabクロンタブ、あるいはクローンタブ、クーロンタブとも)コマンドはUnix系オペレーティングシステム (OS) において、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。標準入力からコマンド列を読み取り、crontabと呼ばれるファイルにそれを記録する。この記録を元に定時になると、その命令内容を読み取り、実行が行われる。cronという名称はギリシア語のクロノス (χρόνος) に由来するという説がある(Command Run ON の略という説も)。日本語ではクーロンという読みが慣習的に広く用いられているが、英語では通常クロンまたはクローンと発音する[1]

出典:ウィキペディア

wgetもcrontabもほとんどのUNIX系ディストリビューションに標準でインストールされていますからとても都合がよいわけで、公式サイトにも設定方法が載っています。

https://www.mydns.jp/?MENU=040

もちろん、ネットを調べると実施例は山ほど出てきます。

要はこれをDSMでやれるようにしてしまえば良いわけですが、DSMでは「タスクスケジューラ」という形でcrontabの機能を使えるようになっています。

では設定です。

DSMにログインして[コントロールパネル]を開きます。

タスクスケジューラを開く|タスクスケジューラを使う~DiskStation DS218j

「タスクスケジューラ」を開きます。

既定のタスクリスト|タスクスケジューラを使う~DiskStation DS218j

ここの設定の実体が本当にcrontabなのかどうかは、コンソールからログインして"/etc/ctontab"の記述を見てみるとわかります。

既定のcrontab|タスクスケジューラを使う~DiskStation DS218j

内容を照合してみると、「タスクスケジューラ」の一項目目の「DSM自動更新」がcrontabの、

15 1 * * 2,5 root /usr/syno/bin/synoschedtask –run id=2

「タスクスケジューラ」の二項目目の「S.M.A.R.T.テスト」が

0 0 9 * * root /usr/syno/bin/synoschedtask –run id=1

と一致しています。残る一項目、

0 0 1 * * root /usr/syno/bin/syno_disk_health_record

は該当する項目が「タスクスケジューラ」にはありませんが、crontabに記述されている実行スケジュールが「毎月1日の0:00に実行」ですから答えは簡単、

DS218jの健康レポート|タスクスケジューラを使う~DiskStation DS218j

[ストレージマネージャ]から毎月一日に送られてくるレポート【DSMの健康状態月次レポート~DiskStation DS218j】のための実行スケジュールの記述ですね。

さて、crontabの記述方法を知っていればコンソールから設定をタイピングしても良いのですが、GUIからの設定が基本のシステムはできるだけGUIの流儀に従ったほうがトラブルが少ないので、ここははやる気持ちを抑えてGUIから設定を行います。

まず、MyDNSの公式サイトの記述例を見ると、

# cat > /etc/cron.every5min/mydns
#!/bin/sh
#
# TEST1.MYDNS.JP
/usr/bin/wget -O – 'http(s)://mydns111111:tp5YgZv4@www.mydns.jp/login.html'
#
#
# TEST2.0am.JP
/usr/bin/wget -O – 'http(s)://mydns222222:Ex8ZVkm7@www.mydns.jp/login.html'
#
#
# TEST3.0T0.JP
/usr/bin/wget -O – 'http(s)://mydns333333:QC6L2SF8@www.mydns.jp/login.html'

となっていますので、リクエストがひとつなら、

/usr/bin/wget -O – 'https://mydns[MyDNSのマスターID]:[MyDNSのパスワード]@www.mydns.jp/login.html'

の一行で済みます。つまりDSMでwgetコマンドだけ使えれば良いわけですが、DSMの中を実際に調べてみると、

wgetのパスを表示|タスクスケジューラを使う~DiskStation DS218j

と、DSMの場合パスは記述例と異なり"/bin/wget"であることがわかりますので、記述すべきコマンドラインは、

/bin/wget -O – 'https://mydns[MyDNSのマスターID]:[MyDNSのパスワード]@www.mydns.jp/login.html'

となります。

DSMの「タスクスケジューラ」に戻って、

タスクを作成|タスクスケジューラを使う~DiskStation DS218j

「作成」→「予約タスク」→「ユーザー指定のスクリプト」と開きます。

タスク[全般]|タスクスケジューラを使う~DiskStation DS218j

[タスク:]には自分でわかるように名称を(日本語は使えないようです)、[ユーザー:]はタスクを実行するユーザーアカウントですが、デフォルトの"root"のまま、「有効」にチェックを入れて隣の「スケジュール」タブを開きます。

タスク[スケジュール]|タスクスケジューラを使う~DiskStation DS218j

IPアドレス通知の時間間隔については、MyDNSの記述例に従えば5分で良さそうですが、あまり頻繁にやって負荷を増やすのも申し訳ないので10分間隔にします。

[次の期間実行]で「毎日」を選択し、[初回実行時刻:]を"00″、[スケジュールサイクル:]を"10分ごと"、[最終実行時刻:]を"23:50″に設定します。これで「毎日00:00にスタートして10分おきに23:50まで実行。」となります。

隣の「タスク設定」を開きます。

タスク[タスクの設定]|タスクスケジューラを使う~DiskStation DS218j

「Eメールで詳細な実行情報を送信」にチェックを入れ、「Eメール:」にメールアドレスを指定しておくと、タスクが実行されるごとに結果がメールで送られてきます。すると10分毎にメールが送られてきますが、「スクリプトが異常終了した場合にのみ実行情報を送信」にもチェックを入れておくと、wgetがエラーで終了した場合などに限定してメールが送られてくるようになります。

10分毎に同じ内容のメールが送られてくると相当にうざったいので、動作確認が終わったら「スクリプトが異常終了した場合にのみ実行情報を送信」にチェックを入れるようにすると良いです。

そして[ユーザー指定のスクリプト]の欄に

/bin/wget -O – 'https://mydns[MyDNSのマスターID]:[MyDNSのパスワード]@www.mydns.jp/login.html'

を記述し、「OK」をクリックして設定を保存します。

タスクの実行1|タスクスケジューラを使う~DiskStation DS218j

設定が追加されました。これで10分おきに自動実行されますが、タスクを選択して「実行」をクリックすると、

タスクの実行2|タスクスケジューラを使う~DiskStation DS218j

実行時刻を待たずにタスクを実行してみることができます。

先の「タスク設定」タブでメール送信を有効にし、「スクリプトが異常終了した場合にのみ実行情報を送信」にチェックを入れなければ、タスクが正常に実行されていても、

実行完了メール|タスクスケジューラを使う~DiskStation DS218j

こういうメールが送信されてきます。

また、「設定」をクリックし、

出力結果を保存|タスクスケジューラを使う~DiskStation DS218j

[保存先:]を指定して[出力結果を保存]にチェックを入れて「OK」をクリックすると、指定したフォルダにタスクの実行結果を保存することができます。

出力結果1|タスクスケジューラを使う~DiskStation DS218j

実行結果はタスクのID番号(後述)のフォルダの下に、タスクが実行されたときのUNIX時間でそのままフォルダが作られ、

UNIX時間

UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数(すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの)として表される。GPS時刻などとは異なり、大多数のシステムでは、本当の経過秒数を表すものではない[1]

出典:ウィキペディア

フォルダの中に、

出力結果2|タスクスケジューラを使う~DiskStation DS218j

実行したスクリプトと実行結果の標準出力がテキストファイルで保管されます。

この状態で"/etc/crontab"の記述はどうなっているかというと、

と、crontabの記述ルールに変換されてきちんと設定されていました。出力結果の保存先のフォルダ名(タスクのID番号)はここの"id=3″で確認することができます。

とりあえずMyDNSへのIPアドレス通知設定はこれで完了です。

ただし、まだNVR500は壊れてはいませんので、

タスク停止|タスクスケジューラを使う~DiskStation DS218j

と、作成したタスクを無効化しておき、必要な時に稼働させるようにしておきます。

大事なのは転ばぬ先の杖、ですね。