第7章 イメージファイルの作成

7.1. 全体の流れ

イメージ作成の流れ

図 7.1. イメージ作成の流れ


デフォルトのイメージを作成する一連の手順を順番に説明します。一連の手順は、以下のように切り分けることができます。

  • コンフィグレーション

  • ビルド

7.2. メニューベースコンフィグレーションの基本操作

7.2.1. 移動

カーソルキーでメニュー内の移動を行います。

7.2.2. サブメニューの選択

Enterキーを押すことで、サブメニューを選択できます。サブメニューは --->で表示されます。

7.2.3. リストからの選択

小括弧「( )」で表示されている部分は、リストから選択する部分です。Enterキーでリスト画面に移動し、上下のカーソルキーで選択対象に移動し、Enterキーで選択します。

7.2.4. 有効無効の選択

大括弧「[ ]」は、有効無効の選択を表します。選択されるとアスタリスク「*」が大括弧内に表示されます。

7.3. コンフィグレーション

項6.1. 「設定(config)」で紹介したコマンドのうち、どれか一つを使ってコンフィグレーションを行います。ここではmake menuconfigを例に説明します。

コンフィグレーションは、大きく次のようにわけることができます。

この中でカーネル設定とベンダー/ユーザ設定は、選択後に一度メニューを終了することで、それぞれの設定画面が自動的に表示されます。

コンフィグレーションは、以下のようにはじめます。

[PC ~/atmark-dist]$ make menuconfig

7.3.1. Main Menu(メインメニュー)

menuconfigを実行するとメインメニュー画面が表示されます。この画面から各サブメニューに移動することができます。

7.3.2. Vendor/Product Selection(ベンダ/プロダクト選択)

ベンダーとプロダクトを選択します。先にベンダーを選択し、その後プロダクトを選択します。

7.3.3. Kernel/Library/Defaults Selection(カーネル/ライブラリ/デフォルト選択)

カーネルやライブラリ、デフォルトの選択を行います。以降のメニューはこのサブメニュー中にあります。

7.3.4. Kernel Version(カーネルの選択)

複数のカーネルをサポートしたプロダクトの場合、ここでビルドするカーネルのバージョンを選択します。アットマークテクノで現在対応しているカーネルは2.6系のLinuxカーネルです。

7.3.5. Cross-dev(開発環境の選択)

複数の開発環境をサポートしたプロダクトの場合、ここでビルドする開発環境を選択します。

7.3.6. Libc Version(Cライブラリの選択)

複数のCライブラリをサポートしたプロダクトの場合、ここでビルドするCライブラリを選択します。選択肢としては、以下の4つが選択対象です。

  • None

  • glibc-GNU Cライブラリ

  • uC-libc

  • uClibc

Noneを選択すると、すでに開発環境にインストールされているCライブラリを使用します。そのほかの選択肢では、atmark-distに含まれているコードをビルドします。

製品によって対応しているライブラリが異なりますので、製品のソフトウェアマニュアルを参照してください。

7.3.7. Default all settings (デフォルトの設定に戻す)

すべての設定をデフォルトの状態に変更します。変更されている設定情報はすべて無くなってしまうので注意が必要です。

7.3.8. Customize Kernel Settings(カーネル設定の変更)

Linuxカーネルのコンフィグレーションを行うか否かを選択します。選択した場合、atmark-distの設定終了後に自動的にカーネルの設定画面が起動されます。

7.3.9. Customize Vendor/User Settings(ベンダ/ユーザ設定の変更)

ユーザーランドのコンフィグレーションを行うか否かを選択します。選択した場合、atmark-distの設定終了後に自動的にユーザーランドの設定画面が起動されます。ユーザーランドのメニューについては次章で説明します。

7.3.10. Update Default Vendor Settings(デフォルトベンダ設定の更新)

現在の設定で、デフォルト設定を更新します。更新した場合、古い設定に戻す方法はありませんので、注意が必要です。

7.4. ユーザーランドの設定

ユーザーランドのメニューは以下のような項目に別れています。ここでは簡単に各項目について説明します。

7.4.1. Vendor specific

ベンダー固有の設定を行います。rootfsのinode/block数や、製品固有のアプリケーションを選択できます。

7.4.2. Core Application

システムとして動作するために必要な基本的なアプリケーションが入っています。システムの初期化を行うinitやユーザ認証のloginなどがこのセクションで選択できます。

7.4.3. Library Configuration

アプリケーションが必要とするライブラリの選択ができます。

7.4.4. Flash Tools

フラッシュメモリに関係のあるアプリケーションが選択できます。以降の章で説明するNetflashと呼ばれるネットワークアップデート用アプリケーションがここで選択されています。

7.4.5. Filesystem Applications

ファイルシステムに関係のあるアプリケーションが選択できます。あとの章で説明するFlatfsdはここで選択することができます。その他、mount、fdisk、ext2ファイルシステム、Reiserファイルシステム、Sambaなどが含まれます。

7.4.6. Network Applications

ネットワークに関係のあるアプリケーションが選択できます。dhcpcd-new、ftpd、ifconfig、inetd、thttpdの他にもpppやワイヤレスネットワークのユーティリティなども含まれます。

7.4.7. Miscellaneous Applications

上記のカテゴリに属さないアプリケーションが収録されています。Unixの一般的なコマンド(cp、ls、rm等)やエディタ、オーディオ関連、スクリプト言語インタプリタなどが含まれます。

