檢視busybox的INSTALL檔案,裡面都有詳細的安裝說明
tar xjf busybox-1.7.0.tar.bz2
cd busybox-1.7.0
make menuconfig
修改配置項
make
mkdir /work/nfs_root/first_fs
make CONFIG_PREFIX=/work/nfs_root/first_fs install
root# ls
bin linuxrc sbin usr
root# ls -l bin/ls
lrwxrwxrwx 1 book book 7 10月 18 09:03 bin/ls -> busybox
建立裝置
mkdir dev
cd dev
mknode console c 5 1
mknode null c 1 3
配置檔案
mkdir etc
vi etc/inittab
console::askfirst:-/bin/sh
C庫:直接拷貝GCC的動态庫
mkdir lib
cp /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/*.so* lib -d
制作鏡像
mkyaffs2image first_fs/ first_fs.yaffs2
這樣就建立好了最小根檔案系統,燒寫即可
燒錄:
nfs 30000000 192.168.1.174:/work/nfs_root/first_fs.yaffs2
nand erase root
nand write.yaffs 30000000 260000 $(filesize)
繼續完善根檔案系統:
現在在闆子上想ps檢視程序資訊是看不到的
需要建立proc目錄, 挂載虛拟proc檔案系統,
在核心裡面目前有哪些應用程式在跑是通過虛拟的proc檔案系統來收集的
mkdir /proc
mount -t proc none /proc
挂載上虛拟檔案系統之後執行ps指令就可以看到程序資訊
# ps
PID Uid VSZ Stat Command
1 0 3092 S init
2 0 SW< [kthreadd]
3 0 SWN [ksoftirqd/0]
4 0 SW< [watchdog/0]
5 0 SW< [events/0]
6 0 SW< [khelper]
55 0 SW< [kblockd/0]
56 0 SW< [ksuspend_usbd]
59 0 SW< [khubd]
61 0 SW< [kseriod]
73 0 SW [pdflush]
74 0 SW [pdflush]
75 0 SW< [kswapd0]
76 0 SW< [aio/0]
710 0 SW< [mtdblockd]
745 0 SW< [kmmcd]
762 0 SW< [rpciod/0]
764 0 3096 S -sh
778 0 3096 R ps
# cd /proc
# ls
1 745 devices loadavg swaps
2 75 diskstats locks sys
3 76 driver meminfo sysrq-trigger
4 762 execdomains misc sysvipc
5 764 fb modules timer_list
55 779 filesystems mounts tty
56 asound fs mtd uptime
59 buddyinfo interrupts net version
6 bus iomem partitions vmstat
61 cmdline ioports scsi yaffs
710 cpu irq self zoneinfo
73 cpuinfo kallsyms slabinfo
74 crypto kmsg stat
上面1目錄表示程序pid号為1的程序也就是init程序的資訊, 進去1目錄看看:
# cd 1
# ls
auxv environ maps oom_adj stat wchan
clear_refs exe mem oom_score statm
cmdline fd mounts root status
cwd fdinfo mountstats smaps task
# ls -l fd
lrwx------ 1 0 0 64 Jan 1 00:03 0 -> /dev/console
lrwx------ 1 0 0 64 Jan 1 00:03 1 -> /dev/console
lrwx------ 1 0 0 64 Jan 1 00:03 2 -> /dev/console
fd指向/dev/console, 标準輸入0, 标準輸出1, 标準錯誤2都指向/dev/console
上面手動挂載了proc虛拟檔案系統, 繼續建構根檔案系統使proc自動挂載:
在/etc/inittab中加入腳本項
::sysinit:/etc/init.d/rcS
在腳本中挂載proc檔案系統
建立/etc/init.d目錄和/etc/init.d/rcS檔案
在/etc/init.d/rcS檔案加入以下内容:
mount -t proc none /proc
儲存,并加上可執行權限chmod +x /etc/init.d/rcS
制作鏡像:
mkyaffs2image first_fs/ first_fs.yaffs2
燒錄:
nfs 30000000 192.168.1.174:/work/nfs_root/first_fs.yaffs2
nand erase root
nand write.yaffs 30000000 260000 $(filesize)
也可以用mount -a 指令挂載
mount -a指令會去讀/etc/fstab, 根據這個檔案的内容來挂載
下面分析/etc/fstab檔案的格式:
proc /proc proc defaults 0 0
#device mount-point type options dump fsck order
挂載哪個裝置 挂載點 檔案系統類型
建立/etc/fstab
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
修改/etc/init.d/rcS内容
mount -a #會去讀/etc/fstab
制作鏡像, 燒寫:
檢視已經挂載的檔案系統:
# cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / nfs rw,vers=2,rsize=4096,wsize=4096,hard,nolock,proto=udp,timeo=11,retrans=2,sec=sys,addr=192.168.1.174 0 0
proc /proc proc rw 0 0
繼續完善根檔案系統:
/dev目錄下隻有ocnsole和null這兩個手工建立的裝置, 如果每個裝置都要手工建立就很麻煩
Linux有udev機制, 會自動建立/dev目錄下的裝置節點,
在busybox裡面有一個類似的mdev機制, busybox-1.7.0\docs\mdev.txt有詳細的說明
mdev的用途主要有兩個:初始化/dev目錄下的裝置節點, 動态更新. 動态更新不僅更新/dev目錄,
還支援熱拔插, 即插入/解除安裝裝置時執行的某些動作
要使用mdev, 需要核心支援sysfs檔案系統,為了減少對flash的讀寫,還需要支援tmpfs檔案系統
下面根據busybox-1.7.0\docs\mdev.txt來修改:
1. 修改/etc/fstab, 把sysfs檔案系統和tmpfs檔案系統挂載上去
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
2. 修改/etc/init.d/rcS檔案加入要自動運作的指令
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /bin/mdev > /proc/sys/kernel/hotplug #當插入U盤或自動加載某個驅動, 核心就會調用hotplug, 建立裝置節點
mdev -s #建立核心原有的裝置節點
3. 建立sys目錄
mkdir /sys /tmp /mnt /root /proc
制作鏡像, 燒寫!
在根檔案系統中挂載nfs:
1. 伺服器允許目錄被挂接, 開nfs服務, 配置/etc/exports檔案
sudo vi /etc/exports
/work/nfs_root/first_fs *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart // 重新開機NFS服務
showmount -e 192.168.1.174 // 檢視nfs目錄是否有更新
2. 開發闆去挂接
mount -t nfs -o nolock 192.168.1.174:/work/nfs_root/first_fs /mnt
指令行啟動NFS檔案系統挂載:
指令行格式檢視linux-2.6.22.6/Documentation/nfsroot.txt
root=/dev/nfs
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
setenv bootargs root=/dev/nfs nfsroot=192.168.1.174:/work/nfs_root/first_fs ip=192.168.1.11:192.168.1.174:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0