GNU/Linux >> Linux の 問題 >  >> Linux

Linux を完全に起動するために最低限必要なルート ファイルシステム アプリケーションは何ですか?

それは、デバイスにどのようなサービスを提供したいかによって異なります。

プログラム

Linux を直接 シェル で起動できます .本番環境ではあまり役に立ちません — シェルをそこに置きたいだけの人 — しかし、インタラクティブなブートローダーがある場合の介入メカニズムとしては役に立ちます:pass init=/bin/sh カーネルコマンドラインに。すべての Linux システム (およびすべての UNIX システム) には、/bin/sh で Bourne/POSIX スタイルのシェルがあります。 .

シェル ユーティリティのセットが必要です . BusyBox は非常に一般的な選択肢です。ファイルおよびテキスト操作用のシェルと共通ユーティリティが含まれています (cpgrep 、…)、ネットワーク設定 (pingifconfig 、…)、プロセス操作 (psnice 、…)、およびその他のさまざまなシステム ツール (fdiskmountsyslogd 、…)。 BusyBox は非常に構成可能です。必要なツールを選択したり、コンパイル時に個々の機能を選択したりして、アプリケーションに適したサイズ/機能の妥協点を得ることができます。 sh 以外 、それなしでは何もできない最低限の値は mount です 、 umounthalt 、しかし cat も持たないのは非典型的です 、 cpmvrmmkdirrmdirpssync そしてさらにいくつか。 BusyBox は busybox という単一のバイナリとしてインストールされます 、各ユーティリティへのシンボリック リンク付き。

通常の UNIX システムの最初のプロセスは init と呼ばれます .その仕事は、他のサービスを開始することです。 BusyBox には init システムが含まれています。 init に加えて バイナリ (通常は /sbin にあります) )、その構成ファイルが必要になります (通常は /etc/inittab と呼ばれます) — 一部の最新の init 置換はそのファイルを廃止しますが、小さな組み込みシステムではそれらを見つけることができません)、どのサービスをいつ開始するかを示します。 BusyBox の場合、/etc/inittab オプションです。見つからない場合は、コンソールにルート シェルとスクリプト /etc/init.d/rcS が表示されます。 (デフォルトの場所) は起動時に実行されます。

もちろん、デバイスを便利にするプログラム以外に必要なのはそれだけです。たとえば、OpenWrt バリアントを実行している自宅のルーターでは、プログラムは BusyBox、nvram だけです。 (NVRAM の設定を読み取って変更するため)、およびネットワーク ユーティリティ。

すべての実行可能ファイルが静的にリンクされていない限り、動的ローダー (ld.so) が必要になります。 、libc の選択とプロセッサ アーキテクチャに応じて異なる名前で呼び出される場合があります) とすべての動的ライブラリ (/lib/lib*.so 、おそらくこれらのいくつかは /usr/lib にあります ) これらの実行可能ファイルに必要です。

ディレクトリ構造

Filesystem Hierarchy Standard は、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 ホスト ポートがある場合など)、/dev udev で管理する必要があります (ルートファイルシステムにはまだ最小限のセットがあるかもしれません)。

起動時のアクション

