OS・実行環境

組み込みLinux

機器向けに構成したLinux。SBCや産業機器で広く使う。

概要

組み込み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 ProjectBuildroot・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が実用的に動作するための目安:

リソース最低限推奨
CPU32bit ARMv7以上(MMU必須)ARM Cortex-A53以上
RAM32MB128MB以上
ストレージ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タイプ用途特徴
ext4eMMC・SDカード汎用、ジャーナリング付き
SquashFS読み取り専用rootfs圧縮率高・書き込み不可
overlayfsSquashFS + 書き込み層rootfsを読み書き可にする組み合わせ
UBIFSNANDフラッシュ直接ウェアレベリング対応
JFFS2NORフラッシュ小〜中規模フラッシュ向け
tmpfsRAM上の一時領域高速・電源断で消える
F2FSeMMC・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が大きく優位です。

項目組み込みLinuxRTOS
リアルタイム保証ソフト(ms〜)ハード(µs〜)
最小RAM32MB〜4KB〜
起動時間数秒〜ms〜
ソフトウェア資産非常に豊富限定的
ネットワーク豊富な実績限定的
セキュリティ機能成熟した機能多数実装に依存

関連用語

参考リンク