第9章 romfsインストールツール

コンパイルされたアプリケーションや各種設定ファイルは、Makefileのromfsターゲットによって atmark-dist/romfs ディレクトリにインストールされます。アプリケーションが必要とする設定ファイルやデータファイルなども、この時点で atmark-dist/romfsディレクトリにインストールされます。

ディレクトリ名に romfsという名前が使われているのは、多くの組込みシステムでは、デスクトップやサーバ用途の Linuxシステムで使われている ext2やext3、 reiserfs、xfsなどではなく romfsが使われるためです。しかし、romfsディレクトリ自体は romfsに依存しているわけではありません。後述する jffs2などでも同じromfsディレクトリを使います。

romfsディレクトリの構成は、ターゲットシステムが起動したときにターゲットシステム上で見えるディレクトリ構成と同じ構成になっています。romfsディレクトリをルートディレクトリとして、その下にbinやdev、etcなどが配置されます。

atmark-distにはromfsディレクトリにファイルを簡単にインストールするためにromfs-inst.shと呼ばれるスクリプトが用意されています。このスクリプトはatmark-dist/toolsディレクトリに入っています。

romfs-inst.shは、atmark-distディレクトリにある Makefileによって ROMFSINSTという変数に代入されます。このため、プロダクトディレクトリをはじめとするatmark-dist内の各ディレクトリの Makefileでは romfs-inst.shがどこに入っているかを気にせず、ROMFSINSTという変数で使うのが一般的な方法になっています。

9.1. 概要

romfs-inst.sh は、romfsディレクトリを指定する環境変数 ROMFSDIRが設定されていない場合、簡単な helpを出力します。

例9.1 romfs-inst.shのヘルプ

[PC ~/atmark-dist]$ tools/romfs-inst.sh
ROMFSDIR is not set
tools/romfs-inst.sh: [options] [src] dst
    -v          : output actions performed.
    -e env-var  : only take action if env-var is set to "y".
    -o option   : only take action if option is set to "y".
    -p perms    : chmod style permissions for dst.
    -a text     : append text to dst.
        -A pattern  : only append text if pattern doesn't exist in file
    -l link     : dst is a link to 'link'.
    -s sym-link : dst is a sym-link to 'sym-link'.

    if "src" is not provided,  basename is run on dst to determine the
    source in the current directory.

        multiple -e and -o options are ANDed together.  To achieve an OR affect
        use a single -e/-o with 1 or more y/n/"" chars in the condition.

        if src is a directory,  everything in it is copied recursively to dst
        with special files removed (currently CVS dirs).

romfs-inst.shのコマンド構文は以下のとおりです。

例9.2 romfs-inst.sh構文

romfs-inst.sh [options] [src] dst

[ ]の部分は省略することができます。もし、srcが指定されなかった場合、basenameコマンドが dstに適用されて、戻り値を srcとして使います。romfs-inst.shはその値を現在のディレクトリ(つまりプロダクトMakefileの場合はプロダクトディレクトリ)から探します。

[PC ~]$ basename /foo/bar
      bar

もし、srcがディレクトリの場合は、そのディレクトリ以下すべてのファイルとディレクトリをインストールします。ただし、CVS ディレクトリだけはコピーされません。

以下はオプションの簡単な説明です。

-v

実際に実行した内容を出力

-e env-var

env-varが "y"のときだけ、指定されたアクションを実行

-o option

optionが "y"のときだけ、指定されたアクションを実行

-p perms

chmod方式で dstのパーミッションを指定

-a text [-A pattern]

textを dstに追加。-A patternが指定されているときは、patternが dstに含まれていない場合に textを追加

-l link

dstで指定された名前で、linkへのハードリンクを作成

-s sym-link

dstで指定された名前で、sym-linkへのシンボリックリンクを作成

以降の章では、romfs-inst.shの使用例を説明します。

9.2. ファイルのインストール

ファイルをインストールする場合は、以下のようにromfsターゲットをMakefileに記述します。

  romfs:
	$(ROMFSINST) src.txt /etc/dst.txt

これは、プロダクトディレクトリ内にある src.txtromfsディレクトリの中の /etc/dst.txtにインストールすることを意味しています。もし、romfsディレクトリが ~/atmark-dist/romfsであれば、

~/atmark-dist/romfs/etc/dst.txtというファイルができあがります。

プロダクトディレクトリにあるsrc.txtの名前を変更してdst.txtとしておくことで、以下のように簡単に記述することができます。

$(ROMFSINST) /etc/dst.txt

上で簡単にふれましたが、srcが省略されたとき romfs-inst.shは dstのbasenameを使ってカレントディレクトリからファイルを探します。

/etc/dst.txtの basenameは、dst.txtなので上記の文は

      $(ROMFSINST) dst.txt /etc/dst.txt
    

