前回宣言していたBuildrootを用いたLinuxで組み込みシステムをbuildするにはどうすればいいのかを解説していきます。
まぁ、実際に動くコードを作ってみて、最終的なシステムに比べて何が余分で、何が足りないのかが具体的にイメージできたほうがいいと思うので、今回はx86 PC用のコードを生成することにしましょう。
まぁ、実際に動くコードを作ってみて、最終的なシステムに比べて何が余分で、何が足りないのかが具体的にイメージできたほうがいいと思うので、今回はx86 PC用のコードを生成することにしましょう。
最初にすることは、開発用PCの設定とBuildrootのダウンロードから
開発用PCの設定は、とりあえず、メジャーなLinuxディストリビューションをインストールして、build-essential, ncurses-dev, bison, flexのツールをインストールします。
Debian-Ubuntuの場合には
% sudo apt-get install build-essential
% sudo apt-get install ncurses-dev
% sudo apt-get install flex
% sudo apt-get install bison
とすれば、インストールできます。
Fedora,Centosの場合には
Fedora,Centosの場合には
% sudo yum groupinstall buildsys-build development-tools
% sudo yum install -y flex
% sudo yum install -y bison
としましょう。開発用のディストリビューションデに依存するのはここ部分ぐらいで、今後の作業で依存するところはほとんどないので、ディストリビューションは、お好みで選んで問題ありません。
続いて、http://www.buildroot.org から、最新版をダウンロードして、解凍、コンフィグメニューを表示します
% tar xvfz buildroot-2016.02.tar.gz
% cd buildroot-2016.02
% make menuconfig
メニューが表示されますので,上から順にシステムに関する情報を設定していきましょう。
今回は、PC用の設定ですので、Target Architectureに x86_64か、i386を設定します。Target Binary Formatは、デフォルトのままELFで問題ありません。Target Architecture Variant は、使用するCPUに合わせて設定してください。Core i3,i5,i7の場合は、corei7を設定しましょう。ATOMの場合にはatomと設定してください。
Target Options
Target Architecture (x86_64) --->
Target Binary Format (ELF) --->
Target Architecture Variant (corei7) --->
Build Optionsに関しては、デフォルトのままで問題ありません。
Build options --->
Commands --->
($(CONFIG_DIR)/defconfig) Location to save buildroot config (NEW)
($(TOPDIR)/dl) Download dir (NEW)
($(BASE_DIR)/host) Host dir (NEW)
Mirrors and Download locations --->
(0) Number of jobs to run simultaneously (0 for auto) (NEW)
[ ] Enable compiler cache
[ ] Show options and packages that are deprecated or obsolete (NE
[ ] build packages with debugging symbols (NEW)
strip command for binaries on target (strip) --->
() executables that should not be stripped (NEW)
() directories that should be skipped when stripping (NEW)
gcc optimization level (optimize for size) --->
*** Stack Smashing Protection needs a toolchain w/ SSP ***
libraries (shared only) --->
($(CONFIG_DIR)/local.mk) location of a package override file (NEW
() global patch directories (NEW)
続いてToolchainの設定を行います。Toolchainとは、ターゲットの実行形式ファイルを作成するためのクロスコンパイラとそれに付随するツール、ライブラリのことで、一般的なPCでは、プログラムはコンパイルしたPCでそのまま実行するのに対して、組み込みシステムでは、作業用のPCでコンパイルしたファイルを、別のアーキテクチャのPCで実行することになります。
そのため、ターゲットの実行形式を生成するために使用するコンパイラをここで指定します。
この仕組みによって、x86 PC用の組み込みシステムであっても有用な副作用があり、例えば、これから開発しようとしているシステムを今後5年間にわたってメンテナンスしていく必要があるとすると、一般的な、作業用と実行PCが同一の実行形式であるといった環境では、作業用のPCが陳腐化してしまうとコードのメンテナンスが非常に困難になってしまうことに対して、コンパイラやライブラリのバージョンが作業用のPCと独立していることによって、コンパイラのソースコードごと保存しておけば、何年たっても同一の実行形式ファイルが生成できることになります。
今回は、とりあえず動かしてみるための設定なので、デフォルトのままでもいいのですが、日本語環境などにも対応できるように、wcharとi18nを有効にしておきましょう。
X Windowや、Webブラウザなども動かしてみたいならば、C++のオプションと、C Libraryを glibcに変更しておいたほうがいいでしょう。(Webブラウザなどののコンパイルは非常に時間がかかるため、動かしてみるといった観点からはおすすめしません)
今回は動かしてみるのが主目的ですが、実際のターゲットは別のCPUで、チップメーカーから最適化されたコンパイラが提供されている場合などは、ここでコンパイラを設定します。
Toolchain --->
Toolchain type (Buildroot toolchain) --->
(buildroot) custom toolchain vendor name (NEW)
*** Kernel Header Options ***
Kernel Headers (Linux 4.4.x kernel headers) --->
C library (uClibc) --->
*** uClibc Options ***
(package/uclibc/uClibc-ng.config) uClibc configuration file to us
() Additional uClibc configuration fragment files (NEW)
[ ] Enable RPC support (NEW)
[*] Enable WCHAR support (NEW)
[*] Enable toolchain locale/i18n support (NEW)
Thread library implementation (Native POSIX Threading (NPTL))
[ ] Thread library debugging (NEW)
[ ] Enable stack protection support (NEW)
[*] Compile and install uClibc utilities (NEW)
[ ] Compile and install uClibc tests (NEW)
*** Binutils Options ***
Binutils Version (binutils 2.24) --->
() Additional binutils options (NEW)
*** GCC Options ***
GCC compiler Version (gcc 4.9.x) --->
() Additional gcc options (NEW)
[ ] Enable C++ support (NEW)
[ ] Enable Fortran support (NEW)
[*] Enable compiler tls support (NEW)
[ ] Enable compiler link-time-optimization support (NEW)
[ ] Enable compiler OpenMP support (NEW)
[ ] Enable graphite support (NEW)
[ ] Build cross gdb for the host (NEW)
[ ] Purge unwanted locales (NEW)
() Target Optimizations (NEW)
() Target linker options (NEW)
[ ] Register toolchain within Eclipse Buildroot plug-in (NEW)
[ ] Enable graphite support (NEW)
System configuration のページでは、Loginプロンプトやユーザーの扱いの設定をします。基本はデフォルトのままで問題ないと思いますが、LANを使用したいなら、DHCPインターフェイスにeth0を設定してください。rootのパスワードなどはお好みで
System configuration --->
(buildroot) System hostname (NEW)
(Welcome to Buildroot) System banner (NEW)
Passwords encoding (md5) --->
Init system (BusyBox) --->
/dev management (Dynamic using devtmpfs only) --->
(system/device_table.txt) Path to the permission tables (NEW)
Root FS skeleton (default target skeleton) --->
[ ] Use symlinks to /usr for /bin, /sbin and /lib (NEW)
[*] Enable root login with password (NEW)
() Root password (NEW)
/bin/sh (busybox' default shell) --->
[*] Run a getty (login prompt) after boot (NEW) --->
[*] remount root filesystem read-write during boot (NEW)
(eth0) Network interface to configure through DHCP (NEW)
[ ] Install timezone info (NEW)
() Path to the users tables (NEW)
() Root filesystem overlay directories (NEW)
() Custom scripts to run before creating filesystem images (NEW)
() Custom scripts to run after creating filesystem images (NEW)
次は、Linuxカーネルの設定です。Kernelのバージョンはhttp://www.kernel.org/を参照して、stableかlongtermになっているバージョンの新しいものを設定してください。わざわざ古いものを選ぶ意味はほとんどありません。
defconfigに関しては、Target Architectureで設定したものを入力してください。
チップメーカから、専用のカーネルが提供されている場合などは、ここでそのカーネルのソースの位置を指定すると、そのカーネルをBuildrootのシステムに組み込むことができます。
Kernel --->
[*] Linux Kernel
Kernel version (4.4.3) --->
() Custom kernel patches (NEW)
Kernel configuration (Using an in-tree defconfig file) ---
(x86_64) Defconfig name
() Additional configuration fragment files (NEW)
Kernel binary format (bzImage) --->
Kernel compression format (gzip compression) --->
[ ] Build a Device Tree Blob (DTB) (NEW)
[ ] Install kernel image to /boot in target (NEW)
Linux Kernel Extensions --->
Linux Kernel Tools --->
Target Packageの項目では、実際のターゲットで動作させたいアプリケーションを選択することができます。この項目も、とりあえず動かしてみるだけであれば特に変更する項目はありませんが、どんなアプリケーションが選択できるかは、一通り眺めてみてみるといいでしょう。
Busyboxというのは、Linuxの基本コマンド群を1つのファイルにして提供しているもので、これとカーネルさえあれば、とりあえずシステムとして起動させることができます。Busyboxを使用することによって、cpコマンドのバージョンや、lsコマンドのバージョンといった細かな管理が必要なくなるので、自前でバージョン管理をする必要のある組み込みシステムでは、非常に有用です。
Target packages --->
-*- BusyBox
(package/busybox/busybox.config) BusyBox configuration file to us
() Additional BusyBox configuration fragment files (NEW)
[ ] Show packages that are also provided by busybox (NEW)
[ ] Enable SELinux support (NEW)
[ ] Install the watchdog daemon startup script (NEW)
Audio and video applications --->
Compressors and decompressors --->
Debugging, profiling and benchmark --->
Development tools --->
Filesystem and flash utilities --->
Fonts, cursors, icons, sounds and themes --->
Games --->
Graphic libraries and applications (graphic/text) --->
Hardware handling --->
Interpreter languages and scripting --->
Libraries --->
Mail --->
Miscellaneous --->
Networking applications --->
Package managers --->
Real-Time --->
Security --->
Shell and utilities --->
System tools --->
Text editors and viewers --->
次に、Filesystemの形式の選択です。ここでは、組み込みシステムと通常のデスクトップOSの違いを実感するために、cpioのファイルシステムを選択してみましょう。ファイルシステムのすべてがRAM上で実行され、必要なファイルを消してしまっても、設定を変更しても、リセットすれば元通りといった環境ができます。
Filesystem images --->
[ ] axfs root filesystem (NEW)
[ ] cloop root filesystem for the target device (NEW)
[*] cpio the root filesystem (for use as an initial RAM filesyste
[ ] cramfs root filesystem (NEW)
[ ] ext2/3/4 root filesystem (NEW)
[ ] initial RAM filesystem linked into linux kernel (NEW)
*** iso image needs a Linux kernel and one of grub, grub2 or
[ ] jffs2 root filesystem (NEW)
[ ] romfs root filesystem (NEW)
[ ] squashfs root filesystem (NEW)
[ ] tar the root filesystem (NEW)
Compression method (no compression) --->
() other random options to pass to tar (NEW)
[ ] ubifs root filesystem (NEW)
[ ] yaffs2 root filesystem (NEW)
Bootloaderの設定です。組み込みシステムの場合、ユーザーにキーボードで起動メニューを選択させるようなことはないと思いますので、シンプルで安定感のあるsyslinuxを選択しています。syslinuxは、旧来のMBR経由のブートサポートしていますので、UEFIのみサポートしているマザーボードで使用する場合には、別のブートローダを選択しる必要があります。
Bootloaders --->
[ ] Barebox (NEW)
[ ] grub (NEW)
[ ] grub2 (NEW)
*** gummiboot needs a toolchain w/ wchar ***
[*] syslinux (NEW)
[ ] U-Boot (NEW)
Host utilitiesの項目では、ターゲットイメージを生成するための拡張ツールを選択します。ターゲットの起動デバイスを、作業用PCで作成する場合などに、デバイスのパーティショニングやフォーマットのためのツールを選択します。
作業用PCにこれらのツールがインストールされている場合には、特にここで選択する必要はありませんが、Toolchainと同様に、メディアの陳腐化などにも対応したい場合には、ここで設定しておくと後々有用かもしれません。
Host utilities --->
[ ] host aespipe (NEW)
[ ] host checkpolicy (NEW)
[ ] host cramfs (NEW)
[ ] host dfu-util (NEW)
[ ] host dos2unix (NEW)
[ ] host dosfstools (NEW)
[ ] host dtc (NEW)
[ ] host e2fsprogs (NEW)
[ ] host e2tools (NEW)
[ ] host faketime (NEW)
[ ] host genext2fs (NEW)
[ ] host genimage (NEW)
[ ] host genpart (NEW)
[ ] host gptfdisk (NEW)
[ ] host jq (NEW)
[ ] host lpc3250loader (NEW)
[ ] host mke2img (NEW)
[ ] host mtd, jffs2 and ubi/ubifs tools (NEW)
[ ] host mtools (NEW)
[ ] host openocd (NEW)
[ ] host parted (NEW)
[ ] host patchelf (NEW)
[ ] host pwgen (NEW)
[ ] host qemu (NEW)
[ ] host sam-ba (NEW)
[ ] host squashfs (NEW)
[ ] host u-boot tools (NEW)
[ ] host util-linux (NEW)
[ ] host vboot utils (NEW)
最後に Legacy config optionsですが、ここは昔のBuildrootのリリースとの整合性のために残されている項目なので、初めてBuildrootを使用する場合には設定する必要はありません。
Legacy config options --->
*** Legacy options removed in 2016.02 ***
以上の設定が終わったら、
% make
とすると、Buildrootのスクリプトが、選択したモジュールのソースコードを次々とダウンロードして、コンパイルしていきます。
コンパイルが終了すると
ダウンロードされたファイルは $(TOPDIR)/dl
展開され、コンパイルされたファイルは $(TOPDIR)/output/build
ターゲ