Linuxルートファイルシステム作成--中


Linuxルートファイルシステム作成--中


参考朱有鵬uboot全集

0、ルートファイルシステム概況


1、busyboxソースコードをダウンロードしてルートファイルシステムにコンパイルする


1.1、busyboxはオープンソースのプロジェクトなので、ソースコードは直接ネットからダウンロードすることができる.
1.2、busyboxのバージョンの違いは大きくなく、バージョンの新旧はあまり関係がない
1.3、busyboxをダウンロードして直接www.busyboxに行く.Net公式サイトはダウンロードしてもいいです
ダウンロード後、解凍:tar-jxvf busybox-1.24.1.tar.bz2
2 Makefileの変更
これはソースコードが多くのプラットフォームで実行できるので、彼のプラットフォームをARMにする必要があります.
A 8のプロセッサをコンパイルしているので、プラットフォームの移植が必要です.
(1)ARCH =arm (2)CROSS_COMPILE =/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
3、make menuconfigを使う
Busybox Settings--->
    Build Options--->
        [*]Build BusyBox as a static binary(no shared libs)


Busybox Library Tuning--->
    [*]vi-style line editing commands
    [*]Fancy shell prompts


Linux Module Utilities--->
    [ ]Simplified modutils
    [*]insmod
    [*]rmmod
    [*]lsmod
    [*]modprobe
    [*]depmod


Linux System Utilities--->[*]mdev
    [*]Support /etc/mdev.conf
    [*]Support subdirs/symlinks
    [*]Support regular expressions substitutions when renaming dev
    [*]Support command execution at device addition/removal
    [*]Support loading of firmwares

4、make-j 4とmake install 4.1をインストールし、マルチスレッドでコンパイルし、コンパイルの速度を増加する.
4.2、make installこの中でbusyboxのインストール経路を設定することができる:
Busybox Settings
    Installation Options ("make install....")

コンパイルによって生成された実行可能プログラムと依存するライブラリファイル、プロファイル、ヘッダファイルを現在のシステムで指定したディレクトリの下にインストールします(一般的には、どのディレクトリの下にインストールするかを自分で指定できます).
5、1 busyboxプログラムをルートファイルシステムに作成して開発ボードにマウントすると、得られたエラーが変わります./linuxrcから実行できません
エラーメッセージ:
VFS:Mounted root (nfs filesystem)on device 0:12
Freeing init memory: 540K
can't run '/etc/init.d/rcs':No such file or directory
can't open /dev/tty2:No such file or directory

2、inittab詳しく説明し、ルートファイルシステムコンソールに入る

#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init

2.1、我々の実験現象は、ルートファイルシステムのコンソールに入ることができることである.だから、上述したように、最小のルートファイルシステムはbusybox+inittabである.
2.2、私たちは上のファイルを解析します:#は私たちがこのスクリプトプログラムで使用した注釈を表しています.
Sysinitは、システムが走り始める前に実行されるプログラムを示す条件を表す./etc/init.d/rcSここでshellスクリプトを面接するのは、スクリプトプログラムを実行するためのものです.
askfirst:コンソールに入る前に1行の情報を出力し、enterキーを押して実行すべきだとプロンプトします.
shutdown:シャットダウン時に後続のプログラム/bin/umount-r-aがシャットダウンした場合、すべてのルートファイルシステムのファイルをすべてアンインストールします.
注意:キー:inittabを理解する:合わせてactionの条件を満たすとprocessというプログラムが実行されるという意味です.

3、busyboxのソースコード分析


3.1、ソースディレクトリ分析の多くはshellのコマンドを実現するために使用されている.
3.2、全体のプログラムの入り口は確定します:C言語を学ぶ時私達はすべてプログラムの主な関数main関数が全体のプログラムの入り口であることを知っていて、この情況の下でオペレーティングシステムの下の仕事のアプリケーションの情況に適応します.
3.3、ubootとLinux kernelの2つの大きなC言語のプロジェクトでは、main関数はすべてエントリではありません.私たちのようなヌードマシンプログラムでは、エントリはmain関数ではなく、リンクスクリプトで指定されています.
3.4、busyboxはLinuxが起動した後の仕事の最初のアプリケーションなので、必ずmain関数があります.
3.5、busyboxの入り口はmain関数で、appletbb.cが効いた.busyboxにはたくさんのXXX_がありますmain関数、これらのmain関数はすべてbusyboxがサポートするコマンドの本当のインタフェースで、例えばls_main関数はbusyboxがls関数として使用するエントリプログラムである.
PS:答え:答えはmainからxxxへmain.すなわちbusyboxは実行するたびにmainを先に実行する.main関数で私たちが本当に実行する関数(ls)を識別し、対応するxxx_を呼び出します.main例えばls_mainはこのコマンドを具体的に実現します.私たちのmain関数のパラメータ:argc,argv[0]で私たちのmain関数に渡されます.
run_applet_and_exit();
busybox pwd

4、busybox呼び出しプロファイルinittab解析及び実行


(1)inittabの解析はbusybox/init/initである.c/init_main関数で解析した
(2)parse_inittab()は1つ1つのactionに解析される.
(3)実行ロジックは、parse_を先に通過するinittab()関数解析:/etc/inittab解析の重点はinittab中の各actionとprocessを解析することである.
なぜルートファイルシステムを埋め込むにはbusyboxを使用する必要がありますか?(1)busyboxは実際にls,cd,mkdir,,など多くのLinuxでよく使われるshellコマンドを統合している.統合すると、busyboxプログラムのサイズは、busyboxが実装するコマンドのサイズよりもずっと小さくなります.
(2)busyboxシステムが小さくなったのは2つの原因がある:1つ目はbusybox自体が提供するshellコマンドがトリミング版であり、busyboxがサポートできるコマンドのパラメータオプションに制限がある.あまり使わないコマンドオプションはすべてカットされました.
(3)実際,busyboxは複数のコマンドが統合されているため,コードが共用可能なコマンドが多く,容量が大幅に小さくなっている.

5、RCSファイル


5.1、busyboxのソースコードの中のinitです.cで呼び出されます.
parse_inittab奥INIT_SCRIPT:/etc/init.d/rcsは、このものの実行をデフォルトで実行したことに相当します.
5.2、/etc/init.d/rcsファイルはLinuxの実行時にプロファイルの中で最も重要なものであり、他のプロファイルはこのファイルから構成されており、このファイルは複雑でも簡単でもよい.中にはたくさんの配置項目があります.
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

runlevel=S
prevlevel=N

umask 022

export PATH runlevel prevlevel

mount -a

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

/bin/hostname -F /etc/sysconfig/HOSTNAME

ifconfig eth0 192.168.1.10

6.1、PATH:環境変数が環境変数とは何かを導出し、あなたが実行するアプリケーションである場合、オペレーティングシステムは環境変数のディレクトリの中でアプリケーションを探し、見つけられたら実行し、見つけられなければ実行しない.
runlevel=S:オペレーティングシステムがシングルユーザモードに設定
6.3、umask=(1)umaskはLinuxのコマンドであり、Linuxシステムのumask値(2)umask値を設定して現在のユーザの権限を決定する役割を果たす.
6.4、mountはすべてのデバイスドライバをマウントする
6.5、HOSTNAME:ユーザー名を設定する;直接/etc/sysconfigディレクトリの下のHOSTNAMEに名前を作成できます.ホストは表示されます.ここではlhh_に設定します.210