1カ月集中講座

Intelの開発ボード「Galileo 2」の楽しみ方 第3回

~GalileoのLinuxをカスタマイズする

「Galileo Gen.2」

 「Galileo」はArduino互換の開発環境が利用できながらも、Linuxをファームウェアとして採用しているという特徴がある。とは言え、オンボードのフラッシュメモリは8MBしかなく、標準では最小限のコマンドセット(Busybox)+スケッチを起動させるためのツールやデーモンという最小構成で、Linuxマシンとして活用するのはかなり厳しい。そのためGalileoをLinux機として活用するにはmicroSDカードの利用が前提になる。

 IntelはGalileo用のmicroSDカードイメージを公開しており、それにはフラッシュメモリのLinuxに比べるとかなり多くのコマンドやツールが収録されている。だが、それでも十分とは言いがたい。

 というわけで、今回はGalileo用のカスタム済みmicroSDカードイメージを作成する方法を紹介することにしたい。

microSDカードイメージを作成する環境を整える

 GalileoがLinuxを利用していることから、「Raspberry Pi」や「BeagleBone Black」と同系統のガジェットと捉える向きも多いようだ。だが、Galileoはこれらのボードとは立ち位置が異なる製品と見るべきだろう。

 Raspberry PiやBeagleBone Blackは、ARMベースのアプリケーションプロセッサに分類されるSoCを採用しており、そこそこ高速なCPUにグラフィックアクセラレータが統合されている。そのため、多少の制限はあるもののデスクトップアプリケーションやマルチメディアアプリケーションを動作させることが可能で、実際にそうした応用例も多い。

 一方のGalileoは、400MHzで動作するPentiumクラスという、性能面で制約が大きいCPUコアが搭載されており、グラフィックスも統合されていない。つまりGalileoでデスクトップアプリケーションを動作させることは想定されていないわけだ。

 少し言葉を変えると、Raspberry PiやBeagleBone Blackにはユーザーインターフェイスを作りこむことが可能だが、Galileoでは、ユーザーインターフェイスはPCなどほかのプラットフォームに任せ、その手足として使うことを想定したボードと見るのがいいと思う。

 こうしたことから、Galileo上で動作するLinuxは限られた機能があれば十分ということになる。だが、開発に際してはGalileo側でもいろいろできた方が便利だろう。Galileoのアプリケーションを最終製品として仕上げる際に余分なものは削るとしても、例えば、場合によってはGalileo上のLinuxでも開発ツールが使えた方がいいということもあるはずだ。その方法を説明していくことにする。

 IntelはGalileoで利用されているファームウェアの全てのソースコード(ブートローダーも含む)を公開している。Galileoは小型ながらもPCとよく似たブートシステムを採用していて、UEFI→ブートローダーGRUB→Linuxカーネルという順で起動する。それぞれにユーザーがカスタマイズを加えることが可能だが、本稿ではカスタマイズの対象をLinuxに絞ることにする。

 Galileo上のLinuxの構築にはYocto Projectが開発しているビルドシステムが利用されている。このビルドシステムは、レシピと呼ばれる設定ファイルに必要な記述を行なうことで、ターゲットに組み込むLinuxに任意のコマンドやツールを組み込むことが可能で、最近はこれを利用する組み込み機器が増えてきているようだ。

 Yoctoのビルドシステムを利用するには、PC上で動作するLinuxが必要になる。本稿では便宜的にホストPCと呼ぶことにしよう。

 自動的にコンパイルやビルドを行なってターゲット(本稿ではGalileo)向けのLinuxシステムイメージを作成する関係で、ホストPCで利用するLinuxにはいくつかの制約がある。本稿ではもっともユーザーが多いと思われるUbuntu 13.10をホストPC上のLinuxとして利用するが、Ubuntu 13.10以降のUbuntuではGalileoのビルドツリーの動作確認が行なわれておらず、実際に問題があるため作業を行なう前に若干の手直しが必要だ。順に説明していこう。

gccのバージョン変更

 Ubuntu 13.10では標準でgcc 4.8.xが採用されているが、このバージョンのgccではエラーが出てビルドを行なうことができない。Intelが動作確認を行なっているバージョンはgcc 4.3かgcc 4.6なので、それを導入してgccのバージョンを落とす必要がある。

 まず、ホストPCで次のコマンドを実行して必要な開発ツール一式を導入しておこう。

$ sudo apt-get update  $ sudo apt-get install build-essential gcc-multilib vim-common uuid-dev iasl subversion git autoconf diffstat gawk chrpath

 その上でgcc 4.6とg++ 4.6を導入する。

