ARMで自宅サーバを構築しよう!

アナログ電話回線をIP電話へ変換しよう!スマートフォンで世界どこでもNTTアナログ回線が利用できます。 GUI設計:ARM環境のQt4とQtopia開発入門
Android環境のアプリケーションの開発入門
株式会社 日新テクニカ
http://www.nissin-tech.com


更新日: 2014年5月1日

関連のリンク

ダウンロード
Apache テストページ
PHP テストページ
SoyCMS テストページ
phpSQLiteCMS テストページ


直接使えるARMサーバ用のイメージファイル

イメージファイルのダウンロード
イメージファイルの書き込み手順
ARMサーバ初の起動と設定

SDカードでイメージファイルを書き込む手順

クロス開発環境

仮想Linux環境のダウンロード
仮想マシンVMwareの使い方
ARMクロスツールのインストール
ARMサーバ用の使っているソース

クライアント側のソフト

■ 使っているARMボード

Kane BeBe III ARM9/2440
ARM9/2440マニュアル
  • CPU: ARM9/2440A、周波数400MHz
  • SDRAM: 64MB
  • NAND: 1GB
  • Flashメモリ: 32GBまでのSDカードまたはUSBメモリ
  • HDD: 外付ハードディスク(NTFS容量無制限)
  • 超コンパクト:64mm×99mm
  • 電源: 5VDC、プラグ2.1mmφ
  • プリインストールされたOS: Linux-2.6.32 + Qt-2.2.0
初心者はARMサーバ用のイメージファイルを直接利用したほうがいいと思います。プリインストールされたOSを更新する方法はこちらをご参照ください。

■ ARMボードとブロードバンドを使って自宅サーバ構築

ARMボードとBフレッツを使い、非固定IPアドレス1個で自宅サーバより発信しています。全てフリーソフトを使用して、無料で作る自宅サーバです。

ARMを選ぶ理由:

そんなARMボードを使って自宅サーバを構築してみませんか。

■ Apache1.3 + PHP5.3 + SQLite3ウェブサーバ

必要のソースコード
apache_1.3.42.tar.gz
http://www.apache.org

php-5.3.5.tar.bz2
http://php.net/

libxml2-sources-2.7.8.tar.gz
http://xmlsoft.org/

※ クロスコンパイル環境はFedora9です。

2GBを超えるファイルに対応すれば、
# export CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
※ ApacheとPHPのコンパイルはこの設定が同じにしてください。

まず、x86版をコンパイルする
Apacheのコンパイル
# tar zxvf apache_1.3.42.tar.gz
# cd apache_1.3.42
# ./configure --prefix=/apache --enable-module=so ← 共有モジュールに対応
# make
# make install /apacheにインストールする

libxml2のコンパイル
# tar zxvf libxml2-sources-2.7.8.tar.gz
# cd libxml2-2.7.8
# ./configure
# make
# make install

PHP5のコンパイル
# tar jxvf php-5.3.5.tar.bz2
# cd php-5.3.5
# ./configure --prefix=/php --with-apxs=/apache/bin/apxs
# make
# make install /phpにインストールする

ARM版をコンパイルする
libxml2のコンパイル
# tar zxvf libxml2-sources-2.7.8.tar.gz
# cd libxml2-2.7.8
# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/arm-rootfs
# make
# make install /arm-rootfsにインストールする

PHP5のコンパイル
# tar jxvf php-5.3.5.tar.bz2
# cd php-5.3.5
# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/php --with-libxml-dir=/arm-rootfs --with-apxs=/apache/bin/apxs --enable-mbstring
apacheはx86版です。
mbstringは日本語などマルチバイト言語に対応する。

以下のようなコンパイルエラーメッセージ
error: invalid 'asm': invalid operand for code 'w'
を削除するために、Makefileを編集する。
# gedit Makefile
CFLAGS_CLEAN = -I/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/usr/include -g -O2
赤い文字は添加されたディレクトリです。/opt/FriendlyARM/toolschain/4.4.3/はARMクロスコンパイルツールのインストール先です。

PHPは共有モジュールに対応するために、以下の改修も必要です。
MakefileにはLDFLAGS += -ldlを追加する。
main/php.hには#define HAVE_LIBDL 1を追加する。
ext/standard/dl.cには#include <dlfcn.h>を追加する。

コンパイル開始する。
# make
コンパイルの最後、以下のエラーメッセージ
php-5.3.5/sapi/cli/php: 1: Syntax error: word unexpected (expecting ")") make: *** [ext/phar/phar.php] Error 2
があります。生成されたARM版phpはホストで実行できませんから。

# cp sapi/cli/php ./php-arm ← 生成されたARM版phpをバックアップする。
# cp /php/bin/php sapi/cli/ ← 先に生成されたx86版phpに切り替える。

# make ← コンパイル完成する。
# make install /phpに、libphp5.soファイルを/apache/libexecにインストールする。
# cp php-arm /php/bin/php ← ARM版のphpをリストアする。

# cp php.ini-development /php/lib/php.ini ← php.iniファイルをコピーする。

最後、ARM版のApacheをコンパイルする
# tar zxvf apache_1.3.42.tar.gz
# cd apache_1.3.42
# CC=arm-linux-gcc ./configure --prefix=/apache --enable-module=so ← 共有モジュールに対応
# make

コンパイルの途中、src/main/gen_test_charにエラーがあります。ARMの実行ファイルが動けないから。X86用のapache_1.3.42-x86/src/main/gen_test_charをsrc/main/gen_test_charにコピーしてください。
# cp ../apache_1.3.42-x86/src/main/gen_test_char src/main/

同じエラーもsrc/main/gen_uri_delimsにあります。同じ方法で解決します。
# cp ../apache_1.3.42-x86/src/main/gen_uri_delims src/main/

# make install /apacheにインストールする

httpd.conf を編集し、PHP の共有モジュールをロードするよう設定します。 LoadModule 命令の右側に記述するパスは、システムの PHP 共有モジュールを指している必要があります。
# gedit httpd.conf
LoadModule php5_module libexec/libphp5.so

<IfModule mod_dir.c>
    DirectoryIndex index.html index.php	index.phpを添加する。
</IfModule>

Apache が特定の拡張子のファイルを PHP としてパースするよう(httpd.confを編集して)設定します。例えば、Apache が拡張子 .php のファイルを PHPとしてパースするように設定します。複数の拡張子も、空白で区切って記述するだけで PHP としてパースさせることができます。以下の例は .php と .phtmlとを指定した場合です。
AddType application/x-httpd-php .php .phtml

■ ARMボード側の設定

生成されたディレクトリ/apacheと/phpをすべてボードのルート/にコピーする。libxml2ライブラリ/arm-rootfs/lib/libxml2.so.2.7.8をボードの/libにコピーする。リンクを作ります。
[root@kaneBeBeIII]# ln -s /lib/libxml2.so.2.7.8 /lib/libxml2.so.2
[root@kaneBeBeIII]# ln -s /lib/libxml2.so.2.7.8 /lib/libxml2.so

Apacheのコンフィグファイル/apache/conf/httpd.confを編集して、次のように直します。
[root@kaneBeBeIII]# vi /apache/conf/httpd.conf
Port 80
Group ppp
ServerName kanebebe.dip.jp

LANの設定ファイル/etc/eth0-settingを編集して、次のような直します。
[root@kaneBeBeIII]# vi /etc/eth0-setting
IP=192.168.1.200
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:55:55:55:55:55

起動スクリプト/etc/init.d/rcSを編集して、次のような直します。
[root@kaneBeBeIII]# vi /etc/init.d/rcS
#/etc/rc.d/init.d/httpd start
#echo "                        " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo "                        " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo "                        "
#sleep 1
#/bin/qtopia &
#echo "                                  " > /dev/tty1
#echo "Starting Qtopia, please waiting..." > /dev/tty1

/apache/bin/apachectl start

必要ない機能を全部コメントします。Apacheサーバの起動用のコマンド
/apache/bin/apachectl start
を入ります。

ボードを再起動させば、Apacheインストール時のテストページが見えるはずです。

ディレクトリ/apache/htdocsにはPHPのテスト用のファイルを生成する。
# vi phpinfo.php
<?php phpinfo(); ?>

PHPテストページ

phpinfoしてみると、以下のエラーがでる。
Warning: phpinfo() [function.phpinfo]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST'

phpinfoでエラーが出たことがなかったので戸惑ったが、タイムゾーンの設定をすればいいようだ。php.iniの該当部分を次のように修正する。
# vi /php/lib/php.ini
[Date]
; ...
; ...
date.timezone = Asia/Tokyo

SQLite は軽量のインプロセス・データベースエンジンで、今日の多くの主要なプログラムで広く利用されています。PHP5.3以降、SQLite3はコアに吸収されたので、デフォルトで有効になっています。PHPテストページでSQLiteの部分を確認します。

sqlite3

SQLite3 supportenabled
SQLite3 module version 0.7-dev
SQLite Library 3.7.3

DirectiveLocal ValueMaster Value
sqlite3.extension_dirno valueno value


データベースSQLite3テスト用のPHPプログラム
# vi sqlite3-test.php
<?php
// DBへの接続
try {
    $db = new SQLite3('/ディレクトリ/mysqlitedb.db');
    /ディレクトリ/をPHPユーザでアクセスできるように設定する。
} catch (Exception $e) {
    print 'DBへの接続でエラーが発生しました。<br/>';
    print $e->getTraceAsString();
    return;
}

$db->exec('CREATE TABLE foo (bar STRING)');
$db->exec("INSERT INTO foo (bar) VALUES ('This is a test')");

$result = $db->query('SELECT bar FROM foo');
var_dump($result->fetchArray());
?>

データベースSQLite3コマンドライン
データベースSQLite3を管理するために、SQLite3コマンドラインも必要です。 http://www.sqlite.org/download.htmlから最新版SQLite 3.7.5をダウンロードする。
# tar zxvf sqlite-autoconf-3070500.tar.gz
# cd sqlite-autoconf-3070500
# mkdir build
# cd build
# ../configure CC=arm-linux-gcc --host=arm-linux --prefix=/sqlite3
# make
# make install

生成された実行ファイル/sqlite3/bin/sqlite3をボードの/binにコピーする。
ライブラリ/sqlite3/lib/libsqlite3.so.0.8.6をボードの/libにコピーする。リンクも作ります。
[root@kaneBeBeIII]# ln -s /lib/libsqlite3.so.0.8.6 /lib/libsqlite3.so.0
[root@kaneBeBeIII]# ln -s /lib/libsqlite3.so.0.8.6 /lib/libsqlite3.so

sqlite3を実行してみます。
[root@kaneBeBeIII]# sqlite3 mysqlitedb.db
SQLite version 3.7.5
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from foo;
This is a test
sqlite> .exit
[root@kaneBeBeIII]#

■ 使えるCMS(Content Management System)

コンテンツマネジメントシステム(Content Management System,CMS)は、Webコンテンツを構成するテキストや画像などのデジタルコンテンツを統合・体系的に管理し、配信など必要な処理を行うシステムの総称。

Apache + PHP + SQLiteに基づいてのコンテンツマネジメントシステムはいくつがあります。このARM自宅サーバには二つのCMSを実装されました。

http://www.soycms.net/
SoyCMS テストページ

http://phpsqlitecms.net/
phpsqlitecms テストページ

日本語関連の「php.ini」の設定:
[root@kaneBeBeIII]# vi /php/lib/php.ini
magic_quotes_gpc = Off
default_charset = "utf-8"

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.substitute_character = none;

■ Secure Shell(セキュアシェル、SSH)サーバの設定

プリインストールしたLinuxにはTelnet/FTPサーバをすでにインストールしました。特別の設定が必要ないですが、既存のアカウントは
root パスワードなし
plg パスワードがplg
passwdコマンドでアカウントのパスワードを変更してください
[root@kaneBeBeIII]# passwd rootまたはplg

adduserまたはdeluserコマンドでアカウントを添加・削除できます。
[root@kaneBeBeIII]# adduser youraccount
[root@kaneBeBeIII]# deluser youraccount

Secure Shell(セキュアシェル、SSH)は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。パスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化される。

そもそもはTelnetやrsh、rloginなどといった、リモートホストのシェルを利用するための既存のプロトコルを代用する手段として考えられていた。TelnetやFTPは、ネットワーク上に平文でパスワードを送信してしまうため、パスワードをネットワーク経路上でのぞき見されてしまう(これを盗聴やスニフと呼ぶ)危険性が高く、商業的なインターネット空間では問題が大きかった。Telnet同様に、リモートホスト間でのファイルコピー用のコマンドrcpを代用するscpや、FTPを代用するためのsftpも用意されている。

必要のソースコード
zlib-1.2.5.tar.gz
http://www.zlib.net/

openssl-0.9.8q.tar.gz
http://www.openssl.org/

openssh-5.6p1.tar.gz
http://www.openssh.org/

zlibをコンパイルする
# tar zxvf zlib-1.2.5.tar.gz
# cd zlib-1.2.5
# CC=arm-linux-gcc ./configure --prefix=/opt/libs
# make
# make install

opensslをコンパイルする
# tar zxvf openssl-0.9.8q.tar.gz
# cd openssl-0.9.8q
# ./Configure --prefix=/opt/libs os/compiler:arm-linux-gcc
# make
# make install

opensshをコンパイルする
# tar zxvf openssh-5.6p1.tar.gz
# cd openssh-5.6p1
# ./configure --host=arm-linux --with-libs --with-zlib=/opt/libs --with-ssl-dir=/opt/libs --disable-etc-default-login CC=arm-linux-gcc AR=arm-linux-ar
# make
※ make installをしないでください。ご注意ください。

生成されたファイルをコピーする。
openssh-5.6p1ディレクトリの
sshdをボードの/usr/sbinにコピーする。
scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscanをボードの/usr/local/binにコピーする。
sftp-server ssh-keysignをボードの/usr/libexecにコピーする。

sshd_config ssh_configをボードの/usr/local/etcにコピーする。

ホスト側次のコマンドで
# ssh-keygen -t rsa1 -f ssh_host_key -N ""
# ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
# ssh-keygen -t dsa -f ssh_host_dsa_key -N ""
生成されたssh_host_*ファイルをボードの/usr/local/etcにコピーする。

生成されたzlibのライブラリlibz.so.1.2.5をボードの/libにコピーして、ボードにリンクを作ります。
# ln -s /lib/libz.so.1.2.5 /lib/libz.so
# ln -s /lib/libz.so.1.2.5 /lib/libz.so.1

ボード側に動作用のディレクトリを生成する。
[root@kaneBeBeIII]# mkdir -p /var/run
[root@kaneBeBeIII]# mkdir -p /var/empty/sshd

ボードの/etc/passwdファイルを編集して
[root@kaneBeBeIII]# vi /etc/passwd

次の行を添加します。
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

ボードでSSHサーバを起動させます。
[root@kaneBeBeIII]# /usr/sbin/sshd

Windows側puttyWinSCPなどのツールでSSHサーバをアクセスしてみます。

■ NTFS外付けハードディスクが使える

ARM9ボードには1GB NANDしかありません。最大32GBのSDカードまたはUSBメモリ(FAT32)がしか使えません。サーバとして容量が足りません。その上、FAT32も4GBのファイルサイズの制限がありますので、4GBを超えるDVDのisoファイルは使えません。

NTFS外付けハードディスクを使えば、大きな容量も使えるし、ファイルサイズの制限もないです。しかし、LinuxはNTFSに対応しますが、読み取り専用です。

次の方法でNTFSに書き込めます。

まず、Linuxカーネルをコンフィグして、
# make menuconfig


File systemsのFUSE (Filesystem in Userspace) supportを選択して、
# make zImage
生成されたLinuxカーネルをボードに書き込んでください。書き込み方法は
こちらをご参照ください。

http://www.tuxera.com/community/ntfs-3g-download/からntfs-3g-2010.10.2.tgzをダウンロードします。
# tar zxvf ntfs-3g-2010.10.2.tgz
# cd ntfs-3g-2010.10.2
# ./configure CC=arm-linux-gcc --host=arm-linux
# make
# make install

生成されたファイル
/bin/ntfs-3g
/lib/libntfs-3g.so.80.0.0
をボードの/bin, /libにコピーします。
ボードの/libにあるリンクを生成します
[root@kaneBeBeIII]# ln -s /lib/libntfs-3g.so.80.0.0 /lib/libntfs-3g.so.80

ボードで次のコマンドでNTFS外付けハードディスクをマウントする
[root@kaneBeBeIII]# mkdir /apache/htdocs/download
[root@kaneBeBeIII]# ntfs-3g /dev/udisk /apache/htdocs/download

現在、/apache/htdocs/downloadはNTFS外付けハードディスクです。アクセスしてみます。

■ 自宅の光ファイバのルータの設定

ルータは初期設定のままでは外からのアクセスを受け入れません。だからルータを使うと安全なのです。しかしサーバを立ち上げるとなると、外からのアクセスを受けなければならないので、ルータに設定を行います。

自宅の光ファイバのルータのHP(192.168.1.1)を開きます。「静的NAT設定」でLANのWebサーバのIPアドレスを設定します。

■ ドメイン名

以下の要領で
無料ダイナミックDNS(DDNS)サービスから無料でドメイン名を取得できます。

ユーザー名(サブドメイン名):任意のサブドメイン名を入力※例: kanebebe.dip.jpのkanebebeにあたる部分
ドメイン名:希望するドメイン名を選択※例: kanebebe.dip.jpのdip.jpにあたる部分
電子メールアドレス:自分のメールアドレスを入力
パスワード:任意のパスワードを入力
パスワード(再入力):任意のパスワードを再入力

非固定IPアドレス環境の場合、不定期にIPアドレスが変わってしまうが、IPアドレスが無料・ダイナミックDNS(DDNS)サービス - ieServer.Netに登録したIPアドレスと変わってしまうとkanebebe.dip.jpでサーバにアクセスできなくなってしまう。

