はじめに (対象読者・この記事でわかること)

本記事は、Raspberry Pi に Ubuntu を導入し、標準カーネルでは実現できない機能やパフォーマンス調整を行いたい開発者・エンジニアを対象としています。Linux カーネルの基礎知識があり、Ubuntu のインストール経験がある方なら、この記事を読むことで以下が可能になります。
- Raspberry Pi 用 Ubuntu カーネルのソース取得方法
- カーネル設定を自分好みに変更する手順
- ホスト PC(x86_64)でのクロスコンパイル環境構築と実際のビルド手順
- 生成したカーネルを Pi に適用し、起動確認までの一連の流れ

Raspberry Pi のハードウェア特性を活かしたカスタムカーネルを手軽に作成できるようになることが本記事のゴールです。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。
- Linux カーネルの基本構造とビルドプロセスの概要
- Ubuntu/Debian 系ディストロの apt パッケージ管理
- 基本的なシェル操作(bash)と Git の利用方法
- Raspberry Pi のブートメカニズム(/boot フォルダ構成等)

Ubuntu for Raspberry Pi カーネルカスタマイズ概要

Raspberry Pi 用 Ubuntu は、公式イメージとして提供される ubuntu-22.04-preinstalled 系列に標準カーネルが組み込まれています。このカーネルは汎用的に最適化されていますが、IoT デバイスや組み込みシステムでは、以下のようなカスタマイズが求められることがあります。

  1. 不要なモジュールの除去
    デバイスドライバやファイルシステムサポートが過剰に含まれていると、ブート時間やメモリ使用量が増大します。カーネル設定 (make menuconfig) で不要モジュールを無効化すれば、軽量化が可能です。

  2. リアルタイムパッチの適用
    高精度なタイミング制御が必要な制御系プロジェクトでは、PREEMPT_RT パッチを導入してリアルタイム性能を向上させます。

  3. カスタムデバイスドライバの組み込み
    特定の拡張ボードや独自センサーを使用する場合、ソースコードをカーネルに取り込む必要があります。

  4. セキュリティ強化
    SELinux や AppArmor の設定変更、カーネルハードニングオプションの有効化により、IoT デバイスの攻撃対象範囲を縮小します。

本節では、上記のカスタマイズを行う際にまず行うべき「カーネルソースの取得」と「ビルド環境の準備」について概観し、次節で詳細な手順へと進みます。

Raspberry Pi 用 Ubuntu カーネルのクロスコンパイル手順

以下では、ホスト PC(Ubuntu 22.04 LTS/x86_64)上で Raspberry Pi(Arm64)向けカーネルをクロスコンパイルし、カスタマイズしたイメージを実装するまでのフローをステップごとに解説します。各ステップは実際に手を動かしやすいよう、具体的なコマンド例とポイントを併記しています。

ステップ1:開発環境の準備

  1. 必要パッケージのインストール
    bash sudo apt update sudo apt install -y build-essential git libncurses-dev bc bison flex \ libssl-dev libelf-dev dwarfdump qemu-user-static - build-essential は gcc・make 等の基本ビルドツール。
    - libncurses-devmake menuconfig 用。
    - qemu-user-static は arm64 バイナリのエミュレーションに利用します。

  2. クロスコンパイラツールチェーンの取得
    Raspberry Pi 用に公式が提供している gcc-aarch64-linux-gnu を使用します。
    bash sudo apt install -y gcc-aarch64-linux-gnu 確認: aarch64-linux-gnu-gcc --version が表示されれば OK。

  3. 作業ディレクトリの作成
    bash mkdir -p ~/rpikernel && cd ~/rpikernel

ステップ2:カーネルソースの取得

Ubuntu の公式リポジトリから Raspberry Pi 向けカーネルソースを取得します。

Bash
git clone --depth 1 https://git.launchpad.net/~ubuntu-core-dev/+archive/ubuntu/ubuntu-core-dev/rpi-kernel cd rpi-kernel
  • --depth 1 は最新コミットだけを取得し、ダウンロード量を抑えます。
  • 必要に応じてタグやブランチ(例: ubuntu-22.04)を指定してください。