$ sudo apt-get install gcc-4.6 g++-4.6

 続いて、標準のgccを4.6に切り替える。/etc/alternatives/以下のシンボリックリンクを切り替えるのが正式なやり方だと思うが、筆者の環境ではなぜか正常に機能しなかったので、/usr/bin以下のシンボリックリンクを強制的に張り替えることにした。

$ cd /usr/bin  $ sudo ln -sf gcc-4.6 gcc  $ sudo ln -sf g++-4.6 g++

 以上のコマンドを実行したらgccが正しく4.6に切り替わったことを確認しておこう。

$ gcc --version  gcc (Ubuntu/Linaro 4.6.4-3ubuntu1) 4.6.4  Copyright (C) 2011 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.    $ g++ --version  g++ (Ubuntu/Linaro 4.6.4-3ubuntu1) 4.6.4  Copyright (C) 2011 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.

 このようなバージョンシグネチャが得られればOKだ。

texinfoのダウングレード

 Ubuntu 13.10ではtexinfo 5.1が導入されているが、いくつかのパッケージでエラーが生じるためtexinfo 4.13にダウングレードする必要がある。ダウングレードの副作用はあまり生じないと思うが、全ての作業が終わったら元に戻しておいた方がいいかもしれない。

 次のようにして旧版のtexinfoのパッケージをダウンロードしよう。

$ wget http://mirrors.kernel.org/ubuntu/pool/main/t/texinfo/texinfo_4.13a.dfsg.1-8ubuntu2_i386.deb

 このパッケージをインストールする。

$ sudo dpkg -i ./texinfo_4.13a.dfsg.1-8ubuntu2_i386.deb

 これでダウングレードが行なわれているはずだ。makeinfoを実行してバージョンを調べておいて欲しい。

$  makeinfo --version  makeinfo (GNU texinfo) 4.13    Copyright (C) 2008 Free Software Foundation, Inc.  License GPLv3+: GNU GPL version 3 or laterThis is free software: you are free to change and redistribute it.  There is NO WARRANTY, to the extent permitted by law.

 このようなバージョンシグネチャが得られれば成功だ。

ビルドツリーの準備

 続いてIntelから必要なファイルをダウンロードしてYoctoのビルドツリーを作成する。この作業は結構面倒で手間がかかるので、自分ではやりたくない人のために筆者が作成したビルドツリーのアーカイブ「meta-clanton_v1.0.1_p.tar.gz」を用意した。このアーカイブを使おうという人は以下の作業はパスしてしまって構わない。

meta-clanton_v1.0.1_p.tar.gzをダウンロード

 自力で行なおうという人は、いくつかのファイルをIntelから入手する必要がある。ファイルが分散していて少し分かりにくいが、まず必要なのは「Intel Quark BSP」と呼ばれるアーカイブだ。BSPは「Board Support Package」の略で、このファイルにIntel Quark SoC向けのBoard Support Packageが収録されている。

 このページから「board_support_package_sources_for_intel_quark_v1.0.1.7z」というファイルが手に入る。Linux上で展開するには7zrが必要になるので、あらかじめインストールしておこう。

$ sudo apt-get install 7zip

 ホームディレクトリにGalileo2というディレクトリを作成して、その下に展開することにしよう。ブラウザを使ってダウンロードした場合、Ubuntuでは~/ダウンロード/以下に収容されるので、次のように展開する。

$ mkdir ~/Galileo2  $ cd ~/Galileo2  $ 7zr x ~/ダウンロード/board_support_package_sources_for_intel_quark_v1.0.1.7z

 これで~/Galileo2の下にファイル群が展開される。ファイル群の中でLinuxのビルドツリーになるのはmeta-clanton_v1.0.1.tar.gzなので、これを展開しよう。

$ tar xvzf meta-clanton_v1.0.1.tar.gz

 これで~/Galileo2/meta-clanton_v1.0.1/というディレクトリが作成される。この下でビルドすることになる。ただし、ビルド作業の前にパッチをあてなければならない。

 Intel Webサイトのこのページから「BSP Patches and Build Instructions」とタイトルが付いたファイル(BSP-Patches-and-Build_Instructions.1.0.4.tar.bz2)をダウンロードしてほしい。このファイルはホームディレクトリに展開する必要がある。次のように展開しよう。

