組み込みLinuxシステムとは

3.1. Linuxシステムとは

Linuxは、1991年にLinus Torvalds氏が公開したOS(オペレーティングシステム)です。 当初はインテルx86アーキテクチャのPC向けの、わずか1万行程度のソースコードによって記述された小さなOSでした。 しかしその後Linuxは驚異的な進化を遂げ、今日ではx86以外にもARM、PowerPC、MIPS 、SuperHなど様々なアーキテクチャのコンピューターで動作するようになり、組み込みシステムからPC、サーバー、スーパーコンピューターまで幅広い用途で使用されています。

厳密にいうと、LinuxとはCPU、メモリ、タイマーなどのリソース管理、プロセス管理、デバイス制御などをおこなうOSの中心となる部分(これをカーネルと呼びます)だけを指します。 一つのシステムとして動作するには、アプリケーションプログラムや各種ライブラリなど(これらをユーザーランドと呼びます)が別途必要です。 こうしたことから本書では、カーネル部分だけを指す場合はLinuxカーネル、ユーザーランドも含めたシステム全体を指す場合はLinuxシステムと呼びます。

Linux システムアーキテクチャ

図3.1 Linuxシステムアーキテクチャ


Linuxカーネルの大きな特徴として、UNIXライクであることと、オープンソースであることが挙げられます。

UNIXは、AT&Tのベル研究所で開発されたOSです。 UNIXは当時のOSとしては先進的であったマルチユーザー、マルチタスクという特長を持っており、多くの分野で使用されてきました。 そして、広く普及した分だけ様々な派生バージョンが発生することになります。 その結果として標準化作業が必要となり、POSIX(Portable Operating System Interface)が制定されました。 こうした背景から、UNIXライクなOSとは「POSIXに沿うよう開発されているOS」を指します[6]

オープンソースとは、ソフトウェアのソースコードがすべて公開されており、誰でも利用、改変、再配布できることを意味します。 Linuxカーネルでは、このオープンソースという特徴を維持するために、ソースコードのライセンスとして GPL v2(General Public License version 2)を適用しています。 GPL v2 が適用されたソフトウェアでは、ソースコードの改変を自由に行える代わりに、改変したソフトウェアを配布する際には、改変部分を含むソースコードを公開する義務があります。 なお、GPLではソースコードの公開義務は生じますが、そのソフトウェアを商業利用することは禁じていません。 GPLに関する詳細な説明は、GNU 一般公衆利用許諾契約書(GNU General Public License)[7]を参照してください。

[注記]GNU/Linux

Linuxシステムでは、ユーザーランドで動作する基本的なソフトウェアの多くをGNUプロジェクトの成果物で構成することが一般的です[8]。 そのため、GNUプロジェクトの成果物を使ったLinuxシステムを、GNU/Linuxと表記することがあります。

GNUプロジェクトは、フリーソフトウェアという考え方のもとに、GPLを適用したソフトウェアだけでの UNIX互換のオペレーティングシステムと開発環境の構築を目指し開始されたプロジェクトです。 GNUプロジェクトについては、The GNU Operating System[9]を参照してください。

Linuxシステムでは、GNUソフトウェアを始めとしたフリー/オープンソースソフトウェアや、プロプライエタリなソフトウェア[10]など、多くのソフトウェアを使用してシステムを構築します。 しかしながら、これらを一つ一つ自分で組み合わせて目的に適合する安定したシステムとするのは大変な労力を必要とします。 そこで、カーネルを始め、様々なツールやアプリケーション、ライブラリなどシステムを構成するのに必要なものすべてを収めたディストリビューションというものが存在します。

PCやサーバー用途向けのディストリビューションとして主なものを下記に示します。 現在主流のディストリビューションは、GUI によるインストーラで簡単にインストールでき、コンパイル済みのソフトウェアをパッケージという単位でインストール/アンインストールできるなど、複雑な Linuxシステムを簡単に扱えるよう工夫されています。 ここに挙げたもの以外にも多くのディストリビューションがあり[11]、様々な用途に使われています。

  • Debian GNU/Linux

    コミュニティによって開発、サポートされているディストリビューションです。 フリーなソフトウェアだけで構成されています。 ソフトウェアの管理はDebianパッケージと呼ばれるパッケージ単位で行われます。 2019年2月現在の安定版である Debian GNU/Linux 9(コードネーム stretch)では、2017年の初版リリース時点で51,000以上のパッケージが用意されています。

  • Ubuntu Linux

    Debian GNU/Linuxから派生したディストリビューションです。 Canonical社がバックアップしており、コンシューマ市場での使いやすさを重視しています。 近年では、Ubuntu LinuxをプリインストールしたPCを販売するメーカーも出現してきています。

  • Fedora

    開発が終了したRed Hat Linuxの後継として、コミュニティベースで開発、サポートされているディストリビューションです。 RPMと呼ばれるパッケージ管理システムを使用します。

  • Red Hat Enterprise Linux

    Red Hat社が提供するエンタープライズサーバー向け商用ディストリビューション[12]です。 Fedoraの成果を活用して開発されています。

  • openSUSE

    Novell社によって支援されたコミュニティにより開発されている、ディストリビューションです。 以前は SUSE Linuxと呼ばれていました。 技術者以外の一般のユーザーにとっての使いやすさを重視しており、RPMと呼ばれるパッケージでソフトウェアの管理を行います。

  • SUSE Linux Enterprise

    Novell社が提供するエンタープライズサーバー向け商用ディストリビューションです。 openSUSEを基にして開発されています。

  • Gentoo Linux

    コミュニティにより開発、サポートされているディストリビューションです。 使いやすさよりも最適化や自由度を重視しており、ソースコードベースでソフトウェアを管理するのが特徴です。