ステップ3:カーネル設定のカスタマイズ

  1. 現行カーネルの設定をベースにコピー
    bash cp /boot/config-$(uname -r) .config これにより、デフォルト設定が .config としてローカルに展開されます。

  2. menuconfig で設定変更
    bash make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig - 不要モジュールの除外: Device Drivers → Serial drivers から未使用の UART を外す。
    - リアルタイムパッチ: General Setup → Preemptible Kernel (Low-Latency Desktop)Fully Preemptible Kernel (Real-Time) に変更。
    - セキュリティ: Security options → Enable SELinux support を有効化。

変更後は make savedefconfig で最小構成を保存し、後から再利用できるようにしておきます。

ステップ4:クロスコンパイル設定の調整

Ubuntu が提供する scripts/kconfig/ 配下の .config をそのまま使うと、ホスト側の環境変数が混入しビルドエラーになることがあります。以下の環境変数を明示的に指定してください。

Bash
export KERNEL=kernel7l export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- export LLVM=0 # LLVM バックエンドは使用しない

ステップ5:カーネルのビルド

Bash
make -j$(nproc) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ Image.gz dtbs modules
  • Image.gz が圧縮カーネルイメージ、dtbs がデバイスツリーバイナリ、modules がモジュールです。
  • ビルドが成功すると arch/arm64/boot/Image.gzarch/arm64/boot/dts/*.dtb が生成されます。

ステップ6:モジュールのインストールとイメージ作成

  1. ルートファイルシステムにモジュールを展開
    bash mkdir -p ~/rpikernel/modules sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ modules_install INSTALL_MOD_PATH=~/rpikernel/modules
  2. tar でモジュールセットを圧縮
    bash cd ~/rpikernel/modules && sudo tar czf ../modules.tar.gz *

  3. カーネルイメージとデバイスツリーを RPi の /boot 用にコピー
    bash sudo cp arch/arm64/boot/Image.gz /boot/ubuntu-custom/Image.gz sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/ubuntu-custom/ sudo cp modules.tar.gz /boot/ubuntu-custom/

  4. /boot/ubuntu-customconfig.txt(Raspberry Pi のブートローダー設定)を書き換えて、カスタムカーネルを指すようにします。
    ini kernel=ubuntu-custom/Image.gz device_tree=ubuntu-custom/bcm2711-rpi-4-b.dtb

ステップ7:実機での検証

  1. Raspberry Pi の電源を切り、SD カードを取り外す。
  2. 作成したカスタム /boot フォルダが正しく配置されていることを確認し、再度カードを挿入。
  3. 電源を入れ、シリアルコンソールまたは SSH でログインし、カーネルバージョンを確認。
    bash uname -a カスタムバージョン(例: 5.15.0-custom)が表示されれば成功です。

ハマった点やエラー解決

発生した問題 原因 解決策
make: *** No rule to make target 'Image.gz' ARCH が arm64 でない状態でビルドした make ARCH=arm64 ... を必ず指定
fatal error: zlib.h: No such file or directory zlib 開発ヘッダが不足 sudo apt install zlib1g-dev をインストール
modules: command not found make modules_install 前に sudo が抜けている sudo make modules_install … を実行
カスタムカーネルが起動しない config.txtkernel= パスが誤っている 正確に /boot/ubuntu-custom/Image.gz を指定
デバイスツリー不一致でブート失敗 Pi のモデルと dtb が合っていない device_tree=ubuntu-custom/bcm2711-rpi-4-b.dtb(モデルに合わせる)

解決策のポイントまとめ

  • ビルド時の環境変数は必ず明示的に設定し、ホストとターゲットの混同を防ぐこと。
  • make menuconfig での設定変更は、必ず make savedefconfig で保存し、再現性を確保。
  • カスタムイメージとデバイスツリーは、Pi のモデルごとに正しいファイルを使用することがブート成功の鍵。

まとめ

本記事では、Raspberry Pi 用 Ubuntu カーネルをカスタマイズし、ホスト PC でクロスコンパイルする一連の手順を解説しました。

  • 開発環境の構築とクロスコンパイラのインストール
  • 公式リポジトリからのカーネルソース取得と設定変更
  • クロスコンパイル・モジュールインストール・イメージ配置までのフロー

これにより、不要モジュールの削減やリアルタイムパッチ適用、独自ドライバの組み込みといったカスタマイズが可能となり、Raspberry Pi デバイスの性能や安全性を最大限に引き出せます。今後は、コンテナ化や CI/CD パイプラインへの統合、 OTA 更新の自動化など、さらに高度な運用手法についても取り上げていく予定です。

参考資料