$ tar xvjf ~/ダウンロード/BSP-Patches-and-Build_Instructions.1.0.4.tar.bz2 -C ~/

 ~/patches/以下にGalileo向けのパッチ一式が、また説明書が~/BSP-Build_Instructions.1.0.4.txtに展開される。パッチの当て方は説明書に記されているが、1つ1つ手で実行していくと大変だ。

 そこで、説明書を切り出してバッチファイルとしたファイル「BSP_patch.sh」を用意した。BSP_patch.shをホームディレクトリに置いて欲しい。その上で次のように実行する。

BSP_patch.shをダウンロード

$ export WORKSPACE=~/Galileo2  $ sh ~/BSP_patch.sh

 これで一気にパッチがあたるはずだ。

 さらに、説明書にないパッチもいくつか必要になる。筆者が気づいたのは開発ツールに含まれる「guile」のレシピで、標準のままでは正常にビルドされないようだ。~/Galileo2/meta-clanton_v1.0.1/poky/meta/recipes-devtools/guile以下にある「guile_2.0.7.bb」というファイルをエディタで開いて、次のように修正して欲しい。

【リスト】guile_2.0.7.bbの修正

……中略    inherit autotools gettext  BBCLASSEXTEND = "native"    DEPENDS = "libunistring bdwgc gmp libtool libffi"  # add guile-native only to the target recipe's DEPENDS  DEPENDS_append_class-target = " guile-native libatomics-ops"    RDEPENDS_${PN}_append_libc-glibc_class-target = "glibc-gconv-iso8859-1"    ……以下略

 “DEPENDS +=”で始まる1行を削除して、上記リストのようにDEPENDS_append_class-targetで始まる1行に変えればOKだ。変更を終えたら保存して欲しい。

 以上でおおまかなパッチの適用および修正は終了だが、以上の作業だけで全てのパッケージのビルドができるかどうかはなんとも言えない(Intelも全ては検証していないのではないかと思う)。少なくとも筆者がビルドしたパッケージ群は大丈夫だったが、さらに追加のパッケージをビルドしようとすると失敗する可能性もある。そのような場合は自力で修正を加えていく必要があるが、かなり面倒な作業になるだろう。

 なお、先に紹介した、パッチなどを当てた状態のアーカイブ「meta-clanton_v1.0.1_p.tar.gz」をダウンロードした人は、単にこれを~/Galileo2以下で展開すればOKだ。一通りの修正を加えたツリーになっているので、手間なく使えると思う。以下のように展開して欲しい。

$ mkidr -p ~/Galileo2  $ tar xvzf ~/ダウンロード/meta-clanton_v1.0.1_p.tar.gz

ビルドしよう

 ではビルドを行なうことにするが、初期状態でレシピとして用意されている「image-full-galileo」はIntelが配布しているmicroSDカードイメージ相当で、冒頭で述べたように開発ツールなどが少し足らない。それらを追加するためにレシピに手を加えることにする。

 ~/Galileo2/meta-clanton_v1.0.1/meta-clanton-distro/recipes-core/images以下にある「image-full.bb」というファイルをエディタで開いて欲しい。次のように手を加えよう。

【リスト】image-full.bbの変更箇所

……中略    # 右辺に0を追加して容量を増やす  IMAGE_ROOTFS_SIZE = "3072000"    EXTRA_IMAGECMD_append_ext2 = " -N 2000"  # 右辺にdev-pkgsを追加  IMAGE_FEATURES += "package-management dev-pkgs"    ……中略    IMAGE_INSTALL += "ppp openssh"  # 以下の1行を加えgccなどを追加する  IMAGE_INSTALL += "autoconf automake binutils binutils-symlinks cpp cpp-symlinks gcc gcc-symlinks g++ g++-symlinks gettext make libstdc++ libstdc++-dev file coreutils"    ……以下略

 変更、追加箇所はコメントに記した通りで、イメージサイズを制限しているIMAGE_ROOTFS_SIZEの右辺を増やし、IMAGE_FEATURESの右辺にdev-pkgsを追加し、IMAGE_INSTALLを1行増やしてパッケージを追加する。これでかなり充実したGalileo用のmicroSDカードイメージが作成できるはずだ。

 以上の改変が終わったらカレントディレクトリを~/Galileo2/meta-clanton_v1.0.1に変更し次のようにコマンドを実行する。

$ cd ~/Galileo2/meta-clanton_v1.0.1  $ ./setup.sh  $ source poky/oe-init-build-env yocto_build  $ bitbake image-full-galileo

 これでビルドが始まるはずである。ビルドにかかる時間はHDDの速度やネットの速度に依存するが、光回線で2GHzクラスのCPUを積んだ標準的なホストPCでも4時間程度はかかるだろう。もっとも、その間は放置して適当にチェックしておけば十分だ。

 なお、ビルドには20GB程度の空き容量も必要だ。HDD/SSDの空き容量に不安がある方ははその点にも注意して欲しい。