7.4.8. Busybox

Busyboxのカスタマイズを行います。Busyboxは複数のコマンド機能をもった単一コマンドで多くの組み込みLinuxでの実績を持っています。Busyboxはとても多くカスタマイズできるため、別セクションになっています。

7.4.9. Tinylogin

Tinyloginも複数コマンドの機能をもつアプケーションです。loginやpasswd、gettyなど認証に関係のある機能を提供します。多くのカスタマイズが可能なため別セクションになっています。

7.4.10. MicroWindows

MicroWindowsは組み込み機器をターゲットにしたグラフィカルウインド環境です。LCDなどを持つ機器を開発する場合に使えます。

7.4.11. Game

ゲームです。説明はいらないですよね。

7.4.12. Miscellaneous Configuration

いろいろな設定がまとめられています。SUZAKUのrootユーザのパスワードもここで変更できます。

7.4.13. Debug Builds

デバッグ用のオプションがまとめられています。開発中にアプリケーションのデバッグを行うときに選択します。

7.5. ビルド

依存関係の解決が終わったら実際にビルドします。ビルドシステムがすべてを行ってくれるため、開発者はmake コマンドを入力するだけです。

例 7.1. makeの実行

[PC ~/atamrk-dist]$ make
    :
    :
[PC ~/atmark-dist]$ ls images
linux.bin  linux.bin.gz  romfs.img  romfs.img.gz

makeコマンドが終了すると、imagesディレクトリにイメージファイルが生成されます。

7.6. 詳細なビルドの流れ

内部的にどのようにビルドが進み、最終的にイメージファイルになるのかを理解すると、必要とされる部分だけビルドすることもできます。これによりビルドに必要な時間を大幅に短縮できます。また、特定製品向けのカスタマイズを行うためにも、この知識は欠かせないでしょう。

デフォルトのビルドを行うとイメージファイルが作成されますが、この間にたくさんのターゲットが実行されています。デフォルトターゲットのビルドルールは、atmark-distルートディレクトリのMakefileに以下のように記載されています。

ifeq (.config,$(wildcard .config))
include .config

all: subdirs romfs modules modules_install image
else
all: config_error
endif

デフォルトビルドを実行するとsubdirs, romfs, modules, modules_install, imageの順にビルドが行われるのが分かります。

この流れに沿って、各ターゲットのビルドを説明します。

7.6.1. subdirsターゲット

atmark-distルートディレクトリのMakefileのsubdirsビルドルールを以下に示します。

DIRS    = include lib include user
        :
        :
subdirs: linux
        for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH_KERNEL) -C $$dir ||
 exit 1 ; done

subdirsターゲットをビルドすると、linux, include lib, include userの順にビルドが行われます。

linuxターゲットは、選択された Linuxカーネルのビルドを行います。atmark-distでは version 2.0、2.4、2.6のカーネルに対応していますが、現在 アットマークテクノの製品では2.6系の Linuxカーネルが対応しています。

libは、ライブラリを収録したディレクトリです。uClibcと glibcは libディレクトリに入っていませんが、コンフィグ時に libディレクトリ内にシンボリックリンクを生成するようになっています。

userは、ユーザーランドアプリケーションを集めたディレクトリです。userディレクトリには専用のMakefileが用意されており、トップレベルのMakefileはそちらに制御を任せるようになっています。

7.6.2. romfsターゲット

romfsターゲットでは、各ディレクトリに対してromfsターゲットを再帰的に呼びだします。多くの場合、romfs-inst.shをつかって必要なファイルを、atmark-dist/romfsディレクトリにインストールします。

例 7.2. トップレベルMakefileでのromfsターゲット処理

DIRS    = include lib include user
        :
        :
romfs:
	$(MAKEARCH) -C $(VENDDIR) romfs
	for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir romfs || exit 1 ; done
	-find $(ROMFSDIR)/. -name CVS | xargs -r rm -rf

例 7.3. user/Makefileでのromfsターゲット処理

VEND=$(ROOTDIR)/vendors

dir_p = $(ROOTDIR)/prop

dir_y =
dir_n =
dir_  =
      :
      :
romfs:
for i in $(sort $(dir_y)) $(dir_p) ; do \
[ ! -d $$i ] || make -C $$i romfs || exit $$? ; \
done

7.6.3. module

Linuxカーネルでは、多くのドライバーなどが moduleという形で分離できるようになっています。このターゲットはLinuxカーネルのビルドシステムにある modulesターゲットを実行します。

7.6.4. module_install

上記のターゲットでビルドされたカーネルモジュールを romfsにインストールします。romfs/lib/modules内にインストールされます。

7.6.5. image

imageターゲットは、プロダクトMakefileの imageターゲットを実行するためのターゲットです。多くのプロダクトでは、カーネルのイメージとユーザーランドのイメージをまとめて、一つのイメージファイルにしています。

直接プロダクトMakefileのターゲットが呼び出されるため、開発者が自由に処理することができます。一般的な流れとしては

  1. Linuxカーネルのbinary fileを生成 (elfから binaryに変換)

  2. romfsディレクトリからイメージファイルを生成(genext2fsやgenromfsを使用)

  3. 上記2つのファイルを1つにまとめる

  4. NetFlash用にチェックサムなどを生成しバイナリファイルに添付する

と、なっています。