COLUMN
【Linux Tipsシリーズ】平凡なソフトウェア開発者が自分Linuxを作ってみた ②
今回のコラムは、前回のコラムの続きとなります。前回は、Buildrootの環境を構築し、すでに用意されているアプリケーション(軽量sshであるdropbear)を追加したRaspberryPi3用ディスクイメージを作りました。今回は、前回の環境を使用して、独自アプリケーションの追加をしてみようと思います。
独自アプリケーションのビルド
独自アプリケーションをターゲット用にコンパイルするには、ターゲット上で直接コンパイルする方法や、クロスコンパイルを行いターゲットに転送する方法がありますが、Buildrootではターゲットを使用してのセルフコンパイル用のコンパイラは用意されていませんので、文字列を出力するだけのような簡単なアプリケーションでも、クロスコンパイルを行い、ターゲットに転送する事になります。
Buildroot環境でクロスコンパイルを行うには、Buildrootのドキュメントの「8.12.1. Using the generated toolchain outside Buildroot」を参考に、クロスコンパイラのある「output/host/bin/」への PATH を設定することでできるようになります。 また、クロスコンパイラのコマンドは、“aarch64-linux-gcc”,“aarch64-linux-objdump”,“aarch64-linux-ld”,等 となっています。
-
※
-
今回のコラムは前回の続きなので、Buildrootはbuildroot-2019.02.05.tar.gzを使用し、ホームディレクトリに解凍されていることとします。また、ターゲットはRaspberryPi3用の64bitOSとしています。
PATHの設定を行い、クロスコンパイラのバージョンを確認して、クロスコンパイラが使用できるか確認してみます。
~$ PATH=$PATH:~/buildroot-2019.02.5/output/host/bin/
~$ aarch64-linux-gcc ––version
コマンドを実行すると、以下のような出力がされて、コンパイラが使用できることが確認できます。
aarch64-linux-gcc.br_real (Buildroot 2019.02.5) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
コンパイラが使用できることが確認できましたので、「リスト 1 テストプログラム」のような簡単なプログラムをクロスコンパイルしてみます。
リスト 1 テストプログラム
#include <stdio.h>
int main(int argc,char **argv)
{
printf(“Hello Buildroot World. ¥n”);
return 0;
}
「リスト 1 テストプログラム」を“column.cpp”というファイル名で保存して、“column_app”というアプリケーション名となるようにコンパイルします。
~$ aarch64-linux-gcc column.cpp -o column_app
コンパイルされた“column_app”を、ターゲットに転送して実行してみます。( 図 1 column_app実行結果 参照 )
図 1 column_app実行結果
-
※
-
column_appをターゲットへ転送する方法については scp を使う方法や、USBメモリを使う方法等、やり易い方法で行ってください。
期待通り、“Hello Buildroot World”と出力され、クロスコンパイルが正常に行われたことが確認できました。
ターゲットへ独自アプリケーションを追加する
カーネルの設定や、導入するパッケージ構成が確定しているのであれば、イメージを作り直す回数も少なく、ターゲットへの転送も手間ではないと思いますが、イメージファイルを作成する際に取り込まれた方が便利です。 Buildrootには、指定したディレクトリやファイルを取り込んだ状態のイメージファイルを作る「ルートファイルシステムオーバーレイ」( Buildrootのドキュメントの「9.5. Customizing the generated target filesystem」 参照 )という機構があります。
この機構は、Buildrootの設定の「ルートファイルシステムオーバーレイ」で指定したディレクトリの内容を、ディレクトリごとターゲットのルートディレクトリにコピーする機能です。( 図 2 オーバーレイ動作イメージ 参照 )
図 2 オーバーレイ動作イメージ
ここでは、「ルートファイルシステムオーバーレイ」を使用して独自アプリケーションを含んだイメージファイルを作成してみます。
使用する独自アプリケーションは「独自アプリケーションのビルド」で作った「column_app」を使用します。 また、「column_app」はホームディレクトリでコンパイルされており、ターゲット上では「 /root 」に入るようにします。
「column_app」を、適当なディレクトリにコピーします。
-
※
-
ここでは、ホームディレクトリに overlay_root というディレクトリを作り、そこを使用します。 ターゲットの「 /root 」に入れるので、入れ先としての「 /root 」ディレクトリも作ります。
~$ cd
~$ mkdir overlay_root
~$ mkdir overlay_root/root
~$ cp column_app overlay_root/root/.
「make menuconfig」か「make nconfig」、「make xconfig」、「make gconfig」のいずれかを実行して、Buildrootの設定を開き、「ルートファイルシステムオーバーレイ」の変更を行います。
「System configuration」->「Root filesystem overlay directories」に“~/overlay_root”と入力して( 図 3 Buildrootの設定(ルートファイルシステムオーバーレイ)参照 )「保存」して終了し、「make」を実行してイメージファイルを作成します。
-
※
-
ここでは、「make xconfig」を使用しています。
図 3 Buildrootの設定(ルートファイルシステムオーバーレイ)
イメージファイルは、Buildrootのディレクトリ配下の「output/images/」に「sdcard.img」というファイル名で生成されています。 生成されたイメージファイルをマイクロSDに書き込んでRaspberryPiを起動し、ログインしてみましょう。
前回のコラムで、rootのパスワードを設定していますので、「buildroot login:」の箇所は“root”、「Password:」は“admin”と入力するとログインできます。
ログインしたら、「 /root 」の内容を見てみましょう。
独自アプリケーションがイメージファイルに含まれていることが確認できました。( 図 4 ルートファイルシステムオーバーレイ確認 参照 )
図 4 ルートファイルシステムオーバーレイ確認
本コラムでは、簡単なプログラムを元々何も格納されていない「 /root 」に入れただけですが、読者の皆さんは設定ファイル等も入れてみたり、「 /etc 」のファイルを変更してみたりするなどしてみてください。
個別相談も承っております。下記よりお申し込みください。