[原創] 利用busybox, extlinux 在工控機CompactFlash(CF卡)上構建Linux系統(中)

上篇:CF卡分區, extlinux的安裝

中篇:構建根文件系統

下篇:2.6內核剪裁及Busybox編譯配置及其分析

 

 

一個基本的文件系統應該包括: 

busybox (提供 shell 命令集)

設備文件(如果是用 devfs 的話這個就免了,arm中常見的創建方式還有mdev,udev)

配置文件(用來初始化和佈局文件系統)

庫文件(如果 busybox 是靜態編譯的話,就不需要busybox 的庫文件,以及其他諸如qt、MiniGUI的庫)。

 

 

之前的一篇日誌, http://blog.csdn.net/dos5gw/archive/2010/08/20/5826054.aspx 

也提到了使用busybox構建rootfs的方法, 建立根文件系統的步驟大致相同, 其中需要注意的差異在於dev的創建有3種方式:

方案1 手動創建: 使用mknod創建;

方案2 使用devfs: 已經過時;

方案3 使用udev(mdev): mdev是busybox自帶的簡化版的udev, udev(mdev)能根據目前的硬件設備(系統啓動/熱插拔/加載驅動)動態更新dev下的設備文件;

如果採用第1種手動創建的方式, 參考http://blog.chinaunix.net/u1/56388/showart_438741.html

如果採用第3種手動創建的方式, 參考http://huang-tomey.blog.163.com/blog/static/1247505732009916437175/ 以及

http://blog.vckbase.com/websurf/archive/2005/08/23/11386.aspx

 

 

(一)編譯並安裝busybox到CF卡:

 

busybox的配置, 詳見: http://blog.csdn.net/dos5gw/archive/2010/10/26/5965992.aspx

進入busybox目錄, 依次執行make menuconfig, make, make install

執行完make install後, 會生成busybox/_install目錄

CF卡掛載到/mnt/cf: mount /dev/sdb1 /mnt/cf

