Busybox下init詳解

文章轉載自:http://blog.donews.com/mutecat/archive/2006/02/18/731500.aspx的一部分,全文內容請看原文。
 

5.5.3  busybox的init

   除了基本的命令之外,BusyBox還支持init功能,如同其它的init一樣,busybox的init也是完成系統的初始化工作,關機前的工作等等,我們知道在Linux的內核被載入之後,機器就把控制權轉交給內核,linux的內核啓動之後,做了一些工作,然後找到根文件系統裏面的init程序,並執行它,BusyBox的init進程會依次進行以下工作:(參考<<構建嵌入式LINUX系統>> p201)

1.       爲init設置信號處理過程

2.       初始化控制檯

3.       剖析/etc/inittab文件

4.       執行系統初始化命令行,缺省情況下會使用/etc/init.d/rcS

5.       執行所有導致init暫停的inittab命令(動作類型:wait)

6.       執行所有僅執行一次的inittab(動作類型:once)

一旦完成以上工作,init進程便會循環執行以下進程:

       1.  執行所有終止時必須重新啓動的inittab命令(動作類型:once)

       2.  執行所有終止時必須重新啓動但啓動前必須詢問用戶的inittab命令(動作類型:askfirst)

       初始化控制檯之後,BusyBox會檢查/etc/inittab文件是否存在,如果此文件不存在,BusyBox會使用缺省的inittab配置,它主要爲系統重引導,系統掛起以及init重啓動設置缺省的動作,此外它還會爲四個虛擬控制檯(tty1到tty4)設置啓動shell的動作。如果未建立這些設備文件,BusyBox會報錯。

       inittab文件中每一行的格式如下所示:(busybox的根目錄下的example文件夾下有詳盡的inittab文件範例)     

       id:runlevel:action:process

儘管此格式與傳統的Sytem V init類似,但是,id在BusyBox的init中具有不同的意義。對BusyBox而言,id用來指定啓動進程的控制tty。如果所啓動的進程並不是可以交互的shell,例如BusyBox的sh(ash),應該會有個控制tty,如果控制tty不存在,Busybox的sh會報錯。BusyBox將會完全忽略runlevel字段,所以空着它就行了,你也許會問既然沒用保留着它幹嗎,我想大概是爲了和傳統的Sytem V init保持一致的格式吧。process字段用來指定所執行程式的路徑,包括命令行選項。action字段用來指定下面表中8個可應用到process的動作之一。

動作

結果

sysinit

爲init提供初始化命令行的路徑

respawn

每當相應的進程終止執行便會重新啓動

askfirst

類似respawn,不過它的主要用途是減少系統上執行的終端應用程序的數量。它將會促使init在控制檯上顯示“Please press Enter to active this console”的信息,並在重新啓動之前等待用戶按下enter鍵

wait

告訴init必須等到相應的進程完成之後才能繼續執行

once

僅執行相應的進程一次,而且不會等待它完成

ctratldel

當按下Ctrl+Alt+Delete組合鍵時,執行相應的進程

shutdown

當系統關機時,執行相應的進程

restart

當init重新啓動時,執行相應的進程,通常此處所執行的進程就是init本身

 

以下是我的usblinux的inittab文件

::sysinit:/etc/init.d/rcS

::respawn:/sbin/getty  38400  tty1

tty2::askfirst:-/bin/sh

tty3::askfirst:-/bin/sh

::restart:/sbin/init

::ctrlaltdel:/bin/umount -a -r

這個inittab執行下列動作

1.       將/etc/init.d/rcS設置成系統的初始化文件

2.       在38400 bps的虛擬終端tty1上啓動一個登陸會話 (注意getty的用法)

3.       在虛擬終端tty2和tty3上啓動askfirst動作的shell

4.       如果init重新啓動,將/sbin/init設置成它會執行的程序

5.       告訴init,在系統關機的時候執行umount命令卸載所有文件系統,並且在卸載失敗時用只讀模式衝新安裝以保護文件系統。

5.6  系統的配置文件

5.6.1. /etc/init.d/rcS文件

配置文件一般放在/etc/目錄下,5.5.3節說了init初始化命令行的文件是/etc/init.d/rcS,下面是我的rcS文件

       #!/bin/sh

    /bin/mount -n -t proc  /proc  /proc

    /bin/mount -n -o  remount,rw  /

    /bin/mount -av

    /bin/hostname usblinux

    /etc/init.d/rc.nic

    /etc/init.d/rc.network

    /etc/init.d/rc.usb

    /etc/init.d/rc.local

1.       安裝proc文件系統,但是不寫入/etc/mtab文件(mtab文件是df命令讀取的文件)

2.       以讀寫模式重新掛載根文件系統(需要/etc/fstab文件)

3.       mount -av 掛載所有在/etc/fstab裏面列出的文件系統

4.       主機名命名爲usblinux

5.       依次執行rc.nic(自動檢測網卡),rc.network(配置網絡),rc.usb(加載usb模塊),rc.local(執行本地的一些服務)

5.6.2. /etc/fstab

