busybox定製應用程序

4.1 busybox的配置********linux

  首先到網上下載一個穩定的BusyBox版本,我用的版本是busybox-1.0.1,而後解壓到工做目錄下。busybox的配置方法和標準的linux內核的配置方法很是類似,咱們只要切換到busybox的根目錄下,使用make menuconfig就會輕鬆定製出適合特定用途的一組應用程序。shell

  #make menuconfig (不知道的選項看看help就能夠了)安全

  #makebash

  #make install服務器

  注意busybox默認是安裝到根目錄下的_install文件文件夾。網絡

  #cd _installdom

  #lsssh

  你會發現bin目錄下只有一個busybox二進制文件,其它的命令,bin,sbin以及tcp

  usr/bin,usr/sbin目錄下的都是指向busybox的連接文件。牛逼吧,這麼多命令一個應用程序就搞定了,咱們看看busybox有多大ide

  #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。

相關文章
相關標籤/搜索