拷貝busybox生成文件到CF卡: cp -arf _install/* /mnt/cf/


再創建必要的目錄: (usr/sbin/, usr/bin/, bin/, sbin/已經在busybox/_install下生成):

 

mkdir root dev etc boot tmp var sys proc lib mnt home  

mkdir etc/init.d etc/rc.d etc/sysconfig  

mkdir  usr/lib usr/modules

chmod 1777 tmp

#mkdir var/lib var/lock var/run var/tmp

chmod 1777 var

 

 

(二)創建設備文件:

在busybox-1.13.3/examples/bootfloppy目錄下能找到一些實用腳本, mkdevs.sh/ mkrootfs.sh, 還附有一個syslinux的配置文件例子; 下面依照mkdevs.sh腳本來手動創建dev:

cd /mnt/cf/dev

mknod console c 5 1
mknod full c 1 7
mknod kmem c 1 2
mknod mem c 1 1
mknod null c 1 3
mknod port c 1 4
mknod random c 1 8
mknod urandom c 1 9
mknod zero c 1 5

 

#mknod tty c 5 0
mknod ttyS0 c 4 64 
mknod ttyS1 c 4 65 
#mknod ttyS2 c 4 66 
#mknod ttyS3 c 4 67

 

格式解釋: mknod 節點名 類型 主設備號 從設備號

 

b    :創建一個塊(有緩存的)特殊設備文件。 

c, u : 創建一個字符(無緩存的)特殊設備文件。 

p    :創建FIFO文件。

 

 

(三)創建配置文件:

 

配置文件包括:


(1)/etc/inittab
init進程根據/etc/inittab文件來創建其他子進程,比如調用腳本文件配置ip地址、掛接其他文件系統,最後啓動shell等,

參考busybox源碼下面的“examples/inittab”文件,內容如下:

 

 

 

 


::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

改變權限 chmod 755 inittab,

注意, 第二個例子中, 要確認dev/tty2節點存在.

console::askfirst:-/bin/sh, 在進入console之前, 要回車確認, 如果askfirst改爲respawn, 則不必回車, 直接進入console;

 

 

(2)etc/init.d/rcS
這有點類似於Windows系統中的Autobat自動批處理文件,內容如下:

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

runlevel=S

prevlevel=N

umask 022

export PATH

 

echo "Entering  /etc/init.d/rcS..."

echo "      Reading /etc/fstab and mount"

/bin/mount -a

 

#echo "     Starting mdev"

#/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug

#mdev -s

 

# if use NFS, do not reconfigure IP address

#echo "     Set IP Address"

#/sbin/ifconfig lo 127.0.0.1

#/etc/init.d/ifconfig-eth0

#sleep 5


#echo "     mount -o remount,rw /"

#mount -o remount,rw /

echo "Exit /etc/init.d/rcS..."

 


改變權限 chmod 755 /nit.d/rcS

 

 

(3)/etc/fstab,對應mount -a,內容如下:


#device mount-point type options dump fsck order

proc   /proc proc  defaults 0 0

sysfs  /sys  sysfs defaults 0 0

tmpfs /tmp tmpfs size=16m,mode=1777 0 0

tmpfs /var  tmpfs size=16m,mode=1777 0 0

#none   /tmp  ramfs defaults 0 0

#mdev   /dev  ramfs defaults 0 0 

 

 

或者:

 

改變權限chmod 755 fstab

 

 

(4)/etc/passwd和etc/group,內容如下:
#/etc/passwd
root::0:0:root:/root:/bin/sh
daemon::1:1:daemon:/usr/sbin:/bin/sh
bin::2:2:bin:/bin:/bin/sh
sys::3:3:sys:/dev:/bin/sh

 


#etc/group
root::0:root
daemon::1:
bin::2:
sys::3:
tty::5:

 

改變權限chmod 775 passwd group

 

 

(5)/etc/profile,內容如下:

 

echo "Entering /etc/profile... "
USER="id -un"
LOGNAME=$USER

/bin/hostname Test-3355
PS1='[/u@/h:/w]#'


echo "    Set search library path"
export LD_LIBRARY_PATH=/lib:/usr/lib


echo "    Set user path"

 

 

PATH=/sbin:/bin:/usr/sbin:/usr/bin
export USER LOGNAME PS1 PATH

echo "Exit /etc/profile... "

 

或者:
echo "Processing /etc/profile... "
/bin/hostname TEST2440
export LD_LIBRARY_PATH=/lib:/usr/lib
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/xrft
export PATH
PS1='[/u@/h/W]/$'

 

改變profile文件的執行權限: chmod 775 profile

注:PS1中,/w和/W分別是顯示"絕對路徑"和"相對路徑"

 

 

 

(四)相關運行庫文件:

 用ldd可查看某apps依賴的庫, 比如,查看某gcc -static編譯的程序:

 # ldd test3355
        not a dynamic executable

 

查看非static編譯的程序:

# ldd test3355d
        linux-gate.so.1 =>  (0x0074a000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00afb000)
        /lib/ld-linux.so.2 (0x00d50000)

 

另外. 用file命令可以查看程序的類型, 包括程序的平臺, 格式, 動態/靜態庫等:

# file test3355d
test3355d: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

 

 

//----------------------------------------------------------------

//----完成並測試------------------------------------------------

工控機開機, 可以正常啓動, 並進入console, 但是發現不能更改/etc 下的文件, vi或者chmod修改文件時, 提示"file is read only" 或"read-only file system",,,原因不明

在/etc/init.d/rcS最後加入 mount -o remount,rw /

可以暫時解決; 

後來找到的解決方法, extlinux(即bootloader)的配置參數原爲"append noinitrd root=/dev/sda1 init=/linuxrc ide=nodma"

在root後面增加'rw', 可以去掉rcS腳本里的mount了!

 

 

//------------------------------------------------------------------------

//--------------------構建rootfs需要的改進, 及知識點補充---------

 

1. CramFS, Yaffs, JFFS的區別, MTD的概念

2. 基於ram的文件系統, tmpfs

  在etc/rc.d中常有:

 mount -t tmpfs tmpfs /var -o size=512k

 mkdir -p /var/tmp

 mkdir -p /var/log

 

或者mount -t ramfs none /mnt/ramfs -o maxsize=2000

 

或者在fstab中加入以下, mount -a時會掛載:

tmpfs /var tmpfs size=32m 0 0

 

//-----------fstab解讀-----------

  從做到右:

  #/dev/device  mount-point   type   rules         dump   fsck

          tmpfs          /var                tmpfs size=32m  0          0

  1. /dev/device: 不用說了吧?例如,/dev/hda1 爲M$-Win9x下的c:盤。

  2. mount-point: 掛載點。例如,把/dev/hda1掛到/mnt/mywinc下。

  3. type: ext3, vfat, ......就是要掛上的文件系統類型。

  4. rules:

   auto: 開機自動掛接;

   default, noauto: 開機不自動掛接;

   nouser: 只有root可掛;

   ro: 只讀掛接;

   rw: 可讀可寫掛接;

   user: 任何用戶都可以掛接;

  5. dump: 備份;0爲從不備份,或顯示上次至今備份之天數;

  6. fsck: 啓動時fsck檢查順序,0爲不檢查, “/”永遠爲1;

 

 

#device mount-point type options dump fsck order

proc   /proc proc  defaults 0 0

sysfs  /sys  sysfs defaults 0 0

tmpfs /tmp tmpfs size=16m,mode=1777 0 0

none  /var  ramfs defaults 0 0

#none   /tmp  ramfs defaults 0 0

#mdev   /dev  ramfs defaults 0 0

 

 

# /etc/inittab

# example

# id:runlevel:action:process

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

console::respawn:-/bin/sh

#console::askfirst:-/bin/sh

#::respawn:/sbin/getty  38400  tty1

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

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