上面使用mount命令的時候已經涉及到了fstab文件,下面是我的fstab文件

/dev/ram0       /       ext2    defaults    0   0

proc            /proc   proc    defaults    0   0

關於fstab配置文件的語法可以man fstab

其實rcS裏面的mount -av沒有必要加上去。

5.6.3. /etc/mtab

這個文件裏面的內容是動態變化的,當mount一個文件系統的時候,如果mount 沒有加上-n參數,那麼安裝信息就會寫入mtab文件,df命令讀取的就是這個文件。

5.6.4. /etc/profile

這個文件是sh用的,當用戶獲得一個shell後,sh就會根據這個文件配置用戶的登陸環境,下面是我的profile文件。

PATH=/bin:/sbin:/usr/bin:/usr/sbin

PS1='[/u@/h /W]/$ '

HOSTNAME='/bin/hostname'

export PATH HOSTNAME PS1

alias l.='ls -d .[a-zA-Z]* --color=tty'

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

 export PATH=/usr/local/bin:$PATH

export PATH=/usr/local/sbin:$PATH

     

其中PATH環境變量指定當用戶鍵入一個命令時,sh尋找這個命令的路徑。

PS1指定sh提示符的格式

其它的export命令,alias命令不用說了吧,busybox裏面的ash和bash非常相似,因此只要熟悉bash就會不成問題。

5.6.5. /etc/ld.so.conf 與 /etc/ld.so.cache

這兩個文件是與lib庫有關的,它們用來指定應用程序尋找lib庫的路徑。

我的ld.so.conf文件內容如下。

/lib

/usr/lib

/usr/local/lib

ld.so.cache裏面的內容是由是ldconfig命令生成的,ldconfig根據ld.so.conf配置文件生成ld.so.cache裏面的內容,應用程序讀取的是ld.so.cache文件,因此如果變動了ld.so.conf文件,需要運行一次ldconfig才能是新的配置生效,另外如果新加了lib庫文件,也需要ldconfig。

5.6.6   /etc/passwd,/etc/shadow,/etc/group

group裏面存放的是用戶組的信息。

我的group文件內容如下:

root:x:0:root

ftp:x:50:

passwd裏面存放的是用戶的信息

我的passwd文件內容如下:

root:x:0:0:root:/root:/bin/sh

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

sshd:x:74:74:piviledge-separated SSH:/var/empty/sshd:/sbin/nologin

注意,group和passwd裏面的每一行都不是多餘的。

shadow文件是pam認證用到的密碼存放文件

5.6.7.   /etc/services

網絡應用程序用到的標準服務端口映射表

我的services文件如下:

tcpmux    1/tcp

tcpmux    1/udp

ftp-data  20/tcp

ftp       21/tcp

ssh      22/tcp

ssh      22/udp

telnet    23/tcp

nameserver  42/tcp   name

 syslog    514/udp

auth      113/tcp  authentication  tap ident

因爲我需要開啓sshd,syslogd服務,同時會使用ftp,ssh,telnet應用程序。所以就會加上上面的東西,但是注意並不是所有的網絡應用程序都會依賴與services文件,比如telnet,但是也許telnetd需要。

5.6.8.   /etc/nsswitch.conf

這個文件的作用很大,沒有它很多程序都不能正常運行,關於它的具體作用還是用man  nsswitch.conf看看吧。

我的nsswitch.conf文件內容如下:

passwd:     files

shadow:     files

group:      files

hosts:      files dns

ethers:     files

netmasks:   files

networks:   files

protocols:  files

services:   files

netgroup:   files

publickey:  files

automount:  files

aliases:    files

注意hosts這一行一定要加上dns,不然即使有resolv.conf文件,域名也不能解析,注意nsswitch.conf是對應一組lib庫的,這裏我們用了files,dns,因此需要拷貝相應的lib庫到/lib目錄下.

#cd  /mnt/rootfs

#cp -dpR  /lib/libnss_files*   ./lib

#cp -dpR  /lib/libnss_dns*   ./lib

5.6.9 .  /etc/hosts,/etc/ host.conf, /etc/resolv.conf

       我的hosts文件內容如下,不用說也應該清楚什麼意思了,不清楚的man hosts

       127.0.0.1   localhost:localdomain   localhost

       host.conf和resolv.conf是域名解析的時候用到的配置文件,其中resolv.conf裏面是域名服務器的ip地址,host.conf裏面放的是主機的查找規則。不瞭解的還是man host.conf和man  resolv.conf

我的host.conf與resolv.conf文件內容分別如下:

#cat  /mnt/rootfs/etc/host.conf

order hosts,bind

#cat  /mnt/rootfs/etc/resolv.conf

nameserver 202.112.20.131

5.6.10.  /etc/syslog.conf

syslogd服務程序讀取的配置文件。

我的文件內容如下:

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.*                                                 /dev/console

 

# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

 

# The authpriv file has restricted access.

authpriv.*                                              /var/log/secure

 

 

# Save boot messages also to boot.log

local7.*                                                /var/log/boot.log

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章