ルート ファイルシステムを超えて、通常の操作のためにさらにいくつかをマウントする必要があります:

  • /proc の procfs (ほぼ不可欠)
  • /sys の sysfs (ほぼ不可欠)
  • tmpfs /tmp のファイルシステム (プログラムが、フラッシュまたは読み取り専用のルート ファイルシステムではなく、RAM に一時ファイルを作成できるようにするため)
  • /dev 上の tmpfs、devfs、または devtmpfs 動的な場合 (上記の「デバイス ファイル」の udev を参照)
  • /dev/pts の開発者 [pseudo-terminals を使用する場合 (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 ファミリがあります (いじくり回す人のホーム ルーターで人気があります)。経験から学びたい場合は、Linux をゼロから試すことができますが、これは組み込みデバイス向けではなく、愛好家向けのデスクトップ システム向けです。

Linux と Linux カーネルに関する注意事項

Linux カーネルに組み込まれている唯一の動作は、ブート時に起動される最初のプログラムです。 (ここでは initrd と initramfs の微妙な点については説明しません。) このプログラムは、伝統的に init と呼ばれ、プロセス ID 1 を持ち、特定の特権 (KILL シグナルに対する免疫) と責任 (孤児の刈り取り) を持っています。 Linux カーネルを使用してシステムを実行し、最初のプロセスとして必要なものを開始できますが、その場合、Linux カーネルに基づくオペレーティング システムになり、通常「Linux」と呼ばれるもの (常識では Linux) ではありません。この用語の は、カーネルが Linux カーネルである Unix ライクなオペレーティング システムです。たとえば、Android は Unix のようなものではなく、Linux カーネルに基づくオペレーティング システムです。


必要なのは、静的にリンクされた 1 つの実行可能ファイルだけで、ファイル システム上に分離して配置されます。他のファイルは必要ありません。その実行可能ファイルは init プロセスです。ビジーボックスである可能性があります。これにより、シェルとその他のユーティリティのホストがすべてそれ自体で提供されます。ルート ファイルシステムの読み取り/書き込みのマウント、/dev ノードの作成、real init の実行など、busybox でコマンドを手動で実行するだけで、完全に機能するシステムに移行できます。


シェル ユーティリティが必要ない場合は、静的にリンクされた mksh バイナリ (たとえば、klibc に対して – Linux/i386 では 130K) で十分です。 /linuxrc が必要です または /init または /sbin/init mksh -l -T!/dev/tty1 を呼び出すだけのスクリプト ループ内:

#!/bin/mksh
while true; do
    /bin/mksh -l -T!/dev/tty1
done

-T!$tty オプションは mksh に最近追加されたものです これは、指定された端末で新しいシェルを生成して待機するように指示します。 (それ以前は -T- しかありませんでした プログラムと -T$tty をデーモン化する ターミナルで生成しますが、それを待ちません。これはあまり良くありませんでした。) -l オプションは、単にログイン シェルを実行するように指示するだけです (これは /etc/profile を読み取ります)。 、 ~/.profile~/.mkshrc ).

これは端末が /dev/tty1 であることを前提としています 、 代わりの。 (もっと魔法を使えば、端末は自動的に見つけられる。 /dev/console ジョブを完全に制御することはできません。)

/dev にはいくつかのファイルが必要です これが機能するために:

  • /dev/console
  • /dev/null
  • /dev/tty
  • /dev/tty1

カーネルオプション devtmpfs.mount=1 での起動 埋められた /dev の必要性を排除します 、空のディレクトリにします (マウントポイントとして使用するのに適しています)。

通常はいくつかのユーティリティ (klibc、busybox、beastiebox、toybox、toolbox など) が必要ですが、実際には必要ありません。

~/.mkshrc を追加することもできます $PS1 といくつかの基本的なシェル エイリアスと関数を設定するファイルです。

mksh (およびそのサンプル mkshrc ファイル) と klibc-utils のみを使用して、Linux/m68k 用の 171K 圧縮 (371K 非圧縮) の initrd を作成したことがあります。 (ただし、これは -T! がシェルに追加される前だったので、/dev/tty2 でログイン シェルが生成されました) 代わりに、端末を切り替えるようにユーザーに伝えるメッセージをコンソールにエコーします。) 正常に動作します。

これは本当に最低限です 設定。他の回答は、やや機能の多いシステムに対する優れたアドバイスを提供します。これは本当に特殊なケースです。

免責事項:私は mksh の開発者です。


Linux
  1. Linux – Gnu / linuxでファイルパーミッションなどを設定するさまざまな方法は何ですか?

  2. Linux –忘れたルートパスワードを変更する方法は?

  3. Linux –システムに搭載されているハードディスクを確認する方法は?

  1. Linux – Linuxカーネルで使用されているエントロピーソースは何ですか?

  2. Linux –デバイスツリー割り込みプロパティの値は何ですか?

  3. Linux で ext4 ファイルシステムのパフォーマンスを向上させるためのマウント オプションは何ですか

  1. Linuxターミナルを使用して、コンピューターにあるファイルを確認します

  2. Linuxの「ホイール」グループの目的は何ですか

  3. 2 つのファイル パスが同じファイル オブジェクトを参照していることを確認する最善の方法は何ですか?