組み込みLinux
組み込みLinux(くみこみリナックス、Embedded Linux)は、組み込みシステムに特化したLinuxカーネルやLinuxオペレーティングシステム、またはそれら搭載する組み込み機器を指す用語である。携帯電話や携帯情報端末、メディアプレイヤーなどの家電機器、ネットワーク機器、ファクトリーオートメーション装置、カーナビ、医療機器など様々な組み込みシステムにて利用されている。米VDC (Venture Development Corporation) の2008年における調査によると、Linux は18%の組み込みエンジニアが使用しているとされる。
デスクトップおよびサーバなどの汎用的なシステムと異なり、組み込みシステムではリソースが制限されており、例えばRAMや二次記憶装置の容量が小さい。組み込みLinuxを使った機器は、二次記憶装置としてハードディスクドライブの代わりにより小さいフラッシュメモリを使うことが多い。組み込みLinuxはアプリケーションや対象ハードウェアに必要な機能に特化されていることが多く、Linuxカーネルもそのアプリケーションに対し最適化し構成されている。最適化の具体的な例は、OSのリアルタイムオペレーティングシステム化などである。
一般的にLinuxは移植性にすぐれるシステムであると言われており、デスクトップコンピュータやサーバにあまり採用されていないコンピュータ・アーキテクチャにも移植されている。その中には組み込みシステムも含まれている。
組み込みシステムへのオペレーティングシステムの移植にはプロプライエタリなアセンブラやCコンパイラ、標準Cライブラリを利用するケースもあるが、それらと比較して、OS自体のソースコードを修正して再配布でき、ロイヤルティーやライセンス料が発生しないといったフリーソフトウェア/オープンソースソフトウェアとしての特徴だけではなく技術的な優位点もあり、使用メモリ量が比較的少なく(2MB以下のメモリで起動可能)、安定した動作、比較的サポートベースが大きい、などの利点がある。組み込みLinuxは、Linuxカーネルに少数のフリーソフトウェアを組み合わせたものである。標準Cライブラリにはglibcの代わりに、もっとリソース消費量の少ない dietlibc、uClibc、Newlibが採用される場合もある。
2006年05月、Linuxカーネル開発者のグレッグ・クロー=ハートマンによりLinuxのドライバ開発キットがリリースされた。また、Linux Foundation(以前はOSDL)によって開発のトレーニング講座や無料のウェビナーが開かれている。
組み込みLinuxに使われるオープンソースのミドルウェアとしては、BusyBoxなどのオールインワンなものや、SambaやWebKit、FreeTypeなどのプロプライエタリな代替が少なくかつ重要なものも多い。また、MaemoやMoblin、Androidのようにミドルウェアの大部分をオープンソースで改めて開発するものや、Palm WebOSのようにミドルウェアの多数の部分にオープンソースソフトウェアを組み合わせて使うものもある。マルチメディアに関してはオープンソースで扱う場合、GStreamer経由でハードウェアデコーダとFFmpegをバックエンドにして使われることが多いが、AndroidにおいてはOpenCoreが使われている。
開発環境としてはEclipseか、商用製品が使われることが多い。Eclipseでは組み込みにおいて以下のプラグインが使われる。
Eclipse C/C++ Development Tooling (CDT) - EclipseでのCやC++の開発に必須
Target Management (RSE)
Linux Tools Project - プロファイラや動的解析などの機能を統合
Tools for mobile Linux (TmL)
EGit - バージョン管理システムの一つ、Gitの統合
Mylyn - バグトラッカの統合
また、EclipseにはMoblin Eclipse Plug-inやAndroid Development Tools (ADT) など特定のOSに特化したプラグインも存在する。
また、開発にはエミュレータのQemuや分散コンパイルの為のdistccやiceccなども使われる。
Gartnerのプレスリリースによると、2008年のLinuxのシェアは8.1%としている。AdMobのレポートによると、全世界のモバイルデバイスにおいてLinuxカーネルを採用しているOSであるAndroidとPalm WebOSを合わせたシェアは2009年8月時点で11%であり、2009年2月の2%と比べ9%伸びている。また、AdMobの2010年2月のレポートによると、スマートフォンにおけるAndroidのシェアは24%に達し、2位になったとしている。
日本では、NTTドコモの制定したMOAP(L)及びALPベースのFOMA端末用オペレータパックに使われている。
日本では、ネットワーク接続可能なハイエンド機種のテレビにはほぼLinuxが搭載されている。
ゲームコンソール(コンシューマーゲーム)において、Linuxが使われる例は少ない。
PS2においては、PS2 Linuxがハード込みで発売された。また、PlayStation BB UnitにはLinuxが使われている。PS3においてはLinuxがインストールできることを売りにしていたが、新型を出した際にオミットされた。また、旧型PS3においてもファームウェア更新によって無効化された。
近年ではスマートフォンのゲーム市場が活性化されており、Androidでのゲーム市場も急速に成長している。そのためXperia PlayやODROIDのようなAndroidを使った携帯ゲーム端末が出始めている。
その他、直接組み込みLinuxが使われているコンソールとしては、GP2X/GP2X WizやLeapFrog Didj、Pandora、EVO Smart Consoleなどがある。
以下は、組み込み機器に特化したLinuxカーネルの機能である。"CONFIG_*"という表記はカーネルコンフィグレーションであり、コンパイルする際に機能を有効化するための識別子となる。Linuxカーネルはモノリシックであるため、カーネルコンパイル時に必要とする機能を有効化する。
MMU (メモリ管理ユニット)の無いCPUでも動作可能 (CONFIG_MMU=n)
XIP (Execute in place)
読み出し専用ファイルシステム (romfs、cramfsやSquashFSなど)
サイズを削ることができる (Linux Tinyなど)
シングルプロセッサに最適化可能 (CONFIG_SMP=n)
メモリ内圧縮スワップによるメモリの有効活用 (ramzswap(compcache))
NAND型フラッシュメモリを直接使用可能 (JFFS2やUBIFS)
マウントの早いファイルシステム (YAFFS2など)
ソフトリアルタイム (CONFIG_PREEMPT)
ハードリアルタイム (CONFIG_PREEMPT_RT patch set)
ユーザーアプリケーションのリソース制限 (rlimit, cgroupsなど)
サンドボックス (seccomp)
コンテナ (LXC)
リブート不要なセキュリティパッチ (Ksplice)
なお、AMP (非対称型マルチプロセッシング) にはまだ対応していない。RenesasとTIはそれぞれ異なったVirtioベースの仕組みを提案している。
TCPスタック、LANスタック、Wifiスタック、Bluetoothスタック、USBスタックなどの各種プロトコルスタックが揃っている
Linuxカーネルはアーキテクチャー毎に開発されているのではなく、デスクトップ、サーバー、組み込み、メインフレームに関わりなく、共通のソースベースで開発されており、アーキテクチャー相互のソースレベルでの互換性は高い
GCC、GNU Binutilsを利用してクロスビルドツール(クロスコンパイラ、クロスリンカなど)を用意することもでき、ビルドまではPC上ですべての開発が可能
カーネルがモジュール化されているため、再起動なくモジュールの開発が可能(ローダブル・カーネル・モジュール)
NFSが使えるため、ファイル転送が容易
tftpbootが使えるため、カーネル切り替えが容易
gdbserverが使えるため、リモートデバッグが容易に可能
機能が豊富、設定も柔軟(反面、複雑ともいえる)
カーネルのコンパイルオプション(.config)には汎用OS向けのものも含まれる(共通のソースベースを利用しているため)
カーネルのコンパイルオプション(.config)には組み込み向けの設定も多いが、その多くが何らかの資源や機能とのトレードオフであるため、知識が必要になる。
カーネル全体の状態の取得・動的な調整が可能 (/sys/以下, /proc/sys/ 以下, sysctlなどでチューニング可能)
プロセス毎の状態の取得・動的な調整が可能 (/proc/プロセス番号/ 以下, rlimitなど)
動作中のカーネルから別カーネルへ再起動をかけず瞬時に切り替え可能 (コールドブート機能。kexec)
自由に改良することができる(それぞれソフトウェアライセンスにより条件や義務が異なるが、少なくとも改変や再頒布に関してはロイヤルティー・フリーで自由に可能である)
世界中の企業・団体・個人・政府機関による持続的な開発が行われている
脆弱性も調べられているため、セキュリティが高い
サポート企業・団体が複数ある
LinuxカーネルなどはGPLでライセンスされているため、機器の販売など配布を伴う場合はソースコードの開示が必要となる(しかし配布を伴わないケース、例えば「自組織内で私的に流用するのみ」ならばソースコードを一切開示する必要はない)。
ソースコードの提供によりOSSコミュニティにコードが還元され、ソフトウェアの機能向上につながり、結果として自社製品の機能強化につながる可能性もある。
デバッグ/プロファイリングの仕組みが豊富
カーネルのロック依存性動的チェック (lockdep (CONFIG_LOCKDEP_SUPPORT。標準で有効))
カーネルのデバッグログの個別動的有効無効切り替え (ddebug (dynamic debug。CONFIG_DYNAMIC_DEBUG))
カーネル用のデバッガ (KDB, KGDB, KGTP(パッチ))
カーネルプローブ(kprobe, jprobes, SystemTap)
ユーザー空間プローブ (uprobes (パッチ))
カーネル内イベントトレーサ (ftrace event tracer, kprobe-based event tracer, GDB tracepoint support(パッチ), trace-cmd, KernelShark)
システムコールトレーサ (strace)
プロセストレーサ (ptrace, utrace)
共有ライブラリトレーサ (ltrace)
ユーザランド用デバッガ (GDB)
プロファイリング (gcov (カーネルではGCOV_KERNEL), OProfile, perf tools)
ロック競合のチェック (lock_stat, perf lock)
各種ベンチマーク (perf bench, ffsbなど)
ハードウェアによって生まれるレイテンシの検出 (Hardware Latency Detector (rtパッチ))
モニタリング (top, htop, iotop, slabtop, xrestop, latencytop, powertop, apachetopなど)
動的カーネル内メモリ管理バグチェッカ (Kmemcheck, Kmemleak)
動的メモリ管理・スレッドバグチェッカ (Valgrind (UserModeLinux+パッチを使うことでカーネルのチェックも可能))
静的解析 (Clang Static Analyzer, Smatch, Coccinelle)
ロギング (MRTG, Nagios, Xymon, Zabbix, Hinemos, Cacti, Muninなど)
リモート管理 (OpenSSH, adb, screen)
リアルタイムな用途では、スループットよりもレイテンシが重要となることが多い。レイテンシを改善するためには、カーネルの設定変更・チューニングの他に、アプリケーション自身も最適化する必要がある。カーネルのレイテンシを測定するためにCyclictestなどのベンチマークや各種トレーサが使われる。Linuxにおけるリアルタイム全般の情報は Real-Time Linux Wiki にまとめられている。ELCヨーロッパ2008においてソニーのFrank Rowandによりターゲットへのレイテンシ最適化の実例がプレゼンテーションされている。また、同氏によってハードウェア/カーネルに付随するリアルタイムの不足点と改善案が提示されている。
かつてのLinuxカーネルはリアルタイム性能が悪かったため、高機能なLinuxカーネルをリアルタイム用途とともに使うために、Linuxカーネルよりも下にリアルタイム性能が高くリアルタイムタスクを実行可能な別のシンプルなカーネルが使われることが多かった。現在はMontaVista、レッドハットなどによりプリエンプション用のパッチセットRT PREEMPTが開発されLinuxカーネルのリアルタイム性能は大きく改善しているものの、他のカーネルとの組み合わせは現在も使われている。
また、Linuxカーネルにはバージョン2.0時点で導入された、アトミックな単一カーネルロックのBKL (Big Kernel Lock)が以前存在していたが、レイテンシ・スループットやスケーラビリティを大きく下げる原因となるため、現在はロックの細分化やロックレス・アルゴリズムへの置き換えなどによって、全てのBKLが削除されている。
現在、RT PREEMPTは"mainline"と呼ばれるリーナス・トーバルズ管理の主要カーネルツリーへのマージを目指している。標準やPREEMPTで有効になった機能の他にCONFIG_PREEMPT_RCUやthreadirqsなど多くの部分が既にマージされているが、まだマージされていないフィーチャーは残っている。
RTAI (Adeos+Linux)
RTLinux (Realtime executive+Linux)
Linux on ITRON (ITRON+Linux)
T-Linux (T-Engine+Linux)
L4-Linux (L4+Linux)
Litron (TOPPERS/JSPカーネル+Linux)
Wind River Real-Time Core for Linux (Real-Time Core+Linux)
1997年より通商産業省工業技術院電子技術総合研究所(現:産業技術総合研究所)にて開発されている。2009年にLinux バージョン2.6用に更新したものがソースコード、バイナリ含め一般公開された。
Linuxの組み込み用途での使用を推進する業界団体がいくつか結成されている。
2000年7月に結成された Emblix は日本における組み込みLinuxの普及とその周辺技術の標準化を目的としている。プロセスをグループ化しCPUのリソースを制限するCABIが開発されたが、現在はプロセス集約機能cgroupsに取って代わられている。
2003年に結成された CE Linux Forum はLinuxカーネル本体に組み込み用機能を含めることを目的としている。2010年10月、メンバーの重複が多いことや活動目的の一致、組み込みLinuxに関わる企業や開発者の増加からLinux Foundationと合併し、従来の活動の継続の他、組み込みLinuxの開発プロセスを容易にするためにYocto Projectという技術ワークグループを開始した。
Linuxに関する統括的団体であるLinux Foundationも組み込みLinuxを推進している。2005年にLinux Foundationに合流した Embedded Linux Consortium (2000年3月結成) には、IBM、インテル、LynuxWorks などが参加し、APIの標準化を行っていた。そこで作成された ELCPS (Embedded Linux Consortium Platform Specification) は、組み込みLinuxを使った機器の開発において、アプリケーションの移植性を有する標準プラットフォームとしてどのような機能を含めるべきかのガイドとなっている。
2004年に結成された Linux Phone Standard Forum はLinuxを使った携帯電話でのアプリケーション環境の標準化を目的としている。
2006年に結成された LiMo Foundation は、サードパーティのLinuxベース携帯電話向けアプリケーション開発のための標準インタフェースの確立を目的としている(設立時メンバーは、モトローラ、NEC、パナソニック、サムスン電子、NTTドコモ、ボーダフォン)。
2007年に結成された Open Handset Alliance は、Androidの開発推進を目的としている。
2009年に日本で結成された Open Embedded Software Foundation は、Androidに関わる企業間の協力を目的としている。また、できる限りAndroidと同じApatche 2.0ライセンスで、最小構成のAndroid (Light Weight Android)やデジタルテレビ拡張 (Digital TV Extension)、各種スタックなどの開発を予定している。2010年3月にEmbedded Masterをリリースした。これはAndroid 1.6をベースにSIP/RTPスタックやBluetoothのHID/SPP/OBEXプロファイルへの対応、リモコン対応、ポインティング対応、GUI用APIなどを追加したものである。
2010年に結成された Linaro は、六ヶ月毎に参加企業の各SoCに最適化されたツール・カーネル・ミドルウェアを提供することなどを目的とした非営利のイギリス企業である(設立時のメンバーはARM、サムスン電子、IBM、Freescale、ST-Ericsson、Texas Instruments)。
モトローラ:
RAZR² V8, RAZR² V9, ROKR E2, ROKR E6, A780, E680, A910, A1200, U9, E8 (MontaVistaなどがベース)
DROID, Motorola Milestone (Androidベース)
First International Computer: Neo 1973 (OpenMoko)
Google: Android Dev Phone, Nexus One (Androidベース)
パナソニックモバイルコミュニケーションズ:
FOMA P702iD,P901iTV,P902iS,P903i, P901i (MOAP(L)ベース)
P-02B (FOMA端末用オペレータパックベース)
NEC:
FOMA N900iL, N901iC, N902iL, N902iL onefone, N902iX, N903i, N904i, N905i, N905iμ, N906i, N906iμ (MOAP(L)ベース)
FOMA N601i, N702iS, N703iD, N703iμ, N704iμ, N705i, N705i, N706i, N706ie (MOAP(L)ベース)
N-01A, N-02A, N-03A, N-04A, N-06A, N-07A, N-08A, N-09A (MOAP(L)ベース)
N-01B, N-02B (FOMA端末用オペレータパックベース)
HTC Nippon: HT-03A, X06HT(HTC Desire) (Androidベース)
T-Mobile: T-Mobile G1 (Androidベース)
Palm: Palm Pre, Palm Pixi (Palm WebOS)
ノキア: N900 (Maemo)
ソニー・エリクソン:
SO705i, SO706i (MOAP(L)ベース)
Xperia SO-01B (Androidベース)
シャープ: IS01 (Androidベース)
Emblaze Mobile: ELSE (ELSE INTUITIONベース)
京セラ: Kyocera Zio M6000 Android (Androidベース)
SMC Networks: SMC WSKP100
ノキア: Nokia 770 Internet Tablet, N810, N800 (Maemo)
シャープ:
SL-B500, SL-C700 (Embedixベース)
SL-C750, SL-C760, SL-C860 (OpenPDAベース)
SL-C3000, SL-C1000, SL-C3100, SL-C3200  (Lineo uLinuxベース)
PC-Z1, PC-T1 (Ubuntuベース)
TH-36D30T, TH-32D30T, TY-S36D50, TY-S32D50, TY-S28D50, TH-36D60, TH-32D60, TH-32D55, TH-28D55
DMR-E700BD
Wooo 9000シリーズ, W50P-HR10000, W37L-HR9000など
CoCoon Channel Server (MontaVistaベース)
東芝(現TVS REGZA)
レグザ(Android TV搭載モデル除く)
People of Lava:Scandinavia (Androidベース)
シャープ: ガリレオ (HG-01S, HG-02S) (axLinuxベース)
玄人志向:
玄箱 (EMモードはMontaVistaベース・他のOSをインストール可能)
玄柴 (Ubuntuベース・他のOSもインストール可能)
ぷらっとホーム: OpenBlockS, OpenBlockS S, OpenBlockS R, OpenBlockS 266, OpenBlockS 600
マーベル: SheevaPlug, Plug Computer 3.0, GuruPlug (Ubuntuベース・他のOSもインストール可能)
アイ・オー・データ機器:
LANDISKシリーズ (Debian(など?)ベース)
USL-5Pシリーズ
BUFFALO:
LinkStationシリーズ (MontaVista(など?)ベース)
NETGEAR: ReadyNAS DUO, ReadyNAS NV+など  (Debianベース)
ソニー: サイバーショット DSC-T100, DSC-T20, DSC-G1, DSC-G3, DSC-H7, DSC-W80, DSC-W80HDPR, DSC-W200, DSC-H3, DSC-H10, DSC-H50, DSC-T200, DSC-T70, DSC-T2, DSC-TX1, DSC-WX1, DSC-W110, DSC-W120, DSC-W170, DSC-W220, DSC-T900, DSC-T90, DSC-W270, DSC-HX1, DSC-W300, DSC-T300, DSC-T700, DSC-T77など
オリンパス: ORPHIS HC5500シリーズ
アルゴシステム: Algo Smart Panelシリーズ
NTT東日本: 光iフレーム (Androidベース)
Camangi: Camangi WebStation (Androidベース)
NEC: コミュニケーター (Androidベース)
バッファロー:
AS-A100 (DD-WRTベース)
WBR-B11, WBR-G54, WLA-G54, WLA-G54C, BLR-TX4S
WLAH-G54, WLAH-A54G54
BHR-4RV, FS-G54, WBR2-B11, WBR2-G54, WHR2-A54G54, WHR2-G54, WHR2-G54V, WHR3-AG54, WLA2-G54, WLA2-G54C, WLI-TX4-G54HP, WLI2-TX1-AG54, WLI2-TX1-AMG54, WLI2-TX1-G54, WLI3-TX1-G54, WLI3-TX1-AMG54, WZR-G108, WZR-G54, WZR-HP-G54, WZR-RS-G54, WZR-RS-G54HP
WER-A54G54, WER-AG54, WER-AM54G54, WER-AMG54, WHR-HP-AMPG
WHR-G54S, WHR-HP-G54, WHR-AMG54, WHR-AM54G54, WLI3-TX1-G54 WLI3-TX1-AMG54, WLI-TX4-G54HP, WLI-TX4-AMG54, WRP-AMG54
WHR-G, WHR-G125
WHR-HP-G
WZR-AMPG144NH, WZR-AMPG300NH, WZR-AG300NH
WLI-TX4-AG300N
WZR-AGL300NH
WZR2-G300N
WZR-HP-G300NH
リンクシス: WRT54G
プラネックス: BRC-W14V, BRC-14V, BRC-W14VG, BRC-14VG, BRC-W14VG-BT, BRC-14VG-BT
パナソニック: broadband terminal
LASER5: L-Router
ケンウッド: HD20GA7, HD30GA9, HD30GB9
ターボリナックス: wizpy (wizpy OS)
ヤマハ: MOTIF XS, MOTIF-RACK XS (MontaVistaベース)
ソニー:  NV-XYZ 33, 55, 77など
Jokerworks: ジョーカーレーサー R/C サーバー
Parrot: AR.Drone - ラジコンヘリコプター
産業技術総合研究所ほか: HRP-2m Choromet, HRP-4C (ART Linux)
富士通: HOAP-1, HOAP-2, HOAP-3 (RT-Linux)
富士ソフト: PALRO (Ubuntu)
第一興商:
DAM-DSII (MontaVistaベース)
Steam Deck (SteamOS)
フィリップス: LPC3180
LASER5: L-CardA, L-Card+, NPA1000, L-Board
ACCESS (ACCESS Linux Platform)
LynuxWorks (LynuxWorks Linux)
MontaVistaソフトウェア (MontaVista Linux)
TimeSys (TimeSys Linux)
ウインドリバー・システムズ (Wind River Linux)
コンカレント・コンピュータ (RedHawk Linux)
アックス (axLinuxなど)
シリコンリナックス (シリコンリナックスOS)
リネオソリューションズ (Lineo uLinux)
アドソル日進 (BlueCat Linux)
エニア (Enea Linux)
Linux Driver Project - NDAありなしに関わらず無料でドライバ開発を行っている
シャープビジネスコンピュータソフトウェア - シャープのガリレオシリーズのソフトウェアを作成
Qt Extended - モバイル機器向けアプリケーションプラットフォーム
Openmoko - 携帯電話向けプラットフォーム
MeeGo - Linux Foundationが統括する種々デバイス向けのプラットフォーム。現在はインテルとノキアが主導している。MaemoとMoblinを統合して作られた。
Maemo - ノキア主導のハンドヘルドコンピュータ向けプラットフォーム
Hildon - Maemoのアプリケーションプラットフォーム