第13章 特有なアプリケーションの説明

atmark-distには、一般のLinuxには無いアプリケーションも含まれています。ここではその中でも特に組込み用途に合ったアプリケーションを紹介します。

13.1. NetFlash

NetFlashはネットワーク経由でイメージファイルをダウンロードし、フラッシュメモリに書き込むためのアプリケーションです。

組み込みシステムにおいて、ネットワーク経由によるシステムのアップグレードは、保守性とユーザの利便性の両面から非常に重宝されますが、NetFlashによって簡単に実現できます。

NetFlashがファイルのダウンロードに利用できる通信プロトコルは、http、ftp、tftpです。このため、NetFlashを実行するには、http、ftp、tftpのいずれかのプロトコルで通信が行えるサーバが必要となります。

特にオプションを指定せずにNetFlashを実行した場合には、以下の手順でフラッシュメモリの書き込み処理が行われます。

  1. 全プロセスの終了

  2. 指定されたファイルを指定されたプロトコルでサーバからダウンロード

  3. ダウンロードしたファイルのチェックサムを確認

  4. フラッシュメモリへの書き込み

  5. システムのリブート

オプションを指定する事で、これらの処理を細かく制御する事が可能です。参考として、コマンドの実行例とNetFlashのヘルプを以下に示します。

例 13.1. netflashの実行

[Target /]# netflash http://embedded-server/images/base.img
netflash: killing tasks...
...
netflash: got "http://myserver.local/images/image.bim", length=4194304
 :
 :

例 13.2. netflashのヘルプ

[Targt /]# netflash -h
usage: netflash [-bCfFhijklntuv?] [-c console-device] [-d delay] [-o offset] [-r flash-device] [net-server] file-name

        -b      don't reboot hardware when done
        -C      check that image was written correctly
        -f      use FTP as load protocol
        -F      force overwrite (do not preserve special regions)
        -h      print help
        -i      ignore any version information
        -H      ignore hardware type information
        -j      image is a JFFS2 filesystem
        -k      don't kill other processes (or delays kill until
                after downloading when root filesystem is inside flash)
        -K      only kill unnecessary processes (or delays kill until
                after downloading when root filesystem is inside flash)
        -l      lock flash segments when done
        -n      file with no checksum at end (implies no version information)
        -p      preserve portions of flash segments not actually written.
        -s      stop erasing/programming at end of input data
        -t      check the image and then throw it away
        -u      unlock flash segments before programming
        -v      display version number

処理の途中でエラーが発生した場合は、フラッシュメモリへの書き込みを行わずに処理を中断します。

書き込みの途中で電源断が発生した場合には、最悪システムが起動しなくなる可能性があるので、NetFlashを実行する際には十分な注意が必要です。

13.2. Flatfsd

組み込み機器でよく求められる機能に、設定情報を初期化することなくファームウェアだけをアップグレードする機能があります。この機能を実現するためには、ユーザ設定を保持するための小さな領域を割り当てたファイルシステムを構築するのが一般的です。

このような用途に適したファイルシステムに Flat Filesystem があります。Flat Filesystemは、1セクタからファイルシステムを構築することができます。また、シンプルな作りであること、安定した動作実績があることが特長です。

このファイルシステムを実現するためのアプリケーションがflatfsdです。

flatfsdは、/etc/configディレクトリの内容を/dev/flash/configデバイスファイルに読み書きします。/dev/flash/configは、設定ファイルを保存すべきデバイスのメジャー番号とマイナー番号を指定して作成します。

[Target /]# ls -l /dev/flash/
crw-rw----    1 root     root      90,   0 Jan 27  2006 bootloader
crw-rw----    1 root     root      90,   6 Jan 27  2006 config
crw-rw----    1 root     root      90,   2 Jan 27  2006 kernel
crw-rw----    1 root     root      90,   4 Jan 27  2006 userland
[Target /]#

以前保存した設定ファイル情報を復元するためには、flatfsd -r コマンドを実行します。

flatfsd -r コマンドは、/dev/flash/config内の以前保存したファイル情報を読み出して、/etc/configにコピーします。