そこで、ieServer用IPアドレス更新スクリプトを利用して定期的にIPアドレスの変更をチェックし、IPアドレスが変更されていた場合は自動で無料・ダイナミックDNS(DDNS)サービス - ieServer.Netへ新しいIPアドレスを登録するようにし、常にkanebebe.dip.jpでサーバにアクセスできるようにする。

また、固定IPアドレス環境の場合でも、一定期間IPアドレス更新処理が行われないとドメインが削除されてしまうため、ieServer用IPアドレス更新スクリプトを使用して定期的にIPアドレスの更新処理を自動で行なうようにする。

#!/bin/sh

CURRENT_IP="0.0.0.0"

# 回線IP確認ページURL
REMOTE_ADDR_CHK="http://ieserver.net/ipcheck.shtml"

# DDNS更新ページURL
DDNS_UPDATE="http://ieserver.net/cgi-bin/dip.cgi"

# グローバルIPアドレスを保存するファイル
IP_BACKUPFILE="/tmp/global-ip"

# ieServer.Netにて取得したアカウント(サブドメイン)情報を記入
ACCOUNT="kanebebe"
DOMAIN="dip.jp"
PASSWORD="xxxxxxxx"

if test -f $IP_BACKUPFILE; then
    CURRENT_IP=`cat $IP_BACKUPFILE`
else
    CURRENT_IP="0.0.0.0"
fi

NEW_IP=`wget -q -O - $REMOTE_ADDR_CHK`

if [ "$CURRENT_IP" != "$NEW_IP" ];then

STATUS=`wget -q -O - "$DDNS_UPDATE?username=$ACCOUNT&domain=$DOMAIN&password=$PASSWORD&updatehost=1"`

    RESULT=`expr index "$STATUS" "$NEW_IP"`
    TIME=`date`
    if [ $RESULT -ge 1 ];then
        echo "$TIME $ACCOUNT.$DOMAIN Updated $CURRENT_IP to $NEW_IP"
        echo $NEW_IP > $IP_BACKUPFILE
    else
        echo "$TIME $ACCOUNT.$DOMAIN Update aborted $CURRENT_IP to $NEW_IP"
    fi

fi


上のスクリプトをボードにddns-update.shとして保存して、ボードで次のコマンド:
[root@kaneBeBeIII]# chmod +x ddns-update.sh
[root@kaneBeBeIII]# ./ddns-update.sh

次のURLで設定したサーバ名で外部からアクセスできるか確認する。
http://www.websitepulse.com/help/tools.php

定期的に実行する
定期的にコマンドを実行するには、cronを使います。設定はcrontabコマンドを使います。ここでは、以下のファイルをmycrontabとして用意します。
[root@kaneBeBeIII]# vi /etc/mycrontab

0,10,20,30,40,50 * * * * /bin/ddns-update.sh > /dev/null 2>&1
左から順に、実行する分、時、日、月、曜日、実行コマンドです。「*」はワイルド・カードで、そのフィールドの値を問わないという意味になります。1行には一つのコマンドを書きます。複数のコマンドを指定する場合は、複数の行に分けます。上の場合は、0,10,20,30,40,50分にddns-update.shを実行する。
[root@kaneBeBeIII]# mkdir -p /var/spool/cron/crontabs
[root@kaneBeBeIII]# crontab /etc/mycrontab
[root@kaneBeBeIII]# crond
上のコマンドを起動スクリプト/etc/init.d/rcSに添加すれば、自動的に定期的に実行する。

現在の設定を見るには、
[root@kaneBeBeIII]# crontab -l
0,10,20,30,40,50 * * * * /bin/ddns-update.sh > /dev/null 2>&1
0 12 * * * /bin/ntpdate.sh > /dev/null 2>&1

■ 時計を正確に合わせる(NTP)

Network Time Protocol(ネットワーク・タイム・プロトコル、略称NTP(エヌティーピー))は、ネットワークに接続される機器において、機器が持つ時計を正しい時刻へ同期するための通信プロトコルである。

http://www.ntp.org/からntp-4.2.6p3.tar.gzをダウンロードします。
# tar zxvf ntp-4.2.6p3.tar.gz
# cd ntp-4.2.6p3
# CC=arm-linux-gcc ./configure --prefix=/ntp --exec-prefix=/ntp --host=arm-linux
# make

このようなエラー「error: 'MOD_NANO' undeclared」があるかもしれません。ntpd/ntp_loopfilter.cファイルを編集し、次の行を追加する。
# gedit ntpd/ntp_loopfilter.c
#define MOD_NANO        ADJ_NANO	← この行を追加する。

コンパイル完成すると、インストールする。
# make install

生成された/ntp/bin/ntpdateファイルをボードの/binにコピーします。
ホストLinuxの/usr/share/zoneinfo/Asia/Tokyoファイルをボードの/etc/localtimeにコピーします。
ボードで次のコマンドで日本標準時に合わせる。
[root@kaneBeBeIII]# ntpdate ntp.nict.jp

スクリプトで時計を正確に合わせた後、RTCを更新する。
[root@kaneBeBeIII]# vi /bin/ntpdate.sh
#!/bin/sh

ntpdate ntp.nict.jp
if [ $? = 0 ];then
    hwclock -w	← 成功したら、RTCを更新する。
fi

定期的に実行する
mycrontabに/bin/ntpdate.shを添加する
[root@kaneBeBeIII]# vi /etc/mycrontab

0,10,20,30,40,50 * * * * /bin/ddns-update.sh > /dev/null 2>&1
0 12 * * * /bin/ntpdate.sh > /dev/null 2>&1 ← 毎日12時に実行する。

■ Sambaサーバ

「Samba」を使うとWindowsからアクセスできるファイルサーバを構築できる。アクセスするのは簡単で、Windowsの「マイネットワーク」を開くとサーバのアイコンがあらわれ、さらにアイコンをダブルクリックすると共有フォルダの一覧が出てくる。

この共有フォルダは自分のパソコンのハードディスクと同じ感覚で扱うことができ、ファイルのアイコンをドラッグすればコピーできるし、ダブルクリックすればファイルを開くことができる。

http://www.samba.org/からsamba-3.5.6.tar.gzをダウンロードします。
# tar zxvf samba-3.5.6.tar.gz
# cd samba-3.5.6/source3
# ./configure CC=arm-linux-gcc LD=arm-linux-ld ranlid=arm-linux-ranlid AR=arm-linux-ar --target=arm-linux --host=i686 samba_cv_CC_NEGATIVE_ENUM_VALUES=yes
# make
ボードには次のコマンドでsambaのディレクトリを生成します
[root@kaneBeBeIII]# mkdir -p /usr/local/samba
[root@kaneBeBeIII]# mkdir -p /usr/local/samba/bin
[root@kaneBeBeIII]# mkdir -p /usr/local/samba/var
[root@kaneBeBeIII]# mkdir -p /usr/local/samba/private
[root@kaneBeBeIII]# mkdir -p /usr/local/samba/lib

生成されたsambaファイル
samba-3.5.6/source3/bin/nmbd
samba-3.5.6/source3/bin/smbd
samba-3.5.6/source3/bin/smbpasswd
samba-3.5.6/source3/bin/testparm
をボードの/usr/local/samba/binにコピーします。

ボードの/usr/local/samba/libにはsmb.confファイルを生成編集します
[global]
	workgroup =WORKGROUP
	netbios name =KaneBeBe
	server string =Samba Server
	guest account=root
	security =share

[share]
	path =/apache/htdocs
	read only = No
	guest ok=yes
ボードで次のコマンドでsmb.confファイルをテストします。
[root@kaneBeBeIII]# /usr/local/samba/bin/testparm

ボードでsambaのユーザを添加します。
[root@kaneBeBeIII]# /usr/local/samba/bin/smbpasswd -a ユーザ名

ボードでsambaサーバを起動させます。
[root@kaneBeBeIII]# /usr/local/samba/bin/nmbd -D
[root@kaneBeBeIII]# /usr/local/samba/bin/smbd -D

WindowsからARM sambaサーバが見える、アクセスできるはずです。

■ CUPSでプリンタを共有する

cups(Common Unix Printing System)とは、IPP(Internet Printing Protocol)に準拠し、IPPはHTTPを使用して印刷可能にしたプロトコルで、印刷の為の標準規定だけでなく、印刷ジョブやプリンタの各オプションなども規定しユーザーはWebブラウザを介してサーバの状態監視やプリンタのジョブ管理も行なえます。

当サイトではプリンタドライバはクライアントに持たせ、サーバは受け取ったデータを加工せずにプリンタに印刷要求を出すようにする設定を紹介します。

まず、Linuxカーネルには「USB Printer support」をチックして、再構築します

プリンタをUSBケーブルでボードと接続して、CUPSがアクセスできるように設定します。

[root@kaneBeBeIII]# chmod 666 /dev/lp0
※ 再起動またはUSBプリンタを再接続する時、再設定が必要です。


http://www.cups.org/からcups-1.4.6-source.tar.bz2をダウンロードします。

※ クロスコンパイル環境はFedora9です。

# tar jxvf cups-1.4.6-source.tar.bz2
# cd cups-1.4.6
まず、x86用のcupsをコンパイルする。
# ./configure
# make
※ make installをしないでください。ご注意ください。

生成されたx86用の実行ファイルppdc/genstringsをバックアップする。

# cp ppdc/genstrings ./

ARM用のCUPSをコンパイルする前に、Makefileを編集する

# gedit Makefile

"man"というディレクトリを削除する
DIRS = cups filter backend berkeley cgi-bin driver man locale monitor \

# gedit ppdc/Makefile

バックアップされたx86版のgenstringsを使います。
        ../genstrings >sample.c

ARM用のCUPSをコンパイルする

# make clean
# ./configure CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar --target=arm-linux --host=arm-linux --build=i686-linux --prefix=/cups
# make
# make install

最後、ディレクトリ/cupsにはARM用のcupsの実行ファイルを生成されました。すべてをボードの/cupsにコピーしてください。

ボード側に設定ファイル/cups/etc/cups/cupsd.confを編集する。

# gedit /cups/etc/cups/cupsd.conf
FileDevice Yes
# Only listen for connections from the local machine.
Listen 631
Listen /cups/var/run/cups/cups.sock

# Show shared printers on the local network.
Browsing On
BrowseOrder allow,deny
BrowseAllow all
BrowseLocalProtocols CUPS

# Default authentication type, when authentication is required...
DefaultAuthType Basic

# Restrict access to the server...
<Location />
  Order allow,deny
  Allow @LOCAL
</Location>

# Restrict access to the admin pages...
<Location /admin>
  Order allow,deny
  Allow @LOCAL
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
  Allow @LOCAL
</Location>

CUPSの実行はdbusが必要です。関連のソースコード:
expat-2.0.1.tar.gz
http://expat.sourceforge.net/

dbus-1.4.8.tar.gz
http://cgit.freedesktop.org/dbus/dbus/


まずdbus用のxml処理用のパッケージをコンパイルする。
# tar zxvf expat-2.0.1.tar.gz
# cd expat-2.0.1
# ./configure --prefix=/opt/libs --host=arm-linux
# make
# make install

dbusのコンパイル
# tar zxvf dbus-1.4.8.tar.gz
# cd dbus-1.4.8
# ./configure --prefix=/opt/libs --host=arm-linux CC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib" --with-x=no
# make
# make install

生成されたライブラリ/opt/libs/lib/libdbus-1.so.3.5.5をボードの/libにコピーして、ボード側にも関連のリンクを生成します。
[root@kaneBeBeIII]# ln -s /lib/libdbus-1.so.3.5.5 /lib/libdbus-1.so.3

CUPSを起動させます。

[root@kaneBeBeIII]# /cups/sbin/cupsd

パソコンのブラウザのURL欄に「ボードのIP:631」を入力します。

「プリンターとクラスの追加」に入ります。


「プリンターの追加」ボタンを押します。


Linuxのユーザ名とパスワードを入力します。


接続されているプリンターを自動的に認識するはずです。チェックして、「続ける」ボタンを押します。


必要な情報を入力して、「共有」をチェックして、「続ける」ボタンを押します。


「プリンターの追加」ボタンを押します。


設定して、「デフォルトオプションの設定」ボタンを押します。


CUPSプリンタサーバを設定完了しました。

Windows側の設定:

「スタート」の「プリンタとFAX」を選択し、

「プリンタのインストール」を選択し、




プリンタの付属DVDからドライブをインストールする



すべての設定が完了しました。印刷してみます。

■ Webカメラストリーミング配信

実は自宅サーバを構築する上で一番の目的はこの「ストリーミングライブカメラ構築」だったりします。いま、レンタルサーバも非常に安い時代に入りましたので、あえて自宅サーバを立てる意味というものが薄れてきているようにも感じます。

ここでは、安価なUSBのCMOSカメラ(UVCクラス)を使って手軽に自宅サーバにストリーミングライブカメラを構築する方法を公開いたします。

使用したソフトはmjpg-streamerです。

mjpg-streamerの最新バージョンをダウンロードします。

$ svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer

mjpg-streamerをコンパイルする。

$ cd mjpg-streamer/mjpg-streamer
$ make CC=arm-linux-gcc
成功すれば実行ファイルmjpg_streamerとライブラリ・ファイル*.soを生成します。

生成されたファイル(mjpg_streamer、*.so)とmjpg-streamerのwwwディレクトリをARMボードにダウンロードして、特定なディレクトリにをコピーしてください。

[root@kaneBeBeIII]# cp *.so /lib/
[root@kaneBeBeIII]# cp mjpg_streamer /bin/
[root@kaneBeBeIII]# mv www /apache/htdocs/video-www

一通りうまくいったので設定を調整しようと各種プラグインが持つオプションのヘルプを見ようと思ったのであるが、これがいちいち面倒であって、例えば入力プラグイン input_uvc.so のヘルプを見るには

[root@kaneBeBeIII]# mjpg_streamer -i "input_uvc.so --help"

こうであり、出力プラグイン output_http.so のヘルプを見るには

[root@kaneBeBeIII]# mjpg_streamer -o "output_http.so --help"

最終的には下記のようなコマンドに落ち着いた。

[root@kaneBeBeIII]# mjpg_streamer -i "input_uvc.so -d /dev/video0 -f 5 -r QVGA -y" -o "output_http.so -p 8080 -w /apache/htdocs/video-www -c username:password"

Webブラウザで、「http://ARMボードのIPアドレス:8080/」にアクセスすると、MJPG-Streamer Demo Pagesが表示されます。静止画、動画、およびPan/Tilt/LEDのOn/Off等の制御をすることができます。

■ SIP(Session Initiation Protocol)サーバ

SIPと呼ばれるプロトコルを利用して、電話番号をIPアドレスと対応付けたり、相手を呼び出してつなぐといった呼制御を行うサーバのこと。partysipは、GPL(コア部分はLGPL)のSIPサーバです。容量が小さいのが利点です。SIP proxy と registrar の役目をします。ユーザディレクトリをローカルで持つため、他のレジストラとの協調動作はできませんが、自宅と社内の応用には十分です。

http://www.gnu.org/software/osip/からソースコードをダウンロードします。

libosip2-2.2.2.tar.gz
partysip-2.2.3.tar.gz

SIPスタックoSIPをコンパイルする。

# tar zxvf libosip2-2.2.2.tar.gz
# cd libosip2-2.2.2
# cd libosip2-2.2.2
# CC=arm-linux-gcc CFLAGS=-O2 ./configure --prefix=/sip --disable-trace --disable-debug --host=arm-linux
# make
# make install

SIPサーバpartySIPをコンパイルする。

# tar zxvf partysip-2.2.3.tar.gz
# cd partysip-2.2.3
# cd partysip-2.2.3
# CC=arm-linux-gcc CFLAGS=-O2 ./configure --prefix=/sip --disable-trace --disable-debug --host=arm-linux
# make
リンクエラーが発生します。
../ppl/unix/.libs/libppl.so: undefined reference to `__dn_expand'
../ppl/unix/.libs/libppl.so: undefined reference to `__res_query'
src/Makefileとtools/makefileのLIB設定に以下の用に"-lresolv"を追加します。
# gedit src/Makefileまたはtools/makefile
PARTYSIP_LIB = -lnsl -ldl -lresolv
PPL_LIB = -lnsl -ldl -lresolv

実行時、「Default Gateway Interface detection failed. Please define "serverip" in the config file」というエラーメッセージを削除するために、次の変更のほうがいいです。

# gedit src/main.c

#if defined(__linux) || defined (WIN32) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__APPLE_CC__)
psp_core_load_all_ipv4();
// psp_core_load_all_ipv6(); この行をコメントする
#endif

コンパイルした後、インストールします。インストール先は/sipです。

# make install

生成されたディレクトリ/sipをすべてボードの/sipにコピーしてください。「/sip/etc/partysip/partysip.conf」を編集して、serverip 、servernameなどを環境に合わせて変更する。

[root@kaneBeBeIII]# vi /sip/etc/partysip/partysip.conf

serverrealm = "kanebebe.dip.jp"
authentication = on
# offなら,認証がありません。
# onなら、ユーザとパスワードを添加することが必要です。

serverip = 192.168.1.200
servername = kanebebe.dip.jp
serverport_udp = 5060
transport = udp

# ユーザを添加する
user sip:101@kanebebe.dip.jp 101 101
user sip:102@kanebebe.dip.jp 102 102

ボードに「-h」オプションでヘルプを表示する。

[root@kaneBeBeIII]# /sip/bin/partysip -h
Server version:     Partysip/2.2.3
Server version:     Partysip/2.2.3
Server built:       Jan 21 2011 19:37:28

usage:

   partysip [-vV] [-f config] [-d level -l logfile]

   [-h]                  print this help
   [-i]                  interactive mode
   [-f config]           configuration file for partysip.
   [-d level]            be verbose. 0 -> no output. 6 -> all output .
   [-l logfile]          specify the log file.
   [-v]                  print partysip info
   [-V]                  print full partysip info with compile flags

