上篇: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