ラズパイの時刻を合わせて自動起動する

Raspberry Pi (RasPi) を電源に接続して常時稼働させ続けていると、時計の時刻がズレていたり、USB接続している外部デバイスを読み込めなくなっていることがあります。

そんな時は標準時刻サーバの公開 NTP(Network Time Protocol)に時刻を問合せて、定期的に RasPi の再起動を実行すれば問題が解決することがあります。

日本標準時 (JST) に関しては NICT(ニクト)こと国立研究開発法人情報通信研究機構という国立研究機関が配信を行っていますので、こちらに問合せを行えば大丈夫です。

香港時間なら香港天文台、中央ヨーロッパ時間なら PTB という物理工学研究所といった具合に標準時刻サーバは複数ありますので必要に応じて書き換えてください。

まずは実行環境から

$ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

Debian 派生の Raspbian GNU/Linux 10 では時刻同期にシステムサービス systemd-timesyncd を使用します。これを用いるためにはエディタを使って /etc/systemd/timesyncd.conf を開き、

#NTP=

と書かれている行のコメントアウトを削除して ntp.nict.jp のアドレスを書き込みます。

$ vim /etc/systemd/timesyncd.conf 
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
NTP=ntp.nict.jp 
#FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

FallbackNTP は NTP が定義されている場合には無視されますので気にしなくて結構です。

設定ファイルを書き換えましたらシステムサービスの NTP 機能を有効化して、状態を表示します。

$ sudo timedatectl set-ntp true
$ sudo timedatectl status
               Local time: Sat 2020-09-05 23:24:53 CDT
           Universal time: Sun 2020-09-06 04:24:53 UTC
                 RTC time: n/a
                Time zone: America/Chicago (CDT, -0500)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

ステータス表示 NTP service: active になっていれば、NTP 機能が稼働しています。




ただ、私の環境ではタイムゾーンがおかしなことになっているので、こちらも変更しておきます。

$ sudo cp /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime

準備が整いましたら設定を反映させるためにシステムサービスを再起動して、ステータスを表示します。

$ sudo systemctl restart systemd-timesyncd.service
$ sudo systemctl status systemd-timesyncd.service
\u25cf systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vend
  Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
           \u2514\u2500disable-with-time-daemon.conf
   Active: active (running) since Sun 2020-09-06 12:45:38 HKT; 11s ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 22048 (systemd-timesyn)
   Status: "Synchronized to time server for the first time [2001:df0:232:eea0::fff4]:123 (ntp.nict.jp)."
   Memory: 856.0K
   CGroup: /system.slice/systemd-timesyncd.service
           \u2514\u250022048 /lib/systemd/systemd-timesyncd

以下のようにNICT サーバに接続できていることが表示されれば成功です。

“Synchronized to time server for the first time [2001:df0:232:eea0::fff4]:123 (ntp.nict.jp).”

もし以下の例のように NICT 以外のサーバに接続している場合には、設定内容に誤りがあるか、設定が反映されていない場合がありますので見直しを行ってください。

Status: “Synchronized to time server for the first time 194.0.5.123:123 (0.debian.pool.ntp.org).”

また、ネットワークに接続できない環境で Ras Pi をお使いの場合には、以下のコマンドで手動で時刻合わせを行うことも可能です。

$ date +%T -s "13:00:00"

時刻合わせが完了しましたら、あとは再起動しても問題ない時間に reboot するように cron を設定しておけば、毎日、決まった時間にシステムを停止して再起動を行うようにできます。

$ sudo crontab -e

# m h  dom mon dow   command
0 0 * * * /sbin/reboot

こうしておけば、より長時間安定して稼働し続けることが期待できるはずです。

ラズパイでサーバ・データのバックアップを取る

Raspberry Pi (RasPi) を使ってリモートサーバ上にあるバックアップファイルを定期的に取得し、それを手元にある適当なハードディスクに自動的に保存していくことを考えます。

手順は (a) リモートサーバ から SCP を使ってローカルの RasPi にファイルを転送し、(b) それを RasPi にマウントした外付けHDDに保存するの2つです。

実行環境は下記のとおりです。

ハードウェア OS version/フォーマット形式
Raspberry Pi Zero W V1.1 Raspbian GNU/Linux 10 (buster)
サーバ Ubuntu 18.04.2 LTS
ハードディスク I-O Data 1TB NTFS