ボードに次のコマンドでSIPサーバを起動させます。

[root@kaneBeBeIII]# /sip/bin/partysip -d 6 -i &
Server:             WellX Telecom/Partysip/2.2.3
Debug level:        6
Config name:        /sip/etc/partysip/partysip.conf
ServerIP: (IPv4)    192.168.1.200, 127.0.0.1
ServerName:         kanebebe.dip.jp
ServerRealm:        '"kanebebe.dip.jp"'
Log name:           Standard output
(partysip)

SIPサーバ用のSIPクライアントは同じくフリーのX-Liteを使用しました。X-LiteはWindows版だけでなく、MACやLinux用も用意されています。ARMボードに基づくLinphone電話と市販のIP電話機も使えます。

■ Virtual Private Network(VPN)サーバとクライアント

OpenVPNを使用してSSL-VPN方式のインターネットVPNを構築し、外部からOpenVPN経由でLANに安全に接続できるようにする。なお、VPNクライアントはWindowsマシンまたはARMボードとする。

【前提とするネットワークイメージ】

カーネルのコンフィグ:

# make menuconfig
Device Drivers ---> [*] Network device support --->に

<*> Universal TUN/TAP device driver support
をチックして、再コンパイルする。
# make zImage
生成されたLinuxカーネルをボードに書き込んでください。書き込み方法は
こちらをご参照ください。

必要のソースコード

lzo-2.05.tar.gz
http://www.oberhumer.com/opensource/lzo/

openssl-0.9.8r.tar.gz
http://www.openssl.org/

openvpn-2.2.2.tar.gz
http://openvpn.net/index.php/open-source/downloads.html

lzoをコンパイルする

# tar zxvf lzo-2.05.tar.gz
# cd lzo-2.05
# ./configure --host=arm-linux CC=arm-linux-gcc --target=arm-linux --prefix=/opt/libs
# make
# make install

# ln -s /opt/libs/lib/liblzo2.a /opt/libs/lib/liblzo.a
# ln -s /opt/libs/lib/liblzo2.la /opt/libs/lib/liblzo.la

opensslをコンパイルする

# tar zxvf openssl-0.9.8r.tar.gz
# cd openssl-0.9.8r
# ./Configure --prefix=/opt/libs os/compiler:arm-linux-gcc
# make
# make install

openvpnをコンパイルする

# tar zxvf openvpn-2.2.2.tar.gz
# cd openvpn-2.2.2
# ./configure --host=arm-linux --enable-password-save CC=arm-linux-gcc --target=arm-linux --with-ssl-headers=/opt/libs/include/ --with-ssl-lib=/opt/libs/lib --with-lzo-headers=/opt/libs/include/lzo --with-lzo-lib=/opt/libs/lib
# make

ファイルをボードにコピーする:

サーバ設定ファイルサンプルを編集する。

まず、サンプルのコンフィグファイルserver.confをコピーする。
[root@kaneBeBeIII]# cp /etc/openvpn/sample-config-files/server.conf /etc/openvpn

コンフィグファイルserver.confを編集する。
[root@kaneBeBeIII]# vi /etc/openvpn/server.conf
port 1194
proto udp
dev tun	← VPNインタフェースとしてTUNを指定(デフォルト)

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret

dh dh1024.pem

server 10.8.0.0 255.255.255.0
	← VPNクライアント割当てアドレス範囲として10.8.0.0/24を指定(デフォルト)

ifconfig-pool-persist ipp.txt

push "redirect-gateway def1 bypass-dhcp"
push "route 192.168.1.0 255.255.255.0"
	← 追加(LAN(例:192.168.1.0/24)へのルートをVPNサーバ経由にする)

push "dhcp-option DNS 192.168.1.1"	← VPNサーバ経由のDNS追加

keepalive 10 120

tls-auth ta.key 0 # This file is secret	← 行頭の;を削除してコメント解除(TLS認証有効化)

comp-lzo

user nobody	← 行頭の;を削除してコメント解除(OpenVPN実行権限を下げる)
group ppp	← 行頭の;を削除してコメント解除(OpenVPN実行権限を下げる)

persist-key
persist-tun

verb 3

VPNサーバの証明書・秘密鍵(サンプル)のコピーと生成

[root@kaneBeBeIII]# cp /etc/openvpn/sample-keys/ca.crt /etc/openvpn/
[root@kaneBeBeIII]# cp /etc/openvpn/sample-keys/dh1024.pem /etc/openvpn/
[root@kaneBeBeIII]# cp /etc/openvpn/sample-keys/server.crt /etc/openvpn/
[root@kaneBeBeIII]# cp /etc/openvpn/sample-keys/server.key /etc/openvpn/
[root@kaneBeBeIII]# openvpn --genkey --secret /etc/openvpn/ta.key

VPNサーバの起動

[root@kaneBeBeIII]# echo 1 > /proc/sys/net/ipv4/ip_forward ← パケット転送有効化
[root@kaneBeBeIII]# /bin/openvpn --config /etc/openvpn/server.conf --cd /etc/openvpn --dev-node /dev/tun &

windowsクライアント
http://openvpn.net/index.php/open-source/downloads.htmlよりWindows用のファイルをダウンロードして、インストールします。

サーバ側からCA証明書(/etc/openvpn/sample-keys/ca.crt)、クライアント証明書(/etc/openvpn/sample-keys/client.crt)、クライアント秘密鍵(/etc/openvpn/sample-keys/client.key)、TLS認証鍵 (/etc/openvpn/ta.key)をクライアント側へ持ち込み、設定ファイル格納フォルダ(C:\Program Files\OpenVPN\config)へ格納する。

※CA証明書、クライアント証明書、クライアント秘密鍵、TLS認証鍵をクライアント側へ持ち込む際は、安全な経路で持ち込むこと。

クライアント設定ファイルサンプル(C:\Program Files\OpenVPN\sample-config\client.ovpn)を設定ファイル格納フォルダ(C:\Program Files\OpenVPN\config)へコピーする。クライアント設定ファイル(C:\Program Files\OpenVPN\config\client.ovpn)編集する。
client
dev tun
proto udp

remote kanebebe.dip.jp 1194	← VPNサーバ名を指定

resolv-retry infinite

nobind

persist-key	←これと次の項目は、VPNが落ちた場合の再接続設定
persist-tun

ca ca.crt
cert client.crt	← クライアント証明書ファイル名を指定
key client.key	← クライアント秘密鍵ファイル名を指定

ns-cert-type server	← 行頭の;を削除してコメント解除("Man-in-the-Middle"攻撃対策)

tls-auth ta.key 1	← 行頭の;を削除してコメント解除(TLS認証有効化)

comp-lzo

verb 3

pull	← 追加 サーバの設定をクライアントに反映させる
float	← 追加 VPNのIPアドレスはサーバに任せる

ARMクライアント
サーバ側からCA証明書(/etc/openvpn/sample-keys/ca.crt)、クライアント証明書(/etc/openvpn/sample-keys/client.crt)、クライアント秘密鍵(/etc/openvpn/sample-keys/client.key)、TLS認証鍵 (/etc/openvpn/ta.key)をクライアント側へ持ち込み、設定ファイル格納フォルダ(/etc/openvpn/)へ格納する。

サーバ設定ファイルサンプルを編集する。

まず、サンプルのコンフィグファイルclient.confをコピーする。
[root@kaneBeBeIII]# cp /etc/openvpn/sample-config-files/client.conf /etc/openvpn

コンフィグファイルclient.confを編集する。
[root@kaneBeBeIII]# vi /etc/openvpn/client.conf
client
dev tun
proto udp

remote kanebebe.dip.jp 1194	← VPNサーバ名を指定

resolv-retry infinite

nobind

user nobody	← これと次の項目はLinux環境だけ
group ppp

persist-key	← これと次の項目は、VPNが落ちた場合の再接続設定
persist-tun

ca ca.crt
cert client.crt	← クライアント証明書ファイル名を指定
key client.key	← クライアント秘密鍵ファイル名を指定

ns-cert-type server	← 行頭の;を削除してコメント解除("Man-in-the-Middle"攻撃対策)

tls-auth ta.key 1	← 行頭の;を削除してコメント解除(TLS認証有効化)

comp-lzo

verb 3

pull	← 追加 サーバの設定をクライアントに反映させる
float	← 追加 VPNのIPアドレスはサーバに任せる

VPNクライアントの起動

[root@kaneBeBeIII]# /bin/openvpn --config /etc/openvpn/client.conf --cd /etc/openvpn --dev-node /dev/tun &


静的ルーティング設定:

VPN内(10.8.0.0)のコンピュータはLAN(192.168.1.0)のほかのコンピュータを通信したければ、ルータの設定が必要です。自宅の光ファイバのルータのHP(192.168.1.1)を開きます。「LAN側静的ルーティング設定」で10.8.0.0のゲートウェイを192.168.1.200に設定します。


一部のルータはLAN側静的ルーティング設定ができません。例えばyahoo BB ADSLなど。LAN内のコンピュータは一つずつ静的ルーティングの設定が必要です。

Windowsマシンなら:

C:\> route add 10.8.0.0 mask 255.255.255.0 192.168.1.200 metric 3 -p
「10.8.0.0」はVPNのIPアドレス。
「192.168.1.200」はVPNサーバのIPアドレス
オプション「-p」はパソコンが再起動しでも、静的ルーティングの設定も有効です。

Linuxマシンなら:
# route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.1.200
「10.8.0.0」はVPNのIPアドレス。
「192.168.1.200」はVPNサーバのIPアドレス
このコマンドを起動スクリプトに編集すれば、再起動しでも、ルーティングの設定も有効です。

静的ルーティングの設定は面倒または不能なら、ARMサーバにはNAT(ナット、Network Address Translation)を設定します。

■ iptablesで外側に向ってマスカレード(NAT)を作る

NAT(ナット、Network Address Translation)とは、IPアドレスを別のIPアドレスに変換する技術である。

主にプライベートネットワーク環境のホストから、インターネットにアクセスするために利用されるものである。また、IPアドレスに加え、ポート番号の変換を行うものはNAPT(Network Address Port Translation)と呼ぶ。

NATはiptablesというツールを使います。

まず、Linuxカーネルを再コンフィグする。
# make menuconfig



[*] Network packet filtering framework (Netfilter)を選択する。




Core Netfilter configurationの全てのアイテムを選択する。




IP: Netfilter Configurationの全てのアイテムを選択する。次のコマンドでLinuxカーネルをコンパイルする。
# make zImage
生成されたLinuxカーネルをボードに書き込んでください。書き込み方法は
こちらをご参照ください。

iptablesのURL
http://www.netfilter.org/projects/iptables/

iptablesのソースコードのコンパイル
# tar jxvf iptables-1.4.10.tar.bz2
# cd iptables-1.4.10
# ./configure --prefix=/iptables --host=arm-linux --with-ksource=/Path to/linux-2.6.32.2 --disable-ipv6
# make
# make install
生成されたフォルダ/iptablesをボードのルートにコピーする。

ボードに次のコマンドでNATを立ち上げます。
[root@kaneBeBeIII]# /iptables/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
10.8.0.0/24はVPNのIPアドレスです。

このコマンドを起動スクリプト/etc/init.d/rcSに編集したほうがいいです。起動のとき、自動的にNATを立ち上げます。

■ ARMサーバでCA(認証局)を作り、OpenVPNサーバとクライアント用の証明書とカギを作る。

環境ファイル/etc/openvpn/easy-rsa/varsの編集(適当に)

[root@kaneBeBeIII]# vi /etc/openvpn/easy-rsa/vars
 export KEY_COUNTRY=JP		← 国名
 export KEY_PROVINCE=Toky	← 都道府県名
 export KEY_CITY=Kodaira	← 市区町村名
 export KEY_ORG="nissin-tech"	← 組織名
 export KEY_EMAIL="info@nissin-tech.com"	← サーバ管理者メールアドレス

/etc/openvpn/easy-rsa で作業する。

[root@kaneBeBeIII]# cd /etc/openvpn/easy-rsa

まず、下のすべてのスクリプトの第一行
#!/bin/bash

#!/bin/sh
に変更する。

証明書/鍵作成用環境変数設定ファイル内容をシステムに反映
[root@kaneBeBeIII]# source ./vars

証明書/鍵作成先ディレクトリ初期化
[root@kaneBeBeIII]# ./clean-all ← OpenVPNインストール後最初の1回のみ

マスタCA証明書と秘密鍵の生成
[root@kaneBeBeIII]# ./build-ca ← CA証明書・秘密鍵作成
もう一度国名とか聞いてくるが、[ ]の設定内容でOKならENTERを押していく。
Organization Unit Name(部署) は空のままでもかまわない。
Common Nameが空なら、手動で my-dom.xxx CA とか適当な名称を付けてやる。
Nameが空なら、手動で nissin-tech とか適当な名称を付けてやる。
[root@kaneBeBeIII]# cp keys/ca.crt /etc/openvpn/ ← CA証明書をOpenVPN設定ファイル格納ディレクトリにコピー

サーバ証明書と秘密鍵を生成する
[root@kaneBeBeIII]# ./build-key-server server
前のステップと同様,ほとんどのパラメータはデフォルト値のまま。
Common Nameを聞かれたら"server"と入力する。
Nameが空なら、手動で nissin-tech とか適当な名称を付けてやる。
A challenge passwordとAn optional company nameはenterキーでよい。
ほかに肯定的な回答yを必要とする質問が二つある。
"Sign the certificate? [y/n]"と"1 out of 1 certificate requests certified, commit? [y/n]"。
[root@kaneBeBeIII]# cp keys/server.key /etc/openvpn/ ← サーバ秘密鍵を/etc/openvpn/にコピー
[root@kaneBeBeIII]# cp keys/server.crt /etc/openvpn/ ← サーバ証明書を/etc/openvpn/にコピー

DH (Diffie Hellman) パラメータを生成する。OpenVPNサーバにはDiffie Hellmanパラメータを生成しなければならない。
[root@kaneBeBeIII]# ./build-dh
[root@kaneBeBeIII]# cp keys/dh1024.pem /etc/openvpn/
※ 長い時間がかかります。

