それは、デバイスでどのサービスを使いたいかに完全に依存します。
プログラム
Linuxを直接シェルにブートさせることができます。本番環境ではあまり便利ではありません(シェルをそこに配置したいだけです)が、インタラクティブブートローダーがある場合の介入メカニズムとしては便利ですinit=/bin/sh。カーネルコマンドラインに渡します。すべてのLinuxシステム(およびすべてのUNIXシステム)には、Bourne / POSIXスタイルのシェルがあり/bin/shます。
シェルユーティリティのセットが必要です。BusyBoxは非常に一般的な選択肢です。それは、(ファイルとテキスト操作のためのシェルとの共通のユーティリティが含まれているcp、grepセットアップ(ネットワーキング、...、) ping、ifconfig、...)、プロセス操作を(ps、nice(、...)、および様々な他のシステムツールfdisk、mount、syslogd、...)。BusyBoxは非常に柔軟に構成できます。コンパイル時に必要なツールや個々の機能を選択して、アプリケーションに適したサイズ/機能の妥協点を得ることができます。別にsh、あなたが本当にあるなしでは何もできないという最低限mount、umountそしてhalt、また、持っていないように非定型だろうcat、cp、mv、rm、mkdir、rmdir、ps、syncといくつかのより多くの。BusyBoxはbusybox、と呼ばれる単一のバイナリとしてインストールされ、各ユーティリティのシンボリックリンクが含まれます。
通常のUNIXシステムでの最初のプロセスはと呼ばれinitます。その仕事は、他のサービスを開始することです。BusyBoxには初期化システムが含まれています。initバイナリ(通常/sbinはにあります)に加えて、/etc/inittab起動するサービスを示す構成ファイル(通常は呼ばれます-いくつかの最新のinitの置換はそのファイルを廃止しますが、小さな組み込みシステムでは見つかりません)が必要です。そしていつ。BusyBoxの/etc/inittab場合、オプションです。見つからない場合は、コンソールにルートシェル/etc/init.d/rcSが表示され、ブート時にスクリプト(デフォルトの場所)が実行されます。
必要なのはこれだけです。もちろん、デバイスに何か便利なことをさせるプログラムです。たとえば、OpenWrtバリアントを実行している自宅のルーターでは、プログラムはBusyBox nvram(NVRAMの設定を読み取って変更するため)とネットワークユーティリティのみです。
すべての実行可能ファイルが静的にリンクされていない限り、ダイナミックローダー(ld.so、libcの選択とプロセッサアーキテクチャに応じて異なる名前で呼び出される場合があります)およびすべてのダイナミックライブラリ(/lib/lib*.so、おそらくこれらの一部/usr/lib)が必要ですこれらの実行可能ファイル。
ディレクトリ構造
ファイルシステム階層標準は、 Linuxシステムの共通のディレクトリ構造について説明します。デスクトップおよびサーバーへのインストールを対象としています。組み込みシステムでは、その多くを省略できます。これが典型的な最小値です。
/bin:実行可能プログラム(/usr/bin代わりに一部のプログラムが含まれる場合があります)。
/dev:デバイスノード(以下を参照)
/etc:構成ファイル
/lib:ダイナミックローダーを含む共有ライブラリ(すべての実行可能ファイルが静的にリンクされていない場合)
/proc:procファイルシステムのマウントポイント
/sbin:実行可能プログラム。との違い/binは/sbin、システム管理者のみに役立つプログラム向けですが、この区別は組み込みデバイスでは意味がありません。へ/sbinのシンボリックリンクを作成でき/binます。
/mnt:メンテナンス中に読み取り専用ルートファイルシステムをスクラッチマウントポイントとして使用すると便利です
/sys:sysfsファイルシステムのマウントポイント
/tmp:一時ファイルの場所(多くの場合、tmpfsマウント)
/usr:サブディレクトリが含まれているbin、libとsbin。/usrルートファイルシステム上にない余分なファイルのために存在します。持っていない場合は/usr、ルートディレクトリへのシンボリックリンクを作成できます。
デバイスファイル
最小限の典型的なエントリは次の/devとおりです。
console
full (それへの書き込みは、常に「デバイスにスペースが残っていません」と報告します)
log(プログラムがログエントリの送信に使用するソケット)、syslogdデーモン(BusyBoxなど)からの読み取りがある場合
null (常に空のファイルのように動作します)
ptmx擬似端末(つまり、コンソール以外の端末)を使用する場合は、ptsディレクトリ。たとえば、デバイスがネットワーク接続されており、telnetまたはsshで接続する場合
random (ランダムなバイトを返し、ブロッキングのリスクがあります)
tty (常にプログラムの端末を指定します)
urandom (ランダムなバイトを返し、ブロックすることはありませんが、新しく起動したデバイスではランダムではない場合があります)
zero (nullバイトの無限シーケンスを含む)
それを超えると、ハードウェアのエントリが必要になります(ネットワークインターフェイスを除き、これらはエントリを取得しません/dev):シリアルポート、ストレージなど。
組み込みデバイスの場合、通常はルートファイルシステムにデバイスエントリを直接作成します。ハイエンドシステムには、エントリMAKEDEVを作成するために呼び出される/devスクリプトがありますが、組み込みシステムでは、多くの場合、スクリプトはイメージにバンドルされていません。一部のハードウェアをホットプラグできる場合(たとえば、デバイスにUSBホストポートがある場合)、udev/devで管理する必要があります(ルートファイルシステムに最小限のセットがある場合があります)。
起動時のアクション
ルートファイルシステムを超えて、通常の操作のためにさらにいくつかをマウントする必要があります:
- procfs on
/proc(ほとんど不可欠)
- sysfsオン
/sys(ほとんど不可欠)
tmpfsファイルシステムオン/tmp(プログラムがフラッシュまたは読み取り専用のルートファイルシステムではなく、RAMにある一時ファイルを作成できるようにします)
- tmpfs、devfs、またはdevtmpfsがオンの
/dev場合(上記の「デバイスファイル」のudevを参照)
/dev/pts[擬似端末を使用する場合は、devpts on (pts上記の備考を参照)
/etc/fstabファイルを作成してを呼び出すmount -aか、mount手動で実行できます。
ログを書き込む場所がある場合は、syslogデーモンを起動します(プログラムがそれを処理しないklogd場合はカーネルログも起動しますsyslogd)。
この後、デバイスはアプリケーション固有のサービスを開始する準備が整います。
ルートファイルシステムの作り方
これは長くて多様な話ですので、ここでやるのはいくつかの指針を与えることです。
ルートファイルシステムは、RAM(ROMまたはフラッシュの(通常は圧縮された)イメージからロードされる)、またはディスクベースのファイルシステム(ROMまたはフラッシュに格納される)に保持されるか、ネットワークからロードされる(多くの場合TFTPを介して) 。ルートファイルシステムがRAMにある場合は、initramfsにします。これは、ブート時にコンテンツが作成されるRAMファイルシステムです。
組み込みシステムのルートイメージを組み立てるための多くのフレームワークが存在します。BusyBox FAQにはいくつかのポインタがあります。Buildrootは人気のあるもので、LinuxカーネルやBusyBoxに似たセットアップでルートイメージ全体を構築できます。OpenEmbeddedもそのようなフレームワークです。
ウィキペディアには、一般的な組み込みLinuxディストリビューションの(不完全な)リストがあります。近くにあるかもしれない組み込みLinuxの例は、ネットワーク機器用のオペレーティングシステムのOpenWrtファミリーです(ティンカーのホームルーターで人気があります)。経験から学びたい場合は、ScratchからLinuxを試すことができますが、組み込みデバイス向けではなく、趣味の人向けのデスクトップシステム向けです。
Linux vs Linuxカーネルに関する注意
Linuxカーネルに組み込まれている唯一の動作は、ブート時に起動される最初のプログラムです。(ここではinitrdとinitramfsの微妙な点には触れません。)このプログラムは、伝統的にinitと呼ばれ、プロセスID 1を持ち、特定の特権(KILLシグナルに対する免疫)と責任(孤児を育てる)を持っています。あなたは、Linuxカーネルでシステムを実行し、最初のプロセスとして好きな開始が、その後何を持っていると、通常の「Linux」と呼ばれるものをLinuxカーネルに基づくオペレーティングシステムである、とすることはできません- Linuxの常識では、用語の、カーネルがLinuxカーネルであるUnixライクなオペレーティングシステム。たとえば、AndroidはUnixライクではなく、Linuxカーネルに基づいたオペレーティングシステムです。