クロスターゲットのLinuxブートプロセスをbootchartで描いてみる

# Bootchartとは？
Linux起動時のプロセスを可視化するツール。
initプロセスの代わりにbootchartdを起動すると、定期的に/procを読んで必要な情報を収集する。
収集されたデータは/var/log/bootlog.tgzに保存され、pybootchartguiというツールで下記のようにグラフ化できる。
情報が多すぎないので起動までの流れを把握するのにちょうどいい。

![bootchart.png](http://www.bootchart.org/images/bootchart.png)

基本的にアプリケーション空間だけで完結するので、導入が用意なことがメリット。
一方でデメリットとして、プロファイル間隔をあまり短くするとbootchart自体の処理の影響を及ぼしてしまうこと、procでわかる情報しかとれないことなどがある。
ちなみにデフォルトのプロファイル間隔は200ms(変更可能)。

# 環境
bootchartの実装は[公式](http://www.bootchart.org/)以外にも、軽量化されてbusyboxに組み込まれたものなど、幾つかある。
今回はbusyboxの中のものを使ってみた。

- HostPC
  - Ubuntu 16.04
  - Linux kernel 4.15.0

- qemu
  - 2.5.0
  - target archはarm (32bit)

- buildroot
  - [2018.02.8](https://buildroot.org/downloads/buildroot-2018.02.8.tar.gz)

- busybox
  - 1.27.2
  - buildrootのものそのまま

- bootchart2
  - 0.14.8
  - bootchartのプロファイルソフトはbusyboxを使うが、ビューワは含まれないので、ビューワだけこちらを使う。
  - なお、Ubuntu16.04ではaptでもビューワを入れることができるが、そちらではbusyboxのbootchart結果は対応していないので注意。

# 手順

## 0. ツールインストール

```shell-session
[host (x86_64)]
$ sudo apt install qemu-system-arm

$ wget https://github.com/xrmx/bootchart/releases/download/0.14.8/bootchart2-0.14.8.tar.bz2
$ tar xf bootchart2-0.14.8.tar.bz2
$ cd bootchart2-0.14.8
$ make
```

## 1. 環境構築
```shell-session
[host (x86_64)]
wget https://buildroot.org/downloads/buildroot-2018.02.8.tar.gz
tar xf buildroot-2018.02.8.tar.gz
cd buildroot-2018.02.8/
make qemu_arm_versatile_defconfig                                                                                                                                                                           
make busybox-menuconfig                                                                                                                                                                                     
  -> "Init Utilities" -> "bootchartd" をEnableにする                                                                                                                                                        
  -> "Archival Utilities" -> "Make tar, rpm, modprobe etc understand .gz data" をEnableにする                                                                                                               
BR2_JLEVEL=12 make
```

bootchartdを有効にするだけだと、busyboxが用意してくれるtarがgzをサポートしないためbootlog.tgzの生成に失敗する。
そのため、ここであわせてgzオプションも有効にしておく。


## 2. 起動＆プロファイル

プロファイルを有効にするのはとても簡単で、Linux kernelのbootargに"init=/sbin/bootchartd"を追加するだけで良い。
qemuの場合だとappendオプションに追加する。
実際の組み込みの場合は、bootloaderかdtsあたりに記述することになる。


```shell-session
[host (x86_64)]
$ qemu-system-arm -M versatilepb -kernel output/images/zImage -dtb output/images/versatile-pb.dtb -drive file=output/images/rootfs.ext2,if=scsi -append "root=/dev/sda console=ttyAMA0,115200 init=/sbin/bootchartd" -nographic
```

デフォルトであれば、ユーザ名rootでパスワードなしでログインできる。
/var/log/bootlog.tgzが生成されていれば成功。


```shell-session
[host (x86_64)]
buildroot login: root
# ls /var/log/bootlog.tgz
/var/log/bootlog.tgz
```


## 3. プロファイル結果確認
ゲスト-ホスト間のファイル共有が面倒だったので、ゲストOSを終了して直接ファイルシステムイメージからbootchart.tgzを取り出す。
ここで、buildrootの/var/logは/tmpへのシンボリックリンクなので、そのままではイメージ内に保存されない。
そのため、今回はホームディレクトリに移動してから終了した。

```shell-session
[guest (ARM)]
# cp /var/log/bootchart.tgz ~/
# halt
```

```shell-session
[host (x86_64)]
$ mkdir -p targetroot
$ mount -t ext4 output/images/rootfs.ext2 targetroot
$ bootchart2-0.14.8/pybootchartgui.py targetroot/root/bootlog.tgz
$ eog bootchart.png
```

下記が実際に描かれたグラフ。
ほぼbootchartdしかCPUを使っていないこと、スクリプトの起動順などがひと目でわかる。

![bootchart.png](https://qiita-image-store.s3.amazonaws.com/0/37714/a4f4f821-b658-e4d7-7792-81e031fbcb95.png)



# 参考
[bootchart公式](http://www.bootchart.org/)
[Bootchart (eLinux)](https://elinux.org/Bootchart)
[bootchart2](https://github.com/xrmx/bootchart)
[buildroot公式](https://buildroot.org/)
[Buildroot and QEMU – the quickest receipe for your own Linux](http://pressreset.net/2013/09/buildroot-and-qemu-the-quickest-receipe-for-your-own-linux/)