はじめに (対象読者・この記事でわかること)
本記事は、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 デバイスや組み込みシステムでは、以下のようなカスタマイズが求められることがあります。
-
不要なモジュールの除去
デバイスドライバやファイルシステムサポートが過剰に含まれていると、ブート時間やメモリ使用量が増大します。カーネル設定 (make menuconfig) で不要モジュールを無効化すれば、軽量化が可能です。 -
リアルタイムパッチの適用
高精度なタイミング制御が必要な制御系プロジェクトでは、PREEMPT_RT パッチを導入してリアルタイム性能を向上させます。 -
カスタムデバイスドライバの組み込み
特定の拡張ボードや独自センサーを使用する場合、ソースコードをカーネルに取り込む必要があります。 -
セキュリティ強化
SELinux や AppArmor の設定変更、カーネルハードニングオプションの有効化により、IoT デバイスの攻撃対象範囲を縮小します。
本節では、上記のカスタマイズを行う際にまず行うべき「カーネルソースの取得」と「ビルド環境の準備」について概観し、次節で詳細な手順へと進みます。
Raspberry Pi 用 Ubuntu カーネルのクロスコンパイル手順
以下では、ホスト PC(Ubuntu 22.04 LTS/x86_64)上で Raspberry Pi(Arm64)向けカーネルをクロスコンパイルし、カスタマイズしたイメージを実装するまでのフローをステップごとに解説します。各ステップは実際に手を動かしやすいよう、具体的なコマンド例とポイントを併記しています。
ステップ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-devはmake menuconfig用。
-qemu-user-staticは arm64 バイナリのエミュレーションに利用します。 -
クロスコンパイラツールチェーンの取得
Raspberry Pi 用に公式が提供しているgcc-aarch64-linux-gnuを使用します。
bash sudo apt install -y gcc-aarch64-linux-gnu確認:aarch64-linux-gnu-gcc --versionが表示されれば OK。 -
作業ディレクトリの作成
bash mkdir -p ~/rpikernel && cd ~/rpikernel
ステップ2:カーネルソースの取得
Ubuntu の公式リポジトリから Raspberry Pi 向けカーネルソースを取得します。
Bashgit 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:カーネル設定のカスタマイズ
-
現行カーネルの設定をベースにコピー
bash cp /boot/config-$(uname -r) .configこれにより、デフォルト設定が.configとしてローカルに展開されます。 -
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 をそのまま使うと、ホスト側の環境変数が混入しビルドエラーになることがあります。以下の環境変数を明示的に指定してください。
Bashexport KERNEL=kernel7l export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- export LLVM=0 # LLVM バックエンドは使用しない
ステップ5:カーネルのビルド
Bashmake -j$(nproc) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ Image.gz dtbs modules
Image.gzが圧縮カーネルイメージ、dtbsがデバイスツリーバイナリ、modulesがモジュールです。- ビルドが成功すると
arch/arm64/boot/Image.gzとarch/arm64/boot/dts/*.dtbが生成されます。
ステップ6:モジュールのインストールとイメージ作成
- ルートファイルシステムにモジュールを展開
bash mkdir -p ~/rpikernel/modules sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ modules_install INSTALL_MOD_PATH=~/rpikernel/modules -
tarでモジュールセットを圧縮
bash cd ~/rpikernel/modules && sudo tar czf ../modules.tar.gz * -
カーネルイメージとデバイスツリーを 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/ -
/boot/ubuntu-customのconfig.txt(Raspberry Pi のブートローダー設定)を書き換えて、カスタムカーネルを指すようにします。
ini kernel=ubuntu-custom/Image.gz device_tree=ubuntu-custom/bcm2711-rpi-4-b.dtb
ステップ7:実機での検証
- Raspberry Pi の電源を切り、SD カードを取り外す。
- 作成したカスタム
/bootフォルダが正しく配置されていることを確認し、再度カードを挿入。 - 電源を入れ、シリアルコンソールまたは 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.txt の kernel= パスが誤っている |
正確に /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 更新の自動化など、さらに高度な運用手法についても取り上げていく予定です。
参考資料
- Ubuntu Raspberry Pi カーネル公式リポジトリ
- Raspberry Pi Documentation – Bootloader Configuration
- Linux Kernel Cross‑Compilation Guide (Ubuntu)
- PREEMPT_RT Patch Documentation