3.2. 組み込みLinuxシステムとは

PCやサーバーで使用される普通のLinuxシステムと、組み込みLinuxシステムでは、同じソースコードをベースとしたカーネルを使用するという意味では変わりありません。 しかしながら、PCはIntelのx86系アーキテクチャで動作するのに対して、組み込みではARM、MIPS、PowerPC、SuperHなどのアーキテクチャが採用されることが多く、デバイスドライバなどのプロセッサ依存部分は普通のLinuxとは異なります。 また、組み込みシステムでは特有の機能が必要になることが一般的ですので、組み込みシステム用のカーネルではボードごとに修正を加える必要があります。

組み込みLinuxではボード固有の部分には修正が必要になるというものの、ユーザーランドで動作するアプリケーション、及びカーネルとのインターフェースであるシステムコールに関しては、普通のLinuxシステムとの違いはありません。 そのため、普通のLinuxシステム上で動作するソフトウェアは、一部の例外を除いて組み込みLinuxシステム上でも動作します[13]

PCやサーバーと比較すると、組み込みシステムではCPUクロックが低い場合や、ストレージ容量、メモリ容量などのリソースが少ない場合が多く[14]、また、PCやサーバーに比べると過酷な環境で使用される場合があります。 そのため、組み込みLinuxシステム向けにソフトウェアを作成する場合は、メモリ不足やストレージへの書き込みエラーが発生した場合の対処などに関して、より慎重な姿勢が必要になります。

組み込みLinuxで特に注意を要する事項として、ライセンスの問題があります。 Linuxシステムでは、様々なライセンスが適用されたソフトウェアを組み合わせて使用することになります。 前章でも説明したとおり、GPLが適用されるソフトウェアを機器に組み込んで出荷する場合は、該当ソフトウェアに関するソースコードも機器に添付しなければなりません[15]。 もちろん、ライセンスによってはソースコードの公開が義務付けられていないものもありますので、そのようなライセンスを持つソフトウェアやその派生物については非公開としても問題ありません。

自分で作成したアプリケーションプログラムは、基本的にはソースコード公開の義務はありません。 ただし、GPLが適用されたライブラリをアプリケーションプログラムから使用する場合は、アプリケーションプログラムまでGPLが伝搬します。 そのため、作成したアプリケーションプログラムを第三者へ配布する場合は、ソースコード公開の義務が生じます[16]。 アプリケーションプログラムを作成する際には、利用するライブラリのライセンスも注意深く確認する必要があります。

普通のLinuxシステム向けのディストリビューションとして、Debian GNU/LinuxやFedoraがあったように、組み込み向けのディストリビューションも存在します。 組み込み向けのディストリビューションは、開発フレームワークとしての側面も持ち合わせており、「開発ディストリビューション」と呼ぶこともあります。

組み込み向けの開発ディストリビューションとしては、uClinux-distやOpenWRTなどがあります。

uCLinux-distは、ソースコードベースの開発ディストリビューションです。 当初はMMUを搭載していないプロセッサ向けにカスタマイズしたuCLinux用の開発ディストリビューションでしたが、現在ではそのような制限はありません。 Linuxカーネルと、ユーザーランドアプリケーション、ライブラリなどのソースコードを一つのツリーに統合し、それらを一括でビルドできるようになっています。

OpenWRTは、パッケージベースの開発ディストリビューションです。 主に、ルータに採用されています。



[6] LinuxカーネルはPOSIXに沿うように開発されていますが、完全準拠ではないためUNIXの一種であるとはいえません。

[8] 必ずしも、GNUソフトウェアを使わなければならないという意味ではありません。 例えば、近年携帯電話等に採用が進むAndroidの場合、カーネルはLinuxですが、ユーザーランドはApacheライセンスを用いたソフトウェアで構成します。

[10] フリー/オープンソースソフトウェアのようにソースコードが公開されていて、誰でも利用、改変、再配布できるソフトウェアに対して、それらに制限のあるソフトウェアをプロプライエタリ・ソフトウェアと呼びます。

[12] 特定の企業が開発しており、企業によるサポートを受けることができるディストリビューションを、商用ディストリビューションと呼びます。

[13] Linuxの場合多くのソフトウェアがソースコードで提供されるためこのようにいえますが、バイナリしか提供されないものについてはCPUアーキテクチャなどが一致している必要があります。

[14] これは相対的な表現であり、マイコンボードに比べれば豊富なリソースを持っているともいえます。

[15] 厳密には、機器を使用するすべてのユーザーに対してソースコードの入手方法を提供することが条件です。

[16] ライブラリに適用されることが多いLGPL(Lesser GPL)では、ライブラリ利用によってライセンス条件が伝搬しませんので、アプリケーションプログラムのソースコード公開義務は生じません。