キーボード操作を多用しますので、あらかじめVNCクライアントなどで外部操作できるように設定されることをお勧めします。こちらの記事などを参考にされてください。

(1) RasPiで公開鍵認証

RasPi からリモートサーバに接続するための鍵を作成します。初期状態の RasPi には鍵置き場の ~/.ssh ディレクトリがありませんので、まずはターミナルを開いてこれを作ります。

$ ls -la ~/.ssh
$ mkdir ~/.ssh 
$ chmod 700 ~/.ssh
$ cd ~/.ssh

ssh-keygen で秘密鍵と公開鍵を作成します。パスワードは今回は不要なのでエンターキーを押して先に進みます。

$ ssh-keygen -t rsa -b 4096 
Generating public/private rsa key pair. 
Enter file in which to save the key (/home/raspi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):

鍵が作成されていることを確認し、公開鍵の内容をコピペします。

$ ls
id_rsa  id_rsa.pub

$ cat id_rsa.pub | xsel --clipboard --input

Chromium ブラウザを開いて契約しているサーバのコンソールにアクセスし、この一時保存された文字列を公開鍵の入力欄に貼り付けます。

もしくはサーバの設定を一時的に変更して、パスワード認証を解禁し、ファイルを直接的にサーバに転送してしまいます。

$ scp -P 2222 id_rsa.pub foo@example.com:~/.ssh/authorized_keys

※このコマンドを実行するとサーバにある authorized_keys ファイルが上書きされるので注意してください。

公開鍵の設定が終わったら、公開鍵暗号を使用して実際に RasPi からサーバにアクセスしてみます。

$ ssh -p 2222 foo@example.com 

無事にアクセスできれば、準備は完了です。




(2) ハードディスクのマウント設定

USB ケーブルによって接続されたハードディスクに RasPi のデータを保存するために、常に指定された場所にディスクをマウントするように設定を書き足します。

まずはハードディスクを USB ケーブルで接続してデバイス情報を取得します。

$ sudo fdisk -l
...

Disk /dev/sda1: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: HDPC-UT         
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa7aa12ba

Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1           2 1953525167 1953525166 931.5G  7 HPFS/NTFS/exFAT

Disk /dev/sda1 が該当デバイスだと分かったので、このデバイスの属性を表示します。

$ sudo blkid /dev/sda1
/dev/sda1: LABEL="BACKUP-DISK" UUID="3334818A5A078A71" TYPE="ntfs" PTTYPE="dos" PARTUUID="a7aa12ba-01"

ハードディスクの固有番号(UUID)が得られますので、これを指定の場所(ここでは disk01)にマウントできるように設定ファイルに追記します。設定ファイルを書き換えて保存したら、設定を反映させるために RasPi を再起動します。

$ sudo vi /etc/fstab
UUID="3334818A5A078A71" /mnt/disk01 ntfs-3g defaults,nofail 0       0

$ sudo mkdir /mnt/disk01
$ sudo reboot

ハードディスクを接続したまま再起動を行うと、/mnt/disk01 にハードディスクがマウントされているはずです。

ここに定期的にファイルを保存するための dump というディレクトリを作成しておきます。

$ mkdir /mnt/disk01/dump/




(3) cron による定時実行

ここまでで RasPi からリモートサーバに接続し、バックアップファイルを取得し、外付けハードディスクに保存できるようになっています。

そこで実際にサーバからファイルを取得してハードディスクに保存してみます。