[Target /]# flatfsd -r
flatfsd: created 24 configuration files (9928 bytes)
[Target /]#

この時、記録されているチェックサムよりファイル情報の整合性を確認し、異常だった場合には、/etc/default の内容で/etc/configディレクトリを初期化します。通常、システムの起動時にflatfsd -rコマンドを実行します。

設定ファイルに加えた変更をフラッシュメモリ内に記録する方法は、コンフィグレーションにより異なります。

Flatfsdの設定

図 13.1. Flatfsdの設定


「disable save config by SUGUSER1」を選択した場合には、flatfsd -s コマンドを実行します。

[Target /]# flatfsd -s
Saving configuration
flatfsd: Wrote 10968 bytes to flash in 4 seconds
[Target /]#

「disable save config by SUGUSER1」を選択した場合にはflatfsdプロセスにSIGUSR1シグナルを送信します。この場合は、事前にflatfsdコマンドを実行してプロセスを立ち上げておく必要があります。起動しているflatfsdのプロセスIDは/var/run/flatfsd.pidファイルから取得できます。以下の例では、killallコマンドを使用し、flatfsdにシグナルを送る方法です。

[Target /]# killall -USR1 flatfsd

SIGUSR1シグナルを受信したflatfsdプロセスは、/etc/configディレクトリの内容を/dev/flash/configに書き込みます。この時、整合性の確認が行えるよう、チェックサムを計算して記録します。

atmark-distのconfigでflatfsdアプリケーションを選択すると、dhcpcdやpasswdなどのアプリケーションは、/etcではなく/etc/configに設定ファイルを用意します。このため、設定の変更が次回起動時以降も保存されています。

Flat Filesystemではflatfsdが/dev/flash/configデバイスにデータを書き込んでいる最中に電源が切断されると、保存していたデータを消失する可能性があります。

また、フラッシュメモリの書き込み保証回数は、およそ10万回ですので注意してください。

13.3. ローカルスタートアップスクリプト rc.local

組み込み機器では多くの場合、電源を投入してシステムが起動したら人的な操作を介さずに任意のプログラムを自動実行させます。そのような用途に、ローカルスタートアップスクリプトrc.local を使用することができます。

atmark-distで作成したデフォルトのユーザランドでは、/etc/config/rc.local が存在し、かつ実行権限がついている場合、スタートアップスクリプト[3]の一番最後に/etc/config/rc.local が実行されます。/etc/config/rc.local はスクリプトファイルでも実行バイナリでもどちらでも構いません。

ローカルスタートアップスクリプトは/etc/configディレクトリに保存されているため、項13.2. 「Flatfsd」を使用してユーザランドイメージを変更せずに、ローカルスタートアップスクリプトのみ変更することができます。

以下に例を示します。

#!/bin/sh
echo "Hello World!"

図 13.2. サンプルローカルスタートアップスクリプト


[Target ~]# vi /etc/config/rc.local                  1
[Target ~]# chmod 755 /etc/config/rc.local           2
[Target ~]# flatfsd -s                               3
flatfsd: saving fs to partition 0, tstamp=3
flatfsd: Wrote 9665 bytes to flash in 2 seconds
[Target ~]# reboot                                   4
System is going down for system reboot now.

Starting local stop scripts.
・
・                                                   (中略)
・
Starting inetd: done
Stating sshd: done
Starting thttpd: done
Running local start script (/etc/config/rc.local).   5
Hello World!

atmark-dist v1.18.0 (AtmarkTechno/Armadillo-220.Base)
Linux 2.6.12.3-a9-14 [armv4tl arch]

a220-0 login: 

図 13.3. ローカルスタートアップスクリプト 実行例


1

図 13.2. 「サンプルローカルスタートアップスクリプト」の内容にファイルを編集します

2

実行権限を与えます

3

コンフィグ領域を保存します

4

リブートします

5

ローカルスタートアップスクリプトが実行されます



[3] rcスクリプト、起動スクリプトなどとも言います。