体験!マイコンボードで組込みLinux

第7回ネットワーク機能の構築

ネットワーク基本設定

ネットワークに対応するには、ネットワーク対応のハードウェアがなければなりません。SH7706LSRはネットワークに対応するハードウェアを有します。

Linuxカーネル再構築

Linuxでネットワークを使うためには、LinuxカーネルでTCP/IPミドルウェアを有効にして、対象となるネットワークコントローラがLinuxのデバイスドライバにおいてサポートされていなければなりません。LinuxカーネルでTCP/IPミドルウェアを有効にするにはカーネル再構築のメニューから図1のように「Networking Support」を選択し、出たメニューで図2のように「Networking Options」を選択、そして最低限図3のように「TCP/IP Networking」を選択します。

図1 カーネルコンフィギュレーションのトップメニューで「Networking Support」を選択
図1 カーネルコンフィギュレーションのトップメニューで「Networking Support」を選択
図2 ⁠Networking Options」に進む
図2 「Networking Options」に進む
図3 ⁠TCP/IP Networking」を選択
図3 「TCP/IP Networking」を選択

SH7706LSRに搭載されているネットワークコントローラは、ASIX社のAX88796BLFです。Linuxカーネルでは標準でASIX社のAX88796のデバイスドライバがサポートされていますが、注意しなければならないのは、AX88796とAX88796BLFは互換性がないので、ASIX社のAX88796のデバイスドライバを組み込んでも、SH7706LSRで正常に使うことができません。

ASIX社ではLinux2.6初期に対応したAX88796BLFのデバイスドライバを配布しており、筆者がLinux2.6.12.xで組み込んでみたところ、SH7706LSRで正常に動作することが確認できました。ただし、Linuxカーネルのネットワークドライバ関連の内部インターフェースは、Linux2.6.20以降あたりから仕様変更が加速してだんだん正常に動作しなくなり、Linux2.6.29以降ではコンパイルさえ通らなくなりました。

AX88796BLFはNE2000互換という謳い文句がありますが、厳密にはAX88796BLFとNE2000では完全に互換性がありません。ただ、ASIX社ではAX88796BLF開発時にLinuxカーネルを意識していますので、AX88796BLFとNE2000では完全に互換性がなくともLinuxのNE2000ドライバで使う部分は互換性を保つようにしました。

NE2000ドライバはLinuxカーネルにおいて重点的にメンテナンスされているデバイスドライバなので、最新のLinuxカーネルでもNE2000ドライバを使うことでAX88796BLFが安定して動作します。SH7706LSR向けのLinuxパッチでは、暗黙でNE2000ドライバが組み込まれることになります。

BusyBox設定

BusyBoxの標準設定ではそのままネットワークが使えるようになっています。BusyBoxで最低限のネットワークを利用するには図4のように「Networking Utilities」を選択し、図5のようにDNSネームサーバを利用するための「dnsd⁠⁠、図6のようにネットワークデバイスを制御するための「ifconfig⁠⁠、図7のようにルーティング設定をするための「route」を選択します。

図4 BusyBoxのコンフィギュレーションメニューから「Networking Utilities」を選択
図4 BusyBoxのコンフィギュレーションメニューから「Networking Utilities」を選択
図5 開いたメニュー項目から「dnsd」を選択
図5 開いたメニュー項目から「dnsd」を選択
図6 同じく「ifconfig」を選択
図6 同じく「ifconfig」を選択
図7 同様に「route」を選択
図7 同様に「route」を選択

コマンド設定

現在ではコンピュータにおけるネットワーク設定はDHCPサーバを利用して自動でネットワーク設定する方法が主流となっています。最新のBusyBoxでも、特別な設定を何もしなくともDHCPサーバが利用できるDHCPクライアントの設定になっています。以下のコマンドでDHCPサーバを利用して全自動でネットワーク設定することができます。

# udhcpc -q

もしインターネットに接続できる環境であれば、そのままインターネットに接続することができます。

Webサーバの構築

BusyBox設定

BusyBoxの標準設定では、そのままWebサーバが使えるようになっています。BusyBoxでWebサーバを利用するには図4のように「Networking Utilities」を選択し、図8のようにWebサーバを利用するための「httpd」を選択します。BusyBoxのhttpdはApacheのように重量級のフル装備ではありませんが、通常のWebページの閲覧やCGIスクリプトの実行にも対応しており、一般的なWebサーバの構築が可能となっています。

図8 ⁠Networking Utilities」の中でhttpdを選択
図8 「Networking Utilities」の中でhttpdを選択

HTML文書の公開

BusyBoxのhttpdは、/etc/httpd.confの設定により特定のIPやネットワークに対してアクセスを許可や拒否をする設定をしたり、特定のフォルダに対して特定のユーザーやパスワードのみを許可したり、特定の拡張子でCGIスクリプトのための特定のインタープリタを起動したりするように設定をすることが可能です。

HTML文書を公開する際は、任意のフォルダに公開したいHTML文書を置き、httpd起動時にHTML文書が置いてあるトップフォルダを指定します。たとえばHTML文書を/var/httpd以下に置いた場合は、以下のようにデーモンを起動します。

