Intel GalileoでLinuxを動作させてgccを動かすまでの話

Intel GalileoはArduinoとx86プロセッサが載っている~~ヤバい~~かっこいいボードPCです。Linuxも動きます。


備忘録としてLinux導入からgccのインストールまでを書いておきます。
作業環境ですが、今回はWindows 7で行いましたが、シリアルコンソール（最悪なくても良い）とSSHが各自で用意できる環境なら特に問題無いと思います。
#手順の流れ#

1. Galileoのファームウェアのアップデート
2. microSDカードのフォーマット
3. microSDカードへLinuxイメージをコピー
4. GalileoでmicroSDから起動
5. パッケージマネージャの設定
6. 各パッケージのインストール
7. 動作確認
 
##1. Galileoのファームウェアのアップデート##

GalileoのファームウェアはArduino IDEから行います。
この辺は解説サイトがあったのでそちらを参考に。
GalileoにUSBケーブルを接続する場合、USBケーブルを接続する前にACアダプタを接続して通電させておかないと**Galileoが破損する**可能性があるようです。解説サイトにも記述されてますが念のため。


[Intel Galileo FWアップデート、シリアルコンソール・Ethernetリモート接続](https://galileoq.wordpress.com/2013/11/12/galileo%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%80%81%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%BBethernet%E3%82%B3/)

私はGalileo用のUSB-Serialケーブルがあったのでしませんでしたが、telnetをスケッチから起動してifconfigの結果をシリアルに吐き出させることでIPアドレスを取得できるらしいです。

##2. microSDカードのフォーマット##

FAT32でフォーマットされている必要があります。フォーマットをする場合、Windows標準のフォーマッタでは不具合が出る場合があるため、以下のフォーマッタを使用してください。

[SD/SDHC/SDXC用 SDフォーマッター4.0 - SD Association](https://www.sdcard.org/jp/downloads/formatter_4/)

##3. microSDカードへLinuxイメージをコピー##
Intelの公式サイトでLinuxイメージが配布されています。SD-Card Linux Imageをダウンロードしてください。

[Galileo Software Downloads | Intel Communities](https://communities.intel.com/docs/DOC-22226)

現在のバージョンは1.0.4だったので、ダウンロードしたファイルの名前は`SDCard.1.0.4.tar.bz2`でした


これを展開すると4つのファイルと1つのフォルダが展開されます。

 * boot
 * bzImage
 * core-image-minimal-initramfs-clanton.cpio.gz
 * grub.efi
 * image-full-galileo-clanton.ext3

これをmicroSDのルートディレクトリにコピーします。

##4. GalileoでmicroSDから起動##
用意したmicroSDをGalileoにセットしてUSB-Serialケーブル、LANケーブルを繋ぎます、Tera Termで接続し、ACアダプタを接続します。ボーレートは115200baudです。

Galileo用のUSB-Serialケーブルを初めて使用する場合、ドライバのインストールが必要になります。Windowsの場合、ドライバはIntelの公式サイトで配布しているArduino IDE内の`hardware\arduino\x86\tools`の中にありました。

ACアダプタを接続すると、大量のブートログが流れたあとにログイン画面になります。

```sh
Poky 9.0.2 (Yocto Project 1.4 Reference Distro) 1.4.2 clanton /dev/ttyS1

clanton login:
```

rootでログインできるのでログインします。

microSDからブートしているか確認のために、以下のコマンドを実行します。

```bash
$ ls /media/mmcblk0p1/
boot
bzImage
core-image-minimal-initramfs-clanton.cpio.gz
grub.efi
image-full-galileo-clanton.ext3
```

先ほどmicroSD内にコピーしたファイルのファイル名が出力された場合、microSDから起動できているようです。

##5. パッケージマネージャの設定##
IntelがGalileo用にビルドしたこのLinux（clantonと言うらしいです）はパッケージマネージャにopkgを採用しています。
標準ではopkgのソースリストが空なので、手動で追加してやります。

```bash
$ vi /etc/opkg/base-feeds.conf
```
[Galileo Package Repo Configuration Instructions](http://alextgalileo.altervista.org/package-repo-configuration-instructions.html)より、以下の3行を追加します。

```bash
src/gz all     http://repo.opkg.net/galileo/repo/all
src/gz clanton http://repo.opkg.net/galileo/repo/clanton
src/gz i586    http://repo.opkg.net/galileo/repo/i586
```

ソースリストを反映させます。

```bash
$ opkg update
```

##6. 各パッケージのインストール##
gccをインストールする場合、以下のようなエラーが発生します。

```bash
Collected errors:
 * check_data_file_clashes: Package uclibc wants to install file /lib/libuClibc-0.9.34-git.so
        But that file is already provided by package  * libc0
 * check_data_file_clashes: Package uclibc wants to install file /lib/libc.so.0
        But that file is already provided by package  * libc0
 * check_data_file_clashes: Package uclibc wants to install file /lib/ld-uClibc-0.9.34-git.so
        But that file is already provided by package  * libc0
 * check_data_file_clashes: Package uclibc wants to install file /lib/ld-uClibc.so.0
        But that file is already provided by package  * libc0
 * opkg_install_cmd: Cannot install package gcc.
 ```
 gccのインストールの際にuClibcが同時にインストールされますが、一部のファイルがlibc0によって既に提供されているためuClibcが正常にインストールができずにインストールに失敗します。

その為、まずuClibcを強制的にインストールし、その後gccをインストールします。

```bash
$ opkg install --force-overwrite uclibc
$ opkg install gcc
```

makeとかビルドに必要なパッケージもインストールする場合はこちらで。

```bash
$ opkg install packagegroup-core-buildessential
```


##7. 動作確認##

ほとんどおまけです。

```bash
$ vi hello.c
```

```c:hello.c
#include <stdio.h>
int main(void){
  printf("Hello world!\n");
  return 0;
}
```

```bash
$ gcc hello.c -o hello
$ ./hello
Hello world!
```


##終わりに##
デフォルトでSSHが動作していたので、動作中のGalileoのIPアドレスを取得したらほぼゴールです。

uClibcを使っているため、ある程度大規模なソースコードになるとライブラリが足りないなどでコンパイルに失敗すると思います。
小規模なコードなら今回の方法で良いと思いますが、基本的にクロスコンパイルを行うべきです。