atmark-distには、一般のLinuxには無いアプリケーションも含まれています。ここではその中でも特に組込み用途に合ったアプリケーションを紹介します。
NetFlashはネットワーク経由でイメージファイルをダウンロードし、フラッシュメモリに書き込むためのアプリケーションです。
組み込みシステムにおいて、ネットワーク経由によるシステムのアップグレードは、保守性とユーザの利便性の両面から非常に重宝されますが、NetFlashによって簡単に実現できます。
NetFlashがファイルのダウンロードに利用できる通信プロトコルは、http、ftp、tftpです。このため、NetFlashを実行するには、http、ftp、tftpのいずれかのプロトコルで通信が行えるサーバが必要となります。
特にオプションを指定せずにNetFlashを実行した場合には、以下の手順でフラッシュメモリの書き込み処理が行われます。
-
全プロセスの終了
-
指定されたファイルを指定されたプロトコルでサーバからダウンロード
-
ダウンロードしたファイルのチェックサムを確認
-
フラッシュメモリへの書き込み
-
システムのリブート
オプションを指定する事で、これらの処理を細かく制御する事が可能です。参考として、コマンドの実行例と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を実行する際には十分な注意が必要です。
組み込み機器でよく求められる機能に、設定情報を初期化することなくファームウェアだけをアップグレードする機能があります。この機能を実現するためには、ユーザ設定を保持するための小さな領域を割り当てたファイルシステムを構築するのが一般的です。
このような用途に適したファイルシステムに 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
コマンドを実行します。
設定ファイルに加えた変更をフラッシュメモリ内に記録する方法は、コンフィグレーションにより異なります。
「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
が存在し、かつ実行権限がついている場合、スタートアップスクリプト[]の一番最後に/etc/config/rc.local
が実行されます。/etc/config/rc.local
はスクリプトファイルでも実行バイナリでもどちらでも構いません。
ローカルスタートアップスクリプトは/etc/config
ディレクトリに保存されているため、項13.2. 「Flatfsd」を使用してユーザランドイメージを変更せずに、ローカルスタートアップスクリプトのみ変更することができます。
以下に例を示します。