# httpd -h /var/httpd

/var/httpd/index.htmlがリスト1の内容だった場合、外部のブラウザを使って図9のように表示されます。

リスト1 index.htmlの例

<html><body bgcolor=peachpuff>
<div align=center><big>Main Page</big></div>
<hr size=2 width=100%>
<p>Linux 2.6.28.10 for SH7706LSR</p>
</body></html>
図9 リスト1のindex.htmlに外部からブラウザでアクセスしたところ
画像

CGIスクリプトの実行

ネットワーク対応の組込み機器はWebサーバ経由で機器を設定するケースが多く、Webサーバ経由で制御を行うにはCGIスクリプトの実行が不可欠となります。BusyBoxのhttpdはCGIスクリプトの実行にも対応しており、たとえばリスト2のプロクラムをコンパイルした実行ファイルを/var/httpd/cgi-bin/indexとして置いた場合は、外部のブラウザで /cgi-bin/indexのパスを指定すると図10のように表示されます。

リスト2 CGI用Cのソースコードの例
#include <stdio.h>

int main() {
	printf("Content-type: text/html\n\n");
	printf("<html><body bgcolor=peachpuff>\n");
	printf("<div align=center><big>Main Page</big></div>\n");
	printf("<hr size=2 width=100%>\n");
	printf("<p>Linux 2.6.28.10 for SH7706LSR</p>\n");
	printf("</body></html>\n");
	return 0;
}
図10 リスト2のCGIプログラムの実行例
図10 リスト2のCGIプログラムの実行例

ネットワーク関連デーモンの設定

一般的にhttpd以外のネットワーク関連のデーモンは、inetdのようなネットワークデーモン経由で起動するのが慣例となっています。BusyBoxの標準設定ではそのままinetdが使えるようになっています。BusyBoxでinetdを利用するには図4のように「Networking Utilities」を選択し、図11のようにinetdを利用するための「inetd」を選択します。

図11 ⁠Networking Utilities」の中でinetdを選択
図11 「Networking Utilities」の中でinetdを選択

inetdの設定は /etc/inetd.conf で行い、設定内容は通常のinetdと同じように設定をします。UDPとTCPのポート番号を番号ではなくプロトコル名で指定する場合は、あらかじめ、/etc/services にUDPとTCPのポート番号とプロトコル名の対応を記述しておく必要がありますが、適当なPCLinuxの設定ファイルをそのまま持ってくるのがいいでしょう。

inetdの起動は以下のように行います。

# inetd

FTPサーバ

最近までのBusyBoxはFTPサーバの機能がないので、それまでは別途FTPサーバをインストールしなければなりませんでした。最新のBusyBoxの標準設定では、そのままFTPサーバが使えるようになっています。BusyBoxでFTPサーバを利用するには図4のように「Networking Utilities」を選択し、図12のようにFTPサーバを利用するための「ftpd」を選択します。

図12 ⁠Networking Utilities」の中でftpdを選択
図12 「Networking Utilities」の中でftpdを選択

もし、公開専用FTPサーバでアップロードが不要ならば、⁠Enable upload commands」のチェックを外します。BusyBoxのftpdは単独で動作するデーモンになっておらず、必ずinetdのようなネットワークデーモンを通してしか使うことができないようになっています。

BusyBoxのftpd自身は、特定のIPやネットワークに対してアクセスを許可や拒否をする設定をしたり、特定のフォルダに対して特定のユーザやパスワードのみを許可したりする設定機能は有してしませんので、そのような機能はinetdのようなネットワークデーモンに委任します。

FTPサーバの公開では任意のフォルダに公開したいファイルを置き、ftpd起動時にFTPサーバのファイルが置いてあるトップフォルダを指定します。たとえば、FTPサーバを/var/ftp以下に置いた場合は、inetd.confに以下のような記述を加えます。

 ftp stream tcp nowait root ftpd ftpd /var/ftp

ファイルアップロードを許可する場合は、以下のようにinetd.confの記述をします。

 ftp stream tcp nowait root ftpd ftpd -w /var/ftp

ファイルアップロードを許可したFTPサーバが立ち上がっていれば、SH7706LSRボードとPCの間で自由にファイルのやりとりが可能になるので便利です。

TELNETサーバ

BusyBoxの標準設定では、TELNETサーバがそのまま使えるようになっています。BusyBoxでTELNETサーバを利用するには図4のように「Networking Utilities」を選択し、図13のようにTELNETサーバを利用するための「telnetd」を選択します。BusyBoxのtelnetdは、スタンドアロンとネットワークデーモン経由のいずれでも起動をすることができます。

SH7706LSRボードの標準でのコマンド操作はシリアルポート経由で行うようになっていますが、SH7706プロセッサのシリアルポートを全て外部機器通信用に使いたい場合や、複数の端末よりLinuxのコマンド操作を行いたい場合は、TELNETサーバからLinuxのコマンド操作を行うことができるので、そういった場合にTELNETサーバは便利です。

