ラズパイ用LinuxカーネルをEC2上でビルドしてみた

[メカトラックス社](https://mechatrax.com/)が提供しているLinuxカーネル（以下、メカトラカーネル）をAmazon EC2上でビルドしてみました。メカトラカーネルはRaspbianのLinuxカーネルをベースに作成されていますので、RaspbianのLinuxカーネルをビルドする際の参考にもなるかと思います。

##環境
・AWSマネジメントコンソールへの接続ブラウザはGoogle Chromeを推奨
・EC2のOSはDebian 10 Buster (ARM)を使用
・EC2への接続ツールはAWSのSession Managerを利用。Tera Term等のリモートログオンクライアントは使用しません。

##作業の流れ
1. EC2作成
2. Session ManagerからEC2への接続
3. メカトラカーネルのビルド

##1. EC2の作成
AWSマネジメントコンソールにログインして以下を設定します。
「※」はSession Managerを利用するために必要な設定です。

(1-1) VPCを作成してインターネットゲートウェイをアタッチします。※
(1-2) EC2用のIAMロールを新規作成し、AmazonSSMManagedInstanceCoreポリシーをアタッチします。※
(1-3) 下表のポイントを参考にEC2を作成します。

| EC2設定項目 | 設定値 |
|:--------|:----------|
|AMI|AWS MarketplaceでDebianが提供しているDebian 10 Buster (ARM)を選択|
|インスタンスタイプ|t4g.xlarge を選択。OSがDebian 10 Buster (ARM)の場合に選択可能なインスタンスタイプは t4g、a1、c6g、m6g、r6gのみ(2021年1月時点)|
|VPC|(1-1)で作成したVPCを選択|
|IAMロール|(1-2)で作成したIAMロールを選択|
|自動割り当てパブリックIP※|有効|
|キャパシティーの予約|なし|
|クレジット仕様|無制限のチェックを外す|
|ユーザーデータ※|#!/bin/bash<br>mkdir /tmp/ssm<br>cd /tmp/ssm<br>sudo wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm64/amazon-ssm-agent.deb<br>sudo dpkg -i amazon-ssm-agent.deb<br>sudo systemctl enable amazon-ssm-agent|

##2. Session ManagerからEC2への接続
AWSマネジメントコンソールのSession Managerを利用してEC2へリモート接続します。

(2-1) AWS Systems Managerのセッションマネージャー画面を開き、「セッションの開始」ボタンをクリックします。
(2-2) 作成したEC2を選択し、「セッションを開始する」ボタンをクリックします。
<img width="700" alt="33.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/293d994d-5a95-9219-217d-83a1814cb2f6.png">
(2-3) コンソールが表示されたら接続完了です。※接続ユーザーは ssm-user となります。
<img width="700" alt="34.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/158df281-60fb-34d6-6ac4-a6005f47ad6f.png">

##3. メカトラカーネルのビルド
メカトラカーネルをEC2上にダウンロードしてビルドします。
セッションマネージャ上で以下のコマンドを実行します。

(3-1) ビルドに必要となるLinuxパッケージ、クロスコンパイラをダウンロードします。

```
$ sudo apt update
$ sudo apt install git bc bison flex libssl-dev make crossbuild-essential-armhf
```
(3-2) githubからメカトラカーネルのソースをダウンロードします。

```
$ cd /home/ssm-user
$ git clone --depth=1 https://github.com/mechatrax/linux
```

(3-3) .configファイルを作成し、メカトラカーネルをビルドします。
※ラズパイのモデルによりKERNELの指定方法が異なります。詳細は下記URL参照。
　[https://www.raspberrypi.org/documentation/linux/kernel/building.md](https://www.raspberrypi.org/documentation/linux/kernel/building.md)
※「-j」オプションはジョブの同時実行数です。t4g.xlargeのvCPU数は4なので「-j4」とします。

```
$ cd /home/ssm-user/linux
$ KERNEL=kernel7l
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 zImage modules dtbs
```
t4g.xlargeの場合、ビルドに要した時間は<b>13分44秒</b>でした。

##4. ビルド時間の比較
t4g系（ARMベース）の各インスタンスタイプのビルド時間を比較してみました。
ビルドに要する時間はvCPU数にほぼ反比例する形で短縮されます。~~ビルド時間が1時間未満であれば、~~下表のインスタンスタイプの中ではt4g.mediumが最もコスパが良いです。

|インスタンスタイプ|vCPU数|-jオプション|ビルド時間|AWS利用料※1
|:--------|:----------:|:----------:|:----------:|:----------:|
|t4g.2xlarge|8|8|6:48|0.3456USD
|t4g.xlarge※2|4|4|13:44|0.1728USD
|t4g.large|2|2|27:10|0.0864USD
|t4g.medium|2|2|27:17|0.0432USD
※1) ~~ビルド時間は1時間未満のため、~~AWS利用料はEC2（Linux）の1時間の料金です。Debianは1秒単位での課金になります。
※2) -jオプションを8としてもビルド時間は13分55秒でほぼ同じ。

なお、x86系のt3a.2xlarge（OSはARM版ではないDebian 10 Busterを使用）は、ビルド時間はt4g.xlargeとほぼ同じですが、AWS利用料は2倍となるためt4g系のほうが安価です。

|インスタンスタイプ|vCPU数|-jオプション|ビルド時間|AWS利用料※1
|:--------|:----------:|:----------:|:----------:|:----------:|
|t3a.2xlarge|8|8|13:53|0.3917USD

ちなみに、EC2ではなくRaspberry Pi 3 Model Bでビルドすると2時間2分34秒を要しました。

##5. 最後に
AWS利用料だけを見ると、メカトラカーネルをビルドするだけならt4g.mediumのコスパが良さそうです！