概要
組み込みLinuxは、組み込み機器向けに構成・最適化したLinuxオペレーティングシステムです。Raspberry Pi・NVIDIA Jetson・産業用SBCなどのMPU(マイクロプロセッサ)搭載ボードで広く使われており、IoTゲートウェイ・産業用HMI・医療機器・ネットワーク機器など多様な分野に普及しています。
汎用Linuxと同じカーネルをベースにしながら、不要なモジュールを省いたり、フラッシュメモリに最適化されたファイルシステムを使ったり、起動を高速化したりと、組み込み用途向けの最適化が施されています。
RTOSと比較すると、ハードリアルタイム保証は難しいものの、豊富なソフトウェア資産(Python・Nodejs・OpenCV・機械学習ライブラリ等)と成熟したネットワークスタックが最大の強みです。
歴史・背景
Linuxは1991年にLinus Torvaldsが公開したフリーのUnixライクOSです。当初はPCのみを対象としていましたが、1990年代後半からARMアーキテクチャへの移植が進み、組み込み機器への適用が始まりました。
2000年代初頭、ルーターや携帯電話へのLinux採用が進みました。2002年頃からLinuxディストリビューション「µClinux」がMMU(メモリ管理ユニット)なしのマイコンでも動作するようになり、組み込み用途が広がりました。
2007年のAndroid登場はLinuxが組み込み・モバイル分野に爆発的に普及するきっかけとなりました。2010年代にはRaspberry Piの登場がホビイスト・教育・プロトタイプ分野での組み込みLinuxの普及を加速させました。
現在ではYocto Project・Buildroot・Debianベースのディストリビューションなど多様なビルド・配布方法が整備され、産業・IoT・エッジAI分野で標準的な選択肢となっています。
技術仕様
組み込みLinuxのソフトウェアスタック
┌──────────────────────────────────────────┐
│ Application(Python / C++ / Node.js等) │
├──────────────────────────────────────────┤
│ Middleware / Libraries(OpenCV, glibc等)│
├──────────────────────────────────────────┤
│ Init System(systemd / BusyBox init) │
├──────────────────────────────────────────┤
│ Shell / Utilities(bash, BusyBox) │
├──────────────────────────────────────────┤
│ Linux Kernel(ドライバ・ネットワーク等) │
├──────────────────────────────────────────┤
│ Device Tree(HW構成定義) │
├──────────────────────────────────────────┤
│ U-Boot(ブートローダー) │
├──────────────────────────────────────────┤
│ Hardware(CPU / RAM / Storage / GPIO等) │
└──────────────────────────────────────────┘
ハードウェア要件
組み込みLinuxが実用的に動作するための目安:
| リソース | 最低限 | 推奨 |
|---|---|---|
| CPU | 32bit ARMv7以上(MMU必須) | ARM Cortex-A53以上 |
| RAM | 32MB | 128MB以上 |
| ストレージ | 16MB(最小ルートFS) | 256MB以上 |
| クロック | 400MHz以上 | 1GHz以上 |
MMUなしでは標準Linuxは動作しません(μClinuxはMMUなしで動作しますが、機能が限定的です)。
起動シーケンス
電源投入
↓
BootROM(SoC内蔵、変更不可)
↓
一次ブートローダー(SPL / TF-A)
↓
U-Boot(または他のブートローダー)
↓
Linuxカーネル(zImage / Image / uImage)
↓
Device Tree Blob(.dtb)ロード
↓
initramfs(初期RAMディスク)
↓
Root Filesystem マウント
↓
Init(systemd / BusyBox init)
↓
各種サービス起動
↓
アプリケーション
ファイルシステムの種類
組み込みLinuxではストレージの特性に合わせてファイルシステムを選択します:
| FSタイプ | 用途 | 特徴 |
|---|---|---|
| ext4 | eMMC・SDカード | 汎用、ジャーナリング付き |
| SquashFS | 読み取り専用rootfs | 圧縮率高・書き込み不可 |
| overlayfs | SquashFS + 書き込み層 | rootfsを読み書き可にする組み合わせ |
| UBIFS | NANDフラッシュ直接 | ウェアレベリング対応 |
| JFFS2 | NORフラッシュ | 小〜中規模フラッシュ向け |
| tmpfs | RAM上の一時領域 | 高速・電源断で消える |
| F2FS | eMMC・UFS | フラッシュ特性最適化 |
動作原理
Linuxカーネルのビルドと設定
組み込み向けにLinuxカーネルを構成する際はmake menuconfigでカーネルオプションを設定します:
# クロスコンパイル環境でのカーネルビルド(ARM64向け)
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig # デフォルト設定を読み込む
make menuconfig # GUIで設定変更(TUI)
make -j$(nproc) Image dtbs modules # ビルド
make INSTALL_MOD_PATH=$SYSROOT modules_install
デバイスツリーによるHW記述
組み込みLinuxはデバイスツリー(.dts)でボードのハードウェア構成をカーネルに伝えます:
/* arch/arm64/boot/dts/myboard.dts(例) */
/ {
model = "My Custom Board";
compatible = "mycompany,myboard";
memory@80000000 {
device_type = "memory";
reg = <0x0 0x80000000 0x0 0x20000000>; /* 512MB */
};
uart0: serial@10000000 {
compatible = "arm,pl011";
reg = <0x0 0x10000000 0x0 0x1000>;
interrupts = <0 5 4>;
clock-frequency = <24000000>;
status = "okay";
};
};
ユーザー空間とカーネル空間
Linuxはユーザー空間とカーネル空間に分離されており、アプリケーションはシステムコール(open, read, write, ioctl等)でカーネル機能にアクセスします:
/* ユーザー空間からGPIOを操作(sysfs経由) */
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);
write(fd, "1", 1); /* GPIOをHighに */
close(fd);
/* より新しい方法:libgpiod使用 */
#include <gpiod.h>
struct gpiod_chip *chip = gpiod_chip_open("/dev/gpiochip0");
struct gpiod_line *line = gpiod_chip_get_line(chip, 17);
gpiod_line_request_output(line, "myapp", 0);
gpiod_line_set_value(line, 1);
用途・ユースケース
IoTゲートウェイ
ゲートウェイはセンサーノードからデータを集約し、クラウドに送信します。組み込みLinuxはMQTT・HTTPS・Node-REDなどのミドルウェアを容易に動かせるため、ゲートウェイ用途に最適です。
産業用HMI(Human-Machine Interface)
タッチパネルディスプレイを持つ操作端末では、Qt・GTK等のGUIフレームワークがLinux上で動作します。組み込みLinuxはOpenGLES対応GPUのドライバも提供されており、リッチなUIが実現できます。
エッジAI・画像処理
NVIDIA JetsonやRaspberry Pi 5では、組み込みLinux上でOpenCV・TensorFlow Lite・ONNXRuntimeが動作します。カメラからのリアルタイム画像認識・異常検知をエッジで行えます。
医療機器・検査装置
FDA承認が必要な医療機器でもLinuxが採用されています。OSの安定性・豊富なドライバ・ネットワーク機能が評価され、デジタルX線・内視鏡・分析装置等で使われています。
ネットワーク機器
OpenWrtはLinuxベースの組み込みルーター向けディストリビューションです。家庭用〜業務用ルーター・スイッチの多くがLinuxで動作しています。
実装・開発のポイント
ディストリビューション選択
| 選択肢 | 特徴 | 向く用途 |
|---|---|---|
| Yocto Project | 完全なカスタムイメージ生成 | 量産品・最適化重視 |
| Buildroot | シンプルで学習しやすい | プロトタイプ〜中規模 |
| Debian/Raspberry Pi OS | ユーザー空間が豊富 | 開発・プロトタイプ |
| OpenWrt | ネットワーク機器特化 | ルーター・ゲートウェイ |
| Android | スマート端末・カーナビ | UI重視のコンシューマ機器 |
ストレージ信頼性の確保
組み込みLinuxで最も注意が必要なのは、電源断によるルートFS破損です:
# /etc/fstab でルートFSを読み取り専用マウント + overlayfs で書き込み
# (A/Bパーティションによる冗長化も有効)
# overlayfs設定例(/etc/fstab)
overlay / overlay lowerdir=/rom,upperdir=/rw/upper,workdir=/rw/work 0 0
セキュアブートとOTA
セキュアブートはU-Bootのベリファイ機能でカーネルイメージの署名検証を行います。OTA(Over-The-Air)更新はmenderやrauc、swupdateなどのフレームワークが널り使われます。
リアルタイム拡張(PREEMPT_RT)
標準LinuxはRTOSほどのリアルタイム性を保証しませんが、CONFIG_PREEMPT_RTパッチを適用することで割り込みレイテンシを大幅に改善できます。数百μs程度の応答が必要な産業用途で使われています。
他技術との比較
組み込みLinux vs RTOS
RTOSとの最大の差はリアルタイム性とリソース消費です。RTOS は µs 単位の決定論的応答が可能なのに対し、組み込みLinuxはms単位が限界です。逆に、ソフトウェア資産・ネットワーク機能・デバッグ容易性では組み込みLinuxが大きく優位です。
| 項目 | 組み込みLinux | RTOS |
|---|---|---|
| リアルタイム保証 | ソフト(ms〜) | ハード(µs〜) |
| 最小RAM | 32MB〜 | 4KB〜 |
| 起動時間 | 数秒〜 | ms〜 |
| ソフトウェア資産 | 非常に豊富 | 限定的 |
| ネットワーク | 豊富な実績 | 限定的 |
| セキュリティ機能 | 成熟した機能多数 | 実装に依存 |