クライアントの証明書と鍵を作る(適当な名称で。ここではclient1等)
[root@kaneBeBeIII]# ./build-key client1
[root@kaneBeBeIII]# ./build-key client2 ← ほかのクライアント
前のステップと同様,ほとんどのパラメータはデフォルト値のまま=[ ]の内容でOKならENTERを押していく。
Organization Unit Name は空のままでもかまわない。
Common Nameを聞かれたら"client1"等と入力する。
Nameが空なら、手動で nissin-tech とか適当な名称を付けてやる。
A challenge passwordとAn optional company nameはenterキーでよい。
ほかに肯定的な回答yを必要とする質問が二つある。
"Sign the certificate? [y/n]"と"1 out of 1 certificate requests certified, commit? [y/n]"。
………………………………………
パスワード付きにしたい場合は
[root@kaneBeBeIII]# ./build-key-pass client1
Enter PEM pass phrase: ←パスフレーズを入力
Verifying - Enter PEM pass phrase: ←もう一度パスフレーズを入力
Common Name (eg, your name or your server's hostname) []:client1 ←ここ入力
Nameが空なら、手動で nissin-tech とか適当な名称を付けてやる。

OpenVPNのセキュリティを強化する(tls-auth)
tls-auth HMAC署名はSSL/TLSによって提供されるセキュリティに加えてさらに高度なセキュリティを提供。
tls-authを使用する場合は、標準のRSA証明書と鍵に加えて、共有静的鍵を生成しておく必要がある。
TLS認証鍵を/etc/openvpn/に作成
[root@kaneBeBeIII]# openvpn --genkey --secret /etc/openvpn/ta.key
この鍵ファイルはサーバとすべてのクライアントにコピーしておく必要がある(安全な方法でコピーするように注意)。

スクリプトで生成された証明書とカギはディレクトリ/etc/openvpn/keysに格納されました。適当的にサーバとクライアントにコピーしてください。

将来的にクライアントを添加すれば

[root@kaneBeBeIII]# source ./vars
[root@kaneBeBeIII]# ./build-key クライアント名
のみです。

■ VPNで自宅のパソコンを遠隔操作する(Wake On LAN, WOL)

http://trendy.nikkeibp.co.jp/article/qa/other/20020704/101001/
●電源を1カ月間入れ続けたパソコンのおおよその電気代
製品 電気代 消費電力 1ヵ月当たりの電力量
ノート(液晶を除いた本体部分のみ) 283 円 19 W 14 kWh
デスクトップ(本体のみ) 908 円 61 W 44 kWh
15インチCRTディスプレイ 1033 円 70 W 50 kWh
17インチCRTディスプレイ 1344 円 90 W 65 kWh
14.1インチ液晶ディスプレイ 372 円 25 W 18 kWh
*使用時間は24時間×30日で計算 *電気代は東京電力、従量電灯Bの第二段階料金で計算

外出先から自宅に VPN 接続し、パソコンを起動させてリモートデスクトップ接続や VNC が使えたりすると、非常に便利だ。

Wake On LAN(WOL) を利用するには、まずハードウェア的に WOL が有効になっていなければならない。LAN インターフェイスが PCI 等単体の LAN カードの場合は、BIOS 設定に加えてマザーボードと専用のケーブル接続が必要な場合もあるが、オンボードであれば、通常は BIOS 設定だけで有効/無効をコントロールできる(ことが多いはず)。

ハードウェアの準備ができれば、あとはマジックパケットを送出するプログラムを用意するだけだ。いろいろあると思うが、ここは仙石浩明氏作のフリーソフトウェア Wake-On-Lan を利用している。

上記 URL からソースコードを入手後、次の手順でコンパイルする。
$ arm-linux-gcc wol.c -o wol
生成された実行ファイルwolをARMサーバの/binにコピーします。

使い方はARMサーバで次の通り。
[root@kaneBeBeIII]# wol <ブロードキャスト IP アドレス>   <ターゲットの MAC アドレス>
[root@kaneBeBeIII]# wol   192.168.1.255   01:23:45:67:89:AB ← 使う例



仙石浩明氏のWOLよりちょっと複雑なツールはこちらにあります。
http://linux.softpedia.com/get/Utilities/wol-5720.shtml

コンパイル手順:
# tar zxvf wol-0.7.1.tar.gz
# cd wol-0.7.1
# echo "jm_cv_func_working_malloc=yes" > arm-linux.cache
# CC=arm-linux-gcc ./configure --build=i686-linux --host=arm-linux --cache-file=arm-linux.cache
# make
生成された実行ファイルsrc/wolをボードの/binにコピーします。

使い方はボードのコンソールで次のコマンド:
[root@kaneBeBeIII]# wol --help
Usage: wol [OPTION] ... MAC-ADDRESS ...
Wake On LAN client - wakes up magic packet compliant machines.

    --help          display this help and exit
-V, --version       output version information and exit
-v, --verbose       verbose output
-w, --wait=NUM      wait NUM millisecs after sending
-h, --host=HOST     broadcast to this IP address or hostname
-i, --ipaddr=HOST   same as --host
-p, --port=NUM      broadcast to this UDP port
-f, --file=FILE     read addresses from file FILE ("-" reads from stdin)
    --passwd[=PASS] send SecureON password PASS (if no PASS is given, you
                    will be prompted for the password)

Each MAC-ADDRESS is written as x:x:x:x:x:x, where x is a hexadecimal number
between 0 and ff which represents one byte of the address, which is in
network byte order (big endian).

PASS is written as x-x-x-x-x-x, where x is a hexadecimal number between 0
and ff which represents one byte of the password.

Report bugs to <krennwallner@aon.at>

[root@kaneBeBeIII]# wol  -i 192.168.1.255   01:23:45:67:89:AB ← 使う例

ターゲットマシンのコマンドプロンプトを開き、ターゲットの MAC アドレスは次の通りに調べます。
C:\> ipconfig /all ← ターゲットのパソコンはWindows環境

# ifconfig ← ターゲットのパソコンはLinux環境

自宅のWindowsパソコンを起動した後、遠隔パソコンはVPNを経由し、リモートデスクトップで接続できます。リモートデスクトップの設定は一般的な設定と同じです。こちらをご参照ください。
http://www.microsoft.com/japan/windowsxp/pro/business/feature/remote/remotedesktop.mspx

自宅のLinuxパソコンなら、puttyとWinSCPもそのまま使えます。

ターゲットマシンのコマンドプロンプトを開き、次のコマンドで自宅のパソコンの電源を切る。
C:\> shutdown -f -s -t 0 ← ターゲットのパソコンはWindows環境

# shutdown now ← ターゲットのパソコンはLinux環境

■ EXIM4, popa3d, fetchmailでメールサーバを構築する

exim は、複雑に発展しすぎてしまった sendmail の代替品として開発された、軽量でカスタマイズしやすい smtp デーモンです。

必要のソースコード:
pcre-8.12.tar.bz2
http://www.pcre.org/

db-5.1.19.tar.gz
http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html

openssl-0.9.8q.tar.gz
http://www.openssl.org/

exim-4.74.tar.bz2
http://www.exim.org/

まず、x86用のexim4をコンパイルする
pcreをコンパイルする。
# tar jxvf pcre-8.12.tar.bz2
# cd pcre-8.12
# ./configure
# make
# make DESTDIR=/x86-rootfs install

Berkeley DBをコンパイルする。
# tar zxvf db-5.1.19.tar.gz
# cd db-5.1.19
# cd build_unix
# ../dist/configure
# make

生成したファイルdb.hとlibdb-5.1.aを/x86-rootfsにコピーする。
# cp db.h /x86-rootfs/usr/local/include
# cp .libs/libdb-5.1.a /x86-rootfs/usr/local/lib
# ln -s /x86-rootfs/usr/local/lib/libdb-5.1.a /x86-rootfs/usr/local/lib/libdb.a

exim4をコンパイルする。
# tar jxvf exim-4.74.tar.bz2
# cd exim-4.74
# cp src/EDITME Local/Makefile
# touch Local/eximon.conf

次に、Local/Makefile を編集します。最近添付されているこのファイルは、何も編集しなくても一応コンパイルして動作させるだけなら可能なのですが、次の箇所だけは変更しなければなりません。
# gedit Local/Makefile

← 前提として、mail グループに所属する mail ユーザーがいることを想定していますので、適当に変えてください
EXIM_USER=
EXIM_USER=mail

# EXIM_GROUP=
EXIM_GROUP=mail

EXIM_MONITOR=eximon.bin
EXIM_MONITOR= ← X11 Windowsを使わないので、空になる

← SMTP AUTH を使う場合には
# AUTH_CRAM_MD5=yes
# AUTH_PLAINTEXT=yes
← のコメントを外したりします。

← 使用しているツールのディレクトリを/binに変更する。
COMPRESS_COMMAND=/bin/gzip
ZCAT_COMMAND=/bin/zcat

コンパイル開始します。
# make CC="cc -I/x86-rootfs/usr/local/include -L/x86-rootfs/usr/local/lib -lpthread"

生成されたx86用の実行ファイルeximをバックアップする
# cp build-Linux-i386/exim ./exim-x86


ARM用のexim4をコンパイルする
pcreをコンパイルする。
# cd pcre-8.12
# make clean
# ./configure --host=arm-linux --enable-utf8 --enable-unicode-properties
# make
# make DESTDIR=/arm-rootfs install

Berkeley DBをコンパイルする。
# cd db-5.1.19
# mkdir build_arm_linux
# cd build_arm_linux
# ../dist/configure CC=arm-linux-gcc --host=arm
# make

生成したファイルdb.hとlibdb-5.1.aを/arm-rootfsにコピーする。
# cp db.h /arm-rootfs/usr/local/include
# cp libdb-5.1.a /arm-rootfs/usr/local/lib
# ln -s /arm-rootfs/usr/local/lib/libdb-5.1.a /arm-rootfs/usr/local/lib/libdb.a

opensslをコンパイルする
# tar zxvf openssl-0.9.8q.tar.gz
# cd openssl-0.9.8q
# ./Configure --prefix=/arm-rootfs os/compiler:arm-linux-gcc
# make
# make install

exim4をコンパイルする。
# cd exim-4.74
# make clean

Local/Makefile を再編集して、TLSなどを添加する。
# gedit Local/Makefile
← 受信関連の設定
SUPPORT_MAILDIR=yes
SUPPORT_MAILSTORE=yes
SUPPORT_MBX=yes

← TLS認証の設定
SUPPORT_TLS=yes
TLS_LIBS=-L/arm-rootfs/lib -lssl -lcrypto
TLS_INCLUDE=-I/arm-rootfs/include/

再コンパイルする
# make CC="arm-linux-gcc -I/arm-rootfs/usr/local/include -L/arm-rootfs/usr/local/lib -lpthread"

生成されたARM用の実行ファイルeximをバックアップする
# cp build-Linux-i386/exim ./exim-arm

インストールする
# cp exim-x86 build-Linux-i386/exim
# make DESTDIR=/arm-rootfs install

インストール途中、このようなエラー「./exim: error while loading shared libraries: libpcre.so.0: cannot open shared object file: No such file or directory」があるかもしれません。次のコマンドで直します。
cp /x86-rootfs/usr/local/lib/libpcre.so.0.0.1 /lib
ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.0

バックアップされたARM用の実行ファイルeximをリストアする
# cp exim-arm /arm-rootfs/usr/exim/bin/exim-4.74-2

生成されたファイルをARMボードにコピーする。 ARMボード側の作業
Local/Makefileファイルには次の行がありますので、
SPOOL_DIRECTORY=/var/spool/exim
ディレクトリ/varはmailユーザもアクセスできるように設定する
[root@kaneBeBeIII]# chmod 777 /var

aliasesファイルの編集
[root@kaneBeBeIII]# vi /etc/aliases
# Person who should get root's mail. Don't receive mail as root!
root:           your@mail-address.jp

# Basic system aliases -- these MUST be present
MAILER-DAEMON:  root
postmaster:     root

eximを実行してみます。
[root@kaneBeBeIII]# chmod u+s /usr/exim/bin/exim-4.74-2 ← 実行権限を変更する
[root@kaneBeBeIII]# /usr/exim/bin/exim
2011-02-01 21:43:02 cannot run initgroups(): no passwd entry for uid=8
このようなエラーがあたら、/etc/passwdファイルを編集する。
[root@kaneBeBeIII]# vi /etc/passwd

mail:x:8:8:root:/home/exim:/bin/sh ← この行を追加する

eximを再実行してみます。
[root@kaneBeBeIII]# /usr/exim/bin/exim
Exim is a Mail Transfer Agent. It is normally called by Mail User Agents, not directly from a shell command line. Options and/or arguments control what it does when called. For a list of options, see the Exim documentation.
この情報なら、eximをインストール成功しました。

exim の動作のほとんどは、実行時(プロセス起動時)に読まれるコンフィギュレーションファイル (以下 confファイル) によって決定されます。confファイルは、デフォルトでは /usr/exim/configure にインストールされます。

exim は強力で、その軽さの割に sendmail でできることの大半を実現しています。そのため、このconfファイルの設定項目は非常に膨大になりえます。ただ、普通のメールサーバーとして動作させるには、以下の項目を変更すればとりあえず動作します。

以下、ドメイン kanebebe.dip.jp のメールを取り扱い、社内ネットワーク192.168.1.0/24、VPN10.8.0.0/24 になるような環境を前提にします。以下は変更点です。
[root@kaneBeBeIII]# vi /usr/exim/configure

primary_hostname = kanebebe.dip.jp

hostlist   relay_from_hosts = 127.0.0.1 : 192.168.1.0/24 : 10.8.0.0/24

host_lookup = !127.0.0.0/8 : !192.168.1.0/24 : !10.8.0.0/24 : *

rfc1413_hosts = !127.0.0.0/8 : *

← 非固定IPアドレスなので、メールを送信できない。スマートホストで送信する。
Gmailをスマートホストに設定する。以下はgmail関連の追加設定です。
begin routers	← ここの最後にgmailルータを追加する。
gmail_route:
  driver = manualroute
  transport = gmail_relay
  route_list = * smtp.gmail.com

begin transports	← ここの最後にgmailリレーを追加する。
gmail_relay:
  driver = smtp
  port = 587
  hosts_require_auth = $host_address
  hosts_require_tls = $host_address

begin authenticators	← ここの最後にgmailの認証を追加する。
gmail_login:
  driver = plaintext
  public_name = LOGIN
  hide client_send = : youraccount@gmail.com : yourpassword

exim をデーモンとして起動します。
[root@kaneBeBeIII]# /usr/exim/bin/exim -bd
これで exim は 25番ポートで動作するようになりました(はずです)。

次のコマンドで確認する。
[root@kaneBeBeIII]# netstat -tnl | grep :25
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN

telnetでメール送信
[root@kaneBeBeIII]# telnet localhost 25
220 kanebebe.dip.jp ESMTP Exim 4.74 Fri, 04 Feb 2011 18:39:18 +0900
MAIL FROM: from@yourdomain.com
250 OK
RCPT TO: tomail@example.com
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
From: from@yourdomain.com
To: tomail@example.com
Subjet: test
Hello world.
.
250 OK id=1PlI8h-0000F9-8Z
quit
221 kanebebe.dip.jp closing connection
Connection closed by foreign host

mailxでメール送信
mailxのソースコード: http://sourceforge.net/projects/heirloom/
mailxのコンパイル:
# tar jxvf mailx-12.4.tar.bz2
# cd mailx-12.4
# make CC=arm-linux-gcc
生成された実行ファイルmailxをボードの/binにコピーする。ボードには次のコマンドであるリンクを作ります。
# ln -s /usr/exim/bin/exim /usr/lib/sendmail

メール送信例1:
[root@kaneBeBeIII]# mailx -s "mailx test" tomail@example.com
This is test.← 入力したメールの内容。

Ctrl+D ← 入力終了、送信。
[root@kaneBeBeIII]#
※ mailxで送信すれば、eximデーモンを起動しなくでも送信できます。

メール送信例2:
[root@kaneBeBeIII]# echo "This is test." | mailx -s "mailx test" tomail@example.com

※ 「example.com」はARMサーバ自身(例はkanebebe.dip.jp)なら、ローカルのユーザに送信する。受信した内容が/var/mailに見える。

外部のメールサーバもARMサーバに送信できる。受信した内容も/var/mailに見える。やってみます。

■ POP3サーバ

POP3サーバはpopa3dを利用する。
# tar zxvf popa3d-1.0.2.tar.gz
# cd popa3d-1.0.2
# gedit params.h ← パラメータファイルを下のように変更する。
#define POP_STANDALONE	1
#define AUTH_PASSWD		1
#define AUTH_SHADOW		0
# gedit Makefile ← Makefileの変更点。
# LIBS += -lcrypt	← コメントを外したりします。
# make CC=arm-linux-gcc ← ARM用の実行ファイルをコンパイルする。
生成された実行ファイルpopa3dをボードの/binにコピーする。

ARMサーバ側の実行:
[root@kaneBeBeIII]# adduser -s /dev/null popa3d← ユーザpopa3dを添加する。
[root@kaneBeBeIII]# /bin/popa3d -D
これで popa3d は 110番ポートで動作するようになりました(はずです)。

次のコマンドで確認する。
[root@kaneBeBeIII]# netstat -tnl | grep :110
tcp        0      0 0.0.0.0:110              0.0.0.0:*               LISTEN

現在OutlookでARMメールサーバへアクセスできるようになります!

■ Fetchmailでセキュリティ(SSL)受信

Fetchmailは、POSIX互換オペレーティングシステム向けのオープンソースソフトウェアで、メールサーバからPOP3、IMAP、ETRN、OMDRといったプロトコルを使って電子メールをユーザーのローカルシステムに持ってくる。

まず、x86版のopensslをコンパイルする。
# tar zxvf openssl-0.9.8q.tar.gz
# cd openssl-0.9.8q
# ./Configure --prefix=/openssl os/compiler:cc
# make
# make install

# tar jxvf fetchmail-6.3.19.tar.bz2
# cd fetchmail-6.3.19
# ./configure --with-ssl=/openssl

コンフィグ完了すると、ARM版のopensslをコンパイルする。
# cd openssl-0.9.8q
# ./Configure --prefix=/openssl os/compiler:arm-linux-gcc
# make clean
# make
# make install

ARM版opensslを生成した後、fetchmailをコンパイルする。
# cd fetchmail-6.3.19
# make CC=arm-linux-gcc
生成された実行ファイルfetchmailをボードの/binにコピーする。

ARMボード側の/etc/servicesファイルを編集する。
[root@kaneBeBeIII]# vi /etc/services
pop3s           995/tcp         pop-3s	← 行を添加する。

ARMボード側のホーム・ディレクトリに設定ファイル.fetchmailrcを用意します。次は設定例です。
[root@kaneBeBeIII]# vi ~/.fetchmailrc
set no bouncemail
set postmaster root

defaults
    protocol POP3
    no mimedecode

poll pop.gmail.com
    user username
    pass passwd
    ssl
    is kanebebe here
外部メールサーバがpop.gmail.com、プロトコルはPOP3、ユーザ名はusername、パスワードはpasswd、ローカルユーザはkanebebeをそれぞれ置き換えてください。パスワードを保管するので、オーナ以外は見られないようにパーミッジョンを変えておきます。
[root@kaneBeBeIII]# chmod 600 ~/.fetchmailrc

fetchmailを実行してみます。「-v」オプションは接続の詳しい情報を表示する。
[root@kaneBeBeIII]# fetchmail -v
Warning: the connection is insecure, continuing anyways.」という警告が出た! このような情報「pop.gmail.com key fingerprint: 6B:C4:63:...」も見える。これを一応信用することにして、~/.fetchmailrc に sslfingerprint ' 6B:C4:63:...' を追加する。
[root@kaneBeBeIII]# vi ~/.fetchmailrc
set no bouncemail
set postmaster root

defaults
    protocol POP3
    no mimedecode

poll pop.gmail.com
    user username
    pass passwd
    ssl
    sslfingerprint '6B:C4:63:......'
    is kanebebe here

もう一度fetchmailを実行してみます。警告がないはずです。fetchmailは外部メールサーバから受信して、ローカルメールサーバEximに渡し、Eximは指定されたユーザ(例はkanebebe)に再送信する。

定期的に実行する
mycrontabに/bin/fetchmailを添加する
[root@kaneBeBeIII]# vi /etc/mycrontab

0,10,20,30,40,50 * * * * /bin/ddns-update.sh > /dev/null 2>&1
0 12 * * * /bin/ntpdate.sh > /dev/null 2>&1
0,10,20,30,40,50 * * * * /bin/fetchmail > /dev/null 2>&1 ← 毎10分に実行する。

efaxでFAXサーバを構築する

外付けFAXモデムは、USB シリアル変換器を経由して USB ポートへARMボードへ接続します。外付けFAXモデムは、デバイス・ドライバを必要としません。外付けFAXモデムを使って、FAXサーバーを構築しました。受信FAXはe-mailに添付して送ってきてくれますし、送信はスクリプトで一発です。便利です。


FAXサーバが使っているFAXモデムとUSB シリアル変換器

Linux 上で FAX を送受信する場合、 efax を用いるのが簡単なようです。ここでは、 efax 単体で送受信が出来るように設定します。

# tar zxvf efax-0.9.tar.gz
# cd efax-0.9
# make CC=arm-linux-gcc
生成された実行ファイルefax, efixとスクリプトfaxをボードの/binにコピーする。

設定はスクリプト /bin/fax を編集することで行います。
[root@kaneBeBeIII]# vi /bin/fax
DEV=ttyUSB0	← モデムが接続されているシリアル・ポートを設定します。
FROM="+81 42 343 4536"	← モデムを接続している電話回線の電話番号を指定します。
NAME="Nissin Tech Corp."		← 送信者名を指定します。

PAGE=a4	← 送信のページサイズ

TELCVT='sed -e s/+81 */0/'   # Japan	← 電話番号の変換方法を指定します。

FAXDIR=/efax	← 受信したFAXの保存先
LOGDIR=/var/log/fax
CONSOLE=$LOGDIR/efax-console.log	← efax のコンソール出力を保存するファイルを指定します。

FAXMGR=your@mailaddress.com	← 受信したFAXを電子メールに転送する。

SENDMAIL=/usr/exim/bin/exim	← 送信ツールを指定する。

ANSRINGS=6	← FAX の受信を開始するまでのベルの数を指定します。 

efax用のディレクトリを作る。
[root@kaneBeBeIII]# mkdir -m 777 -p /var/lock
[root@kaneBeBeIII]# mkdir -m 777 -p /var/log/fax
[root@kaneBeBeIII]# mkdir -m 777 -p /efax

テキストファイルのFAX送信テスト
[root@kaneBeBeIII]# fax send -l -v XXXXX test.txt
XXXXXは送信先のFAX電話番号、test.txtは送信したいテキストファイルです。スクリプトfaxは自動的にテキストファイルをtiff(G3)フォーマットのFAXファイルに変換して、送信する。

直接tiff(G3)フォーマットのFAXファイルを送信する。
[root@kaneBeBeIII]# efax -d /dev/ttyUSB0 -t "XXXXX" filename.tif
XXXXXは送信先のFAX電話番号、filename.tifは送信したいtiff(G3)フォーマットのFAXファイルです。Windows環境の印刷は「Microsoft Office Document Image Writer」に設定すれば、tiff(G3)フォーマットのFAXファイルを生成できます。

FAX受信テスト
[root@kaneBeBeIII]# efax -d /dev/ttyUSB0 -w -iS0=2 -r FaxIn
受信したFAXをFaxIn.001, FaxIn.002, ...などのtiff(G3)フォーマットのFAXファイルに保存する。

自動的にFAX受信する
一般的なLinuxの/etc/inittabファイルに以下の記述を追加すれば、自動受信が可能になります。
# gedit /etc/inittab
s1:2345:respawn:/bin/sh /bin/fax answer

ARMボードにはこのように設定すると、システムが起動不能になります。その為、以下のスクリプトを作ります。
[root@kaneBeBeIII]# vi /bin/fax.sh
#! /bin/sh
while test -c /dev/ttyUSB0
done
    /bin/fax answer
done

スクリプト/bin/fax.shを実行させます。
[root@kaneBeBeIII]# chmod +x /bin/fax.sh
[root@kaneBeBeIII]# /bin/fax.sh &
以上で、 FAX が送信されて来ると、自動的に受信し /efax へ TIFF ファイルを保存するようになります。受信したFAXも電子メールで転送します。

■ minicomとtftpdでデバッグ環境を構築する

MinicomはLinux環境でよく使われているターミナルソフトウェアです。

ソースコードのダウンロードと解凍
$ mkdir /minicom
$ cd /minicom

$ tar zxvf
minicom-2.4.tar.gz
$ tar zxvf ncurses-5.7.tar.gz

ncursesのコンパイル
# cd ncurses-5.7
# ./configure CC=arm-linux-gcc --prefix=/minicom/ncurses-5.7/install --host=arm-linux CPPFLAGS=-I/opt/FriendlyARM/toolschain/4.4.3/include LDFLAGS=-L/opt/FriendlyARM/toolschain/4.4.3/lib

# make

minicomのコンパイル
# cd minicom-2.4
# ./configure CC=arm-linux-gcc --prefix=/minicom/minicom-2.4/install --host=arm-linux CPPFLAGS=-I/minicom/ncurses-5.7/include LDFLAGS=-L/minicom/ncurses-5.7/lib --enable-cfg-dir=/etc/minicom

minicom-2.4/src/Makefileを編集して、生成したncursesライブラリを静態リンクします。
# gedit minicom-2.4/src/Makefile
minicom_LDADD = $/home/ubuntu/minicom/ncurses-5.7/lib/libncurses.a $(MINICOM_LIBPORT)

# make
minicom-2.4/src/ディレクトリにARM用の実行ファイルminicomを生成されます。

生成されたminicomをボードの/binにコピーする。

パソコン側のLinuxの/usr/share/terminfoディレクトリにはターミナルの定義ファイルです。念のために全てをボードの/usr/share/にコピーする。

パソコン側のLinuxの/etc/minicom/minirc.dflファイルもボードの/etc/minicomにコピーする。次はのminirc.dfl例です。viコマンドでも編集できます。
[root@kaneBeBeIII]# vi /etc/minicom/minirc.dfl
# Machine-generated file - use "minicom -s" to change parameters.
pu port			/dev/ttyUSB0
pu baudrate		115200
pu bits			8
pu parity			N
pu stopbits		1
pu rtscts			No

ボードの環境変数の設定:
[root@kaneBeBeIII]# export TERMINFO=/usr/share/terminfo
設定しないと、minicomはターミナルの定義ファイルを見つかりません。

この環境変数の設定も/etc/profileに編集すれば。起動の時、環境変数を自動的に設定します。

設定した後、minicomを実行してみます。

tftpdサーバの設定
tftpdは既にボードに実装されました。tftpdサーバを有効になったら、次の設定:
[root@kaneBeBeIII]# vi /etc/inetd.conf
69      dgram   udp     nowait  root    /usr/bin/tftpd          /usr/bin/tftpd  /files/to/serve← この行を追加する

■ tesseract-orcで画像の文字を読ませる

Tesseractは画像から文字を読むソフト・ライブラリです。どうやら Google 先生が開発を支援しているらしい OCR。言語(日本語や英語など)ごとに辞書が用意されているため、それを切り替える事でさまざまな言語の文字読み取りに対応できるらしい。

tesseractはleptonicaという画像解析ライブラリに依存しております。まず、leptonicaをコンパイルする
# tar zxvf leptonica-1.70.tar.gz
# cd leptonica-1.70
# ./configure --build=i686-linux --host=arm-linux --target=arm-linux CFLAGS=-I/opt/FriendlyARM/toolschain/4.4.3/include LDFLAGS=-L/opt/FriendlyARM/toolschain/4.4.3/lib CC=arm-linux-gcc CXX=arm-linux-g++ --prefix=/leptonica
# make
# make install

Tesseract OCRのプロジェクトページからライブラリのソースなどをダウンロードします。Google Project Hostingで管理されており、以下のページからダウンロードできます。

tesseract-ocr - Google Project Hosting
http://code.google.com/p/tesseract-ocr/

ダウンロードリスト
http://code.google.com/p/tesseract-ocr/downloads/list

現時点の最新リリースバージョンはVer.3.02です。
# tar zxvf tesseract-ocr-3.02.02.tar.gz
# cd tesseract-ocr
# ./autogen.sh
# ./configure --build=i686-linux --host=arm-linux --target=arm-linux CFLAGS=-I/leptonica/include LDFLAGS=-L/leptonica/lib CC=arm-linux-gcc CXX=arm-linux-g++ LIBLEPT_HEADERSDIR=/leptonica/include --prefix=/tesseract
# make
# make install

生成されたディレクトリ/leptonicaと/tesseractをすべてボードのルート/にコピーする。libディレクトリのファイルをすべて/libにコピーする
Tesseract用の言語データ(英語)tesseract-ocr-3.02.eng.tar.gzを/tesseract/share/tessdataに解凍する。

とりあえずテストしてみましょう。 tesseractはコマンドラインのツールも付属していて、このプログラムに画像を食わせると、解析結果をテキストファイルにして吐き出してくれます。
[root@kaneBeBeIII]# tesseract font.png result -l eng
すると result.txt が出来ているので中を開くと、結果が書かれています。

tesseractのライブラリを使用すると、自作プログラムに画像の文字を読ませる。詳しくのはGoogleでご参照ください。

■ パソコン計測USBマイコン基板


このボードのUSB-SPI変換器(PIC18G14K50)はCDCクラスを採用して、Linux環境でも使えます。

まず、Linuxカーネルをコンフィグして、
# make menuconfig

Device DriversのUSB supportのUSB Modem (CDC ACM) supportを選択して、
# make zImage
生成されたLinuxカーネルをボードに書き込んでください。書き込み方法はこちらをご参照ください。


KaneBeBe ARM9/2440を接続する様子

ARM9/2440のコンソールで次のコマンドを入力すると、ボードが見えます。
[root@kaneBeBeIII]# ls /dev/ttyACM*
/dev/ttyACM0

minicomを設定して、/dev/ttyACM0をアクセスする。
[root@kaneBeBeIII]# minicom -s
            ┌──[configuration]────
            │ Filenames and paths 
            │ File transfer protocols
            │ Serial port setup ← 選択する。
            │ Modem and dialing
            │ Screen and keyboard
            │ Save setup as dfl ← 設定完了後、保存する。
            │ Save setup as..
            │ Exit
            │ Exit from Minicom
            └─────────────

    ┌─────────────────────
    │ A -    Serial Device      : /dev/ttyACM0 ← CDCシリアルポートを選択する。
    │ B - Lockfile Location     : /var/lock
    │ C -   Callin Program      :
    │ D -  Callout Program      :
    │ E -    Bps/Par/Bits       : 115200 8N1
    │ F - Hardware Flow Control : No
    │ G - Software Flow Control : No
    │
    │    Change which setting?
    └─────────────────────

minicomを起動させて、ボードを操作してみよう。
[root@kaneBeBeIII]# minicom
Welcome to minicom 2.4

OPTIONS: I18n
Compiled on Dec 26 2010, 01:45:17.
Port /dev/ttyACM0

Press CTRL-A Z for help on special keys
まずCtrl-A Zを入力して、設定します。
┌─────────────────────────────────
│                     Minicom Command Summary
│
│          Commands can be called by CTRL-A                   
│                                                                  
│               Main Functions                  Other Functions    
│                                                                  
│ Dialing directory..D  run script (Go)....G | Clear Screen.......C
│ Send files.........S  Receive files......R | cOnfigure Minicom..O
│ comm Parameters....P  Add linefeed.......A | Suspend minicom....J
│ Capture on/off.....L  Hangup.............H | eXit and reset.....X
│ send break.........F  initialize Modem...M | Quit with no reset.Q
│ Terminal settings..T  run Kermit.........K | Cursor key mode....I
│ lineWrap on/off....W  local Echo on/off..E | Help screen........Z
│ Paste file.........Y                       | scroll Back........B
│                                                                  
│      Select function or press Enter for none.                    
│                                                                  
│             Written by Miquel van Smoorenburg 1991-1995          
│             Some additions by Jukka Lahtinen 1997-2000           
│             i18n by Arnaldo Carvalho de Melo 1998                
└─────────────────────────────────
Eを入力して「local Echo on」に設定する。ボードのコマンドを入力して体験する。
E ← 「E」と打ち込んでリターン・キーを押してみましょう。
A ← 「A」と返ってきたら接続成功です。
C08000A ← 「C08000A」をADCモード・レジスタに書き込む。
A ← 正常なら「A」が返ってきます。
RA ← 連続サンプリングでデータを10個読み出す。10回は16進表示で「A」なので「RA」と入力している。
000000
000000
000000
000000
000011
00002F
000007
000000
000000
000017

C101086 ← 内部温度センサーを選ぶためのレジスタを設定する。
A
RA
34F325
34F305
34F301
34F2ED
34F312
34F32F
34F326
34F338
34F332
34F32B

温度の換算:
電圧[V] = 34F325 ÷ 16777216 × 1.17 ÷ 1 = 0.241997057
0.81mV/℃より、
温度 = 0.241997057 ÷ 0.81 × 1000 = 298.76K
ここへ、-273.15(0K)を加えると
298.76K - 273.15 = 25.61℃
ということになります。

■ PC/SCでCCID準拠のUSB NFC RFIDカードリーダ・ライタを使う

PC/SC (Personal Computer/Smart Card)は、Windows環境でICカードを利用するための標準アプリケーションインターフェイス仕様である。Microsoftは、ICカードを認識するアプリケーション開発するための、デバイスに依存しないAPIを提供している。CCID規格(Chip Card Interface Device)はリーダライタとコンピュータの標準インターフェイスです、メーカーが異なっても、カードとリーダライタ間の相互運用が可能となる。デバイスに依存しない API があれば、アプリケーション開発者は、現在の実装と将来の実装の相違を気にする必要がなくなる。また、デバイスに依存しない API により、ハードウェアが変更されてもアプリケーションを使用できるため、ソフトウェアの開発費用を削減できる。Microsoft社が無償で提供する標準インターフェース仕様PC/SC APIを利用すれば、サブライセンスフィー等の追加費用も不要。

NFC(Near Field CommunicationはソニーとPhilips社が開発した、短距離無線通信規格。2003年12月にISO/IEC IS 18092として国際標準となった。

13.56MHzの電波を使い、10cm程度のごく近距離で100~400kbpsの双方向通信が可能。もともと、非接触式ICカードとして広く普及しているソニーの「FeliCa」や、Philips社の「Mifare」で使われていた通信方式である。

今回、市販のCCID規格準拠 NFC リーダライタを使って、Linux環境のPC/SC標準のオープンソースpcsc-liteを利用しています。FeliCaまたはMifareカードの番号を読み込んで、市販のUSB WiFi経由でHTTPS通信にて、インターネット上のサーバにデータを送信する。


KaneBeBe III ARM9/2440 CCID準拠NFCリーダライタ USB 無線LANアダプタ
USB HUB FeliCaカード Mifareカード

必要のソース
libusb-1.0.8.tar.bz2
http://www.libusb.org/

pcsc-lite-1.7.2.tar.bz2
ccid-1.4.3.tar.bz2
http://pcsclite.alioth.debian.org/

libusbをコンパイルする
# tar jxvf libusb-1.0.8.tar.bz2
# cd libusb-1.0.8
# ./configure --host=arm-linux --prefix=/pcsc
# make
# make install

ライブラリの設定:
# export PKG_CONFIG_PATH=/pcsc/lib/pkgconfig:$PKG_CONFIG_PATH
# export LD_LIBRARY_PATH=/pcsc/lib:$LD_LIBRARY_PATH

pcsc-liteをコンパイルする
# tar jxvf pcsc-lite-1.7.2.tar.bz2
# cd pcsc-lite-1.7.2
# ./configure --host=arm-linux --prefix=/pcsc --enable-libusb --disable-libudev --enable-usbdropdir=/pcsc/drivers
# make
# make install

# cp src/.libs/testpcsc /pcsc/sbin ← テスト用のプログラムもコピーする

ccidをコンパイルする
# tar jxvf ccid-1.4.3.tar.bz2
# cd ccid-1.4.3
# ./configure --host=arm-linux --prefix=/pcsc --enable-usbdropdir=/pcsc/drivers
# make
# make install

生成されたディレクトリ/pcscをボードのルートにコピーする。次のコマンドでPCSCデーモンを起動させる。
[root@kaneBeBeIII]# /pcsc/sbin/pcscd

ICカードをテストする
[root@kaneBeBeIII]# /pcsc/sbin/testpcsc
MUSCLE PC/SC Lite unitary test Program

THIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL FOR END USERS!
Do NOT use it unless you really know what you do.

Testing SCardEstablishContext   : Command successful.
Testing SCardIsValidContext     : Command successful.
Testing SCardIsValidContext     : Invalid handle. (don't panic)
Testing SCardListReaderGroups   : Command successful.
Group 01: SCard$DefaultReaders
Testing SCardFreeMemory         : Command successful.
Testing SCardListReaders        : Command successful.
Testing SCardListReaders        : Command successful.
Reader 01: ACS ACR122U PICC Interface 00 00
Waiting for card insertion      :← ICカードをタッチしてください
Testing SCardConnect            : Command successful.
Select file: 00 A4 00 00 02 3F 00
Testing SCardTransmit           : Command successful.
 card response: 63 00
Testing SCardControl            : Transaction failed. (don't panic)
Testing SCardGetAttrib          : Command successful.
SCARD_ATTR_DEVICE_FRIENDLY_NAME: ACS ACR122U PICC Interface 00 00
Testing SCardFreeMemory         : Command successful.
Testing SCardGetAttrib          : Command successful.
SCARD_ATTR_ATR_STRING length: 20
SCARD_ATTR_ATR_STRING: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 F0 11 00 00 00 00 8A
Testing SCardFreeMemory         : Command successful.
Testing SCardGetAttrib          : Command successful.
Vendor IFD version              : 0x01040003
Testing SCardGetAttrib          : Command successful.
Max message length              : 261
Testing SCardGetAttrib          : Command successful.
Vendor name                     : Ludovic Rousseau
Testing SCardSetAttrib          : Transaction failed. (don't panic)
Testing SCardStatus             : Command successful.
Current Reader Name             : ACS ACR122U PICC Interface 00 00
Current Reader State            : 0xd0034
Current Reader Protocol         : T=1
Current Reader ATR Size         : 20 bytes
Current Reader ATR Value        : 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 F0 11 00 00 00 00 8A
Testing SCardFreeMemory         : Command successful.
Testing SCardFreeMemory         : Command successful.
Press enter: ← Enterキーを押してください
Testing SCardReconnect          : Command successful.
Testing SCardDisconnect         : Command successful.
Testing SCardFreeMemory         : Command successful.
Testing SCardReleaseContext     : Command successful.

PC/SC Test Completed Successfully !

■ libnfcでPN53xに基づくNFC RFIDカードリーダ・ライタを使う

libnfcとはNFC (Near Field Communication : 近距離無線通信) デバイス(NXP社製PN53xシリーズ)を利用するためのライブラリである。Felica はNFCと下位互換性を維持している。

libnfcのソースとドキュメントを以下のサイトからダウンロードする。
http://www.libnfc.org/

libnfcをコンパイルする
# tar zxvf libnfc-1.4.2.tar.gz
# cd libnfc-1.4.2
# ./configure --host=arm-linux --with-drivers=pn532_uart --enable-serial-autoprobe
# make
# make install DESTDIR=/libnfc
※ PN532だけ(--with-drivers=pn532_uart)を利用します。
※ 使うシリアルポートを自動的に探します。libnfc/buses/uart.hには探すシリアルポートの順番があります。Linux環境の探す順番は"/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2", "/dev/ttyUSB3", "/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3"等、ボードの環境によって改修したほうがいいです。

生成されたライブラリ/libnfc/usr/local/lib/libnfc.so.1をボードの/libにコピーする。生成されたサンプルの実行ファイル/libnfc/usr/local/bin/nfc-listをボードの/binにコピーする。


写真はPN532 RFIDカードリーダ開発キット(下)とARM9/2440ボード(上)が一緒に動く様子です。PN532 RFIDカードリーダにはUSBシリアル変換チップがありますので、デバイス名は"/dev/ttyUSB0"です。

ボードでサンプルを実行させる:
[root@kaneBeBeIII]# nfc-list ← サンプルを実行させる。
nfc-list use libnfc 1.4.2 (r891)
Connected to NFC device: PN532 (/dev/ttyUSB0) - PN532 v1.4 (0x07) ← 接続されたPN532を探した。
1 Felica (212 kbps) passive target(s) was found: ← 1枚FeliCaカード(212 kbps)を探した。
        ID (NFCID2): 01  1a  00  4b  2c  0f  ee  0c
  Parameter (PAD): 01  10  8b  42  8f  be  cb  ff

1 Felica (424 kbps) passive target(s) was found: ← 1枚FeliCaカード(424 kbps)を探した。
        ID (NFCID2): 01  1a  00  4b  2c  0f  ee  0c
  Parameter (PAD): 01  10  8b  42  8f  be  cb  ff
[root@kaneBeBeIII]# nfc-list ← サンプルを実行させる。
nfc-list use libnfc 1.4.2 (r891)
Connected to NFC device: PN532 (/dev/ttyUSB0) - PN532 v1.4 (0x07) ← 接続されたPN532を探した。
1 ISO14443A passive target(s) was found: ← 1枚ISO14443Aカードを探した。
    ATQA (SENS_RES): 00  44
       UID (NFCID1): 04  8a  37  71  fc  02  80
      SAK (SEL_RES): 00

■ USBバーコードリーダを使う

USBバーコードリーダはUSB HIDクラスなので、一般的にLinux環境でキーボードとして直接使えます。
あるUSBバーコードリーダをボードに挿入すると、次のメッセージ:
usb 1-1.3: new low speed USB device using s3c2410-ohci and address 3
usb 1-1.3: New USB device found, idVendor=1130, idProduct=0001
usb 1-1.3: New USB device strings: Mfr=0, Product=2, SerialNumber=0
usb 1-1.3: Product: USB-TMU-V1
usb 1-1.3: configuration #1 chosen from 1 choice
Linuxで認識できません!!!

カーネルソースlinux-2.6.32.2を見ると、HIDドライバはこの製品のidVendor=1130, idProduct=0001を無視しました。
# gedit linux-2.6.32.2/drivers/hid/hid-ids.h
~略~
#define USB_VENDOR_ID_TENX			0x1130
#define USB_DEVICE_ID_TENX_IBUDDY1	0x0001
~略~

linux-2.6.32.2/drivers/hid/hid-core.cを直して、無視されたデバイスリストからコメントアウトします。
# gedit linux-2.6.32.2/drivers/hid/hid-core.c
/* a list of devices that shouldn't be handled by HID core at all */
static const struct hid_device_id hid_ignore_list[] = {
~略~
← 次の行を削除またはコメントアウトする
//	{ HID_USB_DEVICE(USB_VENDOR_ID_TENX, USB_DEVICE_ID_TENX_IBUDDY1) },
~略~

次のコマンドでLinuxカーネルを再コンパイルする
# make zImage
生成されたLinuxカーネルをボードに書き込んでください。書き込み方法は
こちらをご参照ください。

もう一度USBバーコードリーダを挿入すると、認識されました!
usb 1-1.3: new low speed USB device using s3c2410-ohci and address 3
usb 1-1.3: New USB device found, idVendor=1130, idProduct=0001
usb 1-1.3: New USB device strings: Mfr=0, Product=2, SerialNumber=0
usb 1-1.3: Product: USB-TMU-V1
usb 1-1.3: configuration #1 chosen from 1 choice
input: USB-TMU-V1 as /devices/platform/s3c2410-ohci/usb1/1-1/1-1.3/1-1.3:1.0/input/input1
generic-usb 0003:1130:0001.0001: input: USB HID v1.10 Keyboard [USB-TMU-V1] on usb-s3c24xx-1.3/input0

LCDがあれば、QT環境のターミナルまたはメモ帳などのアプリケーションを開いて、バーコードをスキャンしてみます。

コンソール環境のテスト用のCプログラムはusbkey.c以下です。
# gedit usbkey.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <linux/input.h>

//Should modify for your system
#define KEY_DEV "/dev/input/event1"

int main(int arg, char *arv[])
{
    static int fd = -1;
    static struct input_event event;

	char *KEY_DEV_NAME = KEY_DEV;
	if(arg > 1) KEY_DEV_NAME = arv[1];

    if ( (fd = open(KEY_DEV_NAME, O_RDONLY)) < 0) {
        printf("Error open %s\n\n", KEY_DEV_NAME);
        exit(1);
    }

    while(1) {
        read(fd, &event, sizeof(event));
        if (event.type == EV_KEY)
            printf(" type: EV_KEY, event = %d, value = %d\n", event.code, event.value);
        }

//value:0——up 1——down 2——continue

        return 0;
}

次のコマンドでコンパイルする
# arm-linux-gcc -o usbkey usbkey.c

生成された実行ファイルusbkeyをボードの/binにコピーして、次のようなテストします。
[root@kaneBeBeIII]# usbkey ← USBキーボードをテストする
 type: EV_KEY, event = 4, value = 1 ← USBバーコードリーダがスキャンした結果
 type: EV_KEY, event = 4, value = 0
 type: EV_KEY, event = 9, value = 1
 type: EV_KEY, event = 9, value = 0
 type: EV_KEY, event = 9, value = 1
 type: EV_KEY, event = 9, value = 0
 type: EV_KEY, event = 11, value = 1
 type: EV_KEY, event = 11, value = 0
 type: EV_KEY, event = 5, value = 1
 type: EV_KEY, event = 5, value = 0
 type: EV_KEY, event = 7, value = 1
 type: EV_KEY, event = 7, value = 0
 type: EV_KEY, event = 28, value = 1
 type: EV_KEY, event = 28, value = 0

■ Bluetoothデバイス(GPS,シリアル変換器)を使おう!


Bluetooth-RS232無線変換器(上)

Bluetoothシリアル変換モジュール(左)

Bluetooth-GPS(右)
まず、Linuxカーネルをコンフィグする。Bluetooth関連のアイテムをすべて選択する。
# make menuconfig




次のコマンドでLinuxカーネルを再コンパイルする
# make zImage
生成されたLinuxカーネルをボードに書き込んでください。書き込み方法は
こちらをご参照ください。

必要ののソースコード:
expat-2.0.1.tar.gz
http://expat.sourceforge.net/

dbus-1.4.8.tar.gz
http://cgit.freedesktop.org/dbus/dbus/

glib-2.22.5.tar.bz2
http://www.gtk.org/

libusb-0.1.12.tar.gz
http://www.libusb.org/

bluez-4.91.tar.gz
http://www.bluez.org/

expatをコンパイルする。
# tar zxvf expat-2.0.1.tar.gz
# cd expat-2.0.1
# ./configure --prefix=/bluez --host=arm-linux
# make
# make install

dbusをコンパイルする。
# tar zxvf dbus-1.4.8.tar.gz
# cd dbus-1.4.8
# ./configure --prefix=/bluez --host=arm-linux CC="arm-linux-gcc -I/bluez/include -L/bluez/lib" --with-x=no
# make
# make install

glibをコンパイルする。
# tar jxvf glib-2.22.5.tar.bz2
# cd glib-2.22.5

# echo ac_cv_type_long_long=yes>arm-linux.cache
# echo glib_cv_stack_grows=no>>arm-linux.cache
# echo glib_cv_uscore=no>>arm-linux.cache
# echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache
# echo ac_cv_func_posix_getgrgid_r=yes>>arm-linux.cache

# ./configure --prefix=/bluez --host=arm-linux --cache-file=arm-linux.cache
# make
# make install

libusbをコンパイルする。
# tar zxvf libusb-0.1.12.tar.gz
# cd libusb-0.1.12
# ./configure --prefix=/bluez --host=arm-linux
# make
# make install

ライブラリの設定:
# export PKG_CONFIG_PATH=/bluez/lib/pkgconfig:$PKG_CONFIG_PATH
# export LD_LIBRARY_PATH=/bluez/lib:$LD_LIBRARY_PATH

bluezをコンパイルする。
# tar zxvf bluez-4.91.tar.gz
# cd bluez-4.91
# ./configure --prefix=/bluez --host=arm-linux CC="arm-linux-gcc -I/bluez/include -L/bluez/lib"
# make
# make install

生成されたディレクトリ/bluezをボードのルートにコピーする。次のコマンドで動作確認する。
[root@kaneBeBeIII]# /bluez/sbin/hciconfig hci0 up ← Bluetoothアダプタを起動させる
[root@kaneBeBeIII]# /bluez/sbin/hciconfig ← Bluetoothアダプタの状態を確認する
hci0:   Type: BR/EDR  Bus: USB
        BD Address: 00:1F:81:00:02:50  ACL MTU: 1021:4  SCO MTU: 180:1
        UP RUNNING
        RX bytes:348 acl:0 sco:0 events:11 errors:0
        TX bytes:38 acl:0 sco:0 commands:11 errors:0

[root@kaneBeBeIII]# /bluez/bin/hcitool scan ← 周りのBluetoothデバイスをスキャンする
Scanning ...
        00:1C:88:30:F9:8A       887 GPS
        00:12:6F:22:FC:C4      Serial Adapter
        00:11:09:22:06:95         IRXON

← Bluetoothペアリング関連の設定
[root@kaneBeBeIII]# cd /bluez/var/lib/bluetooth
[root@kaneBeBeIII]# mkdir 00:1F:81:00:02:50 00:1F:81:00:02:50はホスト側のBluetoothアダプタのアドレス
[root@kaneBeBeIII]# cd 00:1F:81:00:02:50
[root@kaneBeBeIII]# echo "00:1C:88:30:F9:8A 0000" >> pincodes ← Bluetooth GPSのペアリング
[root@kaneBeBeIII]# echo "00:12:6F:22:FC:C4 1234" >> pincodes ← Bluetooth RS232変換器のペアリング [root@kaneBeBeIII]# echo "00:11:09:22:06:95 0000" >> pincodes ← Bluetoothシリアル変換モジュール

[root@kaneBeBeIII]# /bluez/bin/dbus-daemon --system
Failed to start message bus: Could not get UID and GID for username "messagebus"
← このエラーを解消するために、次のコマンドで"messagebus"というユーザを添加する。
[root@kaneBeBeIII]# useradd messagebus

[root@kaneBeBeIII]# /bluez/sbin/bluetoothd

[root@kaneBeBeIII]# /bluez/bin/l2ping -c 4 00:1C:88:30:F9:8A ← Bluetoothのpingで通信確認する
Ping: 00:1C:EE:2F:CD:D0 from 00:1F:81:00:02:50 (data size 44) ...
44 bytes from 00:1C:88:30:F9:8A id 0 time 37.79ms
44 bytes from 00:1C:88:30:F9:8A id 1 time 20.10ms
44 bytes from 00:1C:88:30:F9:8A id 2 time 23.08ms
44 bytes from 00:1C:88:30:F9:8A id 3 time 20.13ms
4 sent, 4 received, 0% loss

← Bluetoothデバイスが提供しているサービスを探す
[root@kaneBeBeIII]# /bluez/bin/sdptool browse 00:1C:88:30:F9:8A
Browsing 00:1C:88:30:F9:8A ...
Service Name: SPP slave
Service RecHandle: 0x10000
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100

[root@kaneBeBeIII]# /bluez/bin/rfcomm bind 0 00:1C:88:30:F9:8A ← bind the bluetooth GPS to /dev/rfcomm0

[root@kaneBeBeIII]# cat /dev/rfcomm0 ← watch the NMEA strings coming from the bluetooth GPS
$GPGGA,013709.000,,,,,0,0,,,M,,M,,*44
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,2,1,08,06,81,269,,03,63,250,31,16,60,333,22,31,38,143,*7E
$GPGSV,2,2,08,21,32,069,,19,32,227,,23,31,269,,13,26,299,*78
$GPRMC,013709.000,V,,,,,0.00,160.49,190911,,,N*4A
$GPGGA,013710.000,,,,,0,0,,,M,,M,,*4C

[root@kaneBeBeIII]# /bluez/bin/rfcomm bind 1 00:12:6F:22:FC:C4 ← bind the bluetooth RS232 to /dev/rfcomm1

[root@kaneBeBeIII]# cat /dev/rfcomm1 ← watch the character coming from the bluetooth RS232
1234567890abcdefg  ← Coming from the bluetooth RS232

■ インターネット放送局(Live555)

RTSP はオーディオ、ビデオなどのマルチメディア・データをふくむサーバを遠隔操作するためのプロトコルであり、テープレコーダのように再生、停止、記録 (録音) などの操作ができる。

LIVE555 is an open source (LGPL) C++ library for multimedia streaming.[1] It supports open standards such as RTP/RTCP, RTSP, SIP for streaming, and can also manage video and audio formats such as MPEG, H.263+ JPEG video. It is designed in such a way that it can be easily extended to support more formats.

必要のソースコード

live555-latest.tar.gz
http://www.live555.com/

live555をコンパイルする
# tar zxvf live555-latest.tar.gz
# cd live
# chmod +w config.armlinux
# gedit config.armlinux
CROSS_COMPILE?= arm-linux- ← コンパイルツールをarm-linuxに変更する。
......

# ./genMakefiles armlinux
# make

生成された実行ファイルmediaServer/live555MediaServerをボードの/binにコピーします。ボードのコンソールで次のコマンドでMedia Serverを起動させます。
[root@kaneBeBeIII]# chmod +x /bin/live555MediaServer ← 実行権限を与える。

← 起動のディレクトリでサンプル用のメディアファイルを保存する。
[root@kaneBeBeIII]# wget http://kanebebe.dip.jp/download/ARM9-2440-DVD/Linux/apache/panda.mpg

[root@kaneBeBeIII]# /bin/live555MediaServer ← Media Serverを起動させます。
LIVE555 Media Server
        version 0.74 (LIVE555 Streaming Media library version 2012.01.25).
Play streams from this server using the URL
        rtsp://192.168.1.200/<filename>
where  is a file present in the current directory.
Each file's type is inferred from its name suffix:
        ".264" => a H.264 Video Elementary Stream file
        ".aac" => an AAC Audio (ADTS format) file
        ".ac3" => an AC-3 Audio file
        ".amr" => an AMR Audio file
        ".dv" => a DV Video file
        ".m4e" => a MPEG-4 Video Elementary Stream file
        ".mkv" => a Matroska audio+video+(optional)subtitles file
        ".mp3" => a MPEG-1 or 2 Audio file
        ".mpg" => a MPEG-1 or 2 Program Stream (audio+video) file
        ".ts" => a MPEG Transport Stream file
                (a ".tsx" index file - if present - provides server 'trick play' support)
        ".wav" => a WAV Audio file
        ".webm" => a WebM audio(Vorbis)+video(VP8) file
See http://www.live555.com/mediaServer/ for additional documentation.
(We use port 8000 for optional RTSP-over-HTTP tunneling,
or for HTTP live streaming (for indexed Transport Stream files only).)

windows側はVLCを利用します。VLCで「rtsp://MediaServer IP address/panda.mpg」を入力すると、メディアが見えます。

■ インターネットラジオ・テレビ(MPlayer)

MPlayer(エムプレーヤー)は、オープンソースのメディアプレーヤーである。GNU General Public License下で配布されるフリーソフトウェアであり、Linux・UNIXライクなOS・Mac OS X・Windowsなど多くのOSに対応している。LIVE555のメディアストリーム・ライブラリを利用すれば、インターネットラジオ・テレビとして使えます。

MPlayer内部のMP3デコーダは浮動小数点演算を使っているので、FPUがないARMプロセッサーで動けば遅いです。libmadはデコードが早くて精度も高く、かつ移植性が良いのでかなり優秀です。利用します。

必要のソースコード

libmad-0.15.1b.tar.gz
http://www.archlinux.org/packages/extra/i686/libmad/

live555-latest.tar.gz
http://www.live555.com/

MPlayer-1.0rc4.tar.gz
http://www.mplayerhq.hu/design7/news.html

libmadをコンパイルする
# tar zxvf libmad-0.15.1b.tar.gz
# cd libmad-0.15.1b

← This removes an obsolete compilation option that causes compilation to fail under GCC 4.4.x
# sed -i '/-fforce-mem/d' configure

# CC=arm-linux-gcc ./configure --prefix=$PWD/../libmad --enable-fpm=arm --host=arm-linux --disable-debugging --enable-shared --enable-static
# make
# make install

live555をコンパイルする
# tar zxvf live555-latest.tar.gz
# cd live
# chmod +w config.armlinux
# gedit config.armlinux
CROSS_COMPILE?= arm-linux- ← コンパイルツールをarm-linuxに変更する。
......

# ./genMakefiles armlinux
# make

# cd ..
# cp -r live /usr/local/lib ← MPlayer用のためにライブラリをコピーする。

MPlayerをコンパイルする
# tar zxvf MPlayer-1.0rc4.tar.gz
# cd MPlayer-1.0rc4

# ./configure --prefix=$PWD/../mplayer --host-cc=gcc --cc=arm-linux-gcc --target=arm-linux --disable-gui --enable-fbdev --disable-dvdread --disable-mp3lib --disable-win32dll --disable-mencoder --disable-ivtv --disable-dvdnav --disable-dvdread-internal --disable-libdvdcss-internal --enable-libavcodec_a 2>&1 | tee logfile

# make
以下のようなコンパイルエラーメッセージ
libmepg2/motion_comp_s.S: Error: selected processor does not support `pld [r1]''
ARM9には「PLD」命令がありません、ibmepg2/motion_comp_s.Sを編集する。
# gedit libmepg2/motion_comp_s.S
← ファイルの先頭に次のマクロを添加する。
#ifndef HAVE_PLD  
.macro pld reg  
.endm  
#endif

無事コンパイル完了すると、インストールします。
# make install
以下のようなエラーメッセージ
        install -m 755 -s mplayer /home/hxy/MPlayer/ 
        MPlayer-1.0rc4/../mplayer/bin 
        strip: Unable to recognise the format of the input file
       `/user/local/Mplayer/MPlayer-1.0rc4/../mplayer/bin/mplayer'
ARM用の実行ファイルが生成されたので、X86用のstripが使えません。Makefileを編集する。
# gedit Makefile
......
$(INSTALL) -m 755 $(INSTALLSTRIP) mplayer$(EXESUF) $(BINDIR)
......
$(INSTALLSTRIP)を削除します。

生成された実行ファイルmplayer/mplayerをボードの/binにコピーします。

生成されたlibmadライブラリlibmad/lib/libmad.so.0.2.1をボードの/libにコピーします。関連のリンクを作ります。実はボードにはlibmadライブラリが既にあります。このステップを省略しでも大丈夫です。
[root@kaneBeBeIII]# ln -s /lib/libmad.so.0.2.1 /lib/libmad.so.0
[root@kaneBeBeIII]# ln -s /lib/libmad.so.0.2.1 /lib/libmad.so

mplayerのテスト:
← ビデオファイルの再生
[root@kaneBeBeIII]# mplayer panda.mpg -vo fbdev2 -fs

← オーディオファイルの再生
[root@kaneBeBeIII]# mplayer NewSoul.mp3 -vo null

インターネット放送局を作ったら
[root@kaneBeBeIII]# mplayer rtsp://192.168.1.200/panda.mpg -vo fbdev2

← インターネット上のラジオ放送局
[root@kaneBeBeIII]# mplayer -quiet -vo null http://wms.shibapon.net/FmKushiro ← FMくしろ
[root@kaneBeBeIII]# mplayer -quiet -vo null mms://wm2.hvc.co.jp/sankakuyama ← 三角山放送局

← インターネットのビデオ放送
[root@kaneBeBeIII]# mplayer mms://media.chinabroadcast.cn/japanese/111128cinema.wmv -vo fbdev2 -vf scale=320:180
ARM9の性能不足なので、インターネットビデオの再生の実用性がありません。

■ SPIドライバ・使い方

ボード(V5.0以降)にはSPIポートがあります。SPIポートでほかのMCUまたはFPGAと通信できます。

まず、次の画面を通りに、カーネルををコンフィグする。



ソースコードarch/arm/mach-s3c2440/mach-mini2440.cに下の内容を添加する。
~略~
#include <sound/s3c24xx_uda134x.h>

//spi add by nissin-tech
#include <linux/spi/spi.h> 
#include <mach/spi.h> 
 
static struct spi_board_info s3c2410_spi0_board[] = { 
        [0] = { 
                 .modalias = "spidev", 
                .bus_num        = 0,  
                .chip_select        = 0, 
                .irq = IRQ_EINT9, //IRQ_TIMER0
                .max_speed_hz         = 2500*1000, 
        }, 
}; 
 
static struct s3c2410_spi_info s3c2410_spi0_platdata = { 
        .pin_cs = S3C2410_GPG(2), 
        .num_cs = 1, 
        .bus_num = 0, 
}; 
//end add spi
~略~

関数__init mini2440_machine_initに下の内容を添加する。
~略~
static void __init mini2440_machine_init(void)
{
//spi add by nissin-tech
s3c_device_spi0.dev.platform_data=&s3c2410_spi0_platdata;
spi_register_board_info(s3c2410_spi0_board,ARRAY_SIZE(s3c2410_spi0_board));
//end add spi
~略~

配列mini2440_devicesに「&s3c_device_spi0」を添加する。
~略~
static struct platform_device *mini2440_devices[] __initdata = {
	&s3c_device_usb,
	&s3c_device_rtc,
	&s3c_device_lcd,
	&s3c_device_wdt,
	&s3c_device_i2c0,
	&s3c_device_iis,
	&mini2440_device_eth,
	&s3c24xx_uda134x,
	&s3c_device_nand,
	&s3c_device_sdi,
	&s3c_device_usbgadget,
	&s3c_device_spi0,// add by nissin-tech
};


ソースコードdrivers/spi/spi_s3c24xx.cに下の内容を添加する。
~略~
#include <mach/spi.h>

#include <mach/regs-gpio.h> //add by nissin-Tech

関数s3c24xx_spi_initialsetupの最後、次の内容を添加する。
~略~
// add by nissin-Tech
s3c2410_gpio_cfgpin(hw->pdata->pin_cs,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(0x8B, S3C2410_GPIO_SFN2);
s3c2410_gpio_cfgpin(0x8C, S3C2410_GPIO_SFN2);
s3c2410_gpio_cfgpin(0x8D, S3C2410_GPIO_SFN2);
// end add

カーネルを再コンパイルして、ボードに書き込む。ボードを起動させると、次のコマンドでSPIデバイスが見えます。
[root@kaneBeBeIII]# ls /dev/spidev0.0 -l
crw-rw---- 1 root root 153, 0 Jan 1 08:00 /dev/spidev0.0


ソースDocumentation/spi/spidev_test.cはSPIデバイスを使うサンプルです。spidev_test.cをコンパイルして、実行してみよう!

■ USB仮想シリアルポートでCAN通信

Linuxには沢山のUSBシリアル変換チップのドライバがあります。USB CDCにも対応しています。ほとんどの市販のUSBシリアル変換ケーブルとUSBシリアル変換チップ内蔵のデバイスを直接使えます。

LPC11C14はCAN機能付けLPC1114のアップデート版です。CANとCANopenプロトコル・ファームウェア内蔵しますので、簡単的にCAN通信プログラムを開発できます。
LPC11C14開発キットにはUSBシリアル変換チップCP2102内蔵、簡単的にUSB-CAN変換器として使えます。

CAN通信実験の様子

二つのLPC11C14開発キットを使っている。リモートのLPC11C14はAD値をCANで発送する。ARM9/2440に接続しているLPC11C14開発キットはCANでこのAD値を受信して、そのままシリアルポートへ転送する。

LPC11C14開発キットにはサンプルCode\MCB11C14\CAN_Demoを書き込みます。二つのLPC11C14ボードを使えば、ソースコードCanDemo.cを下のように直します。
~略~
/* COMMENT THE LINE BELOW TO ENABLE DEVICE TO PARTICIPATE IN CAN NETWORK   */
//  CAN_testmode(); /* Loopback mode  */← この行をコメントアウトする
~略~

ARM9/2440環境で次のコマンドでCAN通信の状態を監視する
[root@kaneBeBeIII]# minicom ← ターミナルを開いて、CAN通信の状態を監視する
Welcome to minicom 2.4

OPTIONS: I18n
Compiled on Dec 26 2010, 01:45:17.
Port /dev/ttyUSB0 ← LPC11C14を接続するUSBシリアルポート

Press CTRL-A Z for help on special keys

 Tx:0x75, Rx:0xB2 ← リモートLPC11C14からのAD値

■ Stripでファイルサイズを小さくしてNAND容量を抑える

これまでコンパイルして作成した,自分ARM Linux用のコマンドやライブラリの多くには,デバッグなどに利用するシンボルの情報が含まれる。そのシンボル情報を取り除くだけで,ファイル・サイズを大幅に小さくできる。

シンボル情報の確認

# file <コマンド名(またはライブラリ名)>
出力結果に「not stripped」と表示されたときには,シンボル情報が含まれる。

シンボル情報を取り除くには,stripコマンドを用いる。使い方は次の通り。

# arm-linux-strip <コマンド名>

なお,ライブラリ・ファイルのシュリンクを実施する際には,

# arm-linux-strip -S <ライブラリ名>
のように-Sオプションを付ける必要がある。これはデバッグ用のシンボルのみを取り除くオプションだ。ライブラリ・ファイルに対して-Sオプションを忘れるとシステムが正常に動かないなどのトラブルが発生するので注意しよう。

数多くのコマンドやライブラリを一つずつ調べながら,stripコマンドを実行するのはかなり大変である。そこで自動スクリプト(arm-strip.sh)を利用しよう。

使い方は次の通りだ。まず,「arm-strip.sh」というファイル名で保存する。続いて,実行権限を与えてから実行する。

# gedit arm-strip.sh
#!/bin/bash
for i in `find . -type f`
do
  A=`file $i | grep archive`
  if [[ ! -z $A ]];then
    echo "$i grep archive"
    arm-linux-strip -S $i
  fi

  B=`file $i | grep "not stripped"`
  if [[ ! -z $B ]];then
    echo "$i not stripped"
    C=`echo $i | grep so`
    if [[ ! -z $C ]];then
      echo "$i lib"
      arm-linux-strip -S $i
    else
      echo "$i exe"
      arm-linux-strip $i
    fi
  fi
done

# chmod +x arm-strip.sh
# cd arm-linux-roots
# ../arm-strip.sh

プロンプトが表示されたら,自分Linuxの容量を確認してみよう。

# du -s

■ cURLでHTTPS通信

cURL はあるプロジェクトの名前です.この名前は "Client for URLs" にかけてあり,元は "URL" を大文字で書いて, URL を扱うものだというのをはっきり示すようにしていました.これは "see URL" (URL を見よ,参照せよ) とも発音できます.

curl は、サーバから、あるいはサーバへデータ伝送を行うツールです。対応するプロトコルは: DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET, TFTP です。コマンドはユーザとの対話的操作を経なくとも動作するように設計されています。

curl には、プロクシのサポート, ユーザ 認証, FTP アップロード, HTTP POST, SSL 接続, クッキー, ファイル転送の再開などなど、便利な機能が満載されています。

curlもMac OS Xに標準で装備されている。
使い方は
こちらをご参照ください。

必要のソースコード
zlib-1.2.5.tar.gz
http://www.zlib.net/

openssl-0.9.8q.tar.gz
http://www.openssl.org/

curl-7.21.4.tar.bz2
http://curl.haxx.se/

zlibをコンパイルする
# tar zxvf zlib-1.2.5.tar.gz
# cd zlib-1.2.5
# CC=arm-linux-gcc ./configure --prefix=/opt/libs
# make
# make install

opensslをコンパイルする
# tar zxvf openssl-0.9.8q.tar.gz
# cd openssl-0.9.8q
# ./Configure --prefix=/opt/libs os/compiler:arm-linux-gcc
# make
# make install

curlをコンパイルする
# tar jxvf curl-7.21.4.tar.bz2
# cd curl-7.21.4
# CC=arm-linux-gcc CXX=arm-linux-g++ ./configure --prefix=/curl --host=arm-linux --with-ssl=/opt/libs --with-zlib=/opt/libs --with-random=/dev/urandom
# make
# make install
生成されたディレクトリ/curlをボードのルートにコピーします。

ボードでHTTPS通信してみると、以下のエラーがでる。
[root@kaneBeBeIII]# /curl/bin/curl "https://ieserver.net/cgi-bin/dip.cgi?username=kanebebe&domain=dip.jp&password=xxxxx&updatehost=1"
curl: (77) error setting certificate verify locations:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
パソコンのLinuxの/etc/ssl/certs/ca-certificates.crtというファイルをボードのディレクトリ/etc/ssl/certs/にコピーする。このファイルがなければ、次のコマンドでインストールします。
$ sudo apt-get install ca-certificates

■ aria2で大容量ファイルを徹夜にダウンロードする

回線がブロードバンド等でも、大容量ファイル等はダウンロードするのにけっこう時間がかかります。ARM自宅サーバは電力消費が少ない、超静音なので、徹夜にダウンロードすることができます。

ダウンロードツールはwgetまたはcURLを利用できますが、aria2というツールをお勧めします。aria2 は複数のサーバー / プロトコルからファイルをダウンロードできます。回線速度を有効に使った高速ダウンロードを実現。しかも、メモリや CPU 資源を大きく要求しません。HTTP/FTP ダウンロードでのメモリ使用は通常 4MiB, BitTorrent ダウンロードで 9MiB。 CPU 使用率は, BitTorrent ダウンロードで 2.8MiB/sec で 6% 前後。

必要のソースコード
c-ares-1.7.4.tar.gz
http://c-ares.haxx.se/

openssl-0.9.8q.tar.gz
http://www.openssl.org/

zlib-1.2.5.tar.gz
http://www.zlib.net/

sqlite-autoconf-3070500.tar.gz
http://www.sqlite.org/download.html

libxml2-sources-2.7.8.tar.gz
http://xmlsoft.org/

aria2-1.11.1.tar.bz2
http://aria2.sourceforge.net/index_ja.html

c-aresをコンパイルする
# tar zxvf c-ares-1.7.4.tar.gz
# ./configure --prefix=/arm-rootfs --host=arm-linux
# make
# make install

zlibをコンパイルする
# tar zxvf zlib-1.2.5.tar.gz
# cd zlib-1.2.5
# CC=arm-linux-gcc ./configure --prefix=/arm-rootfs
# make
# make install

opensslをコンパイルする
# tar zxvf openssl-0.9.8q.tar.gz
# cd openssl-0.9.8q
# ./Configure --prefix=/arm-rootfs os/compiler:arm-linux-gcc
# make
# make install

libxml2のコンパイル
# tar zxvf libxml2-sources-2.7.8.tar.gz
# cd libxml2-2.7.8
# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/arm-rootfs
# make
# make install

# tar zxvf sqlite-autoconf-3070500.tar.gz
# cd sqlite-autoconf-3070500
# mkdir build
# cd build
# ../configure CC=arm-linux-gcc --host=arm-linux --prefix=/arm-rootfs
# make
# make install

aria2をコンパイルする前に、ライブラリを設定する。
# export PKG_CONFIG_PATH=/arm-rootfs/lib/pkgconfig:$PKG_CONFIG_PATH
# export LD_LIBRARY_PATH=/arm-rootfs/lib:$LD_LIBRARY_PATH

aria2をコンパイルする。
# tar jxvf aria2-1.11.1.tar.bz2
# cd aria2-1.11.1
# ./configure --host=arm-linux --without-gnutls
# make DESTDIR=/aria2 install

最後、/aria2/usr/local/binにはaria2cという実行ファイルを生成します。aria2cをボードの/binにコピーします。関連のライブラリ/arm-rootfs/libもボードの/libにコピーします。

コマンドラインだからといって物怖じすることはありません。aria2 を使うのはかなり簡単です。 WEB からダウンロード
[root@kaneBeBeIII]# aria2c http://example.org/mylinux.iso
サーバーからダウンロード
[root@kaneBeBeIII]# aria2c http://a/f.iso ftp://b/f.iso
BitTorrent
[root@kaneBeBeIII]# aria2c http://example.org/mylinux.torrent
BitTorrent Magnet URI
[root@kaneBeBeIII]# aria2c 'magnet:?xt=urn:btih:248D0A1CD08284299DE78D5C1ED359BB46717D8C'
Metalink
[root@kaneBeBeIII]# aria2c http://example.org/mylinux.metalink
ファイル中の URI をダウンロード
[root@kaneBeBeIII]# aria2c -i uris.txt

詳しいことはこちらをご参照ください。

nohupでコマンドを実行した場合は,ログアウトしてもプログラムを実行し続ける。長い処理を行っており,席を外したいときなどに使用すると便利である。ログアウトした後は,ジョブではなくプロセスとして管理することになる。また,処理中に出力されたメッセージは"nohup.out"に保存される。

# nohup command &

例えば、大きいなファイルをダウンロードしたい場合

[root@kaneBeBeIII]# nohup aria2c http://example.org/mylinux.iso &

大きいなファイルで途中でダウンロードが止まった場合は -c でレジューム

[root@kaneBeBeIII]# nohup aria2c -c http://example.org/mylinux.iso &

■ LinphoneでIP電話を作ろう

Linphoneは、オープンソースのインターネット電話やボイスオーバーIP電話(VoIP)です。

Linphoneを使用すると、自由な声で、インターネット上で人とコミュニケーションすることができます。

Linphoneは、SIPプロトコルは、インターネット電話のためのオープン標準に準拠していますであるLinphoneはほとんどのSIP対応携帯電話やプロキシとの相互運用できるようになります。

LinphoneはALSAライブラリを必要です。ALSAとはAdvanced Linux Sound Architectureのことで、LinuxシステムにオーディオやMIDI(Musical Instrument Digital Interface)機能を提供します。 ALSAは2.6カーネルのデフォルトサウンドシステムであり、2.4カーネルで使用されていたOSS(Open Sound System)と置き換わっています。

まず、alsaライブラリを移植する。必要のソース
ncurses-5.7.tar.gz
http://www.gnu.org/software/ncurses/

alsa-lib-1.0.24.1.tar.bz2
alsa-utils-1.0.24.2.tar.bz2
http://www.alsa-project.org/main/index.php/Main_Page

ncursesをコンパイルする
# tar zxvf ncurses-5.7.tar.gz
# cd ncurses-5.7
# ./configure --prefix=/alsa-linphone --host=arm-linux --with-gnu-ld --with-shared
# make
# make install

alsa-libをコンパイルする
# tar jxvf alsa-lib-1.0.24.1.tar.bz2
# cd alsa-lib-1.0.24.1
# ./configure --prefix=/alsa-linphone --host=arm-linux --disable-python --with-alsa-devdir=/dev
# make
# make install

alsa-utilsをコンパイルする前に、次の設定:
# apt-get install xmlto

# cd /alsa-linphone/lib
# ln -s libform.so.5.7 libformw.so.5
# ln -s libmenu.so.5.7 libmenuw.so.5
# ln -s libncurses.so.5.7 libncursesw.so.5
# ln -s libpanel.so.5.7 libpanelw.so.5
# ln -s libform.so.5.7 libformw.so
# ln -s libmenu.so.5.7 libmenuw.so
# ln -s libpanel.so.5.7 libpanelw.so
# ln -s libncurses.so.5.7 libncursesw.so

alsa-utilsをコンパイルする
# tar jxvf alsa-utils-1.0.24.2.tar.bz2
# cd alsa-utils-1.0.24.2
# CFLAGS="-I/alsa-linphone/include/ncurses" ./configure --prefix=/alsa-linphone --host=arm-linux --with-alsa-inc-prefix=/alsa-linphone/include --with-alsa-prefix=/alsa-linphone/lib
# make
# make install

生成されたディレクトリ/alsa-linphoneをボードのルートにコピーする。ボードには次のコマンドでリンクを作ります。
[root@kaneBeBeIII]# ln -s /alsa-linphone/lib/libasound.so.2.0.0 /lib/libasound.so.2

次のコマンドでalsaをテストする
[root@kaneBeBeIII]# cd /alsa-linphone/bin
[root@kaneBeBeIII]# ./aplay ../share/sounds/alsa/Front_Center.wav ← 再生、音声が聞こえるはず

[root@kaneBeBeIII]# ./amixer sset Mic 50% ← マイクの感度を設定する。
[root@kaneBeBeIII]# ./arecord -t wav -f dat myrecord.wav ← 録音する。Ctrl+Cで停止
[root@kaneBeBeIII]# ./aplay myrecord.wav ← 録音を再生する。

Linphone関連のソース
libogg-1.2.2.tar.gz
http://www.xiph.org/ogg/

speex-1.2rc1.tar.gz
http://www.speex.org/

libosip2-3.5.0.tar.gz
libeXosip2-3.5.0.tar.gz
http://www.gnu.org/software/osip/

readline-6.2.tar.gz
http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

linphone-3.4.3.tar.gz
http://www.linphone.org/

liboggをコンパイルする
# tar zxvf libogg-1.2.2.tar.gz
# cd libogg-1.2.2
# ./configure --prefix=/alsa-linphone --host=arm-linux --disable-static
# make
# make install

speexをコンパイルする
# tar zxvf speex-1.2rc1.tar.gz
# cd speex-1.2rc1
# ./configure --prefix=/alsa-linphone --host=arm-linux --with-gnu-ld --disable-static --enable-fixed-point --enable-arm-asm --with-ogg=/alsa-linphone
# make
# make install

readlineをコンパイルする
# tar zxvf readline-6.2.tar.gz
# cd readline-6.2
# ./configure --prefix=/alsa-linphone --host=arm-linux --disable-static
# make
# make install

libosipをコンパイルする
# tar zxvf libosip2-3.5.0.tar.gz
# cd libosip2-3.5.0
# ./configure --prefix=/alsa-linphone --host=arm-linux --with-gnu-ld --disable-static
# make
# make install

libeXosipをコンパイルする
# tar zxvf libeXosip2-3.5.0.tar.gz
# cd libeXosip2-3.5.0
# ./configure OSIP_CFLAGS=-I/alsa-linphone/include/ OSIP_LIBS="-L/alsa-linphone/lib -losip2 -losipparser2" --prefix=/alsa-linphone --host=arm-linux
# make
# make install

linphoneをコンパイルする前に、次のツールをインストールする
# apt-get install intltool

linphoneをコンパイルする
# tar zxvf linphone-3.4.3.tar.gz
# cd linphone-3.4.3
# ./configure --host=arm-linux --prefix=/alsa-linphone --with-gnu-ld --disable-static --disable-glib --enable-alsa --with-osip=/home/cjx/source/linphone-arm/build/install/ --with-readline=/alsa-linphone SPEEX_CFLAGS="-I/alsa-linphone/include" SPEEX_LIBS="-L/alsa-linphone/lib -lspeex -lspeexdsp" OSIP_CFLAGS="-I/alsa-linphone/include" OSIP_LIBS="-L/alsa-linphone/lib -losip2 -leXosip2 -losipparser2" --disable-video --disable-gtk_ui
# make
# make install

生成されたディレクトリ/alsa-linphoneをボードのルートにコピーする。ボードには次のコマンドでlinphoneをテストする。
[root@kaneBeBeIII]# /alsa-linphone/bin/linphonec
Ready
Warning: video is disabled in linphonec, use -V or -C or -D to enable.
linphonec> help  ← ヘルプを入力すると
Commands are:
---------------------------
      help      Print commands help.
      call      Call a SIP uri or number
     calls      Show all the current calls with their id and status.
      chat      Chat with a SIP uri
 terminate      Terminate a call
    answer      Answer a call
     pause      pause a call
    resume      resume a call
  transfer      Transfer a call to a specified destination.
      mute      Mute microphone and suspend voice transmission.
    unmute      Unmute microphone and resume voice transmission.
  duration      Print duration in seconds of the last call.
autoanswer      Show/set auto-answer mode
     proxy      Manage proxies
 soundcard      Manage soundcards
    webcam      Manage webcams
      ipv6      Use IPV6
       nat      Set nat address
      stun      Set stun server address
  firewall      Set firewall policy
 call-logs      Calls history
    friend      Manage friends
      play      play a wav file
    record      record to a wav file
      quit      Exit linphonec
---------------------------
Type 'help ' for more details or
     'help advanced' to list additional commands.
linphonec>

DAEMON(デーモン)として実行させる。
[root@kaneBeBeIII]# cd /alsa-linphone/bin
[root@kaneBeBeIII]# ./linphonecsh init ← デーモンとして起動させる。

← ある環境でデーモンが起動できないと、次のコマンドでデーモンを起動させる。
[root@kaneBeBeIII]# /alsa-linphone/bin/linphonec < /dev/null --pipe -c /dev/null > /dev/null 2>&1 &

SIPサーバを接続する
[root@kaneBeBeIII]# ./linphonecsh register --host SIPサーバ --username account --password pwd

[root@kaneBeBeIII]# ./linphonecsh status register ← 接続する状態を調べる
[root@kaneBeBeIII]# ./linphonecsh status hook ← ほかのIP電話の呼びがあるかどうか、チェックする
[root@kaneBeBeIII]# ./linphonecsh generic "answer" ← 通話開始
[root@kaneBeBeIII]# ./linphonecsh generic "terminate" ← 通話停止

[root@kaneBeBeIII]# ./linphonecsh dial 101 ← ほかのIP電話へ呼びだす
[root@kaneBeBeIII]# ./linphonecsh generic "help" ← linphoneのヘルプ

■ ARMクロスツールのインストール

※ 特別説明がなければ、ホストLinux環境はubuntuです。
※ 一部のソースのコンパイルはFedora環境でします。

# tar zxvf arm-linux-gcc-4.4.3.tar.gz -C /

環境変数.bashrcファイルを編集する。
$ gedit ~/.bashrc ← 一般ユーザ用の環境変数
# gedit /root/.bashrc ← スーパーユーザ用の環境

次の行を添加します。
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin

Terminalを再起動させます。次のコマンドで確認します。
$ arm-linux-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /opt/FriendlyARM/mini2440/build-toolschain/working/src/gcc-4.4.3/configure --build=i386-build_redhat-linux-gnu --host=i386-build_redhat-linux-gnu --target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/toolschain/4.4.3 --with-sysroot=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --enable-languages=c,c++ --disable-multilib --with-arch=armv4t --with-cpu=arm920t --with-tune=arm920t --with-float=soft --with-pkgversion=ctng-1.6.1 --disable-sjlj-exceptions --enable-__cxa_atexit --with-gmp=/opt/FriendlyARM/toolschain/4.4.3 --with-mpfr=/opt/FriendlyARM/toolschain/4.4.3 --with-ppl=/opt/FriendlyARM/toolschain/4.4.3 --with-cloog=/opt/FriendlyARM/toolschain/4.4.3 --with-mpc=/opt/FriendlyARM/toolschain/4.4.3 --with-local-prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-c99 --enable-long-long --enable-target-optspace
Thread model: posix
gcc version 4.4.3 (ctng-1.6.1)
このような情報なら、クロスコンパイルツールをインストール成功しました。

■ イメージファイルの書き込み手順

ARMボードのモードをNor Flashに設定して、電源を入れて、ARM9ボードはNor Flashから起動します。
USB-シリアル変換IC CP2102ドライバ・インストール方法解説
イメージファイルをダウンロードする用のドライバ

パソコン側のハイパーターミナルの設定:ボーレット115200, フロー制御なし。ボードに電源を投入した後、ハイパーターミナルの情報:
##### FriendlyARM BIOS 2.0 for 2440 #####
[x] format NAND FLASH for Linux
[v] Download vivi
[k] Download linux kernel
[y] Download root_yaffs image
[a] Absolute User Application
[n] Download Nboot for WinCE
[l] Download WinCE boot-logo
[w] Download WinCE NK.bin
[d] Download & Run
[z] Download zImage into RAM
[g] Boot linux from RAM
[f] Format the nand flash
[b] Boot the system
[s] Set the boot parameters
[u] Backup NAND Flash to HOST through USB(upload)
[r] Restore NAND Flash from HOST through USB
[q] Goto shell of vivi
[i] Version: 0945-2K
Enter your selection:

まず、「x」を入力して、NAND FLASHをフォーマットする。
[q] Goto shell of vivi
[i] Version: 0945-2K
Enter your selection: x
Found block size = 0x00020000
Erasing...    ... done
Writing...    ... done
Written 49152 bytes
Saved vivi private data

イメージファイルをダウンロードする用のツールDNWを実行させます。

「v」を入力して、ブートロードvboot.binを書き込む。
[q] Goto shell of vivi
[i] Version: 0945-2K
Enter your selection: v
USB host is connected. Waiting a download.
DNWのメニュー「USB Port」-->「Transmit/Restore」を選択する

vboot.binを開き、ダウンロードする


「k」を入力して、LinuxカーネルzImage_N35_serverを書き込む。
[q] Goto shell of vivi
[i] Version: 0945-2K
Enter your selection: k
USB host is connected. Waiting a download.
DNWのメニュー「USB Port」-->「Transmit/Restore」を選択して、同じ手順で zImage_N35_serverを開き、ダウンロードする

「y」を入力して、ファイルシステムrootfs_qtopia_qt4-server.imgを書き込む。
[q] Goto shell of vivi
[i] Version: 0945-2K
Enter your selection: y
USB host is connected. Waiting a download.
DNWのメニュー「USB Port」-->「Transmit/Restore」を選択して、同じ手順で rootfs_qtopia_qt4-server.imgを開き、ダウンロードする

※ 真っ白のNAND FLASHなら、コマンドx, v, k, yで順番にイメージファイルをNAND FLASHに書き込みます。その後、一部のイメージファイルだけを更新したければ、対応のコマンドv, k, y一つだけでNAND FLASHに書き込みます。

■ SDカードでイメージファイルを書き込む手順

以上のイメージファイルを書き込む手順は複雑し、パソコンも必要です。次の方法はパソコンがないでも、1枚SDカードだけでジファイルを更新することができます。とても便利です。

まず、
マニュアルのP174をご参照して、ボードのNor Flashのブートロードを更新する。
SDカードでイメージファイルを書き込めるブートロードはSuperSDboot2440.binです。

1枚SDカードを用意する。SDカードで「images」というフォルダを作る。「images」フォルダで「FriendlyARM.ini」というファイルを作る。FriendlyARM.iniファイルの中身は
#This line cannot be removed. by FriendlyARM(www.arm9.net)

USBMode = No
Action = Install
OS = Linux
VerifyNandWrite = Yes

LowFormat = No
Status Type = Beeper| LED

# Linux part
Linux-BootLoader = Superboot2440.bin
Linux-Kernel = zImage_N35_server
Linux-CommandLine = noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 
Linux-RootFs-InstallImage = rootfs_qtopia_qt4-server.img

# Windows CE 6 part
WindowsCE6-Bootloader = wince6/nboot_W35.bin
WindowsCE6-BootLogo = wince6/bootlogo.bmp
WindowsCE6-InstallImage = wince6/NK_W35.bin

#User Bin part
UserBin-Bootloader = Superboot2440.bin
UserBin-Image = 2440test/2440test_W35.bin
userBinStartAddress=30000000
書き込みしたいファイルSuperboot2440.bin, zImage_N35_server, rootfs_qtopia_qt4-server.imgを全てSDカードのimagesフォルダにコピーする。

ARMボードのモードをNor Flashに設定して、SDカードを挿入して、電源を入れると、自動的にイメージファイルをNANDに書き込む開始するはずです。書き込む順調すれば、ボードのLEDが点滅して、LEDの点灯数が段々増えています。4個LED全て点灯すると、LEDは左右流れて点滅する。それは書き込む完了です。

■ ARMサーバ初の起動と設定

書き込み完了すると、電源を切ります。ダウンロード用のUSBケーブルを抜く。ARMボードのモード設定用のジャンパーをOpenして、Linuxモードになる。

再び電源を投入する。ハイパーターミナルが次の情報なら、ARMサーバは起動成功しました。
S3C24XX_UDA134X SoC Audio driver
UDA134X SoC Audio Codec
asoc: UDA134X <-> s3c24xx-i2s mapping ok
ALSA device list:
  #0: S3C24XX_UDA134X (UDA134X)
TCP cubic registered
NET: Registered protocol family 17
s3c2410-rtc s3c2410-rtc: hctosys: invalid date/time
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
yaffs: auto selecting yaffs2
block 546 is bad
block 4371 is bad
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:3.
Freeing init memory: 156K
hwclock: settimeofday() failed: Invalid argument
Try to bring eth0 interface up......eth0: link down
Done

Please press Enter to activate this console.	← 空ENTERを押していく
[root@kaneBeBeIII]#

自分のネットワーク環境によってIPアドレスなどを設定する。
[root@kaneBeBeIII]# vi /etc/eth0-setting
IP=192.168.1.200
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:aa:aa:aa:aa:aa

ネットワークのパラメータを設定完了すると、電源を切ります。USBシリアル用のUSBケーブルも抜く。LANケーブルをARMサーバのRJ45ポートに挿入する。

再び電源を投入する。今からパソコンはtelnetでARMサーバを遠隔操作できます。
C:\> telnet ARMサーバのIPアドレス
初の設定:ユーザ名はroot, パスワードはなし。

telnetで必要なサーバを設定する。初の設定はすべてのサーバをコメントアウトされます。
[root@kaneBeBeIII]# vi /etc/init.d/rcS
# /bin/ntpdate.sh	← 起動の時、時計を正確に合わせる。

← 定期的にコマンドを実行する。非固定IPアドレスの更新、時計を正確に合わせるなど。
#mkdir -p /var/spool/cron/crontabs
#crontab /etc/mycrontab
#crond

#/apache/bin/apachectl start	← ウェブサーバ

← プリンタサーバ
#if test -c "/dev/lp0";then
#  /bin/chmod 666 /dev/lp0
#  /cups/sbin/cupsd
#fi

← ファイル共有Sambaサーバ
#/usr/local/samba/bin/nmbd -D
#/usr/local/samba/bin/smbd -D

#/usr/sbin/sshd	← Secure Shell(セキュアシェル、SSH)サーバ

← Webカメラストリーミング配信
#/bin/mjpg_streamer -i "input_uvc.so -d /dev/video0 -f 5 -r QVGA -y" -o "output_http.so -p 8080 \
-w /apache/htdocs/video-www -c username:password" &

#/sip/bin/partysip &	← IP電話のSIPサーバ

← VPNサーバ
#echo 1 > /proc/sys/net/ipv4/ip_forward
#/bin/openvpn --config /etc/openvpn/server.conf --cd /etc/openvpn --dev-node /dev/tun &
#/iptables/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

#/usr/exim/bin/exim -bd	← Eメールサーバ
#/bin/popa3d -D	← POP3サーバ

#/bin/fax.sh &	← 自動FAX受信
必要なサーバを設定した後、前の「#」を削除して、サーバを有効化する。

次のコマンドでARMサーバを再起動させて、サーバを立ち上げる。
[root@kaneBeBeIII]# reboot


■ CONFIG_HZを1000Hzに変更

Linuxカーネルのタイマ割込み頻度はHZというマクロで設定されている。通常、100~1000ぐらいの値を設定する。一般的に、この数値を上げると反応が早くなるが、CPU負荷が定常的に高くなると言われている。ARMボードのデフォルト値は200Hzです。

ある応用には1000Hzに設定することが必要です。

カーネルの設定ファイル.configをCONFIG_HZ=1000に書き換えてもmake時に強制的にCONFIG_HZ=200に戻されてしまうので、arch/arm/Kconfigを書き直した。
# gedit arch/arm/Kconfig
~略~
config HZ
	int
	default 128 if ARCH_L7200
	default 1000 if ARCH_EBSA110 || ARCH_S3C2410
	default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER
	default AT91_TIMER_HZ if ARCH_AT91
	default 100
~略~