busybox定制應用程序
********
首先到網上下載一個穩定的BusyBox版本,我用的版本是busybox-1.0.1,然後解壓到工作目錄下。busybox的配置方法和標準的linux內核的配置方法非常相似,我們只要切換到busybox的根目錄下,使用make menuconfig就會輕松定制出適合特定用途的一組應用程序。
#make menuconfig (不知道的選項看看help就可以了)
#make
#make install
註意busybox默認是安裝到根目錄下的_install文件文件夾。
#cd _install
#ls
你會發現bin目錄下只有一個busybox二進制文件,其它的命令,bin,sbin以及
usr/bin,usr/sbin目錄下的都是指向busybox的鏈接文件。牛逼吧,這麽多命令一個應用程序就搞定了,我們看看busybox有多大
#du -k bin/busybox
420
這是我定制出來的busybox的大小,夠小的吧。
4.2 安裝busybox到文件系統
在busybox的根目錄下編譯好二進制程序之後。
#make install PREFIX=/mnt/usb
這樣,應用程序就會安裝到指定位置,切換到/mnt/rootfs下看看,bin目錄,sbin目錄,usr/bin目錄,usr/sbin目錄下是不是出現了很多的應用程序。
busybox安裝好之後,看看它依賴的動態鏈接庫
4.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命令卸載所有文件系統,並且在卸載失敗時用只讀模式沖新安裝以保護文件系統。
4.6 系統的配置文件
/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
安裝proc文件系統,但是不寫入/etc/mtab文件(mtab文件是df命令讀取的文件)
以讀寫模式重新掛載根文件系統(需要/etc/fstab文件)
mount -av 掛載所有在/etc/fstab裏面列出的文件系統
主機名命名為cflinux
依次執行rc.nic(自動檢測網卡),rc.network(配置網絡),rc.usb(加載usb模塊),rc.local(執行本地的一些服務)
/etc/fstab
上面使用mount命令的時候已經涉及到了fstab文件,下面是我的fstab文件
/dev/ram0 / ext2 defaults 0 0
proc /proc proc defaults 0 0
關於fstab配置文件的語法可以man fstab
其實rcS裏面的mount -av沒有必要加上去。
/etc/mtab
這個文件裏面的內容是動態變化的,當mount一個文件系統的時候,如果mount 沒有加上-n參數,那麽安裝信息就會寫入mtab文件,df命令讀取的就是這個文件。
/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就會不成問題。
/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。
/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認證用到的密碼存放文件
/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需要。
/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
/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
/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
5.6 雖然busybox支持大多數應用程序,但是往往我們需要的程序它並不支持,這時候我們就只有copy我們的宿主機上的了,第一章說了,我們的usblinux需要能夠fdisk存儲設備,能夠mkfs文件系統,能夠使用grub安裝grub到指定存儲設備。busybox有fdisk,但是mkfs.*在我使用的busybox版本裏面還不支持,另外ldconfig這個必須的應用程序busybox裏面好像也沒有。另外我們也許想在usblinux裏面臨時使用一下ftp服務器,用來傳輸文件用,調試的時候strace是必不可少的工具,加進硬盤檢測工具smartmontools也是不錯的主意,充當網關服務器sshd必不可少吧,雖然可以用其它的比如telnetd等代替,但是它們並沒有sshd來的安全,因此我還是選擇了sshd。
busybox定制應用程序