inetd.conf でtelnetdの記述は以下のようにします。

 telnet stream tcp nowait root telnetd telnetd -i

NTPクライアント

組込みボードでデータ収集などを行う場合は時刻などのタイムスタンプとセットで行うことが多いですが、市販の時計などを含めて時計用の水晶のみではたんだんと時間がずれてきます。市販の時計では、内蔵水晶のみでの時間のずれを補正するための電波時計が普及してきています。組込みボードでも正確な時間は長波により電波時計の無線受信で補正をしなればなりませんが、インターネットが接続できる状況ならば、電波時計を使わなくても公共的なNTPサーバに接続すれば時間の補正が可能となります。

ntpclientコマンド

BusyBoxでのNTPクライアントの位置づけは「External Tiny Utilities」に該当しており、外部から持ってきて組込むようになっており、BusyBoxのサイトからリンクがあります。NTPクライアントはBusyBoxの内部には含まれていませんが、NTPクライアントはBusyBoxに問題なく組み込めるようにしてあるので、NTPクライアントはBusyBoxでは半サポートという位置つけとなっています。

NTPクライアントであるntpclientは以下のURLでダウンロードができます。

ntpclient
URL:http://doolittle.icarus.com/ntpclient/

BusyBoxへの組込み

BusyBoxへのソースコード組込みに関しては前回までに解説してありますので、詳細はそちらを参照してください。ここではntpclient特有の内容についてのみ解説します。

ntpclientのアーカイブを展開すると雑多なファイルが展開されますが、BusyBoxで必要なファイルは以下の3つのみです。

  • ntpclient.c
  • ntpclient.h
  • phaselock.c

展開されたソースコードは単独で動作することを前提としたコードなので、BusyBoxに組み込むには若干の変更が必要となります。オリジナルのntpclient.cに対してリスト3とリスト4の変更を加えます。

リスト3 ntpclient.cの変更点(その1)
35  define _POSIX_C_SOURCE 199309
36  
37  define USE_OBSOLETE_GETTIMEOFDAY ←追加
38  
39  ifdef USE_OBSOLETE_GETTIMEOFDAY
40  define _BSD_SOURCE
41  endif
42  
43  include "libbb.h" ←ヘッダ定義をlibbb.hに変更
44  include "ntpclient.h"
45  
46  * Default to the RFC-4330 specified value */
47  ifndef MIN_INTERVAL
48  define MIN_INTERVAL 15
49  endif

リスト3の37行目ではBusyBoxに関する組込みとは直接関係はないですが、時刻設定と取得のLinuxシステムコールで新しい方法ではなぜかBusyBoxではコンパイルエラーになるので古い方法での時刻設定と取得のLinuxシステムコールを指定します。リスト3の47行目では、BusyBoxのヘッダを呼び出すように変更します。

リスト4 ntpclient.cの変更点(その2)
587
588  int ntpclient_main(int argc UNUSED_PARAM, char **argv) MAIN_EXTERNALLY_VISIBLE; ← main関数定義の追加
589  int ntpclient_main(int argc UNUSED_PARAM, char **argv) { ← main関数定義の変更
590  	int usd;  /* socket */
591  	int c;

リスト4の部分はオリジナルではmain関数でしたが、BusyBoxのコマンドとして組み込めるようにリスト4のように変更します。

NTPサーバへの接続

国内での公共的なNTPサーバは多数ありますが、代表的なNTPサイトは以下となります。

(1)独立行政法人情報通信研究機構(NICT)
独立行政法人情報通信研究機構は日本標準時を供給しており、サーバ名は以下となります。

ntp.nict.jp

(2)インターネットマルチフィード(MFEED)
インターネットマルチフィードはJPNAPを通じて多数のISPのネットワークに隣接しており、サーバ名は以下となります。

ntp.jst.mfeed.ad.jp

サービスは無償ですが、機器ベンダが各種機器についてNTPサーバをあらかじめデフォルトにて設定される場合は、ntp-info@mfeed.ad.jp宛までご一報くださいとのことです。

(3)Ring Server Project
歴史的経緯により福岡大学に集中した負荷を回避するために特定のサーバに負荷がかからないように、Ring Server Project参加組織のサーバで分散してサービスを提供する仕組みになっています。以下のサーバ名を指定することによりラウンドロビンにより特定サーバに負荷をかけないようになっています。

ntp.ring.gr.jp

(4)NTP POOL PROJECT
全世界的なNTPサーバをプールしたプロジェクトで参加サイトは増える傾向にあります。複数のサイトががラウンドロビンで参照され、国内サーバの参照は以下となります。

jp.pool.ntp.org

この他にも大学などでNTPサーバのサービスを提供しているサイトが多数存在します。

ntpclientを組み込んだBusyBoxでNTPサーバによる時刻合わせをするには例えば、以下のようにします。

 # ntpclient -s -h ntp.nict.jp

次回は

次回はSH7706LSRのI/O制御をするWebサーバの構築について解説します。

おすすめ記事

記事・ニュース一覧