$ scp -P 2222 foo@example.com:/var/dump/* /mnt/disk01/dump

これが実行できていれば、あとはこの作業を定期的に自動で繰り返せば良いわけです。その準備のために、まずは root ユーザにパスワードを設定してシスログデーモンの設定を行います。

ここでやらなくても良いのですが、初期状態の RasPi には root パスワードが設定されておらず、そろそろ不便に思えてきたので今やります。

$ sudo passwd root
$ sudo vi /etc/rsyslog.conf

/etc/rsyslog.conf を開くと #cron.* /var/log/cron.log という記述がありますので、文頭の # を削除してファイルを保存したのち rsyslog を再起動します。

$ sudo /etc/init.d/rsyslog restart

この設定を行うことで cron のログが /var/log/cron.log に出力されるようになります。シスログの設定ができましたら、次は cron そのものの設定です。

$ sudo vi /etc/default/cron

...
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
#EXTRA_OPTS=""

ここで重要となるのは EXTRA_OPTS=”” の設定です。-L の引数のあとに指定する数字で出力するログ内容を選択できます。何も出力しない場合は 0, 全てを出力する場合は 15 (0+1+2+4+8=15) といった具合に設定する数字によって出力内容が選択されます。

取りあえずは動作確認のために EXTRA_OPTS=”-L 15″ を設定してファイルを上書き保存します。そして設定を反映するために cron を再起動して、crontab に先ほどファイル保存に使用したコマンドを記載します。

$ sudo /etc/init.d/cron restart
$ crontab -e

# m h  dom mon dow   command
5 7-19 * * 1-6	scp -P 2222 foo@example.com:/var/dump/*.zip /mnt/disk01/dump/

これで RasPi をUSB充電器につないで常時稼働させておけば、定期的にリモートサーバからファイルを取得してローカルのハードディスクに保存し続けます。

Raspberry Pi Zero W は格安で購入できるので、中途半端な容量のハードディスクを再利用するのに良いかも知れません。


Raspberry Pi Zero W – ラズベリー・パイ ゼロ W ワイヤレス

Interface はアイデアと知識に溢れた刺激的な月刊誌

隆盛を極める WEB 広告業とは対照的に雑誌の発行数は10年単位で減少傾向にあります。私自身も出版言語を問わず、ながらく自分で雑誌を購入したことはありませんでしたし、誰が購入しているのかについては検討もつきませんでした。

それが現在、毎月の掲載内容を確認するぐらいには注目している雑誌があります。それは CQ 出版の Interface (インターフェース) です。

Interface 誌の立ち位置は絶妙で、『ドローンやセンサを用いた農業』のようにウェブ上にはニュースサイトしか記事がないようなテーマについて、読者が市販品で記事内容を再現できる程度の身近さをもって取り扱っていることです。

新聞記事に比較すると内容的に深く、学術論文と比較すると理論や新規性ではなく実践や実用性を重視しており、書籍と比べると取り扱う対象分野が新しく、専門書が一冊も出ていないようなものが多いという唯一性があります。


Interface(インターフェース) 2020年 03 月号

その反面、月刊誌でありながら特集ごとに掲載内容は大きく変化しますので、一部の連続記事を除くと内容の連続性は乏しいです。

出版社もそのことを承知しているのか、バックナンバーの在庫は常時充実しており、出版社から直接購入する場合は1,500円以上の購入で送料無料になるサービスまであります(※さすがに香港までは送ってくれないでしょうが)。

バックナンバーから興味がある対象についてピックアップすることが、この雑誌の楽しみ方の一つです。月刊誌だからと言って必ずしも定期購読を前提にしているわけでもないというのもユニークなところです。




私が好んで購入してるのは、おもに『農業』と『地図・GPS』と『画像処理』の3テーマです。

たとえば『農業』であれば、Raspberry Pi をつかった LED ライトと給水ポンプの制御により手入れ不要のスプラウト栽培環境(野菜工場)の作り方を説明したり、水面に浮かべた計測機器から水中カメラの様子を YouTube にライブ配信したり、LTE 通信で海面養殖場の水温や塩分濃度を遠隔に通知した際の実際の部品やプログラムなどが掲載されています。

こうした記事を読んでいると単純に楽しくなってくるだけではなく、市販されているセンサ類にも詳しくなれます。そしてセンサからの入力が得られるのであれば、それに応じたプログラム処理を追加できるので、記事を読み終える前から新しい応用のアイデアが自然と浮かんできます。

これだけの内容でありながら、一冊あたりの定価はわずか 927 円と破格です。こういうのを見ていると日本語を理解できて良かったと心から実感します。

もちろん、月刊誌なので懇切丁寧にすべてを教えてくれるほどのページ数の余裕はないですし、むしろ、説明不足気味な記事のほうが多く感じるのですが、そこは関連分野の一般書籍でも十分に補完できます。

社会的な評価の確立していない新しい分野を、身近な市販品をつかって、読者にも再現できる形式で実際に体験してみるという本書のスタンスを鑑みるに、背景にある原理や要素技術の詳細はひとまず置いておき、どのように応用ができるのかという一点に特化していることも成功の秘訣かも知れません(でも参考文献一覧ぐらいは欲しい)。

私自身に読めたかどうかは別として、子どもの頃からこういう雑誌を読みたかったと思いますので、出版業界の市場縮小にも負けずに永続して欲しいと心から願います。