microSDカードを作成する

 エラーなくビルドが完了すると~/Galileo2/meta-clanton_v1.0.1/yocto_build/tmp/deploy/images/以下にmicroSDカードに転送するファイル群が生成されている。必要なファイルは次ようなものだ。

・カーネル
bzImage--3.8-r0-clanton-日時.bin
・RAMディスク
core-image-minimal-initramfs-clanton-日時.rootfs.cpio.gz
・ルートファイルシステムイメージ
image-full-galileo-clanton-日時.rootfs.ext3
・GRUB設定ファイル
boot/

 日時部分にはビルドした日時が入っている。RAMディスク、カーネル、ルートファイルシステムイメージはそれぞれファイル名に日時を除く起動用のシンボリックリンクが作成され、実際に使うのはシンボリックリンクの方になる。

 本稿の設定ではルートファイルシステムイメージが3GB程度の大きさになる。そのためmicroSDカードは4GB以上の容量を用意して欲しい。また、microSDカードはFAT32ファイルシステムであらかじめフォーマットしておこう。

 そして、microSDカードを(場合によってはSDカードアダプタを使って)ホストPCに接続する。通常、/dev/sdx(xはaから始まる英字)として認識されるはずだ。間違えると大変なので、microSDカードをホストPCに接続後、ホストPC上でdmesgコマンドを実行してmicroSDカードのデバイスファイルを調べておこう。

$ dmesg | tail    ……中略    [80786.706850] sd 6:0:0:0: Attached scsi generic sg2 type 0  [80787.394439] sd 6:0:0:0: [sdb] 7811072 512-byte logical blocks: (3.99 GB/3.72 GiB)    ……以下略

 この例では/dev/sdbとして認識されていると分かる。FATパーティションは/dev/sdb1なので、次のようにマウントしよう。

$ sudo mount /dev/sdb1 /mnt

 続いて必要なファイルを転送していく。

$ cd ~/Galileo2/meta-clanton_v1.0.1/yocto_build/tmp/deploy/images/  $ sudo cp image-full-galileo-clanton.ext3 /mnt/  $ sudo cp core-image-minimal-initramfs-clanton.cpio.gz /mnt/  $ sudo cp bzImage /mnt/  $ sudo cp -r boot/ /mnt/  $ sync

 以上でファイルの転送は完了だ。アンマウントしてmicroSDカードをホストPCから引き抜こう。

$ sudo umount /mnt

 以上のようにして作成したmicroSDカードをGalileo Gen.2のmicroSDカードスロットに装着しよう。また、念のためFTDI製のシリアルケーブルをGalileoに接続してPC上でシリアルコンソールを開いておくといいだろう。必須ではないが、万が一、起動に失敗した時にはシリアルコンソール側のメッセージで原因が分かるからだ。

 ACアダプタをGalileoに接続するとシリアルコンソールに起動メッセージが流れ、最終的にloginプロンプトが現れるはずだ。途中、いくつかエラーがあると思うが実害はないので気にする必要はない。以上のようにして作成したmicroSDカードにはperlやgccといった開発ツール一式が含まれるので、必要に応じてGalileo側でデーモンやアプリケーションを作成するといったことが可能になり、Galileoの活用の幅が広がるはずだ。

カスタマイズしたmicroSDカードで起動した

 なお、 「image-full-galileo-clanton.ext3」をホストPC上にループバックマウントしchrootすれば、ホストPC上に仮想的にGalileoのLinux環境を立ち上げることができる。これもGalileoの大きな利点の1つだ。PC上でGalileoのmicroSDカードイメージ上にアプリケーションのインストールなどを行なえば、Galileo上よりずっと高速に(快適に)作業が可能になるからだ。

 もちろん、ARMベースのターゲットでも「qemu-arm」を使えば同様のことはできるのだが、ARMベースのターゲットではホストPC上はARMのエミュレーションになるため速度に制限がある。一方、x86アーキテクチャのGalileoはホストPC上でもネイティブの速度で動作するので極めて快適に利用できるわけだ。


 以上、Galileo上のLinuxをカスタマイズする方法を説明してみた。慣れないと少し大変な作業だが、レシピ群は割と分かりやすいので、以上で紹介した以外のカスタマイズも試みてみると面白いのではないかと思う。

 さて、前回、今回とソフトウェア寄りの話が続いたので、次回は少しハード寄りの制作事例を紹介して本講座の締めとする予定だ。

(米田 聡)