と同じ意味を持ちます。

9.3. ディレクトリのインストール

ターゲットデバイスに多くのファイルをインストールする場合は、ディレクトリごとインストールすると簡単です。たとえば、ターゲットの/etcディレクトリに多くの設定ファイルをインストールする場合などです。

プロダクトディレクトリにetcというディレクトリを作成し、必要なファイルを置きます。そして Makefileに以下のように記述します。

$(ROMFSINST) /etc

この例でもsrcが省略されているので、romfs-inst.shは dstの basenameを使います。/etcの basenameはetcなので、romfs-inst.shはプロダクトディレクトリにある etcというファイルまたはディレクトリを探します。そして今回のようにディレクトリの場合、romfs-inst.shはディレクトリ内にあるファイルも一緒にインストールしてくれます。

以下のように treeコマンドを使うと簡単に確認できます。

[PC ~/]$ tree ~/atmark-dist-[version]/vendors/AtmarkTechno/test/etc
:
[PC ~/]$ tree ~/atmark-dist-[version]/romfs/etc
	:

もちろん、保存している名前とは別の名前でインストールすることも可能です。

$(ROMFSINST) /etc /var

このコマンドでは、プロダクトディレクトリにあるetcというディレクトリを romfs/varにインストールします。

9.4. リンクの作成

romfs-inst.shを使って簡単にリンクを作成することができます。ただし、hard linkと symbolic linkをきちんと理解しなければいけません。

symbolic linkを作成するときは、オプション ‘-s’を使います。例としてa.txtへのシンボリックリンクを作成してみます。プロダクトMakefileromfsターゲットは以下のようになります。

romfs:
	[ -d $(ROMFSDIR) ] || mkdir -p $(ROMFSDIR)
	$(ROMFSINST) /a.txt
	$(ROMFSINST) -s a.txt /b.txt
[PC ~/atmark-dist]$ make clean; make romfs
    :
    :
[PC ~/atmark-dist]$ ls -l romfs
total 0
-rw-r--r--  1 guest guest 0 Sep 24 05:43 a.txt
lrwxrwxrwx  1 guest guest 5 Sep 24 05:43 b.txt -> a.txt

次はhard linkの例です。オプションは‘-l’を使います。

romfs:
	[ -d $(ROMFSDIR) ] || mkdir -p $(ROMFSDIR)
	$(ROMFSINST) /a.txt
	$(ROMFSINST) -l a.txt /b.txt
[PC ~/atmark-dist]$ make clean; make romfs
    :
    :
[PC ~/atmark-dist]$ ls -i1 romfs
6077732 a.txt
6296750 b.txt
[PC ~/atmark-dist]$ ls -i1 vendors/AtmarkTechno/test/a.txt
6296750 vendors/ATmarkTechno/test/a.txt

romfs内にできたb.txtは、romfs内のa.txtへのハードリンクではなく、プロダクトディレクトリにあるa.txtへのハードリンクということがinodeの番号によってわかります。

ハードリンクの使用は混乱を招きますので、よほどハードドライブの容量に困っていないかぎりお勧めしません。現在の atmark-distでも、romfs内へのhardlinkはあまり使われていないようです。

9.5. ファイルへの情報追記

romfs-inst.shを使うことで、すでに存在するファイルに簡単に情報を追記することができます。

構文は以下のようになります。

$(ROMFSINST) -a "文字列" romfsディレクトリ内のファイル名
romfs:
	[ -d $(ROMFSDIR) ] || mkdir -p $(ROMFSDIR)
	$(ROMFSINST) -a 'Hello' /a.txt
	$(ROMFSINST) -a 'World' /a.txt
[PC ~/atmark-dist]$ make clean; make romfs
  :
    :
[PC ~/atmark-dist]$ cat romfs/a.txt
Hello
World

9.6. 条件実行

romfs-inst.shは条件による実行制御が可能です。

$(ROMFSINST) -e 変数名 実行するコマンド
    

変数名としてよく用いられるのは、CONFIG_ではじまる環境変数です。

romfs:
	[ -d $(ROMFSDIR) ] || mkdir -p $(ROMFSDIR)
	$(ROMFSINST) -e CONFIG_DEFAULTS_ATMARKTECHNO -a 'Hello' /a.txt
	$(ROMFSINST) -e CONFIG_DEFAULTS_UNKNOWN -a 'World' /a.txt

[PC ~/atmark-dist]$ make clean; make romfs
    :
    :
[PC ~/atmark-dist]$ cat romfs/a.txt
Hello

CONFIG_DEFAULTS_UNKNOWNは定義されていないので条件に当てはまらず、a.txtに「World」の文字列は書き出されません。CONFIG_DEFAULTS_ATMARKTECHNOは、ベンダー名でAtmarkTechnoを選択すると、atmark-dist/.configに定義されます。